ZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLy5naXRpZ25vcmUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWFlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorIworIyBHZW5lcmF0ZWQgZmlsZXMKKyMKK2dlbl9jcmMzMnRhYmxlCitjcmMzMnRhYmxlLmgKK29pZF9yZWdpc3RyeV9kYXRhLmMKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi84NDIuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi84NDIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFmNTgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvODQyLzg0Mi5oCkBAIC0wLDAgKzEsMTMwIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworCisjaWZuZGVmIF9fODQyX0hfXworI2RlZmluZSBfXzg0Ml9IX18KKworLyogVGhlIDg0MiBjb21wcmVzc2VkIGZvcm1hdCBpcyBtYWRlIHVwIG9mIG11bHRpcGxlIGJsb2NrcywgZWFjaCBvZgorICogd2hpY2ggaGF2ZSB0aGUgZm9ybWF0OgorICoKKyAqIDx0ZW1wbGF0ZT5bYXJnMV1bYXJnMl1bYXJnM11bYXJnNF0KKyAqCisgKiB3aGVyZSB0aGVyZSBhcmUgYmV0d2VlbiAwIGFuZCA0IHRlbXBsYXRlIGFyZ3MsIGRlcGVuZGluZyBvbiB0aGUgc3BlY2lmaWMKKyAqIHRlbXBsYXRlIG9wZXJhdGlvbi4gIEZvciBub3JtYWwgb3BlcmF0aW9ucywgZWFjaCBhcmcgaXMgZWl0aGVyIGEgc3BlY2lmaWMKKyAqIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIGFkZCB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgb3IgYW4gaW5kZXggcG9pbnRpbmcKKyAqIHRvIGEgcHJldmlvdXNseS13cml0dGVuIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRvIGNvcHkgdG8gdGhlIG91dHB1dCBidWZmZXIuCisgKgorICogVGhlIHRlbXBsYXRlIGNvZGUgaXMgYSA1LWJpdCB2YWx1ZS4gIFRoaXMgY29kZSBpbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoCisgKiB0aGUgZm9sbG93aW5nIGRhdGEuICBUZW1wbGF0ZSBjb2RlcyBmcm9tIDAgdG8gMHgxOSBzaG91bGQgdXNlIHRoZSB0ZW1wbGF0ZQorICogdGFibGUsIHRoZSBzdGF0aWMgImRlY29tcF9vcHMiIHRhYmxlIHVzZWQgaW4gZGVjb21wcmVzcy4gIEZvciBlYWNoIHRlbXBsYXRlCisgKiAodGFibGUgcm93KSwgdGhlcmUgYXJlIGJldHdlZW4gMSBhbmQgNCBhY3Rpb25zOyBlYWNoIGFjdGlvbiBjb3JyZXNwb25kcyB0bworICogYW4gYXJnIGZvbGxvd2luZyB0aGUgdGVtcGxhdGUgY29kZSBiaXRzLiAgRWFjaCBhY3Rpb24gaXMgZWl0aGVyIGEgImRhdGEiCisgKiB0eXBlIGFjdGlvbiwgb3IgYSAiaW5kZXgiIHR5cGUgYWN0aW9uLCBhbmQgZWFjaCBhY3Rpb24gcmVzdWx0cyBpbiAyLCA0LCBvciA4CisgKiBieXRlcyBiZWluZyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyLiAgRWFjaCB0ZW1wbGF0ZSAoaS5lLiBhbGwgYWN0aW9ucworICogaW4gdGhlIHRhYmxlIHJvdykgd2lsbCBhZGQgdXAgdG8gOCBieXRlcyBiZWluZyB3cml0dGVuIHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICogQW55IHJvdyB3aXRoIGxlc3MgdGhhbiA0IGFjdGlvbnMgaXMgcGFkZGVkIHdpdGggbm9vcCBhY3Rpb25zLCBpbmRpY2F0ZWQgYnkKKyAqIE4wIChmb3Igd2hpY2ggdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBhcmcgaW4gdGhlIGNvbXByZXNzZWQgZGF0YSBidWZmZXIpLgorICoKKyAqICJEYXRhIiBhY3Rpb25zLCBpbmRpY2F0ZWQgaW4gdGhlIHRhYmxlIGJ5IEQyLCBENCwgYW5kIEQ4LCBtZWFuIHRoYXQgdGhlCisgKiBjb3JyZXNwb25kaW5nIGFyZyBpcyAyLCA0LCBvciA4IGJ5dGVzLCByZXNwZWN0aXZlbHksIGluIHRoZSBjb21wcmVzc2VkIGRhdGEKKyAqIGJ1ZmZlciBzaG91bGQgYmUgY29waWVkIGRpcmVjdGx5IHRvIHRoZSBvdXRwdXQgYnVmZmVyLgorICoKKyAqICJJbmRleCIgYWN0aW9ucywgaW5kaWNhdGVkIGluIHRoZSB0YWJsZSBieSBJMiwgSTQsIGFuZCBJOCwgbWVhbiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYXJnIGlzIGFuIGluZGV4IHBhcmFtZXRlciB0aGF0IHBvaW50cyB0bywgcmVzcGVjdGl2ZWx5LCBhIDIsCisgKiA0LCBvciA4IGJ5dGUgdmFsdWUgYWxyZWFkeSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgdGhhdCBzaG91bGQgYmUgY29waWVkIHRvCisgKiB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyLiAgRXNzZW50aWFsbHksIHRoZSBpbmRleCBwb2ludHMgdG8gYSBwb3NpdGlvbgorICogaW4gYSByaW5nIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBsYXN0IE4gYnl0ZXMgb2Ygb3V0cHV0IGJ1ZmZlciBkYXRhLgorICogVGhlIG51bWJlciBvZiBiaXRzIGZvciBlYWNoIGluZGV4J3MgYXJnIGFyZTogOCBiaXRzIGZvciBJMiwgOSBiaXRzIGZvciBJNCwKKyAqIGFuZCA4IGJpdHMgZm9yIEk4LiAgU2luY2UgZWFjaCBpbmRleCBwb2ludHMgdG8gYSAyLCA0LCBvciA4IGJ5dGUgc2VjdGlvbiwKKyAqIHRoaXMgbWVhbnMgdGhhdCBJMiBjYW4gcmVmZXJlbmNlIDUxMiBieXRlcyAoKDJeOCBiaXRzID0gMjU2KSAqIDIgYnl0ZXMpLCBJNAorICogY2FuIHJlZmVyZW5jZSAyMDQ4IGJ5dGVzICgoMl45ID0gNTEyKSAqIDQgYnl0ZXMpLCBhbmQgSTggY2FuIHJlZmVyZW5jZSAyMDQ4CisgKiBieXRlcyAoKDJeOCA9IDI1NikgKiA4IGJ5dGVzKS4gIFRoaW5rIG9mIGl0IGFzIGEga2luZC1vZiByaW5nIGJ1ZmZlciBmb3IKKyAqIGVhY2ggb2YgSTIsIEk0LCBhbmQgSTggdGhhdCBhcmUgdXBkYXRlZCBmb3IgZWFjaCBieXRlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dAorICogYnVmZmVyLiAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIG91dHB1dCBidWZmZXIgaXMgZGlyZWN0bHkgdXNlZCBmb3IgZWFjaAorICogaW5kZXg7IHRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgbWVtb3J5IHJlcXVpcmVkLiAgTm90ZSB0aGF0IHRoZSBpbmRleCBpcyBpbnRvCisgKiBhIHJpbmcgYnVmZmVyLCBub3QgYSBzbGlkaW5nIHdpbmRvdzsgZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGhhdmUgYmVlbiAyNjAKKyAqIGJ5dGVzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBidWZmZXIsIGFuIEkyIGluZGV4IG9mIDAgd291bGQgaW5kZXggdG8gYnl0ZSAyNTYKKyAqIGluIHRoZSBvdXRwdXQgYnVmZmVyLCB3aGlsZSBhbiBJMiBpbmRleCBvZiAxNiB3b3VsZCBpbmRleCB0byBieXRlIDE2IGluIHRoZQorICogb3V0cHV0IGJ1ZmZlci4KKyAqCisgKiBUaGVyZSBhcmUgYWxzbyAzIHNwZWNpYWwgdGVtcGxhdGUgY29kZXM7IDB4MWIgZm9yICJyZXBlYXQiLCAweDFjIGZvcgorICogInplcm9zIiwgYW5kIDB4MWUgZm9yICJlbmQiLiAgVGhlICJyZXBlYXQiIG9wZXJhdGlvbiBpcyBmb2xsb3dlZCBieSBhIDYgYml0CisgKiBhcmcgTiBpbmRpY2F0aW5nIGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdC4gIFRoZSBsYXN0IDggYnl0ZXMgd3JpdHRlbiB0byB0aGUKKyAqIG91dHB1dCBidWZmZXIgYXJlIHdyaXR0ZW4gYWdhaW4gdG8gdGhlIG91dHB1dCBidWZmZXIsIE4gKyAxIHRpbWVzLiAgVGhlCisgKiAiemVyb3MiIG9wZXJhdGlvbiwgd2hpY2ggaGFzIG5vIGFyZyBiaXRzLCB3cml0ZXMgOCB6ZXJvcyB0byB0aGUgb3V0cHV0CisgKiBidWZmZXIuICBUaGUgImVuZCIgb3BlcmF0aW9uLCB3aGljaCBhbHNvIGhhcyBubyBhcmcgYml0cywgc2lnbmFscyB0aGUgZW5kCisgKiBvZiB0aGUgY29tcHJlc3NlZCBkYXRhLiAgVGhlcmUgbWF5IGJlIHNvbWUgbnVtYmVyIG9mIHBhZGRpbmcgKGRvbid0IGNhcmUsCisgKiBidXQgdXN1YWxseSAwKSBiaXRzIGFmdGVyIHRoZSAiZW5kIiBvcGVyYXRpb24gYml0cywgdG8gZmlsbCB0aGUgYnVmZmVyCisgKiBsZW5ndGggdG8gYSBzcGVjaWZpYyBieXRlIG11bHRpcGxlICh1c3VhbGx5IGEgbXVsdGlwbGUgb2YgOCwgMTYsIG9yIDMyCisgKiBieXRlcykuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiBhbHNvIHVzZXMgb25lIG9mIHRoZSB1bmRlZmluZWQgdGVtcGxhdGUgdmFsdWVzLAorICogMHgxZCBhcyBhIHNwZWNpYWwgInNob3J0IGRhdGEiIHRlbXBsYXRlIGNvZGUsIHRvIHJlcHJlc2VudCBsZXNzIHRoYW4gOCBieXRlcworICogb2YgdW5jb21wcmVzc2VkIGRhdGEuICBJdCBpcyBmb2xsb3dlZCBieSBhIDMgYml0IGFyZyBOIGluZGljYXRpbmcgaG93IG1hbnkKKyAqIGRhdGEgYnl0ZXMgd2lsbCBmb2xsb3csIGFuZCB0aGVuIE4gYnl0ZXMgb2YgZGF0YSwgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0bworICogdGhlIG91dHB1dCBidWZmZXIuICBUaGlzIGFsbG93cyB0aGUgc29mdHdhcmUgODQyIGNvbXByZXNzb3IgdG8gYWNjZXB0IGlucHV0CisgKiBidWZmZXJzIHRoYXQgYXJlIG5vdCBhbiBleGFjdCBtdWx0aXBsZSBvZiA4IGJ5dGVzIGxvbmcuICBIb3dldmVyLCB0aG9zZQorICogY29tcHJlc3NlZCBidWZmZXJzIGNvbnRhaW5pbmcgdGhpcyBzdy1vbmx5IHRlbXBsYXRlIHdpbGwgYmUgcmVqZWN0ZWQgYnkKKyAqIHRoZSA4NDIgaGFyZHdhcmUgZGVjb21wcmVzc29yLCBhbmQgbXVzdCBiZSBkZWNvbXByZXNzZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBsaWJyYXJ5LiAgVGhlIDg0MiBzb2Z0d2FyZSBjb21wcmVzc2lvbiBtb2R1bGUgaW5jbHVkZXMgYSBwYXJhbWV0ZXIgdG8KKyAqIGRpc2FibGUgdXNpbmcgdGhpcyBzdy1vbmx5ICJzaG9ydCBkYXRhIiB0ZW1wbGF0ZSwgYW5kIGluc3RlYWQgc2ltcGx5CisgKiByZWplY3QgYW55IGlucHV0IGJ1ZmZlciB0aGF0IGlzIG5vdCBhIG11bHRpcGxlIG9mIDggYnl0ZXMgbG9uZy4KKyAqCisgKiBBZnRlciBhbGwgYWN0aW9ucyBmb3IgZWFjaCBvcGVyYXRpb24gY29kZSBhcmUgcHJvY2Vzc2VkLCBhbm90aGVyIHRlbXBsYXRlCisgKiBjb2RlIGlzIGluIHRoZSBuZXh0IDUgYml0cy4gIFRoZSBkZWNvbXByZXNzaW9uIGVuZHMgb25jZSB0aGUgImVuZCIgdGVtcGxhdGUKKyAqIGNvZGUgaXMgZGV0ZWN0ZWQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisjaW5jbHVkZSA8bGludXgvc3c4NDIuaD4KKworLyogc3BlY2lhbCB0ZW1wbGF0ZXMgKi8KKyNkZWZpbmUgT1BfUkVQRUFUCSgweDFCKQorI2RlZmluZSBPUF9aRVJPUwkoMHgxQykKKyNkZWZpbmUgT1BfRU5ECQkoMHgxRSkKKworLyogc3cgb25seSB0ZW1wbGF0ZSAtIHRoaXMgaXMgbm90IGluIHRoZSBodyBkZXNpZ247IGl0J3MgdXNlZCBvbmx5IGJ5IHRoaXMKKyAqIHNvZnR3YXJlIGNvbXByZXNzb3IgYW5kIGRlY29tcHJlc3NvciwgdG8gYWxsb3cgaW5wdXQgYnVmZmVycyB0aGF0IGFyZW4ndAorICogYSBtdWx0aXBsZSBvZiA4LgorICovCisjZGVmaW5lIE9QX1NIT1JUX0RBVEEJKDB4MUQpCisKKy8qIGFkZGl0aW9uYWwgYml0cyBvZiBlYWNoIG9wIHBhcmFtICovCisjZGVmaW5lIE9QX0JJVFMJCSg1KQorI2RlZmluZSBSRVBFQVRfQklUUwkoNikKKyNkZWZpbmUgU0hPUlRfREFUQV9CSVRTCSgzKQorI2RlZmluZSBJMl9CSVRTCQkoOCkKKyNkZWZpbmUgSTRfQklUUwkJKDkpCisjZGVmaW5lIEk4X0JJVFMJCSg4KQorI2RlZmluZSBDUkNfQklUUwkoMzIpCisKKyNkZWZpbmUgUkVQRUFUX0JJVFNfTUFYCQkoMHgzZikKKyNkZWZpbmUgU0hPUlRfREFUQV9CSVRTX01BWAkoMHg3KQorCisvKiBBcmJpdHJhcnkgdmFsdWVzIHVzZWQgdG8gaW5kaWNhdGUgYWN0aW9uICovCisjZGVmaW5lIE9QX0FDVElPTgkoMHg3MCkKKyNkZWZpbmUgT1BfQUNUSU9OX0lOREVYCSgweDEwKQorI2RlZmluZSBPUF9BQ1RJT05fREFUQQkoMHgyMCkKKyNkZWZpbmUgT1BfQUNUSU9OX05PT1AJKDB4NDApCisjZGVmaW5lIE9QX0FNT1VOVAkoMHgwZikKKyNkZWZpbmUgT1BfQU1PVU5UXzAJKDB4MDApCisjZGVmaW5lIE9QX0FNT1VOVF8yCSgweDAyKQorI2RlZmluZSBPUF9BTU9VTlRfNAkoMHgwNCkKKyNkZWZpbmUgT1BfQU1PVU5UXzgJKDB4MDgpCisKKyNkZWZpbmUgRDIJCShPUF9BQ1RJT05fREFUQSAgfCBPUF9BTU9VTlRfMikKKyNkZWZpbmUgRDQJCShPUF9BQ1RJT05fREFUQSAgfCBPUF9BTU9VTlRfNCkKKyNkZWZpbmUgRDgJCShPUF9BQ1RJT05fREFUQSAgfCBPUF9BTU9VTlRfOCkKKyNkZWZpbmUgSTIJCShPUF9BQ1RJT05fSU5ERVggfCBPUF9BTU9VTlRfMikKKyNkZWZpbmUgSTQJCShPUF9BQ1RJT05fSU5ERVggfCBPUF9BTU9VTlRfNCkKKyNkZWZpbmUgSTgJCShPUF9BQ1RJT05fSU5ERVggfCBPUF9BTU9VTlRfOCkKKyNkZWZpbmUgTjAJCShPUF9BQ1RJT05fTk9PUCAgfCBPUF9BTU9VTlRfMCkKKworLyogdGhlIG1heCBvZiB0aGUgcmVndWxhciB0ZW1wbGF0ZXMgLSBub3QgaW5jbHVkaW5nIHRoZSBzcGVjaWFsIHRlbXBsYXRlcyAqLworI2RlZmluZSBPUFNfTUFYCQkoMHgxYSkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi84NDIvODQyX2NvbXByZXNzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi84NDIvODQyX2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1MTMzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi84NDJfY29tcHJlc3MuYwpAQCAtMCwwICsxLDYzOSBAQAorLyoKKyAqIDg0MiBTb2Z0d2FyZSBDb21wcmVzc2lvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBEYW4gU3RyZWV0bWFuLCBJQk0gQ29ycAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBTZWUgODQyLmggZm9yIGRldGFpbHMgb2YgdGhlIDg0MiBjb21wcmVzc2VkIGZvcm1hdC4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisjZGVmaW5lIE1PRFVMRV9OQU1FICI4NDJfY29tcHJlc3MiCisKKyNpbmNsdWRlIDxsaW51eC9oYXNodGFibGUuaD4KKworI2luY2x1ZGUgIjg0Mi5oIgorI2luY2x1ZGUgIjg0Ml9kZWJ1Z2ZzLmgiCisKKyNkZWZpbmUgU1c4NDJfSEFTSFRBQkxFOF9CSVRTCSgxMCkKKyNkZWZpbmUgU1c4NDJfSEFTSFRBQkxFNF9CSVRTCSgxMSkKKyNkZWZpbmUgU1c4NDJfSEFTSFRBQkxFMl9CSVRTCSgxMCkKKworLyogQnkgZGVmYXVsdCwgd2UgYWxsb3cgY29tcHJlc3NpbmcgaW5wdXQgYnVmZmVycyBvZiBhbnkgbGVuZ3RoLCBidXQgd2UgbXVzdAorICogdXNlIHRoZSBub24tc3RhbmRhcmQgInNob3J0IGRhdGEiIHRlbXBsYXRlIHNvIHRoZSBkZWNvbXByZXNzb3IgY2FuIGNvcnJlY3RseQorICogcmVwcm9kdWNlIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBidWZmZXIgYXQgdGhlIHJpZ2h0IGxlbmd0aC4gIEhvd2V2ZXIgdGhlCisgKiBoYXJkd2FyZSA4NDIgY29tcHJlc3NvciB3aWxsIG5vdCByZWNvZ25pemUgdGhlICJzaG9ydCBkYXRhIiB0ZW1wbGF0ZSwgYW5kCisgKiB3aWxsIGZhaWwgdG8gZGVjb21wcmVzcyBhbnkgY29tcHJlc3NlZCBidWZmZXIgY29udGFpbmluZyBpdCAoSSBoYXZlIG5vIGlkZWEKKyAqIHdoeSBhbnlvbmUgd291bGQgd2FudCB0byB1c2Ugc29mdHdhcmUgdG8gY29tcHJlc3MgYW5kIGhhcmR3YXJlIHRvIGRlY29tcHJlc3MKKyAqIGJ1dCB0aGF0J3MgYmVzaWRlIHRoZSBwb2ludCkuICBUaGlzIHBhcmFtZXRlciBmb3JjZXMgdGhlIGNvbXByZXNzaW9uCisgKiBmdW5jdGlvbiB0byBzaW1wbHkgcmVqZWN0IGFueSBpbnB1dCBidWZmZXIgdGhhdCBpc24ndCBhIG11bHRpcGxlIG9mIDggYnl0ZXMKKyAqIGxvbmcsIGluc3RlYWQgb2YgdXNpbmcgdGhlICJzaG9ydCBkYXRhIiB0ZW1wbGF0ZSwgc28gdGhhdCBhbGwgY29tcHJlc3NlZAorICogYnVmZmVycyBwcm9kdWNlZCBieSB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgZGVjb21wcmVzc2FibGUgYnkgdGhlIDg0MiBoYXJkd2FyZQorICogZGVjb21wcmVzc29yLiAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgbmVlZCBmb3IgdGhhdCwgbGVhdmUgdGhpcyBkaXNhYmxlZAorICogc28gdGhhdCBhbnkgbGVuZ3RoIGJ1ZmZlciBjYW4gYmUgY29tcHJlc3NlZC4KKyAqLworc3RhdGljIGJvb2wgc3c4NDJfc3RyaWN0OworbW9kdWxlX3BhcmFtX25hbWVkKHN0cmljdCwgc3c4NDJfc3RyaWN0LCBib29sLCAwNjQ0KTsKKworc3RhdGljIHU4IGNvbXBfb3BzW09QU19NQVhdWzVdID0geyAvKiBwYXJhbXMgc2l6ZSBpbiBiaXRzICovCisJeyBJOCwgTjAsIE4wLCBOMCwgMHgxOSB9LCAvKiA4ICovCisJeyBJNCwgSTQsIE4wLCBOMCwgMHgxOCB9LCAvKiAxOCAqLworCXsgSTQsIEkyLCBJMiwgTjAsIDB4MTcgfSwgLyogMjUgKi8KKwl7IEkyLCBJMiwgSTQsIE4wLCAweDEzIH0sIC8qIDI1ICovCisJeyBJMiwgSTIsIEkyLCBJMiwgMHgxMiB9LCAvKiAzMiAqLworCXsgSTQsIEkyLCBEMiwgTjAsIDB4MTYgfSwgLyogMzMgKi8KKwl7IEk0LCBEMiwgSTIsIE4wLCAweDE1IH0sIC8qIDMzICovCisJeyBJMiwgRDIsIEk0LCBOMCwgMHgwZSB9LCAvKiAzMyAqLworCXsgRDIsIEkyLCBJNCwgTjAsIDB4MDkgfSwgLyogMzMgKi8KKwl7IEkyLCBJMiwgSTIsIEQyLCAweDExIH0sIC8qIDQwICovCisJeyBJMiwgSTIsIEQyLCBJMiwgMHgxMCB9LCAvKiA0MCAqLworCXsgSTIsIEQyLCBJMiwgSTIsIDB4MGQgfSwgLyogNDAgKi8KKwl7IEQyLCBJMiwgSTIsIEkyLCAweDA4IH0sIC8qIDQwICovCisJeyBJNCwgRDQsIE4wLCBOMCwgMHgxNCB9LCAvKiA0MSAqLworCXsgRDQsIEk0LCBOMCwgTjAsIDB4MDQgfSwgLyogNDEgKi8KKwl7IEkyLCBJMiwgRDQsIE4wLCAweDBmIH0sIC8qIDQ4ICovCisJeyBJMiwgRDIsIEkyLCBEMiwgMHgwYyB9LCAvKiA0OCAqLworCXsgSTIsIEQ0LCBJMiwgTjAsIDB4MGIgfSwgLyogNDggKi8KKwl7IEQyLCBJMiwgSTIsIEQyLCAweDA3IH0sIC8qIDQ4ICovCisJeyBEMiwgSTIsIEQyLCBJMiwgMHgwNiB9LCAvKiA0OCAqLworCXsgRDQsIEkyLCBJMiwgTjAsIDB4MDMgfSwgLyogNDggKi8KKwl7IEkyLCBEMiwgRDQsIE4wLCAweDBhIH0sIC8qIDU2ICovCisJeyBEMiwgSTIsIEQ0LCBOMCwgMHgwNSB9LCAvKiA1NiAqLworCXsgRDQsIEkyLCBEMiwgTjAsIDB4MDIgfSwgLyogNTYgKi8KKwl7IEQ0LCBEMiwgSTIsIE4wLCAweDAxIH0sIC8qIDU2ICovCisJeyBEOCwgTjAsIE4wLCBOMCwgMHgwMCB9LCAvKiA2NCAqLworfTsKKworc3RydWN0IHN3ODQyX2hsaXN0X25vZGU4IHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworCXU2NCBkYXRhOworCXU4IGluZGV4OworfTsKKworc3RydWN0IHN3ODQyX2hsaXN0X25vZGU0IHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBub2RlOworCXUzMiBkYXRhOworCXUxNiBpbmRleDsKK307CisKK3N0cnVjdCBzdzg0Ml9obGlzdF9ub2RlMiB7CisJc3RydWN0IGhsaXN0X25vZGUgbm9kZTsKKwl1MTYgZGF0YTsKKwl1OCBpbmRleDsKK307CisKKyNkZWZpbmUgSU5ERVhfTk9UX0ZPVU5ECQkoLTEpCisjZGVmaW5lIElOREVYX05PVF9DSEVDS0VECSgtMikKKworc3RydWN0IHN3ODQyX3BhcmFtIHsKKwl1OCAqaW47CisJdTggKmluc3RhcnQ7CisJdTY0IGlsZW47CisJdTggKm91dDsKKwl1NjQgb2xlbjsKKwl1OCBiaXQ7CisJdTY0IGRhdGE4WzFdOworCXUzMiBkYXRhNFsyXTsKKwl1MTYgZGF0YTJbNF07CisJaW50IGluZGV4OFsxXTsKKwlpbnQgaW5kZXg0WzJdOworCWludCBpbmRleDJbNF07CisJREVDTEFSRV9IQVNIVEFCTEUoaHRhYmxlOCwgU1c4NDJfSEFTSFRBQkxFOF9CSVRTKTsKKwlERUNMQVJFX0hBU0hUQUJMRShodGFibGU0LCBTVzg0Ml9IQVNIVEFCTEU0X0JJVFMpOworCURFQ0xBUkVfSEFTSFRBQkxFKGh0YWJsZTIsIFNXODQyX0hBU0hUQUJMRTJfQklUUyk7CisJc3RydWN0IHN3ODQyX2hsaXN0X25vZGU4IG5vZGU4WzEgPDwgSThfQklUU107CisJc3RydWN0IHN3ODQyX2hsaXN0X25vZGU0IG5vZGU0WzEgPDwgSTRfQklUU107CisJc3RydWN0IHN3ODQyX2hsaXN0X25vZGUyIG5vZGUyWzEgPDwgSTJfQklUU107Cit9OworCisjZGVmaW5lIGdldF9pbnB1dF9kYXRhKHAsIG8sIGIpCQkJCQkJXAorCWJlIyNiIyNfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUjI2IgKikoKHApLT5pbiArIChvKSkpKQorCisjZGVmaW5lIGluaXRfaGFzaHRhYmxlX25vZGVzKHAsIGIpCWRvIHsJCQlcCisJaW50IF9pOwkJCQkJCQlcCisJaGFzaF9pbml0KChwKS0+aHRhYmxlIyNiKTsJCQkJXAorCWZvciAoX2kgPSAwOyBfaSA8IEFSUkFZX1NJWkUoKHApLT5ub2RlIyNiKTsgX2krKykgewlcCisJCShwKS0+bm9kZSMjYltfaV0uaW5kZXggPSBfaTsJCQlcCisJCShwKS0+bm9kZSMjYltfaV0uZGF0YSA9IDA7CQkJXAorCQlJTklUX0hMSVNUX05PREUoJihwKS0+bm9kZSMjYltfaV0ubm9kZSk7CVwKKwl9CQkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgZmluZF9pbmRleChwLCBiLCBuKQkoewkJCQkJXAorCXN0cnVjdCBzdzg0Ml9obGlzdF9ub2RlIyNiICpfbjsJCQkJCVwKKwlwLT5pbmRleCMjYltuXSA9IElOREVYX05PVF9GT1VORDsJCQkJXAorCWhhc2hfZm9yX2VhY2hfcG9zc2libGUocC0+aHRhYmxlIyNiLCBfbiwgbm9kZSwgcC0+ZGF0YSMjYltuXSkgewlcCisJCWlmIChwLT5kYXRhIyNiW25dID09IF9uLT5kYXRhKSB7CQkJXAorCQkJcC0+aW5kZXgjI2Jbbl0gPSBfbi0+aW5kZXg7CQkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCisJcC0+aW5kZXgjI2Jbbl0gPj0gMDsJCQkJCQlcCit9KQorCisjZGVmaW5lIGNoZWNrX2luZGV4KHAsIGIsIG4pCQkJXAorCSgocCktPmluZGV4IyNiW25dID09IElOREVYX05PVF9DSEVDS0VECVwKKwkgPyBmaW5kX2luZGV4KHAsIGIsIG4pCQkJXAorCSA6IChwKS0+aW5kZXgjI2Jbbl0gPj0gMCkKKworI2RlZmluZSByZXBsYWNlX2hhc2gocCwgYiwgaSwgZCkJZG8gewkJCQlcCisJc3RydWN0IHN3ODQyX2hsaXN0X25vZGUjI2IgKl9uID0gJihwKS0+bm9kZSMjYlsoaSkrKGQpXTsJXAorCWhhc2hfZGVsKCZfbi0+bm9kZSk7CQkJCQkJXAorCV9uLT5kYXRhID0gKHApLT5kYXRhIyNiW2RdOwkJCQkJXAorCXByX2RlYnVnKCJhZGQgaGFzaCBpbmRleCV4ICV4IHBvcyAleCBkYXRhICVseFxuIiwgYiwJCVwKKwkJICh1bnNpZ25lZCBpbnQpX24tPmluZGV4LAkJCQlcCisJCSAodW5zaWduZWQgaW50KSgocCktPmluIC0gKHApLT5pbnN0YXJ0KSwJCVwKKwkJICh1bnNpZ25lZCBsb25nKV9uLT5kYXRhKTsJCQkJXAorCWhhc2hfYWRkKChwKS0+aHRhYmxlIyNiLCAmX24tPm5vZGUsIF9uLT5kYXRhKTsJCQlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdTggYm1hc2tbOF0gPSB7IDB4MDAsIDB4ODAsIDB4YzAsIDB4ZTAsIDB4ZjAsIDB4ZjgsIDB4ZmMsIDB4ZmUgfTsKKworc3RhdGljIGludCBhZGRfYml0cyhzdHJ1Y3Qgc3c4NDJfcGFyYW0gKnAsIHU2NCBkLCB1OCBuKTsKKworc3RhdGljIGludCBfX3NwbGl0X2FkZF9iaXRzKHN0cnVjdCBzdzg0Ml9wYXJhbSAqcCwgdTY0IGQsIHU4IG4sIHU4IHMpCit7CisJaW50IHJldDsKKworCWlmIChuIDw9IHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWRkX2JpdHMocCwgZCA+PiBzLCBuIC0gcyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gYWRkX2JpdHMocCwgZCAmIEdFTk1BU0tfVUxMKHMgLSAxLCAwKSwgcyk7Cit9CisKK3N0YXRpYyBpbnQgYWRkX2JpdHMoc3RydWN0IHN3ODQyX3BhcmFtICpwLCB1NjQgZCwgdTggbikKK3sKKwlpbnQgYiA9IHAtPmJpdCwgYml0cyA9IGIgKyBuLCBzID0gcm91bmRfdXAoYml0cywgOCkgLSBiaXRzOworCXU2NCBvOworCXU4ICpvdXQgPSBwLT5vdXQ7CisKKwlwcl9kZWJ1ZygiYWRkICV1IGJpdHMgJWx4XG4iLCAodW5zaWduZWQgY2hhciluLCAodW5zaWduZWQgbG9uZylkKTsKKworCWlmIChuID4gNjQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3BsaXQgdGhpcyB1cCBpZiB3cml0aW5nIHRvID4gOCBieXRlcyAoaS5lLiBuID09IDY0ICYmIHAtPmJpdCA+IDApLAorCSAqIG9yIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIgYW5kIHdvdWxkIHdyaXRlIHBhc3QgZW5kCisJICovCisJaWYgKGJpdHMgPiA2NCkKKwkJcmV0dXJuIF9fc3BsaXRfYWRkX2JpdHMocCwgZCwgbiwgMzIpOworCWVsc2UgaWYgKHAtPm9sZW4gPCA4ICYmIGJpdHMgPiAzMiAmJiBiaXRzIDw9IDU2KQorCQlyZXR1cm4gX19zcGxpdF9hZGRfYml0cyhwLCBkLCBuLCAxNik7CisJZWxzZSBpZiAocC0+b2xlbiA8IDQgJiYgYml0cyA+IDE2ICYmIGJpdHMgPD0gMjQpCisJCXJldHVybiBfX3NwbGl0X2FkZF9iaXRzKHAsIGQsIG4sIDgpOworCisJaWYgKERJVl9ST1VORF9VUChiaXRzLCA4KSA+IHAtPm9sZW4pCisJCXJldHVybiAtRU5PU1BDOworCisJbyA9ICpvdXQgJiBibWFza1tiXTsKKwlkIDw8PSBzOworCisJaWYgKGJpdHMgPD0gOCkKKwkJKm91dCA9IG8gfCBkOworCWVsc2UgaWYgKGJpdHMgPD0gMTYpCisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMTYobyA8PCA4IHwgZCksIChfX2JlMTYgKilvdXQpOworCWVsc2UgaWYgKGJpdHMgPD0gMjQpCisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMzIobyA8PCAyNCB8IGQgPDwgOCksIChfX2JlMzIgKilvdXQpOworCWVsc2UgaWYgKGJpdHMgPD0gMzIpCisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlMzIobyA8PCAyNCB8IGQpLCAoX19iZTMyICopb3V0KTsKKwllbHNlIGlmIChiaXRzIDw9IDQwKQorCQlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTY0KG8gPDwgNTYgfCBkIDw8IDI0KSwgKF9fYmU2NCAqKW91dCk7CisJZWxzZSBpZiAoYml0cyA8PSA0OCkKKwkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmU2NChvIDw8IDU2IHwgZCA8PCAxNiksIChfX2JlNjQgKilvdXQpOworCWVsc2UgaWYgKGJpdHMgPD0gNTYpCisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlNjQobyA8PCA1NiB8IGQgPDwgOCksIChfX2JlNjQgKilvdXQpOworCWVsc2UKKwkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmU2NChvIDw8IDU2IHwgZCksIChfX2JlNjQgKilvdXQpOworCisJcC0+Yml0ICs9IG47CisKKwlpZiAocC0+Yml0ID4gNykgeworCQlwLT5vdXQgKz0gcC0+Yml0IC8gODsKKwkJcC0+b2xlbiAtPSBwLT5iaXQgLyA4OworCQlwLT5iaXQgJT0gODsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfdGVtcGxhdGUoc3RydWN0IHN3ODQyX3BhcmFtICpwLCB1OCBjKQoreworCWludCByZXQsIGksIGIgPSAwOworCXU4ICp0ID0gY29tcF9vcHNbY107CisJYm9vbCBpbnYgPSBmYWxzZTsKKworCWlmIChjID49IE9QU19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJcHJfZGVidWcoInRlbXBsYXRlICV4XG4iLCB0WzRdKTsKKworCXJldCA9IGFkZF9iaXRzKHAsIHRbNF0sIE9QX0JJVFMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCXByX2RlYnVnKCJvcCAleFxuIiwgdFtpXSk7CisKKwkJc3dpdGNoICh0W2ldICYgT1BfQU1PVU5UKSB7CisJCWNhc2UgT1BfQU1PVU5UXzg6CisJCQlpZiAoYikKKwkJCQlpbnYgPSB0cnVlOworCQkJZWxzZSBpZiAodFtpXSAmIE9QX0FDVElPTl9JTkRFWCkKKwkJCQlyZXQgPSBhZGRfYml0cyhwLCBwLT5pbmRleDhbMF0sIEk4X0JJVFMpOworCQkJZWxzZSBpZiAodFtpXSAmIE9QX0FDVElPTl9EQVRBKQorCQkJCXJldCA9IGFkZF9iaXRzKHAsIHAtPmRhdGE4WzBdLCA2NCk7CisJCQllbHNlCisJCQkJaW52ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0FNT1VOVF80OgorCQkJaWYgKGIgPT0gMiAmJiB0W2ldICYgT1BfQUNUSU9OX0RBVEEpCisJCQkJcmV0ID0gYWRkX2JpdHMocCwgZ2V0X2lucHV0X2RhdGEocCwgMiwgMzIpLCAzMik7CisJCQllbHNlIGlmIChiICE9IDAgJiYgYiAhPSA0KQorCQkJCWludiA9IHRydWU7CisJCQllbHNlIGlmICh0W2ldICYgT1BfQUNUSU9OX0lOREVYKQorCQkJCXJldCA9IGFkZF9iaXRzKHAsIHAtPmluZGV4NFtiID4+IDJdLCBJNF9CSVRTKTsKKwkJCWVsc2UgaWYgKHRbaV0gJiBPUF9BQ1RJT05fREFUQSkKKwkJCQlyZXQgPSBhZGRfYml0cyhwLCBwLT5kYXRhNFtiID4+IDJdLCAzMik7CisJCQllbHNlCisJCQkJaW52ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlIE9QX0FNT1VOVF8yOgorCQkJaWYgKGIgIT0gMCAmJiBiICE9IDIgJiYgYiAhPSA0ICYmIGIgIT0gNikKKwkJCQlpbnYgPSB0cnVlOworCQkJaWYgKHRbaV0gJiBPUF9BQ1RJT05fSU5ERVgpCisJCQkJcmV0ID0gYWRkX2JpdHMocCwgcC0+aW5kZXgyW2IgPj4gMV0sIEkyX0JJVFMpOworCQkJZWxzZSBpZiAodFtpXSAmIE9QX0FDVElPTl9EQVRBKQorCQkJCXJldCA9IGFkZF9iaXRzKHAsIHAtPmRhdGEyW2IgPj4gMV0sIDE2KTsKKwkJCWVsc2UKKwkJCQlpbnYgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgT1BfQU1PVU5UXzA6CisJCQlpbnYgPSAoYiAhPSA4KSB8fCAhKHRbaV0gJiBPUF9BQ1RJT05fTk9PUCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWludiA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCisJCWlmIChpbnYpIHsKKwkJCXByX2VycigiSW52YWxpZCB0ZW1wbCAleCBvcCAlZCA6ICV4ICV4ICV4ICV4XG4iLAorCQkJICAgICAgIGMsIGksIHRbMF0sIHRbMV0sIHRbMl0sIHRbM10pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQliICs9IHRbaV0gJiBPUF9BTU9VTlQ7CisJfQorCisJaWYgKGIgIT0gOCkgeworCQlwcl9lcnIoIkludmFsaWQgdGVtcGxhdGUgJXggbGVuICV4IDogJXggJXggJXggJXhcbiIsCisJCSAgICAgICBjLCBiLCB0WzBdLCB0WzFdLCB0WzJdLCB0WzNdKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN3ODQyX3RlbXBsYXRlX2NvdW50cykKKwkJYXRvbWljX2luYygmdGVtcGxhdGVfY291bnRbdFs0XV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3JlcGVhdF90ZW1wbGF0ZShzdHJ1Y3Qgc3c4NDJfcGFyYW0gKnAsIHU4IHIpCit7CisJaW50IHJldDsKKworCS8qIHJlcGVhdCBwYXJhbSBpcyAwLWJhc2VkICovCisJaWYgKCFyIHx8IC0tciA+IFJFUEVBVF9CSVRTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZGRfYml0cyhwLCBPUF9SRVBFQVQsIE9QX0JJVFMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhZGRfYml0cyhwLCByLCBSRVBFQVRfQklUUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdzg0Ml90ZW1wbGF0ZV9jb3VudHMpCisJCWF0b21pY19pbmMoJnRlbXBsYXRlX3JlcGVhdF9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfc2hvcnRfZGF0YV90ZW1wbGF0ZShzdHJ1Y3Qgc3c4NDJfcGFyYW0gKnAsIHU4IGIpCit7CisJaW50IHJldCwgaTsKKworCWlmICghYiB8fCBiID4gU0hPUlRfREFUQV9CSVRTX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhZGRfYml0cyhwLCBPUF9TSE9SVF9EQVRBLCBPUF9CSVRTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYWRkX2JpdHMocCwgYiwgU0hPUlRfREFUQV9CSVRTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gMDsgaSA8IGI7IGkrKykgeworCQlyZXQgPSBhZGRfYml0cyhwLCBwLT5pbltpXSwgOCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChzdzg0Ml90ZW1wbGF0ZV9jb3VudHMpCisJCWF0b21pY19pbmMoJnRlbXBsYXRlX3Nob3J0X2RhdGFfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3plcm9zX3RlbXBsYXRlKHN0cnVjdCBzdzg0Ml9wYXJhbSAqcCkKK3sKKwlpbnQgcmV0ID0gYWRkX2JpdHMocCwgT1BfWkVST1MsIE9QX0JJVFMpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdzg0Ml90ZW1wbGF0ZV9jb3VudHMpCisJCWF0b21pY19pbmMoJnRlbXBsYXRlX3plcm9zX2NvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9lbmRfdGVtcGxhdGUoc3RydWN0IHN3ODQyX3BhcmFtICpwKQoreworCWludCByZXQgPSBhZGRfYml0cyhwLCBPUF9FTkQsIE9QX0JJVFMpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdzg0Ml90ZW1wbGF0ZV9jb3VudHMpCisJCWF0b21pY19pbmMoJnRlbXBsYXRlX2VuZF9jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgY2hlY2tfdGVtcGxhdGUoc3RydWN0IHN3ODQyX3BhcmFtICpwLCB1OCBjKQoreworCXU4ICp0ID0gY29tcF9vcHNbY107CisJaW50IGksIG1hdGNoLCBiID0gMDsKKworCWlmIChjID49IE9QU19NQVgpCisJCXJldHVybiBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHRbaV0gJiBPUF9BQ1RJT05fSU5ERVgpIHsKKwkJCWlmICh0W2ldICYgT1BfQU1PVU5UXzIpCisJCQkJbWF0Y2ggPSBjaGVja19pbmRleChwLCAyLCBiID4+IDEpOworCQkJZWxzZSBpZiAodFtpXSAmIE9QX0FNT1VOVF80KQorCQkJCW1hdGNoID0gY2hlY2tfaW5kZXgocCwgNCwgYiA+PiAyKTsKKwkJCWVsc2UgaWYgKHRbaV0gJiBPUF9BTU9VTlRfOCkKKwkJCQltYXRjaCA9IGNoZWNrX2luZGV4KHAsIDgsIDApOworCQkJZWxzZQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWlmICghbWF0Y2gpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJYiArPSB0W2ldICYgT1BfQU1PVU5UOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBnZXRfbmV4dF9kYXRhKHN0cnVjdCBzdzg0Ml9wYXJhbSAqcCkKK3sKKwlwLT5kYXRhOFswXSA9IGdldF9pbnB1dF9kYXRhKHAsIDAsIDY0KTsKKwlwLT5kYXRhNFswXSA9IGdldF9pbnB1dF9kYXRhKHAsIDAsIDMyKTsKKwlwLT5kYXRhNFsxXSA9IGdldF9pbnB1dF9kYXRhKHAsIDQsIDMyKTsKKwlwLT5kYXRhMlswXSA9IGdldF9pbnB1dF9kYXRhKHAsIDAsIDE2KTsKKwlwLT5kYXRhMlsxXSA9IGdldF9pbnB1dF9kYXRhKHAsIDIsIDE2KTsKKwlwLT5kYXRhMlsyXSA9IGdldF9pbnB1dF9kYXRhKHAsIDQsIDE2KTsKKwlwLT5kYXRhMlszXSA9IGdldF9pbnB1dF9kYXRhKHAsIDYsIDE2KTsKK30KKworLyogdXBkYXRlIHRoZSBoYXNodGFibGUgZW50cmllcy4KKyAqIG9ubHkgY2FsbCB0aGlzIGFmdGVyIGZpbmRpbmcvYWRkaW5nIHRoZSBjdXJyZW50IHRlbXBsYXRlCisgKiB0aGUgZGF0YU4gZmllbGRzIGZvciB0aGUgY3VycmVudCA4IGJ5dGUgYmxvY2sgbXVzdCBiZSBhbHJlYWR5IHVwZGF0ZWQKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX2hhc2h0YWJsZXMoc3RydWN0IHN3ODQyX3BhcmFtICpwKQoreworCXU2NCBwb3MgPSBwLT5pbiAtIHAtPmluc3RhcnQ7CisJdTY0IG44ID0gKHBvcyA+PiAzKSAlICgxIDw8IEk4X0JJVFMpOworCXU2NCBuNCA9IChwb3MgPj4gMikgJSAoMSA8PCBJNF9CSVRTKTsKKwl1NjQgbjIgPSAocG9zID4+IDEpICUgKDEgPDwgSTJfQklUUyk7CisKKwlyZXBsYWNlX2hhc2gocCwgOCwgbjgsIDApOworCXJlcGxhY2VfaGFzaChwLCA0LCBuNCwgMCk7CisJcmVwbGFjZV9oYXNoKHAsIDQsIG40LCAxKTsKKwlyZXBsYWNlX2hhc2gocCwgMiwgbjIsIDApOworCXJlcGxhY2VfaGFzaChwLCAyLCBuMiwgMSk7CisJcmVwbGFjZV9oYXNoKHAsIDIsIG4yLCAyKTsKKwlyZXBsYWNlX2hhc2gocCwgMiwgbjIsIDMpOworfQorCisvKiBmaW5kIHRoZSBuZXh0IHRlbXBsYXRlIHRvIHVzZSwgYW5kIGFkZCBpdAorICogdGhlIHAtPmRhdGFOIGZpZWxkcyBtdXN0IGFscmVhZHkgYmUgc2V0IGZvciB0aGUgY3VycmVudCA4IGJ5dGUgYmxvY2sKKyAqLworc3RhdGljIGludCBwcm9jZXNzX25leHQoc3RydWN0IHN3ODQyX3BhcmFtICpwKQoreworCWludCByZXQsIGk7CisKKwlwLT5pbmRleDhbMF0gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKwlwLT5pbmRleDRbMF0gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKwlwLT5pbmRleDRbMV0gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKwlwLT5pbmRleDJbMF0gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKwlwLT5pbmRleDJbMV0gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKwlwLT5pbmRleDJbMl0gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKwlwLT5pbmRleDJbM10gPSBJTkRFWF9OT1RfQ0hFQ0tFRDsKKworCS8qIGNoZWNrIHVwIHRvIE9QU19NQVggLSAxOyBsYXN0IG9wIGlzIG91ciBmYWxsYmFjayAqLworCWZvciAoaSA9IDA7IGkgPCBPUFNfTUFYIC0gMTsgaSsrKSB7CisJCWlmIChjaGVja190ZW1wbGF0ZShwLCBpKSkKKwkJCWJyZWFrOworCX0KKworCXJldCA9IGFkZF90ZW1wbGF0ZShwLCBpKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc3c4NDJfY29tcHJlc3MKKyAqCisgKiBDb21wcmVzcyB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlciBvZiBsZW5ndGggQGlsZW4gYXQgQGluIHRvIHRoZSBvdXRwdXQgYnVmZmVyCisgKiBAb3V0LCB1c2luZyBubyBtb3JlIHRoYW4gQG9sZW4gYnl0ZXMsIHVzaW5nIHRoZSA4NDIgY29tcHJlc3Npb24gZm9ybWF0LgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZS4gIFRoZSBAb2xlbiBwYXJhbWV0ZXIKKyAqIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3MsIG9yCisgKiAwIG9uIGVycm9yLgorICovCitpbnQgc3c4NDJfY29tcHJlc3MoY29uc3QgdTggKmluLCB1bnNpZ25lZCBpbnQgaWxlbiwKKwkJICAgdTggKm91dCwgdW5zaWduZWQgaW50ICpvbGVuLCB2b2lkICp3bWVtKQoreworCXN0cnVjdCBzdzg0Ml9wYXJhbSAqcCA9IChzdHJ1Y3Qgc3c4NDJfcGFyYW0gKil3bWVtOworCWludCByZXQ7CisJdTY0IGxhc3QsIG5leHQsIHBhZCwgdG90YWw7CisJdTggcmVwZWF0X2NvdW50ID0gMDsKKwl1MzIgY3JjOworCisJQlVJTERfQlVHX09OKHNpemVvZigqcCkgPiBTVzg0Ml9NRU1fQ09NUFJFU1MpOworCisJaW5pdF9oYXNodGFibGVfbm9kZXMocCwgOCk7CisJaW5pdF9oYXNodGFibGVfbm9kZXMocCwgNCk7CisJaW5pdF9oYXNodGFibGVfbm9kZXMocCwgMik7CisKKwlwLT5pbiA9ICh1OCAqKWluOworCXAtPmluc3RhcnQgPSBwLT5pbjsKKwlwLT5pbGVuID0gaWxlbjsKKwlwLT5vdXQgPSBvdXQ7CisJcC0+b2xlbiA9ICpvbGVuOworCXAtPmJpdCA9IDA7CisKKwl0b3RhbCA9IHAtPm9sZW47CisKKwkqb2xlbiA9IDA7CisKKwkvKiBpZiB1c2luZyBzdHJpY3QgbW9kZSwgd2UgY2FuIG9ubHkgY29tcHJlc3MgYSBtdWx0aXBsZSBvZiA4ICovCisJaWYgKHN3ODQyX3N0cmljdCAmJiAoaWxlbiAlIDgpKSB7CisJCXByX2VycigiVXNpbmcgc3RyaWN0IG1vZGUsIGNhbid0IGNvbXByZXNzIGxlbiAlZFxuIiwgaWxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGxldCdzIGNvbXByZXNzIGF0IGxlYXN0IDggYnl0ZXMsIG1rYXk/ICovCisJaWYgKHVubGlrZWx5KGlsZW4gPCA4KSkKKwkJZ290byBza2lwX2NvbXA7CisKKwkvKiBtYWtlIGluaXRpYWwgJ2xhc3QnIGRpZmZlcmVudCBzbyB3ZSBkb24ndCBtYXRjaCB0aGUgZmlyc3QgdGltZSAqLworCWxhc3QgPSB+Z2V0X3VuYWxpZ25lZCgodTY0ICopcC0+aW4pOworCisJd2hpbGUgKHAtPmlsZW4gPiA3KSB7CisJCW5leHQgPSBnZXRfdW5hbGlnbmVkKCh1NjQgKilwLT5pbik7CisKKwkJLyogbXVzdCBnZXQgdGhlIG5leHQgZGF0YSwgYXMgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGhhc2h0YWJsZQorCQkgKiBlbnRyaWVzIHdpdGggdGhlIG5ldyBkYXRhIGV2ZXJ5IHRpbWUKKwkJICovCisJCWdldF9uZXh0X2RhdGEocCk7CisKKwkJLyogd2UgZG9uJ3QgY2FyZSBhYm91dCBlbmRpYW5uZXNzIGluIGxhc3Qgb3IgbmV4dDsKKwkJICogd2UncmUganVzdCBjb21wYXJpbmcgOCBieXRlcyB0byBhbm90aGVyIDggYnl0ZXMsCisJCSAqIHRoZXkncmUgYm90aCB0aGUgc2FtZSBlbmRpYW5uZXNzCisJCSAqLworCQlpZiAobmV4dCA9PSBsYXN0KSB7CisJCQkvKiByZXBlYXQgY291bnQgYml0cyBhcmUgMC1iYXNlZCwgc28gd2Ugc3RvcCBhdCArMSAqLworCQkJaWYgKCsrcmVwZWF0X2NvdW50IDw9IFJFUEVBVF9CSVRTX01BWCkKKwkJCQlnb3RvIHJlcGVhdDsKKwkJfQorCQlpZiAocmVwZWF0X2NvdW50KSB7CisJCQlyZXQgPSBhZGRfcmVwZWF0X3RlbXBsYXRlKHAsIHJlcGVhdF9jb3VudCk7CisJCQlyZXBlYXRfY291bnQgPSAwOworCQkJaWYgKG5leHQgPT0gbGFzdCkgLyogcmVhY2hlZCBtYXggcmVwZWF0IGJpdHMgKi8KKwkJCQlnb3RvIHJlcGVhdDsKKwkJfQorCisJCWlmIChuZXh0ID09IDApCisJCQlyZXQgPSBhZGRfemVyb3NfdGVtcGxhdGUocCk7CisJCWVsc2UKKwkJCXJldCA9IHByb2Nlc3NfbmV4dChwKTsKKworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworcmVwZWF0OgorCQlsYXN0ID0gbmV4dDsKKwkJdXBkYXRlX2hhc2h0YWJsZXMocCk7CisJCXAtPmluICs9IDg7CisJCXAtPmlsZW4gLT0gODsKKwl9CisKKwlpZiAocmVwZWF0X2NvdW50KSB7CisJCXJldCA9IGFkZF9yZXBlYXRfdGVtcGxhdGUocCwgcmVwZWF0X2NvdW50KTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCitza2lwX2NvbXA6CisJaWYgKHAtPmlsZW4gPiAwKSB7CisJCXJldCA9IGFkZF9zaG9ydF9kYXRhX3RlbXBsYXRlKHAsIHAtPmlsZW4pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlwLT5pbiArPSBwLT5pbGVuOworCQlwLT5pbGVuID0gMDsKKwl9CisKKwlyZXQgPSBhZGRfZW5kX3RlbXBsYXRlKHApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKgorCSAqIGNyYygwOjMxKSBpcyBhcHBlbmRlZCB0byB0YXJnZXQgZGF0YSBzdGFydGluZyB3aXRoIHRoZSBuZXh0CisJICogYml0IGFmdGVyIEVuZCBvZiBzdHJlYW0gdGVtcGxhdGUuCisJICogbng4NDIgY2FsY3VsYXRlcyBDUkMgZm9yIGRhdGEgaW4gYmlnLWVuZGlhbiBmb3JtYXQuIFNvIGRvaW5nCisJICogc2FtZSBoZXJlIHNvIHRoYXQgc3c4NDIgZGVjb21wcmVzc2lvbiBjYW4gYmUgdXNlZCBmb3IgYm90aAorCSAqIGNvbXByZXNzZWQgZGF0YS4KKwkgKi8KKwljcmMgPSBjcmMzMl9iZSgwLCBpbiwgaWxlbik7CisJcmV0ID0gYWRkX2JpdHMocCwgY3JjLCBDUkNfQklUUyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChwLT5iaXQpIHsKKwkJcC0+b3V0Kys7CisJCXAtPm9sZW4tLTsKKwkJcC0+Yml0ID0gMDsKKwl9CisKKwkvKiBwYWQgY29tcHJlc3NlZCBsZW5ndGggdG8gbXVsdGlwbGUgb2YgOCAqLworCXBhZCA9ICg4IC0gKCh0b3RhbCAtIHAtPm9sZW4pICUgOCkpICUgODsKKwlpZiAocGFkKSB7CisJCWlmIChwYWQgPiBwLT5vbGVuKSAvKiB3ZSB3ZXJlIHNvIGNsb3NlISAqLworCQkJcmV0dXJuIC1FTk9TUEM7CisJCW1lbXNldChwLT5vdXQsIDAsIHBhZCk7CisJCXAtPm91dCArPSBwYWQ7CisJCXAtPm9sZW4gLT0gcGFkOworCX0KKworCWlmICh1bmxpa2VseSgodG90YWwgLSBwLT5vbGVuKSA+IFVJTlRfTUFYKSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwkqb2xlbiA9IHRvdGFsIC0gcC0+b2xlbjsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3c4NDJfY29tcHJlc3MpOworCitzdGF0aWMgaW50IF9faW5pdCBzdzg0Ml9pbml0KHZvaWQpCit7CisJaWYgKHN3ODQyX3RlbXBsYXRlX2NvdW50cykKKwkJc3c4NDJfZGVidWdmc19jcmVhdGUoKTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQoc3c4NDJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdzg0Ml9leGl0KHZvaWQpCit7CisJaWYgKHN3ODQyX3RlbXBsYXRlX2NvdW50cykKKwkJc3c4NDJfZGVidWdmc19yZW1vdmUoKTsKK30KK21vZHVsZV9leGl0KHN3ODQyX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNvZnR3YXJlIDg0MiBDb21wcmVzc29yIik7CitNT0RVTEVfQVVUSE9SKCJEYW4gU3RyZWV0bWFuIDxkZHN0cmVldEBpZWVlLm9yZz4iKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi84NDJfZGVidWdmcy5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvODQyLzg0Ml9kZWJ1Z2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3ZTQwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi84NDJfZGVidWdmcy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisKKyNpZm5kZWYgX184NDJfREVCVUdGU19IX18KKyNkZWZpbmUgX184NDJfREVCVUdGU19IX18KKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKworc3RhdGljIGJvb2wgc3c4NDJfdGVtcGxhdGVfY291bnRzOworbW9kdWxlX3BhcmFtX25hbWVkKHRlbXBsYXRlX2NvdW50cywgc3c4NDJfdGVtcGxhdGVfY291bnRzLCBib29sLCAwNDQ0KTsKKworc3RhdGljIGF0b21pY190IHRlbXBsYXRlX2NvdW50W09QU19NQVhdLCB0ZW1wbGF0ZV9yZXBlYXRfY291bnQsCisJdGVtcGxhdGVfemVyb3NfY291bnQsIHRlbXBsYXRlX3Nob3J0X2RhdGFfY291bnQsIHRlbXBsYXRlX2VuZF9jb3VudDsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKnN3ODQyX2RlYnVnZnNfcm9vdDsKKworc3RhdGljIGludCBfX2luaXQgc3c4NDJfZGVidWdmc19jcmVhdGUodm9pZCkKK3sKKwl1bW9kZV90IG0gPSBTX0lSVUdPIHwgU19JV1VTUjsKKwlpbnQgaTsKKworCWlmICghZGVidWdmc19pbml0aWFsaXplZCgpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXN3ODQyX2RlYnVnZnNfcm9vdCA9IGRlYnVnZnNfY3JlYXRlX2RpcihNT0RVTEVfTkFNRSwgTlVMTCk7CisJaWYgKElTX0VSUihzdzg0Ml9kZWJ1Z2ZzX3Jvb3QpKQorCQlyZXR1cm4gUFRSX0VSUihzdzg0Ml9kZWJ1Z2ZzX3Jvb3QpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVtcGxhdGVfY291bnQpOyBpKyspIHsKKwkJY2hhciBuYW1lWzMyXTsKKworCQlzbnByaW50ZihuYW1lLCAzMiwgInRlbXBsYXRlXyUwMngiLCBpKTsKKwkJZGVidWdmc19jcmVhdGVfYXRvbWljX3QobmFtZSwgbSwgc3c4NDJfZGVidWdmc19yb290LAorCQkJCQkmdGVtcGxhdGVfY291bnRbaV0pOworCX0KKwlkZWJ1Z2ZzX2NyZWF0ZV9hdG9taWNfdCgidGVtcGxhdGVfcmVwZWF0IiwgbSwgc3c4NDJfZGVidWdmc19yb290LAorCQkJCSZ0ZW1wbGF0ZV9yZXBlYXRfY291bnQpOworCWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJ0ZW1wbGF0ZV96ZXJvcyIsIG0sIHN3ODQyX2RlYnVnZnNfcm9vdCwKKwkJCQkmdGVtcGxhdGVfemVyb3NfY291bnQpOworCWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJ0ZW1wbGF0ZV9zaG9ydF9kYXRhIiwgbSwgc3c4NDJfZGVidWdmc19yb290LAorCQkJCSZ0ZW1wbGF0ZV9zaG9ydF9kYXRhX2NvdW50KTsKKwlkZWJ1Z2ZzX2NyZWF0ZV9hdG9taWNfdCgidGVtcGxhdGVfZW5kIiwgbSwgc3c4NDJfZGVidWdmc19yb290LAorCQkJCSZ0ZW1wbGF0ZV9lbmRfY291bnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzdzg0Ml9kZWJ1Z2ZzX3JlbW92ZSh2b2lkKQoreworCWlmIChzdzg0Ml9kZWJ1Z2ZzX3Jvb3QgJiYgIUlTX0VSUihzdzg0Ml9kZWJ1Z2ZzX3Jvb3QpKQorCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoc3c4NDJfZGVidWdmc19yb290KTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi84NDIvODQyX2RlY29tcHJlc3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi84NDJfZGVjb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmMzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi84NDIvODQyX2RlY29tcHJlc3MuYwpAQCAtMCwwICsxLDQyNiBAQAorLyoKKyAqIDg0MiBTb2Z0d2FyZSBEZWNvbXByZXNzaW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IERhbiBTdHJlZXRtYW4sIElCTSBDb3JwCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFNlZSA4NDIuaCBmb3IgZGV0YWlscyBvZiB0aGUgODQyIGNvbXByZXNzZWQgZm9ybWF0LgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKyNkZWZpbmUgTU9EVUxFX05BTUUgIjg0Ml9kZWNvbXByZXNzIgorCisjaW5jbHVkZSAiODQyLmgiCisjaW5jbHVkZSAiODQyX2RlYnVnZnMuaCIKKworLyogcm9sbGluZyBmaWZvIHNpemVzICovCisjZGVmaW5lIEkyX0ZJRk9fU0laRQkoMiAqICgxIDw8IEkyX0JJVFMpKQorI2RlZmluZSBJNF9GSUZPX1NJWkUJKDQgKiAoMSA8PCBJNF9CSVRTKSkKKyNkZWZpbmUgSThfRklGT19TSVpFCSg4ICogKDEgPDwgSThfQklUUykpCisKK3N0YXRpYyB1OCBkZWNvbXBfb3BzW09QU19NQVhdWzRdID0geworCXsgRDgsIE4wLCBOMCwgTjAgfSwKKwl7IEQ0LCBEMiwgSTIsIE4wIH0sCisJeyBENCwgSTIsIEQyLCBOMCB9LAorCXsgRDQsIEkyLCBJMiwgTjAgfSwKKwl7IEQ0LCBJNCwgTjAsIE4wIH0sCisJeyBEMiwgSTIsIEQ0LCBOMCB9LAorCXsgRDIsIEkyLCBEMiwgSTIgfSwKKwl7IEQyLCBJMiwgSTIsIEQyIH0sCisJeyBEMiwgSTIsIEkyLCBJMiB9LAorCXsgRDIsIEkyLCBJNCwgTjAgfSwKKwl7IEkyLCBEMiwgRDQsIE4wIH0sCisJeyBJMiwgRDQsIEkyLCBOMCB9LAorCXsgSTIsIEQyLCBJMiwgRDIgfSwKKwl7IEkyLCBEMiwgSTIsIEkyIH0sCisJeyBJMiwgRDIsIEk0LCBOMCB9LAorCXsgSTIsIEkyLCBENCwgTjAgfSwKKwl7IEkyLCBJMiwgRDIsIEkyIH0sCisJeyBJMiwgSTIsIEkyLCBEMiB9LAorCXsgSTIsIEkyLCBJMiwgSTIgfSwKKwl7IEkyLCBJMiwgSTQsIE4wIH0sCisJeyBJNCwgRDQsIE4wLCBOMCB9LAorCXsgSTQsIEQyLCBJMiwgTjAgfSwKKwl7IEk0LCBJMiwgRDIsIE4wIH0sCisJeyBJNCwgSTIsIEkyLCBOMCB9LAorCXsgSTQsIEk0LCBOMCwgTjAgfSwKKwl7IEk4LCBOMCwgTjAsIE4wIH0KK307CisKK3N0cnVjdCBzdzg0Ml9wYXJhbSB7CisJdTggKmluOworCXU4IGJpdDsKKwl1NjQgaWxlbjsKKwl1OCAqb3V0OworCXU4ICpvc3RhcnQ7CisJdTY0IG9sZW47Cit9OworCisjZGVmaW5lIGJlTl90b19jcHUoZCwgcykJCQkJCVwKKwkoKHMpID09IDIgPyBiZTE2X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMTYgKilkKSkgOglcCisJIChzKSA9PSA0ID8gYmUzMl90b19jcHUoZ2V0X3VuYWxpZ25lZCgoX19iZTMyICopZCkpIDoJXAorCSAocykgPT0gOCA/IGJlNjRfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmU2NCAqKWQpKSA6CVwKKwkgMCkKKworc3RhdGljIGludCBuZXh0X2JpdHMoc3RydWN0IHN3ODQyX3BhcmFtICpwLCB1NjQgKmQsIHU4IG4pOworCitzdGF0aWMgaW50IF9fc3BsaXRfbmV4dF9iaXRzKHN0cnVjdCBzdzg0Ml9wYXJhbSAqcCwgdTY0ICpkLCB1OCBuLCB1OCBzKQoreworCXU2NCB0bXAgPSAwOworCWludCByZXQ7CisKKwlpZiAobiA8PSBzKSB7CisJCXByX2RlYnVnKCJzcGxpdF9uZXh0X2JpdHMgaW52YWxpZCBuICV1IHMgJXVcbiIsIG4sIHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBuZXh0X2JpdHMocCwgJnRtcCwgbiAtIHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0ID0gbmV4dF9iaXRzKHAsIGQsIHMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJKmQgfD0gdG1wIDw8IHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmV4dF9iaXRzKHN0cnVjdCBzdzg0Ml9wYXJhbSAqcCwgdTY0ICpkLCB1OCBuKQoreworCXU4ICppbiA9IHAtPmluLCBiID0gcC0+Yml0LCBiaXRzID0gYiArIG47CisKKwlpZiAobiA+IDY0KSB7CisJCXByX2RlYnVnKCJuZXh0X2JpdHMgaW52YWxpZCBuICV1XG4iLCBuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogc3BsaXQgdGhpcyB1cCBpZiByZWFkaW5nID4gOCBieXRlcywgb3IgaWYgd2UncmUgYXQgdGhlIGVuZCBvZgorCSAqIHRoZSBpbnB1dCBidWZmZXIgYW5kIHdvdWxkIHJlYWQgcGFzdCB0aGUgZW5kCisJICovCisJaWYgKGJpdHMgPiA2NCkKKwkJcmV0dXJuIF9fc3BsaXRfbmV4dF9iaXRzKHAsIGQsIG4sIDMyKTsKKwllbHNlIGlmIChwLT5pbGVuIDwgOCAmJiBiaXRzID4gMzIgJiYgYml0cyA8PSA1NikKKwkJcmV0dXJuIF9fc3BsaXRfbmV4dF9iaXRzKHAsIGQsIG4sIDE2KTsKKwllbHNlIGlmIChwLT5pbGVuIDwgNCAmJiBiaXRzID4gMTYgJiYgYml0cyA8PSAyNCkKKwkJcmV0dXJuIF9fc3BsaXRfbmV4dF9iaXRzKHAsIGQsIG4sIDgpOworCisJaWYgKERJVl9ST1VORF9VUChiaXRzLCA4KSA+IHAtPmlsZW4pCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJaWYgKGJpdHMgPD0gOCkKKwkJKmQgPSAqaW4gPj4gKDggLSBiaXRzKTsKKwllbHNlIGlmIChiaXRzIDw9IDE2KQorCQkqZCA9IGJlMTZfdG9fY3B1KGdldF91bmFsaWduZWQoKF9fYmUxNiAqKWluKSkgPj4gKDE2IC0gYml0cyk7CisJZWxzZSBpZiAoYml0cyA8PSAzMikKKwkJKmQgPSBiZTMyX3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlMzIgKilpbikpID4+ICgzMiAtIGJpdHMpOworCWVsc2UKKwkJKmQgPSBiZTY0X3RvX2NwdShnZXRfdW5hbGlnbmVkKChfX2JlNjQgKilpbikpID4+ICg2NCAtIGJpdHMpOworCisJKmQgJj0gR0VOTUFTS19VTEwobiAtIDEsIDApOworCisJcC0+Yml0ICs9IG47CisKKwlpZiAocC0+Yml0ID4gNykgeworCQlwLT5pbiArPSBwLT5iaXQgLyA4OworCQlwLT5pbGVuIC09IHAtPmJpdCAvIDg7CisJCXAtPmJpdCAlPSA4OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2RhdGEoc3RydWN0IHN3ODQyX3BhcmFtICpwLCB1OCBuKQoreworCXU2NCB2OworCWludCByZXQ7CisKKwlpZiAobiA+IHAtPm9sZW4pCisJCXJldHVybiAtRU5PU1BDOworCisJcmV0ID0gbmV4dF9iaXRzKHAsICZ2LCBuICogOCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXN3aXRjaCAobikgeworCWNhc2UgMjoKKwkJcHV0X3VuYWxpZ25lZChjcHVfdG9fYmUxNigodTE2KXYpLCAoX19iZTE2ICopcC0+b3V0KTsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQlwdXRfdW5hbGlnbmVkKGNwdV90b19iZTMyKCh1MzIpdiksIChfX2JlMzIgKilwLT5vdXQpOworCQlicmVhazsKKwljYXNlIDg6CisJCXB1dF91bmFsaWduZWQoY3B1X3RvX2JlNjQoKHU2NCl2KSwgKF9fYmU2NCAqKXAtPm91dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXAtPm91dCArPSBuOworCXAtPm9sZW4gLT0gbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZG9faW5kZXgoc3RydWN0IHN3ODQyX3BhcmFtICpwLCB1OCBzaXplLCB1OCBiaXRzLCB1NjQgZnNpemUpCit7CisJdTY0IGluZGV4LCBvZmZzZXQsIHRvdGFsID0gcm91bmRfZG93bihwLT5vdXQgLSBwLT5vc3RhcnQsIDgpOworCWludCByZXQ7CisKKwlyZXQgPSBuZXh0X2JpdHMocCwgJmluZGV4LCBiaXRzKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJb2Zmc2V0ID0gaW5kZXggKiBzaXplOworCisJLyogYSByaW5nIGJ1ZmZlciBvZiBmc2l6ZSBpcyB1c2VkOyBjb3JyZWN0IHRoZSBvZmZzZXQgKi8KKwlpZiAodG90YWwgPiBmc2l6ZSkgeworCQkvKiB0aGlzIGlzIHdoZXJlIHRoZSBjdXJyZW50IGZpZm8gaXMgKi8KKwkJdTY0IHNlY3Rpb24gPSByb3VuZF9kb3duKHRvdGFsLCBmc2l6ZSk7CisJCS8qIHRoZSBjdXJyZW50IHBvcyBpbiB0aGUgZmlmbyAqLworCQl1NjQgcG9zID0gdG90YWwgLSBzZWN0aW9uOworCisJCS8qIGlmIHRoZSBvZmZzZXQgaXMgcGFzdC9hdCB0aGUgcG9zLCB3ZSBuZWVkIHRvCisJCSAqIGdvIGJhY2sgdG8gdGhlIGxhc3QgZmlmbyBzZWN0aW9uCisJCSAqLworCQlpZiAob2Zmc2V0ID49IHBvcykKKwkJCXNlY3Rpb24gLT0gZnNpemU7CisKKwkJb2Zmc2V0ICs9IHNlY3Rpb247CisJfQorCisJaWYgKG9mZnNldCArIHNpemUgPiB0b3RhbCkgeworCQlwcl9kZWJ1ZygiaW5kZXgleCAlbHggcG9pbnRzIHBhc3QgZW5kICVseFxuIiwgc2l6ZSwKKwkJCSAodW5zaWduZWQgbG9uZylvZmZzZXQsICh1bnNpZ25lZCBsb25nKXRvdGFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHNpemUgIT0gMiAmJiBzaXplICE9IDQgJiYgc2l6ZSAhPSA4KQorCQlXQVJOKDEsICJfX2RvX2luZGV4IGludmFsaWQgc2l6ZSAleFxuIiwgc2l6ZSk7CisJZWxzZQorCQlwcl9kZWJ1ZygiaW5kZXgleCB0byAlbHggb2ZmICVseCBhZGpvZmYgJWx4IHRvdCAlbHggZGF0YSAlbHhcbiIsCisJCQkgc2l6ZSwgKHVuc2lnbmVkIGxvbmcpaW5kZXgsCisJCQkgKHVuc2lnbmVkIGxvbmcpKGluZGV4ICogc2l6ZSksICh1bnNpZ25lZCBsb25nKW9mZnNldCwKKwkJCSAodW5zaWduZWQgbG9uZyl0b3RhbCwKKwkJCSAodW5zaWduZWQgbG9uZyliZU5fdG9fY3B1KCZwLT5vc3RhcnRbb2Zmc2V0XSwgc2l6ZSkpOworCisJbWVtY3B5KHAtPm91dCwgJnAtPm9zdGFydFtvZmZzZXRdLCBzaXplKTsKKwlwLT5vdXQgKz0gc2l6ZTsKKwlwLT5vbGVuIC09IHNpemU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkb19pbmRleChzdHJ1Y3Qgc3c4NDJfcGFyYW0gKnAsIHU4IG4pCit7CisJc3dpdGNoIChuKSB7CisJY2FzZSAyOgorCQlyZXR1cm4gX19kb19pbmRleChwLCAyLCBJMl9CSVRTLCBJMl9GSUZPX1NJWkUpOworCWNhc2UgNDoKKwkJcmV0dXJuIF9fZG9faW5kZXgocCwgNCwgSTRfQklUUywgSTRfRklGT19TSVpFKTsKKwljYXNlIDg6CisJCXJldHVybiBfX2RvX2luZGV4KHAsIDgsIEk4X0JJVFMsIEk4X0ZJRk9fU0laRSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IGRvX29wKHN0cnVjdCBzdzg0Ml9wYXJhbSAqcCwgdTggbykKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKworCWlmIChvID49IE9QU19NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl1OCBvcCA9IGRlY29tcF9vcHNbb11baV07CisKKwkJcHJfZGVidWcoIm9wIGlzICV4XG4iLCBvcCk7CisKKwkJc3dpdGNoIChvcCAmIE9QX0FDVElPTikgeworCQljYXNlIE9QX0FDVElPTl9EQVRBOgorCQkJcmV0ID0gZG9fZGF0YShwLCBvcCAmIE9QX0FNT1VOVCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9BQ1RJT05fSU5ERVg6CisJCQlyZXQgPSBkb19pbmRleChwLCBvcCAmIE9QX0FNT1VOVCk7CisJCQlicmVhazsKKwkJY2FzZSBPUF9BQ1RJT05fTk9PUDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCJJbnRlcm5hbCBlcnJvciwgaW52YWxpZCBvcCAleFxuIiwgb3ApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoc3c4NDJfdGVtcGxhdGVfY291bnRzKQorCQlhdG9taWNfaW5jKCZ0ZW1wbGF0ZV9jb3VudFtvXSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzdzg0Ml9kZWNvbXByZXNzCisgKgorICogRGVjb21wcmVzcyB0aGUgODQyLWNvbXByZXNzZWQgYnVmZmVyIG9mIGxlbmd0aCBAaWxlbiBhdCBAaW4KKyAqIHRvIHRoZSBvdXRwdXQgYnVmZmVyIEBvdXQsIHVzaW5nIG5vIG1vcmUgdGhhbiBAb2xlbiBieXRlcy4KKyAqCisgKiBUaGUgY29tcHJlc3NlZCBidWZmZXIgbXVzdCBiZSBvbmx5IGEgc2luZ2xlIDg0Mi1jb21wcmVzc2VkIGJ1ZmZlciwKKyAqIHdpdGggdGhlIHN0YW5kYXJkIGZvcm1hdCBkZXNjcmliZWQgaW4gdGhlIGNvbW1lbnRzIGluIDg0Mi5oCisgKiBQcm9jZXNzaW5nIHdpbGwgc3RvcCB3aGVuIHRoZSA4NDIgIkVORCIgdGVtcGxhdGUgaXMgZGV0ZWN0ZWQsCisgKiBub3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZS4gIFRoZSBAb2xlbiBwYXJhbWV0ZXIKKyAqIHdpbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIG91dHB1dCBieXRlcyB3cml0dGVuIG9uIHN1Y2Nlc3MsIG9yCisgKiAwIG9uIGVycm9yLgorICovCitpbnQgc3c4NDJfZGVjb21wcmVzcyhjb25zdCB1OCAqaW4sIHVuc2lnbmVkIGludCBpbGVuLAorCQkgICAgIHU4ICpvdXQsIHVuc2lnbmVkIGludCAqb2xlbikKK3sKKwlzdHJ1Y3Qgc3c4NDJfcGFyYW0gcDsKKwlpbnQgcmV0OworCXU2NCBvcCwgcmVwLCB0bXAsIGJ5dGVzLCB0b3RhbDsKKwl1NjQgY3JjOworCisJcC5pbiA9ICh1OCAqKWluOworCXAuYml0ID0gMDsKKwlwLmlsZW4gPSBpbGVuOworCXAub3V0ID0gb3V0OworCXAub3N0YXJ0ID0gb3V0OworCXAub2xlbiA9ICpvbGVuOworCisJdG90YWwgPSBwLm9sZW47CisKKwkqb2xlbiA9IDA7CisKKwlkbyB7CisJCXJldCA9IG5leHRfYml0cygmcCwgJm9wLCBPUF9CSVRTKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcHJfZGVidWcoInRlbXBsYXRlIGlzICVseFxuIiwgKHVuc2lnbmVkIGxvbmcpb3ApOworCisJCXN3aXRjaCAob3ApIHsKKwkJY2FzZSBPUF9SRVBFQVQ6CisJCQlyZXQgPSBuZXh0X2JpdHMoJnAsICZyZXAsIFJFUEVBVF9CSVRTKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJaWYgKHAub3V0ID09IG91dCkgLyogbm8gcHJldmlvdXMgYnl0ZXMgKi8KKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogY29weSByZXAgKyAxICovCisJCQlyZXArKzsKKworCQkJaWYgKHJlcCAqIDggPiBwLm9sZW4pCisJCQkJcmV0dXJuIC1FTk9TUEM7CisKKwkJCXdoaWxlIChyZXAtLSA+IDApIHsKKwkJCQltZW1jcHkocC5vdXQsIHAub3V0IC0gOCwgOCk7CisJCQkJcC5vdXQgKz0gODsKKwkJCQlwLm9sZW4gLT0gODsKKwkJCX0KKworCQkJaWYgKHN3ODQyX3RlbXBsYXRlX2NvdW50cykKKwkJCQlhdG9taWNfaW5jKCZ0ZW1wbGF0ZV9yZXBlYXRfY291bnQpOworCisJCQlicmVhazsKKwkJY2FzZSBPUF9aRVJPUzoKKwkJCWlmICg4ID4gcC5vbGVuKQorCQkJCXJldHVybiAtRU5PU1BDOworCisJCQltZW1zZXQocC5vdXQsIDAsIDgpOworCQkJcC5vdXQgKz0gODsKKwkJCXAub2xlbiAtPSA4OworCisJCQlpZiAoc3c4NDJfdGVtcGxhdGVfY291bnRzKQorCQkJCWF0b21pY19pbmMoJnRlbXBsYXRlX3plcm9zX2NvdW50KTsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfU0hPUlRfREFUQToKKwkJCXJldCA9IG5leHRfYml0cygmcCwgJmJ5dGVzLCBTSE9SVF9EQVRBX0JJVFMpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlpZiAoIWJ5dGVzIHx8IGJ5dGVzID4gU0hPUlRfREFUQV9CSVRTX01BWCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJd2hpbGUgKGJ5dGVzLS0gPiAwKSB7CisJCQkJcmV0ID0gbmV4dF9iaXRzKCZwLCAmdG1wLCA4KTsKKwkJCQlpZiAocmV0KQorCQkJCQlyZXR1cm4gcmV0OworCQkJCSpwLm91dCA9ICh1OCl0bXA7CisJCQkJcC5vdXQrKzsKKwkJCQlwLm9sZW4tLTsKKwkJCX0KKworCQkJaWYgKHN3ODQyX3RlbXBsYXRlX2NvdW50cykKKwkJCQlhdG9taWNfaW5jKCZ0ZW1wbGF0ZV9zaG9ydF9kYXRhX2NvdW50KTsKKworCQkJYnJlYWs7CisJCWNhc2UgT1BfRU5EOgorCQkJaWYgKHN3ODQyX3RlbXBsYXRlX2NvdW50cykKKwkJCQlhdG9taWNfaW5jKCZ0ZW1wbGF0ZV9lbmRfY291bnQpOworCisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogdXNlIHRlbXBsYXRlICovCisJCQlyZXQgPSBkb19vcCgmcCwgb3ApOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChvcCAhPSBPUF9FTkQpOworCisJLyoKKwkgKiBjcmMoMDozMSkgaXMgc2F2ZWQgaW4gY29tcHJlc3NlZCBkYXRhIHN0YXJ0aW5nIHdpdGggdGhlCisJICogbmV4dCBiaXQgYWZ0ZXIgRW5kIG9mIHN0cmVhbSB0ZW1wbGF0ZS4KKwkgKi8KKwlyZXQgPSBuZXh0X2JpdHMoJnAsICZjcmMsIENSQ19CSVRTKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBWYWxpZGF0ZSBDUkMgc2F2ZWQgaW4gY29tcHJlc3NlZCBkYXRhLgorCSAqLworCWlmIChjcmMgIT0gKHU2NCljcmMzMl9iZSgwLCBvdXQsIHRvdGFsIC0gcC5vbGVuKSkgeworCQlwcl9kZWJ1ZygiQ1JDIG1pc21hdGNoIGZvciBkZWNvbXByZXNzaW9uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHVubGlrZWx5KCh0b3RhbCAtIHAub2xlbikgPiBVSU5UX01BWCkpCisJCXJldHVybiAtRU5PU1BDOworCisJKm9sZW4gPSB0b3RhbCAtIHAub2xlbjsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3c4NDJfZGVjb21wcmVzcyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHN3ODQyX2luaXQodm9pZCkKK3sKKwlpZiAoc3c4NDJfdGVtcGxhdGVfY291bnRzKQorCQlzdzg0Ml9kZWJ1Z2ZzX2NyZWF0ZSgpOworCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChzdzg0Ml9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHN3ODQyX2V4aXQodm9pZCkKK3sKKwlpZiAoc3c4NDJfdGVtcGxhdGVfY291bnRzKQorCQlzdzg0Ml9kZWJ1Z2ZzX3JlbW92ZSgpOworfQorbW9kdWxlX2V4aXQoc3c4NDJfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU29mdHdhcmUgODQyIERlY29tcHJlc3NvciIpOworTU9EVUxFX0FVVEhPUigiRGFuIFN0cmVldG1hbiA8ZGRzdHJlZXRAaWVlZS5vcmc+Iik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi84NDIvTWFrZWZpbGUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi84NDIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQyNGMwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliLzg0Mi9NYWtlZmlsZQpAQCAtMCwwICsxLDIgQEAKK29iai0kKENPTkZJR184NDJfQ09NUFJFU1MpICs9IDg0Ml9jb21wcmVzcy5vCitvYmotJChDT05GSUdfODQyX0RFQ09NUFJFU1MpICs9IDg0Ml9kZWNvbXByZXNzLm8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL0tjb25maWcgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTZjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9LY29uZmlnCkBAIC0wLDAgKzEsNTkzIEBACisjCisjIExpYnJhcnkgY29uZmlndXJhdGlvbgorIworCitjb25maWcgQklOQVJZX1BSSU5URgorCWRlZl9ib29sIG4KKworbWVudSAiTGlicmFyeSByb3V0aW5lcyIKKworY29uZmlnIFJBSUQ2X1BRCisJdHJpc3RhdGUKKworY29uZmlnIEJJVFJFVkVSU0UKKwl0cmlzdGF0ZQorCitjb25maWcgSEFWRV9BUkNIX0JJVFJFVkVSU0UKKwlib29sCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBCSVRSRVZFUlNFCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgdXNlIG9mIGhhcmR3YXJlIGJpdC1yZXZlcnNhbCBpbnN0cnVjdGlvbnMgb24KKwkgIGFyY2hpdGVjdHVyZXMgd2hpY2ggc3VwcG9ydCBzdWNoIG9wZXJhdGlvbnMuCisKK2NvbmZpZyBSQVRJT05BTAorCWJvb2wKKworY29uZmlnIEdFTkVSSUNfU1RSTkNQWV9GUk9NX1VTRVIKKwlib29sCisKK2NvbmZpZyBHRU5FUklDX1NUUk5MRU5fVVNFUgorCWJvb2wKKworY29uZmlnIEdFTkVSSUNfTkVUX1VUSUxTCisJYm9vbAorCitjb25maWcgR0VORVJJQ19GSU5EX0ZJUlNUX0JJVAorCWJvb2wKKworY29uZmlnIE5PX0dFTkVSSUNfUENJX0lPUE9SVF9NQVAKKwlib29sCisKK2NvbmZpZyBHRU5FUklDX1BDSV9JT01BUAorCWJvb2wKKworY29uZmlnIEdFTkVSSUNfSU9NQVAKKwlib29sCisJc2VsZWN0IEdFTkVSSUNfUENJX0lPTUFQCisKK2NvbmZpZyBHRU5FUklDX0lPCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgU1RNUF9ERVZJQ0UKKwlib29sCisKK2NvbmZpZyBBUkNIX1VTRV9DTVBYQ0hHX0xPQ0tSRUYKKwlib29sCisKK2NvbmZpZyBBUkNIX0hBU19GQVNUX01VTFRJUExJRVIKKwlib29sCisKK2NvbmZpZyBDUkNfQ0NJVFQKKwl0cmlzdGF0ZSAiQ1JDLUNDSVRUIGZ1bmN0aW9ucyIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gaW4ta2VybmVsLXRyZWUKKwkgIG1vZHVsZXMgcmVxdWlyZSBDUkMtQ0NJVFQgZnVuY3Rpb25zLCBidXQgYSBtb2R1bGUgYnVpbHQgb3V0c2lkZQorCSAgdGhlIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQy1DQ0lUVAorCSAgZnVuY3Rpb25zIHJlcXVpcmUgTSBoZXJlLgorCitjb25maWcgQ1JDMTYKKwl0cmlzdGF0ZSAiQ1JDMTYgZnVuY3Rpb25zIgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGlzIHByb3ZpZGVkIGZvciB0aGUgY2FzZSB3aGVyZSBubyBpbi1rZXJuZWwtdHJlZQorCSAgbW9kdWxlcyByZXF1aXJlIENSQzE2IGZ1bmN0aW9ucywgYnV0IGEgbW9kdWxlIGJ1aWx0IG91dHNpZGUKKwkgIHRoZSBrZXJuZWwgdHJlZSBkb2VzLiBTdWNoIG1vZHVsZXMgdGhhdCB1c2UgbGlicmFyeSBDUkMxNgorCSAgZnVuY3Rpb25zIHJlcXVpcmUgTSBoZXJlLgorCitjb25maWcgQ1JDX1QxMERJRgorCXRyaXN0YXRlICJDUkMgY2FsY3VsYXRpb24gZm9yIHRoZSBUMTAgRGF0YSBJbnRlZ3JpdHkgRmllbGQiCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fQ1JDVDEwRElGCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgb25seSBuZWVkZWQgaWYgYSBtb2R1bGUgdGhhdCdzIG5vdCBpbiB0aGUKKwkgIGtlcm5lbCB0cmVlIG5lZWRzIHRvIGNhbGN1bGF0ZSBDUkMgY2hlY2tzIGZvciB1c2Ugd2l0aCB0aGUKKwkgIFNDU0kgZGF0YSBpbnRlZ3JpdHkgc3Vic3lzdGVtLgorCitjb25maWcgQ1JDX0lUVV9UCisJdHJpc3RhdGUgIkNSQyBJVFUtVCBWLjQxIGZ1bmN0aW9ucyIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gaW4ta2VybmVsLXRyZWUKKwkgIG1vZHVsZXMgcmVxdWlyZSBDUkMgSVRVLVQgVi40MSBmdW5jdGlvbnMsIGJ1dCBhIG1vZHVsZSBidWlsdCBvdXRzaWRlCisJICB0aGUga2VybmVsIHRyZWUgZG9lcy4gU3VjaCBtb2R1bGVzIHRoYXQgdXNlIGxpYnJhcnkgQ1JDIElUVS1UIFYuNDEKKwkgIGZ1bmN0aW9ucyByZXF1aXJlIE0gaGVyZS4KKworY29uZmlnIENSQzMyCisJdHJpc3RhdGUgIkNSQzMyL0NSQzMyYyBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJc2VsZWN0IEJJVFJFVkVSU0UKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gaW4ta2VybmVsLXRyZWUKKwkgIG1vZHVsZXMgcmVxdWlyZSBDUkMzMi9DUkMzMmMgZnVuY3Rpb25zLCBidXQgYSBtb2R1bGUgYnVpbHQgb3V0c2lkZQorCSAgdGhlIGtlcm5lbCB0cmVlIGRvZXMuIFN1Y2ggbW9kdWxlcyB0aGF0IHVzZSBsaWJyYXJ5IENSQzMyL0NSQzMyYworCSAgZnVuY3Rpb25zIHJlcXVpcmUgTSBoZXJlLgorCitjb25maWcgQ1JDMzJfU0VMRlRFU1QKKwl0cmlzdGF0ZSAiQ1JDMzIgcGVyZm9ybSBzZWxmIHRlc3Qgb24gaW5pdCIKKwlkZXBlbmRzIG9uIENSQzMyCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgQ1JDMzIgbGlicmFyeSBmdW5jdGlvbnMgdG8gcGVyZm9ybSBhCisJICBzZWxmIHRlc3Qgb24gaW5pdGlhbGl6YXRpb24uIFRoZSBzZWxmIHRlc3QgY29tcHV0ZXMgY3JjMzJfbGUKKwkgIGFuZCBjcmMzMl9iZSBvdmVyIGJ5dGUgc3RyaW5ncyB3aXRoIHJhbmRvbSBhbGlnbm1lbnQgYW5kIGxlbmd0aAorCSAgYW5kIGNvbXB1dGVzIHRoZSB0b3RhbCBlbGFwc2VkIHRpbWUgYW5kIG51bWJlciBvZiBieXRlcyBwcm9jZXNzZWQuCisKK2Nob2ljZQorCXByb21wdCAiQ1JDMzIgaW1wbGVtZW50YXRpb24iCisJZGVwZW5kcyBvbiBDUkMzMgorCWRlZmF1bHQgQ1JDMzJfU0xJQ0VCWTgKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgYSBrZXJuZWwgYnVpbGRlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBjaG9pY2UKKwkgIG9mIENSQzMyIGFsZ29yaXRobS4gIENob29zZSB0aGUgZGVmYXVsdCAoInNsaWNlIGJ5IDgiKSB1bmxlc3MgeW91CisJICBrbm93IHRoYXQgeW91IG5lZWQgb25lIG9mIHRoZSBvdGhlcnMuCisKK2NvbmZpZyBDUkMzMl9TTElDRUJZOAorCWJvb2wgIlNsaWNlIGJ5IDggYnl0ZXMiCisJaGVscAorCSAgQ2FsY3VsYXRlIGNoZWNrc3VtIDggYnl0ZXMgYXQgYSB0aW1lIHdpdGggYSBjbGV2ZXIgc2xpY2luZyBhbGdvcml0aG0uCisJICBUaGlzIGlzIHRoZSBmYXN0ZXN0IGFsZ29yaXRobSwgYnV0IGNvbWVzIHdpdGggYSA4S2lCIGxvb2t1cCB0YWJsZS4KKwkgIE1vc3QgbW9kZXJuIHByb2Nlc3NvcnMgaGF2ZSBlbm91Z2ggY2FjaGUgdG8gaG9sZCB0aGlzIHRhYmxlIHdpdGhvdXQKKwkgIHRocmFzaGluZyB0aGUgY2FjaGUuCisKKwkgIFRoaXMgaXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2hvaWNlLiAgQ2hvb3NlIHRoaXMgb25lIHVubGVzcworCSAgeW91IGhhdmUgYSBnb29kIHJlYXNvbiBub3QgdG8uCisKK2NvbmZpZyBDUkMzMl9TTElDRUJZNAorCWJvb2wgIlNsaWNlIGJ5IDQgYnl0ZXMiCisJaGVscAorCSAgQ2FsY3VsYXRlIGNoZWNrc3VtIDQgYnl0ZXMgYXQgYSB0aW1lIHdpdGggYSBjbGV2ZXIgc2xpY2luZyBhbGdvcml0aG0uCisJICBUaGlzIGlzIGEgYml0IHNsb3dlciB0aGFuIHNsaWNlIGJ5IDgsIGJ1dCBoYXMgYSBzbWFsbGVyIDRLaUIgbG9va3VwCisJICB0YWJsZS4KKworCSAgT25seSBjaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCitjb25maWcgQ1JDMzJfU0FSV0FURQorCWJvb2wgIlNhcndhdGUncyBBbGdvcml0aG0gKG9uZSBieXRlIGF0IGEgdGltZSkiCisJaGVscAorCSAgQ2FsY3VsYXRlIGNoZWNrc3VtIGEgYnl0ZSBhdCBhIHRpbWUgdXNpbmcgU2Fyd2F0ZSdzIGFsZ29yaXRobS4gIFRoaXMKKwkgIGlzIG5vdCBwYXJ0aWN1bGFybHkgZmFzdCwgYnV0IGhhcyBhIHNtYWxsIDI1NiBieXRlIGxvb2t1cCB0YWJsZS4KKworCSAgT25seSBjaG9vc2UgdGhpcyBvcHRpb24gaWYgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgorCitjb25maWcgQ1JDMzJfQklUCisJYm9vbCAiQ2xhc3NpYyBBbGdvcml0aG0gKG9uZSBiaXQgYXQgYSB0aW1lKSIKKwloZWxwCisJICBDYWxjdWxhdGUgY2hlY2tzdW0gb25lIGJpdCBhdCBhIHRpbWUuICBUaGlzIGlzIFZFUlkgc2xvdywgYnV0IGhhcworCSAgbm8gbG9va3VwIHRhYmxlLiAgVGhpcyBpcyBwcm92aWRlZCBhcyBhIGRlYnVnZ2luZyBvcHRpb24uCisKKwkgIE9ubHkgY2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBhcmUgZGVidWdnaW5nIGNyYzMyLgorCitlbmRjaG9pY2UKKworY29uZmlnIENSQzQKKwl0cmlzdGF0ZSAiQ1JDNCBmdW5jdGlvbnMiCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIGluLWtlcm5lbC10cmVlCisJICBtb2R1bGVzIHJlcXVpcmUgQ1JDNCBmdW5jdGlvbnMsIGJ1dCBhIG1vZHVsZSBidWlsdCBvdXRzaWRlCisJICB0aGUga2VybmVsIHRyZWUgZG9lcy4gU3VjaCBtb2R1bGVzIHRoYXQgdXNlIGxpYnJhcnkgQ1JDNAorCSAgZnVuY3Rpb25zIHJlcXVpcmUgTSBoZXJlLgorCitjb25maWcgQ1JDNworCXRyaXN0YXRlICJDUkM3IGZ1bmN0aW9ucyIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBpcyBwcm92aWRlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgbm8gaW4ta2VybmVsLXRyZWUKKwkgIG1vZHVsZXMgcmVxdWlyZSBDUkM3IGZ1bmN0aW9ucywgYnV0IGEgbW9kdWxlIGJ1aWx0IG91dHNpZGUKKwkgIHRoZSBrZXJuZWwgdHJlZSBkb2VzLiBTdWNoIG1vZHVsZXMgdGhhdCB1c2UgbGlicmFyeSBDUkM3CisJICBmdW5jdGlvbnMgcmVxdWlyZSBNIGhlcmUuCisKK2NvbmZpZyBMSUJDUkMzMkMKKwl0cmlzdGF0ZSAiQ1JDMzJjIChDYXN0YWdub2xpLCBldCBhbCkgQ3ljbGljIFJlZHVuZGFuY3ktQ2hlY2siCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fQ1JDMzJDCisJaGVscAorCSAgVGhpcyBvcHRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBjYXNlIHdoZXJlIG5vIGluLWtlcm5lbC10cmVlCisJICBtb2R1bGVzIHJlcXVpcmUgQ1JDMzJjIGZ1bmN0aW9ucywgYnV0IGEgbW9kdWxlIGJ1aWx0IG91dHNpZGUgdGhlCisJICBrZXJuZWwgdHJlZSBkb2VzLiBTdWNoIG1vZHVsZXMgdGhhdCB1c2UgbGlicmFyeSBDUkMzMmMgZnVuY3Rpb25zCisJICByZXF1aXJlIE0gaGVyZS4gIFNlZSBDYXN0YWdub2xpOTMuCisJICBNb2R1bGUgd2lsbCBiZSBsaWJjcmMzMmMuCisKK2NvbmZpZyBDUkM4CisJdHJpc3RhdGUgIkNSQzggZnVuY3Rpb24iCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgQ1JDOCBmdW5jdGlvbi4gRHJpdmVycyBtYXkgc2VsZWN0IHRoaXMKKwkgIHdoZW4gdGhleSBuZWVkIHRvIGRvIGN5Y2xpYyByZWR1bmRhbmN5IGNoZWNrIGFjY29yZGluZyBDUkM4CisJICBhbGdvcml0aG0uIE1vZHVsZSB3aWxsIGJlIGNhbGxlZCBjcmM4LgorCitjb25maWcgWFhIQVNICisJdHJpc3RhdGUKKworY29uZmlnIEFVRElUX0dFTkVSSUMKKwlib29sCisJZGVwZW5kcyBvbiBBVURJVCAmJiAhQVVESVRfQVJDSAorCWRlZmF1bHQgeQorCitjb25maWcgQVVESVRfQVJDSF9DT01QQVRfR0VORVJJQworCWJvb2wKKwlkZWZhdWx0IG4KKworY29uZmlnIEFVRElUX0NPTVBBVF9HRU5FUklDCisJYm9vbAorCWRlcGVuZHMgb24gQVVESVRfR0VORVJJQyAmJiBBVURJVF9BUkNIX0NPTVBBVF9HRU5FUklDICYmIENPTVBBVAorCWRlZmF1bHQgeQorCitjb25maWcgUkFORE9NMzJfU0VMRlRFU1QKKwlib29sICJQUk5HIHBlcmZvcm0gc2VsZiB0ZXN0IG9uIGluaXQiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgMzIgYml0IFBSTkcgbGlicmFyeSBmdW5jdGlvbnMgdG8gcGVyZm9ybSBhCisJICBzZWxmIHRlc3Qgb24gaW5pdGlhbGl6YXRpb24uCisKKyMKKyMgY29tcHJlc3Npb24gc3VwcG9ydCBpcyBzZWxlY3QnZWQgaWYgbmVlZGVkCisjCitjb25maWcgODQyX0NPTVBSRVNTCisJc2VsZWN0IENSQzMyCisJdHJpc3RhdGUKKworY29uZmlnIDg0Ml9ERUNPTVBSRVNTCisJc2VsZWN0IENSQzMyCisJdHJpc3RhdGUKKworY29uZmlnIFpMSUJfSU5GTEFURQorCXRyaXN0YXRlCisKK2NvbmZpZyBaTElCX0RFRkxBVEUKKwl0cmlzdGF0ZQorCXNlbGVjdCBCSVRSRVZFUlNFCisKK2NvbmZpZyBMWk9fQ09NUFJFU1MKKwl0cmlzdGF0ZQorCitjb25maWcgTFpPX0RFQ09NUFJFU1MKKwl0cmlzdGF0ZQorCitjb25maWcgTFo0X0NPTVBSRVNTCisJdHJpc3RhdGUKKworY29uZmlnIExaNEhDX0NPTVBSRVNTCisJdHJpc3RhdGUKKworY29uZmlnIExaNF9ERUNPTVBSRVNTCisJdHJpc3RhdGUKKworY29uZmlnIFpTVERfQ09NUFJFU1MKKwlzZWxlY3QgWFhIQVNICisJdHJpc3RhdGUKKworY29uZmlnIFpTVERfREVDT01QUkVTUworCXNlbGVjdCBYWEhBU0gKKwl0cmlzdGF0ZQorCitzb3VyY2UgImxpYi94ei9LY29uZmlnIgorCisjCisjIFRoZXNlIGFsbCBwcm92aWRlIGEgY29tbW9uIGludGVyZmFjZSAoaGVuY2UgdGhlIGFwcGFyZW50IGR1cGxpY2F0aW9uIHdpdGgKKyMgWkxJQl9JTkZMQVRFOyBERUNPTVBSRVNTX0daSVAgaXMganVzdCBhIHdyYXBwZXIuKQorIworY29uZmlnIERFQ09NUFJFU1NfR1pJUAorCXNlbGVjdCBaTElCX0lORkxBVEUKKwl0cmlzdGF0ZQorCitjb25maWcgREVDT01QUkVTU19CWklQMgorCXRyaXN0YXRlCisKK2NvbmZpZyBERUNPTVBSRVNTX0xaTUEKKwl0cmlzdGF0ZQorCitjb25maWcgREVDT01QUkVTU19YWgorCXNlbGVjdCBYWl9ERUMKKwl0cmlzdGF0ZQorCitjb25maWcgREVDT01QUkVTU19MWk8KKwlzZWxlY3QgTFpPX0RFQ09NUFJFU1MKKwl0cmlzdGF0ZQorCitjb25maWcgREVDT01QUkVTU19MWjQKKwlzZWxlY3QgTFo0X0RFQ09NUFJFU1MKKwl0cmlzdGF0ZQorCisjCisjIEdlbmVyaWMgYWxsb2NhdG9yIHN1cHBvcnQgaXMgc2VsZWN0ZWQgaWYgbmVlZGVkCisjCitjb25maWcgR0VORVJJQ19BTExPQ0FUT1IKKwlib29sCisKKyMKKyMgcmVlZCBzb2xvbW9uIHN1cHBvcnQgaXMgc2VsZWN0J2VkIGlmIG5lZWRlZAorIworY29uZmlnIFJFRURfU09MT01PTgorCXRyaXN0YXRlCisJCitjb25maWcgUkVFRF9TT0xPTU9OX0VOQzgKKwlib29sCisKK2NvbmZpZyBSRUVEX1NPTE9NT05fREVDOAorCWJvb2wKKworY29uZmlnIFJFRURfU09MT01PTl9FTkMxNgorCWJvb2wKKworY29uZmlnIFJFRURfU09MT01PTl9ERUMxNgorCWJvb2wKKworIworIyBCQ0ggc3VwcG9ydCBpcyBzZWxlY3RlZCBpZiBuZWVkZWQKKyMKK2NvbmZpZyBCQ0gKKwl0cmlzdGF0ZQorCitjb25maWcgQkNIX0NPTlNUX1BBUkFNUworCWJvb2wKKwloZWxwCisJICBEcml2ZXJzIG1heSBzZWxlY3QgdGhpcyBvcHRpb24gdG8gZm9yY2Ugc3BlY2lmaWMgY29uc3RhbnQKKwkgIHZhbHVlcyBmb3IgcGFyYW1ldGVycyAnbScgKEdhbG9pcyBmaWVsZCBvcmRlcikgYW5kICd0JworCSAgKGVycm9yIGNvcnJlY3Rpb24gY2FwYWJpbGl0eSkuIFRob3NlIHNwZWNpZmljIHZhbHVlcyBtdXN0CisJICBiZSBzZXQgYnkgZGVjbGFyaW5nIGRlZmF1bHQgdmFsdWVzIGZvciBzeW1ib2xzIEJDSF9DT05TVF9NCisJICBhbmQgQkNIX0NPTlNUX1QuCisJICBEb2luZyBzbyB3aWxsIGVuYWJsZSBleHRyYSBjb21waWxlciBvcHRpbWl6YXRpb25zLAorCSAgaW1wcm92aW5nIGVuY29kaW5nIGFuZCBkZWNvZGluZyBwZXJmb3JtYW5jZSB1cCB0byAyeCBmb3IKKwkgIHVzdWFsIChtLHQpIHZhbHVlcyAodHlwaWNhbGx5IHN1Y2ggdGhhdCBtKnQgPCAyMDApLgorCSAgV2hlbiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCwgdGhlIEJDSCBsaWJyYXJ5IHN1cHBvcnRzCisJICBvbmx5IGEgc2luZ2xlIChtLHQpIGNvbmZpZ3VyYXRpb24uIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bAorCSAgZm9yIE5BTkQgZmxhc2ggYm9hcmQgZHJpdmVycyByZXF1aXJpbmcga25vd24sIGZpeGVkIEJDSAorCSAgcGFyYW1ldGVycy4KKworY29uZmlnIEJDSF9DT05TVF9NCisJaW50CisJcmFuZ2UgNSAxNQorCWhlbHAKKwkgIENvbnN0YW50IHZhbHVlIGZvciBHYWxvaXMgZmllbGQgb3JkZXIgJ20nLiBJZiAnaycgaXMgdGhlCisJICBudW1iZXIgb2YgZGF0YSBiaXRzIHRvIHByb3RlY3QsICdtJyBzaG91bGQgYmUgY2hvc2VuIHN1Y2gKKwkgIHRoYXQgKGsgKyBtKnQpIDw9IDIqKm0gLSAxLgorCSAgRHJpdmVycyBzaG91bGQgZGVjbGFyZSBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgc3ltYm9sIGlmCisJICB0aGV5IHNlbGVjdCBvcHRpb24gQkNIX0NPTlNUX1BBUkFNUy4KKworY29uZmlnIEJDSF9DT05TVF9UCisJaW50CisJaGVscAorCSAgQ29uc3RhbnQgdmFsdWUgZm9yIGVycm9yIGNvcnJlY3Rpb24gY2FwYWJpbGl0eSBpbiBiaXRzICd0Jy4KKwkgIERyaXZlcnMgc2hvdWxkIGRlY2xhcmUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHN5bWJvbCBpZgorCSAgdGhleSBzZWxlY3Qgb3B0aW9uIEJDSF9DT05TVF9QQVJBTVMuCisKKyMKKyMgVGV4dHNlYXJjaCBzdXBwb3J0IGlzIHNlbGVjdCdlZCBpZiBuZWVkZWQKKyMKK2NvbmZpZyBURVhUU0VBUkNICisJYm9vbAorCitjb25maWcgVEVYVFNFQVJDSF9LTVAKKwl0cmlzdGF0ZQorCitjb25maWcgVEVYVFNFQVJDSF9CTQorCXRyaXN0YXRlCisKK2NvbmZpZyBURVhUU0VBUkNIX0ZTTQorCXRyaXN0YXRlCisKK2NvbmZpZyBCVFJFRQorCWJvb2wKKworY29uZmlnIElOVEVSVkFMX1RSRUUKKwlib29sCisJaGVscAorCSAgU2ltcGxlLCBlbWJlZGRhYmxlLCBpbnRlcnZhbC10cmVlLiBDYW4gZmluZCB0aGUgc3RhcnQgb2YgYW4KKwkgIG92ZXJsYXBwaW5nIHJhbmdlIGluIGxvZyhuKSB0aW1lIGFuZCB0aGVuIGl0ZXJhdGUgb3ZlciBhbGwKKwkgIG92ZXJsYXBwaW5nIG5vZGVzLiBUaGUgYWxnb3JpdGhtIGlzIGltcGxlbWVudGVkIGFzIGFuCisJICBhdWdtZW50ZWQgcmJ0cmVlLgorCisJICBTZWU6CisKKwkJRG9jdW1lbnRhdGlvbi9yYnRyZWUudHh0CisKKwkgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgUkFESVhfVFJFRV9NVUxUSU9SREVSCisJYm9vbAorCitjb25maWcgQVNTT0NJQVRJVkVfQVJSQVkKKwlib29sCisJaGVscAorCSAgR2VuZXJpYyBhc3NvY2lhdGl2ZSBhcnJheS4gIENhbiBiZSBzZWFyY2hlZCBhbmQgaXRlcmF0ZWQgb3ZlciB3aGlsc3QKKwkgIGl0IGlzIGJlaW5nIG1vZGlmaWVkLiAgSXQgaXMgYWxzbyByZWFzb25hYmx5IHF1aWNrIHRvIHNlYXJjaCBhbmQKKwkgIG1vZGlmeS4gIFRoZSBhbGdvcml0aG1zIGFyZSBub24tcmVjdXJzaXZlLCBhbmQgdGhlIHRyZWVzIGFyZSBoaWdobHkKKwkgIGNhcGFjaW91cy4KKworCSAgU2VlOgorCisJCURvY3VtZW50YXRpb24vYXNzb2NfYXJyYXkudHh0CisKKwkgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgSEFTX0lPTUVNCisJYm9vbAorCWRlcGVuZHMgb24gIU5PX0lPTUVNCisJc2VsZWN0IEdFTkVSSUNfSU8KKwlkZWZhdWx0IHkKKworY29uZmlnIEhBU19JT1BPUlRfTUFQCisJYm9vbAorCWRlcGVuZHMgb24gSEFTX0lPTUVNICYmICFOT19JT1BPUlRfTUFQCisJZGVmYXVsdCB5CisKK2NvbmZpZyBIQVNfRE1BCisJYm9vbAorCWRlcGVuZHMgb24gIU5PX0RNQQorCWRlZmF1bHQgeQorCitjb25maWcgU0dMX0FMTE9DCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgRE1BX05PT1BfT1BTCisJYm9vbAorCWRlcGVuZHMgb24gSEFTX0RNQSAmJiAoITY0QklUIHx8IEFSQ0hfRE1BX0FERFJfVF82NEJJVCkKKwlkZWZhdWx0IG4KKworY29uZmlnIERNQV9WSVJUX09QUworCWJvb2wKKwlkZXBlbmRzIG9uIEhBU19ETUEgJiYgKCE2NEJJVCB8fCBBUkNIX0RNQV9BRERSX1RfNjRCSVQpCisJZGVmYXVsdCBuCisKK2NvbmZpZyBDSEVDS19TSUdOQVRVUkUKKwlib29sCisKK2NvbmZpZyBDUFVNQVNLX09GRlNUQUNLCisJYm9vbCAiRm9yY2UgQ1BVIG1hc2tzIG9mZiBzdGFjayIgaWYgREVCVUdfUEVSX0NQVV9NQVBTCisJaGVscAorCSAgVXNlIGR5bmFtaWMgYWxsb2NhdGlvbiBmb3IgY3B1bWFza192YXJfdCwgaW5zdGVhZCBvZiBwdXR0aW5nCisJICB0aGVtIG9uIHRoZSBzdGFjay4gIFRoaXMgaXMgYSBiaXQgbW9yZSBleHBlbnNpdmUsIGJ1dCBhdm9pZHMKKwkgIHN0YWNrIG92ZXJmbG93LgorCitjb25maWcgQ1BVX1JNQVAKKwlib29sCisJZGVwZW5kcyBvbiBTTVAKKworY29uZmlnIERRTAorCWJvb2wKKworY29uZmlnIEdMT0IKKwlib29sCisjCVRoaXMgYWN0dWFsbHkgc3VwcG9ydHMgbW9kdWxhciBjb21waWxhdGlvbiwgYnV0IHRoZSBtb2R1bGUgb3ZlcmhlYWQKKyMJaXMgcmlkaWN1bG91cyBmb3IgdGhlIGFtb3VudCBvZiBjb2RlIGludm9sdmVkLglVbnRpbCBhbiBvdXQtb2YtdHJlZQorIwlkcml2ZXIgYXNrcyBmb3IgaXQsIHdlJ2xsIGp1c3QgbGluayBpdCBkaXJlY3RseSBpdCBpbnRvIHRoZSBrZXJuZWwKKyMJd2hlbiByZXF1aXJlZC4gIFNpbmNlIHdlJ3JlIGlnbm9yaW5nIG91dC1vZi10cmVlIHVzZXJzLAl0aGVyZSdzIGFsc28KKyMJbm8gbmVlZCBib3RoZXIgcHJvbXB0aW5nIGZvciBhIG1hbnVhbCBkZWNpc2lvbjoKKyMJcHJvbXB0ICJnbG9iX21hdGNoKCkgZnVuY3Rpb24iCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgYSBnbG9iX21hdGNoIGZ1bmN0aW9uIGZvciBwZXJmb3JtaW5nCisJICBzaW1wbGUgdGV4dCBwYXR0ZXJuIG1hdGNoaW5nLiAgSXQgb3JpZ2luYXRlZCBpbiB0aGUgQVRBIGNvZGUKKwkgIHRvIGJsYWNrbGlzdCBwYXJ0aWN1bGFyIGRyaXZlIG1vZGVscywgYnV0IG90aGVyIGRldmljZSBkcml2ZXJzCisJICBtYXkgbmVlZCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCisKKwkgIEFsbCBkcml2ZXJzIGluIHRoZSBMaW51eCBrZXJuZWwgdHJlZSB0aGF0IHJlcXVpcmUgdGhpcyBmdW5jdGlvbgorCSAgc2hvdWxkIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoaXMgb3B0aW9uLiAgU2F5IE4gdW5sZXNzIHlvdQorCSAgYXJlIGNvbXBpbGluZyBhbiBvdXQtb2YgdHJlZSBkcml2ZXIgd2hpY2ggdGVsbHMgeW91IHRoYXQgaXQKKwkgIGRlcGVuZHMgb24gdGhpcy4KKworY29uZmlnIEdMT0JfU0VMRlRFU1QKKwl0cmlzdGF0ZSAiZ2xvYiBzZWxmLXRlc3Qgb24gaW5pdCIKKwlkZXBlbmRzIG9uIEdMT0IKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgc2ltcGxlIHNlbGYtdGVzdCBvZiB0aGUgZ2xvYl9tYXRjaAorCSAgZnVuY3Rpb24gb24gc3RhcnR1cC4JSXQgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgcGVvcGxlCisJICB3b3JraW5nIG9uIHRoZSBjb2RlIHRvIGVuc3VyZSB0aGV5IGhhdmVuJ3QgaW50cm9kdWNlZCBhbnkKKwkgIHJlZ3Jlc3Npb25zLgorCisJICBJdCBvbmx5IGFkZHMgYSBsaXR0bGUgYml0IG9mIGNvZGUgYW5kIHNsb3dzIGtlcm5lbCBib290IChvcgorCSAgbW9kdWxlIGxvYWQpIGJ5IGEgc21hbGwgYW1vdW50LCBzbyB5b3UncmUgd2VsY29tZSB0byBwbGF5IHdpdGgKKwkgIGl0LCBidXQgeW91IHByb2JhYmx5IGRvbid0IG5lZWQgaXQuCisKKyMKKyMgTmV0bGluayBhdHRyaWJ1dGUgcGFyc2luZyBzdXBwb3J0IGlzIHNlbGVjdCdlZCBpZiBuZWVkZWQKKyMKK2NvbmZpZyBOTEFUVFIKKwlib29sCisKKyMKKyMgR2VuZXJpYyA2NC1iaXQgYXRvbWljIHN1cHBvcnQgaXMgc2VsZWN0ZWQgaWYgbmVlZGVkCisjCitjb25maWcgR0VORVJJQ19BVE9NSUM2NAorICAgICAgIGJvb2wKKworY29uZmlnIExSVV9DQUNIRQorCXRyaXN0YXRlCisKK2NvbmZpZyBDTFpfVEFCCisJYm9vbAorCitjb25maWcgQ09SRElDCisJdHJpc3RhdGUgIkNPUkRJQyBhbGdvcml0aG0iCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIENPUkRJQyBhbGdvcml0aG07CisJICBjYWxjdWxhdGlvbnMgYXJlIGluIGZpeGVkIHBvaW50LiBNb2R1bGUgd2lsbCBiZSBjYWxsZWQgY29yZGljLgorCitjb25maWcgRERSCisJYm9vbCAiSkVERUMgRERSIGRhdGEiCisJaGVscAorCSAgRGF0YSBmcm9tIEpFREVDIHNwZWNzIGZvciBERFIgU0RSQU0gbWVtb3JpZXMsCisJICBwYXJ0aWN1bGFybHkgdGhlIEFDIHRpbWluZyBwYXJhbWV0ZXJzIGFuZCBhZGRyZXNzaW5nCisJICBpbmZvcm1hdGlvbi4gVGhpcyBkYXRhIGlzIHVzZWZ1bCBmb3IgZHJpdmVycyBoYW5kbGluZworCSAgRERSIFNEUkFNIGNvbnRyb2xsZXJzLgorCitjb25maWcgSVJRX1BPTEwKKwlib29sICJJUlEgcG9sbGluZyBsaWJyYXJ5IgorCWhlbHAKKwkgIEhlbHBlciBsaWJyYXJ5IHRvIHBvbGwgaW50ZXJydXB0IG1pdGlnYXRpb24gdXNpbmcgcG9sbGluZy4KKworY29uZmlnIE1QSUxJQgorCXRyaXN0YXRlCisJc2VsZWN0IENMWl9UQUIKKwloZWxwCisJICBNdWx0aXByZWNpc2lvbiBtYXRocyBsaWJyYXJ5IGZyb20gR251UEcuCisJICBJdCBpcyB1c2VkIHRvIGltcGxlbWVudCBSU0EgZGlnaXRhbCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLAorCSAgd2hpY2ggaXMgdXNlZCBieSBJTUEvRVZNIGRpZ2l0YWwgc2lnbmF0dXJlIGV4dGVuc2lvbi4KKworY29uZmlnIFNJR05BVFVSRQorCXRyaXN0YXRlCisJZGVwZW5kcyBvbiBLRVlTCisJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fU0hBMQorCXNlbGVjdCBNUElMSUIKKwloZWxwCisJICBEaWdpdGFsIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uIEN1cnJlbnRseSBvbmx5IFJTQSBpcyBzdXBwb3J0ZWQuCisJICBJbXBsZW1lbnRhdGlvbiBpcyBkb25lIHVzaW5nIEdudVBHIE1QSSBsaWJyYXJ5CisKKyMKKyMgbGliZmR0IGZpbGVzLCBvbmx5IHNlbGVjdGVkIGlmIG5lZWRlZC4KKyMKK2NvbmZpZyBMSUJGRFQKKwlib29sCisKK2NvbmZpZyBPSURfUkVHSVNUUlkKKwl0cmlzdGF0ZQorCWhlbHAKKwkgIEVuYWJsZSBmYXN0IGxvb2t1cCBvYmplY3QgaWRlbnRpZmllciByZWdpc3RyeS4KKworY29uZmlnIFVDUzJfU1RSSU5HCisgICAgICAgIHRyaXN0YXRlCisKK3NvdXJjZSAibGliL2ZvbnRzL0tjb25maWciCisKK2NvbmZpZyBTR19TUExJVAorCWRlZl9ib29sIG4KKwloZWxwCisJIFByb3ZpZGVzIGEgaGVscGVyIHRvIHNwbGl0IHNjYXR0ZXJsaXN0cyBpbnRvIGNodW5rcywgZWFjaCBjaHVuayBiZWluZworCSBhIHNjYXR0ZXJsaXN0LiBUaGlzIHNob3VsZCBiZSBzZWxlY3RlZCBieSBhIGRyaXZlciBvciBhbiBBUEkgd2hpY2gKKwkgd2hpc2hlcyB0byBzcGxpdCBhIHNjYXR0ZXJsaXN0IGFtb25nc3QgbXVsdGlwbGUgRE1BIGNoYW5uZWxzLgorCitjb25maWcgU0dfUE9PTAorCWRlZl9ib29sIG4KKwloZWxwCisJIFByb3ZpZGVzIGEgaGVscGVyIHRvIGFsbG9jYXRlIGNoYWluZWQgc2NhdHRlcmxpc3RzLiBUaGlzIHNob3VsZCBiZQorCSBzZWxlY3RlZCBieSBhIGRyaXZlciBvciBhbiBBUEkgd2hpY2ggd2hpc2hlcyB0byBhbGxvY2F0ZSBjaGFpbmVkCisJIHNjYXR0ZXJsaXN0LgorCisjCisjIHNnIGNoYWluaW5nIG9wdGlvbgorIworCitjb25maWcgQVJDSF9IQVNfU0dfQ0hBSU4KKwlkZWZfYm9vbCBuCisKK2NvbmZpZyBBUkNIX0hBU19QTUVNX0FQSQorCWJvb2wKKworY29uZmlnIEFSQ0hfSEFTX1VBQ0NFU1NfRkxVU0hDQUNIRQorCWJvb2wKKworY29uZmlnIFNUQUNLREVQT1QKKwlib29sCisJc2VsZWN0IFNUQUNLVFJBQ0UKKworY29uZmlnIFNCSVRNQVAKKwlib29sCisKK2NvbmZpZyBQQVJNQU4KKwl0cmlzdGF0ZSAicGFybWFuIiBpZiBDT01QSUxFX1RFU1QKKworY29uZmlnIFBSSU1FX05VTUJFUlMKKwl0cmlzdGF0ZQorCitjb25maWcgU1RSSU5HX1NFTEZURVNUCisJYm9vbCAiVGVzdCBzdHJpbmcgZnVuY3Rpb25zIgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9LY29uZmlnLmRlYnVnIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvS2NvbmZpZy5kZWJ1ZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWRmNTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvS2NvbmZpZy5kZWJ1ZwpAQCAtMCwwICsxLDE5ODYgQEAKK21lbnUgInByaW50ayBhbmQgZG1lc2cgb3B0aW9ucyIKKworY29uZmlnIFBSSU5US19USU1FCisJYm9vbCAiU2hvdyB0aW1pbmcgaW5mb3JtYXRpb24gb24gcHJpbnRrcyIKKwlkZXBlbmRzIG9uIFBSSU5USworCWhlbHAKKwkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiBjYXVzZXMgdGltZSBzdGFtcHMgb2YgdGhlIHByaW50aygpCisJICBtZXNzYWdlcyB0byBiZSBhZGRlZCB0byB0aGUgb3V0cHV0IG9mIHRoZSBzeXNsb2coKSBzeXN0ZW0KKwkgIGNhbGwgYW5kIGF0IHRoZSBjb25zb2xlLgorCisJICBUaGUgdGltZXN0YW1wIGlzIGFsd2F5cyByZWNvcmRlZCBpbnRlcm5hbGx5LCBhbmQgZXhwb3J0ZWQKKwkgIHRvIC9kZXYva21zZy4gVGhpcyBmbGFnIGp1c3Qgc3BlY2lmaWVzIGlmIHRoZSB0aW1lc3RhbXAgc2hvdWxkCisJICBiZSBpbmNsdWRlZCwgbm90IHRoYXQgdGhlIHRpbWVzdGFtcCBpcyByZWNvcmRlZC4KKworCSAgVGhlIGJlaGF2aW9yIGlzIGFsc28gY29udHJvbGxlZCBieSB0aGUga2VybmVsIGNvbW1hbmQgbGluZQorCSAgcGFyYW1ldGVyIHByaW50ay50aW1lPTEuIFNlZSBEb2N1bWVudGF0aW9uL2FkbWluLWd1aWRlL2tlcm5lbC1wYXJhbWV0ZXJzLnJzdAorCitjb25maWcgQ09OU09MRV9MT0dMRVZFTF9ERUZBVUxUCisJaW50ICJEZWZhdWx0IGNvbnNvbGUgbG9nbGV2ZWwgKDEtMTUpIgorCXJhbmdlIDEgMTUKKwlkZWZhdWx0ICI3IgorCWhlbHAKKwkgIERlZmF1bHQgbG9nbGV2ZWwgdG8gZGV0ZXJtaW5lIHdoYXQgd2lsbCBiZSBwcmludGVkIG9uIHRoZSBjb25zb2xlLgorCisJICBTZXR0aW5nIGEgZGVmYXVsdCBoZXJlIGlzIGVxdWl2YWxlbnQgdG8gcGFzc2luZyBpbiBsb2dsZXZlbD08eD4gaW4KKwkgIHRoZSBrZXJuZWwgYm9vdGFyZ3MuIGxvZ2xldmVsPTx4PiBjb250aW51ZXMgdG8gb3ZlcnJpZGUgd2hhdGV2ZXIKKwkgIHZhbHVlIGlzIHNwZWNpZmllZCBoZXJlIGFzIHdlbGwuCisKKwkgIE5vdGU6IFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBsb2cgbGV2ZWwgb2YgdW4tcHJlZml4ZWQgcHJpbnRrKCkKKwkgIHVzYWdlIGluIHRoZSBrZXJuZWwuIFRoYXQgaXMgY29udHJvbGxlZCBieSB0aGUgTUVTU0FHRV9MT0dMRVZFTF9ERUZBVUxUCisJICBvcHRpb24uCisKK2NvbmZpZyBNRVNTQUdFX0xPR0xFVkVMX0RFRkFVTFQKKwlpbnQgIkRlZmF1bHQgbWVzc2FnZSBsb2cgbGV2ZWwgKDEtNykiCisJcmFuZ2UgMSA3CisJZGVmYXVsdCAiNCIKKwloZWxwCisJICBEZWZhdWx0IGxvZyBsZXZlbCBmb3IgcHJpbnRrIHN0YXRlbWVudHMgd2l0aCBubyBzcGVjaWZpZWQgcHJpb3JpdHkuCisKKwkgIFRoaXMgd2FzIGhhcmQtY29kZWQgdG8gS0VSTl9XQVJOSU5HIHNpbmNlIGF0IGxlYXN0IDIuNi4xMCBidXQgZm9sa3MKKwkgIHRoYXQgYXJlIGF1ZGl0aW5nIHRoZWlyIGxvZ3MgY2xvc2VseSBtYXkgd2FudCB0byBzZXQgaXQgdG8gYSBsb3dlcgorCSAgcHJpb3JpdHkuCisKKwkgIE5vdGU6IFRoaXMgZG9lcyBub3QgYWZmZWN0IHdoYXQgbWVzc2FnZSBsZXZlbCBnZXRzIHByaW50ZWQgb24gdGhlIGNvbnNvbGUKKwkgIGJ5IGRlZmF1bHQuIFRvIGNoYW5nZSB0aGF0LCB1c2UgbG9nbGV2ZWw9PHg+IGluIHRoZSBrZXJuZWwgYm9vdGFyZ3MsCisJICBvciBwaWNrIGEgZGlmZmVyZW50IENPTlNPTEVfTE9HTEVWRUxfREVGQVVMVCBjb25maWd1cmF0aW9uIHZhbHVlLgorCitjb25maWcgQk9PVF9QUklOVEtfREVMQVkKKwlib29sICJEZWxheSBlYWNoIGJvb3QgcHJpbnRrIG1lc3NhZ2UgYnkgTiBtaWxsaXNlY29uZHMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJJTlRLICYmIEdFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZCisJaGVscAorCSAgVGhpcyBidWlsZCBvcHRpb24gYWxsb3dzIHlvdSB0byByZWFkIGtlcm5lbCBib290IG1lc3NhZ2VzCisJICBieSBpbnNlcnRpbmcgYSBzaG9ydCBkZWxheSBhZnRlciBlYWNoIG9uZS4gIFRoZSBkZWxheSBpcworCSAgc3BlY2lmaWVkIGluIG1pbGxpc2Vjb25kcyBvbiB0aGUga2VybmVsIGNvbW1hbmQgbGluZSwKKwkgIHVzaW5nICJib290X2RlbGF5PU4iLgorCisJICBJdCBpcyBsaWtlbHkgdGhhdCB5b3Ugd291bGQgYWxzbyBuZWVkIHRvIHVzZSAibHBqPU0iIHRvIHByZXNldAorCSAgdGhlICJsb29wcyBwZXIgamlmZmllIiB2YWx1ZS4KKwkgIFNlZSBhIHByZXZpb3VzIGJvb3QgbG9nIGZvciB0aGUgImxwaiIgdmFsdWUgdG8gdXNlIGZvciB5b3VyCisJICBzeXN0ZW0sIGFuZCB0aGVuIHNldCAibHBqPU0iIGJlZm9yZSBzZXR0aW5nICJib290X2RlbGF5PU4iLgorCSAgTk9URTogIFVzaW5nIHRoaXMgb3B0aW9uIG1heSBhZHZlcnNlbHkgYWZmZWN0IFNNUCBzeXN0ZW1zLgorCSAgSS5lLiwgcHJvY2Vzc29ycyBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUgbWF5IG5vdCBib290IHVwLgorCSAgQk9PVF9QUklOVEtfREVMQVkgYWxzbyBtYXkgY2F1c2UgTE9DS1VQX0RFVEVDVE9SIHRvIGRldGVjdAorCSAgd2hhdCBpdCBiZWxpZXZlcyB0byBiZSBsb2NrdXAgY29uZGl0aW9ucy4KKworY29uZmlnIERZTkFNSUNfREVCVUcKKwlib29sICJFbmFibGUgZHluYW1pYyBwcmludGsoKSBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUFJJTlRLCisJZGVwZW5kcyBvbiBERUJVR19GUworCWhlbHAKKworCSAgQ29tcGlsZXMgZGVidWcgbGV2ZWwgbWVzc2FnZXMgaW50byB0aGUga2VybmVsLCB3aGljaCB3b3VsZCBub3QKKwkgIG90aGVyd2lzZSBiZSBhdmFpbGFibGUgYXQgcnVudGltZS4gVGhlc2UgbWVzc2FnZXMgY2FuIHRoZW4gYmUKKwkgIGVuYWJsZWQvZGlzYWJsZWQgYmFzZWQgb24gdmFyaW91cyBsZXZlbHMgb2Ygc2NvcGUgLSBwZXIgc291cmNlIGZpbGUsCisJICBmdW5jdGlvbiwgbW9kdWxlLCBmb3JtYXQgc3RyaW5nLCBhbmQgbGluZSBudW1iZXIuIFRoaXMgbWVjaGFuaXNtCisJICBpbXBsaWNpdGx5IGNvbXBpbGVzIGluIGFsbCBwcl9kZWJ1ZygpIGFuZCBkZXZfZGJnKCkgY2FsbHMsIHdoaWNoCisJICBlbmxhcmdlcyB0aGUga2VybmVsIHRleHQgc2l6ZSBieSBhYm91dCAyJS4KKworCSAgSWYgYSBzb3VyY2UgZmlsZSBpcyBjb21waWxlZCB3aXRoIERFQlVHIGZsYWcgc2V0LCBhbnkKKwkgIHByX2RlYnVnKCkgY2FsbHMgaW4gaXQgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdCwgYnV0IGNhbiBiZQorCSAgZGlzYWJsZWQgYXQgcnVudGltZSBhcyBiZWxvdy4gIE5vdGUgdGhhdCBERUJVRyBmbGFnIGlzCisJICB0dXJuZWQgb24gYnkgbWFueSBDT05GSUdfKkRFQlVHKiBvcHRpb25zLgorCisJICBVc2FnZToKKworCSAgRHluYW1pYyBkZWJ1Z2dpbmcgaXMgY29udHJvbGxlZCB2aWEgdGhlICdkeW5hbWljX2RlYnVnL2NvbnRyb2wnIGZpbGUsCisJICB3aGljaCBpcyBjb250YWluZWQgaW4gdGhlICdkZWJ1Z2ZzJyBmaWxlc3lzdGVtLiBUaHVzLCB0aGUgZGVidWdmcworCSAgZmlsZXN5c3RlbSBtdXN0IGZpcnN0IGJlIG1vdW50ZWQgYmVmb3JlIG1ha2luZyB1c2Ugb2YgdGhpcyBmZWF0dXJlLgorCSAgV2UgcmVmZXIgdGhlIGNvbnRyb2wgZmlsZSBhczogPGRlYnVnZnM+L2R5bmFtaWNfZGVidWcvY29udHJvbC4gVGhpcworCSAgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgdGhlIGRlYnVnIHN0YXRlbWVudHMgdGhhdCBjYW4gYmUgZW5hYmxlZC4gVGhlCisJICBmb3JtYXQgZm9yIGVhY2ggbGluZSBvZiB0aGUgZmlsZSBpczoKKworCQlmaWxlbmFtZTpsaW5lbm8gW21vZHVsZV1mdW5jdGlvbiBmbGFncyBmb3JtYXQKKworCSAgZmlsZW5hbWUgOiBzb3VyY2UgZmlsZSBvZiB0aGUgZGVidWcgc3RhdGVtZW50CisJICBsaW5lbm8gOiBsaW5lIG51bWJlciBvZiB0aGUgZGVidWcgc3RhdGVtZW50CisJICBtb2R1bGUgOiBtb2R1bGUgdGhhdCBjb250YWlucyB0aGUgZGVidWcgc3RhdGVtZW50CisJICBmdW5jdGlvbiA6IGZ1bmN0aW9uIHRoYXQgY29udGFpbnMgdGhlIGRlYnVnIHN0YXRlbWVudAorICAgICAgICAgIGZsYWdzIDogJz1wJyBtZWFucyB0aGUgbGluZSBpcyB0dXJuZWQgJ29uJyBmb3IgcHJpbnRpbmcKKyAgICAgICAgICBmb3JtYXQgOiB0aGUgZm9ybWF0IHVzZWQgZm9yIHRoZSBkZWJ1ZyBzdGF0ZW1lbnQKKworCSAgRnJvbSBhIGxpdmUgc3lzdGVtOgorCisJCW51bGxhcmJvcjp+ICMgY2F0IDxkZWJ1Z2ZzPi9keW5hbWljX2RlYnVnL2NvbnRyb2wKKwkJIyBmaWxlbmFtZTpsaW5lbm8gW21vZHVsZV1mdW5jdGlvbiBmbGFncyBmb3JtYXQKKwkJZnMvYWlvLmM6MjIyIFthaW9dX19wdXRfaW9jdHggPV8gIl9fcHV0X2lvY3R4OlwwNDBmcmVlaW5nXDA0MCVwXDAxMiIKKwkJZnMvYWlvLmM6MjQ4IFthaW9daW9jdHhfYWxsb2MgPV8gIkVOT01FTTpcMDQwbnJfZXZlbnRzXDA0MHRvb1wwNDBoaWdoXDAxMiIKKwkJZnMvYWlvLmM6MTc3MCBbYWlvXXN5c19pb19jYW5jZWwgPV8gImNhbGxpbmdcMDQwY2FuY2VsXDAxMiIKKworCSAgRXhhbXBsZSB1c2FnZToKKworCQkvLyBlbmFibGUgdGhlIG1lc3NhZ2UgYXQgbGluZSAxNjAzIG9mIGZpbGUgc3Zjc29jay5jCisJCW51bGxhcmJvcjp+ICMgZWNobyAtbiAnZmlsZSBzdmNzb2NrLmMgbGluZSAxNjAzICtwJyA+CisJCQkJCQk8ZGVidWdmcz4vZHluYW1pY19kZWJ1Zy9jb250cm9sCisKKwkJLy8gZW5hYmxlIGFsbCB0aGUgbWVzc2FnZXMgaW4gZmlsZSBzdmNzb2NrLmMKKwkJbnVsbGFyYm9yOn4gIyBlY2hvIC1uICdmaWxlIHN2Y3NvY2suYyArcCcgPgorCQkJCQkJPGRlYnVnZnM+L2R5bmFtaWNfZGVidWcvY29udHJvbAorCisJCS8vIGVuYWJsZSBhbGwgdGhlIG1lc3NhZ2VzIGluIHRoZSBORlMgc2VydmVyIG1vZHVsZQorCQludWxsYXJib3I6fiAjIGVjaG8gLW4gJ21vZHVsZSBuZnNkICtwJyA+CisJCQkJCQk8ZGVidWdmcz4vZHluYW1pY19kZWJ1Zy9jb250cm9sCisKKwkJLy8gZW5hYmxlIGFsbCAxMiBtZXNzYWdlcyBpbiB0aGUgZnVuY3Rpb24gc3ZjX3Byb2Nlc3MoKQorCQludWxsYXJib3I6fiAjIGVjaG8gLW4gJ2Z1bmMgc3ZjX3Byb2Nlc3MgK3AnID4KKwkJCQkJCTxkZWJ1Z2ZzPi9keW5hbWljX2RlYnVnL2NvbnRyb2wKKworCQkvLyBkaXNhYmxlIGFsbCAxMiBtZXNzYWdlcyBpbiB0aGUgZnVuY3Rpb24gc3ZjX3Byb2Nlc3MoKQorCQludWxsYXJib3I6fiAjIGVjaG8gLW4gJ2Z1bmMgc3ZjX3Byb2Nlc3MgLXAnID4KKwkJCQkJCTxkZWJ1Z2ZzPi9keW5hbWljX2RlYnVnL2NvbnRyb2wKKworCSAgU2VlIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvZHluYW1pYy1kZWJ1Zy1ob3d0by5yc3QgZm9yIGFkZGl0aW9uYWwKKwkgIGluZm9ybWF0aW9uLgorCitlbmRtZW51ICMgInByaW50ayBhbmQgZG1lc2cgb3B0aW9ucyIKKworbWVudSAiQ29tcGlsZS10aW1lIGNoZWNrcyBhbmQgY29tcGlsZXIgb3B0aW9ucyIKKworY29uZmlnIERFQlVHX0lORk8KKwlib29sICJDb21waWxlIHRoZSBrZXJuZWwgd2l0aCBkZWJ1ZyBpbmZvIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFDT01QSUxFX1RFU1QKKwloZWxwCisgICAgICAgICAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBpbmNsdWRlCisJICBkZWJ1Z2dpbmcgaW5mbyByZXN1bHRpbmcgaW4gYSBsYXJnZXIga2VybmVsIGltYWdlLgorCSAgVGhpcyBhZGRzIGRlYnVnIHN5bWJvbHMgdG8gdGhlIGtlcm5lbCBhbmQgbW9kdWxlcyAoZ2NjIC1nKSwgYW5kCisJICBpcyBuZWVkZWQgaWYgeW91IGludGVuZCB0byB1c2Uga2VybmVsIGNyYXNoZHVtcCBvciBiaW5hcnkgb2JqZWN0CisJICB0b29scyBsaWtlIGNyYXNoLCBrZ2RiLCBMS0NELCBnZGIsIGV0YyBvbiB0aGUga2VybmVsLgorCSAgU2F5IFkgaGVyZSBvbmx5IGlmIHlvdSBwbGFuIHRvIGRlYnVnIHRoZSBrZXJuZWwuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBERUJVR19JTkZPX1JFRFVDRUQKKwlib29sICJSZWR1Y2UgZGVidWdnaW5nIGluZm9ybWF0aW9uIgorCWRlcGVuZHMgb24gREVCVUdfSU5GTworCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlIGdjYyBpcyBpbnN0cnVjdGVkIHRvIGdlbmVyYXRlIGxlc3MgZGVidWdnaW5nCisJICBpbmZvcm1hdGlvbiBmb3Igc3RydWN0dXJlIHR5cGVzLiBUaGlzIG1lYW5zIHRoYXQgdG9vbHMgdGhhdAorCSAgbmVlZCBmdWxsIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAobGlrZSBrZ2RiIG9yIHN5c3RlbXRhcCkgd29uJ3QKKwkgIGJlIGhhcHB5LiBCdXQgaWYgeW91IG1lcmVseSBuZWVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0bworCSAgcmVzb2x2ZSBsaW5lIG51bWJlcnMgdGhlcmUgaXMgbm8gbG9zcy4gQWR2YW50YWdlIGlzIHRoYXQKKwkgIGJ1aWxkIGRpcmVjdG9yeSBvYmplY3Qgc2l6ZXMgc2hyaW5rIGRyYW1hdGljYWxseSBvdmVyIGEgZnVsbAorCSAgREVCVUdfSU5GTyBidWlsZCBhbmQgY29tcGlsZSB0aW1lcyBhcmUgcmVkdWNlZCB0b28uCisJICBPbmx5IHdvcmtzIHdpdGggbmV3ZXIgZ2NjIHZlcnNpb25zLgorCitjb25maWcgREVCVUdfSU5GT19TUExJVAorCWJvb2wgIlByb2R1Y2Ugc3BsaXQgZGVidWdpbmZvIGluIC5kd28gZmlsZXMiCisJZGVwZW5kcyBvbiBERUJVR19JTkZPICYmICFGUlYKKwloZWxwCisJICBHZW5lcmF0ZSBkZWJ1ZyBpbmZvIGludG8gc2VwYXJhdGUgLmR3byBmaWxlcy4gVGhpcyBzaWduaWZpY2FudGx5CisJICByZWR1Y2VzIHRoZSBidWlsZCBkaXJlY3Rvcnkgc2l6ZSBmb3IgYnVpbGRzIHdpdGggREVCVUdfSU5GTywKKwkgIGJlY2F1c2UgaXQgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBvbmx5IG9uY2Ugb24gZGlzayBpbiAuZHdvCisJICBmaWxlcyBpbnN0ZWFkIG9mIG11bHRpcGxlIHRpbWVzIGluIG9iamVjdCBmaWxlcyBhbmQgZXhlY3V0YWJsZXMuCisJICBJbiBhZGRpdGlvbiB0aGUgZGVidWcgaW5mb3JtYXRpb24gaXMgYWxzbyBjb21wcmVzc2VkLgorCisJICBSZXF1aXJlcyByZWNlbnQgZ2NjICg0LjcrKSBhbmQgcmVjZW50IGdkYi9iaW51dGlscy4KKwkgIEFueSB0b29sIHRoYXQgcGFja2FnZXMgb3IgcmVhZHMgZGVidWcgaW5mb3JtYXRpb24gd291bGQgbmVlZAorCSAgdG8ga25vdyBhYm91dCB0aGUgLmR3byBmaWxlcyBhbmQgaW5jbHVkZSB0aGVtLgorCSAgSW5jb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgY2NhY2hlLgorCitjb25maWcgREVCVUdfSU5GT19EV0FSRjQKKwlib29sICJHZW5lcmF0ZSBkd2FyZjQgZGVidWdpbmZvIgorCWRlcGVuZHMgb24gREVCVUdfSU5GTworCWhlbHAKKwkgIEdlbmVyYXRlIGR3YXJmNCBkZWJ1ZyBpbmZvLiBUaGlzIHJlcXVpcmVzIHJlY2VudCB2ZXJzaW9ucworCSAgb2YgZ2NjIGFuZCBnZGIuIEl0IG1ha2VzIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBsYXJnZXIuCisJICBCdXQgaXQgc2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgc3VjY2VzcyBvZiByZXNvbHZpbmcKKwkgIHZhcmlhYmxlcyBpbiBnZGIgb24gb3B0aW1pemVkIGNvZGUuCisKK2NvbmZpZyBHREJfU0NSSVBUUworCWJvb2wgIlByb3ZpZGUgR0RCIHNjcmlwdHMgZm9yIGtlcm5lbCBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBERUJVR19JTkZPCisJaGVscAorCSAgVGhpcyBjcmVhdGVzIHRoZSByZXF1aXJlZCBsaW5rcyB0byBHREIgaGVscGVyIHNjcmlwdHMgaW4gdGhlCisJICBidWlsZCBkaXJlY3RvcnkuIElmIHlvdSBsb2FkIHZtbGludXggaW50byBnZGIsIHRoZSBoZWxwZXIKKwkgIHNjcmlwdHMgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ5IGdkYiBhcyB3ZWxsLCBhbmQKKwkgIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgdG8gYW5hbHl6ZSBhIExpbnV4IGtlcm5lbAorCSAgaW5zdGFuY2UuIFNlZSBEb2N1bWVudGF0aW9uL2Rldi10b29scy9nZGIta2VybmVsLWRlYnVnZ2luZy5yc3QKKwkgIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKK2NvbmZpZyBFTkFCTEVfV0FSTl9ERVBSRUNBVEVECisJYm9vbCAiRW5hYmxlIF9fZGVwcmVjYXRlZCBsb2dpYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhlIF9fZGVwcmVjYXRlZCBsb2dpYyBpbiB0aGUga2VybmVsIGJ1aWxkLgorCSAgRGlzYWJsZSB0aGlzIHRvIHN1cHByZXNzIHRoZSAid2FybmluZzogJ2ZvbycgaXMgZGVwcmVjYXRlZAorCSAgKGRlY2xhcmVkIGF0IGtlcm5lbC9wb3dlci9zb21lZmlsZS5jOjEyMzQpIiBtZXNzYWdlcy4KKworY29uZmlnIEVOQUJMRV9NVVNUX0NIRUNLCisJYm9vbCAiRW5hYmxlIF9fbXVzdF9jaGVjayBsb2dpYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhlIF9fbXVzdF9jaGVjayBsb2dpYyBpbiB0aGUga2VybmVsIGJ1aWxkLiAgRGlzYWJsZSB0aGlzIHRvCisJICBzdXBwcmVzcyB0aGUgIndhcm5pbmc6IGlnbm9yaW5nIHJldHVybiB2YWx1ZSBvZiAnZm9vJywgZGVjbGFyZWQgd2l0aAorCSAgYXR0cmlidXRlIHdhcm5fdW51c2VkX3Jlc3VsdCIgbWVzc2FnZXMuCisKK2NvbmZpZyBGUkFNRV9XQVJOCisJaW50ICJXYXJuIGZvciBzdGFjayBmcmFtZXMgbGFyZ2VyIHRoYW4gKG5lZWRzIGdjYyA0LjQpIgorCXJhbmdlIDAgODE5MgorCWRlZmF1bHQgMzA3MiBpZiBLQVNBTl9FWFRSQQorCWRlZmF1bHQgMjA0OCBpZiBHQ0NfUExVR0lOX0xBVEVOVF9FTlRST1BZCisJZGVmYXVsdCAxMjgwIGlmICghNjRCSVQgJiYgUEFSSVNDKQorCWRlZmF1bHQgMTAyNCBpZiAoITY0QklUICYmICFQQVJJU0MpCisJZGVmYXVsdCAyMDQ4IGlmIDY0QklUCisJaGVscAorCSAgVGVsbCBnY2MgdG8gd2FybiBhdCBidWlsZCB0aW1lIGZvciBzdGFjayBmcmFtZXMgbGFyZ2VyIHRoYW4gdGhpcy4KKwkgIFNldHRpbmcgdGhpcyB0b28gbG93IHdpbGwgY2F1c2UgYSBsb3Qgb2Ygd2FybmluZ3MuCisJICBTZXR0aW5nIGl0IHRvIDAgZGlzYWJsZXMgdGhlIHdhcm5pbmcuCisJICBSZXF1aXJlcyBnY2MgNC40CisKK2NvbmZpZyBTVFJJUF9BU01fU1lNUworCWJvb2wgIlN0cmlwIGFzc2VtYmxlci1nZW5lcmF0ZWQgc3ltYm9scyBkdXJpbmcgbGluayIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTdHJpcCBpbnRlcm5hbCBhc3NlbWJsZXItZ2VuZXJhdGVkIHN5bWJvbHMgZHVyaW5nIGEgbGluayAoc3ltYm9scworCSAgdGhhdCBsb29rIGxpa2UgJy5MeHh4Jykgc28gdGhleSBkb24ndCBwb2xsdXRlIHRoZSBvdXRwdXQgb2YKKwkgIGdldF93Y2hhbigpIGFuZCBzdWNobGlrZS4KKworY29uZmlnIFJFQURBQkxFX0FTTQorICAgICAgICBib29sICJHZW5lcmF0ZSByZWFkYWJsZSBhc3NlbWJsZXIgY29kZSIKKyAgICAgICAgZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKyAgICAgICAgaGVscAorICAgICAgICAgIERpc2FibGUgc29tZSBjb21waWxlciBvcHRpbWl6YXRpb25zIHRoYXQgdGVuZCB0byBnZW5lcmF0ZSBodW1hbiB1bnJlYWRhYmxlCisgICAgICAgICAgYXNzZW1ibGVyIG91dHB1dC4gVGhpcyBtYXkgbWFrZSB0aGUga2VybmVsIHNsaWdodGx5IHNsb3dlciwgYnV0IGl0IGhlbHBzCisgICAgICAgICAgdG8ga2VlcCBrZXJuZWwgZGV2ZWxvcGVycyB3aG8gaGF2ZSB0byBzdGFyZSBhIGxvdCBhdCBhc3NlbWJsZXIgbGlzdGluZ3MKKyAgICAgICAgICBzYW5lLgorCitjb25maWcgVU5VU0VEX1NZTUJPTFMKKwlib29sICJFbmFibGUgdW51c2VkL29ic29sZXRlIGV4cG9ydGVkIHN5bWJvbHMiCisJZGVmYXVsdCB5IGlmIFg4NgorCWhlbHAKKwkgIFVudXNlZCBidXQgZXhwb3J0ZWQgc3ltYm9scyBtYWtlIHRoZSBrZXJuZWwgbmVlZGxlc3NseSBiaWdnZXIuICBGb3IKKwkgIHRoYXQgcmVhc29uIG1vc3Qgb2YgdGhlc2UgdW51c2VkIGV4cG9ydHMgd2lsbCBzb29uIGJlIHJlbW92ZWQuICBUaGlzCisJICBvcHRpb24gaXMgcHJvdmlkZWQgdGVtcG9yYXJpbHkgdG8gcHJvdmlkZSBhIHRyYW5zaXRpb24gcGVyaW9kIGluIGNhc2UKKwkgIHNvbWUgZXh0ZXJuYWwga2VybmVsIG1vZHVsZSBuZWVkcyBvbmUgb2YgdGhlc2Ugc3ltYm9scyBhbnl3YXkuIElmIHlvdQorCSAgZW5jb3VudGVyIHN1Y2ggYSBjYXNlIGluIHlvdXIgbW9kdWxlLCBjb25zaWRlciBpZiB5b3UgYXJlIGFjdHVhbGx5CisJICB1c2luZyB0aGUgcmlnaHQgQVBJLiAgKHJhdGlvbmFsZTogc2luY2Ugbm9ib2R5IGluIHRoZSBrZXJuZWwgaXMgdXNpbmcKKwkgIHRoaXMgaW4gYSBtb2R1bGUsIHRoZXJlIGlzIGEgcHJldHR5IGdvb2QgY2hhbmNlIGl0J3MgYWN0dWFsbHkgdGhlCisJICB3cm9uZyBpbnRlcmZhY2UgdG8gdXNlKS4gIElmIHlvdSByZWFsbHkgbmVlZCB0aGUgc3ltYm9sLCBwbGVhc2Ugc2VuZCBhCisJICBtYWlsIHRvIHRoZSBsaW51eCBrZXJuZWwgbWFpbGluZyBsaXN0IG1lbnRpb25pbmcgdGhlIHN5bWJvbCBhbmQgd2h5CisJICB5b3UgcmVhbGx5IG5lZWQgaXQsIGFuZCB3aGF0IHRoZSBtZXJnZSBwbGFuIHRvIHRoZSBtYWlubGluZSBrZXJuZWwgZm9yCisJICB5b3VyIG1vZHVsZSBpcy4KKworY29uZmlnIFBBR0VfT1dORVIKKwlib29sICJUcmFjayBwYWdlIG93bmVyIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFNUQUNLVFJBQ0VfU1VQUE9SVAorCXNlbGVjdCBERUJVR19GUworCXNlbGVjdCBTVEFDS1RSQUNFCisJc2VsZWN0IFNUQUNLREVQT1QKKwlzZWxlY3QgUEFHRV9FWFRFTlNJT04KKwloZWxwCisJICBUaGlzIGtlZXBzIHRyYWNrIG9mIHdoYXQgY2FsbCBjaGFpbiBpcyB0aGUgb3duZXIgb2YgYSBwYWdlLCBtYXkKKwkgIGhlbHAgdG8gZmluZCBiYXJlIGFsbG9jX3BhZ2UocykgbGVha3MuIEV2ZW4gaWYgeW91IGluY2x1ZGUgdGhpcworCSAgZmVhdHVyZSBvbiB5b3VyIGJ1aWxkLCBpdCBpcyBkaXNhYmxlZCBpbiBkZWZhdWx0LiBZb3Ugc2hvdWxkIHBhc3MKKwkgICJwYWdlX293bmVyPW9uIiB0byBib290IHBhcmFtZXRlciBpbiBvcmRlciB0byBlbmFibGUgaXQuIEVhdHMKKwkgIGEgZmFpciBhbW91bnQgb2YgbWVtb3J5IGlmIGVuYWJsZWQuIFNlZSB0b29scy92bS9wYWdlX293bmVyX3NvcnQuYworCSAgZm9yIHVzZXItc3BhY2UgaGVscGVyLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfRlMKKwlib29sICJEZWJ1ZyBGaWxlc3lzdGVtIgorCXNlbGVjdCBTUkNVCisJaGVscAorCSAgZGVidWdmcyBpcyBhIHZpcnR1YWwgZmlsZSBzeXN0ZW0gdGhhdCBrZXJuZWwgZGV2ZWxvcGVycyB1c2UgdG8gcHV0CisJICBkZWJ1Z2dpbmcgZmlsZXMgaW50by4gIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBiZSBhYmxlIHRvIHJlYWQgYW5kCisJICB3cml0ZSB0byB0aGVzZSBmaWxlcy4KKworCSAgRm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24gb24gdGhlIGRlYnVnZnMgQVBJLCBzZWUKKwkgIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgSEVBREVSU19DSEVDSworCWJvb2wgIlJ1biAnbWFrZSBoZWFkZXJzX2NoZWNrJyB3aGVuIGJ1aWxkaW5nIHZtbGludXgiCisJZGVwZW5kcyBvbiAhVU1MCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBleHRyYWN0IHRoZSB1c2VyLXZpc2libGUga2VybmVsIGhlYWRlcnMgd2hlbmV2ZXIKKwkgIGJ1aWxkaW5nIHRoZSBrZXJuZWwsIGFuZCB3aWxsIHJ1biBiYXNpYyBzYW5pdHkgY2hlY2tzIG9uIHRoZW0gdG8KKwkgIGVuc3VyZSB0aGF0IGV4cG9ydGVkIGZpbGVzIGRvIG5vdCBhdHRlbXB0IHRvIGluY2x1ZGUgZmlsZXMgd2hpY2gKKwkgIHdlcmUgbm90IGV4cG9ydGVkLCBldGMuCisKKwkgIElmIHlvdSdyZSBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBoZWFkZXIgZmlsZXMgd2hpY2ggYXJlCisJICByZWxldmFudCBmb3IgdXNlcnNwYWNlLCBzYXkgJ1knLCBhbmQgY2hlY2sgdGhlIGhlYWRlcnMKKwkgIGV4cG9ydGVkIHRvICQoSU5TVEFMTF9IRFJfUEFUSCkgKHVzdWFsbHkgJ3Vzci9pbmNsdWRlJyBpbgorCSAgeW91ciBidWlsZCB0cmVlKSwgdG8gbWFrZSBzdXJlIHRoZXkncmUgc3VpdGFibGUuCisKK2NvbmZpZyBERUJVR19TRUNUSU9OX01JU01BVENICisJYm9vbCAiRW5hYmxlIGZ1bGwgU2VjdGlvbiBtaXNtYXRjaCBhbmFseXNpcyIKKwloZWxwCisJICBUaGUgc2VjdGlvbiBtaXNtYXRjaCBhbmFseXNpcyBjaGVja3MgaWYgdGhlcmUgYXJlIGlsbGVnYWwKKwkgIHJlZmVyZW5jZXMgZnJvbSBvbmUgc2VjdGlvbiB0byBhbm90aGVyIHNlY3Rpb24uCisJICBEdXJpbmcgbGlua3RpbWUgb3IgcnVudGltZSwgc29tZSBzZWN0aW9ucyBhcmUgZHJvcHBlZDsKKwkgIGFueSB1c2Ugb2YgY29kZS9kYXRhIHByZXZpb3VzbHkgaW4gdGhlc2Ugc2VjdGlvbnMgd291bGQKKwkgIG1vc3QgbGlrZWx5IHJlc3VsdCBpbiBhbiBvb3BzLgorCSAgSW4gdGhlIGNvZGUsIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGFyZSBhbm5vdGF0ZWQgd2l0aAorCSAgX19pbml0LCwgZXRjLiAoc2VlIHRoZSBmdWxsIGxpc3QgaW4gaW5jbHVkZS9saW51eC9pbml0LmgpLAorCSAgd2hpY2ggcmVzdWx0cyBpbiB0aGUgY29kZS9kYXRhIGJlaW5nIHBsYWNlZCBpbiBzcGVjaWZpYyBzZWN0aW9ucy4KKwkgIFRoZSBzZWN0aW9uIG1pc21hdGNoIGFuYWx5c2lzIGlzIGFsd2F5cyBwZXJmb3JtZWQgYWZ0ZXIgYSBmdWxsCisJICBrZXJuZWwgYnVpbGQsIGFuZCBlbmFibGluZyB0aGlzIG9wdGlvbiBjYXVzZXMgdGhlIGZvbGxvd2luZworCSAgYWRkaXRpb25hbCBzdGVwcyB0byBvY2N1cjoKKwkgIC0gQWRkIHRoZSBvcHRpb24gLWZuby1pbmxpbmUtZnVuY3Rpb25zLWNhbGxlZC1vbmNlIHRvIGdjYyBjb21tYW5kcy4KKwkgICAgV2hlbiBpbmxpbmluZyBhIGZ1bmN0aW9uIGFubm90YXRlZCB3aXRoIF9faW5pdCBpbiBhIG5vbi1pbml0CisJICAgIGZ1bmN0aW9uLCB3ZSB3b3VsZCBsb3NlIHRoZSBzZWN0aW9uIGluZm9ybWF0aW9uIGFuZCB0aHVzCisJICAgIHRoZSBhbmFseXNpcyB3b3VsZCBub3QgY2F0Y2ggdGhlIGlsbGVnYWwgcmVmZXJlbmNlLgorCSAgICBUaGlzIG9wdGlvbiB0ZWxscyBnY2MgdG8gaW5saW5lIGxlc3MgKGJ1dCBpdCBkb2VzIHJlc3VsdCBpbgorCSAgICBhIGxhcmdlciBrZXJuZWwpLgorCSAgLSBSdW4gdGhlIHNlY3Rpb24gbWlzbWF0Y2ggYW5hbHlzaXMgZm9yIGVhY2ggbW9kdWxlL2J1aWx0LWluLm8gZmlsZS4KKwkgICAgV2hlbiB3ZSBydW4gdGhlIHNlY3Rpb24gbWlzbWF0Y2ggYW5hbHlzaXMgb24gdm1saW51eC5vLCB3ZQorCSAgICBsb3NlIHZhbHVhYmxlIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBtaXNtYXRjaCB3YXMKKwkgICAgaW50cm9kdWNlZC4KKwkgICAgUnVubmluZyB0aGUgYW5hbHlzaXMgZm9yIGVhY2ggbW9kdWxlL2J1aWx0LWluLm8gZmlsZQorCSAgICB0ZWxscyB3aGVyZSB0aGUgbWlzbWF0Y2ggaGFwcGVucyBtdWNoIGNsb3NlciB0byB0aGUKKwkgICAgc291cmNlLiBUaGUgZHJhd2JhY2sgaXMgdGhhdCB0aGUgc2FtZSBtaXNtYXRjaCBpcworCSAgICByZXBvcnRlZCBhdCBsZWFzdCB0d2ljZS4KKwkgIC0gRW5hYmxlIHZlcmJvc2UgcmVwb3J0aW5nIGZyb20gbW9kcG9zdCBpbiBvcmRlciB0byBoZWxwIHJlc29sdmUKKwkgICAgdGhlIHNlY3Rpb24gbWlzbWF0Y2hlcyB0aGF0IGFyZSByZXBvcnRlZC4KKworY29uZmlnIFNFQ1RJT05fTUlTTUFUQ0hfV0FSTl9PTkxZCisJYm9vbCAiTWFrZSBzZWN0aW9uIG1pc21hdGNoIGVycm9ycyBub24tZmF0YWwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHNheSBOIGhlcmUsIHRoZSBidWlsZCBwcm9jZXNzIHdpbGwgZmFpbCBpZiB0aGVyZSBhcmUgYW55CisJICBzZWN0aW9uIG1pc21hdGNoLCBpbnN0ZWFkIG9mIGp1c3QgdGhyb3dpbmcgd2FybmluZ3MuCisKKwkgIElmIHVuc3VyZSwgc2F5IFkuCisKKyMKKyMgU2VsZWN0IHRoaXMgY29uZmlnIG9wdGlvbiBmcm9tIHRoZSBhcmNoaXRlY3R1cmUgS2NvbmZpZywgaWYgaXQKKyMgaXMgcHJlZmVycmVkIHRvIGFsd2F5cyBvZmZlciBmcmFtZSBwb2ludGVycyBhcyBhIGNvbmZpZworIyBvcHRpb24gb24gdGhlIGFyY2hpdGVjdHVyZSAocmVnYXJkbGVzcyBvZiBLRVJORUxfREVCVUcpOgorIworY29uZmlnIEFSQ0hfV0FOVF9GUkFNRV9QT0lOVEVSUworCWJvb2wKKwloZWxwCisKK2NvbmZpZyBGUkFNRV9QT0lOVEVSCisJYm9vbCAiQ29tcGlsZSB0aGUga2VybmVsIHdpdGggZnJhbWUgcG9pbnRlcnMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgXAorCQkoQ1JJUyB8fCBNNjhLIHx8IEZSViB8fCBVTUwgfHwgXAorCQkgU1VQRVJIIHx8IEJMQUNLRklOIHx8IE1OMTAzMDAgfHwgTUVUQUcpIHx8IFwKKwkJQVJDSF9XQU5UX0ZSQU1FX1BPSU5URVJTCisJZGVmYXVsdCB5IGlmIChERUJVR19JTkZPICYmIFVNTCkgfHwgQVJDSF9XQU5UX0ZSQU1FX1BPSU5URVJTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUgdGhlIHJlc3VsdGluZyBrZXJuZWwgaW1hZ2Ugd2lsbCBiZSBzbGlnaHRseQorCSAgbGFyZ2VyIGFuZCBzbG93ZXIsIGJ1dCBpdCBnaXZlcyB2ZXJ5IHVzZWZ1bCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKwkgIGluIGNhc2Ugb2Yga2VybmVsIGJ1Z3MuIChwcmVjaXNlIG9vcHNlcy9zdGFja3RyYWNlcy93YXJuaW5ncykKKworY29uZmlnIFNUQUNLX1ZBTElEQVRJT04KKwlib29sICJDb21waWxlLXRpbWUgc3RhY2sgbWV0YWRhdGEgdmFsaWRhdGlvbiIKKwlkZXBlbmRzIG9uIEhBVkVfU1RBQ0tfVkFMSURBVElPTgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEFkZCBjb21waWxlLXRpbWUgY2hlY2tzIHRvIHZhbGlkYXRlIHN0YWNrIG1ldGFkYXRhLCBpbmNsdWRpbmcgZnJhbWUKKwkgIHBvaW50ZXJzIChpZiBDT05GSUdfRlJBTUVfUE9JTlRFUiBpcyBlbmFibGVkKS4gIFRoaXMgaGVscHMgZW5zdXJlCisJICB0aGF0IHJ1bnRpbWUgc3RhY2sgdHJhY2VzIGFyZSBtb3JlIHJlbGlhYmxlLgorCisJICBUaGlzIGlzIGFsc28gYSBwcmVyZXF1aXNpdGUgZm9yIGdlbmVyYXRpb24gb2YgT1JDIHVud2luZCBkYXRhLCB3aGljaAorCSAgaXMgbmVlZGVkIGZvciBDT05GSUdfVU5XSU5ERVJfT1JDLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisJICB0b29scy9vYmp0b29sL0RvY3VtZW50YXRpb24vc3RhY2stdmFsaWRhdGlvbi50eHQuCisKK2NvbmZpZyBERUJVR19GT1JDRV9XRUFLX1BFUl9DUFUKKwlib29sICJGb3JjZSB3ZWFrIHBlci1jcHUgZGVmaW5pdGlvbnMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBzMzkwIGFuZCBhbHBoYSByZXF1aXJlIHBlcmNwdSB2YXJpYWJsZXMgaW4gbW9kdWxlcyB0byBiZQorCSAgZGVmaW5lZCB3ZWFrIHRvIHdvcmsgYXJvdW5kIGFkZHJlc3NpbmcgcmFuZ2UgaXNzdWUgd2hpY2gKKwkgIHB1dHMgdGhlIGZvbGxvd2luZyB0d28gcmVzdHJpY3Rpb25zIG9uIHBlcmNwdSB2YXJpYWJsZQorCSAgZGVmaW5pdGlvbnMuCisKKwkgIDEuIHBlcmNwdSBzeW1ib2xzIG11c3QgYmUgdW5pcXVlIHdoZXRoZXIgc3RhdGljIG9yIG5vdAorCSAgMi4gcGVyY3B1IHZhcmlhYmxlcyBjYW4ndCBiZSBkZWZpbmVkIGluc2lkZSBhIGZ1bmN0aW9uCisKKwkgIFRvIGVuc3VyZSB0aGF0IGdlbmVyaWMgY29kZSBmb2xsb3dzIHRoZSBhYm92ZSBydWxlcywgdGhpcworCSAgb3B0aW9uIGZvcmNlcyBhbGwgcGVyY3B1IHZhcmlhYmxlcyB0byBiZSBkZWZpbmVkIGFzIHdlYWsuCisKK2VuZG1lbnUgIyAiQ29tcGlsZXIgb3B0aW9ucyIKKworY29uZmlnIE1BR0lDX1NZU1JRCisJYm9vbCAiTWFnaWMgU3lzUnEga2V5IgorCWRlcGVuZHMgb24gIVVNTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCB5b3Ugd2lsbCBoYXZlIHNvbWUgY29udHJvbCBvdmVyIHRoZSBzeXN0ZW0gZXZlbgorCSAgaWYgdGhlIHN5c3RlbSBjcmFzaGVzIGZvciBleGFtcGxlIGR1cmluZyBrZXJuZWwgZGVidWdnaW5nIChlLmcuLCB5b3UKKwkgIHdpbGwgYmUgYWJsZSB0byBmbHVzaCB0aGUgYnVmZmVyIGNhY2hlIHRvIGRpc2ssIHJlYm9vdCB0aGUgc3lzdGVtCisJICBpbW1lZGlhdGVseSBvciBkdW1wIHNvbWUgc3RhdHVzIGluZm9ybWF0aW9uKS4gVGhpcyBpcyBhY2NvbXBsaXNoZWQKKwkgIGJ5IHByZXNzaW5nIHZhcmlvdXMga2V5cyB3aGlsZSBob2xkaW5nIFN5c1JxIChBbHQrUHJpbnRTY3JlZW4pLiBJdAorCSAgYWxzbyB3b3JrcyBvbiBhIHNlcmlhbCBjb25zb2xlIChvbiBQQyBoYXJkd2FyZSBhdCBsZWFzdCksIGlmIHlvdQorCSAgc2VuZCBhIEJSRUFLIGFuZCB0aGVuIHdpdGhpbiA1IHNlY29uZHMgYSBjb21tYW5kIGtleXByZXNzLiBUaGUKKwkgIGtleXMgYXJlIGRvY3VtZW50ZWQgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9hZG1pbi1ndWlkZS9zeXNycS5yc3Q+LgorCSAgRG9uJ3Qgc2F5IFkgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHRoaXMgaGFjayBkb2VzLgorCitjb25maWcgTUFHSUNfU1lTUlFfREVGQVVMVF9FTkFCTEUKKwloZXggIkVuYWJsZSBtYWdpYyBTeXNScSBrZXkgZnVuY3Rpb25zIGJ5IGRlZmF1bHQiCisJZGVwZW5kcyBvbiBNQUdJQ19TWVNSUQorCWRlZmF1bHQgMHgxCisJaGVscAorCSAgU3BlY2lmaWVzIHdoaWNoIFN5c1JxIGtleSBmdW5jdGlvbnMgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKwkgIFRoaXMgbWF5IGJlIHNldCB0byAxIG9yIDAgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlbSBhbGwsIG9yCisJICB0byBhIGJpdG1hc2sgYXMgZGVzY3JpYmVkIGluIERvY3VtZW50YXRpb24vYWRtaW4tZ3VpZGUvc3lzcnEucnN0LgorCitjb25maWcgTUFHSUNfU1lTUlFfU0VSSUFMCisJYm9vbCAiRW5hYmxlIG1hZ2ljIFN5c1JxIGtleSBvdmVyIHNlcmlhbCIKKwlkZXBlbmRzIG9uIE1BR0lDX1NZU1JRCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFueSBlbWJlZGRlZCBib2FyZHMgaGF2ZSBhIGRpc2Nvbm5lY3RlZCBUVEwgbGV2ZWwgc2VyaWFsIHdoaWNoIGNhbgorCSAgZ2VuZXJhdGUgc29tZSBnYXJiYWdlIHRoYXQgY2FuIGxlYWQgdG8gc3B1cmlvdXMgZmFsc2Ugc3lzcnEgZGV0ZWN0cy4KKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGVjaWRlIHdoZXRoZXIgeW91IHdhbnQgdG8gZW5hYmxlIHRoZQorCSAgbWFnaWMgU3lzUnEga2V5LgorCitjb25maWcgREVCVUdfS0VSTkVMCisJYm9vbCAiS2VybmVsIGRlYnVnZ2luZyIKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBhcmUgZGV2ZWxvcGluZyBkcml2ZXJzIG9yIHRyeWluZyB0byBkZWJ1ZyBhbmQKKwkgIGlkZW50aWZ5IGtlcm5lbCBwcm9ibGVtcy4KKworbWVudSAiTWVtb3J5IERlYnVnZ2luZyIKKworc291cmNlIG1tL0tjb25maWcuZGVidWcKKworY29uZmlnIERFQlVHX09CSkVDVFMKKwlib29sICJEZWJ1ZyBvYmplY3Qgb3BlcmF0aW9ucyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBhZGRpdGlvbmFsIGNvZGUgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZQorCSAga2VybmVsIHRvIHRyYWNrIHRoZSBsaWZlIHRpbWUgb2YgdmFyaW91cyBvYmplY3RzIGFuZCB2YWxpZGF0ZQorCSAgdGhlIG9wZXJhdGlvbnMgb24gdGhvc2Ugb2JqZWN0cy4KKworY29uZmlnIERFQlVHX09CSkVDVFNfU0VMRlRFU1QKKwlib29sICJEZWJ1ZyBvYmplY3RzIHNlbGZ0ZXN0IgorCWRlcGVuZHMgb24gREVCVUdfT0JKRUNUUworCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgc2VsZnRlc3Qgb2YgdGhlIG9iamVjdCBkZWJ1ZyBjb2RlLgorCitjb25maWcgREVCVUdfT0JKRUNUU19GUkVFCisJYm9vbCAiRGVidWcgb2JqZWN0cyBpbiBmcmVlZCBtZW1vcnkiCisJZGVwZW5kcyBvbiBERUJVR19PQkpFQ1RTCisJaGVscAorCSAgVGhpcyBlbmFibGVzIGNoZWNrcyB3aGV0aGVyIGEgay92IGZyZWUgb3BlcmF0aW9uIGZyZWVzIGFuIGFyZWEKKwkgIHdoaWNoIGNvbnRhaW5zIGFuIG9iamVjdCB3aGljaCBoYXMgbm90IGJlZW4gZGVhY3RpdmF0ZWQKKwkgIHByb3Blcmx5LiBUaGlzIGNhbiBtYWtlIGttYWxsb2Mva2ZyZWUtaW50ZW5zaXZlIHdvcmtsb2FkcworCSAgbXVjaCBzbG93ZXIuCisKK2NvbmZpZyBERUJVR19PQkpFQ1RTX1RJTUVSUworCWJvb2wgIkRlYnVnIHRpbWVyIG9iamVjdHMiCisJZGVwZW5kcyBvbiBERUJVR19PQkpFQ1RTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIGFkZGl0aW9uYWwgY29kZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlCisJICB0aW1lciByb3V0aW5lcyB0byB0cmFjayB0aGUgbGlmZSB0aW1lIG9mIHRpbWVyIG9iamVjdHMgYW5kCisJICB2YWxpZGF0ZSB0aGUgdGltZXIgb3BlcmF0aW9ucy4KKworY29uZmlnIERFQlVHX09CSkVDVFNfV09SSworCWJvb2wgIkRlYnVnIHdvcmsgb2JqZWN0cyIKKwlkZXBlbmRzIG9uIERFQlVHX09CSkVDVFMKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgYWRkaXRpb25hbCBjb2RlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUKKwkgIHdvcmsgcXVldWUgcm91dGluZXMgdG8gdHJhY2sgdGhlIGxpZmUgdGltZSBvZiB3b3JrIG9iamVjdHMgYW5kCisJICB2YWxpZGF0ZSB0aGUgd29yayBvcGVyYXRpb25zLgorCitjb25maWcgREVCVUdfT0JKRUNUU19SQ1VfSEVBRAorCWJvb2wgIkRlYnVnIFJDVSBjYWxsYmFja3Mgb2JqZWN0cyIKKwlkZXBlbmRzIG9uIERFQlVHX09CSkVDVFMKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byB0dXJuIG9uIGRlYnVnZ2luZyBvZiBSQ1UgbGlzdCBoZWFkcyAoY2FsbF9yY3UoKSB1c2FnZSkuCisKK2NvbmZpZyBERUJVR19PQkpFQ1RTX1BFUkNQVV9DT1VOVEVSCisJYm9vbCAiRGVidWcgcGVyY3B1IGNvdW50ZXIgb2JqZWN0cyIKKwlkZXBlbmRzIG9uIERFQlVHX09CSkVDVFMKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgYWRkaXRpb25hbCBjb2RlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGUKKwkgIHBlcmNwdSBjb3VudGVyIHJvdXRpbmVzIHRvIHRyYWNrIHRoZSBsaWZlIHRpbWUgb2YgcGVyY3B1IGNvdW50ZXIKKwkgIG9iamVjdHMgYW5kIHZhbGlkYXRlIHRoZSBwZXJjcHUgY291bnRlciBvcGVyYXRpb25zLgorCitjb25maWcgREVCVUdfT0JKRUNUU19FTkFCTEVfREVGQVVMVAorCWludCAiZGVidWdfb2JqZWN0cyBib290dXAgZGVmYXVsdCB2YWx1ZSAoMC0xKSIKKyAgICAgICAgcmFuZ2UgMCAxCisgICAgICAgIGRlZmF1bHQgIjEiCisgICAgICAgIGRlcGVuZHMgb24gREVCVUdfT0JKRUNUUworICAgICAgICBoZWxwCisgICAgICAgICAgRGVidWcgb2JqZWN0cyBib290IHBhcmFtZXRlciBkZWZhdWx0IHZhbHVlCisKK2NvbmZpZyBERUJVR19TTEFCCisJYm9vbCAiRGVidWcgc2xhYiBtZW1vcnkgYWxsb2NhdGlvbnMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgU0xBQgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaGF2ZSB0aGUga2VybmVsIGRvIGxpbWl0ZWQgdmVyaWZpY2F0aW9uIG9uIG1lbW9yeQorCSAgYWxsb2NhdGlvbiBhcyB3ZWxsIGFzIHBvaXNvbmluZyBtZW1vcnkgb24gZnJlZSB0byBjYXRjaCB1c2Ugb2YgZnJlZWQKKwkgIG1lbW9yeS4gVGhpcyBjYW4gbWFrZSBrbWFsbG9jL2tmcmVlLWludGVuc2l2ZSB3b3JrbG9hZHMgbXVjaCBzbG93ZXIuCisKK2NvbmZpZyBERUJVR19TTEFCX0xFQUsKKwlib29sICJNZW1vcnkgbGVhayBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBERUJVR19TTEFCCisKK2NvbmZpZyBTTFVCX0RFQlVHX09OCisJYm9vbCAiU0xVQiBkZWJ1Z2dpbmcgb24gYnkgZGVmYXVsdCIKKwlkZXBlbmRzIG9uIFNMVUIgJiYgU0xVQl9ERUJVRworCWRlZmF1bHQgbgorCWhlbHAKKwkgIEJvb3Qgd2l0aCBkZWJ1Z2dpbmcgb24gYnkgZGVmYXVsdC4gU0xVQiBib290cyBieSBkZWZhdWx0IHdpdGgKKwkgIHRoZSBydW50aW1lIGRlYnVnIGNhcGFiaWxpdGllcyBzd2l0Y2hlZCBvZmYuIEVuYWJsaW5nIHRoaXMgaXMKKwkgIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgInNsdWJfZGVidWciIHBhcmFtZXRlciBvbiBib290LgorCSAgVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgbW9yZSBmaW5lIGdyYWluZWQgZGVidWcgY29udHJvbCBsaWtlCisJICBwb3NzaWJsZSB3aXRoIHNsdWJfZGVidWc9eHh4LiBTTFVCIGRlYnVnZ2luZyBtYXkgYmUgc3dpdGNoZWQKKwkgIG9mZiBpbiBhIGtlcm5lbCBidWlsdCB3aXRoIENPTkZJR19TTFVCX0RFQlVHX09OIGJ5IHNwZWNpZnlpbmcKKwkgICJzbHViX2RlYnVnPS0iLgorCitjb25maWcgU0xVQl9TVEFUUworCWRlZmF1bHQgbgorCWJvb2wgIkVuYWJsZSBTTFVCIHBlcmZvcm1hbmNlIHN0YXRpc3RpY3MiCisJZGVwZW5kcyBvbiBTTFVCICYmIFNZU0ZTCisJaGVscAorCSAgU0xVQiBzdGF0aXN0aWNzIGFyZSB1c2VmdWwgdG8gZGVidWcgU0xVQnMgYWxsb2NhdGlvbiBiZWhhdmlvciBpbgorCSAgb3JkZXIgZmluZCB3YXlzIHRvIG9wdGltaXplIHRoZSBhbGxvY2F0b3IuIFRoaXMgc2hvdWxkIG5ldmVyIGJlCisJICBlbmFibGVkIGZvciBwcm9kdWN0aW9uIHVzZSBzaW5jZSBrZWVwaW5nIHN0YXRpc3RpY3Mgc2xvd3MgZG93bgorCSAgdGhlIGFsbG9jYXRvciBieSBhIGZldyBwZXJjZW50YWdlIHBvaW50cy4gVGhlIHNsYWJpbmZvIGNvbW1hbmQKKwkgIHN1cHBvcnRzIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSBtb3N0IGFjdGl2ZSBzbGFicyB0byBmaWd1cmUKKwkgIG91dCB3aGljaCBzbGFicyBhcmUgcmVsZXZhbnQgdG8gYSBwYXJ0aWN1bGFyIGxvYWQuCisJICBUcnkgcnVubmluZzogc2xhYmluZm8gLURBCisKK2NvbmZpZyBIQVZFX0RFQlVHX0tNRU1MRUFLCisJYm9vbAorCitjb25maWcgREVCVUdfS01FTUxFQUsKKwlib29sICJLZXJuZWwgbWVtb3J5IGxlYWsgZGV0ZWN0b3IiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgSEFWRV9ERUJVR19LTUVNTEVBSworCXNlbGVjdCBERUJVR19GUworCXNlbGVjdCBTVEFDS1RSQUNFIGlmIFNUQUNLVFJBQ0VfU1VQUE9SVAorCXNlbGVjdCBLQUxMU1lNUworCXNlbGVjdCBDUkMzMgorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoZSBtZW1vcnkgbGVhaworCSAgZGV0ZWN0b3IuIFRoZSBtZW1vcnkgYWxsb2NhdGlvbi9mcmVlaW5nIGlzIHRyYWNlZCBpbiBhIHdheQorCSAgc2ltaWxhciB0byB0aGUgQm9laG0ncyBjb25zZXJ2YXRpdmUgZ2FyYmFnZSBjb2xsZWN0b3IsIHRoZQorCSAgZGlmZmVyZW5jZSBiZWluZyB0aGF0IHRoZSBvcnBoYW4gb2JqZWN0cyBhcmUgbm90IGZyZWVkIGJ1dAorCSAgb25seSBzaG93biBpbiAvc3lzL2tlcm5lbC9kZWJ1Zy9rbWVtbGVhay4gRW5hYmxpbmcgdGhpcworCSAgZmVhdHVyZSB3aWxsIGludHJvZHVjZSBhbiBvdmVyaGVhZCB0byBtZW1vcnkKKwkgIGFsbG9jYXRpb25zLiBTZWUgRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva21lbWxlYWsucnN0IGZvciBtb3JlCisJICBkZXRhaWxzLgorCisJICBFbmFibGluZyBERUJVR19TTEFCIG9yIFNMVUJfREVCVUcgbWF5IGluY3JlYXNlIHRoZSBjaGFuY2VzCisJICBvZiBmaW5kaW5nIGxlYWtzIGR1ZSB0byB0aGUgc2xhYiBvYmplY3RzIHBvaXNvbmluZy4KKworCSAgSW4gb3JkZXIgdG8gYWNjZXNzIHRoZSBrbWVtbGVhayBmaWxlLCBkZWJ1Z2ZzIG5lZWRzIHRvIGJlCisJICBtb3VudGVkICh1c3VhbGx5IGF0IC9zeXMva2VybmVsL2RlYnVnKS4KKworY29uZmlnIERFQlVHX0tNRU1MRUFLX0VBUkxZX0xPR19TSVpFCisJaW50ICJNYXhpbXVtIGttZW1sZWFrIGVhcmx5IGxvZyBlbnRyaWVzIgorCWRlcGVuZHMgb24gREVCVUdfS01FTUxFQUsKKwlyYW5nZSAyMDAgNDAwMDAKKwlkZWZhdWx0IDE2MDAwCisJaGVscAorCSAgS21lbWxlYWsgbXVzdCB0cmFjayBhbGwgdGhlIG1lbW9yeSBhbGxvY2F0aW9ucyB0byBhdm9pZAorCSAgcmVwb3J0aW5nIGZhbHNlIHBvc2l0aXZlcy4gU2luY2UgbWVtb3J5IG1heSBiZSBhbGxvY2F0ZWQgb3IKKwkgIGZyZWVkIGJlZm9yZSBrbWVtbGVhayBpcyBpbml0aWFsaXNlZCwgYW4gZWFybHkgbG9nIGJ1ZmZlciBpcworCSAgdXNlZCB0byBzdG9yZSB0aGVzZSBhY3Rpb25zLiBJZiBrbWVtbGVhayByZXBvcnRzICJlYXJseSBsb2cKKwkgIGJ1ZmZlciBleGNlZWRlZCIsIHBsZWFzZSBpbmNyZWFzZSB0aGlzIHZhbHVlLgorCitjb25maWcgREVCVUdfS01FTUxFQUtfVEVTVAorCXRyaXN0YXRlICJTaW1wbGUgdGVzdCBmb3IgdGhlIGtlcm5lbCBtZW1vcnkgbGVhayBkZXRlY3RvciIKKwlkZXBlbmRzIG9uIERFQlVHX0tNRU1MRUFLICYmIG0KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGEgbW9kdWxlIHRoYXQgZXhwbGljaXRseSBsZWFrcyBtZW1vcnkuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBERUJVR19LTUVNTEVBS19ERUZBVUxUX09GRgorCWJvb2wgIkRlZmF1bHQga21lbWxlYWsgdG8gb2ZmIgorCWRlcGVuZHMgb24gREVCVUdfS01FTUxFQUsKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGRpc2FibGUga21lbWxlYWsgYnkgZGVmYXVsdC4gSXQgY2FuIHRoZW4gYmUgZW5hYmxlZAorCSAgb24gdGhlIGNvbW1hbmQgbGluZSB2aWEga21lbWxlYWs9b24uCisKK2NvbmZpZyBERUJVR19TVEFDS19VU0FHRQorCWJvb2wgIlN0YWNrIHV0aWxpemF0aW9uIGluc3RydW1lbnRhdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiAhSUE2NAorCWhlbHAKKwkgIEVuYWJsZXMgdGhlIGRpc3BsYXkgb2YgdGhlIG1pbmltdW0gYW1vdW50IG9mIGZyZWUgc3RhY2sgd2hpY2ggZWFjaAorCSAgdGFzayBoYXMgZXZlciBoYWQgYXZhaWxhYmxlIGluIHRoZSBzeXNycS1UIGFuZCBzeXNycS1QIGRlYnVnIG91dHB1dC4KKworCSAgVGhpcyBvcHRpb24gd2lsbCBzbG93IGRvd24gcHJvY2VzcyBjcmVhdGlvbiBzb21ld2hhdC4KKworY29uZmlnIERFQlVHX1ZNCisJYm9vbCAiRGVidWcgVk0iCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byB0dXJuIG9uIGV4dGVuZGVkIGNoZWNrcyBpbiB0aGUgdmlydHVhbC1tZW1vcnkgc3lzdGVtCisgICAgICAgICAgdGhhdCBtYXkgaW1wYWN0IHBlcmZvcm1hbmNlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfVk1fVk1BQ0FDSEUKKwlib29sICJEZWJ1ZyBWTUEgY2FjaGluZyIKKwlkZXBlbmRzIG9uIERFQlVHX1ZNCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gdHVybiBvbiBWTUEgY2FjaGluZyBkZWJ1ZyBpbmZvcm1hdGlvbi4gRG9pbmcgc28KKwkgIGNhbiBjYXVzZSBzaWduaWZpY2FudCBvdmVyaGVhZCwgc28gb25seSBlbmFibGUgaXQgaW4gbm9uLXByb2R1Y3Rpb24KKwkgIGVudmlyb25tZW50cy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFQlVHX1ZNX1JCCisJYm9vbCAiRGVidWcgVk0gcmVkLWJsYWNrIHRyZWVzIgorCWRlcGVuZHMgb24gREVCVUdfVk0KKwloZWxwCisJICBFbmFibGUgVk0gcmVkLWJsYWNrIHRyZWUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGFuZCBleHRyYSB2YWxpZGF0aW9ucy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFQlVHX1ZNX1BHRkxBR1MKKwlib29sICJEZWJ1ZyBwYWdlLWZsYWdzIG9wZXJhdGlvbnMiCisJZGVwZW5kcyBvbiBERUJVR19WTQorCWhlbHAKKwkgIEVuYWJsZXMgZXh0cmEgdmFsaWRhdGlvbiBvbiBwYWdlIGZsYWdzIG9wZXJhdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBBUkNIX0hBU19ERUJVR19WSVJUVUFMCisJYm9vbAorCitjb25maWcgREVCVUdfVklSVFVBTAorCWJvb2wgIkRlYnVnIFZNIHRyYW5zbGF0aW9ucyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBBUkNIX0hBU19ERUJVR19WSVJUVUFMCisJaGVscAorCSAgRW5hYmxlIHNvbWUgY29zdGx5IHNhbml0eSBjaGVja3MgaW4gdmlydHVhbCB0byBwYWdlIGNvZGUuIFRoaXMgY2FuCisJICBjYXRjaCBtaXN0YWtlcyB3aXRoIHZpcnRfdG9fcGFnZSgpIGFuZCBmcmllbmRzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfTk9NTVVfUkVHSU9OUworCWJvb2wgIkRlYnVnIHRoZSBnbG9iYWwgYW5vbi9wcml2YXRlIE5PTU1VIG1hcHBpbmcgcmVnaW9uIHRyZWUiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgIU1NVQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNhdXNlcyB0aGUgZ2xvYmFsIHRyZWUgb2YgYW5vbnltb3VzIGFuZCBwcml2YXRlIG1hcHBpbmcKKwkgIHJlZ2lvbnMgdG8gYmUgcmVndWxhcmx5IGNoZWNrZWQgZm9yIGludmFsaWQgdG9wb2xvZ3kuCisKK2NvbmZpZyBERUJVR19NRU1PUllfSU5JVAorCWJvb2wgIkRlYnVnIG1lbW9yeSBpbml0aWFsaXNhdGlvbiIgaWYgRVhQRVJUCisJZGVmYXVsdCAhRVhQRVJUCisJaGVscAorCSAgRW5hYmxlIHRoaXMgZm9yIGFkZGl0aW9uYWwgY2hlY2tzIGR1cmluZyBtZW1vcnkgaW5pdGlhbGlzYXRpb24uCisJICBUaGUgc2FuaXR5IGNoZWNrcyB2ZXJpZnkgYXNwZWN0cyBvZiB0aGUgVk0gc3VjaCBhcyB0aGUgbWVtb3J5IG1vZGVsCisJICBhbmQgb3RoZXIgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgdGhlIGFyY2hpdGVjdHVyZS4gVmVyYm9zZQorCSAgaW5mb3JtYXRpb24gd2lsbCBiZSBwcmludGVkIGF0IEtFUk5fREVCVUcgbG9nbGV2ZWwgZGVwZW5kaW5nCisJICBvbiB0aGUgbW1pbml0X2xvZ2xldmVsPSBjb21tYW5kLWxpbmUgb3B0aW9uLgorCisJICBJZiB1bnN1cmUsIHNheSBZCisKK2NvbmZpZyBNRU1PUllfTk9USUZJRVJfRVJST1JfSU5KRUNUCisJdHJpc3RhdGUgIk1lbW9yeSBob3RwbHVnIG5vdGlmaWVyIGVycm9yIGluamVjdGlvbiBtb2R1bGUiCisJZGVwZW5kcyBvbiBNRU1PUllfSE9UUExVR19TUEFSU0UgJiYgTk9USUZJRVJfRVJST1JfSU5KRUNUSU9OCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gaW5qZWN0IGFydGlmaWNpYWwgZXJyb3JzIHRvCisJICBtZW1vcnkgaG90cGx1ZyBub3RpZmllciBjaGFpbiBjYWxsYmFja3MuICBJdCBpcyBjb250cm9sbGVkIHRocm91Z2gKKwkgIGRlYnVnZnMgaW50ZXJmYWNlIHVuZGVyIC9zeXMva2VybmVsL2RlYnVnL25vdGlmaWVyLWVycm9yLWluamVjdC9tZW1vcnkKKworCSAgSWYgdGhlIG5vdGlmaWVyIGNhbGwgY2hhaW4gc2hvdWxkIGJlIGZhaWxlZCB3aXRoIHNvbWUgZXZlbnRzCisJICBub3RpZmllZCwgd3JpdGUgdGhlIGVycm9yIGNvZGUgdG8gImFjdGlvbnMvPG5vdGlmaWVyIGV2ZW50Pi9lcnJvciIuCisKKwkgIEV4YW1wbGU6IEluamVjdCBtZW1vcnkgaG90cGx1ZyBvZmZsaW5lIGVycm9yICgtMTIgPT0gLUVOT01FTSkKKworCSAgIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy9ub3RpZmllci1lcnJvci1pbmplY3QvbWVtb3J5CisJICAjIGVjaG8gLTEyID4gYWN0aW9ucy9NRU1fR09JTkdfT0ZGTElORS9lcnJvcgorCSAgIyBlY2hvIG9mZmxpbmUgPiAvc3lzL2RldmljZXMvc3lzdGVtL21lbW9yeS9tZW1vcnlYWFgvc3RhdGUKKwkgIGJhc2g6IGVjaG86IHdyaXRlIGVycm9yOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtZW1vcnktbm90aWZpZXItZXJyb3ItaW5qZWN0LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfUEVSX0NQVV9NQVBTCisJYm9vbCAiRGVidWcgYWNjZXNzIHRvIHBlcl9jcHUgbWFwcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlcGVuZHMgb24gU01QCisJaGVscAorCSAgU2F5IFkgdG8gdmVyaWZ5IHRoYXQgdGhlIHBlcl9jcHUgbWFwIGJlaW5nIGFjY2Vzc2VkIGhhcworCSAgYmVlbiBzZXQgdXAuIFRoaXMgYWRkcyBhIGZhaXIgYW1vdW50IG9mIGNvZGUgdG8ga2VybmVsIG1lbW9yeQorCSAgYW5kIGRlY3JlYXNlcyBwZXJmb3JtYW5jZS4KKworCSAgU2F5IE4gaWYgdW5zdXJlLgorCitjb25maWcgREVCVUdfSElHSE1FTQorCWJvb2wgIkhpZ2htZW0gZGVidWdnaW5nIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIEhJR0hNRU0KKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGFkZGl0aW9uYWwgZXJyb3IgY2hlY2tpbmcgZm9yIGhpZ2ggbWVtb3J5CisJICBzeXN0ZW1zLiAgRGlzYWJsZSBmb3IgcHJvZHVjdGlvbiBzeXN0ZW1zLgorCitjb25maWcgSEFWRV9ERUJVR19TVEFDS09WRVJGTE9XCisJYm9vbAorCitjb25maWcgREVCVUdfU1RBQ0tPVkVSRkxPVworCWJvb2wgIkNoZWNrIGZvciBzdGFjayBvdmVyZmxvd3MiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgSEFWRV9ERUJVR19TVEFDS09WRVJGTE9XCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byBjaGVjayBmb3Igb3ZlcmZsb3dzIG9mIGtlcm5lbCwgSVJRCisJICBhbmQgZXhjZXB0aW9uIHN0YWNrcyAoaWYgeW91ciBhcmNoaXRlY3R1cmUgdXNlcyB0aGVtKS4gVGhpcworCSAgb3B0aW9uIHdpbGwgc2hvdyBkZXRhaWxlZCBtZXNzYWdlcyBpZiBmcmVlIHN0YWNrIHNwYWNlIGRyb3BzCisJICBiZWxvdyBhIGNlcnRhaW4gbGltaXQuCisKKwkgIFRoZXNlIGtpbmRzIG9mIGJ1Z3MgdXN1YWxseSBvY2N1ciB3aGVuIGNhbGwtY2hhaW5zIGluIHRoZQorCSAga2VybmVsIGdldCB0b28gZGVlcCwgZXNwZWNpYWxseSB3aGVuIGludGVycnVwdHMgYXJlCisJICBpbnZvbHZlZC4KKworCSAgVXNlIHRoaXMgaW4gY2FzZXMgd2hlcmUgeW91IHNlZSBhcHBhcmVudGx5IHJhbmRvbSBtZW1vcnkKKwkgIGNvcnJ1cHRpb24sIGVzcGVjaWFsbHkgaWYgaXQgYXBwZWFycyBpbiAnc3RydWN0IHRocmVhZF9pbmZvJworCisJICBJZiBpbiBkb3VidCwgc2F5ICJOIi4KKworc291cmNlICJsaWIvS2NvbmZpZy5rYXNhbiIKKworZW5kbWVudSAjICJNZW1vcnkgRGVidWdnaW5nIgorCitjb25maWcgQVJDSF9IQVNfS0NPVgorCWJvb2wKKwloZWxwCisJICBLQ09WIGRvZXMgbm90IGhhdmUgYW55IGFyY2gtc3BlY2lmaWMgY29kZSwgYnV0IGN1cnJlbnRseSBpdCBpcyBlbmFibGVkCisJICBvbmx5IGZvciB4ODZfNjQuIEtDT1YgcmVxdWlyZXMgdGVzdGluZyBvbiBvdGhlciBhcmNocywgYW5kIG1vc3QgbGlrZWx5CisJICBkaXNhYmxpbmcgb2YgaW5zdHJ1bWVudGF0aW9uIGZvciBzb21lIGVhcmx5IGJvb3QgY29kZS4KKworY29uZmlnIEtDT1YKKwlib29sICJDb2RlIGNvdmVyYWdlIGZvciBmdXp6aW5nIgorCWRlcGVuZHMgb24gQVJDSF9IQVNfS0NPVgorCXNlbGVjdCBERUJVR19GUworCXNlbGVjdCBHQ0NfUExVR0lOUyBpZiAhQ09NUElMRV9URVNUCisJc2VsZWN0IEdDQ19QTFVHSU5fU0FOQ09WIGlmICFDT01QSUxFX1RFU1QKKwloZWxwCisJICBLQ09WIGV4cG9zZXMga2VybmVsIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gaW4gYSBmb3JtIHN1aXRhYmxlCisJICBmb3IgY292ZXJhZ2UtZ3VpZGVkIGZ1enppbmcgKHJhbmRvbWl6ZWQgdGVzdGluZykuCisKKwkgIElmIFJBTkRPTUlaRV9CQVNFIGlzIGVuYWJsZWQsIFBDIHZhbHVlcyB3aWxsIG5vdCBiZSBzdGFibGUgYWNyb3NzCisJICBkaWZmZXJlbnQgbWFjaGluZXMgYW5kIGFjcm9zcyByZWJvb3RzLiBJZiB5b3UgbmVlZCBzdGFibGUgUEMgdmFsdWVzLAorCSAgZGlzYWJsZSBSQU5ET01JWkVfQkFTRS4KKworCSAgRm9yIG1vcmUgZGV0YWlscywgc2VlIERvY3VtZW50YXRpb24vZGV2LXRvb2xzL2tjb3YucnN0LgorCitjb25maWcgS0NPVl9JTlNUUlVNRU5UX0FMTAorCWJvb2wgIkluc3RydW1lbnQgYWxsIGNvZGUgYnkgZGVmYXVsdCIKKwlkZXBlbmRzIG9uIEtDT1YKKwlkZWZhdWx0IHkgaWYgS0NPVgorCWhlbHAKKwkgIElmIHlvdSBhcmUgZG9pbmcgZ2VuZXJpYyBzeXN0ZW0gY2FsbCBmdXp6aW5nIChsaWtlIGUuZy4gc3l6a2FsbGVyKSwKKwkgIHRoZW4geW91IHdpbGwgd2FudCB0byBpbnN0cnVtZW50IHRoZSB3aG9sZSBrZXJuZWwgYW5kIHlvdSBzaG91bGQKKwkgIHNheSB5IGhlcmUuIElmIHlvdSBhcmUgZG9pbmcgbW9yZSB0YXJnZXRlZCBmdXp6aW5nIChsaWtlIGUuZy4KKwkgIGZpbGVzeXN0ZW0gZnV6emluZyB3aXRoIEFGTCkgdGhlbiB5b3Ugd2lsbCB3YW50IHRvIGVuYWJsZSBjb3ZlcmFnZQorCSAgZm9yIG1vcmUgc3BlY2lmaWMgc3Vic2V0cyBvZiBmaWxlcywgYW5kIHNob3VsZCBzYXkgbiBoZXJlLgorCitjb25maWcgREVCVUdfU0hJUlEKKwlib29sICJEZWJ1ZyBzaGFyZWQgSVJRIGhhbmRsZXJzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gZ2VuZXJhdGUgYSBzcHVyaW91cyBpbnRlcnJ1cHQgYXMgc29vbiBhcyBhIHNoYXJlZAorCSAgaW50ZXJydXB0IGhhbmRsZXIgaXMgcmVnaXN0ZXJlZCwgYW5kIGp1c3QgYmVmb3JlIG9uZSBpcyBkZXJlZ2lzdGVyZWQuCisJICBEcml2ZXJzIG91Z2h0IHRvIGJlIGFibGUgdG8gaGFuZGxlIGludGVycnVwdHMgY29taW5nIGluIGF0IHRob3NlCisJICBwb2ludHM7IHNvbWUgZG9uJ3QgYW5kIG5lZWQgdG8gYmUgY2F1Z2h0LgorCittZW51ICJEZWJ1ZyBMb2NrdXBzIGFuZCBIYW5ncyIKKworY29uZmlnIExPQ0tVUF9ERVRFQ1RPUgorCWJvb2wKKworY29uZmlnIFNPRlRMT0NLVVBfREVURUNUT1IKKwlib29sICJEZXRlY3QgU29mdCBMb2NrdXBzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTMzkwCisJc2VsZWN0IExPQ0tVUF9ERVRFQ1RPUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gYWN0IGFzIGEgd2F0Y2hkb2cgdG8gZGV0ZWN0CisJICBzb2Z0IGxvY2t1cHMuCisKKwkgIFNvZnRsb2NrdXBzIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIGtlcm5lbCB0byBsb29wIGluIGtlcm5lbAorCSAgbW9kZSBmb3IgbW9yZSB0aGFuIDIwIHNlY29uZHMsIHdpdGhvdXQgZ2l2aW5nIG90aGVyIHRhc2tzIGEKKwkgIGNoYW5jZSB0byBydW4uICBUaGUgY3VycmVudCBzdGFjayB0cmFjZSBpcyBkaXNwbGF5ZWQgdXBvbgorCSAgZGV0ZWN0aW9uIGFuZCB0aGUgc3lzdGVtIHdpbGwgc3RheSBsb2NrZWQgdXAuCisKK2NvbmZpZyBIQVJETE9DS1VQX0RFVEVDVE9SX1BFUkYKKwlib29sCisJc2VsZWN0IFNPRlRMT0NLVVBfREVURUNUT1IKKworIworIyBFbmFibGVzIGEgdGltZXN0YW1wIGJhc2VkIGxvdyBwYXNzIGZpbHRlciB0byBjb21wZW5zYXRlIGZvciBwZXJmIGJhc2VkCisjIGhhcmQgbG9ja3VwIGRldGVjdGlvbiB3aGljaCBydW5zIHRvbyBmYXN0IGR1ZSB0byB0dXJibyBtb2Rlcy4KKyMKK2NvbmZpZyBIQVJETE9DS1VQX0NIRUNLX1RJTUVTVEFNUAorCWJvb2wKKworIworIyBhcmNoLyBjYW4gZGVmaW5lIEhBVkVfSEFSRExPQ0tVUF9ERVRFQ1RPUl9BUkNIIHRvIHByb3ZpZGUgdGhlaXIgb3duIGhhcmQKKyMgbG9ja3VwIGRldGVjdG9yIHJhdGhlciB0aGFuIHRoZSBwZXJmIGJhc2VkIGRldGVjdG9yLgorIworY29uZmlnIEhBUkRMT0NLVVBfREVURUNUT1IKKwlib29sICJEZXRlY3QgSGFyZCBMb2NrdXBzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmICFTMzkwCisJZGVwZW5kcyBvbiBIQVZFX0hBUkRMT0NLVVBfREVURUNUT1JfUEVSRiB8fCBIQVZFX0hBUkRMT0NLVVBfREVURUNUT1JfQVJDSAorCXNlbGVjdCBMT0NLVVBfREVURUNUT1IKKwlzZWxlY3QgSEFSRExPQ0tVUF9ERVRFQ1RPUl9QRVJGIGlmIEhBVkVfSEFSRExPQ0tVUF9ERVRFQ1RPUl9QRVJGCisJc2VsZWN0IEhBUkRMT0NLVVBfREVURUNUT1JfQVJDSCBpZiBIQVZFX0hBUkRMT0NLVVBfREVURUNUT1JfQVJDSAorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gYWN0IGFzIGEgd2F0Y2hkb2cgdG8gZGV0ZWN0CisJICBoYXJkIGxvY2t1cHMuCisKKwkgIEhhcmRsb2NrdXBzIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIENQVSB0byBsb29wIGluIGtlcm5lbCBtb2RlCisJICBmb3IgbW9yZSB0aGFuIDEwIHNlY29uZHMsIHdpdGhvdXQgbGV0dGluZyBvdGhlciBpbnRlcnJ1cHRzIGhhdmUgYQorCSAgY2hhbmNlIHRvIHJ1bi4gIFRoZSBjdXJyZW50IHN0YWNrIHRyYWNlIGlzIGRpc3BsYXllZCB1cG9uIGRldGVjdGlvbgorCSAgYW5kIHRoZSBzeXN0ZW0gd2lsbCBzdGF5IGxvY2tlZCB1cC4KKworY29uZmlnIEJPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDCisJYm9vbCAiUGFuaWMgKFJlYm9vdCkgT24gSGFyZCBMb2NrdXBzIgorCWRlcGVuZHMgb24gSEFSRExPQ0tVUF9ERVRFQ1RPUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gcGFuaWMgb24gImhhcmQgbG9ja3VwcyIsCisJICB3aGljaCBhcmUgYnVncyB0aGF0IGNhdXNlIHRoZSBrZXJuZWwgdG8gbG9vcCBpbiBrZXJuZWwKKwkgIG1vZGUgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGZvciBtb3JlIHRoYW4gMTAgc2Vjb25kcyAoY29uZmlndXJhYmxlCisJICB1c2luZyB0aGUgd2F0Y2hkb2dfdGhyZXNoIHN5c2N0bCkuCisKKwkgIFNheSBOIGlmIHVuc3VyZS4KKworY29uZmlnIEJPT1RQQVJBTV9IQVJETE9DS1VQX1BBTklDX1ZBTFVFCisJaW50CisJZGVwZW5kcyBvbiBIQVJETE9DS1VQX0RFVEVDVE9SCisJcmFuZ2UgMCAxCisJZGVmYXVsdCAwIGlmICFCT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQworCWRlZmF1bHQgMSBpZiBCT09UUEFSQU1fSEFSRExPQ0tVUF9QQU5JQworCitjb25maWcgQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMKKwlib29sICJQYW5pYyAoUmVib290KSBPbiBTb2Z0IExvY2t1cHMiCisJZGVwZW5kcyBvbiBTT0ZUTE9DS1VQX0RFVEVDVE9SCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGtlcm5lbCB0byBwYW5pYyBvbiAic29mdCBsb2NrdXBzIiwKKwkgIHdoaWNoIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIGtlcm5lbCB0byBsb29wIGluIGtlcm5lbAorCSAgbW9kZSBmb3IgbW9yZSB0aGFuIDIwIHNlY29uZHMgKGNvbmZpZ3VyYWJsZSB1c2luZyB0aGUgd2F0Y2hkb2dfdGhyZXNoCisJICBzeXNjdGwpLCB3aXRob3V0IGdpdmluZyBvdGhlciB0YXNrcyBhIGNoYW5jZSB0byBydW4uCisKKwkgIFRoZSBwYW5pYyBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHBhbmljX3RpbWVvdXQsCisJICB0byBjYXVzZSB0aGUgc3lzdGVtIHRvIHJlYm9vdCBhdXRvbWF0aWNhbGx5IGFmdGVyIGEKKwkgIGxvY2t1cCBoYXMgYmVlbiBkZXRlY3RlZC4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKKwkgIGhpZ2gtYXZhaWxhYmlsaXR5IHN5c3RlbXMgdGhhdCBoYXZlIHVwdGltZSBndWFyYW50ZWVzIGFuZAorCSAgd2hlcmUgYSBsb2NrdXAgbXVzdCBiZSByZXNvbHZlZCBBU0FQLgorCisJICBTYXkgTiBpZiB1bnN1cmUuCisKK2NvbmZpZyBCT09UUEFSQU1fU09GVExPQ0tVUF9QQU5JQ19WQUxVRQorCWludAorCWRlcGVuZHMgb24gU09GVExPQ0tVUF9ERVRFQ1RPUgorCXJhbmdlIDAgMQorCWRlZmF1bHQgMCBpZiAhQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMKKwlkZWZhdWx0IDEgaWYgQk9PVFBBUkFNX1NPRlRMT0NLVVBfUEFOSUMKKworY29uZmlnIERFVEVDVF9IVU5HX1RBU0sKKwlib29sICJEZXRlY3QgSHVuZyBUYXNrcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlZmF1bHQgU09GVExPQ0tVUF9ERVRFQ1RPUgorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gZW5hYmxlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0ICJodW5nIHRhc2tzIiwKKwkgIHdoaWNoIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIHRhc2sgdG8gYmUgc3R1Y2sgaW4KKwkgIHVuaW50ZXJydXB0aWJsZSAiRCIgc3RhdGUgaW5kZWZpbml0ZWx5LgorCisJICBXaGVuIGEgaHVuZyB0YXNrIGlzIGRldGVjdGVkLCB0aGUga2VybmVsIHdpbGwgcHJpbnQgdGhlCisJICBjdXJyZW50IHN0YWNrIHRyYWNlICh3aGljaCB5b3Ugc2hvdWxkIHJlcG9ydCksIGJ1dCB0aGUKKwkgIHRhc2sgd2lsbCBzdGF5IGluIHVuaW50ZXJydXB0aWJsZSBzdGF0ZS4gSWYgbG9ja2RlcCBpcworCSAgZW5hYmxlZCB0aGVuIGFsbCBoZWxkIGxvY2tzIHdpbGwgYWxzbyBiZSByZXBvcnRlZC4gVGhpcworCSAgZmVhdHVyZSBoYXMgbmVnbGlnaWJsZSBvdmVyaGVhZC4KKworY29uZmlnIERFRkFVTFRfSFVOR19UQVNLX1RJTUVPVVQKKwlpbnQgIkRlZmF1bHQgdGltZW91dCBmb3IgaHVuZyB0YXNrIGRldGVjdGlvbiAoaW4gc2Vjb25kcykiCisJZGVwZW5kcyBvbiBERVRFQ1RfSFVOR19UQVNLCisJZGVmYXVsdCAxMjAKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjb250cm9scyB0aGUgZGVmYXVsdCB0aW1lb3V0IChpbiBzZWNvbmRzKSB1c2VkCisJICB0byBkZXRlcm1pbmUgd2hlbiBhIHRhc2sgaGFzIGJlY29tZSBub24tcmVzcG9uc2l2ZSBhbmQgc2hvdWxkCisJICBiZSBjb25zaWRlcmVkIGh1bmcuCisKKwkgIEl0IGNhbiBiZSBhZGp1c3RlZCBhdCBydW50aW1lIHZpYSB0aGUga2VybmVsLmh1bmdfdGFza190aW1lb3V0X3NlY3MKKwkgIHN5c2N0bCBvciBieSB3cml0aW5nIGEgdmFsdWUgdG8KKwkgIC9wcm9jL3N5cy9rZXJuZWwvaHVuZ190YXNrX3RpbWVvdXRfc2Vjcy4KKworCSAgQSB0aW1lb3V0IG9mIDAgZGlzYWJsZXMgdGhlIGNoZWNrLiAgVGhlIGRlZmF1bHQgaXMgdHdvIG1pbnV0ZXMuCisJICBLZWVwaW5nIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBmaW5lIGluIG1vc3QgY2FzZXMuCisKK2NvbmZpZyBCT09UUEFSQU1fSFVOR19UQVNLX1BBTklDCisJYm9vbCAiUGFuaWMgKFJlYm9vdCkgT24gSHVuZyBUYXNrcyIKKwlkZXBlbmRzIG9uIERFVEVDVF9IVU5HX1RBU0sKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUga2VybmVsIHRvIHBhbmljIG9uICJodW5nIHRhc2tzIiwKKwkgIHdoaWNoIGFyZSBidWdzIHRoYXQgY2F1c2UgdGhlIGtlcm5lbCB0byBsZWF2ZSBhIHRhc2sgc3R1Y2sKKwkgIGluIHVuaW50ZXJydXB0aWJsZSAiRCIgc3RhdGUuCisKKwkgIFRoZSBwYW5pYyBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHBhbmljX3RpbWVvdXQsCisJICB0byBjYXVzZSB0aGUgc3lzdGVtIHRvIHJlYm9vdCBhdXRvbWF0aWNhbGx5IGFmdGVyIGEKKwkgIGh1bmcgdGFzayBoYXMgYmVlbiBkZXRlY3RlZC4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCBmb3IKKwkgIGhpZ2gtYXZhaWxhYmlsaXR5IHN5c3RlbXMgdGhhdCBoYXZlIHVwdGltZSBndWFyYW50ZWVzIGFuZAorCSAgd2hlcmUgYSBodW5nIHRhc2tzIG11c3QgYmUgcmVzb2x2ZWQgQVNBUC4KKworCSAgU2F5IE4gaWYgdW5zdXJlLgorCitjb25maWcgQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQ19WQUxVRQorCWludAorCWRlcGVuZHMgb24gREVURUNUX0hVTkdfVEFTSworCXJhbmdlIDAgMQorCWRlZmF1bHQgMCBpZiAhQk9PVFBBUkFNX0hVTkdfVEFTS19QQU5JQworCWRlZmF1bHQgMSBpZiBCT09UUEFSQU1fSFVOR19UQVNLX1BBTklDCisKK2NvbmZpZyBXUV9XQVRDSERPRworCWJvb2wgIkRldGVjdCBXb3JrcXVldWUgU3RhbGxzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc3RhbGwgZGV0ZWN0aW9uIG9uIHdvcmtxdWV1ZXMuICBJZiBhCisJICB3b3JrZXIgcG9vbCBkb2Vzbid0IG1ha2UgZm9yd2FyZCBwcm9ncmVzcyBvbiBhIHBlbmRpbmcgd29yaworCSAgaXRlbSBmb3Igb3ZlciBhIGdpdmVuIGFtb3VudCBvZiB0aW1lLCAzMHMgYnkgZGVmYXVsdCwgYQorCSAgd2FybmluZyBtZXNzYWdlIGlzIHByaW50ZWQgYWxvbmcgd2l0aCBkdW1wIG9mIHdvcmtxdWV1ZQorCSAgc3RhdGUuICBUaGlzIGNhbiBiZSBjb25maWd1cmVkIHRocm91Z2gga2VybmVsIHBhcmFtZXRlcgorCSAgIndvcmtxdWV1ZS53YXRjaGRvZ190aHJlc2giIGFuZCBpdHMgc3lzZnMgY291bnRlcnBhcnQuCisKK2VuZG1lbnUgIyAiRGVidWcgbG9ja3VwcyBhbmQgaGFuZ3MiCisKK2NvbmZpZyBQQU5JQ19PTl9PT1BTCisJYm9vbCAiUGFuaWMgb24gT29wcyIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSB0aGUga2VybmVsIHRvIHBhbmljIHdoZW4gaXQgb29wc2VzLiBUaGlzCisJICBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHNldHRpbmcgb29wcz1wYW5pYyBvbiB0aGUga2VybmVsIGNvbW1hbmQKKwkgIGxpbmUuCisKKwkgIFRoaXMgZmVhdHVyZSBpcyB1c2VmdWwgdG8gZW5zdXJlIHRoYXQgdGhlIGtlcm5lbCBkb2VzIG5vdCBkbworCSAgYW55dGhpbmcgZXJyb25lb3VzIGFmdGVyIGFuIG9vcHMgd2hpY2ggY291bGQgcmVzdWx0IGluIGRhdGEKKwkgIGNvcnJ1cHRpb24gb3Igb3RoZXIgaXNzdWVzLgorCisJICBTYXkgTiBpZiB1bnN1cmUuCisKK2NvbmZpZyBQQU5JQ19PTl9PT1BTX1ZBTFVFCisJaW50CisJcmFuZ2UgMCAxCisJZGVmYXVsdCAwIGlmICFQQU5JQ19PTl9PT1BTCisJZGVmYXVsdCAxIGlmIFBBTklDX09OX09PUFMKKworY29uZmlnIFBBTklDX1RJTUVPVVQKKwlpbnQgInBhbmljIHRpbWVvdXQiCisJZGVmYXVsdCAwCisJaGVscAorCSAgU2V0IHRoZSB0aW1lb3V0IHZhbHVlIChpbiBzZWNvbmRzKSB1bnRpbCBhIHJlYm9vdCBvY2N1cnMgd2hlbiB0aGUKKwkgIHRoZSBrZXJuZWwgcGFuaWNzLiBJZiBuID0gMCwgdGhlbiB3ZSB3YWl0IGZvcmV2ZXIuIEEgdGltZW91dAorCSAgdmFsdWUgbiA+IDAgd2lsbCB3YWl0IG4gc2Vjb25kcyBiZWZvcmUgcmVib290aW5nLCB3aGlsZSBhIHRpbWVvdXQKKwkgIHZhbHVlIG4gPCAwIHdpbGwgcmVib290IGltbWVkaWF0ZWx5LgorCitjb25maWcgU0NIRURfREVCVUcKKwlib29sICJDb2xsZWN0IHNjaGVkdWxlciBkZWJ1Z2dpbmcgaW5mbyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUk9DX0ZTCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSAvcHJvYy9zY2hlZF9kZWJ1ZyBmaWxlIHdpbGwgYmUgcHJvdmlkZWQKKwkgIHRoYXQgY2FuIGhlbHAgZGVidWcgdGhlIHNjaGVkdWxlci4gVGhlIHJ1bnRpbWUgb3ZlcmhlYWQgb2YgdGhpcworCSAgb3B0aW9uIGlzIG1pbmltYWwuCisKK2NvbmZpZyBTQ0hFRF9JTkZPCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgU0NIRURTVEFUUworCWJvb2wgIkNvbGxlY3Qgc2NoZWR1bGVyIHN0YXRpc3RpY3MiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgUFJPQ19GUworCXNlbGVjdCBTQ0hFRF9JTkZPCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIGFkZGl0aW9uYWwgY29kZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlCisJICBzY2hlZHVsZXIgYW5kIHJlbGF0ZWQgcm91dGluZXMgdG8gY29sbGVjdCBzdGF0aXN0aWNzIGFib3V0CisJICBzY2hlZHVsZXIgYmVoYXZpb3IgYW5kIHByb3ZpZGUgdGhlbSBpbiAvcHJvYy9zY2hlZHN0YXQuICBUaGVzZQorCSAgc3RhdHMgbWF5IGJlIHVzZWZ1bCBmb3IgYm90aCB0dW5pbmcgYW5kIGRlYnVnZ2luZyB0aGUgc2NoZWR1bGVyCisJICBJZiB5b3UgYXJlbid0IGRlYnVnZ2luZyB0aGUgc2NoZWR1bGVyIG9yIHRyeWluZyB0byB0dW5lIGEgc3BlY2lmaWMKKwkgIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHNheSBOIHRvIGF2b2lkIHRoZSB2ZXJ5IHNsaWdodCBvdmVyaGVhZAorCSAgdGhpcyBhZGRzLgorCitjb25maWcgU0NIRURfU1RBQ0tfRU5EX0NIRUNLCisJYm9vbCAiRGV0ZWN0IHN0YWNrIGNvcnJ1cHRpb24gb24gY2FsbHMgdG8gc2NoZWR1bGUoKSIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNoZWNrcyBmb3IgYSBzdGFjayBvdmVycnVuIG9uIGNhbGxzIHRvIHNjaGVkdWxlKCkuCisJICBJZiB0aGUgc3RhY2sgZW5kIGxvY2F0aW9uIGlzIGZvdW5kIHRvIGJlIG92ZXIgd3JpdHRlbiBhbHdheXMgcGFuaWMgYXMKKwkgIHRoZSBjb250ZW50IG9mIHRoZSBjb3JydXB0ZWQgcmVnaW9uIGNhbiBubyBsb25nZXIgYmUgdHJ1c3RlZC4KKwkgIFRoaXMgaXMgdG8gZW5zdXJlIG5vIGVycm9uZW91cyBiZWhhdmlvdXIgb2NjdXJzIHdoaWNoIGNvdWxkIHJlc3VsdCBpbgorCSAgZGF0YSBjb3JydXB0aW9uIG9yIGEgc3BvcmFkaWMgY3Jhc2ggYXQgYSBsYXRlciBzdGFnZSBvbmNlIHRoZSByZWdpb24KKwkgIGlzIGV4YW1pbmVkLiBUaGUgcnVudGltZSBvdmVyaGVhZCBpbnRyb2R1Y2VkIGlzIG1pbmltYWwuCisKK2NvbmZpZyBERUJVR19USU1FS0VFUElORworCWJvb2wgIkVuYWJsZSBleHRyYSB0aW1la2VlcGluZyBzYW5pdHkgY2hlY2tpbmciCisJaGVscAorCSAgVGhpcyBvcHRpb24gd2lsbCBlbmFibGUgYWRkaXRpb25hbCB0aW1la2VlcGluZyBzYW5pdHkgY2hlY2tzCisJICB3aGljaCBtYXkgYmUgaGVscGZ1bCB3aGVuIGRpYWdub3NpbmcgaXNzdWVzIHdoZXJlIHRpbWVrZWVwaW5nCisJICBwcm9ibGVtcyBhcmUgc3VzcGVjdGVkLgorCisJICBUaGlzIG1heSBpbmNsdWRlIGNoZWNrcyBpbiB0aGUgdGltZWtlZXBpbmcgaG90cGF0aHMsIHNvIHRoaXMKKwkgIG9wdGlvbiBtYXkgaGF2ZSBhICh2ZXJ5IHNtYWxsKSBwZXJmb3JtYW5jZSBpbXBhY3QgdG8gc29tZQorCSAgd29ya2xvYWRzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfUFJFRU1QVAorCWJvb2wgIkRlYnVnIHByZWVtcHRpYmxlIGtlcm5lbCIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUkVFTVBUICYmIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSB0aGVuIHRoZSBrZXJuZWwgd2lsbCB1c2UgYSBkZWJ1ZyB2YXJpYW50IG9mIHRoZQorCSAgY29tbW9ubHkgdXNlZCBzbXBfcHJvY2Vzc29yX2lkKCkgZnVuY3Rpb24gYW5kIHdpbGwgcHJpbnQgd2FybmluZ3MKKwkgIGlmIGtlcm5lbCBjb2RlIHVzZXMgaXQgaW4gYSBwcmVlbXB0aW9uLXVuc2FmZSB3YXkuIEFsc28sIHRoZSBrZXJuZWwKKwkgIHdpbGwgZGV0ZWN0IHByZWVtcHRpb24gY291bnQgdW5kZXJmbG93cy4KKworbWVudSAiTG9jayBEZWJ1Z2dpbmcgKHNwaW5sb2NrcywgbXV0ZXhlcywgZXRjLi4uKSIKKworY29uZmlnIERFQlVHX1JUX01VVEVYRVMKKwlib29sICJSVCBNdXRleCBkZWJ1Z2dpbmcsIGRlYWRsb2NrIGRldGVjdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBSVF9NVVRFWEVTCisJaGVscAorCSBUaGlzIGFsbG93cyBydCBtdXRleCBzZW1hbnRpY3MgdmlvbGF0aW9ucyBhbmQgcnQgbXV0ZXggcmVsYXRlZAorCSBkZWFkbG9ja3MgKGxvY2t1cHMpIHRvIGJlIGRldGVjdGVkIGFuZCByZXBvcnRlZCBhdXRvbWF0aWNhbGx5LgorCitjb25maWcgREVCVUdfU1BJTkxPQ0sKKwlib29sICJTcGlubG9jayBhbmQgcnctbG9jayBkZWJ1Z2dpbmc6IGJhc2ljIGNoZWNrcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCXNlbGVjdCBVTklOTElORV9TUElOX1VOTE9DSworCWhlbHAKKwkgIFNheSBZIGhlcmUgYW5kIGJ1aWxkIFNNUCB0byBjYXRjaCBtaXNzaW5nIHNwaW5sb2NrIGluaXRpYWxpemF0aW9uCisJICBhbmQgY2VydGFpbiBvdGhlciBraW5kcyBvZiBzcGlubG9jayBlcnJvcnMgY29tbW9ubHkgbWFkZS4gIFRoaXMgaXMKKwkgIGJlc3QgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBOTUkgd2F0Y2hkb2cgc28gdGhhdCBzcGlubG9jaworCSAgZGVhZGxvY2tzIGFyZSBhbHNvIGRlYnVnZ2FibGUuCisKK2NvbmZpZyBERUJVR19NVVRFWEVTCisJYm9vbCAiTXV0ZXggZGVidWdnaW5nOiBiYXNpYyBjaGVja3MiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJIFRoaXMgZmVhdHVyZSBhbGxvd3MgbXV0ZXggc2VtYW50aWNzIHZpb2xhdGlvbnMgdG8gYmUgZGV0ZWN0ZWQgYW5kCisJIHJlcG9ydGVkLgorCitjb25maWcgREVCVUdfV1dfTVVURVhfU0xPV1BBVEgKKwlib29sICJXYWl0L3dvdW5kIG11dGV4IGRlYnVnZ2luZzogU2xvd3BhdGggdGVzdGluZyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBUUkFDRV9JUlFGTEFHU19TVVBQT1JUICYmIFNUQUNLVFJBQ0VfU1VQUE9SVCAmJiBMT0NLREVQX1NVUFBPUlQKKwlzZWxlY3QgREVCVUdfTE9DS19BTExPQworCXNlbGVjdCBERUJVR19TUElOTE9DSworCXNlbGVjdCBERUJVR19NVVRFWEVTCisJaGVscAorCSBUaGlzIGZlYXR1cmUgZW5hYmxlcyBzbG93cGF0aCB0ZXN0aW5nIGZvciB3L3cgbXV0ZXggdXNlcnMgYnkKKwkgaW5qZWN0aW5nIGFkZGl0aW9uYWwgLUVERUFETEsgd291bmQvYmFja29mZiBjYXNlcy4gVG9nZXRoZXIgd2l0aAorCSB0aGUgZnVsbCBtdXRleCBjaGVja3MgZW5hYmxlZCB3aXRoIChDT05GSUdfUFJPVkVfTE9DS0lORykgdGhpcworCSB3aWxsIHRlc3QgYWxsIHBvc3NpYmxlIHcvdyBtdXRleCBpbnRlcmZhY2UgYWJ1c2Ugd2l0aCB0aGUKKwkgZXhjZXB0aW9uIG9mIHNpbXBseSBub3QgYWNxdWlyaW5nIGFsbCB0aGUgcmVxdWlyZWQgbG9ja3MuCisJIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgY2FuIGludHJvZHVjZSBzaWduaWZpY2FudCBvdmVyaGVhZCwgc28KKwkgaXQgcmVhbGx5IHNob3VsZCBub3QgYmUgZW5hYmxlZCBpbiBhIHByb2R1Y3Rpb24gb3IgZGlzdHJvIGtlcm5lbCwKKwkgZXZlbiBhIGRlYnVnIGtlcm5lbC4gIElmIHlvdSBhcmUgYSBkcml2ZXIgd3JpdGVyLCBlbmFibGUgaXQuICBJZgorCSB5b3UgYXJlIGEgZGlzdHJvLCBkbyBub3QuCisKK2NvbmZpZyBERUJVR19MT0NLX0FMTE9DCisJYm9vbCAiTG9jayBkZWJ1Z2dpbmc6IGRldGVjdCBpbmNvcnJlY3QgZnJlZWluZyBvZiBsaXZlIGxvY2tzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQgJiYgU1RBQ0tUUkFDRV9TVVBQT1JUICYmIExPQ0tERVBfU1VQUE9SVAorCXNlbGVjdCBERUJVR19TUElOTE9DSworCXNlbGVjdCBERUJVR19NVVRFWEVTCisJc2VsZWN0IERFQlVHX1JUX01VVEVYRVMgaWYgUlRfTVVURVhFUworCXNlbGVjdCBMT0NLREVQCisJaGVscAorCSBUaGlzIGZlYXR1cmUgd2lsbCBjaGVjayB3aGV0aGVyIGFueSBoZWxkIGxvY2sgKHNwaW5sb2NrLCByd2xvY2ssCisJIG11dGV4IG9yIHJ3c2VtKSBpcyBpbmNvcnJlY3RseSBmcmVlZCBieSB0aGUga2VybmVsLCB2aWEgYW55IG9mIHRoZQorCSBtZW1vcnktZnJlZWluZyByb3V0aW5lcyAoa2ZyZWUoKSwga21lbV9jYWNoZV9mcmVlKCksIGZyZWVfcGFnZXMoKSwKKwkgdmZyZWUoKSwgZXRjLiksIHdoZXRoZXIgYSBsaXZlIGxvY2sgaXMgaW5jb3JyZWN0bHkgcmVpbml0aWFsaXplZCB2aWEKKwkgc3Bpbl9sb2NrX2luaXQoKS9tdXRleF9pbml0KCkvZXRjLiwgb3Igd2hldGhlciB0aGVyZSBpcyBhbnkgbG9jaworCSBoZWxkIGR1cmluZyB0YXNrIGV4aXQuCisKK2NvbmZpZyBQUk9WRV9MT0NLSU5HCisJYm9vbCAiTG9jayBkZWJ1Z2dpbmc6IHByb3ZlIGxvY2tpbmcgY29ycmVjdG5lc3MiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVCAmJiBTVEFDS1RSQUNFX1NVUFBPUlQgJiYgTE9DS0RFUF9TVVBQT1JUCisJc2VsZWN0IExPQ0tERVAKKwlzZWxlY3QgREVCVUdfU1BJTkxPQ0sKKwlzZWxlY3QgREVCVUdfTVVURVhFUworCXNlbGVjdCBERUJVR19SVF9NVVRFWEVTIGlmIFJUX01VVEVYRVMKKwlzZWxlY3QgREVCVUdfTE9DS19BTExPQworCXNlbGVjdCBMT0NLREVQX0NST1NTUkVMRUFTRSBpZiBCUk9LRU4KKwlzZWxlY3QgTE9DS0RFUF9DT01QTEVUSU9OUyBpZiBCUk9LRU4KKwlzZWxlY3QgVFJBQ0VfSVJRRkxBR1MKKwlkZWZhdWx0IG4KKwloZWxwCisJIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRoZSBrZXJuZWwgdG8gcHJvdmUgdGhhdCBhbGwgbG9ja2luZworCSB0aGF0IG9jY3VycyBpbiB0aGUga2VybmVsIHJ1bnRpbWUgaXMgbWF0aGVtYXRpY2FsbHkKKwkgY29ycmVjdDogdGhhdCB1bmRlciBubyBjaXJjdW1zdGFuY2UgY291bGQgYW4gYXJiaXRyYXJ5IChhbmQKKwkgbm90IHlldCB0cmlnZ2VyZWQpIGNvbWJpbmF0aW9uIG9mIG9ic2VydmVkIGxvY2tpbmcKKwkgc2VxdWVuY2VzIChvbiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIENQVXMsIHJ1bm5pbmcgYW4KKwkgYXJiaXRyYXJ5IG51bWJlciBvZiB0YXNrcyBhbmQgaW50ZXJydXB0IGNvbnRleHRzKSBjYXVzZSBhCisJIGRlYWRsb2NrLgorCisJIEluIHNob3J0LCB0aGlzIGZlYXR1cmUgZW5hYmxlcyB0aGUga2VybmVsIHRvIHJlcG9ydCBsb2NraW5nCisJIHJlbGF0ZWQgZGVhZGxvY2tzIGJlZm9yZSB0aGV5IGFjdHVhbGx5IG9jY3VyLgorCisJIFRoZSBwcm9vZiBkb2VzIG5vdCBkZXBlbmQgb24gaG93IGhhcmQgYW5kIGNvbXBsZXggYQorCSBkZWFkbG9jayBzY2VuYXJpbyB3b3VsZCBiZSB0byB0cmlnZ2VyOiBob3cgbWFueQorCSBwYXJ0aWNpcGFudCBDUFVzLCB0YXNrcyBhbmQgaXJxLWNvbnRleHRzIHdvdWxkIGJlIG5lZWRlZAorCSBmb3IgaXQgdG8gdHJpZ2dlci4gVGhlIHByb29mIGFsc28gZG9lcyBub3QgZGVwZW5kIG9uCisJIHRpbWluZzogaWYgYSByYWNlIGFuZCBhIHJlc3VsdGluZyBkZWFkbG9jayBpcyBwb3NzaWJsZQorCSB0aGVvcmV0aWNhbGx5IChubyBtYXR0ZXIgaG93IHVubGlrZWx5IHRoZSByYWNlIHNjZW5hcmlvCisJIGlzKSwgaXQgd2lsbCBiZSBwcm92ZW4gc28gYW5kIHdpbGwgaW1tZWRpYXRlbHkgYmUKKwkgcmVwb3J0ZWQgYnkgdGhlIGtlcm5lbCAob25jZSB0aGUgZXZlbnQgaXMgb2JzZXJ2ZWQgdGhhdAorCSBtYWtlcyB0aGUgZGVhZGxvY2sgdGhlb3JldGljYWxseSBwb3NzaWJsZSkuCisKKwkgSWYgYSBkZWFkbG9jayBpcyBpbXBvc3NpYmxlIChpLmUuIHRoZSBsb2NraW5nIHJ1bGVzLCBhcworCSBvYnNlcnZlZCBieSB0aGUga2VybmVsLCBhcmUgbWF0aGVtYXRpY2FsbHkgY29ycmVjdCksIHRoZQorCSBrZXJuZWwgcmVwb3J0cyBub3RoaW5nLgorCisJIE5PVEU6IHRoaXMgZmVhdHVyZSBjYW4gYWxzbyBiZSBlbmFibGVkIGZvciByd2xvY2tzLCBtdXRleGVzCisJIGFuZCByd3NlbXMgLSBpbiB3aGljaCBjYXNlIGFsbCBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGVzZQorCSBkaWZmZXJlbnQgbG9ja2luZyB2YXJpYW50cyBhcmUgb2JzZXJ2ZWQgYW5kIG1hcHBlZCB0b28sIGFuZAorCSB0aGUgcHJvb2Ygb2Ygb2JzZXJ2ZWQgY29ycmVjdG5lc3MgaXMgYWxzbyBtYWludGFpbmVkIGZvciBhbgorCSBhcmJpdHJhcnkgY29tYmluYXRpb24gb2YgdGhlc2Ugc2VwYXJhdGUgbG9ja2luZyB2YXJpYW50cy4KKworCSBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2tkZXAtZGVzaWduLnR4dC4KKworY29uZmlnIExPQ0tERVAKKwlib29sCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwgJiYgVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVCAmJiBTVEFDS1RSQUNFX1NVUFBPUlQgJiYgTE9DS0RFUF9TVVBQT1JUCisJc2VsZWN0IFNUQUNLVFJBQ0UKKwlzZWxlY3QgRlJBTUVfUE9JTlRFUiBpZiAhTUlQUyAmJiAhUFBDICYmICFBUk1fVU5XSU5EICYmICFTMzkwICYmICFNSUNST0JMQVpFICYmICFBUkMgJiYgIVNDT1JFICYmICFYODYKKwlzZWxlY3QgS0FMTFNZTVMKKwlzZWxlY3QgS0FMTFNZTVNfQUxMCisKK2NvbmZpZyBMT0NLREVQX1NNQUxMCisJYm9vbAorCitjb25maWcgTE9DS19TVEFUCisJYm9vbCAiTG9jayB1c2FnZSBzdGF0aXN0aWNzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMICYmIFRSQUNFX0lSUUZMQUdTX1NVUFBPUlQgJiYgU1RBQ0tUUkFDRV9TVVBQT1JUICYmIExPQ0tERVBfU1VQUE9SVAorCXNlbGVjdCBMT0NLREVQCisJc2VsZWN0IERFQlVHX1NQSU5MT0NLCisJc2VsZWN0IERFQlVHX01VVEVYRVMKKwlzZWxlY3QgREVCVUdfUlRfTVVURVhFUyBpZiBSVF9NVVRFWEVTCisJc2VsZWN0IERFQlVHX0xPQ0tfQUxMT0MKKwlkZWZhdWx0IG4KKwloZWxwCisJIFRoaXMgZmVhdHVyZSBlbmFibGVzIHRyYWNraW5nIGxvY2sgY29udGVudGlvbiBwb2ludHMKKworCSBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgRG9jdW1lbnRhdGlvbi9sb2NraW5nL2xvY2tzdGF0LnR4dAorCisJIFRoaXMgYWxzbyBlbmFibGVzIGxvY2sgZXZlbnRzIHJlcXVpcmVkIGJ5ICJwZXJmIGxvY2siLAorCSBzdWJjb21tYW5kIG9mIHBlcmYuCisJIElmIHlvdSB3YW50IHRvIHVzZSAicGVyZiBsb2NrIiwgeW91IGFsc28gbmVlZCB0byB0dXJuIG9uCisJIENPTkZJR19FVkVOVF9UUkFDSU5HLgorCisJIENPTkZJR19MT0NLX1NUQVQgZGVmaW5lcyAiY29udGVuZGVkIiBhbmQgImFjcXVpcmVkIiBsb2NrIGV2ZW50cy4KKwkgKENPTkZJR19MT0NLREVQIGRlZmluZXMgImFjcXVpcmUiIGFuZCAicmVsZWFzZSIgZXZlbnRzLikKKworY29uZmlnIExPQ0tERVBfQ1JPU1NSRUxFQVNFCisJYm9vbAorCWhlbHAKKwkgVGhpcyBtYWtlcyBsb2NrZGVwIHdvcmsgZm9yIGNyb3NzbG9jayB3aGljaCBpcyBhIGxvY2sgYWxsb3dlZCB0bworCSBiZSByZWxlYXNlZCBpbiBhIGRpZmZlcmVudCBjb250ZXh0IGZyb20gdGhlIGFjcXVpc2l0aW9uIGNvbnRleHQuCisJIE5vcm1hbGx5IGEgbG9jayBtdXN0IGJlIHJlbGVhc2VkIGluIHRoZSBjb250ZXh0IGFjcXVpcmluZyB0aGUgbG9jay4KKwkgSG93ZXZlciwgcmVsZXhpbmcgdGhpcyBjb25zdHJhaW50IGhlbHBzIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzCisJIHN1Y2ggYXMgcGFnZSBsb2NrcyBvciBjb21wbGV0aW9ucyBjYW4gdXNlIHRoZSBsb2NrIGNvcnJlY3RuZXNzCisJIGRldGVjdG9yLCBsb2NrZGVwLgorCitjb25maWcgTE9DS0RFUF9DT01QTEVUSU9OUworCWJvb2wKKwloZWxwCisJIEEgZGVhZGxvY2sgY2F1c2VkIGJ5IHdhaXRfZm9yX2NvbXBsZXRpb24oKSBhbmQgY29tcGxldGUoKSBjYW4gYmUKKwkgZGV0ZWN0ZWQgYnkgbG9ja2RlcCB1c2luZyBjcm9zc3JlbGVhc2UgZmVhdHVyZS4KKworY29uZmlnIERFQlVHX0xPQ0tERVAKKwlib29sICJMb2NrIGRlcGVuZGVuY3kgZW5naW5lIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBMT0NLREVQCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBsb2NrIGRlcGVuZGVuY3kgZW5naW5lIHdpbGwgZG8KKwkgIGFkZGl0aW9uYWwgcnVudGltZSBjaGVja3MgdG8gZGVidWcgaXRzZWxmLCBhdCB0aGUgcHJpY2UKKwkgIG9mIG1vcmUgcnVudGltZSBvdmVyaGVhZC4KKworY29uZmlnIERFQlVHX0FUT01JQ19TTEVFUAorCWJvb2wgIlNsZWVwIGluc2lkZSBhdG9taWMgc2VjdGlvbiBjaGVja2luZyIKKwlzZWxlY3QgUFJFRU1QVF9DT1VOVAorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIHZhcmlvdXMgcm91dGluZXMgd2hpY2ggbWF5IHNsZWVwIHdpbGwgYmVjb21lIHZlcnkKKwkgIG5vaXN5IGlmIHRoZXkgYXJlIGNhbGxlZCBpbnNpZGUgYXRvbWljIHNlY3Rpb25zOiB3aGVuIGEgc3BpbmxvY2sgaXMKKwkgIGhlbGQsIGluc2lkZSBhbiByY3UgcmVhZCBzaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGluc2lkZSBwcmVlbXB0IGRpc2FibGVkCisJICBzZWN0aW9ucywgaW5zaWRlIGFuIGludGVycnVwdCwgZXRjLi4uCisKK2NvbmZpZyBERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMKKwlib29sICJMb2NraW5nIEFQSSBib290LXRpbWUgc2VsZi10ZXN0cyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdGhlIGtlcm5lbCB0byBydW4gYSBzaG9ydCBzZWxmLXRlc3QgZHVyaW5nCisJICBib290dXAuIFRoZSBzZWxmLXRlc3QgY2hlY2tzIHdoZXRoZXIgY29tbW9uIHR5cGVzIG9mIGxvY2tpbmcgYnVncworCSAgYXJlIGRldGVjdGVkIGJ5IGRlYnVnZ2luZyBtZWNoYW5pc21zIG9yIG5vdC4gKGlmIHlvdSBkaXNhYmxlCisJICBsb2NrIGRlYnVnZ2luZyB0aGVuIHRob3NlIGJ1Z3Mgd29udCBiZSBkZXRlY3RlZCBvZiBjb3Vyc2UuKQorCSAgVGhlIGZvbGxvd2luZyBsb2NraW5nIEFQSXMgYXJlIGNvdmVyZWQ6IHNwaW5sb2Nrcywgcndsb2NrcywKKwkgIG11dGV4ZXMgYW5kIHJ3c2Vtcy4KKworY29uZmlnIExPQ0tfVE9SVFVSRV9URVNUCisJdHJpc3RhdGUgInRvcnR1cmUgdGVzdHMgZm9yIGxvY2tpbmciCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlzZWxlY3QgVE9SVFVSRV9URVNUCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgYSBrZXJuZWwgbW9kdWxlIHRoYXQgcnVucyB0b3J0dXJlIHRlc3RzCisJICBvbiBrZXJuZWwgbG9ja2luZyBwcmltaXRpdmVzLiAgVGhlIGtlcm5lbCBtb2R1bGUgbWF5IGJlIGJ1aWx0CisJICBhZnRlciB0aGUgZmFjdCBvbiB0aGUgcnVubmluZyBrZXJuZWwgdG8gYmUgdGVzdGVkLCBpZiBkZXNpcmVkLgorCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IGtlcm5lbCBsb2NraW5nLXByaW1pdGl2ZSB0b3J0dXJlIHRlc3RzCisJICB0byBiZSBidWlsdCBpbnRvIHRoZSBrZXJuZWwuCisJICBTYXkgTSBpZiB5b3Ugd2FudCB0aGVzZSB0b3J0dXJlIHRlc3RzIHRvIGJ1aWxkIGFzIGEgbW9kdWxlLgorCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBXV19NVVRFWF9TRUxGVEVTVAorCXRyaXN0YXRlICJXYWl0L3dvdW5kIG11dGV4IHNlbGZ0ZXN0cyIKKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyBhIGtlcm5lbCBtb2R1bGUgdGhhdCBydW5zIHRlc3RzIG9uIHRoZQorCSAgb24gdGhlIHN0cnVjdCB3d19tdXRleCBsb2NraW5nIEFQSS4KKworCSAgSXQgaXMgcmVjb21tZW5kZWQgdG8gZW5hYmxlIERFQlVHX1dXX01VVEVYX1NMT1dQQVRIIGluIGNvbmp1bmN0aW9uCisJICB3aXRoIHRoaXMgdGVzdCBoYXJuZXNzLgorCisJICBTYXkgTSBpZiB5b3Ugd2FudCB0aGVzZSBzZWxmIHRlc3RzIHRvIGJ1aWxkIGFzIGEgbW9kdWxlLgorCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2VuZG1lbnUgIyBsb2NrIGRlYnVnZ2luZworCitjb25maWcgVFJBQ0VfSVJRRkxBR1MKKwlib29sCisJaGVscAorCSAgRW5hYmxlcyBob29rcyB0byBpbnRlcnJ1cHQgZW5hYmxpbmcgYW5kIGRpc2FibGluZyBmb3IKKwkgIGVpdGhlciB0cmFjaW5nIG9yIGxvY2sgZGVidWdnaW5nLgorCitjb25maWcgU1RBQ0tUUkFDRQorCWJvb2wgIlN0YWNrIGJhY2t0cmFjZSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU1RBQ0tUUkFDRV9TVVBQT1JUCisJaGVscAorCSAgVGhpcyBvcHRpb24gY2F1c2VzIHRoZSBrZXJuZWwgdG8gY3JlYXRlIGEgL3Byb2MvcGlkL3N0YWNrIGZvcgorCSAgZXZlcnkgcHJvY2Vzcywgc2hvd2luZyBpdHMgY3VycmVudCBzdGFjayB0cmFjZS4KKwkgIEl0IGlzIGFsc28gdXNlZCBieSB2YXJpb3VzIGtlcm5lbCBkZWJ1Z2dpbmcgZmVhdHVyZXMgdGhhdCByZXF1aXJlCisJICBzdGFjayB0cmFjZSBnZW5lcmF0aW9uLgorCitjb25maWcgV0FSTl9BTExfVU5TRUVERURfUkFORE9NCisJYm9vbCAiV2FybiBmb3IgYWxsIHVzZXMgb2YgdW5zZWVkZWQgcmFuZG9tbmVzcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTb21lIHBhcnRzIG9mIHRoZSBrZXJuZWwgY29udGFpbiBidWdzIHJlbGF0aW5nIHRvIHRoZWlyIHVzZSBvZgorCSAgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHJhbmRvbSBudW1iZXJzIGJlZm9yZSBpdCdzIGFjdHVhbGx5IHBvc3NpYmxlCisJICB0byBnZW5lcmF0ZSB0aG9zZSBudW1iZXJzIHNlY3VyZWx5LiBUaGlzIHNldHRpbmcgZW5zdXJlcyB0aGF0IHRoZXNlCisJICBmbGF3cyBkb24ndCBnbyB1bm5vdGljZWQsIGJ5IGVuYWJsaW5nIGEgbWVzc2FnZSwgc2hvdWxkIHRoaXMgZXZlcgorCSAgb2NjdXIuIFRoaXMgd2lsbCBhbGxvdyBwZW9wbGUgd2l0aCBvYnNjdXJlIHNldHVwcyB0byBrbm93IHdoZW4gdGhpbmdzCisJICBhcmUgZ29pbmcgd3JvbmcsIHNvIHRoYXQgdGhleSBtaWdodCBjb250YWN0IGRldmVsb3BlcnMgYWJvdXQgZml4aW5nCisJICBpdC4KKworCSAgVW5mb3J0dW5hdGVseSwgb24gc29tZSBtb2RlbHMgb2Ygc29tZSBhcmNoaXRlY3R1cmVzIGdldHRpbmcKKwkgIGEgZnVsbHkgc2VlZGVkIENSTkcgaXMgZXh0cmVtZWx5IGRpZmZpY3VsdCwgYW5kIHNvIHRoaXMgY2FuCisJICByZXN1bHQgaW4gZG1lc2cgZ2V0dGluZyBzcGFtbWVkIGZvciBhIHN1cnByaXNpbmdseSBsb25nCisJICB0aW1lLiAgVGhpcyBpcyByZWFsbHkgYmFkIGZyb20gYSBzZWN1cml0eSBwZXJzcGVjdGl2ZSwgYW5kCisJICBzbyBhcmNoaXRlY3R1cmUgbWFpbnRhaW5lcnMgcmVhbGx5IG5lZWQgdG8gZG8gd2hhdCB0aGV5IGNhbgorCSAgdG8gZ2V0IHRoZSBDUk5HIHNlZWRlZCBzb29uZXIgYWZ0ZXIgdGhlIHN5c3RlbSBpcyBib290ZWQuCisJICBIb3dldmVyLCBzaW5jZSB1c2VycyBjYW4gbm90IGRvIGFueXRoaW5nIGFjdGlvbmJsZSB0bworCSAgYWRkcmVzcyB0aGlzLCBieSBkZWZhdWx0IHRoZSBrZXJuZWwgd2lsbCBpc3N1ZSBvbmx5IGEgc2luZ2xlCisJICB3YXJuaW5nIGZvciB0aGUgZmlyc3QgdXNlIG9mIHVuc2VlZGVkIHJhbmRvbW5lc3MuCisKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gcmVjZWl2ZSB3YXJuaW5ncyBmb3IgYWxsIHVzZXMgb2YKKwkgIHVuc2VlZGVkIHJhbmRvbW5lc3MuICBUaGlzIHdpbGwgYmUgb2YgdXNlIHByaW1hcmlseSBmb3IKKwkgIHRob3NlIGRldmVsb3BlcnMgaW50ZXJlcnN0ZWQgaW4gaW1wcm92aW5nIHRoZSBzZWN1cml0eSBvZgorCSAgTGludXgga2VybmVscyBydW5uaW5nIG9uIHRoZWlyIGFyY2hpdGVjdHVyZSAob3IKKwkgIHN1YmFyY2hpdGVjdHVyZSkuCisKK2NvbmZpZyBERUJVR19LT0JKRUNUCisJYm9vbCAia29iamVjdCBkZWJ1Z2dpbmciCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBJZiB5b3Ugc2F5IFkgaGVyZSwgc29tZSBleHRyYSBrb2JqZWN0IGRlYnVnZ2luZyBtZXNzYWdlcyB3aWxsIGJlIHNlbnQKKwkgIHRvIHRoZSBzeXNsb2cuIAorCitjb25maWcgREVCVUdfS09CSkVDVF9SRUxFQVNFCisJYm9vbCAia29iamVjdCByZWxlYXNlIGRlYnVnZ2luZyIKKwlkZXBlbmRzIG9uIERFQlVHX09CSkVDVFNfVElNRVJTCisJaGVscAorCSAga29iamVjdHMgYXJlIHJlZmVyZW5jZSBjb3VudGVkIG9iamVjdHMuICBUaGlzIG1lYW5zIHRoYXQgdGhlaXIKKwkgIGxhc3QgcmVmZXJlbmNlIGNvdW50IHB1dCBpcyBub3QgcHJlZGljdGFibGUsIGFuZCB0aGUga29iamVjdCBjYW4KKwkgIGxpdmUgb24gcGFzdCB0aGUgcG9pbnQgYXQgd2hpY2ggYSBkcml2ZXIgZGVjaWRlcyB0byBkcm9wIGl0J3MKKwkgIGluaXRpYWwgcmVmZXJlbmNlIHRvIHRoZSBrb2JqZWN0IGdhaW5lZCBvbiBhbGxvY2F0aW9uLiAgQW4KKwkgIGV4YW1wbGUgb2YgdGhpcyB3b3VsZCBiZSBhIHN0cnVjdCBkZXZpY2Ugd2hpY2ggaGFzIGp1c3QgYmVlbgorCSAgdW5yZWdpc3RlcmVkLgorCisJICBIb3dldmVyLCBzb21lIGJ1Z2d5IGRyaXZlcnMgYXNzdW1lIHRoYXQgYWZ0ZXIgc3VjaCBhbiBvcGVyYXRpb24sCisJICB0aGUgbWVtb3J5IGJhY2tpbmcgdGhlIGtvYmplY3QgY2FuIGJlIGltbWVkaWF0ZWx5IGZyZWVkLiAgVGhpcworCSAgZ29lcyBjb21wbGV0ZWx5IGFnYWluc3QgdGhlIHByaW5jaXBsZXMgb2YgYSByZWZjb3VudGVkIG9iamVjdC4KKworCSAgSWYgeW91IHNheSBZIGhlcmUsIHRoZSBrZXJuZWwgd2lsbCBkZWxheSB0aGUgcmVsZWFzZSBvZiBrb2JqZWN0cworCSAgb24gdGhlIGxhc3QgcmVmZXJlbmNlIGNvdW50IHRvIGltcHJvdmUgdGhlIHZpc2liaWxpdHkgb2YgdGhpcworCSAga2luZCBvZiBrb2JqZWN0IHJlbGVhc2UgYnVnLgorCitjb25maWcgSEFWRV9ERUJVR19CVUdWRVJCT1NFCisJYm9vbAorCitjb25maWcgREVCVUdfQlVHVkVSQk9TRQorCWJvb2wgIlZlcmJvc2UgQlVHKCkgcmVwb3J0aW5nIChhZGRzIDcwSykiIGlmIERFQlVHX0tFUk5FTCAmJiBFWFBFUlQKKwlkZXBlbmRzIG9uIEJVRyAmJiAoR0VORVJJQ19CVUcgfHwgSEFWRV9ERUJVR19CVUdWRVJCT1NFKQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gbWFrZSBCVUcoKSBwYW5pY3Mgb3V0cHV0IHRoZSBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyCisJICBvZiB0aGUgQlVHIGNhbGwgYXMgd2VsbCBhcyB0aGUgRUlQIGFuZCBvb3BzIHRyYWNlLiAgVGhpcyBhaWRzCisJICBkZWJ1Z2dpbmcgYnV0IGNvc3RzIGFib3V0IDcwLTEwMEsgb2YgbWVtb3J5LgorCitjb25maWcgREVCVUdfTElTVAorCWJvb2wgIkRlYnVnIGxpbmtlZCBsaXN0IG1hbmlwdWxhdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCB8fCBCVUdfT05fREFUQV9DT1JSVVBUSU9OCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gdHVybiBvbiBleHRlbmRlZCBjaGVja3MgaW4gdGhlIGxpbmtlZC1saXN0CisJICB3YWxraW5nIHJvdXRpbmVzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfUElfTElTVAorCWJvb2wgIkRlYnVnIHByaW9yaXR5IGxpbmtlZCBsaXN0IG1hbmlwdWxhdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHR1cm4gb24gZXh0ZW5kZWQgY2hlY2tzIGluIHRoZSBwcmlvcml0eS1vcmRlcmVkCisJICBsaW5rZWQtbGlzdCAocGxpc3QpIHdhbGtpbmcgcm91dGluZXMuICBUaGlzIGNoZWNrcyB0aGUgZW50aXJlCisJICBsaXN0IG11bHRpcGxlIHRpbWVzIGR1cmluZyBlYWNoIG1hbmlwdWxhdGlvbi4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIERFQlVHX1NHCisJYm9vbCAiRGVidWcgU0cgdGFibGUgb3BlcmF0aW9ucyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIHRvIHR1cm4gb24gY2hlY2tzIG9uIHNjYXR0ZXItZ2F0aGVyIHRhYmxlcy4gVGhpcyBjYW4KKwkgIGhlbHAgZmluZCBwcm9ibGVtcyB3aXRoIGRyaXZlcnMgdGhhdCBkbyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZQorCSAgdGhlaXIgc2cgdGFibGVzLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgREVCVUdfTk9USUZJRVJTCisJYm9vbCAiRGVidWcgbm90aWZpZXIgY2FsbCBjaGFpbnMiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byB0dXJuIG9uIHNhbml0eSBjaGVja2luZyBmb3Igbm90aWZpZXIgY2FsbCBjaGFpbnMuCisJICBUaGlzIGlzIG1vc3QgdXNlZnVsIGZvciBrZXJuZWwgZGV2ZWxvcGVycyB0byBtYWtlIHN1cmUgdGhhdAorCSAgbW9kdWxlcyBwcm9wZXJseSB1bnJlZ2lzdGVyIHRoZW1zZWx2ZXMgZnJvbSBub3RpZmllciBjaGFpbnMuCisJICBUaGlzIGlzIGEgcmVsYXRpdmVseSBjaGVhcCBjaGVjayBidXQgaWYgeW91IGNhcmUgYWJvdXQgbWF4aW11bQorCSAgcGVyZm9ybWFuY2UsIHNheSBOLgorCitjb25maWcgREVCVUdfQ1JFREVOVElBTFMKKwlib29sICJEZWJ1ZyBjcmVkZW50aWFsIG1hbmFnZW1lbnQiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBFbmFibGUgdGhpcyB0byB0dXJuIG9uIHNvbWUgZGVidWcgY2hlY2tpbmcgZm9yIGNyZWRlbnRpYWwKKwkgIG1hbmFnZW1lbnQuICBUaGUgYWRkaXRpb25hbCBjb2RlIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YKKwkgIHBvaW50ZXJzIGZyb20gdGFza19zdHJ1Y3RzIHRvIGFueSBnaXZlbiBjcmVkIHN0cnVjdCwgYW5kIGNoZWNrcyB0bworCSAgc2VlIHRoYXQgdGhpcyBudW1iZXIgbmV2ZXIgZXhjZWVkcyB0aGUgdXNhZ2UgY291bnQgb2YgdGhlIGNyZWQKKwkgIHN0cnVjdC4KKworCSAgRnVydGhlcm1vcmUsIGlmIFNFTGludXggaXMgZW5hYmxlZCwgdGhpcyBhbHNvIGNoZWNrcyB0aGF0IHRoZQorCSAgc2VjdXJpdHkgcG9pbnRlciBpbiB0aGUgY3JlZCBzdHJ1Y3QgaXMgbmV2ZXIgc2VlbiB0byBiZSBpbnZhbGlkLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitzb3VyY2UgImtlcm5lbC9yY3UvS2NvbmZpZy5kZWJ1ZyIKKworY29uZmlnIERFQlVHX1dRX0ZPUkNFX1JSX0NQVQorCWJvb2wgIkZvcmNlIHJvdW5kLXJvYmluIENQVSBzZWxlY3Rpb24gZm9yIHVuYm91bmQgd29yayBpdGVtcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFdvcmtxdWV1ZSB1c2VkIHRvIGltcGxpY2l0bHkgZ3VhcmFudGVlIHRoYXQgd29yayBpdGVtcyBxdWV1ZWQKKwkgIHdpdGhvdXQgZXhwbGljaXQgQ1BVIHNwZWNpZmllZCBhcmUgcHV0IG9uIHRoZSBsb2NhbCBDUFUuICBUaGlzCisJICBndWFyYW50ZWUgaXMgbm8gbG9uZ2VyIHRydWUgYW5kIHdoaWxlIGxvY2FsIENQVSBpcyBzdGlsbAorCSAgcHJlZmVycmVkIHdvcmsgaXRlbXMgbWF5IGJlIHB1dCBvbiBmb3JlaWduIENQVXMuICBLZXJuZWwKKwkgIHBhcmFtZXRlciAid29ya3F1ZXVlLmRlYnVnX2ZvcmNlX3JyX2NwdSIgaXMgYWRkZWQgdG8gZm9yY2UKKwkgIHJvdW5kLXJvYmluIENQVSBzZWxlY3Rpb24gdG8gZmx1c2ggb3V0IHVzYWdlcyB3aGljaCBkZXBlbmQgb24gdGhlCisJICBub3cgYnJva2VuIGd1YXJhbnRlZS4gIFRoaXMgY29uZmlnIG9wdGlvbiBlbmFibGVzIHRoZSBkZWJ1ZworCSAgZmVhdHVyZSBieSBkZWZhdWx0LiAgV2hlbiBlbmFibGVkLCBtZW1vcnkgYW5kIGNhY2hlIGxvY2FsaXR5IHdpbGwKKwkgIGJlIGltcGFjdGVkLgorCitjb25maWcgREVCVUdfQkxPQ0tfRVhUX0RFVlQKKyAgICAgICAgYm9vbCAiRm9yY2UgZXh0ZW5kZWQgYmxvY2sgZGV2aWNlIG51bWJlcnMgYW5kIHNwcmVhZCB0aGVtIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJZGVwZW5kcyBvbiBCTE9DSworCWRlZmF1bHQgbgorCWhlbHAKKwkgIEJJRyBGQVQgV0FSTklORzogRU5BQkxJTkcgVEhJUyBPUFRJT04gTUlHSFQgQlJFQUsgQk9PVElORyBPTgorCSAgU09NRSBESVNUUklCVVRJT05TLiAgRE8gTk9UIEVOQUJMRSBUSElTIFVOTEVTUyBZT1UgS05PVyBXSEFUCisJICBZT1UgQVJFIERPSU5HLiAgRGlzdHJvcywgcGxlYXNlIGVuYWJsZSB0aGlzIGFuZCBmaXggd2hhdGV2ZXIKKwkgIGlzIGJyb2tlbi4KKworCSAgQ29udmVudGlvbmFsbHksIGJsb2NrIGRldmljZSBudW1iZXJzIGFyZSBhbGxvY2F0ZWQgZnJvbQorCSAgcHJlZGV0ZXJtaW5lZCBjb250aWd1b3VzIGFyZWEuICBIb3dldmVyLCBleHRlbmRlZCBibG9jayBhcmVhCisJICBtYXkgaW50cm9kdWNlIG5vbi1jb250aWd1b3VzIGJsb2NrIGRldmljZSBudW1iZXJzLiAgVGhpcworCSAgb3B0aW9uIGZvcmNlcyBtb3N0IGJsb2NrIGRldmljZSBudW1iZXJzIHRvIGJlIGFsbG9jYXRlZCBmcm9tCisJICB0aGUgZXh0ZW5kZWQgc3BhY2UgYW5kIHNwcmVhZHMgdGhlbSB0byBkaXNjb3ZlciBrZXJuZWwgb3IKKwkgIHVzZXJsYW5kIGNvZGUgcGF0aHMgd2hpY2ggYXNzdW1lIHByZWRldGVybWluZWQgY29udGlndW91cworCSAgZGV2aWNlIG51bWJlciBhbGxvY2F0aW9uLgorCisJICBOb3RlIHRoYXQgdHVybmluZyBvbiB0aGlzIGRlYnVnIG9wdGlvbiBzaHVmZmxlcyBhbGwgdGhlCisJICBkZXZpY2UgbnVtYmVycyBmb3IgYWxsIElERSBhbmQgU0NTSSBkZXZpY2VzIGluY2x1ZGluZyBsaWJhdGEKKwkgIG9uZXMsIHNvIHJvb3QgcGFydGl0aW9uIHNwZWNpZmllZCB1c2luZyBkZXZpY2UgbnVtYmVyCisJICBkaXJlY3RseSAodmlhIHJkZXYgb3Igcm9vdD1NQUo6TUlOKSB3b24ndCB3b3JrIGFueW1vcmUuCisJICBUZXh0dWFsIGRldmljZSBuYW1lcyAocm9vdD0vZGV2L3NkWG4pIHdpbGwgY29udGludWUgdG8gd29yay4KKworCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBDUFVfSE9UUExVR19TVEFURV9DT05UUk9MCisJYm9vbCAiRW5hYmxlIENQVSBob3RwbHVnIHN0YXRlIGNvbnRyb2wiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZXBlbmRzIG9uIEhPVFBMVUdfQ1BVCisJZGVmYXVsdCBuCisJaGVscAorCSAgQWxsb3dzIHRvIHdyaXRlIHN0ZXBzIGJldHdlZW4gIm9mZmxpbmUiIGFuZCAib25saW5lIiB0byB0aGUgQ1BVcworCSAgc3lzZnMgdGFyZ2V0IGZpbGUgc28gc3RhdGVzIGNhbiBiZSBzdGVwcGVkIGdyYW51bGFyLiBUaGlzIGlzIGEgZGVidWcKKwkgIG9wdGlvbiBmb3Igbm93IGFzIHRoZSBob3RwbHVnIG1hY2hpbmVyeSBjYW5ub3QgYmUgc3RvcHBlZCBhbmQKKwkgIHJlc3RhcnRlZCBhdCBhcmJpdHJhcnkgcG9pbnRzIHlldC4KKworCSAgU2F5IE4gaWYgeW91ciBhcmUgdW5zdXJlLgorCitjb25maWcgTk9USUZJRVJfRVJST1JfSU5KRUNUSU9OCisJdHJpc3RhdGUgIk5vdGlmaWVyIGVycm9yIGluamVjdGlvbiIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCXNlbGVjdCBERUJVR19GUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGluamVjdCBhcnRpZmljaWFsIGVycm9ycyB0bworCSAgc3BlY2lmaWVkIG5vdGlmaWVyIGNoYWluIGNhbGxiYWNrcy4gSXQgaXMgdXNlZnVsIHRvIHRlc3QgdGhlIGVycm9yCisJICBoYW5kbGluZyBvZiBub3RpZmllciBjYWxsIGNoYWluIGZhaWx1cmVzLgorCisJICBTYXkgTiBpZiB1bnN1cmUuCisKK2NvbmZpZyBQTV9OT1RJRklFUl9FUlJPUl9JTkpFQ1QKKwl0cmlzdGF0ZSAiUE0gbm90aWZpZXIgZXJyb3IgaW5qZWN0aW9uIG1vZHVsZSIKKwlkZXBlbmRzIG9uIFBNICYmIE5PVElGSUVSX0VSUk9SX0lOSkVDVElPTgorCWRlZmF1bHQgbSBpZiBQTV9ERUJVRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGluamVjdCBhcnRpZmljaWFsIGVycm9ycyB0bworCSAgUE0gbm90aWZpZXIgY2hhaW4gY2FsbGJhY2tzLiAgSXQgaXMgY29udHJvbGxlZCB0aHJvdWdoIGRlYnVnZnMKKwkgIGludGVyZmFjZSAvc3lzL2tlcm5lbC9kZWJ1Zy9ub3RpZmllci1lcnJvci1pbmplY3QvcG0KKworCSAgSWYgdGhlIG5vdGlmaWVyIGNhbGwgY2hhaW4gc2hvdWxkIGJlIGZhaWxlZCB3aXRoIHNvbWUgZXZlbnRzCisJICBub3RpZmllZCwgd3JpdGUgdGhlIGVycm9yIGNvZGUgdG8gImFjdGlvbnMvPG5vdGlmaWVyIGV2ZW50Pi9lcnJvciIuCisKKwkgIEV4YW1wbGU6IEluamVjdCBQTSBzdXNwZW5kIGVycm9yICgtMTIgPSAtRU5PTUVNKQorCisJICAjIGNkIC9zeXMva2VybmVsL2RlYnVnL25vdGlmaWVyLWVycm9yLWluamVjdC9wbS8KKwkgICMgZWNobyAtMTIgPiBhY3Rpb25zL1BNX1NVU1BFTkRfUFJFUEFSRS9lcnJvcgorCSAgIyBlY2hvIG1lbSA+IC9zeXMvcG93ZXIvc3RhdGUKKwkgIGJhc2g6IGVjaG86IHdyaXRlIGVycm9yOiBDYW5ub3QgYWxsb2NhdGUgbWVtb3J5CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBwbS1ub3RpZmllci1lcnJvci1pbmplY3QuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBPRl9SRUNPTkZJR19OT1RJRklFUl9FUlJPUl9JTkpFQ1QKKwl0cmlzdGF0ZSAiT0YgcmVjb25maWcgbm90aWZpZXIgZXJyb3IgaW5qZWN0aW9uIG1vZHVsZSIKKwlkZXBlbmRzIG9uIE9GX0RZTkFNSUMgJiYgTk9USUZJRVJfRVJST1JfSU5KRUNUSU9OCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gaW5qZWN0IGFydGlmaWNpYWwgZXJyb3JzIHRvCisJICBPRiByZWNvbmZpZyBub3RpZmllciBjaGFpbiBjYWxsYmFja3MuICBJdCBpcyBjb250cm9sbGVkCisJICB0aHJvdWdoIGRlYnVnZnMgaW50ZXJmYWNlIHVuZGVyCisJICAvc3lzL2tlcm5lbC9kZWJ1Zy9ub3RpZmllci1lcnJvci1pbmplY3QvT0YtcmVjb25maWcvCisKKwkgIElmIHRoZSBub3RpZmllciBjYWxsIGNoYWluIHNob3VsZCBiZSBmYWlsZWQgd2l0aCBzb21lIGV2ZW50cworCSAgbm90aWZpZWQsIHdyaXRlIHRoZSBlcnJvciBjb2RlIHRvICJhY3Rpb25zLzxub3RpZmllciBldmVudD4vZXJyb3IiLgorCisJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgb2YtcmVjb25maWctbm90aWZpZXItZXJyb3ItaW5qZWN0LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgTkVUREVWX05PVElGSUVSX0VSUk9SX0lOSkVDVAorCXRyaXN0YXRlICJOZXRkZXYgbm90aWZpZXIgZXJyb3IgaW5qZWN0aW9uIG1vZHVsZSIKKwlkZXBlbmRzIG9uIE5FVCAmJiBOT1RJRklFUl9FUlJPUl9JTkpFQ1RJT04KKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBpbmplY3QgYXJ0aWZpY2lhbCBlcnJvcnMgdG8KKwkgIG5ldGRldmljZSBub3RpZmllciBjaGFpbiBjYWxsYmFja3MuICBJdCBpcyBjb250cm9sbGVkIHRocm91Z2ggZGVidWdmcworCSAgaW50ZXJmYWNlIC9zeXMva2VybmVsL2RlYnVnL25vdGlmaWVyLWVycm9yLWluamVjdC9uZXRkZXYKKworCSAgSWYgdGhlIG5vdGlmaWVyIGNhbGwgY2hhaW4gc2hvdWxkIGJlIGZhaWxlZCB3aXRoIHNvbWUgZXZlbnRzCisJICBub3RpZmllZCwgd3JpdGUgdGhlIGVycm9yIGNvZGUgdG8gImFjdGlvbnMvPG5vdGlmaWVyIGV2ZW50Pi9lcnJvciIuCisKKwkgIEV4YW1wbGU6IEluamVjdCBuZXRkZXZpY2UgbXR1IGNoYW5nZSBlcnJvciAoLTIyID0gLUVJTlZBTCkKKworCSAgIyBjZCAvc3lzL2tlcm5lbC9kZWJ1Zy9ub3RpZmllci1lcnJvci1pbmplY3QvbmV0ZGV2CisJICAjIGVjaG8gLTIyID4gYWN0aW9ucy9ORVRERVZfQ0hBTkdFTVRVL2Vycm9yCisJICAjIGlwIGxpbmsgc2V0IGV0aDAgbXR1IDEwMjQKKwkgIFJUTkVUTElOSyBhbnN3ZXJzOiBJbnZhbGlkIGFyZ3VtZW50CisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBuZXRkZXYtbm90aWZpZXItZXJyb3ItaW5qZWN0LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgRkFVTFRfSU5KRUNUSU9OCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGZyYW1ld29yayIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIFByb3ZpZGUgZmF1bHQtaW5qZWN0aW9uIGZyYW1ld29yay4KKwkgIEZvciBtb3JlIGRldGFpbHMsIHNlZSBEb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi8uCisKK2NvbmZpZyBGQUlMU0xBQgorCWJvb2wgIkZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBrbWFsbG9jIgorCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OCisJZGVwZW5kcyBvbiBTTEFCIHx8IFNMVUIKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBrbWFsbG9jLgorCitjb25maWcgRkFJTF9QQUdFX0FMTE9DCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdGl5IGZvciBhbGxvY19wYWdlcygpIgorCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OCisJaGVscAorCSAgUHJvdmlkZSBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgYWxsb2NfcGFnZXMoKS4KKworY29uZmlnIEZBSUxfTUFLRV9SRVFVRVNUCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIGRpc2sgSU8iCisJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT04gJiYgQkxPQ0sKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBkaXNrIElPLgorCitjb25maWcgRkFJTF9JT19USU1FT1VUCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIGZha2luZyBkaXNrIGludGVycnVwdHMiCisJZGVwZW5kcyBvbiBGQVVMVF9JTkpFQ1RJT04gJiYgQkxPQ0sKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IG9uIGVuZCBJTyBoYW5kbGluZy4gVGhpcworCSAgd2lsbCBtYWtlIHRoZSBibG9jayBsYXllciAiZm9yZ2V0IiBhbiBpbnRlcnJ1cHQgYXMgY29uZmlndXJlZCwKKwkgIHRodXMgZXhlcmNpc2luZyB0aGUgZXJyb3IgaGFuZGxpbmcuCisKKwkgIE9ubHkgd29ya3Mgd2l0aCBkcml2ZXJzIHRoYXQgdXNlIHRoZSBnZW5lcmljIHRpbWVvdXQgaGFuZGxpbmcsCisJICBmb3Igb3RoZXJzIGl0IHdvbnQgZG8gYW55dGhpbmcuCisKK2NvbmZpZyBGQUlMX01NQ19SRVFVRVNUCisJYm9vbCAiRmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdHkgZm9yIE1NQyBJTyIKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAmJiBNTUMKKwloZWxwCisJICBQcm92aWRlIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBNTUMgSU8uCisJICBUaGlzIHdpbGwgbWFrZSB0aGUgbW1jIGNvcmUgcmV0dXJuIGRhdGEgZXJyb3JzLiBUaGlzIGlzCisJICB1c2VmdWwgdG8gdGVzdCB0aGUgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIG1tYyBibG9jayBkZXZpY2UKKwkgIGFuZCB0byB0ZXN0IGhvdyB0aGUgbW1jIGhvc3QgZHJpdmVyIGhhbmRsZXMgcmV0cmllcyBmcm9tCisJICB0aGUgYmxvY2sgZGV2aWNlLgorCitjb25maWcgRkFJTF9GVVRFWAorCWJvb2wgIkZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXR5IGZvciBmdXRleGVzIgorCXNlbGVjdCBERUJVR19GUworCWRlcGVuZHMgb24gRkFVTFRfSU5KRUNUSU9OICYmIEZVVEVYCisJaGVscAorCSAgUHJvdmlkZSBmYXVsdC1pbmplY3Rpb24gY2FwYWJpbGl0eSBmb3IgZnV0ZXhlcy4KKworY29uZmlnIEZBVUxUX0lOSkVDVElPTl9ERUJVR19GUworCWJvb2wgIkRlYnVnZnMgZW50cmllcyBmb3IgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdGllcyIKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTiAmJiBTWVNGUyAmJiBERUJVR19GUworCWhlbHAKKwkgIEVuYWJsZSBjb25maWd1cmF0aW9uIG9mIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXRpZXMgdmlhIGRlYnVnZnMuCisKK2NvbmZpZyBGQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIKKwlib29sICJzdGFja3RyYWNlIGZpbHRlciBmb3IgZmF1bHQtaW5qZWN0aW9uIGNhcGFiaWxpdGllcyIKKwlkZXBlbmRzIG9uIEZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAmJiBTVEFDS1RSQUNFX1NVUFBPUlQKKwlkZXBlbmRzIG9uICFYODZfNjQKKwlzZWxlY3QgU1RBQ0tUUkFDRQorCXNlbGVjdCBGUkFNRV9QT0lOVEVSIGlmICFNSVBTICYmICFQUEMgJiYgIVMzOTAgJiYgIU1JQ1JPQkxBWkUgJiYgIUFSTV9VTldJTkQgJiYgIUFSQyAmJiAhU0NPUkUgJiYgIVg4NgorCWhlbHAKKwkgIFByb3ZpZGUgc3RhY2t0cmFjZSBmaWx0ZXIgZm9yIGZhdWx0LWluamVjdGlvbiBjYXBhYmlsaXRpZXMKKworY29uZmlnIExBVEVOQ1lUT1AKKwlib29sICJMYXRlbmN5IG1lYXN1cmluZyBpbmZyYXN0cnVjdHVyZSIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWRlcGVuZHMgb24gU1RBQ0tUUkFDRV9TVVBQT1JUCisJZGVwZW5kcyBvbiBQUk9DX0ZTCisJc2VsZWN0IEZSQU1FX1BPSU5URVIgaWYgIU1JUFMgJiYgIVBQQyAmJiAhUzM5MCAmJiAhTUlDUk9CTEFaRSAmJiAhQVJNX1VOV0lORCAmJiAhQVJDICYmICFYODYKKwlzZWxlY3QgS0FMTFNZTVMKKwlzZWxlY3QgS0FMTFNZTVNfQUxMCisJc2VsZWN0IFNUQUNLVFJBQ0UKKwlzZWxlY3QgU0NIRURTVEFUUworCXNlbGVjdCBTQ0hFRF9ERUJVRworCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIExhdGVuY3lUT1AgdG9vbAorCSAgdG8gZmluZCBvdXQgd2hpY2ggdXNlcnNwYWNlIGlzIGJsb2NraW5nIG9uIHdoYXQga2VybmVsIG9wZXJhdGlvbnMuCisKK3NvdXJjZSBrZXJuZWwvdHJhY2UvS2NvbmZpZworCitjb25maWcgUFJPVklERV9PSENJMTM5NF9ETUFfSU5JVAorCWJvb2wgIlJlbW90ZSBkZWJ1Z2dpbmcgb3ZlciBGaXJlV2lyZSBlYXJseSBvbiBib290IgorCWRlcGVuZHMgb24gUENJICYmIFg4NgorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGRlYnVnIHByb2JsZW1zIHdoaWNoIGhhbmcgb3IgY3Jhc2ggdGhlIGtlcm5lbCBlYXJseQorCSAgb24gYm9vdCBhbmQgdGhlIGNyYXNoaW5nIG1hY2hpbmUgaGFzIGEgRmlyZVdpcmUgcG9ydCwgeW91IGNhbiB1c2UKKwkgIHRoaXMgZmVhdHVyZSB0byByZW1vdGVseSBhY2Nlc3MgdGhlIG1lbW9yeSBvZiB0aGUgY3Jhc2hlZCBtYWNoaW5lCisJICBvdmVyIEZpcmVXaXJlLiBUaGlzIGVtcGxveXMgcmVtb3RlIERNQSBhcyBwYXJ0IG9mIHRoZSBPSENJMTM5NAorCSAgc3BlY2lmaWNhdGlvbiB3aGljaCBpcyBub3cgdGhlIHN0YW5kYXJkIGZvciBGaXJlV2lyZSBjb250cm9sbGVycy4KKworCSAgV2l0aCByZW1vdGUgRE1BLCB5b3UgY2FuIG1vbml0b3IgdGhlIHByaW50ayBidWZmZXIgcmVtb3RlbHkgdXNpbmcKKwkgIGZpcmVzY29wZSBhbmQgYWNjZXNzIGFsbCBtZW1vcnkgYmVsb3cgNEdCIHVzaW5nIGZpcmVwcm94eSBmcm9tIGdkYi4KKwkgIEV2ZW4gY29udHJvbGxpbmcgYSBrZXJuZWwgZGVidWdnZXIgaXMgcG9zc2libGUgdXNpbmcgcmVtb3RlIERNQS4KKworCSAgVXNhZ2U6CisKKwkgIElmIG9oY2kxMzk0X2RtYT1lYXJseSBpcyB1c2VkIGFzIGJvb3QgcGFyYW1ldGVyLCBpdCB3aWxsIGluaXRpYWxpemUKKwkgIGFsbCBPSENJMTM5NCBjb250cm9sbGVycyB3aGljaCBhcmUgZm91bmQgaW4gdGhlIFBDSSBjb25maWcgc3BhY2UuCisKKwkgIEFzIGFsbCBjaGFuZ2VzIHRvIHRoZSBGaXJlV2lyZSBidXMgc3VjaCBhcyBlbmFibGluZyBhbmQgZGlzYWJsaW5nCisJICBkZXZpY2VzIGNhdXNlIGEgYnVzIHJlc2V0IGFuZCB0aGVyZWJ5IGRpc2FibGUgcmVtb3RlIERNQSBmb3IgYWxsCisJICBkZXZpY2VzLCBiZSBzdXJlIHRvIGhhdmUgdGhlIGNhYmxlIHBsdWdnZWQgYW5kIEZpcmVXaXJlIGVuYWJsZWQgb24KKwkgIHRoZSBkZWJ1Z2dpbmcgaG9zdCBiZWZvcmUgYm9vdGluZyB0aGUgZGVidWcgdGFyZ2V0IGZvciBkZWJ1Z2dpbmcuCisKKwkgIFRoaXMgY29kZSAofjFrKSBpcyBmcmVlZCBhZnRlciBib290LiBCeSB0aGVuLCB0aGUgZmlyZXdpcmUgc3RhY2sKKwkgIGluIGNoYXJnZSBvZiB0aGUgT0hDSS0xMzk0IGNvbnRyb2xsZXJzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisKKwkgIFNlZSBEb2N1bWVudGF0aW9uL2RlYnVnZ2luZy12aWEtb2hjaTEzOTQudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgorCitjb25maWcgRE1BX0FQSV9ERUJVRworCWJvb2wgIkVuYWJsZSBkZWJ1Z2dpbmcgb2YgRE1BLUFQSSB1c2FnZSIKKwlkZXBlbmRzIG9uIEhBVkVfRE1BX0FQSV9ERUJVRworCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBkZWJ1ZyB0aGUgdXNlIG9mIHRoZSBETUEgQVBJIGJ5IGRldmljZSBkcml2ZXJzLgorCSAgV2l0aCB0aGlzIG9wdGlvbiB5b3Ugd2lsbCBiZSBhYmxlIHRvIGRldGVjdCBjb21tb24gYnVncyBpbiBkZXZpY2UKKwkgIGRyaXZlcnMgbGlrZSBkb3VibGUtZnJlZWluZyBvZiBETUEgbWFwcGluZ3Mgb3IgZnJlZWluZyBtYXBwaW5ncyB0aGF0CisJICB3ZXJlIG5ldmVyIGFsbG9jYXRlZC4KKworCSAgVGhpcyBhbHNvIGF0dGVtcHRzIHRvIGNhdGNoIGNhc2VzIHdoZXJlIGEgcGFnZSBvd25lZCBieSBETUEgaXMKKwkgIGFjY2Vzc2VkIGJ5IHRoZSBjcHUgaW4gYSB3YXkgdGhhdCBjb3VsZCBjYXVzZSBkYXRhIGNvcnJ1cHRpb24uICBGb3IKKwkgIGV4YW1wbGUsIHRoaXMgZW5hYmxlcyBjb3dfdXNlcl9wYWdlKCkgdG8gY2hlY2sgdGhhdCB0aGUgc291cmNlIHBhZ2UgaXMKKwkgIG5vdCB1bmRlcmdvaW5nIERNQS4KKworCSAgVGhpcyBvcHRpb24gY2F1c2VzIGEgcGVyZm9ybWFuY2UgZGVncmFkYXRpb24uICBVc2Ugb25seSBpZiB5b3Ugd2FudCB0bworCSAgZGVidWcgZGV2aWNlIGRyaXZlcnMgYW5kIGRtYSBpbnRlcmFjdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK21lbnUgIlJ1bnRpbWUgVGVzdGluZyIKKworY29uZmlnIExLRFRNCisJdHJpc3RhdGUgIkxpbnV4IEtlcm5lbCBEdW1wIFRlc3QgVG9vbCBNb2R1bGUiCisJZGVwZW5kcyBvbiBERUJVR19GUworCWRlcGVuZHMgb24gQkxPQ0sKKwlkZWZhdWx0IG4KKwloZWxwCisJVGhpcyBtb2R1bGUgZW5hYmxlcyB0ZXN0aW5nIG9mIHRoZSBkaWZmZXJlbnQgZHVtcGluZyBtZWNoYW5pc21zIGJ5CisJaW5kdWNpbmcgc3lzdGVtIGZhaWx1cmVzIGF0IHByZWRlZmluZWQgY3Jhc2ggcG9pbnRzLgorCUlmIHlvdSBkb24ndCBuZWVkIGl0OiBzYXkgTgorCUNob29zZSBNIGhlcmUgdG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1bGUuIFRoZSBtb2R1bGUgd2lsbCBiZQorCWNhbGxlZCBsa2R0bS4KKworCURvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGUgbW9kdWxlIGNhbiBiZSBmb3VuZCBpbgorCURvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL3Byb3Zva2UtY3Jhc2hlcy50eHQKKworY29uZmlnIFRFU1RfTElTVF9TT1JUCisJdHJpc3RhdGUgIkxpbmtlZCBsaXN0IHNvcnRpbmcgdGVzdCIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCB8fCBtCisJaGVscAorCSAgRW5hYmxlIHRoaXMgdG8gdHVybiBvbiAnbGlzdF9zb3J0KCknIGZ1bmN0aW9uIHRlc3QuIFRoaXMgdGVzdCBpcworCSAgZXhlY3V0ZWQgb25seSBvbmNlIGR1cmluZyBzeXN0ZW0gYm9vdCAoc28gYWZmZWN0cyBvbmx5IGJvb3QgdGltZSksCisJICBvciBhdCBtb2R1bGUgbG9hZCB0aW1lLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9TT1JUCisJdHJpc3RhdGUgIkFycmF5LWJhc2VkIHNvcnQgdGVzdCIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCB8fCBtCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgc2VsZi10ZXN0IGZ1bmN0aW9uIG9mICdzb3J0KCknIGF0IGJvb3QsCisJICBvciBhdCBtb2R1bGUgbG9hZCB0aW1lLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgS1BST0JFU19TQU5JVFlfVEVTVAorCWJvb2wgIktwcm9iZXMgc2FuaXR5IHRlc3RzIgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJZGVwZW5kcyBvbiBLUFJPQkVTCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBvcHRpb24gcHJvdmlkZXMgZm9yIHRlc3RpbmcgYmFzaWMga3Byb2JlcyBmdW5jdGlvbmFsaXR5IG9uCisJICBib290LiBBIHNhbXBsZSBrcHJvYmUsIGpwcm9iZSBhbmQga3JldHByb2JlIGFyZSBpbnNlcnRlZCBhbmQKKwkgIHZlcmlmaWVkIGZvciBmdW5jdGlvbmFsaXR5LgorCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIEJBQ0tUUkFDRV9TRUxGX1RFU1QKKwl0cmlzdGF0ZSAiU2VsZiB0ZXN0IGZvciB0aGUgYmFja3RyYWNlIGNvZGUiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGlzIG9wdGlvbiBwcm92aWRlcyBhIGtlcm5lbCBtb2R1bGUgdGhhdCBjYW4gYmUgdXNlZCB0byB0ZXN0CisJICB0aGUga2VybmVsIHN0YWNrIGJhY2t0cmFjZSBjb2RlLiBUaGlzIG9wdGlvbiBpcyBub3QgdXNlZnVsCisJICBmb3IgZGlzdHJpYnV0aW9ucyBvciBnZW5lcmFsIGtlcm5lbHMsIGJ1dCBvbmx5IGZvciBrZXJuZWwKKwkgIGRldmVsb3BlcnMgd29ya2luZyBvbiBhcmNoaXRlY3R1cmUgY29kZS4KKworCSAgTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIGFsc28gdGVzdCBzYXZlZCBiYWNrdHJhY2VzLCB5b3Ugd2lsbAorCSAgaGF2ZSB0byBlbmFibGUgU1RBQ0tUUkFDRSBhcyB3ZWxsLgorCisJICBTYXkgTiBpZiB5b3UgYXJlIHVuc3VyZS4KKworY29uZmlnIFJCVFJFRV9URVNUCisJdHJpc3RhdGUgIlJlZC1CbGFjayB0cmVlIHRlc3QiCisJZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKwloZWxwCisJICBBIGJlbmNobWFyayBtZWFzdXJpbmcgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSByYnRyZWUgbGlicmFyeS4KKwkgIEFsc28gaW5jbHVkZXMgcmJ0cmVlIGludmFyaWFudCBjaGVja3MuCisKK2NvbmZpZyBJTlRFUlZBTF9UUkVFX1RFU1QKKwl0cmlzdGF0ZSAiSW50ZXJ2YWwgdHJlZSB0ZXN0IgorCWRlcGVuZHMgb24gREVCVUdfS0VSTkVMCisJc2VsZWN0IElOVEVSVkFMX1RSRUUKKwloZWxwCisJICBBIGJlbmNobWFyayBtZWFzdXJpbmcgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBpbnRlcnZhbCB0cmVlIGxpYnJhcnkKKworY29uZmlnIFBFUkNQVV9URVNUCisJdHJpc3RhdGUgIlBlciBjcHUgb3BlcmF0aW9ucyB0ZXN0IgorCWRlcGVuZHMgb24gbSAmJiBERUJVR19LRVJORUwKKwloZWxwCisJICBFbmFibGUgdGhpcyBvcHRpb24gdG8gYnVpbGQgdGVzdCBtb2R1bGUgd2hpY2ggdmFsaWRhdGVzIHBlci1jcHUKKwkgIG9wZXJhdGlvbnMuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBBVE9NSUM2NF9TRUxGVEVTVAorCXRyaXN0YXRlICJQZXJmb3JtIGFuIGF0b21pYzY0X3Qgc2VsZi10ZXN0IgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byB0ZXN0IHRoZSBhdG9taWM2NF90IGZ1bmN0aW9ucyBhdCBib290IG9yCisJICBhdCBtb2R1bGUgbG9hZCB0aW1lLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgQVNZTkNfUkFJRDZfVEVTVAorCXRyaXN0YXRlICJTZWxmIHRlc3QgZm9yIGhhcmR3YXJlIGFjY2VsZXJhdGVkIHJhaWQ2IHJlY292ZXJ5IgorCWRlcGVuZHMgb24gQVNZTkNfUkFJRDZfUkVDT1YKKwlzZWxlY3QgQVNZTkNfTUVNQ1BZCisJLS0taGVscC0tLQorCSAgVGhpcyBpcyBhIG9uZS1zaG90IHNlbGYgdGVzdCB0aGF0IHBlcm11dGVzIHRocm91Z2ggdGhlCisJICByZWNvdmVyeSBvZiBhbGwgdGhlIHBvc3NpYmxlIHR3byBkaXNrIGZhaWx1cmUgc2NlbmFyaW9zIGZvciBhCisJICBOLWRpc2sgYXJyYXkuICBSZWNvdmVyeSBpcyBwZXJmb3JtZWQgd2l0aCB0aGUgYXN5bmNocm9ub3VzCisJICByYWlkNiByZWNvdmVyeSByb3V0aW5lcywgYW5kIHdpbGwgb3B0aW9uYWxseSB1c2UgYW4gb2ZmbG9hZAorCSAgZW5naW5lIGlmIG9uZSBpcyBhdmFpbGFibGUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBURVNUX0hFWERVTVAKKwl0cmlzdGF0ZSAiVGVzdCBmdW5jdGlvbnMgbG9jYXRlZCBpbiB0aGUgaGV4ZHVtcCBtb2R1bGUgYXQgcnVudGltZSIKKworY29uZmlnIFRFU1RfU1RSSU5HX0hFTFBFUlMKKwl0cmlzdGF0ZSAiVGVzdCBmdW5jdGlvbnMgbG9jYXRlZCBpbiB0aGUgc3RyaW5nX2hlbHBlcnMgbW9kdWxlIGF0IHJ1bnRpbWUiCisKK2NvbmZpZyBURVNUX0tTVFJUT1gKKwl0cmlzdGF0ZSAiVGVzdCBrc3RydG8qKCkgZmFtaWx5IG9mIGZ1bmN0aW9ucyBhdCBydW50aW1lIgorCitjb25maWcgVEVTVF9QUklOVEYKKwl0cmlzdGF0ZSAiVGVzdCBwcmludGYoKSBmYW1pbHkgb2YgZnVuY3Rpb25zIGF0IHJ1bnRpbWUiCisKK2NvbmZpZyBURVNUX0JJVE1BUAorCXRyaXN0YXRlICJUZXN0IGJpdG1hcF8qKCkgZmFtaWx5IG9mIGZ1bmN0aW9ucyBhdCBydW50aW1lIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byB0ZXN0IHRoZSBiaXRtYXAgZnVuY3Rpb25zIGF0IGJvb3QuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBURVNUX1VVSUQKKwl0cmlzdGF0ZSAiVGVzdCBmdW5jdGlvbnMgbG9jYXRlZCBpbiB0aGUgdXVpZCBtb2R1bGUgYXQgcnVudGltZSIKKworY29uZmlnIFRFU1RfUkhBU0hUQUJMRQorCXRyaXN0YXRlICJQZXJmb3JtIHNlbGZ0ZXN0IG9uIHJlc2l6YWJsZSBoYXNoIHRhYmxlIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byB0ZXN0IHRoZSByaGFzaHRhYmxlIGZ1bmN0aW9ucyBhdCBib290LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9IQVNICisJdHJpc3RhdGUgIlBlcmZvcm0gc2VsZnRlc3Qgb24gaGFzaCBmdW5jdGlvbnMiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIHRoaXMgb3B0aW9uIHRvIHRlc3QgdGhlIGtlcm5lbCdzIGludGVnZXIgKDxsaW51eC9oYXNoLmg+KSwKKwkgIHN0cmluZyAoPGxpbnV4L3N0cmluZ2hhc2guaD4pLCBhbmQgc2lwaGFzaCAoPGxpbnV4L3NpcGhhc2guaD4pCisJICBoYXNoIGZ1bmN0aW9ucyBvbiBib290IChvciBtb2R1bGUgbG9hZCkuCisKKwkgIFRoaXMgaXMgaW50ZW5kZWQgdG8gaGVscCBwZW9wbGUgd3JpdGluZyBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKKwkgIG9wdGltaXplZCB2ZXJzaW9ucy4gIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBURVNUX1BBUk1BTgorCXRyaXN0YXRlICJQZXJmb3JtIHNlbGZ0ZXN0IG9uIHByaW9yaXR5IGFycmF5IG1hbmFnZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBQQVJNQU4KKwloZWxwCisJICBFbmFibGUgdGhpcyBvcHRpb24gdG8gdGVzdCBwcmlvcml0eSBhcnJheSBtYW5hZ2VyIG9uIGJvb3QKKwkgIChvciBtb2R1bGUgbG9hZCkuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBURVNUX0xLTQorCXRyaXN0YXRlICJUZXN0IG1vZHVsZSBsb2FkaW5nIHdpdGggJ2hlbGxvIHdvcmxkJyBtb2R1bGUiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBtCisJaGVscAorCSAgVGhpcyBidWlsZHMgdGhlICJ0ZXN0X21vZHVsZSIgbW9kdWxlIHRoYXQgZW1pdHMgIkhlbGxvLCB3b3JsZCIKKwkgIG9uIHByaW50ayB3aGVuIGxvYWRlZC4gSXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBmb3IgYmFzaWMKKwkgIGV2YWx1YXRpb24gb2YgdGhlIG1vZHVsZSBsb2FkaW5nIHN1YnN5c3RlbSAoZm9yIGV4YW1wbGUgd2hlbgorCSAgdmFsaWRhdGluZyBtb2R1bGUgdmVyaWZpY2F0aW9uKS4gSXQgbGFja3MgYW55IGV4dHJhIGRlcGVuZGVuY2llcywKKwkgIGFuZCB3aWxsIG5vdCBub3JtYWxseSBiZSBsb2FkZWQgYnkgdGhlIHN5c3RlbSB1bmxlc3MgZXhwbGljaXRseQorCSAgcmVxdWVzdGVkIGJ5IG5hbWUuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBURVNUX1VTRVJfQ09QWQorCXRyaXN0YXRlICJUZXN0IHVzZXIva2VybmVsIGJvdW5kYXJ5IHByb3RlY3Rpb25zIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gbQorCWhlbHAKKwkgIFRoaXMgYnVpbGRzIHRoZSAidGVzdF91c2VyX2NvcHkiIG1vZHVsZSB0aGF0IHJ1bnMgc2FuaXR5IGNoZWNrcworCSAgb24gdGhlIGNvcHlfdG8vZnJvbV91c2VyIGluZnJhc3RydWN0dXJlLCBtYWtpbmcgc3VyZSBiYXNpYworCSAgdXNlci9rZXJuZWwgYm91bmRhcnkgdGVzdGluZyBpcyB3b3JraW5nLiBJZiBpdCBmYWlscyB0byBsb2FkLAorCSAgYSByZWdyZXNzaW9uIGhhcyBiZWVuIGRldGVjdGVkIGluIHRoZSB1c2VyL2tlcm5lbCBtZW1vcnkgYm91bmRhcnkKKwkgIHByb3RlY3Rpb25zLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9CUEYKKwl0cmlzdGF0ZSAiVGVzdCBCUEYgZmlsdGVyIGZ1bmN0aW9uYWxpdHkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBtICYmIE5FVAorCWhlbHAKKwkgIFRoaXMgYnVpbGRzIHRoZSAidGVzdF9icGYiIG1vZHVsZSB0aGF0IHJ1bnMgdmFyaW91cyB0ZXN0IHZlY3RvcnMKKwkgIGFnYWluc3QgdGhlIEJQRiBpbnRlcnByZXRlciBvciBCUEYgSklUIGNvbXBpbGVyIGRlcGVuZGluZyBvbiB0aGUKKwkgIGN1cnJlbnQgc2V0dGluZy4gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIHVzZWZ1bCBmb3IgQlBGIEpJVCBjb21waWxlcgorCSAgZGV2ZWxvcG1lbnQsIGJ1dCBhbHNvIHRvIHJ1biByZWdyZXNzaW9uIHRlc3RzIGFnYWluc3QgY2hhbmdlcyBpbgorCSAgdGhlIGludGVycHJldGVyIGNvZGUuIEl0IGFsc28gZW5hYmxlcyB0ZXN0IHN0dWJzIGZvciBlQlBGIG1hcHMgYW5kCisJICB2ZXJpZmllciB1c2VkIGJ5IHVzZXIgc3BhY2UgdmVyaWZpZXIgdGVzdHN1aXRlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9GSVJNV0FSRQorCXRyaXN0YXRlICJUZXN0IGZpcm13YXJlIGxvYWRpbmcgdmlhIHVzZXJzcGFjZSBpbnRlcmZhY2UiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGV19MT0FERVIKKwloZWxwCisJICBUaGlzIGJ1aWxkcyB0aGUgInRlc3RfZmlybXdhcmUiIG1vZHVsZSB0aGF0IGNyZWF0ZXMgYSB1c2Vyc3BhY2UKKwkgIGludGVyZmFjZSBmb3IgdGVzdGluZyBmaXJtd2FyZSBsb2FkaW5nLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisJICBjb250cm9sIHRoZSB0cmlnZ2VyaW5nIG9mIGZpcm13YXJlIGxvYWRpbmcgd2l0aG91dCBuZWVkaW5nIGFuCisJICBhY3R1YWwgZmlybXdhcmUtdXNpbmcgZGV2aWNlLiBUaGUgY29udGVudHMgY2FuIGJlIHJlY2hlY2tlZCBieQorCSAgdXNlcnNwYWNlLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9TWVNDVEwKKwl0cmlzdGF0ZSAic3lzY3RsIHRlc3QgZHJpdmVyIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gUFJPQ19TWVNDVEwKKwloZWxwCisJICBUaGlzIGJ1aWxkcyB0aGUgInRlc3Rfc3lzY3RsIiBtb2R1bGUuIFRoaXMgZHJpdmVyIGVuYWJsZXMgdG8gdGVzdCB0aGUKKwkgIHByb2Mgc3lzY3RsIGludGVyZmFjZXMgYXZhaWxhYmxlIHRvIGRyaXZlcnMgc2FmZWx5IHdpdGhvdXQgYWZmZWN0aW5nCisJICBwcm9kdWN0aW9uIGtub2JzIHdoaWNoIG1pZ2h0IGFsdGVyIHN5c3RlbSBmdW5jdGlvbmFsaXR5LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9VREVMQVkKKwl0cmlzdGF0ZSAidWRlbGF5IHRlc3QgZHJpdmVyIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgYnVpbGRzIHRoZSAidWRlbGF5X3Rlc3QiIG1vZHVsZSB0aGF0IGhlbHBzIHRvIG1ha2Ugc3VyZQorCSAgdGhhdCB1ZGVsYXkoKSBpcyB3b3JraW5nIHByb3Blcmx5LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitjb25maWcgVEVTVF9TVEFUSUNfS0VZUworCXRyaXN0YXRlICJUZXN0IHN0YXRpYyBrZXlzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gbQorCWhlbHAKKwkgIFRlc3QgdGhlIHN0YXRpYyBrZXkgaW50ZXJmYWNlcy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFRFU1RfS01PRAorCXRyaXN0YXRlICJrbW9kIHN0cmVzcyB0ZXN0ZXIiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBtCisJZGVwZW5kcyBvbiBCTE9DSyAmJiAoNjRCSVQgfHwgTEJEQUYpCSAgIyBmb3IgWEZTLCBCVFJGUworCWRlcGVuZHMgb24gTkVUREVWSUNFUyAmJiBORVRfQ09SRSAmJiBJTkVUICMgZm9yIFRVTgorCWRlcGVuZHMgb24gQkxPQ0sKKwlzZWxlY3QgVEVTVF9MS00KKwlzZWxlY3QgWEZTX0ZTCisJc2VsZWN0IFRVTgorCXNlbGVjdCBCVFJGU19GUworCWhlbHAKKwkgIFRlc3QgdGhlIGtlcm5lbCdzIG1vZHVsZSBsb2FkaW5nIG1lY2hhbmlzbToga21vZC4ga21vZCBpbXBsZW1lbnRzCisJICBzdXBwb3J0IHRvIGxvYWQgbW9kdWxlcyB1c2luZyB0aGUgTGludXgga2VybmVsJ3MgdXNlcm1vZGUgaGVscGVyLgorCSAgVGhpcyB0ZXN0IHByb3ZpZGVzIGEgc2VyaWVzIG9mIHRlc3RzIGFnYWluc3Qga21vZC4KKworCSAgQWx0aG91Z2ggdGVjaG5pY2FsbHkgeW91IGNhbiBlaXRoZXIgYnVpbGQgdGVzdF9rbW9kIGFzIGEgbW9kdWxlIG9yCisJICBpbnRvIHRoZSBrZXJuZWwgd2UgZGlzYWxsb3cgYnVpbGRpbmcgaXQgaW50byB0aGUga2VybmVsIHNpbmNlCisJICBpdCBzdHJlc3MgdGVzdHMgcmVxdWVzdF9tb2R1bGUoKSBhbmQgdGhpcyB3aWxsIHZlcnkgbGlrZWx5IGNhdXNlCisJICBzb21lIGlzc3VlcyBieSB0YWtpbmcgb3ZlciBwcmVjaW91cyB0aHJlYWRzIGF2YWlsYWJsZSBmcm9tIG90aGVyCisJICBtb2R1bGUgbG9hZCByZXF1ZXN0cywgdWx0aW1hdGVseSB0aGlzIGNvdWxkIGJlIGZhdGFsLgorCisJICBUbyBydW4gdGVzdHMgcnVuOgorCisJICB0b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9rbW9kL2ttb2Quc2ggLS1oZWxwCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKK2NvbmZpZyBURVNUX0RFQlVHX1ZJUlRVQUwKKwl0cmlzdGF0ZSAiVGVzdCBDT05GSUdfREVCVUdfVklSVFVBTCBmZWF0dXJlIgorCWRlcGVuZHMgb24gREVCVUdfVklSVFVBTAorCWhlbHAKKwkgIFRlc3QgdGhlIGtlcm5lbCdzIGFiaWxpdHkgdG8gZGV0ZWN0IGluY29ycmVjdCBjYWxscyB0bworCSAgdmlydF90b19waHlzKCkgZG9uZSBhZ2FpbnN0IHRoZSBub24tbGluZWFyIHBhcnQgb2YgdGhlCisJICBrZXJuZWwncyB2aXJ0dWFsIGFkZHJlc3MgbWFwLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitlbmRtZW51ICMgcnVudGltZSB0ZXN0cworCitjb25maWcgTUVNVEVTVAorCWJvb2wgIk1lbXRlc3QiCisJZGVwZW5kcyBvbiBIQVZFX01FTUJMT0NLCisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWRkcyBhIGtlcm5lbCBwYXJhbWV0ZXIgJ21lbXRlc3QnLCB3aGljaCBhbGxvd3MgbWVtdGVzdAorCSAgdG8gYmUgc2V0LgorCSAgICAgICAgbWVtdGVzdD0wLCBtZWFuIGRpc2FibGVkOyAtLSBkZWZhdWx0CisJICAgICAgICBtZW10ZXN0PTEsIG1lYW4gZG8gMSB0ZXN0IHBhdHRlcm47CisJICAgICAgICAuLi4KKwkgICAgICAgIG1lbXRlc3Q9MTcsIG1lYW4gZG8gMTcgdGVzdCBwYXR0ZXJucy4KKwkgIElmIHlvdSBhcmUgdW5zdXJlIGhvdyB0byBhbnN3ZXIgdGhpcyBxdWVzdGlvbiwgYW5zd2VyIE4uCisKK2NvbmZpZyBCVUdfT05fREFUQV9DT1JSVVBUSU9OCisJYm9vbCAiVHJpZ2dlciBhIEJVRyB3aGVuIGRhdGEgY29ycnVwdGlvbiBpcyBkZXRlY3RlZCIKKwlzZWxlY3QgREVCVUdfTElTVAorCWhlbHAKKwkgIFNlbGVjdCB0aGlzIG9wdGlvbiBpZiB0aGUga2VybmVsIHNob3VsZCBCVUcgd2hlbiBpdCBlbmNvdW50ZXJzCisJICBkYXRhIGNvcnJ1cHRpb24gaW4ga2VybmVsIG1lbW9yeSBzdHJ1Y3R1cmVzIHdoZW4gdGhleSBnZXQgY2hlY2tlZAorCSAgZm9yIHZhbGlkaXR5LgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCitzb3VyY2UgInNhbXBsZXMvS2NvbmZpZyIKKworc291cmNlICJsaWIvS2NvbmZpZy5rZ2RiIgorCitzb3VyY2UgImxpYi9LY29uZmlnLnVic2FuIgorCitjb25maWcgQVJDSF9IQVNfREVWTUVNX0lTX0FMTE9XRUQKKwlib29sCisKK2NvbmZpZyBTVFJJQ1RfREVWTUVNCisJYm9vbCAiRmlsdGVyIGFjY2VzcyB0byAvZGV2L21lbSIKKwlkZXBlbmRzIG9uIE1NVSAmJiBERVZNRU0KKwlkZXBlbmRzIG9uIEFSQ0hfSEFTX0RFVk1FTV9JU19BTExPV0VECisJZGVmYXVsdCB5IGlmIFRJTEUgfHwgUFBDCisJLS0taGVscC0tLQorCSAgSWYgdGhpcyBvcHRpb24gaXMgZGlzYWJsZWQsIHlvdSBhbGxvdyB1c2Vyc3BhY2UgKHJvb3QpIGFjY2VzcyB0byBhbGwKKwkgIG9mIG1lbW9yeSwgaW5jbHVkaW5nIGtlcm5lbCBhbmQgdXNlcnNwYWNlIG1lbW9yeS4gQWNjaWRlbnRhbAorCSAgYWNjZXNzIHRvIHRoaXMgaXMgb2J2aW91c2x5IGRpc2FzdHJvdXMsIGJ1dCBzcGVjaWZpYyBhY2Nlc3MgY2FuCisJICBiZSB1c2VkIGJ5IHBlb3BsZSBkZWJ1Z2dpbmcgdGhlIGtlcm5lbC4gTm90ZSB0aGF0IHdpdGggUEFUIHN1cHBvcnQKKwkgIGVuYWJsZWQsIGV2ZW4gaW4gdGhpcyBjYXNlIHRoZXJlIGFyZSByZXN0cmljdGlvbnMgb24gL2Rldi9tZW0KKwkgIHVzZSBkdWUgdG8gdGhlIGNhY2hlIGFsaWFzaW5nIHJlcXVpcmVtZW50cy4KKworCSAgSWYgdGhpcyBvcHRpb24gaXMgc3dpdGNoZWQgb24sIGFuZCBJT19TVFJJQ1RfREVWTUVNPW4sIHRoZSAvZGV2L21lbQorCSAgZmlsZSBvbmx5IGFsbG93cyB1c2Vyc3BhY2UgYWNjZXNzIHRvIFBDSSBzcGFjZSBhbmQgdGhlIEJJT1MgY29kZSBhbmQKKwkgIGRhdGEgcmVnaW9ucy4gIFRoaXMgaXMgc3VmZmljaWVudCBmb3IgZG9zZW11IGFuZCBYIGFuZCBhbGwgY29tbW9uCisJICB1c2VycyBvZiAvZGV2L21lbS4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZLgorCitjb25maWcgSU9fU1RSSUNUX0RFVk1FTQorCWJvb2wgIkZpbHRlciBJL08gYWNjZXNzIHRvIC9kZXYvbWVtIgorCWRlcGVuZHMgb24gU1RSSUNUX0RFVk1FTQorCS0tLWhlbHAtLS0KKwkgIElmIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLCB5b3UgYWxsb3cgdXNlcnNwYWNlIChyb290KSBhY2Nlc3MgdG8gYWxsCisJICBpby1tZW1vcnkgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGEgZHJpdmVyIGlzIGFjdGl2ZWx5IHVzaW5nIHRoYXQKKwkgIHJhbmdlLiAgQWNjaWRlbnRhbCBhY2Nlc3MgdG8gdGhpcyBpcyBvYnZpb3VzbHkgZGlzYXN0cm91cywgYnV0CisJICBzcGVjaWZpYyBhY2Nlc3MgY2FuIGJlIHVzZWQgYnkgcGVvcGxlIGRlYnVnZ2luZyBrZXJuZWwgZHJpdmVycy4KKworCSAgSWYgdGhpcyBvcHRpb24gaXMgc3dpdGNoZWQgb24sIHRoZSAvZGV2L21lbSBmaWxlIG9ubHkgYWxsb3dzCisJICB1c2Vyc3BhY2UgYWNjZXNzIHRvICppZGxlKiBpby1tZW1vcnkgcmFuZ2VzIChzZWUgL3Byb2MvaW9tZW0pIFRoaXMKKwkgIG1heSBicmVhayB0cmFkaXRpb25hbCB1c2VycyBvZiAvZGV2L21lbSAoZG9zZW11LCBsZWdhY3kgWCwgZXRjLi4uKQorCSAgaWYgdGhlIGRyaXZlciB1c2luZyBhIGdpdmVuIHJhbmdlIGNhbm5vdCBiZSBkaXNhYmxlZC4KKworCSAgSWYgaW4gZG91YnQsIHNheSBZLgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvS2NvbmZpZy5rYXNhbiBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL0tjb25maWcua2FzYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNWQwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL0tjb25maWcua2FzYW4KQEAgLTAsMCArMSw2NyBAQAorY29uZmlnIEhBVkVfQVJDSF9LQVNBTgorCWJvb2wKKworaWYgSEFWRV9BUkNIX0tBU0FOCisKK2NvbmZpZyBLQVNBTgorCWJvb2wgIktBU2FuOiBydW50aW1lIG1lbW9yeSBkZWJ1Z2dlciIKKwlkZXBlbmRzIG9uIFNMVUIgfHwgKFNMQUIgJiYgIURFQlVHX1NMQUIpCisJc2VsZWN0IENPTlNUUlVDVE9SUworCXNlbGVjdCBTVEFDS0RFUE9UCisJaGVscAorCSAgRW5hYmxlcyBrZXJuZWwgYWRkcmVzcyBzYW5pdGl6ZXIgLSBydW50aW1lIG1lbW9yeSBkZWJ1Z2dlciwKKwkgIGRlc2lnbmVkIHRvIGZpbmQgb3V0LW9mLWJvdW5kcyBhY2Nlc3NlcyBhbmQgdXNlLWFmdGVyLWZyZWUgYnVncy4KKwkgIFRoaXMgaXMgc3RyaWN0bHkgYSBkZWJ1Z2dpbmcgZmVhdHVyZSBhbmQgaXQgcmVxdWlyZXMgYSBnY2MgdmVyc2lvbgorCSAgb2YgNC45LjIgb3IgbGF0ZXIuIERldGVjdGlvbiBvZiBvdXQgb2YgYm91bmRzIGFjY2Vzc2VzIHRvIHN0YWNrIG9yCisJICBnbG9iYWwgdmFyaWFibGVzIHJlcXVpcmVzIGdjYyA1LjAgb3IgbGF0ZXIuCisJICBUaGlzIGZlYXR1cmUgY29uc3VtZXMgYWJvdXQgMS84IG9mIGF2YWlsYWJsZSBtZW1vcnkgYW5kIGJyaW5ncyBhYm91dAorCSAgfngzIHBlcmZvcm1hbmNlIHNsb3dkb3duLgorCSAgRm9yIGJldHRlciBlcnJvciBkZXRlY3Rpb24gZW5hYmxlIENPTkZJR19TVEFDS1RSQUNFLgorCSAgQ3VycmVudGx5IENPTkZJR19LQVNBTiBkb2Vzbid0IHdvcmsgd2l0aCBDT05GSUdfREVCVUdfU0xBQgorCSAgKHRoZSByZXN1bHRpbmcga2VybmVsIGRvZXMgbm90IGJvb3QpLgorCitjb25maWcgS0FTQU5fRVhUUkEKKwlib29sICJLQXNhbjogZXh0cmEgY2hlY2tzIgorCWRlcGVuZHMgb24gS0FTQU4gJiYgREVCVUdfS0VSTkVMICYmICFDT01QSUxFX1RFU1QKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgZnVydGhlciBjaGVja3MgaW4gdGhlIGtlcm5lbCBhZGRyZXNzIHNhbml0aXplciwgZm9yIG5vdworCSAgaXQgb25seSBpbmNsdWRlcyB0aGUgYWRkcmVzcy11c2UtYWZ0ZXItc2NvcGUgY2hlY2sgdGhhdCBjYW4gbGVhZAorCSAgdG8gZXhjZXNzaXZlIGtlcm5lbCBzdGFjayB1c2FnZSwgZnJhbWUgc2l6ZSB3YXJuaW5ncyBhbmQgbG9uZ2VyCisJICBjb21waWxlIHRpbWUuCisJICBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD04MTcxNSBoYXMgbW9yZQorCisKK2Nob2ljZQorCXByb21wdCAiSW5zdHJ1bWVudGF0aW9uIHR5cGUiCisJZGVwZW5kcyBvbiBLQVNBTgorCWRlZmF1bHQgS0FTQU5fT1VUTElORQorCitjb25maWcgS0FTQU5fT1VUTElORQorCWJvb2wgIk91dGxpbmUgaW5zdHJ1bWVudGF0aW9uIgorCWhlbHAKKwkgIEJlZm9yZSBldmVyeSBtZW1vcnkgYWNjZXNzIGNvbXBpbGVyIGluc2VydCBmdW5jdGlvbiBjYWxsCisJICBfX2FzYW5fbG9hZCovX19hc2FuX3N0b3JlKi4gVGhlc2UgZnVuY3Rpb25zIHBlcmZvcm1zIGNoZWNrCisJICBvZiBzaGFkb3cgbWVtb3J5LiBUaGlzIGlzIHNsb3dlciB0aGFuIGlubGluZSBpbnN0cnVtZW50YXRpb24sCisJICBob3dldmVyIGl0IGRvZXNuJ3QgYmxvYXQgc2l6ZSBvZiBrZXJuZWwncyAudGV4dCBzZWN0aW9uIHNvCisJICBtdWNoIGFzIGlubGluZSBkb2VzLgorCitjb25maWcgS0FTQU5fSU5MSU5FCisJYm9vbCAiSW5saW5lIGluc3RydW1lbnRhdGlvbiIKKwloZWxwCisJICBDb21waWxlciBkaXJlY3RseSBpbnNlcnRzIGNvZGUgY2hlY2tpbmcgc2hhZG93IG1lbW9yeSBiZWZvcmUKKwkgIG1lbW9yeSBhY2Nlc3Nlcy4gVGhpcyBpcyBmYXN0ZXIgdGhhbiBvdXRsaW5lIChpbiBzb21lIHdvcmtsb2FkcworCSAgaXQgZ2l2ZXMgYWJvdXQgeDIgYm9vc3Qgb3ZlciBvdXRsaW5lIGluc3RydW1lbnRhdGlvbiksIGJ1dAorCSAgbWFrZSBrZXJuZWwncyAudGV4dCBzaXplIG11Y2ggYmlnZ2VyLgorCSAgVGhpcyByZXF1aXJlcyBhIGdjYyB2ZXJzaW9uIG9mIDUuMCBvciBsYXRlci4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBURVNUX0tBU0FOCisJdHJpc3RhdGUgIk1vZHVsZSBmb3IgdGVzdGluZyBrYXNhbiBmb3IgYnVnIGRldGVjdGlvbiIKKwlkZXBlbmRzIG9uIG0gJiYgS0FTQU4KKwloZWxwCisJICBUaGlzIGlzIGEgdGVzdCBtb2R1bGUgZG9pbmcgdmFyaW91cyBuYXN0eSB0aGluZ3MgbGlrZQorCSAgb3V0IG9mIGJvdW5kcyBhY2Nlc3NlcywgdXNlIGFmdGVyIGZyZWUuIEl0IGlzIHVzZWZ1bCBmb3IgdGVzdGluZworCSAga2VybmVsIGRlYnVnZ2luZyBmZWF0dXJlcyBsaWtlIGtlcm5lbCBhZGRyZXNzIHNhbml0aXplci4KKworZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL0tjb25maWcua2dkYiBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL0tjb25maWcua2dkYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRmZjBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvS2NvbmZpZy5rZ2RiCkBAIC0wLDAgKzEsMTI2IEBACisKK2NvbmZpZyBIQVZFX0FSQ0hfS0dEQgorCWJvb2wKKworbWVudWNvbmZpZyBLR0RCCisJYm9vbCAiS0dEQjoga2VybmVsIGRlYnVnZ2VyIgorCWRlcGVuZHMgb24gSEFWRV9BUkNIX0tHREIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgWSBoZXJlLCBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIHJlbW90ZWx5IGRlYnVnIHRoZQorCSAga2VybmVsIHVzaW5nIGdkYi4gIEl0IGlzIHJlY29tbWVuZGVkIGJ1dCBub3QgcmVxdWlyZWQsIHRoYXQKKwkgIHlvdSBhbHNvIHR1cm4gb24gdGhlIGtlcm5lbCBjb25maWcgb3B0aW9uCisJICBDT05GSUdfRlJBTUVfUE9JTlRFUiB0byBhaWQgaW4gcHJvZHVjaW5nIG1vcmUgcmVsaWFibGUgc3RhY2sKKwkgIGJhY2t0cmFjZXMgaW4gdGhlIGV4dGVybmFsIGRlYnVnZ2VyLiAgRG9jdW1lbnRhdGlvbiBvZgorCSAga2VybmVsIGRlYnVnZ2VyIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8va2dkYi5zb3VyY2Vmb3JnZS5uZXQKKwkgIGFzIHdlbGwgYXMgaW4gRG9jdW1lbnRhdGlvbi9kZXYtdG9vbHMva2dkYi5yc3QuICBJZgorCSAgdW5zdXJlLCBzYXkgTi4KKworaWYgS0dEQgorCitjb25maWcgS0dEQl9TRVJJQUxfQ09OU09MRQorCXRyaXN0YXRlICJLR0RCOiB1c2Uga2dkYiBvdmVyIHRoZSBzZXJpYWwgY29uc29sZSIKKwlzZWxlY3QgQ09OU09MRV9QT0xMCisJc2VsZWN0IE1BR0lDX1NZU1JRCisJZGVwZW5kcyBvbiBUVFkgJiYgSFdfQ09OU09MRQorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNoYXJlIGEgc2VyaWFsIGNvbnNvbGUgd2l0aCBrZ2RiLiBTeXNycS1nIG11c3QgYmUgdXNlZAorCSAgdG8gYnJlYWsgaW4gaW5pdGlhbGx5LgorCitjb25maWcgS0dEQl9URVNUUworCWJvb2wgIktHREI6IGludGVybmFsIHRlc3Qgc3VpdGUiCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhpcyBpcyBhIGtnZGIgSS9PIG1vZHVsZSBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gdGVzdAorCSAga2dkYidzIGludGVybmFsIGZ1bmN0aW9ucy4gIFRoaXMga2dkYiBJL08gbW9kdWxlIGlzCisJICBpbnRlbmRlZCB0byBmb3IgdGhlIGRldmVsb3BtZW50IG9mIG5ldyBrZ2RiIHN0dWJzCisJICBhcyB3ZWxsIGFzIHJlZ3Jlc3Npb24gdGVzdGluZyB0aGUga2dkYiBpbnRlcm5hbHMuCisJICBTZWUgdGhlIGRyaXZlcnMvbWlzYy9rZ2RidHMuYyBmb3IgdGhlIGRldGFpbHMgYWJvdXQKKwkgIHRoZSB0ZXN0cy4gIFRoZSBtb3N0IGJhc2ljIG9mIHRoaXMgSS9PIG1vZHVsZSBpcyB0byBib290CisJICBhIGtlcm5lbCBib290IGFyZ3VtZW50cyAia2dkYndhaXQga2dkYnRzPVYxRjEwMCIKKworY29uZmlnIEtHREJfVEVTVFNfT05fQk9PVAorCWJvb2wgIktHREI6IFJ1biB0ZXN0cyBvbiBib290IgorCWRlcGVuZHMgb24gS0dEQl9URVNUUworCWRlZmF1bHQgbgorCWhlbHAKKwkgIFJ1biB0aGUga2dkYiB0ZXN0cyBvbiBib290IHVwIGF1dG9tYXRpY2FsbHkgd2l0aG91dCB0aGUgbmVlZAorCSAgdG8gcGFzcyBpbiBhIGtlcm5lbCBwYXJhbWV0ZXIKKworY29uZmlnIEtHREJfVEVTVFNfQk9PVF9TVFJJTkcKKwlzdHJpbmcgIktHREI6IHdoaWNoIGludGVybmFsIGtnZGIgdGVzdHMgdG8gcnVuIgorCWRlcGVuZHMgb24gS0dEQl9URVNUU19PTl9CT09UCisJZGVmYXVsdCAiVjFGMTAwIgorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGNvbW1hbmQgc3RyaW5nIHRvIHNlbmQgdGhlIGtnZGIgdGVzdCBzdWl0ZSBvbgorCSAgYm9vdC4gIFNlZSB0aGUgZHJpdmVycy9taXNjL2tnZGJ0cy5jIGZvciBkZXRhaWxlZAorCSAgaW5mb3JtYXRpb24gYWJvdXQgb3RoZXIgc3RyaW5ncyB5b3UgY291bGQgdXNlIGJleW9uZCB0aGUKKwkgIGRlZmF1bHQgb2YgVjFGMTAwLgorCitjb25maWcgS0dEQl9MT1dfTEVWRUxfVFJBUAorICAgICAgIGJvb2wgIktHREI6IEFsbG93IGRlYnVnZ2luZyB3aXRoIHRyYXBzIGluIG5vdGlmaWVycyIKKyAgICAgICBkZXBlbmRzIG9uIFg4NiB8fCBNSVBTCisgICAgICAgZGVmYXVsdCBuCisgICAgICAgaGVscAorICAgICAgICAgVGhpcyB3aWxsIGFkZCBhbiBleHRyYSBjYWxsIGJhY2sgdG8ga2dkYiBmb3IgdGhlIGJyZWFrcG9pbnQKKyAgICAgICAgIGV4Y2VwdGlvbiBoYW5kbGVyIHdoaWNoIHdpbGwgYWxsb3cga2dkYiB0byBzdGVwIHRocm91Z2ggYQorICAgICAgICAgbm90aWZ5IGhhbmRsZXIuCisKK2NvbmZpZyBLR0RCX0tEQgorCWJvb2wgIktHREJfS0RCOiBpbmNsdWRlIGtkYiBmcm9udGVuZCBmb3Iga2dkYiIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBLREIgZnJvbnRlbmQgZm9yIGtlcm5lbAorCitjb25maWcgS0RCX0RFRkFVTFRfRU5BQkxFCisJaGV4ICJLREI6IFNlbGVjdCBrZGIgY29tbWFuZCBmdW5jdGlvbnMgdG8gYmUgZW5hYmxlZCBieSBkZWZhdWx0IgorCWRlcGVuZHMgb24gS0dEQl9LREIKKwlkZWZhdWx0IDB4MQorCWhlbHAKKwkgIFNwZWNpZmllcnMgd2hpY2gga2RiIGNvbW1hbmRzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFRoaXMgbWF5CisJICBiZSBzZXQgdG8gMSBvciAwIHRvIGVuYWJsZSBhbGwgY29tbWFuZHMgb3IgZGlzYWJsZSBhbG1vc3QgYWxsCisJICBjb21tYW5kcy4KKworCSAgQWx0ZXJuYXRpdmVseSB0aGUgZm9sbG93aW5nIGJpdG1hc2sgYXBwbGllczoKKworCSAgICAweDAwMDIgLSBhbGxvdyBhcmJpdHJhcnkgcmVhZHMgZnJvbSBtZW1vcnkgYW5kIHN5bWJvbCBsb29rdXAKKwkgICAgMHgwMDA0IC0gYWxsb3cgYXJiaXRyYXJ5IHdyaXRlcyB0byBtZW1vcnkKKwkgICAgMHgwMDA4IC0gYWxsb3cgY3VycmVudCByZWdpc3RlciBzdGF0ZSB0byBiZSBpbnNwZWN0ZWQKKwkgICAgMHgwMDEwIC0gYWxsb3cgY3VycmVudCByZWdpc3RlciBzdGF0ZSB0byBiZSBtb2RpZmllZAorCSAgICAweDAwMjAgLSBhbGxvdyBwYXNzaXZlIGluc3BlY3Rpb24gKGJhY2t0cmFjZSwgcHJvY2VzcyBsaXN0LCBsc21vZCkKKwkgICAgMHgwMDQwIC0gYWxsb3cgZmxvdyBjb250cm9sIG1hbmFnZW1lbnQgKGJyZWFrcG9pbnQsIHNpbmdsZSBzdGVwKQorCSAgICAweDAwODAgLSBlbmFibGUgc2lnbmFsbGluZyBvZiBwcm9jZXNzZXMKKwkgICAgMHgwMTAwIC0gYWxsb3cgbWFjaGluZSB0byBiZSByZWJvb3RlZAorCisJICBUaGUgY29uZmlnIG9wdGlvbiBtZXJlbHkgc2V0cyB0aGUgZGVmYXVsdCBhdCBib290IHRpbWUuIEJvdGgKKwkgIGlzc3VpbmcgJ2VjaG8gWCA+IC9zeXMvbW9kdWxlL2tkYi9wYXJhbWV0ZXJzL2NtZF9lbmFibGUnIG9yCisgICAgICAgICAgc2V0dGluZyB3aXRoIGtkYi5jbWRfZW5hYmxlPVgga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gd2lsbAorCSAgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisKK2NvbmZpZyBLREJfS0VZQk9BUkQKKwlib29sICJLR0RCX0tEQjoga2V5Ym9hcmQgYXMgaW5wdXQgZGV2aWNlIgorCWRlcGVuZHMgb24gVlQgJiYgS0dEQl9LREIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBLREIgY2FuIHVzZSBhIFBTLzIgdHlwZSBrZXlib2FyZCBmb3IgYW4gaW5wdXQgZGV2aWNlCisKK2NvbmZpZyBLREJfQ09OVElOVUVfQ0FUQVNUUk9QSElDCisJaW50ICJLREI6IGNvbnRpbnVlIGFmdGVyIGNhdGFzdHJvcGhpYyBlcnJvcnMiCisJZGVwZW5kcyBvbiBLR0RCX0tEQgorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgVGhpcyBpbnRlZ2VyIGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2Yga2RiIHdoZW4gdGhlIGtlcm5lbCBnZXRzIGEKKwkgIGNhdGFzdHJvcGhpYyBlcnJvciwgaS5lLiBmb3IgYSBwYW5pYyBvciBvb3BzLgorCSAgV2hlbiBLREIgaXMgYWN0aXZlIGFuZCBhIGNhdGFzdHJvcGhpYyBlcnJvciBvY2N1cnMsIG5vdGhpbmcgZXh0cmEKKwkgIHdpbGwgaGFwcGVuIHVudGlsIHlvdSB0eXBlICdnbycuCisJICBDT05GSUdfS0RCX0NPTlRJTlVFX0NBVEFTVFJPUEhJQyA9PSAwIChkZWZhdWx0KS4gVGhlIGZpcnN0IHRpbWUKKwkgIHlvdSB0eXBlICdnbycsIHlvdSB3aWxsIGJlIHdhcm5lZCBieSBrZGIuIFRoZSBzZWNlbmQgdGltZSB5b3UgdHlwZQorCSAgJ2dvJywgS0RCIHRyaWVzIHRvIGNvbnRpbnVlLiBObyBndWFyYW50ZWVzIHRoYXQgdGhlCisJICBrZXJuZWwgaXMgc3RpbGwgdXNhYmxlIGluIHRoaXMgc2l0dWF0aW9uLgorCSAgQ09ORklHX0tEQl9DT05USU5VRV9DQVRBU1RST1BISUMgPT0gMS4gS0RCIHRyaWVzIHRvIGNvbnRpbnVlLgorCSAgTm8gZ3VhcmFudGVlcyB0aGF0IHRoZSBrZXJuZWwgaXMgc3RpbGwgdXNhYmxlIGluIHRoaXMgc2l0dWF0aW9uLgorCSAgQ09ORklHX0tEQl9DT05USU5VRV9DQVRBU1RST1BISUMgPT0gMi4gS0RCIGZvcmNlcyBhIHJlYm9vdC4KKwkgIElmIHlvdSBhcmUgbm90IHN1cmUsIHNheSAwLgorCitlbmRpZiAjIEtHREIKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL0tjb25maWcudWJzYW4gYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9LY29uZmlnLnVic2FuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjljMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9LY29uZmlnLnVic2FuCkBAIC0wLDAgKzEsNDggQEAKK2NvbmZpZyBBUkNIX0hBU19VQlNBTl9TQU5JVElaRV9BTEwKKwlib29sCisKK2NvbmZpZyBBUkNIX1dBTlRTX1VCU0FOX05PX05VTEwKKwlkZWZfYm9vbCBuCisKK2NvbmZpZyBVQlNBTgorCWJvb2wgIlVuZGVmaW5lZCBiZWhhdmlvdXIgc2FuaXR5IGNoZWNrZXIiCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB1bmRlZmluZWQgYmVoYXZpb3VyIHNhbml0eSBjaGVja2VyCisJICBDb21waWxlLXRpbWUgaW5zdHJ1bWVudGF0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHZhcmlvdXMgdW5kZWZpbmVkCisJICBiZWhhdmlvdXJzIGluIHJ1bnRpbWUuIFZhcmlvdXMgdHlwZXMgb2YgY2hlY2tzIG1heSBiZSBlbmFibGVkCisJICB2aWEgYm9vdCBwYXJhbWV0ZXIgdWJzYW5faGFuZGxlCisJICAoc2VlOiBEb2N1bWVudGF0aW9uL2Rldi10b29scy91YnNhbi5yc3QpLgorCitjb25maWcgVUJTQU5fU0FOSVRJWkVfQUxMCisJYm9vbCAiRW5hYmxlIGluc3RydW1lbnRhdGlvbiBmb3IgdGhlIGVudGlyZSBrZXJuZWwiCisJZGVwZW5kcyBvbiBVQlNBTgorCWRlcGVuZHMgb24gQVJDSF9IQVNfVUJTQU5fU0FOSVRJWkVfQUxMCisKKwkjIFdlIGJ1aWxkIHdpdGggLVduby1tYXliZS11bmluaXRpbHplZCwgYnV0IHdlIHN0aWxsIHdhbnQgdG8KKwkjIHVzZSAtV21heWJlLXVuaW5pdGlsaXplZCBpbiBhbGxtb2Rjb25maWcgYnVpbGRzLgorCSMgU28gZGVwZW5kc3kgYmVsbG93IHVzZWQgdG8gZGlzYWJsZSB0aGlzIG9wdGlvbiBpbiBhbGxtb2Rjb25maWcKKwlkZXBlbmRzIG9uICFDT01QSUxFX1RFU1QKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhY3RpdmF0ZXMgaW5zdHJ1bWVudGF0aW9uIGZvciB0aGUgZW50aXJlIGtlcm5lbC4KKwkgIElmIHlvdSBkb24ndCBlbmFibGUgdGhpcyBvcHRpb24sIHlvdSBoYXZlIHRvIGV4cGxpY2l0bHkgc3BlY2lmeQorCSAgVUJTQU5fU0FOSVRJWkUgOj0geSBmb3IgdGhlIGZpbGVzL2RpcmVjdG9yaWVzIHlvdSB3YW50IHRvIGNoZWNrIGZvciBVQi4KKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgZ2V0IGtlcm5lbCBpbWFnZSBzaXplIGluY3JlYXNlZAorCSAgc2lnbmlmaWNhbnRseS4KKworY29uZmlnIFVCU0FOX0FMSUdOTUVOVAorCWJvb2wgIkVuYWJsZSBjaGVja2luZyBvZiBwb2ludGVycyBhbGlnbm1lbnQiCisJZGVwZW5kcyBvbiBVQlNBTgorCWRlZmF1bHQgeSBpZiAhSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgZGV0ZWN0aW9uIG9mIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMuCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgc3VwcG9ydCB1bmFsaWduZWQKKwkgIGFjY2Vzc2VzIG1heSBwcm9kdWNlIGEgbG90IG9mIGZhbHNlIHBvc2l0aXZlcy4KKworY29uZmlnIFVCU0FOX05VTEwKKwlib29sICJFbmFibGUgY2hlY2tpbmcgb2YgbnVsbCBwb2ludGVycyIKKwlkZXBlbmRzIG9uIFVCU0FOCisJZGVmYXVsdCB5IGlmICFBUkNIX1dBTlRTX1VCU0FOX05PX05VTEwKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGRldGVjdGlvbiBvZiBtZW1vcnkgYWNjZXNzZXMgdmlhIGEKKwkgIG51bGwgcG9pbnRlci4KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL01ha2VmaWxlIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUyZDI2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL01ha2VmaWxlCkBAIC0wLDAgKzEsMjY0IEBACisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjCisjIE1ha2VmaWxlIGZvciBzb21lIGxpYnMgbmVlZGVkIGluIHRoZSBrZXJuZWwuCisjCisKK2lmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKK09SSUdfQ0ZMQUdTIDo9ICQoS0JVSUxEX0NGTEFHUykKK0tCVUlMRF9DRkxBR1MgPSAkKHN1YnN0ICQoQ0NfRkxBR1NfRlRSQUNFKSwsJChPUklHX0NGTEFHUykpCitlbmRpZgorCisjIFRoZXNlIGZpbGVzIGFyZSBkaXNhYmxlZCBiZWNhdXNlIHRoZXkgcHJvZHVjZSBsb3RzIG9mIG5vbi1pbnRlcmVzdGluZyBhbmQvb3IKKyMgZmxha3kgY292ZXJhZ2UgdGhhdCBpcyBub3QgYSBmdW5jdGlvbiBvZiBzeXNjYWxsIGlucHV0cy4gRm9yIGV4YW1wbGUsCisjIHJidHJlZSBjYW4gYmUgZ2xvYmFsIGFuZCBpbmRpdmlkdWFsIHJvdGF0aW9ucyBkb24ndCBjb3JyZWxhdGUgd2l0aCBpbnB1dHMuCitLQ09WX0lOU1RSVU1FTlRfc3RyaW5nLm8gOj0gbgorS0NPVl9JTlNUUlVNRU5UX3JidHJlZS5vIDo9IG4KK0tDT1ZfSU5TVFJVTUVOVF9saXN0X2RlYnVnLm8gOj0gbgorS0NPVl9JTlNUUlVNRU5UX2RlYnVnb2JqZWN0cy5vIDo9IG4KK0tDT1ZfSU5TVFJVTUVOVF9keW5hbWljX2RlYnVnLm8gOj0gbgorCisjIEVhcmx5IGJvb3QgdXNlIG9mIGNtZGxpbmUsIGRvbid0IGluc3RydW1lbnQgaXQKK2lmZGVmIENPTkZJR19BTURfTUVNX0VOQ1JZUFQKK0tBU0FOX1NBTklUSVpFX3N0cmluZy5vIDo9IG4KKworaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgorQ0ZMQUdTX1JFTU9WRV9zdHJpbmcubyA9IC1wZworZW5kaWYKKworQ0ZMQUdTX3N0cmluZy5vIDo9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQorZW5kaWYKKworbGliLXkgOj0gY3R5cGUubyBzdHJpbmcubyB2c3ByaW50Zi5vIGNtZGxpbmUubyBcCisJIHJidHJlZS5vIHJhZGl4LXRyZWUubyBkdW1wX3N0YWNrLm8gdGltZXJxdWV1ZS5vXAorCSBpZHIubyBpbnRfc3FydC5vIGV4dGFibGUubyBcCisJIHNoYTEubyBjaGFjaGEyMC5vIGlycV9yZWdzLm8gYXJndl9zcGxpdC5vIFwKKwkgZmxleF9wcm9wb3J0aW9ucy5vIHJhdGVsaW1pdC5vIHNob3dfbWVtLm8gXAorCSBpc19zaW5nbGVfdGhyZWFkZWQubyBwbGlzdC5vIGRlY29tcHJlc3MubyBrb2JqZWN0X3VldmVudC5vIFwKKwkgZWFybHljcGlvLm8gc2VxX2J1Zi5vIHNpcGhhc2gubyBcCisJIG5taV9iYWNrdHJhY2UubyBub2RlbWFzay5vIHdpbl9taW5tYXgubworCitsaWItJChDT05GSUdfTU1VKSArPSBpb3JlbWFwLm8KK2xpYi0kKENPTkZJR19TTVApICs9IGNwdW1hc2subworbGliLSQoQ09ORklHX0RNQV9OT09QX09QUykgKz0gZG1hLW5vb3AubworbGliLSQoQ09ORklHX0RNQV9WSVJUX09QUykgKz0gZG1hLXZpcnQubworCitsaWIteQkrPSBrb2JqZWN0Lm8ga2xpc3Qubworb2JqLXkJKz0gbG9ja3JlZi5vCisKK29iai15ICs9IGJjZC5vIGRpdjY0Lm8gc29ydC5vIHBhcnNlci5vIGRlYnVnX2xvY2tzLm8gcmFuZG9tMzIubyBcCisJIGJ1c3Rfc3BpbmxvY2tzLm8ga2FzcHJpbnRmLm8gYml0bWFwLm8gc2NhdHRlcmxpc3QubyBcCisJIGdjZC5vIGxjbS5vIGxpc3Rfc29ydC5vIHV1aWQubyBmbGV4X2FycmF5Lm8gaW92X2l0ZXIubyBjbHpfY3R6Lm8gXAorCSBic2VhcmNoLm8gZmluZF9iaXQubyBsbGlzdC5vIG1lbXdlaWdodC5vIGtmaWZvLm8gXAorCSBwZXJjcHUtcmVmY291bnQubyBwZXJjcHVfaWRhLm8gcmhhc2h0YWJsZS5vIHJlY2lwcm9jYWxfZGl2Lm8gXAorCSBvbmNlLm8gcmVmY291bnQubyB1c2VyY29weS5vIGVycnNlcS5vCitvYmoteSArPSBzdHJpbmdfaGVscGVycy5vCitvYmotJChDT05GSUdfVEVTVF9TVFJJTkdfSEVMUEVSUykgKz0gdGVzdC1zdHJpbmdfaGVscGVycy5vCitvYmoteSArPSBoZXhkdW1wLm8KK29iai0kKENPTkZJR19URVNUX0hFWERVTVApICs9IHRlc3RfaGV4ZHVtcC5vCitvYmoteSArPSBrc3RydG94Lm8KK29iai0kKENPTkZJR19URVNUX0JQRikgKz0gdGVzdF9icGYubworb2JqLSQoQ09ORklHX1RFU1RfRklSTVdBUkUpICs9IHRlc3RfZmlybXdhcmUubworb2JqLSQoQ09ORklHX1RFU1RfU1lTQ1RMKSArPSB0ZXN0X3N5c2N0bC5vCitvYmotJChDT05GSUdfVEVTVF9IQVNIKSArPSB0ZXN0X2hhc2gubyB0ZXN0X3NpcGhhc2gubworb2JqLSQoQ09ORklHX1RFU1RfS0FTQU4pICs9IHRlc3Rfa2FzYW4ubworQ0ZMQUdTX3Rlc3Rfa2FzYW4ubyArPSAtZm5vLWJ1aWx0aW4KK29iai0kKENPTkZJR19URVNUX0tTVFJUT1gpICs9IHRlc3Qta3N0cnRveC5vCitvYmotJChDT05GSUdfVEVTVF9MSVNUX1NPUlQpICs9IHRlc3RfbGlzdF9zb3J0Lm8KK29iai0kKENPTkZJR19URVNUX0xLTSkgKz0gdGVzdF9tb2R1bGUubworb2JqLSQoQ09ORklHX1RFU1RfUkhBU0hUQUJMRSkgKz0gdGVzdF9yaGFzaHRhYmxlLm8KK29iai0kKENPTkZJR19URVNUX1NPUlQpICs9IHRlc3Rfc29ydC5vCitvYmotJChDT05GSUdfVEVTVF9VU0VSX0NPUFkpICs9IHRlc3RfdXNlcl9jb3B5Lm8KK29iai0kKENPTkZJR19URVNUX1NUQVRJQ19LRVlTKSArPSB0ZXN0X3N0YXRpY19rZXlzLm8KK29iai0kKENPTkZJR19URVNUX1NUQVRJQ19LRVlTKSArPSB0ZXN0X3N0YXRpY19rZXlfYmFzZS5vCitvYmotJChDT05GSUdfVEVTVF9QUklOVEYpICs9IHRlc3RfcHJpbnRmLm8KK29iai0kKENPTkZJR19URVNUX0JJVE1BUCkgKz0gdGVzdF9iaXRtYXAubworb2JqLSQoQ09ORklHX1RFU1RfVVVJRCkgKz0gdGVzdF91dWlkLm8KK29iai0kKENPTkZJR19URVNUX1BBUk1BTikgKz0gdGVzdF9wYXJtYW4ubworb2JqLSQoQ09ORklHX1RFU1RfS01PRCkgKz0gdGVzdF9rbW9kLm8KK29iai0kKENPTkZJR19URVNUX0RFQlVHX1ZJUlRVQUwpICs9IHRlc3RfZGVidWdfdmlydHVhbC5vCisKK2lmZXEgKCQoQ09ORklHX0RFQlVHX0tPQkpFQ1QpLHkpCitDRkxBR1Nfa29iamVjdC5vICs9IC1EREVCVUcKK0NGTEFHU19rb2JqZWN0X3VldmVudC5vICs9IC1EREVCVUcKK2VuZGlmCisKK29iai0kKENPTkZJR19ERUJVR19JTkZPX1JFRFVDRUQpICs9IGRlYnVnX2luZm8ubworQ0ZMQUdTX2RlYnVnX2luZm8ubyArPSAkKGNhbGwgY2Mtb3B0aW9uLCAtZmVtaXQtc3RydWN0LWRlYnVnLWRldGFpbGVkPWFueSkKKworb2JqLSQoQ09ORklHX0dFTkVSSUNfSU9NQVApICs9IGlvbWFwLm8KK29iai0kKENPTkZJR19HRU5FUklDX1BDSV9JT01BUCkgKz0gcGNpX2lvbWFwLm8KK29iai0kKENPTkZJR19IQVNfSU9NRU0pICs9IGlvbWFwX2NvcHkubyBkZXZyZXMubworb2JqLSQoQ09ORklHX0NIRUNLX1NJR05BVFVSRSkgKz0gY2hlY2tfc2lnbmF0dXJlLm8KK29iai0kKENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMpICs9IGxvY2tpbmctc2VsZnRlc3QubworCitvYmotJChDT05GSUdfR0VORVJJQ19IV0VJR0hUKSArPSBod2VpZ2h0Lm8KKworb2JqLSQoQ09ORklHX0JUUkVFKSArPSBidHJlZS5vCitvYmotJChDT05GSUdfSU5URVJWQUxfVFJFRSkgKz0gaW50ZXJ2YWxfdHJlZS5vCitvYmotJChDT05GSUdfQVNTT0NJQVRJVkVfQVJSQVkpICs9IGFzc29jX2FycmF5Lm8KK29iai0kKENPTkZJR19ERUJVR19QUkVFTVBUKSArPSBzbXBfcHJvY2Vzc29yX2lkLm8KK29iai0kKENPTkZJR19ERUJVR19MSVNUKSArPSBsaXN0X2RlYnVnLm8KK29iai0kKENPTkZJR19ERUJVR19PQkpFQ1RTKSArPSBkZWJ1Z29iamVjdHMubworCitpZm5lcSAoJChDT05GSUdfSEFWRV9ERUNfTE9DSykseSkKKyAgbGliLXkgKz0gZGVjX2FuZF9sb2NrLm8KK2VuZGlmCisKK29iai0kKENPTkZJR19CSVRSRVZFUlNFKSArPSBiaXRyZXYubworb2JqLSQoQ09ORklHX1JBVElPTkFMKQkrPSByYXRpb25hbC5vCitvYmotJChDT05GSUdfQ1JDX0NDSVRUKQkrPSBjcmMtY2NpdHQubworb2JqLSQoQ09ORklHX0NSQzE2KQkrPSBjcmMxNi5vCitvYmotJChDT05GSUdfQ1JDX1QxMERJRikrPSBjcmMtdDEwZGlmLm8KK29iai0kKENPTkZJR19DUkNfSVRVX1QpCSs9IGNyYy1pdHUtdC5vCitvYmotJChDT05GSUdfQ1JDMzIpCSs9IGNyYzMyLm8KK29iai0kKENPTkZJR19DUkMzMl9TRUxGVEVTVCkJKz0gY3JjMzJ0ZXN0Lm8KK29iai0kKENPTkZJR19DUkM0KQkrPSBjcmM0Lm8KK29iai0kKENPTkZJR19DUkM3KQkrPSBjcmM3Lm8KK29iai0kKENPTkZJR19MSUJDUkMzMkMpCSs9IGxpYmNyYzMyYy5vCitvYmotJChDT05GSUdfQ1JDOCkJKz0gY3JjOC5vCitvYmotJChDT05GSUdfWFhIQVNIKQkrPSB4eGhhc2gubworb2JqLSQoQ09ORklHX0dFTkVSSUNfQUxMT0NBVE9SKSArPSBnZW5hbGxvYy5vCisKK29iai0kKENPTkZJR184NDJfQ09NUFJFU1MpICs9IDg0Mi8KK29iai0kKENPTkZJR184NDJfREVDT01QUkVTUykgKz0gODQyLworb2JqLSQoQ09ORklHX1pMSUJfSU5GTEFURSkgKz0gemxpYl9pbmZsYXRlLworb2JqLSQoQ09ORklHX1pMSUJfREVGTEFURSkgKz0gemxpYl9kZWZsYXRlLworb2JqLSQoQ09ORklHX1JFRURfU09MT01PTikgKz0gcmVlZF9zb2xvbW9uLworb2JqLSQoQ09ORklHX0JDSCkgKz0gYmNoLm8KK29iai0kKENPTkZJR19MWk9fQ09NUFJFU1MpICs9IGx6by8KK29iai0kKENPTkZJR19MWk9fREVDT01QUkVTUykgKz0gbHpvLworb2JqLSQoQ09ORklHX0xaNF9DT01QUkVTUykgKz0gbHo0Lworb2JqLSQoQ09ORklHX0xaNEhDX0NPTVBSRVNTKSArPSBsejQvCitvYmotJChDT05GSUdfTFo0X0RFQ09NUFJFU1MpICs9IGx6NC8KK29iai0kKENPTkZJR19aU1REX0NPTVBSRVNTKSArPSB6c3RkLworb2JqLSQoQ09ORklHX1pTVERfREVDT01QUkVTUykgKz0genN0ZC8KK29iai0kKENPTkZJR19YWl9ERUMpICs9IHh6Lworb2JqLSQoQ09ORklHX1JBSUQ2X1BRKSArPSByYWlkNi8KKworbGliLSQoQ09ORklHX0RFQ09NUFJFU1NfR1pJUCkgKz0gZGVjb21wcmVzc19pbmZsYXRlLm8KK2xpYi0kKENPTkZJR19ERUNPTVBSRVNTX0JaSVAyKSArPSBkZWNvbXByZXNzX2J1bnppcDIubworbGliLSQoQ09ORklHX0RFQ09NUFJFU1NfTFpNQSkgKz0gZGVjb21wcmVzc191bmx6bWEubworbGliLSQoQ09ORklHX0RFQ09NUFJFU1NfWFopICs9IGRlY29tcHJlc3NfdW54ei5vCitsaWItJChDT05GSUdfREVDT01QUkVTU19MWk8pICs9IGRlY29tcHJlc3NfdW5sem8ubworbGliLSQoQ09ORklHX0RFQ09NUFJFU1NfTFo0KSArPSBkZWNvbXByZXNzX3VubHo0Lm8KKworb2JqLSQoQ09ORklHX1RFWFRTRUFSQ0gpICs9IHRleHRzZWFyY2gubworb2JqLSQoQ09ORklHX1RFWFRTRUFSQ0hfS01QKSArPSB0c19rbXAubworb2JqLSQoQ09ORklHX1RFWFRTRUFSQ0hfQk0pICs9IHRzX2JtLm8KK29iai0kKENPTkZJR19URVhUU0VBUkNIX0ZTTSkgKz0gdHNfZnNtLm8KK29iai0kKENPTkZJR19TTVApICs9IHBlcmNwdV9jb3VudGVyLm8KK29iai0kKENPTkZJR19BVURJVF9HRU5FUklDKSArPSBhdWRpdC5vCitvYmotJChDT05GSUdfQVVESVRfQ09NUEFUX0dFTkVSSUMpICs9IGNvbXBhdF9hdWRpdC5vCisKK29iai0kKENPTkZJR19TV0lPVExCKSArPSBzd2lvdGxiLm8KK29iai0kKENPTkZJR19JT01NVV9IRUxQRVIpICs9IGlvbW11LWhlbHBlci5vIGlvbW11LWNvbW1vbi5vCitvYmotJChDT05GSUdfRkFVTFRfSU5KRUNUSU9OKSArPSBmYXVsdC1pbmplY3Qubworb2JqLSQoQ09ORklHX05PVElGSUVSX0VSUk9SX0lOSkVDVElPTikgKz0gbm90aWZpZXItZXJyb3ItaW5qZWN0Lm8KK29iai0kKENPTkZJR19QTV9OT1RJRklFUl9FUlJPUl9JTkpFQ1QpICs9IHBtLW5vdGlmaWVyLWVycm9yLWluamVjdC5vCitvYmotJChDT05GSUdfTkVUREVWX05PVElGSUVSX0VSUk9SX0lOSkVDVCkgKz0gbmV0ZGV2LW5vdGlmaWVyLWVycm9yLWluamVjdC5vCitvYmotJChDT05GSUdfTUVNT1JZX05PVElGSUVSX0VSUk9SX0lOSkVDVCkgKz0gbWVtb3J5LW5vdGlmaWVyLWVycm9yLWluamVjdC5vCitvYmotJChDT05GSUdfT0ZfUkVDT05GSUdfTk9USUZJRVJfRVJST1JfSU5KRUNUKSArPSBcCisJb2YtcmVjb25maWctbm90aWZpZXItZXJyb3ItaW5qZWN0Lm8KKworbGliLSQoQ09ORklHX0dFTkVSSUNfQlVHKSArPSBidWcubworCitvYmotJChDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSykgKz0gc3lzY2FsbC5vCisKK29iai0kKENPTkZJR19EWU5BTUlDX0RFQlVHKSArPSBkeW5hbWljX2RlYnVnLm8KKworb2JqLSQoQ09ORklHX05MQVRUUikgKz0gbmxhdHRyLm8KKworb2JqLSQoQ09ORklHX0xSVV9DQUNIRSkgKz0gbHJ1X2NhY2hlLm8KKworb2JqLSQoQ09ORklHX0RNQV9BUElfREVCVUcpICs9IGRtYS1kZWJ1Zy5vCisKK29iai0kKENPTkZJR19HRU5FUklDX0NTVU0pICs9IGNoZWNrc3VtLm8KKworb2JqLSQoQ09ORklHX0dFTkVSSUNfQVRPTUlDNjQpICs9IGF0b21pYzY0Lm8KKworb2JqLSQoQ09ORklHX0FUT01JQzY0X1NFTEZURVNUKSArPSBhdG9taWM2NF90ZXN0Lm8KKworb2JqLSQoQ09ORklHX0NQVV9STUFQKSArPSBjcHVfcm1hcC5vCisKK29iai0kKENPTkZJR19DT1JESUMpICs9IGNvcmRpYy5vCisKK29iai0kKENPTkZJR19EUUwpICs9IGR5bmFtaWNfcXVldWVfbGltaXRzLm8KKworb2JqLSQoQ09ORklHX0dMT0IpICs9IGdsb2Iubworb2JqLSQoQ09ORklHX0dMT0JfU0VMRlRFU1QpICs9IGdsb2J0ZXN0Lm8KKworb2JqLSQoQ09ORklHX01QSUxJQikgKz0gbXBpLworb2JqLSQoQ09ORklHX1NJR05BVFVSRSkgKz0gZGlnc2lnLm8KKworbGliLSQoQ09ORklHX0NMWl9UQUIpICs9IGNsel90YWIubworCitvYmotJChDT05GSUdfRERSKSArPSBqZWRlY19kZHJfZGF0YS5vCisKK29iai0kKENPTkZJR19HRU5FUklDX1NUUk5DUFlfRlJPTV9VU0VSKSArPSBzdHJuY3B5X2Zyb21fdXNlci5vCitvYmotJChDT05GSUdfR0VORVJJQ19TVFJOTEVOX1VTRVIpICs9IHN0cm5sZW5fdXNlci5vCisKK29iai0kKENPTkZJR19HRU5FUklDX05FVF9VVElMUykgKz0gbmV0X3V0aWxzLm8KKworb2JqLSQoQ09ORklHX1NHX1NQTElUKSArPSBzZ19zcGxpdC5vCitvYmotJChDT05GSUdfU0dfUE9PTCkgKz0gc2dfcG9vbC5vCitvYmotJChDT05GSUdfU1RNUF9ERVZJQ0UpICs9IHN0bXBfZGV2aWNlLm8KK29iai0kKENPTkZJR19JUlFfUE9MTCkgKz0gaXJxX3BvbGwubworCitvYmotJChDT05GSUdfU1RBQ0tERVBPVCkgKz0gc3RhY2tkZXBvdC5vCitLQVNBTl9TQU5JVElaRV9zdGFja2RlcG90Lm8gOj0gbgorS0NPVl9JTlNUUlVNRU5UX3N0YWNrZGVwb3QubyA6PSBuCisKK2xpYmZkdF9maWxlcyA9IGZkdC5vIGZkdF9yby5vIGZkdF93aXAubyBmZHRfcncubyBmZHRfc3cubyBmZHRfc3RyZXJyb3IubyBcCisJICAgICAgIGZkdF9lbXB0eV90cmVlLm8KKyQoZm9yZWFjaCBmaWxlLCAkKGxpYmZkdF9maWxlcyksIFwKKwkkKGV2YWwgQ0ZMQUdTXyQoZmlsZSkgPSAtSSQoc3JjKS8uLi9zY3JpcHRzL2R0Yy9saWJmZHQpKQorbGliLSQoQ09ORklHX0xJQkZEVCkgKz0gJChsaWJmZHRfZmlsZXMpCisKK29iai0kKENPTkZJR19SQlRSRUVfVEVTVCkgKz0gcmJ0cmVlX3Rlc3Qubworb2JqLSQoQ09ORklHX0lOVEVSVkFMX1RSRUVfVEVTVCkgKz0gaW50ZXJ2YWxfdHJlZV90ZXN0Lm8KKworb2JqLSQoQ09ORklHX1BFUkNQVV9URVNUKSArPSBwZXJjcHVfdGVzdC5vCisKK29iai0kKENPTkZJR19BU04xKSArPSBhc24xX2RlY29kZXIubworCitvYmotJChDT05GSUdfRk9OVF9TVVBQT1JUKSArPSBmb250cy8KKworb2JqLSQoQ09ORklHX1BSSU1FX05VTUJFUlMpICs9IHByaW1lX251bWJlcnMubworCitob3N0cHJvZ3MteQk6PSBnZW5fY3JjMzJ0YWJsZQorY2xlYW4tZmlsZXMJOj0gY3JjMzJ0YWJsZS5oCisKKyQob2JqKS9jcmMzMi5vOiAkKG9iaikvY3JjMzJ0YWJsZS5oCisKK3F1aWV0X2NtZF9jcmMzMiA9IEdFTiAgICAgJEAKKyAgICAgIGNtZF9jcmMzMiA9ICQ8ID4gJEAKKworJChvYmopL2NyYzMydGFibGUuaDogJChvYmopL2dlbl9jcmMzMnRhYmxlCisJJChjYWxsIGNtZCxjcmMzMikKKworIworIyBCdWlsZCBhIGZhc3QgT0lEIGxvb2tpcCByZWdpc3RyeSBmcm9tIGluY2x1ZGUvbGludXgvb2lkX3JlZ2lzdHJ5LmgKKyMKK29iai0kKENPTkZJR19PSURfUkVHSVNUUlkpICs9IG9pZF9yZWdpc3RyeS5vCisKKyQob2JqKS9vaWRfcmVnaXN0cnkubzogJChvYmopL29pZF9yZWdpc3RyeV9kYXRhLmMKKworJChvYmopL29pZF9yZWdpc3RyeV9kYXRhLmM6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9vaWRfcmVnaXN0cnkuaCBcCisJCQkgICAgJChzcmMpL2J1aWxkX09JRF9yZWdpc3RyeQorCSQoY2FsbCBjbWQsYnVpbGRfT0lEX3JlZ2lzdHJ5KQorCitxdWlldF9jbWRfYnVpbGRfT0lEX3JlZ2lzdHJ5ID0gR0VOICAgICAkQAorICAgICAgY21kX2J1aWxkX09JRF9yZWdpc3RyeSA9IHBlcmwgJChzcmN0cmVlKS8kKHNyYykvYnVpbGRfT0lEX3JlZ2lzdHJ5ICQ8ICRACisKK2NsZWFuLWZpbGVzCSs9IG9pZF9yZWdpc3RyeV9kYXRhLmMKKworb2JqLSQoQ09ORklHX1VDUzJfU1RSSU5HKSArPSB1Y3MyX3N0cmluZy5vCitvYmotJChDT05GSUdfVUJTQU4pICs9IHVic2FuLm8KKworVUJTQU5fU0FOSVRJWkVfdWJzYW4ubyA6PSBuCitLQVNBTl9TQU5JVElaRV91YnNhbi5vIDo9IG4KK0NGTEFHU191YnNhbi5vIDo9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKSAkKERJU0FCTEVfU1RBQ0tMRUFLX1BMVUdJTikKKworb2JqLSQoQ09ORklHX1NCSVRNQVApICs9IHNiaXRtYXAubworCitvYmotJChDT05GSUdfUEFSTUFOKSArPSBwYXJtYW4ubwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYXJndl9zcGxpdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYXJndl9zcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMzU3NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hcmd2X3NwbGl0LmMKQEAgLTAsMCArMSw5NSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNwbGl0dGluZyBhIHN0cmluZyBpbnRvIGFuIGFyZ3YtbGlrZSBhcnJheS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKK3N0YXRpYyBpbnQgY291bnRfYXJnYyhjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGNvdW50ID0gMDsKKwlib29sIHdhc19zcGFjZTsKKworCWZvciAod2FzX3NwYWNlID0gdHJ1ZTsgKnN0cjsgc3RyKyspIHsKKwkJaWYgKGlzc3BhY2UoKnN0cikpIHsKKwkJCXdhc19zcGFjZSA9IHRydWU7CisJCX0gZWxzZSBpZiAod2FzX3NwYWNlKSB7CisJCQl3YXNfc3BhY2UgPSBmYWxzZTsKKwkJCWNvdW50Kys7CisJCX0KKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogYXJndl9mcmVlIC0gZnJlZSBhbiBhcmd2CisgKiBAYXJndiAtIHRoZSBhcmd1bWVudCB2ZWN0b3IgdG8gYmUgZnJlZWQKKyAqCisgKiBGcmVlcyBhbiBhcmd2IGFuZCB0aGUgc3RyaW5ncyBpdCBwb2ludHMgdG8uCisgKi8KK3ZvaWQgYXJndl9mcmVlKGNoYXIgKiphcmd2KQoreworCWFyZ3YtLTsKKwlrZnJlZShhcmd2WzBdKTsKKwlrZnJlZShhcmd2KTsKK30KK0VYUE9SVF9TWU1CT0woYXJndl9mcmVlKTsKKworLyoqCisgKiBhcmd2X3NwbGl0IC0gc3BsaXQgYSBzdHJpbmcgYXQgd2hpdGVzcGFjZSwgcmV0dXJuaW5nIGFuIGFyZ3YKKyAqIEBnZnA6IHRoZSBHRlAgbWFzayB1c2VkIHRvIGFsbG9jYXRlIG1lbW9yeQorICogQHN0cjogdGhlIHN0cmluZyB0byBiZSBzcGxpdAorICogQGFyZ2NwOiByZXR1cm5lZCBhcmd1bWVudCBjb3VudAorICoKKyAqIFJldHVybnMgYW4gYXJyYXkgb2YgcG9pbnRlcnMgdG8gc3RyaW5ncyB3aGljaCBhcmUgc3BsaXQgb3V0IGZyb20KKyAqIEBzdHIuICBUaGlzIGlzIHBlcmZvcm1lZCBieSBzdHJpY3RseSBzcGxpdHRpbmcgb24gd2hpdGUtc3BhY2U7IG5vCisgKiBxdW90ZSBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZC4gIE11bHRpcGxlIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhcmUKKyAqIGNvbnNpZGVyZWQgdG8gYmUgYSBzaW5nbGUgYXJndW1lbnQgc2VwYXJhdG9yLiAgVGhlIHJldHVybmVkIGFycmF5CisgKiBpcyBhbHdheXMgTlVMTC10ZXJtaW5hdGVkLiAgUmV0dXJucyBOVUxMIG9uIG1lbW9yeSBhbGxvY2F0aW9uCisgKiBmYWlsdXJlLgorICoKKyAqIFRoZSBzb3VyY2Ugc3RyaW5nIGF0IGBzdHInIG1heSBiZSB1bmRlcmdvaW5nIGNvbmN1cnJlbnQgYWx0ZXJhdGlvbiB2aWEKKyAqIHVzZXJzcGFjZSBzeXNjdGwgYWN0aXZpdHkgKGF0IGxlYXN0KS4gIFRoZSBhcmd2X3NwbGl0KCkgaW1wbGVtZW50YXRpb24KKyAqIGF0dGVtcHRzIHRvIGhhbmRsZSB0aGlzIGdyYWNlZnVsbHkgYnkgdGFraW5nIGEgbG9jYWwgY29weSB0byB3b3JrIG9uLgorICovCitjaGFyICoqYXJndl9zcGxpdChnZnBfdCBnZnAsIGNvbnN0IGNoYXIgKnN0ciwgaW50ICphcmdjcCkKK3sKKwljaGFyICphcmd2X3N0cjsKKwlib29sIHdhc19zcGFjZTsKKwljaGFyICoqYXJndiwgKiphcmd2X3JldDsKKwlpbnQgYXJnYzsKKworCWFyZ3Zfc3RyID0ga3N0cm5kdXAoc3RyLCBLTUFMTE9DX01BWF9TSVpFIC0gMSwgZ2ZwKTsKKwlpZiAoIWFyZ3Zfc3RyKQorCQlyZXR1cm4gTlVMTDsKKworCWFyZ2MgPSBjb3VudF9hcmdjKGFyZ3Zfc3RyKTsKKwlhcmd2ID0ga21hbGxvYyhzaXplb2YoKmFyZ3YpICogKGFyZ2MgKyAyKSwgZ2ZwKTsKKwlpZiAoIWFyZ3YpIHsKKwkJa2ZyZWUoYXJndl9zdHIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkqYXJndiA9IGFyZ3Zfc3RyOworCWFyZ3ZfcmV0ID0gKythcmd2OworCWZvciAod2FzX3NwYWNlID0gdHJ1ZTsgKmFyZ3Zfc3RyOyBhcmd2X3N0cisrKSB7CisJCWlmIChpc3NwYWNlKCphcmd2X3N0cikpIHsKKwkJCXdhc19zcGFjZSA9IHRydWU7CisJCQkqYXJndl9zdHIgPSAwOworCQl9IGVsc2UgaWYgKHdhc19zcGFjZSkgeworCQkJd2FzX3NwYWNlID0gZmFsc2U7CisJCQkqYXJndisrID0gYXJndl9zdHI7CisJCX0KKwl9CisJKmFyZ3YgPSBOVUxMOworCisJaWYgKGFyZ2NwKQorCQkqYXJnY3AgPSBhcmdjOworCXJldHVybiBhcmd2X3JldDsKK30KK0VYUE9SVF9TWU1CT0woYXJndl9zcGxpdCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hc24xX2RlY29kZXIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2FzbjFfZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTRiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hc24xX2RlY29kZXIuYwpAQCAtMCwwICsxLDUyMSBAQAorLyogRGVjb2RlciBmb3IgQVNOLjEgQkVSL0RFUi9DRVIgZW5jb2RlZCBieXRlc3RyZWFtCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2FzbjFfZGVjb2Rlci5oPgorI2luY2x1ZGUgPGxpbnV4L2FzbjFfYmVyX2J5dGVjb2RlLmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGFzbjFfb3BfbGVuZ3Roc1tBU04xX09QX19OUl0gPSB7CisJLyoJCQkJCU9QQyBUQUcgSk1QIEFDVCAqLworCVtBU04xX09QX01BVENIXQkJCQk9IDEgKyAxLAorCVtBU04xX09QX01BVENIX09SX1NLSVBdCQkJPSAxICsgMSwKKwlbQVNOMV9PUF9NQVRDSF9BQ1RdCQkJPSAxICsgMSAgICAgKyAxLAorCVtBU04xX09QX01BVENIX0FDVF9PUl9TS0lQXQkJPSAxICsgMSAgICAgKyAxLAorCVtBU04xX09QX01BVENIX0pVTVBdCQkJPSAxICsgMSArIDEsCisJW0FTTjFfT1BfTUFUQ0hfSlVNUF9PUl9TS0lQXQkJPSAxICsgMSArIDEsCisJW0FTTjFfT1BfTUFUQ0hfQU5ZXQkJCT0gMSwKKwlbQVNOMV9PUF9NQVRDSF9BTllfT1JfU0tJUF0JCT0gMSwKKwlbQVNOMV9PUF9NQVRDSF9BTllfQUNUXQkJCT0gMSAgICAgICAgICsgMSwKKwlbQVNOMV9PUF9NQVRDSF9BTllfQUNUX09SX1NLSVBdCQk9IDEgICAgICAgICArIDEsCisJW0FTTjFfT1BfQ09ORF9NQVRDSF9PUl9TS0lQXQkJPSAxICsgMSwKKwlbQVNOMV9PUF9DT05EX01BVENIX0FDVF9PUl9TS0lQXQk9IDEgKyAxICAgICArIDEsCisJW0FTTjFfT1BfQ09ORF9NQVRDSF9KVU1QX09SX1NLSVBdCT0gMSArIDEgKyAxLAorCVtBU04xX09QX0NPTkRfTUFUQ0hfQU5ZXQkJPSAxLAorCVtBU04xX09QX0NPTkRfTUFUQ0hfQU5ZX09SX1NLSVBdCT0gMSwKKwlbQVNOMV9PUF9DT05EX01BVENIX0FOWV9BQ1RdCQk9IDEgICAgICAgICArIDEsCisJW0FTTjFfT1BfQ09ORF9NQVRDSF9BTllfQUNUX09SX1NLSVBdCT0gMSAgICAgICAgICsgMSwKKwlbQVNOMV9PUF9DT05EX0ZBSUxdCQkJPSAxLAorCVtBU04xX09QX0NPTVBMRVRFXQkJCT0gMSwKKwlbQVNOMV9PUF9BQ1RdCQkJCT0gMSAgICAgICAgICsgMSwKKwlbQVNOMV9PUF9NQVlCRV9BQ1RdCQkJPSAxICAgICAgICAgKyAxLAorCVtBU04xX09QX1JFVFVSTl0JCQk9IDEsCisJW0FTTjFfT1BfRU5EX1NFUV0JCQk9IDEsCisJW0FTTjFfT1BfRU5EX1NFUV9PRl0JCQk9IDEgICAgICsgMSwKKwlbQVNOMV9PUF9FTkRfU0VUXQkJCT0gMSwKKwlbQVNOMV9PUF9FTkRfU0VUX09GXQkJCT0gMSAgICAgKyAxLAorCVtBU04xX09QX0VORF9TRVFfQUNUXQkJCT0gMSAgICAgICAgICsgMSwKKwlbQVNOMV9PUF9FTkRfU0VRX09GX0FDVF0JCT0gMSAgICAgKyAxICsgMSwKKwlbQVNOMV9PUF9FTkRfU0VUX0FDVF0JCQk9IDEgICAgICAgICArIDEsCisJW0FTTjFfT1BfRU5EX1NFVF9PRl9BQ1RdCQk9IDEgICAgICsgMSArIDEsCit9OworCisvKgorICogRmluZCB0aGUgbGVuZ3RoIG9mIGFuIGluZGVmaW5pdGUgbGVuZ3RoIG9iamVjdAorICogQGRhdGE6IFRoZSBkYXRhIGJ1ZmZlcgorICogQGRhdGFsZW46IFRoZSBlbmQgb2YgdGhlIGlubmVybW9zdCBjb250YWluaW5nIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlcgorICogQF9kcDogVGhlIGRhdGEgcGFyc2UgY3Vyc29yICh1cGRhdGVkIGJlZm9yZSByZXR1cm5pbmcpCisgKiBAX2xlbjogV2hlcmUgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBlbGVtZW50LgorICogQF9lcnJtc2c6IFdoZXJlIHRvIHJldHVybiBhIHBvaW50ZXIgdG8gYW4gZXJyb3IgbWVzc2FnZSBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IGFzbjFfZmluZF9pbmRlZmluaXRlX2xlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBzaXplX3QgZGF0YWxlbiwKKwkJCQkgICAgICAgc2l6ZV90ICpfZHAsIHNpemVfdCAqX2xlbiwKKwkJCQkgICAgICAgY29uc3QgY2hhciAqKl9lcnJtc2cpCit7CisJdW5zaWduZWQgY2hhciB0YWcsIHRtcDsKKwlzaXplX3QgZHAgPSAqX2RwLCBsZW4sIG47CisJaW50IGluZGVmX2xldmVsID0gMTsKKworbmV4dF90YWc6CisJaWYgKHVubGlrZWx5KGRhdGFsZW4gLSBkcCA8IDIpKSB7CisJCWlmIChkYXRhbGVuID09IGRwKQorCQkJZ290byBtaXNzaW5nX2VvYzsKKwkJZ290byBkYXRhX292ZXJydW5fZXJyb3I7CisJfQorCisJLyogRXh0cmFjdCBhIHRhZyBmcm9tIHRoZSBkYXRhICovCisJdGFnID0gZGF0YVtkcCsrXTsKKwlpZiAodGFnID09IEFTTjFfRU9DKSB7CisJCS8qIEl0IGFwcGVhcnMgdG8gYmUgYW4gRU9DLiAqLworCQlpZiAoZGF0YVtkcCsrXSAhPSAwKQorCQkJZ290byBpbnZhbGlkX2VvYzsKKwkJaWYgKC0taW5kZWZfbGV2ZWwgPD0gMCkgeworCQkJKl9sZW4gPSBkcCAtICpfZHA7CisJCQkqX2RwID0gZHA7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlnb3RvIG5leHRfdGFnOworCX0KKworCWlmICh1bmxpa2VseSgodGFnICYgMHgxZikgPT0gQVNOMV9MT05HX1RBRykpIHsKKwkJZG8geworCQkJaWYgKHVubGlrZWx5KGRhdGFsZW4gLSBkcCA8IDIpKQorCQkJCWdvdG8gZGF0YV9vdmVycnVuX2Vycm9yOworCQkJdG1wID0gZGF0YVtkcCsrXTsKKwkJfSB3aGlsZSAodG1wICYgMHg4MCk7CisJfQorCisJLyogRXh0cmFjdCB0aGUgbGVuZ3RoICovCisJbGVuID0gZGF0YVtkcCsrXTsKKwlpZiAobGVuIDw9IDB4N2YpCisJCWdvdG8gY2hlY2tfbGVuZ3RoOworCisJaWYgKHVubGlrZWx5KGxlbiA9PSBBU04xX0lOREVGSU5JVEVfTEVOR1RIKSkgeworCQkvKiBJbmRlZmluaXRlIGxlbmd0aCAqLworCQlpZiAodW5saWtlbHkoKHRhZyAmIEFTTjFfQ09OU19CSVQpID09IEFTTjFfUFJJTSA8PCA1KSkKKwkJCWdvdG8gaW5kZWZpbml0ZV9sZW5fcHJpbWl0aXZlOworCQlpbmRlZl9sZXZlbCsrOworCQlnb3RvIG5leHRfdGFnOworCX0KKworCW4gPSBsZW4gLSAweDgwOworCWlmICh1bmxpa2VseShuID4gc2l6ZW9mKGxlbikgLSAxKSkKKwkJZ290byBsZW5ndGhfdG9vX2xvbmc7CisJaWYgKHVubGlrZWx5KG4gPiBkYXRhbGVuIC0gZHApKQorCQlnb3RvIGRhdGFfb3ZlcnJ1bl9lcnJvcjsKKwlsZW4gPSAwOworCWZvciAoOyBuID4gMDsgbi0tKSB7CisJCWxlbiA8PD0gODsKKwkJbGVuIHw9IGRhdGFbZHArK107CisJfQorY2hlY2tfbGVuZ3RoOgorCWlmIChsZW4gPiBkYXRhbGVuIC0gZHApCisJCWdvdG8gZGF0YV9vdmVycnVuX2Vycm9yOworCWRwICs9IGxlbjsKKwlnb3RvIG5leHRfdGFnOworCitsZW5ndGhfdG9vX2xvbmc6CisJKl9lcnJtc2cgPSAiVW5zdXBwb3J0ZWQgbGVuZ3RoIjsKKwlnb3RvIGVycm9yOworaW5kZWZpbml0ZV9sZW5fcHJpbWl0aXZlOgorCSpfZXJybXNnID0gIkluZGVmaW5pdGUgbGVuIHByaW1pdGl2ZSBub3QgcGVybWl0dGVkIjsKKwlnb3RvIGVycm9yOworaW52YWxpZF9lb2M6CisJKl9lcnJtc2cgPSAiSW52YWxpZCBsZW5ndGggRU9DIjsKKwlnb3RvIGVycm9yOworZGF0YV9vdmVycnVuX2Vycm9yOgorCSpfZXJybXNnID0gIkRhdGEgb3ZlcnJ1biBlcnJvciI7CisJZ290byBlcnJvcjsKK21pc3NpbmdfZW9jOgorCSpfZXJybXNnID0gIk1pc3NpbmcgRU9DIGluIGluZGVmaW5pdGUgbGVuIGNvbnMiOworZXJyb3I6CisJKl9kcCA9IGRwOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBhc24xX2Jlcl9kZWNvZGVyIC0gRGVjb2RlciBCRVIvREVSL0NFUiBBU04uMSBhY2NvcmRpbmcgdG8gcGF0dGVybgorICogQGRlY29kZXI6IFRoZSBkZWNvZGVyIGRlZmluaXRpb24gKHByb2R1Y2VkIGJ5IGFzbjFfY29tcGlsZXIpCisgKiBAY29udGV4dDogVGhlIGNhbGxlcidzIGNvbnRleHQgKHRvIGJlIHBhc3NlZCB0byB0aGUgYWN0aW9uIGZ1bmN0aW9ucykKKyAqIEBkYXRhOiBUaGUgZW5jb2RlZCBkYXRhCisgKiBAZGF0YWxlbjogVGhlIHNpemUgb2YgdGhlIGVuY29kZWQgZGF0YQorICoKKyAqIERlY29kZSBCRVIvREVSL0NFUiBlbmNvZGVkIEFTTi4xIGRhdGEgYWNjb3JkaW5nIHRvIGEgYnl0ZWNvZGUgcGF0dGVybgorICogcHJvZHVjZWQgYnkgYXNuMV9jb21waWxlci4gIEFjdGlvbiBmdW5jdGlvbnMgYXJlIGNhbGxlZCBvbiBtYXJrZWQgdGFncyB0bworICogYWxsb3cgdGhlIGNhbGxlciB0byByZXRyaWV2ZSBzaWduaWZpY2FudCBkYXRhLgorICoKKyAqIExJTUlUQVRJT05TOgorICoKKyAqIFRvIGtlZXAgZG93biB0aGUgYW1vdW50IG9mIHN0YWNrIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiwgdGhlIGZvbGxvd2luZyBsaW1pdHMKKyAqIGhhdmUgYmVlbiBpbXBvc2VkOgorICoKKyAqICAoMSkgVGhpcyB3b24ndCBoYW5kbGUgZGF0YWxlbiA+IDY1NTM1IHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiB0aGUKKyAqCWNvbnMgc3RhY2sgZWxlbWVudHMgYW5kIGxlbmd0aF90b29fbG9uZyBjaGVja2luZy4KKyAqCisgKiAgKDIpIFRoZSBzdGFjayBvZiBjb25zdHJ1Y3RlZCB0eXBlcyBpcyAxMCBkZWVwLiAgSWYgdGhlIGRlcHRoIG9mIG5vbi1sZWFmCisgKgljb25zdHJ1Y3RlZCB0eXBlcyBleGNlZWRzIHRoaXMsIHRoZSBkZWNvZGUgd2lsbCBmYWlsLgorICoKKyAqICAoMykgVGhlIFNFVCB0eXBlIChub3QgdGhlIFNFVCBPRiB0eXBlKSBpc24ndCByZWFsbHkgc3VwcG9ydGVkIGFzIHRyYWNraW5nCisgKgl3aGF0IG1lbWJlcnMgb2YgdGhlIHNldCBoYXZlIGJlZW4gc2VlbiBpcyBhIHBhaW4uCisgKi8KK2ludCBhc24xX2Jlcl9kZWNvZGVyKGNvbnN0IHN0cnVjdCBhc24xX2RlY29kZXIgKmRlY29kZXIsCisJCSAgICAgdm9pZCAqY29udGV4dCwKKwkJICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkgICAgIHNpemVfdCBkYXRhbGVuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hY2hpbmUgPSBkZWNvZGVyLT5tYWNoaW5lOworCWNvbnN0IGFzbjFfYWN0aW9uX3QgKmFjdGlvbnMgPSBkZWNvZGVyLT5hY3Rpb25zOworCXNpemVfdCBtYWNobGVuID0gZGVjb2Rlci0+bWFjaGxlbjsKKwllbnVtIGFzbjFfb3Bjb2RlIG9wOworCXVuc2lnbmVkIGNoYXIgdGFnID0gMCwgY3NwID0gMCwganNwID0gMCwgb3B0YWcgPSAwLCBoZHIgPSAwOworCWNvbnN0IGNoYXIgKmVycm1zZzsKKwlzaXplX3QgcGMgPSAwLCBkcCA9IDAsIHRkcCA9IDAsIGxlbiA9IDA7CisJaW50IHJldDsKKworCXVuc2lnbmVkIGNoYXIgZmxhZ3MgPSAwOworI2RlZmluZSBGTEFHX0lOREVGSU5JVEVfTEVOR1RICTB4MDEKKyNkZWZpbmUgRkxBR19NQVRDSEVECQkweDAyCisjZGVmaW5lIEZMQUdfTEFTVF9NQVRDSEVECTB4MDQgLyogTGFzdCB0YWcgbWF0Y2hlZCAqLworI2RlZmluZSBGTEFHX0NPTlMJCTB4MjAgLyogQ29ycmVzcG9uZHMgdG8gQ09OUyBiaXQgaW4gdGhlIG9wY29kZSB0YWcKKwkJCQkgICAgICAqIC0gaWUuIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBnb2luZyB0byBwYXJzZQorCQkJCSAgICAgICogICBhIGNvbXBvdW5kIHR5cGUuCisJCQkJICAgICAgKi8KKworI2RlZmluZSBOUl9DT05TX1NUQUNLIDEwCisJdW5zaWduZWQgc2hvcnQgY29uc19kcF9zdGFja1tOUl9DT05TX1NUQUNLXTsKKwl1bnNpZ25lZCBzaG9ydCBjb25zX2RhdGFsZW5fc3RhY2tbTlJfQ09OU19TVEFDS107CisJdW5zaWduZWQgY2hhciBjb25zX2hkcmxlbl9zdGFja1tOUl9DT05TX1NUQUNLXTsKKyNkZWZpbmUgTlJfSlVNUF9TVEFDSyAxMAorCXVuc2lnbmVkIGNoYXIganVtcF9zdGFja1tOUl9KVU1QX1NUQUNLXTsKKworCWlmIChkYXRhbGVuID4gNjU1MzUpCisJCXJldHVybiAtRU1TR1NJWkU7CisKK25leHRfb3A6CisJcHJfZGVidWcoIm5leHRfb3A6IHBjPVxlWzMybSV6dVxlW20vJXp1IGRwPVxlWzMzbSV6dVxlW20vJXp1IEM9JWQgSj0lZFxuIiwKKwkJIHBjLCBtYWNobGVuLCBkcCwgZGF0YWxlbiwgY3NwLCBqc3ApOworCWlmICh1bmxpa2VseShwYyA+PSBtYWNobGVuKSkKKwkJZ290byBtYWNoaW5lX292ZXJydW5fZXJyb3I7CisJb3AgPSBtYWNoaW5lW3BjXTsKKwlpZiAodW5saWtlbHkocGMgKyBhc24xX29wX2xlbmd0aHNbb3BdID4gbWFjaGxlbikpCisJCWdvdG8gbWFjaGluZV9vdmVycnVuX2Vycm9yOworCisJLyogSWYgdGhpcyBjb21tYW5kIGlzIG1lYW50IHRvIG1hdGNoIGEgdGFnLCB0aGVuIGRvIHRoYXQgYmVmb3JlCisJICogZXZhbHVhdGluZyB0aGUgY29tbWFuZC4KKwkgKi8KKwlpZiAob3AgPD0gQVNOMV9PUF9fTUFUQ0hFU19UQUcpIHsKKwkJdW5zaWduZWQgY2hhciB0bXA7CisKKwkJLyogU2tpcCBjb25kaXRpb25hbCBtYXRjaGVzIGlmIHBvc3NpYmxlICovCisJCWlmICgob3AgJiBBU04xX09QX01BVENIX19DT05EICYmIGZsYWdzICYgRkxBR19NQVRDSEVEKSB8fAorCQkgICAgKG9wICYgQVNOMV9PUF9NQVRDSF9fU0tJUCAmJiBkcCA9PSBkYXRhbGVuKSkgeworCQkJZmxhZ3MgJj0gfkZMQUdfTEFTVF9NQVRDSEVEOworCQkJcGMgKz0gYXNuMV9vcF9sZW5ndGhzW29wXTsKKwkJCWdvdG8gbmV4dF9vcDsKKwkJfQorCisJCWZsYWdzID0gMDsKKwkJaGRyID0gMjsKKworCQkvKiBFeHRyYWN0IGEgdGFnIGZyb20gdGhlIGRhdGEgKi8KKwkJaWYgKHVubGlrZWx5KGRhdGFsZW4gLSBkcCA8IDIpKQorCQkJZ290byBkYXRhX292ZXJydW5fZXJyb3I7CisJCXRhZyA9IGRhdGFbZHArK107CisJCWlmICh1bmxpa2VseSgodGFnICYgMHgxZikgPT0gQVNOMV9MT05HX1RBRykpCisJCQlnb3RvIGxvbmdfdGFnX25vdF9zdXBwb3J0ZWQ7CisKKwkJaWYgKG9wICYgQVNOMV9PUF9NQVRDSF9fQU5ZKSB7CisJCQlwcl9kZWJ1ZygiLSBhbnkgJTAyeFxuIiwgdGFnKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEV4dHJhY3QgdGhlIHRhZyBmcm9tIHRoZSBtYWNoaW5lCisJCQkgKiAtIEVpdGhlciBDT05TIG9yIFBSSU0gYXJlIHBlcm1pdHRlZCBpbiB0aGUgZGF0YSBpZgorCQkJICogICBDT05TIGlzIG5vdCBzZXQgaW4gdGhlIG9wIHN0cmVhbSwgb3RoZXJ3aXNlIENPTlMKKwkJCSAqICAgaXMgbWFuZGF0b3J5LgorCQkJICovCisJCQlvcHRhZyA9IG1hY2hpbmVbcGMgKyAxXTsKKwkJCWZsYWdzIHw9IG9wdGFnICYgRkxBR19DT05TOworCisJCQkvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgdGFnIG1hdGNoZWQgKi8KKwkJCXRtcCA9IG9wdGFnIF4gdGFnOworCQkJdG1wICY9IH4ob3B0YWcgJiBBU04xX0NPTlNfQklUKTsKKwkJCXByX2RlYnVnKCItIG1hdGNoPyAlMDJ4ICUwMnggJTAyeFxuIiwgdGFnLCBvcHRhZywgdG1wKTsKKwkJCWlmICh0bXAgIT0gMCkgeworCQkJCS8qIEFsbCBvZGQtbnVtYmVyZWQgdGFncyBhcmUgTUFUQ0hfT1JfU0tJUC4gKi8KKwkJCQlpZiAob3AgJiBBU04xX09QX01BVENIX19TS0lQKSB7CisJCQkJCXBjICs9IGFzbjFfb3BfbGVuZ3Roc1tvcF07CisJCQkJCWRwLS07CisJCQkJCWdvdG8gbmV4dF9vcDsKKwkJCQl9CisJCQkJZ290byB0YWdfbWlzbWF0Y2g7CisJCQl9CisJCX0KKwkJZmxhZ3MgfD0gRkxBR19NQVRDSEVEOworCisJCWxlbiA9IGRhdGFbZHArK107CisJCWlmIChsZW4gPiAweDdmKSB7CisJCQlpZiAodW5saWtlbHkobGVuID09IEFTTjFfSU5ERUZJTklURV9MRU5HVEgpKSB7CisJCQkJLyogSW5kZWZpbml0ZSBsZW5ndGggKi8KKwkJCQlpZiAodW5saWtlbHkoISh0YWcgJiBBU04xX0NPTlNfQklUKSkpCisJCQkJCWdvdG8gaW5kZWZpbml0ZV9sZW5fcHJpbWl0aXZlOworCQkJCWZsYWdzIHw9IEZMQUdfSU5ERUZJTklURV9MRU5HVEg7CisJCQkJaWYgKHVubGlrZWx5KDIgPiBkYXRhbGVuIC0gZHApKQorCQkJCQlnb3RvIGRhdGFfb3ZlcnJ1bl9lcnJvcjsKKwkJCX0gZWxzZSB7CisJCQkJaW50IG4gPSBsZW4gLSAweDgwOworCQkJCWlmICh1bmxpa2VseShuID4gMikpCisJCQkJCWdvdG8gbGVuZ3RoX3Rvb19sb25nOworCQkJCWlmICh1bmxpa2VseShuID4gZGF0YWxlbiAtIGRwKSkKKwkJCQkJZ290byBkYXRhX292ZXJydW5fZXJyb3I7CisJCQkJaGRyICs9IG47CisJCQkJZm9yIChsZW4gPSAwOyBuID4gMDsgbi0tKSB7CisJCQkJCWxlbiA8PD0gODsKKwkJCQkJbGVuIHw9IGRhdGFbZHArK107CisJCQkJfQorCQkJCWlmICh1bmxpa2VseShsZW4gPiBkYXRhbGVuIC0gZHApKQorCQkJCQlnb3RvIGRhdGFfb3ZlcnJ1bl9lcnJvcjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICh1bmxpa2VseShsZW4gPiBkYXRhbGVuIC0gZHApKQorCQkJCWdvdG8gZGF0YV9vdmVycnVuX2Vycm9yOworCQl9CisKKwkJaWYgKGZsYWdzICYgRkxBR19DT05TKSB7CisJCQkvKiBGb3IgZXhwZWN0ZWQgY29tcG91bmQgZm9ybXMsIHdlIHN0YWNrIHRoZSBwb3NpdGlvbnMKKwkJCSAqIG9mIHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBkYXRhLgorCQkJICovCisJCQlpZiAodW5saWtlbHkoY3NwID49IE5SX0NPTlNfU1RBQ0spKQorCQkJCWdvdG8gY29uc19zdGFja19vdmVyZmxvdzsKKwkJCWNvbnNfZHBfc3RhY2tbY3NwXSA9IGRwOworCQkJY29uc19oZHJsZW5fc3RhY2tbY3NwXSA9IGhkcjsKKwkJCWlmICghKGZsYWdzICYgRkxBR19JTkRFRklOSVRFX0xFTkdUSCkpIHsKKwkJCQljb25zX2RhdGFsZW5fc3RhY2tbY3NwXSA9IGRhdGFsZW47CisJCQkJZGF0YWxlbiA9IGRwICsgbGVuOworCQkJfSBlbHNlIHsKKwkJCQljb25zX2RhdGFsZW5fc3RhY2tbY3NwXSA9IDA7CisJCQl9CisJCQljc3ArKzsKKwkJfQorCisJCXByX2RlYnVnKCItIFRBRzogJTAyeCAlenUlc1xuIiwKKwkJCSB0YWcsIGxlbiwgZmxhZ3MgJiBGTEFHX0NPTlMgPyAiIENPTlMiIDogIiIpOworCQl0ZHAgPSBkcDsKKwl9CisKKwkvKiBEZWNpZGUgaG93IHRvIGhhbmRsZSB0aGUgb3BlcmF0aW9uICovCisJc3dpdGNoIChvcCkgeworCWNhc2UgQVNOMV9PUF9NQVRDSDoKKwljYXNlIEFTTjFfT1BfTUFUQ0hfT1JfU0tJUDoKKwljYXNlIEFTTjFfT1BfTUFUQ0hfQUNUOgorCWNhc2UgQVNOMV9PUF9NQVRDSF9BQ1RfT1JfU0tJUDoKKwljYXNlIEFTTjFfT1BfTUFUQ0hfQU5ZOgorCWNhc2UgQVNOMV9PUF9NQVRDSF9BTllfT1JfU0tJUDoKKwljYXNlIEFTTjFfT1BfTUFUQ0hfQU5ZX0FDVDoKKwljYXNlIEFTTjFfT1BfTUFUQ0hfQU5ZX0FDVF9PUl9TS0lQOgorCWNhc2UgQVNOMV9PUF9DT05EX01BVENIX09SX1NLSVA6CisJY2FzZSBBU04xX09QX0NPTkRfTUFUQ0hfQUNUX09SX1NLSVA6CisJY2FzZSBBU04xX09QX0NPTkRfTUFUQ0hfQU5ZOgorCWNhc2UgQVNOMV9PUF9DT05EX01BVENIX0FOWV9PUl9TS0lQOgorCWNhc2UgQVNOMV9PUF9DT05EX01BVENIX0FOWV9BQ1Q6CisJY2FzZSBBU04xX09QX0NPTkRfTUFUQ0hfQU5ZX0FDVF9PUl9TS0lQOgorCisJCWlmICghKGZsYWdzICYgRkxBR19DT05TKSkgeworCQkJaWYgKGZsYWdzICYgRkxBR19JTkRFRklOSVRFX0xFTkdUSCkgeworCQkJCXNpemVfdCB0bXAgPSBkcDsKKworCQkJCXJldCA9IGFzbjFfZmluZF9pbmRlZmluaXRlX2xlbmd0aCgKKwkJCQkJZGF0YSwgZGF0YWxlbiwgJnRtcCwgJmxlbiwgJmVycm1zZyk7CisJCQkJaWYgKHJldCA8IDApCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9CisJCQlwcl9kZWJ1ZygiLSBMRUFGOiAlenVcbiIsIGxlbik7CisJCX0KKworCQlpZiAob3AgJiBBU04xX09QX01BVENIX19BQ1QpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYWN0OworCisJCQlpZiAob3AgJiBBU04xX09QX01BVENIX19BTlkpCisJCQkJYWN0ID0gbWFjaGluZVtwYyArIDFdOworCQkJZWxzZQorCQkJCWFjdCA9IG1hY2hpbmVbcGMgKyAyXTsKKwkJCXJldCA9IGFjdGlvbnNbYWN0XShjb250ZXh0LCBoZHIsIHRhZywgZGF0YSArIGRwLCBsZW4pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCWlmICghKGZsYWdzICYgRkxBR19DT05TKSkKKwkJCWRwICs9IGxlbjsKKwkJcGMgKz0gYXNuMV9vcF9sZW5ndGhzW29wXTsKKwkJZ290byBuZXh0X29wOworCisJY2FzZSBBU04xX09QX01BVENIX0pVTVA6CisJY2FzZSBBU04xX09QX01BVENIX0pVTVBfT1JfU0tJUDoKKwljYXNlIEFTTjFfT1BfQ09ORF9NQVRDSF9KVU1QX09SX1NLSVA6CisJCXByX2RlYnVnKCItIE1BVENIX0pVTVBcbiIpOworCQlpZiAodW5saWtlbHkoanNwID09IE5SX0pVTVBfU1RBQ0spKQorCQkJZ290byBqdW1wX3N0YWNrX292ZXJmbG93OworCQlqdW1wX3N0YWNrW2pzcCsrXSA9IHBjICsgYXNuMV9vcF9sZW5ndGhzW29wXTsKKwkJcGMgPSBtYWNoaW5lW3BjICsgMl07CisJCWdvdG8gbmV4dF9vcDsKKworCWNhc2UgQVNOMV9PUF9DT05EX0ZBSUw6CisJCWlmICh1bmxpa2VseSghKGZsYWdzICYgRkxBR19NQVRDSEVEKSkpCisJCQlnb3RvIHRhZ19taXNtYXRjaDsKKwkJcGMgKz0gYXNuMV9vcF9sZW5ndGhzW29wXTsKKwkJZ290byBuZXh0X29wOworCisJY2FzZSBBU04xX09QX0NPTVBMRVRFOgorCQlpZiAodW5saWtlbHkoanNwICE9IDAgfHwgY3NwICE9IDApKSB7CisJCQlwcl9lcnIoIkFTTi4xIGRlY29kZXIgZXJyb3I6IFN0YWNrcyBub3QgZW1wdHkgYXQgY29tcGxldGlvbiAoJXUsICV1KVxuIiwKKwkJCSAgICAgICBqc3AsIGNzcCk7CisJCQlyZXR1cm4gLUVCQURNU0c7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEFTTjFfT1BfRU5EX1NFVDoKKwljYXNlIEFTTjFfT1BfRU5EX1NFVF9BQ1Q6CisJCWlmICh1bmxpa2VseSghKGZsYWdzICYgRkxBR19NQVRDSEVEKSkpCisJCQlnb3RvIHRhZ19taXNtYXRjaDsKKwljYXNlIEFTTjFfT1BfRU5EX1NFUToKKwljYXNlIEFTTjFfT1BfRU5EX1NFVF9PRjoKKwljYXNlIEFTTjFfT1BfRU5EX1NFUV9PRjoKKwljYXNlIEFTTjFfT1BfRU5EX1NFUV9BQ1Q6CisJY2FzZSBBU04xX09QX0VORF9TRVRfT0ZfQUNUOgorCWNhc2UgQVNOMV9PUF9FTkRfU0VRX09GX0FDVDoKKwkJaWYgKHVubGlrZWx5KGNzcCA8PSAwKSkKKwkJCWdvdG8gY29uc19zdGFja191bmRlcmZsb3c7CisJCWNzcC0tOworCQl0ZHAgPSBjb25zX2RwX3N0YWNrW2NzcF07CisJCWhkciA9IGNvbnNfaGRybGVuX3N0YWNrW2NzcF07CisJCWxlbiA9IGRhdGFsZW47CisJCWRhdGFsZW4gPSBjb25zX2RhdGFsZW5fc3RhY2tbY3NwXTsKKwkJcHJfZGVidWcoIi0gZW5kIGNvbnMgdD0lenUgZHA9JXp1IGw9JXp1LyV6dVxuIiwKKwkJCSB0ZHAsIGRwLCBsZW4sIGRhdGFsZW4pOworCQlpZiAoZGF0YWxlbiA9PSAwKSB7CisJCQkvKiBJbmRlZmluaXRlIGxlbmd0aCAtIGNoZWNrIGZvciB0aGUgRU9DLiAqLworCQkJZGF0YWxlbiA9IGxlbjsKKwkJCWlmICh1bmxpa2VseShkYXRhbGVuIC0gZHAgPCAyKSkKKwkJCQlnb3RvIGRhdGFfb3ZlcnJ1bl9lcnJvcjsKKwkJCWlmIChkYXRhW2RwKytdICE9IDApIHsKKwkJCQlpZiAob3AgJiBBU04xX09QX0VORF9fT0YpIHsKKwkJCQkJZHAtLTsKKwkJCQkJY3NwKys7CisJCQkJCXBjID0gbWFjaGluZVtwYyArIDFdOworCQkJCQlwcl9kZWJ1ZygiLSBjb250aW51ZVxuIik7CisJCQkJCWdvdG8gbmV4dF9vcDsKKwkJCQl9CisJCQkJZ290byBtaXNzaW5nX2VvYzsKKwkJCX0KKwkJCWlmIChkYXRhW2RwKytdICE9IDApCisJCQkJZ290byBpbnZhbGlkX2VvYzsKKwkJCWxlbiA9IGRwIC0gdGRwIC0gMjsKKwkJfSBlbHNlIHsKKwkJCWlmIChkcCA8IGxlbiAmJiAob3AgJiBBU04xX09QX0VORF9fT0YpKSB7CisJCQkJZGF0YWxlbiA9IGxlbjsKKwkJCQljc3ArKzsKKwkJCQlwYyA9IG1hY2hpbmVbcGMgKyAxXTsKKwkJCQlwcl9kZWJ1ZygiLSBjb250aW51ZVxuIik7CisJCQkJZ290byBuZXh0X29wOworCQkJfQorCQkJaWYgKGRwICE9IGxlbikKKwkJCQlnb3RvIGNvbnNfbGVuZ3RoX2Vycm9yOworCQkJbGVuIC09IHRkcDsKKwkJCXByX2RlYnVnKCItIGNvbnMgbGVuIGw9JXp1IGQ9JXp1XG4iLCBsZW4sIGRwIC0gdGRwKTsKKwkJfQorCisJCWlmIChvcCAmIEFTTjFfT1BfRU5EX19BQ1QpIHsKKwkJCXVuc2lnbmVkIGNoYXIgYWN0OworCQkJaWYgKG9wICYgQVNOMV9PUF9FTkRfX09GKQorCQkJCWFjdCA9IG1hY2hpbmVbcGMgKyAyXTsKKwkJCWVsc2UKKwkJCQlhY3QgPSBtYWNoaW5lW3BjICsgMV07CisJCQlyZXQgPSBhY3Rpb25zW2FjdF0oY29udGV4dCwgaGRyLCAwLCBkYXRhICsgdGRwLCBsZW4pOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlwYyArPSBhc24xX29wX2xlbmd0aHNbb3BdOworCQlnb3RvIG5leHRfb3A7CisKKwljYXNlIEFTTjFfT1BfTUFZQkVfQUNUOgorCQlpZiAoIShmbGFncyAmIEZMQUdfTEFTVF9NQVRDSEVEKSkgeworCQkJcGMgKz0gYXNuMV9vcF9sZW5ndGhzW29wXTsKKwkJCWdvdG8gbmV4dF9vcDsKKwkJfQorCWNhc2UgQVNOMV9PUF9BQ1Q6CisJCXJldCA9IGFjdGlvbnNbbWFjaGluZVtwYyArIDFdXShjb250ZXh0LCBoZHIsIHRhZywgZGF0YSArIHRkcCwgbGVuKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlwYyArPSBhc24xX29wX2xlbmd0aHNbb3BdOworCQlnb3RvIG5leHRfb3A7CisKKwljYXNlIEFTTjFfT1BfUkVUVVJOOgorCQlpZiAodW5saWtlbHkoanNwIDw9IDApKQorCQkJZ290byBqdW1wX3N0YWNrX3VuZGVyZmxvdzsKKwkJcGMgPSBqdW1wX3N0YWNrWy0tanNwXTsKKwkJZmxhZ3MgfD0gRkxBR19NQVRDSEVEIHwgRkxBR19MQVNUX01BVENIRUQ7CisJCWdvdG8gbmV4dF9vcDsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCS8qIFNob3VsZG4ndCByZWFjaCBoZXJlICovCisJcHJfZXJyKCJBU04uMSBkZWNvZGVyIGVycm9yOiBGb3VuZCByZXNlcnZlZCBvcGNvZGUgKCV1KSBwYz0lenVcbiIsCisJICAgICAgIG9wLCBwYyk7CisJcmV0dXJuIC1FQkFETVNHOworCitkYXRhX292ZXJydW5fZXJyb3I6CisJZXJybXNnID0gIkRhdGEgb3ZlcnJ1biBlcnJvciI7CisJZ290byBlcnJvcjsKK21hY2hpbmVfb3ZlcnJ1bl9lcnJvcjoKKwllcnJtc2cgPSAiTWFjaGluZSBvdmVycnVuIGVycm9yIjsKKwlnb3RvIGVycm9yOworanVtcF9zdGFja191bmRlcmZsb3c6CisJZXJybXNnID0gIkp1bXAgc3RhY2sgdW5kZXJmbG93IjsKKwlnb3RvIGVycm9yOworanVtcF9zdGFja19vdmVyZmxvdzoKKwllcnJtc2cgPSAiSnVtcCBzdGFjayBvdmVyZmxvdyI7CisJZ290byBlcnJvcjsKK2NvbnNfc3RhY2tfdW5kZXJmbG93OgorCWVycm1zZyA9ICJDb25zIHN0YWNrIHVuZGVyZmxvdyI7CisJZ290byBlcnJvcjsKK2NvbnNfc3RhY2tfb3ZlcmZsb3c6CisJZXJybXNnID0gIkNvbnMgc3RhY2sgb3ZlcmZsb3ciOworCWdvdG8gZXJyb3I7Citjb25zX2xlbmd0aF9lcnJvcjoKKwllcnJtc2cgPSAiQ29ucyBsZW5ndGggZXJyb3IiOworCWdvdG8gZXJyb3I7CittaXNzaW5nX2VvYzoKKwllcnJtc2cgPSAiTWlzc2luZyBFT0MgaW4gaW5kZWZpbml0ZSBsZW4gY29ucyI7CisJZ290byBlcnJvcjsKK2ludmFsaWRfZW9jOgorCWVycm1zZyA9ICJJbnZhbGlkIGxlbmd0aCBFT0MiOworCWdvdG8gZXJyb3I7CitsZW5ndGhfdG9vX2xvbmc6CisJZXJybXNnID0gIlVuc3VwcG9ydGVkIGxlbmd0aCI7CisJZ290byBlcnJvcjsKK2luZGVmaW5pdGVfbGVuX3ByaW1pdGl2ZToKKwllcnJtc2cgPSAiSW5kZWZpbml0ZSBsZW4gcHJpbWl0aXZlIG5vdCBwZXJtaXR0ZWQiOworCWdvdG8gZXJyb3I7Cit0YWdfbWlzbWF0Y2g6CisJZXJybXNnID0gIlVuZXhwZWN0ZWQgdGFnIjsKKwlnb3RvIGVycm9yOworbG9uZ190YWdfbm90X3N1cHBvcnRlZDoKKwllcnJtc2cgPSAiTG9uZyB0YWcgbm90IHN1cHBvcnRlZCI7CitlcnJvcjoKKwlwcl9kZWJ1ZygiXG5BU04xOiAlcyBbbT0lenUgZD0lenUgb3Q9JTAyeCB0PSUwMnggbD0lenVdXG4iLAorCQkgZXJybXNnLCBwYywgZHAsIG9wdGFnLCB0YWcsIGxlbik7CisJcmV0dXJuIC1FQkFETVNHOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYXNuMV9iZXJfZGVjb2Rlcik7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2Fzc29jX2FycmF5LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hc3NvY19hcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NjNkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hc3NvY19hcnJheS5jCkBAIC0wLDAgKzEsMTczNiBAQAorLyogR2VuZXJpYyBhc3NvY2lhdGl2ZSBhcnJheSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBTZWUgRG9jdW1lbnRhdGlvbi9jb3JlLWFwaS9hc3NvY19hcnJheS5yc3QgZm9yIGluZm9ybWF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2VuY2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5jZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworLy8jZGVmaW5lIERFQlVHCisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvYXNzb2NfYXJyYXlfcHJpdi5oPgorCisvKgorICogSXRlcmF0ZSBvdmVyIGFuIGFzc29jaWF0aXZlIGFycmF5LiAgVGhlIGNhbGxlciBtdXN0IGhvbGQgdGhlIFJDVSByZWFkIGxvY2sKKyAqIG9yIGJldHRlci4KKyAqLworc3RhdGljIGludCBhc3NvY19hcnJheV9zdWJ0cmVlX2l0ZXJhdGUoY29uc3Qgc3RydWN0IGFzc29jX2FycmF5X3B0ciAqcm9vdCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IGFzc29jX2FycmF5X3B0ciAqc3RvcCwKKwkJCQkgICAgICAgaW50ICgqaXRlcmF0b3IpKGNvbnN0IHZvaWQgKmxlYWYsCisJCQkJCQkgICAgICAgdm9pZCAqaXRlcmF0b3JfZGF0YSksCisJCQkJICAgICAgIHZvaWQgKml0ZXJhdG9yX2RhdGEpCit7CisJY29uc3Qgc3RydWN0IGFzc29jX2FycmF5X3Nob3J0Y3V0ICpzaG9ydGN1dDsKKwljb25zdCBzdHJ1Y3QgYXNzb2NfYXJyYXlfbm9kZSAqbm9kZTsKKwljb25zdCBzdHJ1Y3QgYXNzb2NfYXJyYXlfcHRyICpjdXJzb3IsICpwdHIsICpwYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBoYXNfbWV0YTsKKwlpbnQgc2xvdCwgcmV0OworCisJY3Vyc29yID0gcm9vdDsKKworYmVnaW5fbm9kZToKKwlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KGN1cnNvcikpIHsKKwkJLyogRGVzY2VuZCB0aHJvdWdoIGEgc2hvcnRjdXQgKi8KKwkJc2hvcnRjdXQgPSBhc3NvY19hcnJheV9wdHJfdG9fc2hvcnRjdXQoY3Vyc29yKTsKKwkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7CisJCWN1cnNvciA9IEFDQ0VTU19PTkNFKHNob3J0Y3V0LT5uZXh0X25vZGUpOworCX0KKworCW5vZGUgPSBhc3NvY19hcnJheV9wdHJfdG9fbm9kZShjdXJzb3IpOworCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCXNsb3QgPSAwOworCisJLyogV2UgcGVyZm9ybSB0d28gcGFzc2VzIG9mIGVhY2ggbm9kZS4KKwkgKgorCSAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgYWxsIHRoZSBsZWF2ZXMgaW4gdGhpcyBub2RlLiAgVGhpcyBtZWFucyB3ZQorCSAqIGRvbid0IG1pc3MgYW55IGxlYXZlcyBpZiB0aGUgbm9kZSBpcyBzcGxpdCB1cCBieSBpbnNlcnRpb24gd2hpbHN0CisJICogd2UncmUgaXRlcmF0aW5nIG92ZXIgdGhlIGJyYW5jaGVzIHJvb3RlZCBoZXJlICh3ZSBtYXksIGhvd2V2ZXIsIHNlZQorCSAqIHNvbWUgbGVhdmVzIHR3aWNlKS4KKwkgKi8KKwloYXNfbWV0YSA9IDA7CisJZm9yICg7IHNsb3QgPCBBU1NPQ19BUlJBWV9GQU5fT1VUOyBzbG90KyspIHsKKwkJcHRyID0gQUNDRVNTX09OQ0Uobm9kZS0+c2xvdHNbc2xvdF0pOworCQloYXNfbWV0YSB8PSAodW5zaWduZWQgbG9uZylwdHI7CisJCWlmIChwdHIgJiYgYXNzb2NfYXJyYXlfcHRyX2lzX2xlYWYocHRyKSkgeworCQkJLyogV2UgbmVlZCBhIGJhcnJpZXIgYmV0d2VlbiB0aGUgcmVhZCBvZiB0aGUgcG9pbnRlcgorCQkJICogYW5kIGRlcmVmZXJlbmNpbmcgdGhlIHBvaW50ZXIgLSBidXQgb25seSBpZiB3ZSBhcmUKKwkJCSAqIGFjdHVhbGx5IGdvaW5nIHRvIGRlcmVmZXJlbmNlIGl0LgorCQkJICovCisJCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKworCQkJLyogSW52b2tlIHRoZSBjYWxsYmFjayAqLworCQkJcmV0ID0gaXRlcmF0b3IoYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYocHRyKSwKKwkJCQkgICAgICAgaXRlcmF0b3JfZGF0YSk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwkvKiBUaGUgc2Vjb25kIHBhc3MgYXR0ZW5kcyB0byBhbGwgdGhlIG1ldGFkYXRhIHBvaW50ZXJzLiAgSWYgd2UgZm9sbG93CisJICogb25lIG9mIHRoZXNlIHdlIG1heSBmaW5kIHRoYXQgd2UgZG9uJ3QgY29tZSBiYWNrIGhlcmUsIGJ1dCByYXRoZXIgZ28KKwkgKiBiYWNrIHRvIGEgcmVwbGFjZW1lbnQgbm9kZSB3aXRoIHRoZSBsZWF2ZXMgaW4gYSBkaWZmZXJlbnQgbGF5b3V0LgorCSAqCisJICogV2UgYXJlIGd1YXJhbnRlZWQgdG8gbWFrZSBwcm9ncmVzcywgaG93ZXZlciwgYXMgdGhlIHNsb3QgbnVtYmVyIGZvcgorCSAqIGEgcGFydGljdWxhciBwb3J0aW9uIG9mIHRoZSBrZXkgc3BhY2UgY2Fubm90IGNoYW5nZSAtIGFuZCB3ZQorCSAqIGNvbnRpbnVlIGF0IHRoZSBiYWNrIHBvaW50ZXIgKyAxLgorCSAqLworCWlmICghKGhhc19tZXRhICYgQVNTT0NfQVJSQVlfUFRSX01FVEFfVFlQRSkpCisJCWdvdG8gZmluaXNoZWRfbm9kZTsKKwlzbG90ID0gMDsKKworY29udGludWVfbm9kZToKKwlub2RlID0gYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUoY3Vyc29yKTsKKwlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKworCWZvciAoOyBzbG90IDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgc2xvdCsrKSB7CisJCXB0ciA9IEFDQ0VTU19PTkNFKG5vZGUtPnNsb3RzW3Nsb3RdKTsKKwkJaWYgKGFzc29jX2FycmF5X3B0cl9pc19tZXRhKHB0cikpIHsKKwkJCWN1cnNvciA9IHB0cjsKKwkJCWdvdG8gYmVnaW5fbm9kZTsKKwkJfQorCX0KKworZmluaXNoZWRfbm9kZToKKwkvKiBNb3ZlIHVwIHRvIHRoZSBwYXJlbnQgKG1heSBuZWVkIHRvIHNraXAgYmFjayBvdmVyIGEgc2hvcnRjdXQpICovCisJcGFyZW50ID0gQUNDRVNTX09OQ0Uobm9kZS0+YmFja19wb2ludGVyKTsKKwlzbG90ID0gbm9kZS0+cGFyZW50X3Nsb3Q7CisJaWYgKHBhcmVudCA9PSBzdG9wKQorCQlyZXR1cm4gMDsKKworCWlmIChhc3NvY19hcnJheV9wdHJfaXNfc2hvcnRjdXQocGFyZW50KSkgeworCQlzaG9ydGN1dCA9IGFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChwYXJlbnQpOworCQlzbXBfcmVhZF9iYXJyaWVyX2RlcGVuZHMoKTsKKwkJY3Vyc29yID0gcGFyZW50OworCQlwYXJlbnQgPSBBQ0NFU1NfT05DRShzaG9ydGN1dC0+YmFja19wb2ludGVyKTsKKwkJc2xvdCA9IHNob3J0Y3V0LT5wYXJlbnRfc2xvdDsKKwkJaWYgKHBhcmVudCA9PSBzdG9wKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogQXNjZW5kIHRvIG5leHQgc2xvdCBpbiBwYXJlbnQgbm9kZSAqLworCWN1cnNvciA9IHBhcmVudDsKKwlzbG90Kys7CisJZ290byBjb250aW51ZV9ub2RlOworfQorCisvKioKKyAqIGFzc29jX2FycmF5X2l0ZXJhdGUgLSBQYXNzIGFsbCBvYmplY3RzIGluIHRoZSBhcnJheSB0byBhIGNhbGxiYWNrCisgKiBAYXJyYXk6IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCisgKiBAaXRlcmF0b3I6IFRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqIEBpdGVyYXRvcl9kYXRhOiBQcml2YXRlIGRhdGEgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAqCisgKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIGFuIGFzc29jaWF0aXZlIGFycmF5LiAgRWFjaCBvbmUgd2lsbCBiZQorICogcHJlc2VudGVkIHRvIHRoZSBpdGVyYXRvciBmdW5jdGlvbi4KKyAqCisgKiBJZiB0aGUgYXJyYXkgaXMgYmVpbmcgbW9kaWZpZWQgY29uY3VycmVudGx5IHdpdGggdGhlIGl0ZXJhdGlvbiB0aGVuIGl0IGlzCisgKiBwb3NzaWJsZSB0aGF0IHNvbWUgb2JqZWN0cyBpbiB0aGUgYXJyYXkgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGl0ZXJhdG9yCisgKiBjYWxsYmFjayBtb3JlIHRoYW4gb25jZSAtIHRob3VnaCBldmVyeSBvYmplY3Qgc2hvdWxkIGJlIHBhc3NlZCBhdCBsZWFzdAorICogb25jZS4gIElmIHRoaXMgaXMgdW5kZXNpcmFibGUgdGhlbiB0aGUgY2FsbGVyIG11c3QgbG9jayBhZ2FpbnN0IG1vZGlmaWNhdGlvbgorICogZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIFRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiAwIGlmIG5vIG9iamVjdHMgd2VyZSBpbiB0aGUgYXJyYXkgb3IgZWxzZSBpdCB3aWxsCisgKiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBpdGVyYXRvciBmdW5jdGlvbiBjYWxsZWQuICBJdGVyYXRpb24gc3RvcHMKKyAqIGltbWVkaWF0ZWx5IGlmIGFueSBjYWxsIHRvIHRoZSBpdGVyYXRpb24gZnVuY3Rpb24gcmVzdWx0cyBpbiBhIG5vbi16ZXJvCisgKiByZXR1cm4uCisgKgorICogVGhlIGNhbGxlciBzaG91bGQgaG9sZCB0aGUgUkNVIHJlYWQgbG9jayBvciBiZXR0ZXIgaWYgY29uY3VycmVudAorICogbW9kaWZpY2F0aW9uIGlzIHBvc3NpYmxlLgorICovCitpbnQgYXNzb2NfYXJyYXlfaXRlcmF0ZShjb25zdCBzdHJ1Y3QgYXNzb2NfYXJyYXkgKmFycmF5LAorCQkJaW50ICgqaXRlcmF0b3IpKGNvbnN0IHZvaWQgKm9iamVjdCwKKwkJCQkJdm9pZCAqaXRlcmF0b3JfZGF0YSksCisJCQl2b2lkICppdGVyYXRvcl9kYXRhKQoreworCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnJvb3QgPSBBQ0NFU1NfT05DRShhcnJheS0+cm9vdCk7CisKKwlpZiAoIXJvb3QpCisJCXJldHVybiAwOworCXJldHVybiBhc3NvY19hcnJheV9zdWJ0cmVlX2l0ZXJhdGUocm9vdCwgTlVMTCwgaXRlcmF0b3IsIGl0ZXJhdG9yX2RhdGEpOworfQorCitlbnVtIGFzc29jX2FycmF5X3dhbGtfc3RhdHVzIHsKKwlhc3NvY19hcnJheV93YWxrX3RyZWVfZW1wdHksCisJYXNzb2NfYXJyYXlfd2Fsa19mb3VuZF90ZXJtaW5hbF9ub2RlLAorCWFzc29jX2FycmF5X3dhbGtfZm91bmRfd3Jvbmdfc2hvcnRjdXQsCit9OworCitzdHJ1Y3QgYXNzb2NfYXJyYXlfd2Fsa19yZXN1bHQgeworCXN0cnVjdCB7CisJCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlCSpub2RlOwkvKiBOb2RlIGluIHdoaWNoIGxlYWYgbWlnaHQgYmUgZm91bmQgKi8KKwkJaW50CQlsZXZlbDsKKwkJaW50CQlzbG90OworCX0gdGVybWluYWxfbm9kZTsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQgKnNob3J0Y3V0OworCQlpbnQJCWxldmVsOworCQlpbnQJCXNjX2xldmVsOworCQl1bnNpZ25lZCBsb25nCXNjX3NlZ21lbnRzOworCQl1bnNpZ25lZCBsb25nCWRpc3NpbWlsYXJpdHk7CisJfSB3cm9uZ19zaG9ydGN1dDsKK307CisKKy8qCisgKiBOYXZpZ2F0ZSB0aHJvdWdoIHRoZSBpbnRlcm5hbCB0cmVlIGxvb2tpbmcgZm9yIHRoZSBjbG9zZXN0IG5vZGUgdG8gdGhlIGtleS4KKyAqLworc3RhdGljIGVudW0gYXNzb2NfYXJyYXlfd2Fsa19zdGF0dXMKK2Fzc29jX2FycmF5X3dhbGsoY29uc3Qgc3RydWN0IGFzc29jX2FycmF5ICphcnJheSwKKwkJIGNvbnN0IHN0cnVjdCBhc3NvY19hcnJheV9vcHMgKm9wcywKKwkJIGNvbnN0IHZvaWQgKmluZGV4X2tleSwKKwkJIHN0cnVjdCBhc3NvY19hcnJheV93YWxrX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0cnVjdCBhc3NvY19hcnJheV9zaG9ydGN1dCAqc2hvcnRjdXQ7CisJc3RydWN0IGFzc29jX2FycmF5X25vZGUgKm5vZGU7CisJc3RydWN0IGFzc29jX2FycmF5X3B0ciAqY3Vyc29yLCAqcHRyOworCXVuc2lnbmVkIGxvbmcgc2Nfc2VnbWVudHMsIGRpc3NpbWlsYXJpdHk7CisJdW5zaWduZWQgbG9uZyBzZWdtZW50czsKKwlpbnQgbGV2ZWwsIHNjX2xldmVsLCBuZXh0X3NjX2xldmVsOworCWludCBzbG90OworCisJcHJfZGV2ZWwoIi0tPiVzKClcbiIsIF9fZnVuY19fKTsKKworCWN1cnNvciA9IEFDQ0VTU19PTkNFKGFycmF5LT5yb290KTsKKwlpZiAoIWN1cnNvcikKKwkJcmV0dXJuIGFzc29jX2FycmF5X3dhbGtfdHJlZV9lbXB0eTsKKworCWxldmVsID0gMDsKKworCS8qIFVzZSBzZWdtZW50cyBmcm9tIHRoZSBrZXkgZm9yIHRoZSBuZXcgbGVhZiB0byBuYXZpZ2F0ZSB0aHJvdWdoIHRoZQorCSAqIGludGVybmFsIHRyZWUsIHNraXBwaW5nIHRocm91Z2ggbm9kZXMgYW5kIHNob3J0Y3V0cyB0aGF0IGFyZSBvbgorCSAqIHJvdXRlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIEV2ZW50dWFsbHkgd2UnbGwgY29tZSB0byBhIHNsb3QgdGhhdCBpcworCSAqIGVpdGhlciBlbXB0eSBvciBjb250YWlucyBhIGxlYWYgYXQgd2hpY2ggcG9pbnQgd2UndmUgZm91bmQgYSBub2RlIGluCisJICogd2hpY2ggdGhlIGxlYWYgd2UncmUgbG9va2luZyBmb3IgbWlnaHQgYmUgZm91bmQgb3IgaW50byB3aGljaCBpdAorCSAqIHNob3VsZCBiZSBpbnNlcnRlZC4KKwkgKi8KK2p1bXBlZDoKKwlzZWdtZW50cyA9IG9wcy0+Z2V0X2tleV9jaHVuayhpbmRleF9rZXksIGxldmVsKTsKKwlwcl9kZXZlbCgic2VnbWVudHNbJWRdOiAlbHhcbiIsIGxldmVsLCBzZWdtZW50cyk7CisKKwlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KGN1cnNvcikpCisJCWdvdG8gZm9sbG93X3Nob3J0Y3V0OworCitjb25zaWRlcl9ub2RlOgorCW5vZGUgPSBhc3NvY19hcnJheV9wdHJfdG9fbm9kZShjdXJzb3IpOworCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCisJc2xvdCA9IHNlZ21lbnRzID4+IChsZXZlbCAmIEFTU09DX0FSUkFZX0tFWV9DSFVOS19NQVNLKTsKKwlzbG90ICY9IEFTU09DX0FSUkFZX0ZBTl9NQVNLOworCXB0ciA9IEFDQ0VTU19PTkNFKG5vZGUtPnNsb3RzW3Nsb3RdKTsKKworCXByX2RldmVsKCJjb25zaWRlciBzbG90ICV4IFtpeD0lZCB0eXBlPSVsdV1cbiIsCisJCSBzbG90LCBsZXZlbCwgKHVuc2lnbmVkIGxvbmcpcHRyICYgMyk7CisKKwlpZiAoIWFzc29jX2FycmF5X3B0cl9pc19tZXRhKHB0cikpIHsKKwkJLyogVGhlIG5vZGUgZG9lc24ndCBoYXZlIGEgbm9kZS9zaG9ydGN1dCBwb2ludGVyIGluIHRoZSBzbG90CisJCSAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGluZGV4IGtleSB0aGF0IHdlIGhhdmUgdG8gZm9sbG93LgorCQkgKi8KKwkJcmVzdWx0LT50ZXJtaW5hbF9ub2RlLm5vZGUgPSBub2RlOworCQlyZXN1bHQtPnRlcm1pbmFsX25vZGUubGV2ZWwgPSBsZXZlbDsKKwkJcmVzdWx0LT50ZXJtaW5hbF9ub2RlLnNsb3QgPSBzbG90OworCQlwcl9kZXZlbCgiPC0tJXMoKSA9IHRlcm1pbmFsX25vZGVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIGFzc29jX2FycmF5X3dhbGtfZm91bmRfdGVybWluYWxfbm9kZTsKKwl9CisKKwlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX25vZGUocHRyKSkgeworCQkvKiBUaGVyZSBpcyBhIHBvaW50ZXIgdG8gYSBub2RlIGluIHRoZSBzbG90IGNvcnJlc3BvbmRpbmcgdG8KKwkJICogdGhpcyBpbmRleCBrZXkgc2VnbWVudCwgc28gd2UgbmVlZCB0byBmb2xsb3cgaXQuCisJCSAqLworCQljdXJzb3IgPSBwdHI7CisJCWxldmVsICs9IEFTU09DX0FSUkFZX0xFVkVMX1NURVA7CisJCWlmICgobGV2ZWwgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSykgIT0gMCkKKwkJCWdvdG8gY29uc2lkZXJfbm9kZTsKKwkJZ290byBqdW1wZWQ7CisJfQorCisJLyogVGhlcmUgaXMgYSBzaG9ydGN1dCBpbiB0aGUgc2xvdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBrZXkKKwkgKiBzZWdtZW50LiAgV2UgZm9sbG93IHRoZSBzaG9ydGN1dCBpZiBpdHMgcGFydGlhbCBpbmRleCBrZXkgbWF0Y2hlcworCSAqIHRoaXMgbGVhZidzLiAgT3RoZXJ3aXNlIHdlIG5lZWQgdG8gc3BsaXQgdGhlIHNob3J0Y3V0LgorCSAqLworCWN1cnNvciA9IHB0cjsKK2ZvbGxvd19zaG9ydGN1dDoKKwlzaG9ydGN1dCA9IGFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChjdXJzb3IpOworCXNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpOworCXByX2RldmVsKCJzaG9ydGN1dCB0byAlZFxuIiwgc2hvcnRjdXQtPnNraXBfdG9fbGV2ZWwpOworCXNjX2xldmVsID0gbGV2ZWwgKyBBU1NPQ19BUlJBWV9MRVZFTF9TVEVQOworCUJVR19PTihzY19sZXZlbCA+IHNob3J0Y3V0LT5za2lwX3RvX2xldmVsKTsKKworCWRvIHsKKwkJLyogQ2hlY2sgdGhlIGxlYWYgYWdhaW5zdCB0aGUgc2hvcnRjdXQncyBpbmRleCBrZXkgYSB3b3JkIGF0IGEKKwkJICogdGltZSwgdHJpbW1pbmcgdGhlIGZpbmFsIHdvcmQgKHRoZSBzaG9ydGN1dCBzdG9yZXMgdGhlIGluZGV4CisJCSAqIGtleSBjb21wbGV0ZWx5IGZyb20gdGhlIHJvb3QgdG8gdGhlIHNob3J0Y3V0J3MgdGFyZ2V0KS4KKwkJICovCisJCWlmICgoc2NfbGV2ZWwgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSykgPT0gMCkKKwkJCXNlZ21lbnRzID0gb3BzLT5nZXRfa2V5X2NodW5rKGluZGV4X2tleSwgc2NfbGV2ZWwpOworCisJCXNjX3NlZ21lbnRzID0gc2hvcnRjdXQtPmluZGV4X2tleVtzY19sZXZlbCA+PiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfU0hJRlRdOworCQlkaXNzaW1pbGFyaXR5ID0gc2VnbWVudHMgXiBzY19zZWdtZW50czsKKworCQlpZiAocm91bmRfdXAoc2NfbGV2ZWwsIEFTU09DX0FSUkFZX0tFWV9DSFVOS19TSVpFKSA+IHNob3J0Y3V0LT5za2lwX3RvX2xldmVsKSB7CisJCQkvKiBUcmltIHNlZ21lbnRzIHRoYXQgYXJlIGJleW9uZCB0aGUgc2hvcnRjdXQgKi8KKwkJCWludCBzaGlmdCA9IHNob3J0Y3V0LT5za2lwX3RvX2xldmVsICYgQVNTT0NfQVJSQVlfS0VZX0NIVU5LX01BU0s7CisJCQlkaXNzaW1pbGFyaXR5ICY9IH4oVUxPTkdfTUFYIDw8IHNoaWZ0KTsKKwkJCW5leHRfc2NfbGV2ZWwgPSBzaG9ydGN1dC0+c2tpcF90b19sZXZlbDsKKwkJfSBlbHNlIHsKKwkJCW5leHRfc2NfbGV2ZWwgPSBzY19sZXZlbCArIEFTU09DX0FSUkFZX0tFWV9DSFVOS19TSVpFOworCQkJbmV4dF9zY19sZXZlbCA9IHJvdW5kX2Rvd24obmV4dF9zY19sZXZlbCwgQVNTT0NfQVJSQVlfS0VZX0NIVU5LX1NJWkUpOworCQl9CisKKwkJaWYgKGRpc3NpbWlsYXJpdHkgIT0gMCkgeworCQkJLyogVGhpcyBzaG9ydGN1dCBwb2ludHMgZWxzZXdoZXJlICovCisJCQlyZXN1bHQtPndyb25nX3Nob3J0Y3V0LnNob3J0Y3V0ID0gc2hvcnRjdXQ7CisJCQlyZXN1bHQtPndyb25nX3Nob3J0Y3V0LmxldmVsID0gbGV2ZWw7CisJCQlyZXN1bHQtPndyb25nX3Nob3J0Y3V0LnNjX2xldmVsID0gc2NfbGV2ZWw7CisJCQlyZXN1bHQtPndyb25nX3Nob3J0Y3V0LnNjX3NlZ21lbnRzID0gc2Nfc2VnbWVudHM7CisJCQlyZXN1bHQtPndyb25nX3Nob3J0Y3V0LmRpc3NpbWlsYXJpdHkgPSBkaXNzaW1pbGFyaXR5OworCQkJcmV0dXJuIGFzc29jX2FycmF5X3dhbGtfZm91bmRfd3Jvbmdfc2hvcnRjdXQ7CisJCX0KKworCQlzY19sZXZlbCA9IG5leHRfc2NfbGV2ZWw7CisJfSB3aGlsZSAoc2NfbGV2ZWwgPCBzaG9ydGN1dC0+c2tpcF90b19sZXZlbCk7CisKKwkvKiBUaGUgc2hvcnRjdXQgbWF0Y2hlcyB0aGUgbGVhZidzIGluZGV4IHRvIHRoaXMgcG9pbnQuICovCisJY3Vyc29yID0gQUNDRVNTX09OQ0Uoc2hvcnRjdXQtPm5leHRfbm9kZSk7CisJaWYgKCgobGV2ZWwgXiBzY19sZXZlbCkgJiB+QVNTT0NfQVJSQVlfS0VZX0NIVU5LX01BU0spICE9IDApIHsKKwkJbGV2ZWwgPSBzY19sZXZlbDsKKwkJZ290byBqdW1wZWQ7CisJfSBlbHNlIHsKKwkJbGV2ZWwgPSBzY19sZXZlbDsKKwkJZ290byBjb25zaWRlcl9ub2RlOworCX0KK30KKworLyoqCisgKiBhc3NvY19hcnJheV9maW5kIC0gRmluZCBhbiBvYmplY3QgYnkgaW5kZXgga2V5CisgKiBAYXJyYXk6IFRoZSBhc3NvY2lhdGl2ZSBhcnJheSB0byBzZWFyY2guCisgKiBAb3BzOiBUaGUgb3BlcmF0aW9ucyB0byB1c2UuCisgKiBAaW5kZXhfa2V5OiBUaGUga2V5IHRvIHRoZSBvYmplY3QuCisgKgorICogRmluZCBhbiBvYmplY3QgaW4gYW4gYXNzb2NpYXRpdmUgYXJyYXkgYnkgd2Fsa2luZyB0aHJvdWdoIHRoZSBpbnRlcm5hbCB0cmVlCisgKiB0byB0aGUgbm9kZSB0aGF0IHNob3VsZCBjb250YWluIHRoZSBvYmplY3QgYW5kIHRoZW4gc2VhcmNoaW5nIHRoZSBsZWF2ZXMKKyAqIHRoZXJlLiAgTlVMTCBpcyByZXR1cm5lZCBpZiB0aGUgcmVxdWVzdGVkIG9iamVjdCB3YXMgbm90IGZvdW5kIGluIHRoZSBhcnJheS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaG9sZCB0aGUgUkNVIHJlYWQgbG9jayBvciBiZXR0ZXIuCisgKi8KK3ZvaWQgKmFzc29jX2FycmF5X2ZpbmQoY29uc3Qgc3RydWN0IGFzc29jX2FycmF5ICphcnJheSwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBhc3NvY19hcnJheV9vcHMgKm9wcywKKwkJICAgICAgIGNvbnN0IHZvaWQgKmluZGV4X2tleSkKK3sKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfd2Fsa19yZXN1bHQgcmVzdWx0OworCWNvbnN0IHN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpub2RlOworCWNvbnN0IHN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnB0cjsKKwljb25zdCB2b2lkICpsZWFmOworCWludCBzbG90OworCisJaWYgKGFzc29jX2FycmF5X3dhbGsoYXJyYXksIG9wcywgaW5kZXhfa2V5LCAmcmVzdWx0KSAhPQorCSAgICBhc3NvY19hcnJheV93YWxrX2ZvdW5kX3Rlcm1pbmFsX25vZGUpCisJCXJldHVybiBOVUxMOworCisJbm9kZSA9IHJlc3VsdC50ZXJtaW5hbF9ub2RlLm5vZGU7CisJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7CisKKwkvKiBJZiB0aGUgdGFyZ2V0IGtleSBpcyBhdmFpbGFibGUgdG8gdXMsIGl0J3MgaGFzIHRvIGJlIHBvaW50ZWQgdG8gYnkKKwkgKiB0aGUgdGVybWluYWwgbm9kZS4KKwkgKi8KKwlmb3IgKHNsb3QgPSAwOyBzbG90IDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgc2xvdCsrKSB7CisJCXB0ciA9IEFDQ0VTU19PTkNFKG5vZGUtPnNsb3RzW3Nsb3RdKTsKKwkJaWYgKHB0ciAmJiBhc3NvY19hcnJheV9wdHJfaXNfbGVhZihwdHIpKSB7CisJCQkvKiBXZSBuZWVkIGEgYmFycmllciBiZXR3ZWVuIHRoZSByZWFkIG9mIHRoZSBwb2ludGVyCisJCQkgKiBhbmQgZGVyZWZlcmVuY2luZyB0aGUgcG9pbnRlciAtIGJ1dCBvbmx5IGlmIHdlIGFyZQorCQkJICogYWN0dWFsbHkgZ29pbmcgdG8gZGVyZWZlcmVuY2UgaXQuCisJCQkgKi8KKwkJCWxlYWYgPSBhc3NvY19hcnJheV9wdHJfdG9fbGVhZihwdHIpOworCQkJc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCk7CisJCQlpZiAob3BzLT5jb21wYXJlX29iamVjdChsZWFmLCBpbmRleF9rZXkpKQorCQkJCXJldHVybiAodm9pZCAqKWxlYWY7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFuIGFzc29jaWF0aXZlIGFycmF5LiAgVGhlIGNhbGxlciBtdXN0IHByZXZlbnQKKyAqIG90aGVyIHNpbXVsdGFuZW91cyBhY2Nlc3Nlcy4KKyAqLworc3RhdGljIHZvaWQgYXNzb2NfYXJyYXlfZGVzdHJveV9zdWJ0cmVlKHN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnJvb3QsCisJCQkJCWNvbnN0IHN0cnVjdCBhc3NvY19hcnJheV9vcHMgKm9wcykKK3sKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQgKnNob3J0Y3V0OworCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpub2RlOworCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKmN1cnNvciwgKnBhcmVudCA9IE5VTEw7CisJaW50IHNsb3QgPSAtMTsKKworCXByX2RldmVsKCItLT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwljdXJzb3IgPSByb290OworCWlmICghY3Vyc29yKSB7CisJCXByX2RldmVsKCJlbXB0eVxuIik7CisJCXJldHVybjsKKwl9CisKK21vdmVfdG9fbWV0YToKKwlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KGN1cnNvcikpIHsKKwkJLyogRGVzY2VuZCB0aHJvdWdoIGEgc2hvcnRjdXQgKi8KKwkJcHJfZGV2ZWwoIlslZF0gc2hvcnRjdXRcbiIsIHNsb3QpOworCQlCVUdfT04oIWFzc29jX2FycmF5X3B0cl9pc19zaG9ydGN1dChjdXJzb3IpKTsKKwkJc2hvcnRjdXQgPSBhc3NvY19hcnJheV9wdHJfdG9fc2hvcnRjdXQoY3Vyc29yKTsKKwkJQlVHX09OKHNob3J0Y3V0LT5iYWNrX3BvaW50ZXIgIT0gcGFyZW50KTsKKwkJQlVHX09OKHNsb3QgIT0gLTEgJiYgc2hvcnRjdXQtPnBhcmVudF9zbG90ICE9IHNsb3QpOworCQlwYXJlbnQgPSBjdXJzb3I7CisJCWN1cnNvciA9IHNob3J0Y3V0LT5uZXh0X25vZGU7CisJCXNsb3QgPSAtMTsKKwkJQlVHX09OKCFhc3NvY19hcnJheV9wdHJfaXNfbm9kZShjdXJzb3IpKTsKKwl9CisKKwlwcl9kZXZlbCgiWyVkXSBub2RlXG4iLCBzbG90KTsKKwlub2RlID0gYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUoY3Vyc29yKTsKKwlCVUdfT04obm9kZS0+YmFja19wb2ludGVyICE9IHBhcmVudCk7CisJQlVHX09OKHNsb3QgIT0gLTEgJiYgbm9kZS0+cGFyZW50X3Nsb3QgIT0gc2xvdCk7CisJc2xvdCA9IDA7CisKK2NvbnRpbnVlX25vZGU6CisJcHJfZGV2ZWwoIk5vZGUgJXAgW2JhY2s9JXBdXG4iLCBub2RlLCBub2RlLT5iYWNrX3BvaW50ZXIpOworCWZvciAoOyBzbG90IDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgc2xvdCsrKSB7CisJCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnB0ciA9IG5vZGUtPnNsb3RzW3Nsb3RdOworCQlpZiAoIXB0cikKKwkJCWNvbnRpbnVlOworCQlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX21ldGEocHRyKSkgeworCQkJcGFyZW50ID0gY3Vyc29yOworCQkJY3Vyc29yID0gcHRyOworCQkJZ290byBtb3ZlX3RvX21ldGE7CisJCX0KKworCQlpZiAob3BzKSB7CisJCQlwcl9kZXZlbCgiWyVkXSBmcmVlIGxlYWZcbiIsIHNsb3QpOworCQkJb3BzLT5mcmVlX29iamVjdChhc3NvY19hcnJheV9wdHJfdG9fbGVhZihwdHIpKTsKKwkJfQorCX0KKworCXBhcmVudCA9IG5vZGUtPmJhY2tfcG9pbnRlcjsKKwlzbG90ID0gbm9kZS0+cGFyZW50X3Nsb3Q7CisJcHJfZGV2ZWwoImZyZWUgbm9kZVxuIik7CisJa2ZyZWUobm9kZSk7CisJaWYgKCFwYXJlbnQpCisJCXJldHVybjsgLyogRG9uZSAqLworCisJLyogTW92ZSBiYWNrIHVwIHRvIHRoZSBwYXJlbnQgKG1heSBuZWVkIHRvIGZyZWUgYSBzaG9ydGN1dCBvbgorCSAqIHRoZSB3YXkgdXApICovCisJaWYgKGFzc29jX2FycmF5X3B0cl9pc19zaG9ydGN1dChwYXJlbnQpKSB7CisJCXNob3J0Y3V0ID0gYXNzb2NfYXJyYXlfcHRyX3RvX3Nob3J0Y3V0KHBhcmVudCk7CisJCUJVR19PTihzaG9ydGN1dC0+bmV4dF9ub2RlICE9IGN1cnNvcik7CisJCWN1cnNvciA9IHBhcmVudDsKKwkJcGFyZW50ID0gc2hvcnRjdXQtPmJhY2tfcG9pbnRlcjsKKwkJc2xvdCA9IHNob3J0Y3V0LT5wYXJlbnRfc2xvdDsKKwkJcHJfZGV2ZWwoImZyZWUgc2hvcnRjdXRcbiIpOworCQlrZnJlZShzaG9ydGN1dCk7CisJCWlmICghcGFyZW50KQorCQkJcmV0dXJuOworCisJCUJVR19PTighYXNzb2NfYXJyYXlfcHRyX2lzX25vZGUocGFyZW50KSk7CisJfQorCisJLyogQXNjZW5kIHRvIG5leHQgc2xvdCBpbiBwYXJlbnQgbm9kZSAqLworCXByX2RldmVsKCJhc2NlbmQgdG8gJXBbJWRdXG4iLCBwYXJlbnQsIHNsb3QpOworCWN1cnNvciA9IHBhcmVudDsKKwlub2RlID0gYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUoY3Vyc29yKTsKKwlzbG90Kys7CisJZ290byBjb250aW51ZV9ub2RlOworfQorCisvKioKKyAqIGFzc29jX2FycmF5X2Rlc3Ryb3kgLSBEZXN0cm95IGFuIGFzc29jaWF0aXZlIGFycmF5CisgKiBAYXJyYXk6IFRoZSBhcnJheSB0byBkZXN0cm95LgorICogQG9wczogVGhlIG9wZXJhdGlvbnMgdG8gdXNlLgorICoKKyAqIERpc2NhcmQgYWxsIG1ldGFkYXRhIGFuZCBmcmVlIGFsbCBvYmplY3RzIGluIGFuIGFzc29jaWF0aXZlIGFycmF5LiAgVGhlCisgKiBhcnJheSB3aWxsIGJlIGVtcHR5IGFuZCByZWFkeSB0byB1c2UgYWdhaW4gdXBvbiBjb21wbGV0aW9uLiAgVGhpcyBmdW5jdGlvbgorICogY2Fubm90IGZhaWwuCisgKgorICogVGhlIGNhbGxlciBtdXN0IHByZXZlbnQgYWxsIG90aGVyIGFjY2Vzc2VzIHdoaWxzdCB0aGlzIHRha2VzIHBsYWNlIGFzIG5vCisgKiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRqdXN0IHBvaW50ZXJzIGdyYWNlZnVsbHkgdG8gcGVybWl0IFJDVSByZWFkbG9jay1ob2xkaW5nCisgKiBhY2Nlc3NlcyB0byBjb250aW51ZS4gIE9uIHRoZSBvdGhlciBoYW5kLCBubyBtZW1vcnkgYWxsb2NhdGlvbiBpcyByZXF1aXJlZC4KKyAqLwordm9pZCBhc3NvY19hcnJheV9kZXN0cm95KHN0cnVjdCBhc3NvY19hcnJheSAqYXJyYXksCisJCQkgY29uc3Qgc3RydWN0IGFzc29jX2FycmF5X29wcyAqb3BzKQoreworCWFzc29jX2FycmF5X2Rlc3Ryb3lfc3VidHJlZShhcnJheS0+cm9vdCwgb3BzKTsKKwlhcnJheS0+cm9vdCA9IE5VTEw7Cit9CisKKy8qCisgKiBIYW5kbGUgaW5zZXJ0aW9uIGludG8gYW4gZW1wdHkgdHJlZS4KKyAqLworc3RhdGljIGJvb2wgYXNzb2NfYXJyYXlfaW5zZXJ0X2luX2VtcHR5X3RyZWUoc3RydWN0IGFzc29jX2FycmF5X2VkaXQgKmVkaXQpCit7CisJc3RydWN0IGFzc29jX2FycmF5X25vZGUgKm5ld19uMDsKKworCXByX2RldmVsKCItLT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwluZXdfbjAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNzb2NfYXJyYXlfbm9kZSksIEdGUF9LRVJORUwpOworCWlmICghbmV3X24wKQorCQlyZXR1cm4gZmFsc2U7CisKKwllZGl0LT5uZXdfbWV0YVswXSA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5ld19uMCk7CisJZWRpdC0+bGVhZl9wID0gJm5ld19uMC0+c2xvdHNbMF07CisJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbmV3X24wOworCWVkaXQtPnNldFswXS5wdHIgPSAmZWRpdC0+YXJyYXktPnJvb3Q7CisJZWRpdC0+c2V0WzBdLnRvID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKworCXByX2RldmVsKCI8LS0lcygpID0gb2sgW25vIHJvb3RdXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBIYW5kbGUgaW5zZXJ0aW9uIGludG8gYSB0ZXJtaW5hbCBub2RlLgorICovCitzdGF0aWMgYm9vbCBhc3NvY19hcnJheV9pbnNlcnRfaW50b190ZXJtaW5hbF9ub2RlKHN0cnVjdCBhc3NvY19hcnJheV9lZGl0ICplZGl0LAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgYXNzb2NfYXJyYXlfb3BzICpvcHMsCisJCQkJCQkgIGNvbnN0IHZvaWQgKmluZGV4X2tleSwKKwkJCQkJCSAgc3RydWN0IGFzc29jX2FycmF5X3dhbGtfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RydWN0IGFzc29jX2FycmF5X3Nob3J0Y3V0ICpzaG9ydGN1dCwgKm5ld19zMDsKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfbm9kZSAqbm9kZSwgKm5ld19uMCwgKm5ld19uMSwgKnNpZGU7CisJc3RydWN0IGFzc29jX2FycmF5X3B0ciAqcHRyOworCXVuc2lnbmVkIGxvbmcgZGlzc2ltaWxhcml0eSwgYmFzZV9zZWcsIGJsYW5rOworCXNpemVfdCBrZXlsZW47CisJYm9vbCBoYXZlX21ldGE7CisJaW50IGxldmVsLCBkaWZmOworCWludCBzbG90LCBuZXh0X3Nsb3QsIGZyZWVfc2xvdCwgaSwgajsKKworCW5vZGUJPSByZXN1bHQtPnRlcm1pbmFsX25vZGUubm9kZTsKKwlsZXZlbAk9IHJlc3VsdC0+dGVybWluYWxfbm9kZS5sZXZlbDsKKwllZGl0LT5zZWdtZW50X2NhY2hlW0FTU09DX0FSUkFZX0ZBTl9PVVRdID0gcmVzdWx0LT50ZXJtaW5hbF9ub2RlLnNsb3Q7CisKKwlwcl9kZXZlbCgiLS0+JXMoKVxuIiwgX19mdW5jX18pOworCisJLyogV2UgYXJyaXZlZCBhdCBhIG5vZGUgd2hpY2ggZG9lc24ndCBoYXZlIGFuIG9ud2FyZCBub2RlIG9yIHNob3J0Y3V0CisJICogcG9pbnRlciB0aGF0IHdlIGhhdmUgdG8gZm9sbG93LiAgVGhpcyBtZWFucyB0aGF0IChhKSB0aGUgbGVhZiB3ZQorCSAqIHdhbnQgbXVzdCBnbyBoZXJlIChlaXRoZXIgYnkgaW5zZXJ0aW9uIG9yIHJlcGxhY2VtZW50KSBvciAoYikgd2UKKwkgKiBuZWVkIHRvIHNwbGl0IHRoaXMgbm9kZSBhbmQgaW5zZXJ0IGluIG9uZSBvZiB0aGUgZnJhZ21lbnRzLgorCSAqLworCWZyZWVfc2xvdCA9IC0xOworCisJLyogRmlyc3RseSwgd2UgaGF2ZSB0byBjaGVjayB0aGUgbGVhdmVzIGluIHRoaXMgbm9kZSB0byBzZWUgaWYgdGhlcmUncworCSAqIGEgbWF0Y2hpbmcgb25lIHdlIHNob3VsZCByZXBsYWNlIGluIHBsYWNlLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1NPQ19BUlJBWV9GQU5fT1VUOyBpKyspIHsKKwkJcHRyID0gbm9kZS0+c2xvdHNbaV07CisJCWlmICghcHRyKSB7CisJCQlmcmVlX3Nsb3QgPSBpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFzc29jX2FycmF5X3B0cl9pc19sZWFmKHB0cikgJiYKKwkJICAgIG9wcy0+Y29tcGFyZV9vYmplY3QoYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYocHRyKSwKKwkJCQkJaW5kZXhfa2V5KSkgeworCQkJcHJfZGV2ZWwoInJlcGxhY2UgaW4gc2xvdCAlZFxuIiwgaSk7CisJCQllZGl0LT5sZWFmX3AgPSAmbm9kZS0+c2xvdHNbaV07CisJCQllZGl0LT5kZWFkX2xlYWYgPSBub2RlLT5zbG90c1tpXTsKKwkJCXByX2RldmVsKCI8LS0lcygpID0gb2sgW3JlcGxhY2VdXG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKworCS8qIElmIHRoZXJlIGlzIGEgZnJlZSBzbG90IGluIHRoaXMgbm9kZSB0aGVuIHdlIGNhbiBqdXN0IGluc2VydCB0aGUKKwkgKiBsZWFmIGhlcmUuCisJICovCisJaWYgKGZyZWVfc2xvdCA+PSAwKSB7CisJCXByX2RldmVsKCJpbnNlcnQgaW4gZnJlZSBzbG90ICVkXG4iLCBmcmVlX3Nsb3QpOworCQllZGl0LT5sZWFmX3AgPSAmbm9kZS0+c2xvdHNbZnJlZV9zbG90XTsKKwkJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbm9kZTsKKwkJcHJfZGV2ZWwoIjwtLSVzKCkgPSBvayBbaW5zZXJ0XVxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwkvKiBUaGUgbm9kZSBoYXMgbm8gc3BhcmUgc2xvdHMgLSBzbyB3ZSdyZSBlaXRoZXIgZ29pbmcgdG8gaGF2ZSB0byBzcGxpdAorCSAqIGl0IG9yIGluc2VydCBhbm90aGVyIG5vZGUgYmVmb3JlIGl0LgorCSAqCisJICogV2hhdGV2ZXIsIHdlJ3JlIGdvaW5nIHRvIG5lZWQgYXQgbGVhc3QgdHdvIG5ldyBub2RlcyAtIHNvIGFsbG9jYXRlCisJICogdGhvc2Ugbm93LiAgV2UgbWF5IGFsc28gbmVlZCBhIG5ldyBzaG9ydGN1dCwgYnV0IHdlIGRlYWwgd2l0aCB0aGF0CisJICogd2hlbiB3ZSBuZWVkIGl0LgorCSAqLworCW5ld19uMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbjApCisJCXJldHVybiBmYWxzZTsKKwllZGl0LT5uZXdfbWV0YVswXSA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5ld19uMCk7CisJbmV3X24xID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzc29jX2FycmF5X25vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19uMSkKKwkJcmV0dXJuIGZhbHNlOworCWVkaXQtPm5ld19tZXRhWzFdID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24xKTsKKworCS8qIFdlIG5lZWQgdG8gZmluZCBvdXQgaG93IHNpbWlsYXIgdGhlIGxlYXZlcyBhcmUuICovCisJcHJfZGV2ZWwoIm5vIHNwYXJlIHNsb3RzXG4iKTsKKwloYXZlX21ldGEgPSBmYWxzZTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgaSsrKSB7CisJCXB0ciA9IG5vZGUtPnNsb3RzW2ldOworCQlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX21ldGEocHRyKSkgeworCQkJZWRpdC0+c2VnbWVudF9jYWNoZVtpXSA9IDB4ZmY7CisJCQloYXZlX21ldGEgPSB0cnVlOworCQkJY29udGludWU7CisJCX0KKwkJYmFzZV9zZWcgPSBvcHMtPmdldF9vYmplY3Rfa2V5X2NodW5rKAorCQkJYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYocHRyKSwgbGV2ZWwpOworCQliYXNlX3NlZyA+Pj0gbGV2ZWwgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSzsKKwkJZWRpdC0+c2VnbWVudF9jYWNoZVtpXSA9IGJhc2Vfc2VnICYgQVNTT0NfQVJSQVlfRkFOX01BU0s7CisJfQorCisJaWYgKGhhdmVfbWV0YSkgeworCQlwcl9kZXZlbCgiaGF2ZSBtZXRhXG4iKTsKKwkJZ290byBzcGxpdF9ub2RlOworCX0KKworCS8qIFRoZSBub2RlIGNvbnRhaW5zIG9ubHkgbGVhdmVzICovCisJZGlzc2ltaWxhcml0eSA9IDA7CisJYmFzZV9zZWcgPSBlZGl0LT5zZWdtZW50X2NhY2hlWzBdOworCWZvciAoaSA9IDE7IGkgPCBBU1NPQ19BUlJBWV9GQU5fT1VUOyBpKyspCisJCWRpc3NpbWlsYXJpdHkgfD0gZWRpdC0+c2VnbWVudF9jYWNoZVtpXSBeIGJhc2Vfc2VnOworCisJcHJfZGV2ZWwoIm9ubHkgbGVhdmVzOyBkaXNzaW1pbGFyaXR5PSVseFxuIiwgZGlzc2ltaWxhcml0eSk7CisKKwlpZiAoKGRpc3NpbWlsYXJpdHkgJiBBU1NPQ19BUlJBWV9GQU5fTUFTSykgPT0gMCkgeworCQkvKiBUaGUgb2xkIGxlYXZlcyBhbGwgY2x1c3RlciBpbiB0aGUgc2FtZSBzbG90LiAgV2Ugd2lsbCBuZWVkCisJCSAqIHRvIGluc2VydCBhIHNob3J0Y3V0IGlmIHRoZSBuZXcgbm9kZSB3YW50cyB0byBjbHVzdGVyIHdpdGggdGhlbS4KKwkJICovCisJCWlmICgoZWRpdC0+c2VnbWVudF9jYWNoZVtBU1NPQ19BUlJBWV9GQU5fT1VUXSBeIGJhc2Vfc2VnKSA9PSAwKQorCQkJZ290byBhbGxfbGVhdmVzX2NsdXN0ZXJfdG9nZXRoZXI7CisKKwkJLyogT3RoZXJ3aXNlIGFsbCB0aGUgb2xkIGxlYXZlcyBjbHVzdGVyIGluIHRoZSBzYW1lIHNsb3QsIGJ1dAorCQkgKiB0aGUgbmV3IGxlYWYgd2FudHMgdG8gZ28gaW50byBhIGRpZmZlcmVudCBzbG90IC0gc28gd2UKKwkJICogY3JlYXRlIGEgbmV3IG5vZGUgKG4wKSB0byBob2xkIHRoZSBuZXcgbGVhZiBhbmQgYSBwb2ludGVyIHRvCisJCSAqIGEgbmV3IG5vZGUgKG4xKSBob2xkaW5nIGFsbCB0aGUgb2xkIGxlYXZlcy4KKwkJICoKKwkJICogVGhpcyBjYW4gYmUgZG9uZSBieSBmYWxsaW5nIHRocm91Z2ggdG8gdGhlIG5vZGUgc3BsaXR0aW5nCisJCSAqIHBhdGguCisJCSAqLworCQlwcl9kZXZlbCgicHJlc2VudCBsZWF2ZXMgY2x1c3RlciBidXQgbm90IG5ldyBsZWFmXG4iKTsKKwl9CisKK3NwbGl0X25vZGU6CisJcHJfZGV2ZWwoInNwbGl0IG5vZGVcbiIpOworCisJLyogV2UgbmVlZCB0byBzcGxpdCB0aGUgY3VycmVudCBub2RlLiAgVGhlIG5vZGUgbXVzdCBjb250YWluIGFueXRoaW5nCisJICogZnJvbSBhIHNpbmdsZSBsZWFmIChpbiB0aGUgb25lIGxlYWYgY2FzZSwgdGhpcyBsZWFmIHdpbGwgY2x1c3RlcgorCSAqIHdpdGggdGhlIG5ldyBsZWFmKSBhbmQgdGhlIHJlc3QgbWV0YS1wb2ludGVycywgdG8gYWxsIGxlYXZlcywgc29tZQorCSAqIG9mIHdoaWNoIG1heSBjbHVzdGVyLgorCSAqCisJICogSXQgd29uJ3QgY29udGFpbiB0aGUgY2FzZSBpbiB3aGljaCBhbGwgdGhlIGN1cnJlbnQgbGVhdmVzIHBsdXMgdGhlCisJICogbmV3IGxlYXZlcyB3YW50IHRvIGNsdXN0ZXIgaW4gdGhlIHNhbWUgc2xvdC4KKwkgKgorCSAqIFdlIG5lZWQgdG8gZXhwZWwgYXQgbGVhc3QgdHdvIGxlYXZlcyBvdXQgb2YgYSBzZXQgY29uc2lzdGluZyBvZiB0aGUKKwkgKiBsZWF2ZXMgaW4gdGhlIG5vZGUgYW5kIHRoZSBuZXcgbGVhZi4gIFRoZSBjdXJyZW50IG1ldGEgcG9pbnRlcnMgY2FuCisJICoganVzdCBiZSBjb3BpZWQgYXMgdGhleSBzaG91bGRuJ3QgY2x1c3RlciB3aXRoIGFueSBvZiB0aGUgbGVhdmVzLgorCSAqCisJICogV2UgbmVlZCBhIG5ldyBub2RlIChuMCkgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBvbmUgYW5kIGEgbmV3IG5vZGUgdG8KKwkgKiB0YWtlIHRoZSBleHBlbGxlZCBub2RlcyAobjEpLgorCSAqLworCWVkaXQtPnNldFswXS50byA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5ld19uMCk7CisJbmV3X24wLT5iYWNrX3BvaW50ZXIgPSBub2RlLT5iYWNrX3BvaW50ZXI7CisJbmV3X24wLT5wYXJlbnRfc2xvdCA9IG5vZGUtPnBhcmVudF9zbG90OworCW5ld19uMS0+YmFja19wb2ludGVyID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKwluZXdfbjEtPnBhcmVudF9zbG90ID0gLTE7IC8qIE5lZWQgdG8gY2FsY3VsYXRlIHRoaXMgKi8KKworZG9fc3BsaXRfbm9kZToKKwlwcl9kZXZlbCgiZG9fc3BsaXRfbm9kZVxuIik7CisKKwluZXdfbjAtPm5yX2xlYXZlc19vbl9icmFuY2ggPSBub2RlLT5ucl9sZWF2ZXNfb25fYnJhbmNoOworCW5ld19uMS0+bnJfbGVhdmVzX29uX2JyYW5jaCA9IDA7CisKKwkvKiBCZWdpbiBieSBmaW5kaW5nIHR3byBtYXRjaGluZyBsZWF2ZXMuICBUaGVyZSBoYXZlIHRvIGJlIGF0IGxlYXN0IHR3bworCSAqIHRoYXQgbWF0Y2ggLSBldmVuIGlmIHRoZXJlIGFyZSBtZXRhIHBvaW50ZXJzIC0gYmVjYXVzZSBhbnkgbGVhZiB0aGF0CisJICogd291bGQgbWF0Y2ggYSBzbG90IHdpdGggYSBtZXRhIHBvaW50ZXIgaW4gaXQgbXVzdCBiZSBzb21ld2hlcmUKKwkgKiBiZWhpbmQgdGhhdCBtZXRhIHBvaW50ZXIgYW5kIGNhbm5vdCBiZSBoZXJlLiAgRnVydGhlciwgZ2l2ZW4gTgorCSAqIHJlbWFpbmluZyBsZWFmIHNsb3RzLCB3ZSBub3cgaGF2ZSBOKzEgbGVhdmVzIHRvIGdvIGluIHRoZW0uCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IGkrKykgeworCQlzbG90ID0gZWRpdC0+c2VnbWVudF9jYWNoZVtpXTsKKwkJaWYgKHNsb3QgIT0gMHhmZikKKwkJCWZvciAoaiA9IGkgKyAxOyBqIDwgQVNTT0NfQVJSQVlfRkFOX09VVCArIDE7IGorKykKKwkJCQlpZiAoZWRpdC0+c2VnbWVudF9jYWNoZVtqXSA9PSBzbG90KQorCQkJCQlnb3RvIGZvdW5kX3Nsb3RfZm9yX211bHRpcGxlX29jY3VwYW5jeTsKKwl9Citmb3VuZF9zbG90X2Zvcl9tdWx0aXBsZV9vY2N1cGFuY3k6CisJcHJfZGV2ZWwoInNhbWUgc2xvdDogJXggJXggWyUwMnhdXG4iLCBpLCBqLCBzbG90KTsKKwlCVUdfT04oaSA+PSBBU1NPQ19BUlJBWV9GQU5fT1VUKTsKKwlCVUdfT04oaiA+PSBBU1NPQ19BUlJBWV9GQU5fT1VUICsgMSk7CisJQlVHX09OKHNsb3QgPj0gQVNTT0NfQVJSQVlfRkFOX09VVCk7CisKKwluZXdfbjEtPnBhcmVudF9zbG90ID0gc2xvdDsKKworCS8qIE1ldGFkYXRhIHBvaW50ZXJzIGNhbm5vdCBjaGFuZ2Ugc2xvdCAqLworCWZvciAoaSA9IDA7IGkgPCBBU1NPQ19BUlJBWV9GQU5fT1VUOyBpKyspCisJCWlmIChhc3NvY19hcnJheV9wdHJfaXNfbWV0YShub2RlLT5zbG90c1tpXSkpCisJCQluZXdfbjAtPnNsb3RzW2ldID0gbm9kZS0+c2xvdHNbaV07CisJCWVsc2UKKwkJCW5ld19uMC0+c2xvdHNbaV0gPSBOVUxMOworCUJVR19PTihuZXdfbjAtPnNsb3RzW3Nsb3RdICE9IE5VTEwpOworCW5ld19uMC0+c2xvdHNbc2xvdF0gPSBhc3NvY19hcnJheV9ub2RlX3RvX3B0cihuZXdfbjEpOworCisJLyogRmlsdGVyIHRoZSBsZWFmIHBvaW50ZXJzIGJldHdlZW4gdGhlIG5ldyBub2RlcyAqLworCWZyZWVfc2xvdCA9IC0xOworCW5leHRfc2xvdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IGkrKykgeworCQlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX21ldGEobm9kZS0+c2xvdHNbaV0pKQorCQkJY29udGludWU7CisJCWlmIChlZGl0LT5zZWdtZW50X2NhY2hlW2ldID09IHNsb3QpIHsKKwkJCW5ld19uMS0+c2xvdHNbbmV4dF9zbG90KytdID0gbm9kZS0+c2xvdHNbaV07CisJCQluZXdfbjEtPm5yX2xlYXZlc19vbl9icmFuY2grKzsKKwkJfSBlbHNlIHsKKwkJCWRvIHsKKwkJCQlmcmVlX3Nsb3QrKzsKKwkJCX0gd2hpbGUgKG5ld19uMC0+c2xvdHNbZnJlZV9zbG90XSAhPSBOVUxMKTsKKwkJCW5ld19uMC0+c2xvdHNbZnJlZV9zbG90XSA9IG5vZGUtPnNsb3RzW2ldOworCQl9CisJfQorCisJcHJfZGV2ZWwoImZpbHRlcmVkOiBmPSV4IG49JXhcbiIsIGZyZWVfc2xvdCwgbmV4dF9zbG90KTsKKworCWlmIChlZGl0LT5zZWdtZW50X2NhY2hlW0FTU09DX0FSUkFZX0ZBTl9PVVRdICE9IHNsb3QpIHsKKwkJZG8geworCQkJZnJlZV9zbG90Kys7CisJCX0gd2hpbGUgKG5ld19uMC0+c2xvdHNbZnJlZV9zbG90XSAhPSBOVUxMKTsKKwkJZWRpdC0+bGVhZl9wID0gJm5ld19uMC0+c2xvdHNbZnJlZV9zbG90XTsKKwkJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbmV3X24wOworCX0gZWxzZSB7CisJCWVkaXQtPmxlYWZfcCA9ICZuZXdfbjEtPnNsb3RzW25leHRfc2xvdCsrXTsKKwkJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbmV3X24xOworCX0KKworCUJVR19PTihuZXh0X3Nsb3QgPD0gMSk7CisKKwllZGl0LT5zZXRfYmFja3BvaW50ZXJzX3RvID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgaSsrKSB7CisJCWlmIChlZGl0LT5zZWdtZW50X2NhY2hlW2ldID09IDB4ZmYpIHsKKwkJCXB0ciA9IG5vZGUtPnNsb3RzW2ldOworCQkJQlVHX09OKGFzc29jX2FycmF5X3B0cl9pc19sZWFmKHB0cikpOworCQkJaWYgKGFzc29jX2FycmF5X3B0cl9pc19ub2RlKHB0cikpIHsKKwkJCQlzaWRlID0gYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUocHRyKTsKKwkJCQllZGl0LT5zZXRfYmFja3BvaW50ZXJzW2ldID0gJnNpZGUtPmJhY2tfcG9pbnRlcjsKKwkJCX0gZWxzZSB7CisJCQkJc2hvcnRjdXQgPSBhc3NvY19hcnJheV9wdHJfdG9fc2hvcnRjdXQocHRyKTsKKwkJCQllZGl0LT5zZXRfYmFja3BvaW50ZXJzW2ldID0gJnNob3J0Y3V0LT5iYWNrX3BvaW50ZXI7CisJCQl9CisJCX0KKwl9CisKKwlwdHIgPSBub2RlLT5iYWNrX3BvaW50ZXI7CisJaWYgKCFwdHIpCisJCWVkaXQtPnNldFswXS5wdHIgPSAmZWRpdC0+YXJyYXktPnJvb3Q7CisJZWxzZSBpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX25vZGUocHRyKSkKKwkJZWRpdC0+c2V0WzBdLnB0ciA9ICZhc3NvY19hcnJheV9wdHJfdG9fbm9kZShwdHIpLT5zbG90c1tub2RlLT5wYXJlbnRfc2xvdF07CisJZWxzZQorCQllZGl0LT5zZXRbMF0ucHRyID0gJmFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChwdHIpLT5uZXh0X25vZGU7CisJZWRpdC0+ZXhjaXNlZF9tZXRhWzBdID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobm9kZSk7CisJcHJfZGV2ZWwoIjwtLSVzKCkgPSBvayBbc3BsaXQgbm9kZV1cbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gdHJ1ZTsKKworYWxsX2xlYXZlc19jbHVzdGVyX3RvZ2V0aGVyOgorCS8qIEFsbCB0aGUgbGVhdmVzLCBuZXcgYW5kIG9sZCwgd2FudCB0byBjbHVzdGVyIHRvZ2V0aGVyIGluIHRoaXMgbm9kZQorCSAqIGluIHRoZSBzYW1lIHNsb3QsIHNvIHdlIGhhdmUgdG8gcmVwbGFjZSB0aGlzIG5vZGUgd2l0aCBhIHNob3J0Y3V0IHRvCisJICogc2tpcCBvdmVyIHRoZSBpZGVudGljYWwgcGFydHMgb2YgdGhlIGtleSBhbmQgdGhlbiBwbGFjZSBhIHBhaXIgb2YKKwkgKiBub2Rlcywgb25lIGluc2lkZSB0aGUgb3RoZXIsIGF0IHRoZSBlbmQgb2YgdGhlIHNob3J0Y3V0IGFuZAorCSAqIGRpc3RyaWJ1dGUgdGhlIGtleXMgYmV0d2VlbiB0aGVtLgorCSAqCisJICogRmlyc3RseSB3ZSBuZWVkIHRvIHdvcmsgb3V0IHdoZXJlIHRoZSBsZWF2ZXMgc3RhcnQgZGl2ZXJnaW5nIGFzIGEKKwkgKiBiaXQgcG9zaXRpb24gaW50byB0aGVpciBrZXlzIHNvIHRoYXQgd2Uga25vdyBob3cgYmlnIHRoZSBzaG9ydGN1dAorCSAqIG5lZWRzIHRvIGJlLgorCSAqCisJICogV2Ugb25seSBuZWVkIHRvIG1ha2UgYSBzaW5nbGUgcGFzcyBvZiBOIG9mIHRoZSBOKzEgbGVhdmVzIGJlY2F1c2UgaWYKKwkgKiBhbnkga2V5cyBkaWZmZXIgYmV0d2VlbiB0aGVtc2VsdmVzIGF0IGJpdCBYIHRoZW4gYXQgbGVhc3Qgb25lIG9mCisJICogdGhlbSBtdXN0IGFsc28gZGlmZmVyIHdpdGggdGhlIGJhc2Uga2V5IGF0IGJpdCBYIG9yIGJlZm9yZS4KKwkgKi8KKwlwcl9kZXZlbCgiYWxsIGxlYXZlcyBjbHVzdGVyIHRvZ2V0aGVyXG4iKTsKKwlkaWZmID0gSU5UX01BWDsKKwlmb3IgKGkgPSAwOyBpIDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgaSsrKSB7CisJCWludCB4ID0gb3BzLT5kaWZmX29iamVjdHMoYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYobm9kZS0+c2xvdHNbaV0pLAorCQkJCQkgIGluZGV4X2tleSk7CisJCWlmICh4IDwgZGlmZikgeworCQkJQlVHX09OKHggPCAwKTsKKwkJCWRpZmYgPSB4OworCQl9CisJfQorCUJVR19PTihkaWZmID09IElOVF9NQVgpOworCUJVR19PTihkaWZmIDwgbGV2ZWwgKyBBU1NPQ19BUlJBWV9MRVZFTF9TVEVQKTsKKworCWtleWxlbiA9IHJvdW5kX3VwKGRpZmYsIEFTU09DX0FSUkFZX0tFWV9DSFVOS19TSVpFKTsKKwlrZXlsZW4gPj49IEFTU09DX0FSUkFZX0tFWV9DSFVOS19TSElGVDsKKworCW5ld19zMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9zaG9ydGN1dCkgKworCQkJIGtleWxlbiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfczApCisJCXJldHVybiBmYWxzZTsKKwllZGl0LT5uZXdfbWV0YVsyXSA9IGFzc29jX2FycmF5X3Nob3J0Y3V0X3RvX3B0cihuZXdfczApOworCisJZWRpdC0+c2V0WzBdLnRvID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zMCk7CisJbmV3X3MwLT5iYWNrX3BvaW50ZXIgPSBub2RlLT5iYWNrX3BvaW50ZXI7CisJbmV3X3MwLT5wYXJlbnRfc2xvdCA9IG5vZGUtPnBhcmVudF9zbG90OworCW5ld19zMC0+bmV4dF9ub2RlID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKwluZXdfbjAtPmJhY2tfcG9pbnRlciA9IGFzc29jX2FycmF5X3Nob3J0Y3V0X3RvX3B0cihuZXdfczApOworCW5ld19uMC0+cGFyZW50X3Nsb3QgPSAwOworCW5ld19uMS0+YmFja19wb2ludGVyID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKwluZXdfbjEtPnBhcmVudF9zbG90ID0gLTE7IC8qIE5lZWQgdG8gY2FsY3VsYXRlIHRoaXMgKi8KKworCW5ld19zMC0+c2tpcF90b19sZXZlbCA9IGxldmVsID0gZGlmZiAmIH5BU1NPQ19BUlJBWV9MRVZFTF9TVEVQX01BU0s7CisJcHJfZGV2ZWwoInNraXBfdG9fbGV2ZWwgPSAlZCBbZGlmZiAlZF1cbiIsIGxldmVsLCBkaWZmKTsKKwlCVUdfT04obGV2ZWwgPD0gMCk7CisKKwlmb3IgKGkgPSAwOyBpIDwga2V5bGVuOyBpKyspCisJCW5ld19zMC0+aW5kZXhfa2V5W2ldID0KKwkJCW9wcy0+Z2V0X2tleV9jaHVuayhpbmRleF9rZXksIGkgKiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfU0laRSk7CisKKwlpZiAobGV2ZWwgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSykgeworCQlibGFuayA9IFVMT05HX01BWCA8PCAobGV2ZWwgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSyk7CisJCXByX2RldmVsKCJibGFuayBvZmYgWyV6dV0gJWQ6ICVseFxuIiwga2V5bGVuIC0gMSwgbGV2ZWwsIGJsYW5rKTsKKwkJbmV3X3MwLT5pbmRleF9rZXlba2V5bGVuIC0gMV0gJj0gfmJsYW5rOworCX0KKworCS8qIFRoaXMgbm93IHJlZHVjZXMgdG8gYSBub2RlIHNwbGl0dGluZyBleGVyY2lzZSBmb3Igd2hpY2ggd2UnbGwgbmVlZAorCSAqIHRvIHJlZ2VuZXJhdGUgdGhlIGRpc3Bhcml0eSB0YWJsZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgaSsrKSB7CisJCXB0ciA9IG5vZGUtPnNsb3RzW2ldOworCQliYXNlX3NlZyA9IG9wcy0+Z2V0X29iamVjdF9rZXlfY2h1bmsoYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYocHRyKSwKKwkJCQkJCSAgICAgbGV2ZWwpOworCQliYXNlX3NlZyA+Pj0gbGV2ZWwgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSzsKKwkJZWRpdC0+c2VnbWVudF9jYWNoZVtpXSA9IGJhc2Vfc2VnICYgQVNTT0NfQVJSQVlfRkFOX01BU0s7CisJfQorCisJYmFzZV9zZWcgPSBvcHMtPmdldF9rZXlfY2h1bmsoaW5kZXhfa2V5LCBsZXZlbCk7CisJYmFzZV9zZWcgPj49IGxldmVsICYgQVNTT0NfQVJSQVlfS0VZX0NIVU5LX01BU0s7CisJZWRpdC0+c2VnbWVudF9jYWNoZVtBU1NPQ19BUlJBWV9GQU5fT1VUXSA9IGJhc2Vfc2VnICYgQVNTT0NfQVJSQVlfRkFOX01BU0s7CisJZ290byBkb19zcGxpdF9ub2RlOworfQorCisvKgorICogSGFuZGxlIGluc2VydGlvbiBpbnRvIHRoZSBtaWRkbGUgb2YgYSBzaG9ydGN1dC4KKyAqLworc3RhdGljIGJvb2wgYXNzb2NfYXJyYXlfaW5zZXJ0X21pZF9zaG9ydGN1dChzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCAqZWRpdCwKKwkJCQkJICAgIGNvbnN0IHN0cnVjdCBhc3NvY19hcnJheV9vcHMgKm9wcywKKwkJCQkJICAgIHN0cnVjdCBhc3NvY19hcnJheV93YWxrX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0cnVjdCBhc3NvY19hcnJheV9zaG9ydGN1dCAqc2hvcnRjdXQsICpuZXdfczAsICpuZXdfczE7CisJc3RydWN0IGFzc29jX2FycmF5X25vZGUgKm5vZGUsICpuZXdfbjAsICpzaWRlOworCXVuc2lnbmVkIGxvbmcgc2Nfc2VnbWVudHMsIGRpc3NpbWlsYXJpdHksIGJsYW5rOworCXNpemVfdCBrZXlsZW47CisJaW50IGxldmVsLCBzY19sZXZlbCwgZGlmZjsKKwlpbnQgc2Nfc2xvdDsKKworCXNob3J0Y3V0CT0gcmVzdWx0LT53cm9uZ19zaG9ydGN1dC5zaG9ydGN1dDsKKwlsZXZlbAkJPSByZXN1bHQtPndyb25nX3Nob3J0Y3V0LmxldmVsOworCXNjX2xldmVsCT0gcmVzdWx0LT53cm9uZ19zaG9ydGN1dC5zY19sZXZlbDsKKwlzY19zZWdtZW50cwk9IHJlc3VsdC0+d3Jvbmdfc2hvcnRjdXQuc2Nfc2VnbWVudHM7CisJZGlzc2ltaWxhcml0eQk9IHJlc3VsdC0+d3Jvbmdfc2hvcnRjdXQuZGlzc2ltaWxhcml0eTsKKworCXByX2RldmVsKCItLT4lcyhpeD0lZCBkaXM9JWx4IHNjaXg9JWQpXG4iLAorCQkgX19mdW5jX18sIGxldmVsLCBkaXNzaW1pbGFyaXR5LCBzY19sZXZlbCk7CisKKwkvKiBXZSBuZWVkIHRvIHNwbGl0IGEgc2hvcnRjdXQgYW5kIGluc2VydCBhIG5vZGUgYmV0d2VlbiB0aGUgdHdvCisJICogcGllY2VzLiAgWmVyby1sZW5ndGggcGllY2VzIHdpbGwgYmUgZGlzcGVuc2VkIHdpdGggZW50aXJlbHkuCisJICoKKwkgKiBGaXJzdCBvZiBhbGwsIHdlIG5lZWQgdG8gZmluZCBvdXQgaW4gd2hpY2ggbGV2ZWwgdGhlIGZpcnN0CisJICogZGlmZmVyZW5jZSB3YXMuCisJICovCisJZGlmZiA9IF9fZmZzKGRpc3NpbWlsYXJpdHkpOworCWRpZmYgJj0gfkFTU09DX0FSUkFZX0xFVkVMX1NURVBfTUFTSzsKKwlkaWZmICs9IHNjX2xldmVsICYgfkFTU09DX0FSUkFZX0tFWV9DSFVOS19NQVNLOworCXByX2RldmVsKCJkaWZmPSVkXG4iLCBkaWZmKTsKKworCWlmICghc2hvcnRjdXQtPmJhY2tfcG9pbnRlcikgeworCQllZGl0LT5zZXRbMF0ucHRyID0gJmVkaXQtPmFycmF5LT5yb290OworCX0gZWxzZSBpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX25vZGUoc2hvcnRjdXQtPmJhY2tfcG9pbnRlcikpIHsKKwkJbm9kZSA9IGFzc29jX2FycmF5X3B0cl90b19ub2RlKHNob3J0Y3V0LT5iYWNrX3BvaW50ZXIpOworCQllZGl0LT5zZXRbMF0ucHRyID0gJm5vZGUtPnNsb3RzW3Nob3J0Y3V0LT5wYXJlbnRfc2xvdF07CisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfQorCisJZWRpdC0+ZXhjaXNlZF9tZXRhWzBdID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKHNob3J0Y3V0KTsKKworCS8qIENyZWF0ZSBhIG5ldyBub2RlIG5vdyBzaW5jZSB3ZSdyZSBnb2luZyB0byBuZWVkIGl0IGFueXdheSAqLworCW5ld19uMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfbjApCisJCXJldHVybiBmYWxzZTsKKwllZGl0LT5uZXdfbWV0YVswXSA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5ld19uMCk7CisJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbmV3X24wOworCisJLyogSW5zZXJ0IGEgbmV3IHNob3J0Y3V0IGJlZm9yZSB0aGUgbmV3IG5vZGUgaWYgdGhpcyBzZWdtZW50IGlzbid0IG9mCisJICogemVybyBsZW5ndGggLSBvdGhlcndpc2Ugd2UganVzdCBjb25uZWN0IHRoZSBuZXcgbm9kZSBkaXJlY3RseSB0byB0aGUKKwkgKiBwYXJlbnQuCisJICovCisJbGV2ZWwgKz0gQVNTT0NfQVJSQVlfTEVWRUxfU1RFUDsKKwlpZiAoZGlmZiA+IGxldmVsKSB7CisJCXByX2RldmVsKCJwcmUtc2hvcnRjdXQgJWQuLi4lZFxuIiwgbGV2ZWwsIGRpZmYpOworCQlrZXlsZW4gPSByb3VuZF91cChkaWZmLCBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfU0laRSk7CisJCWtleWxlbiA+Pj0gQVNTT0NfQVJSQVlfS0VZX0NIVU5LX1NISUZUOworCisJCW5ld19zMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9zaG9ydGN1dCkgKworCQkJCSBrZXlsZW4gKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCQlpZiAoIW5ld19zMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJZWRpdC0+bmV3X21ldGFbMV0gPSBhc3NvY19hcnJheV9zaG9ydGN1dF90b19wdHIobmV3X3MwKTsKKwkJZWRpdC0+c2V0WzBdLnRvID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zMCk7CisJCW5ld19zMC0+YmFja19wb2ludGVyID0gc2hvcnRjdXQtPmJhY2tfcG9pbnRlcjsKKwkJbmV3X3MwLT5wYXJlbnRfc2xvdCA9IHNob3J0Y3V0LT5wYXJlbnRfc2xvdDsKKwkJbmV3X3MwLT5uZXh0X25vZGUgPSBhc3NvY19hcnJheV9ub2RlX3RvX3B0cihuZXdfbjApOworCQluZXdfczAtPnNraXBfdG9fbGV2ZWwgPSBkaWZmOworCisJCW5ld19uMC0+YmFja19wb2ludGVyID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zMCk7CisJCW5ld19uMC0+cGFyZW50X3Nsb3QgPSAwOworCisJCW1lbWNweShuZXdfczAtPmluZGV4X2tleSwgc2hvcnRjdXQtPmluZGV4X2tleSwKKwkJICAgICAgIGtleWxlbiAqIHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKKwkJYmxhbmsgPSBVTE9OR19NQVggPDwgKGRpZmYgJiBBU1NPQ19BUlJBWV9LRVlfQ0hVTktfTUFTSyk7CisJCXByX2RldmVsKCJibGFuayBvZmYgWyV6dV0gJWQ6ICVseFxuIiwga2V5bGVuIC0gMSwgZGlmZiwgYmxhbmspOworCQluZXdfczAtPmluZGV4X2tleVtrZXlsZW4gLSAxXSAmPSB+Ymxhbms7CisJfSBlbHNlIHsKKwkJcHJfZGV2ZWwoIm5vIHByZS1zaG9ydGN1dFxuIik7CisJCWVkaXQtPnNldFswXS50byA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5ld19uMCk7CisJCW5ld19uMC0+YmFja19wb2ludGVyID0gc2hvcnRjdXQtPmJhY2tfcG9pbnRlcjsKKwkJbmV3X24wLT5wYXJlbnRfc2xvdCA9IHNob3J0Y3V0LT5wYXJlbnRfc2xvdDsKKwl9CisKKwlzaWRlID0gYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUoc2hvcnRjdXQtPm5leHRfbm9kZSk7CisJbmV3X24wLT5ucl9sZWF2ZXNfb25fYnJhbmNoID0gc2lkZS0+bnJfbGVhdmVzX29uX2JyYW5jaDsKKworCS8qIFdlIG5lZWQgdG8ga25vdyB3aGljaCBzbG90IGluIHRoZSBuZXcgbm9kZSBpcyBnb2luZyB0byB0YWtlIGEKKwkgKiBtZXRhZGF0YSBwb2ludGVyLgorCSAqLworCXNjX3Nsb3QgPSBzY19zZWdtZW50cyA+PiAoZGlmZiAmIEFTU09DX0FSUkFZX0tFWV9DSFVOS19NQVNLKTsKKwlzY19zbG90ICY9IEFTU09DX0FSUkFZX0ZBTl9NQVNLOworCisJcHJfZGV2ZWwoIm5ldyBzbG90ICVseCA+PiAlZCAtPiAlZFxuIiwKKwkJIHNjX3NlZ21lbnRzLCBkaWZmICYgQVNTT0NfQVJSQVlfS0VZX0NIVU5LX01BU0ssIHNjX3Nsb3QpOworCisJLyogRGV0ZXJtaW5lIHdoZXRoZXIgd2UgbmVlZCB0byBmb2xsb3cgdGhlIG5ldyBub2RlIHdpdGggYSByZXBsYWNlbWVudAorCSAqIGZvciB0aGUgY3VycmVudCBzaG9ydGN1dC4gIFdlIGNvdWxkIGluIHRoZW9yeSByZXVzZSB0aGUgY3VycmVudAorCSAqIHNob3J0Y3V0IGlmIGl0cyBwYXJlbnQgc2xvdCBudW1iZXIgZG9lc24ndCBjaGFuZ2UgLSBidXQgdGhhdCdzIGEKKwkgKiAxLWluLTE2IGNoYW5jZSBzbyBub3Qgd29ydGggZXhwZW5kaW5nIHRoZSBjb2RlIHVwb24uCisJICovCisJbGV2ZWwgPSBkaWZmICsgQVNTT0NfQVJSQVlfTEVWRUxfU1RFUDsKKwlpZiAobGV2ZWwgPCBzaG9ydGN1dC0+c2tpcF90b19sZXZlbCkgeworCQlwcl9kZXZlbCgicG9zdC1zaG9ydGN1dCAlZC4uLiVkXG4iLCBsZXZlbCwgc2hvcnRjdXQtPnNraXBfdG9fbGV2ZWwpOworCQlrZXlsZW4gPSByb3VuZF91cChzaG9ydGN1dC0+c2tpcF90b19sZXZlbCwgQVNTT0NfQVJSQVlfS0VZX0NIVU5LX1NJWkUpOworCQlrZXlsZW4gPj49IEFTU09DX0FSUkFZX0tFWV9DSFVOS19TSElGVDsKKworCQluZXdfczEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQpICsKKwkJCQkga2V5bGVuICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFuZXdfczEpCisJCQlyZXR1cm4gZmFsc2U7CisJCWVkaXQtPm5ld19tZXRhWzJdID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zMSk7CisKKwkJbmV3X3MxLT5iYWNrX3BvaW50ZXIgPSBhc3NvY19hcnJheV9ub2RlX3RvX3B0cihuZXdfbjApOworCQluZXdfczEtPnBhcmVudF9zbG90ID0gc2Nfc2xvdDsKKwkJbmV3X3MxLT5uZXh0X25vZGUgPSBzaG9ydGN1dC0+bmV4dF9ub2RlOworCQluZXdfczEtPnNraXBfdG9fbGV2ZWwgPSBzaG9ydGN1dC0+c2tpcF90b19sZXZlbDsKKworCQluZXdfbjAtPnNsb3RzW3NjX3Nsb3RdID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zMSk7CisKKwkJbWVtY3B5KG5ld19zMS0+aW5kZXhfa2V5LCBzaG9ydGN1dC0+aW5kZXhfa2V5LAorCQkgICAgICAga2V5bGVuICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKworCQllZGl0LT5zZXRbMV0ucHRyID0gJnNpZGUtPmJhY2tfcG9pbnRlcjsKKwkJZWRpdC0+c2V0WzFdLnRvID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zMSk7CisJfSBlbHNlIHsKKwkJcHJfZGV2ZWwoIm5vIHBvc3Qtc2hvcnRjdXRcbiIpOworCisJCS8qIFdlIGRvbid0IGhhdmUgdG8gcmVwbGFjZSB0aGUgcG9pbnRlZC10byBub2RlIGFzIGxvbmcgYXMgd2UKKwkJICogdXNlIG1lbW9yeSBiYXJyaWVycyB0byBtYWtlIHN1cmUgdGhlIHBhcmVudCBzbG90IG51bWJlciBpcworCQkgKiBjaGFuZ2VkIGJlZm9yZSB0aGUgYmFjayBwb2ludGVyICh0aGUgcGFyZW50IHNsb3QgbnVtYmVyIGlzCisJCSAqIGlycmVsZXZhbnQgdG8gdGhlIG9sZCBwYXJlbnQgc2hvcnRjdXQpLgorCQkgKi8KKwkJbmV3X24wLT5zbG90c1tzY19zbG90XSA9IHNob3J0Y3V0LT5uZXh0X25vZGU7CisJCWVkaXQtPnNldF9wYXJlbnRfc2xvdFswXS5wID0gJnNpZGUtPnBhcmVudF9zbG90OworCQllZGl0LT5zZXRfcGFyZW50X3Nsb3RbMF0udG8gPSBzY19zbG90OworCQllZGl0LT5zZXRbMV0ucHRyID0gJnNpZGUtPmJhY2tfcG9pbnRlcjsKKwkJZWRpdC0+c2V0WzFdLnRvID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKwl9CisKKwkvKiBJbnN0YWxsIHRoZSBuZXcgbGVhZiBpbiBhIHNwYXJlIHNsb3QgaW4gdGhlIG5ldyBub2RlLiAqLworCWlmIChzY19zbG90ID09IDApCisJCWVkaXQtPmxlYWZfcCA9ICZuZXdfbjAtPnNsb3RzWzFdOworCWVsc2UKKwkJZWRpdC0+bGVhZl9wID0gJm5ld19uMC0+c2xvdHNbMF07CisKKwlwcl9kZXZlbCgiPC0tJXMoKSA9IG9rIFtzcGxpdCBzaG9ydGN1dF1cbiIsIF9fZnVuY19fKTsKKwlyZXR1cm4gZWRpdDsKK30KKworLyoqCisgKiBhc3NvY19hcnJheV9pbnNlcnQgLSBTY3JpcHQgaW5zZXJ0aW9uIG9mIGFuIG9iamVjdCBpbnRvIGFuIGFzc29jaWF0aXZlIGFycmF5CisgKiBAYXJyYXk6IFRoZSBhcnJheSB0byBpbnNlcnQgaW50by4KKyAqIEBvcHM6IFRoZSBvcGVyYXRpb25zIHRvIHVzZS4KKyAqIEBpbmRleF9rZXk6IFRoZSBrZXkgdG8gaW5zZXJ0IGF0LgorICogQG9iamVjdDogVGhlIG9iamVjdCB0byBpbnNlcnQuCisgKgorICogUHJlY2FsY3VsYXRlIGFuZCBwcmVhbGxvY2F0ZSBhIHNjcmlwdCBmb3IgdGhlIGluc2VydGlvbiBvciByZXBsYWNlbWVudCBvZiBhbgorICogb2JqZWN0IGluIGFuIGFzc29jaWF0aXZlIGFycmF5LiAgVGhpcyByZXN1bHRzIGluIGFuIGVkaXQgc2NyaXB0IHRoYXQgY2FuCisgKiBlaXRoZXIgYmUgYXBwbGllZCBvciBjYW5jZWxsZWQuCisgKgorICogVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIGFuIGVkaXQgc2NyaXB0IG9yIC1FTk9NRU0uCisgKgorICogVGhlIGNhbGxlciBzaG91bGQgbG9jayBhZ2FpbnN0IG90aGVyIG1vZGlmaWNhdGlvbnMgYW5kIG11c3QgY29udGludWUgdG8gaG9sZAorICogdGhlIGxvY2sgdW50aWwgYXNzb2NfYXJyYXlfYXBwbHlfZWRpdCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAqCisgKiBBY2Nlc3NlcyB0byB0aGUgdHJlZSBtYXkgdGFrZSBwbGFjZSBjb25jdXJyZW50bHkgd2l0aCB0aGlzIGZ1bmN0aW9uLAorICogcHJvdmlkZWQgdGhleSBob2xkIHRoZSBSQ1UgcmVhZCBsb2NrLgorICovCitzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCAqYXNzb2NfYXJyYXlfaW5zZXJ0KHN0cnVjdCBhc3NvY19hcnJheSAqYXJyYXksCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgYXNzb2NfYXJyYXlfb3BzICpvcHMsCisJCQkJCSAgICBjb25zdCB2b2lkICppbmRleF9rZXksCisJCQkJCSAgICB2b2lkICpvYmplY3QpCit7CisJc3RydWN0IGFzc29jX2FycmF5X3dhbGtfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCAqZWRpdDsKKworCXByX2RldmVsKCItLT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkvKiBUaGUgbGVhZiBwb2ludGVyIHdlJ3JlIGdpdmVuIG11c3Qgbm90IGhhdmUgdGhlIGJvdHRvbSBiaXQgc2V0IGFzIHdlCisJICogdXNlIHRob3NlIGZvciB0eXBlLW1hcmtpbmcgdGhlIHBvaW50ZXIuICBOVUxMIHBvaW50ZXJzIGFyZSBhbHNvIG5vdAorCSAqIGFsbG93ZWQgYXMgdGhleSBpbmRpY2F0ZSBhbiBlbXB0eSBzbG90IGJ1dCB3ZSBoYXZlIHRvIGFsbG93IHRoZW0KKwkgKiBoZXJlIGFzIHRoZXkgY2FuIGJlIHVwZGF0ZWQgbGF0ZXIuCisJICovCisJQlVHX09OKGFzc29jX2FycmF5X3B0cl9pc19tZXRhKG9iamVjdCkpOworCisJZWRpdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9lZGl0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZGl0KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwllZGl0LT5hcnJheSA9IGFycmF5OworCWVkaXQtPm9wcyA9IG9wczsKKwllZGl0LT5sZWFmID0gYXNzb2NfYXJyYXlfbGVhZl90b19wdHIob2JqZWN0KTsKKwllZGl0LT5hZGp1c3RfY291bnRfYnkgPSAxOworCisJc3dpdGNoIChhc3NvY19hcnJheV93YWxrKGFycmF5LCBvcHMsIGluZGV4X2tleSwgJnJlc3VsdCkpIHsKKwljYXNlIGFzc29jX2FycmF5X3dhbGtfdHJlZV9lbXB0eToKKwkJLyogQWxsb2NhdGUgYSByb290IG5vZGUgaWYgdGhlcmUgaXNuJ3Qgb25lIHlldCAqLworCQlpZiAoIWFzc29jX2FycmF5X2luc2VydF9pbl9lbXB0eV90cmVlKGVkaXQpKQorCQkJZ290byBlbm9tZW07CisJCXJldHVybiBlZGl0OworCisJY2FzZSBhc3NvY19hcnJheV93YWxrX2ZvdW5kX3Rlcm1pbmFsX25vZGU6CisJCS8qIFdlIGZvdW5kIGEgbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG5vZGUvc2hvcnRjdXQgcG9pbnRlciBpbgorCQkgKiB0aGUgc2xvdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBrZXkgdGhhdCB3ZSBoYXZlIHRvCisJCSAqIGZvbGxvdy4KKwkJICovCisJCWlmICghYXNzb2NfYXJyYXlfaW5zZXJ0X2ludG9fdGVybWluYWxfbm9kZShlZGl0LCBvcHMsIGluZGV4X2tleSwKKwkJCQkJCQkgICAmcmVzdWx0KSkKKwkJCWdvdG8gZW5vbWVtOworCQlyZXR1cm4gZWRpdDsKKworCWNhc2UgYXNzb2NfYXJyYXlfd2Fsa19mb3VuZF93cm9uZ19zaG9ydGN1dDoKKwkJLyogV2UgZm91bmQgYSBzaG9ydGN1dCB0aGF0IGRpZG4ndCBtYXRjaCBvdXIga2V5IGluIGEgc2xvdCB3ZQorCQkgKiBuZWVkZWQgdG8gZm9sbG93LgorCQkgKi8KKwkJaWYgKCFhc3NvY19hcnJheV9pbnNlcnRfbWlkX3Nob3J0Y3V0KGVkaXQsIG9wcywgJnJlc3VsdCkpCisJCQlnb3RvIGVub21lbTsKKwkJcmV0dXJuIGVkaXQ7CisJfQorCitlbm9tZW06CisJLyogQ2xlYW4gdXAgYWZ0ZXIgYW4gb3V0IG9mIG1lbW9yeSBlcnJvciAqLworCXByX2RldmVsKCJlbm9tZW1cbiIpOworCWFzc29jX2FycmF5X2NhbmNlbF9lZGl0KGVkaXQpOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworfQorCisvKioKKyAqIGFzc29jX2FycmF5X2luc2VydF9zZXRfb2JqZWN0IC0gU2V0IHRoZSBuZXcgb2JqZWN0IHBvaW50ZXIgaW4gYW4gZWRpdCBzY3JpcHQKKyAqIEBlZGl0OiBUaGUgZWRpdCBzY3JpcHQgdG8gbW9kaWZ5LgorICogQG9iamVjdDogVGhlIG9iamVjdCBwb2ludGVyIHRvIHNldC4KKyAqCisgKiBDaGFuZ2UgdGhlIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbiBhbiBlZGl0IHNjcmlwdC4gIFRoZSBvYmplY3QgcG9pbnRlZCB0bworICogYnkgdGhlIG9sZCBvYmplY3QgaXMgbm90IGZyZWVkLiAgVGhpcyBtdXN0IGJlIGRvbmUgcHJpb3IgdG8gYXBwbHlpbmcgdGhlCisgKiBzY3JpcHQuCisgKi8KK3ZvaWQgYXNzb2NfYXJyYXlfaW5zZXJ0X3NldF9vYmplY3Qoc3RydWN0IGFzc29jX2FycmF5X2VkaXQgKmVkaXQsIHZvaWQgKm9iamVjdCkKK3sKKwlCVUdfT04oIW9iamVjdCk7CisJZWRpdC0+bGVhZiA9IGFzc29jX2FycmF5X2xlYWZfdG9fcHRyKG9iamVjdCk7Cit9CisKK3N0cnVjdCBhc3NvY19hcnJheV9kZWxldGVfY29sbGFwc2VfY29udGV4dCB7CisJc3RydWN0IGFzc29jX2FycmF5X25vZGUJKm5vZGU7CisJY29uc3Qgdm9pZAkJKnNraXBfbGVhZjsKKwlpbnQJCQlzbG90OworfTsKKworLyoKKyAqIFN1YnRyZWUgY29sbGFwc2UgdG8gbm9kZSBpdGVyYXRvci4KKyAqLworc3RhdGljIGludCBhc3NvY19hcnJheV9kZWxldGVfY29sbGFwc2VfaXRlcmF0b3IoY29uc3Qgdm9pZCAqbGVhZiwKKwkJCQkJCXZvaWQgKml0ZXJhdG9yX2RhdGEpCit7CisJc3RydWN0IGFzc29jX2FycmF5X2RlbGV0ZV9jb2xsYXBzZV9jb250ZXh0ICpjb2xsYXBzZSA9IGl0ZXJhdG9yX2RhdGE7CisKKwlpZiAobGVhZiA9PSBjb2xsYXBzZS0+c2tpcF9sZWFmKQorCQlyZXR1cm4gMDsKKworCUJVR19PTihjb2xsYXBzZS0+c2xvdCA+PSBBU1NPQ19BUlJBWV9GQU5fT1VUKTsKKworCWNvbGxhcHNlLT5ub2RlLT5zbG90c1tjb2xsYXBzZS0+c2xvdCsrXSA9IGFzc29jX2FycmF5X2xlYWZfdG9fcHRyKGxlYWYpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGFzc29jX2FycmF5X2RlbGV0ZSAtIFNjcmlwdCBkZWxldGlvbiBvZiBhbiBvYmplY3QgZnJvbSBhbiBhc3NvY2lhdGl2ZSBhcnJheQorICogQGFycmF5OiBUaGUgYXJyYXkgdG8gc2VhcmNoLgorICogQG9wczogVGhlIG9wZXJhdGlvbnMgdG8gdXNlLgorICogQGluZGV4X2tleTogVGhlIGtleSB0byB0aGUgb2JqZWN0LgorICoKKyAqIFByZWNhbGN1bGF0ZSBhbmQgcHJlYWxsb2NhdGUgYSBzY3JpcHQgZm9yIHRoZSBkZWxldGlvbiBvZiBhbiBvYmplY3QgZnJvbSBhbgorICogYXNzb2NpYXRpdmUgYXJyYXkuICBUaGlzIHJlc3VsdHMgaW4gYW4gZWRpdCBzY3JpcHQgdGhhdCBjYW4gZWl0aGVyIGJlCisgKiBhcHBsaWVkIG9yIGNhbmNlbGxlZC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gZWRpdCBzY3JpcHQgaWYgdGhlIG9iamVjdCB3YXMgZm91bmQsCisgKiBOVUxMIGlmIHRoZSBvYmplY3Qgd2FzIG5vdCBmb3VuZCBvciAtRU5PTUVNLgorICoKKyAqIFRoZSBjYWxsZXIgc2hvdWxkIGxvY2sgYWdhaW5zdCBvdGhlciBtb2RpZmljYXRpb25zIGFuZCBtdXN0IGNvbnRpbnVlIHRvIGhvbGQKKyAqIHRoZSBsb2NrIHVudGlsIGFzc29jX2FycmF5X2FwcGx5X2VkaXQoKSBoYXMgYmVlbiBjYWxsZWQuCisgKgorICogQWNjZXNzZXMgdG8gdGhlIHRyZWUgbWF5IHRha2UgcGxhY2UgY29uY3VycmVudGx5IHdpdGggdGhpcyBmdW5jdGlvbiwKKyAqIHByb3ZpZGVkIHRoZXkgaG9sZCB0aGUgUkNVIHJlYWQgbG9jay4KKyAqLworc3RydWN0IGFzc29jX2FycmF5X2VkaXQgKmFzc29jX2FycmF5X2RlbGV0ZShzdHJ1Y3QgYXNzb2NfYXJyYXkgKmFycmF5LAorCQkJCQkgICAgY29uc3Qgc3RydWN0IGFzc29jX2FycmF5X29wcyAqb3BzLAorCQkJCQkgICAgY29uc3Qgdm9pZCAqaW5kZXhfa2V5KQoreworCXN0cnVjdCBhc3NvY19hcnJheV9kZWxldGVfY29sbGFwc2VfY29udGV4dCBjb2xsYXBzZTsKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfd2Fsa19yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpub2RlLCAqbmV3X24wOworCXN0cnVjdCBhc3NvY19hcnJheV9lZGl0ICplZGl0OworCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnB0cjsKKwlib29sIGhhc19tZXRhOworCWludCBzbG90LCBpOworCisJcHJfZGV2ZWwoIi0tPiVzKClcbiIsIF9fZnVuY19fKTsKKworCWVkaXQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCksIEdGUF9LRVJORUwpOworCWlmICghZWRpdCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZWRpdC0+YXJyYXkgPSBhcnJheTsKKwllZGl0LT5vcHMgPSBvcHM7CisJZWRpdC0+YWRqdXN0X2NvdW50X2J5ID0gLTE7CisKKwlzd2l0Y2ggKGFzc29jX2FycmF5X3dhbGsoYXJyYXksIG9wcywgaW5kZXhfa2V5LCAmcmVzdWx0KSkgeworCWNhc2UgYXNzb2NfYXJyYXlfd2Fsa19mb3VuZF90ZXJtaW5hbF9ub2RlOgorCQkvKiBXZSBmb3VuZCBhIG5vZGUgdGhhdCBzaG91bGQgY29udGFpbiB0aGUgbGVhZiB3ZSd2ZSBiZWVuCisJCSAqIGFza2VkIHRvIHJlbW92ZSAtICppZiogaXQncyBpbiB0aGUgdHJlZS4KKwkJICovCisJCXByX2RldmVsKCJ0ZXJtaW5hbF9ub2RlXG4iKTsKKwkJbm9kZSA9IHJlc3VsdC50ZXJtaW5hbF9ub2RlLm5vZGU7CisKKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IHNsb3QrKykgeworCQkJcHRyID0gbm9kZS0+c2xvdHNbc2xvdF07CisJCQlpZiAocHRyICYmCisJCQkgICAgYXNzb2NfYXJyYXlfcHRyX2lzX2xlYWYocHRyKSAmJgorCQkJICAgIG9wcy0+Y29tcGFyZV9vYmplY3QoYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYocHRyKSwKKwkJCQkJCWluZGV4X2tleSkpCisJCQkJZ290byBmb3VuZF9sZWFmOworCQl9CisJY2FzZSBhc3NvY19hcnJheV93YWxrX3RyZWVfZW1wdHk6CisJY2FzZSBhc3NvY19hcnJheV93YWxrX2ZvdW5kX3dyb25nX3Nob3J0Y3V0OgorCWRlZmF1bHQ6CisJCWFzc29jX2FycmF5X2NhbmNlbF9lZGl0KGVkaXQpOworCQlwcl9kZXZlbCgibm90IGZvdW5kXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCitmb3VuZF9sZWFmOgorCUJVR19PTihhcnJheS0+bnJfbGVhdmVzX29uX3RyZWUgPD0gMCk7CisKKwkvKiBJbiB0aGUgc2ltcGxlc3QgZm9ybSBvZiBkZWxldGlvbiB3ZSBqdXN0IGNsZWFyIHRoZSBzbG90IGFuZCByZWxlYXNlCisJICogdGhlIGxlYWYgYWZ0ZXIgYSBzdWl0YWJsZSBpbnRlcnZhbC4KKwkgKi8KKwllZGl0LT5kZWFkX2xlYWYgPSBub2RlLT5zbG90c1tzbG90XTsKKwllZGl0LT5zZXRbMF0ucHRyID0gJm5vZGUtPnNsb3RzW3Nsb3RdOworCWVkaXQtPnNldFswXS50byA9IE5VTEw7CisJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbm9kZTsKKworCS8qIElmIHRoYXQgY29uY2x1ZGVzIGVyYXN1cmUgb2YgdGhlIGxhc3QgbGVhZiwgdGhlbiBkZWxldGUgdGhlIGVudGlyZQorCSAqIGludGVybmFsIGFycmF5LgorCSAqLworCWlmIChhcnJheS0+bnJfbGVhdmVzX29uX3RyZWUgPT0gMSkgeworCQllZGl0LT5zZXRbMV0ucHRyID0gJmFycmF5LT5yb290OworCQllZGl0LT5zZXRbMV0udG8gPSBOVUxMOworCQllZGl0LT5hZGp1c3RfY291bnRfb24gPSBOVUxMOworCQllZGl0LT5leGNpc2VkX3N1YnRyZWUgPSBhcnJheS0+cm9vdDsKKwkJcHJfZGV2ZWwoImFsbCBnb25lXG4iKTsKKwkJcmV0dXJuIGVkaXQ7CisJfQorCisJLyogSG93ZXZlciwgd2UnZCBhbHNvIGxpa2UgdG8gY2xlYXIgdXAgc29tZSBtZXRhZGF0YSBibG9ja3MgaWYgd2UKKwkgKiBwb3NzaWJseSBjYW4uCisJICoKKwkgKiBXZSBnbyBmb3IgYSBzaW1wbGUgYWxnb3JpdGhtIG9mOiBpZiB0aGlzIG5vZGUgaGFzIEZBTl9PVVQgb3IgZmV3ZXIKKwkgKiBsZWF2ZXMgaW4gaXQsIHRoZW4gYXR0ZW1wdCB0byBjb2xsYXBzZSBpdCAtIGFuZCBhdHRlbXB0IHRvCisJICogcmVjdXJzaXZlbHkgY29sbGFwc2UgdXAgdGhlIHRyZWUuCisJICoKKwkgKiBXZSBjb3VsZCBhbHNvIHRyeSBhbmQgY29sbGFwc2UgaW4gcGFydGlhbGx5IGZpbGxlZCBzdWJ0cmVlcyB0byB0YWtlCisJICogdXAgc3BhY2UgaW4gdGhpcyBub2RlLgorCSAqLworCWlmIChub2RlLT5ucl9sZWF2ZXNfb25fYnJhbmNoIDw9IEFTU09DX0FSUkFZX0ZBTl9PVVQgKyAxKSB7CisJCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpwYXJlbnQsICpncmFuZHBhcmVudDsKKwkJc3RydWN0IGFzc29jX2FycmF5X3B0ciAqcHRyOworCisJCS8qIEZpcnN0IG9mIGFsbCwgd2UgbmVlZCB0byBrbm93IGlmIHRoaXMgbm9kZSBoYXMgbWV0YWRhdGEgc28KKwkJICogdGhhdCB3ZSBkb24ndCB0cnkgY29sbGFwc2luZyBpZiBhbGwgdGhlIGxlYXZlcyBhcmUgYWxyZWFkeQorCQkgKiBoZXJlLgorCQkgKi8KKwkJaGFzX21ldGEgPSBmYWxzZTsKKwkJZm9yIChpID0gMDsgaSA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IGkrKykgeworCQkJcHRyID0gbm9kZS0+c2xvdHNbaV07CisJCQlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX21ldGEocHRyKSkgeworCQkJCWhhc19tZXRhID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCXByX2RldmVsKCJsZWF2ZXM6ICVsZCBbbT0lZF1cbiIsCisJCQkgbm9kZS0+bnJfbGVhdmVzX29uX2JyYW5jaCAtIDEsIGhhc19tZXRhKTsKKworCQkvKiBMb29rIGZ1cnRoZXIgdXAgdGhlIHRyZWUgdG8gc2VlIGlmIHdlIGNhbiBjb2xsYXBzZSB0aGlzIG5vZGUKKwkJICogaW50byBhIG1vcmUgcHJveGltYWwgbm9kZSB0b28uCisJCSAqLworCQlwYXJlbnQgPSBub2RlOworCWNvbGxhcHNlX3VwOgorCQlwcl9kZXZlbCgiY29sbGFwc2Ugc3VidHJlZTogJWxkXG4iLCBwYXJlbnQtPm5yX2xlYXZlc19vbl9icmFuY2gpOworCisJCXB0ciA9IHBhcmVudC0+YmFja19wb2ludGVyOworCQlpZiAoIXB0cikKKwkJCWdvdG8gZG9fY29sbGFwc2U7CisJCWlmIChhc3NvY19hcnJheV9wdHJfaXNfc2hvcnRjdXQocHRyKSkgeworCQkJc3RydWN0IGFzc29jX2FycmF5X3Nob3J0Y3V0ICpzID0gYXNzb2NfYXJyYXlfcHRyX3RvX3Nob3J0Y3V0KHB0cik7CisJCQlwdHIgPSBzLT5iYWNrX3BvaW50ZXI7CisJCQlpZiAoIXB0cikKKwkJCQlnb3RvIGRvX2NvbGxhcHNlOworCQl9CisKKwkJZ3JhbmRwYXJlbnQgPSBhc3NvY19hcnJheV9wdHJfdG9fbm9kZShwdHIpOworCQlpZiAoZ3JhbmRwYXJlbnQtPm5yX2xlYXZlc19vbl9icmFuY2ggPD0gQVNTT0NfQVJSQVlfRkFOX09VVCArIDEpIHsKKwkJCXBhcmVudCA9IGdyYW5kcGFyZW50OworCQkJZ290byBjb2xsYXBzZV91cDsKKwkJfQorCisJZG9fY29sbGFwc2U6CisJCS8qIFRoZXJlJ3Mgbm8gcG9pbnQgY29sbGFwc2luZyBpZiB0aGUgb3JpZ2luYWwgbm9kZSBoYXMgbm8gbWV0YQorCQkgKiBwb2ludGVycyB0byBkaXNjYXJkIGFuZCBpZiB3ZSBkaWRuJ3QgbWVyZ2UgaW50byBvbmUgb2YgdGhhdAorCQkgKiBub2RlJ3MgYW5jZXN0cnkuCisJCSAqLworCQlpZiAoaGFzX21ldGEgfHwgcGFyZW50ICE9IG5vZGUpIHsKKwkJCW5vZGUgPSBwYXJlbnQ7CisKKwkJCS8qIENyZWF0ZSBhIG5ldyBub2RlIHRvIGNvbGxhcHNlIGludG8gKi8KKwkJCW5ld19uMCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9ub2RlKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIW5ld19uMCkKKwkJCQlnb3RvIGVub21lbTsKKwkJCWVkaXQtPm5ld19tZXRhWzBdID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKworCQkJbmV3X24wLT5iYWNrX3BvaW50ZXIgPSBub2RlLT5iYWNrX3BvaW50ZXI7CisJCQluZXdfbjAtPnBhcmVudF9zbG90ID0gbm9kZS0+cGFyZW50X3Nsb3Q7CisJCQluZXdfbjAtPm5yX2xlYXZlc19vbl9icmFuY2ggPSBub2RlLT5ucl9sZWF2ZXNfb25fYnJhbmNoOworCQkJZWRpdC0+YWRqdXN0X2NvdW50X29uID0gbmV3X24wOworCisJCQljb2xsYXBzZS5ub2RlID0gbmV3X24wOworCQkJY29sbGFwc2Uuc2tpcF9sZWFmID0gYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYoZWRpdC0+ZGVhZF9sZWFmKTsKKwkJCWNvbGxhcHNlLnNsb3QgPSAwOworCQkJYXNzb2NfYXJyYXlfc3VidHJlZV9pdGVyYXRlKGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5vZGUpLAorCQkJCQkJICAgIG5vZGUtPmJhY2tfcG9pbnRlciwKKwkJCQkJCSAgICBhc3NvY19hcnJheV9kZWxldGVfY29sbGFwc2VfaXRlcmF0b3IsCisJCQkJCQkgICAgJmNvbGxhcHNlKTsKKwkJCXByX2RldmVsKCJjb2xsYXBzZWQgJWQsJWx1XG4iLCBjb2xsYXBzZS5zbG90LCBuZXdfbjAtPm5yX2xlYXZlc19vbl9icmFuY2gpOworCQkJQlVHX09OKGNvbGxhcHNlLnNsb3QgIT0gbmV3X24wLT5ucl9sZWF2ZXNfb25fYnJhbmNoIC0gMSk7CisKKwkJCWlmICghbm9kZS0+YmFja19wb2ludGVyKSB7CisJCQkJZWRpdC0+c2V0WzFdLnB0ciA9ICZhcnJheS0+cm9vdDsKKwkJCX0gZWxzZSBpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX2xlYWYobm9kZS0+YmFja19wb2ludGVyKSkgeworCQkJCUJVRygpOworCQkJfSBlbHNlIGlmIChhc3NvY19hcnJheV9wdHJfaXNfbm9kZShub2RlLT5iYWNrX3BvaW50ZXIpKSB7CisJCQkJc3RydWN0IGFzc29jX2FycmF5X25vZGUgKnAgPQorCQkJCQlhc3NvY19hcnJheV9wdHJfdG9fbm9kZShub2RlLT5iYWNrX3BvaW50ZXIpOworCQkJCWVkaXQtPnNldFsxXS5wdHIgPSAmcC0+c2xvdHNbbm9kZS0+cGFyZW50X3Nsb3RdOworCQkJfSBlbHNlIGlmIChhc3NvY19hcnJheV9wdHJfaXNfc2hvcnRjdXQobm9kZS0+YmFja19wb2ludGVyKSkgeworCQkJCXN0cnVjdCBhc3NvY19hcnJheV9zaG9ydGN1dCAqcyA9CisJCQkJCWFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChub2RlLT5iYWNrX3BvaW50ZXIpOworCQkJCWVkaXQtPnNldFsxXS5wdHIgPSAmcy0+bmV4dF9ub2RlOworCQkJfQorCQkJZWRpdC0+c2V0WzFdLnRvID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24wKTsKKwkJCWVkaXQtPmV4Y2lzZWRfc3VidHJlZSA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5vZGUpOworCQl9CisJfQorCisJcmV0dXJuIGVkaXQ7CisKK2Vub21lbToKKwkvKiBDbGVhbiB1cCBhZnRlciBhbiBvdXQgb2YgbWVtb3J5IGVycm9yICovCisJcHJfZGV2ZWwoImVub21lbVxuIik7CisJYXNzb2NfYXJyYXlfY2FuY2VsX2VkaXQoZWRpdCk7CisJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Cit9CisKKy8qKgorICogYXNzb2NfYXJyYXlfY2xlYXIgLSBTY3JpcHQgZGVsZXRpb24gb2YgYWxsIG9iamVjdHMgZnJvbSBhbiBhc3NvY2lhdGl2ZSBhcnJheQorICogQGFycmF5OiBUaGUgYXJyYXkgdG8gY2xlYXIuCisgKiBAb3BzOiBUaGUgb3BlcmF0aW9ucyB0byB1c2UuCisgKgorICogUHJlY2FsY3VsYXRlIGFuZCBwcmVhbGxvY2F0ZSBhIHNjcmlwdCBmb3IgdGhlIGRlbGV0aW9uIG9mIGFsbCB0aGUgb2JqZWN0cworICogZnJvbSBhbiBhc3NvY2lhdGl2ZSBhcnJheS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBlZGl0IHNjcmlwdCB0aGF0IGNhbiBlaXRoZXIKKyAqIGJlIGFwcGxpZWQgb3IgY2FuY2VsbGVkLgorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhbiBlZGl0IHNjcmlwdCBpZiB0aGVyZSBhcmUgb2JqZWN0cyB0byBiZQorICogZGVsZXRlZCwgTlVMTCBpZiB0aGVyZSBhcmUgbm8gb2JqZWN0cyBpbiB0aGUgYXJyYXkgb3IgLUVOT01FTS4KKyAqCisgKiBUaGUgY2FsbGVyIHNob3VsZCBsb2NrIGFnYWluc3Qgb3RoZXIgbW9kaWZpY2F0aW9ucyBhbmQgbXVzdCBjb250aW51ZSB0byBob2xkCisgKiB0aGUgbG9jayB1bnRpbCBhc3NvY19hcnJheV9hcHBseV9lZGl0KCkgaGFzIGJlZW4gY2FsbGVkLgorICoKKyAqIEFjY2Vzc2VzIHRvIHRoZSB0cmVlIG1heSB0YWtlIHBsYWNlIGNvbmN1cnJlbnRseSB3aXRoIHRoaXMgZnVuY3Rpb24sCisgKiBwcm92aWRlZCB0aGV5IGhvbGQgdGhlIFJDVSByZWFkIGxvY2suCisgKi8KK3N0cnVjdCBhc3NvY19hcnJheV9lZGl0ICphc3NvY19hcnJheV9jbGVhcihzdHJ1Y3QgYXNzb2NfYXJyYXkgKmFycmF5LAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgYXNzb2NfYXJyYXlfb3BzICpvcHMpCit7CisJc3RydWN0IGFzc29jX2FycmF5X2VkaXQgKmVkaXQ7CisKKwlwcl9kZXZlbCgiLS0+JXMoKVxuIiwgX19mdW5jX18pOworCisJaWYgKCFhcnJheS0+cm9vdCkKKwkJcmV0dXJuIE5VTEw7CisKKwllZGl0ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFzc29jX2FycmF5X2VkaXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVkaXQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCWVkaXQtPmFycmF5ID0gYXJyYXk7CisJZWRpdC0+b3BzID0gb3BzOworCWVkaXQtPnNldFsxXS5wdHIgPSAmYXJyYXktPnJvb3Q7CisJZWRpdC0+c2V0WzFdLnRvID0gTlVMTDsKKwllZGl0LT5leGNpc2VkX3N1YnRyZWUgPSBhcnJheS0+cm9vdDsKKwllZGl0LT5vcHNfZm9yX2V4Y2lzZWRfc3VidHJlZSA9IG9wczsKKwlwcl9kZXZlbCgiYWxsIGdvbmVcbiIpOworCXJldHVybiBlZGl0OworfQorCisvKgorICogSGFuZGxlIHRoZSBkZWZlcnJlZCBkZXN0cnVjdGlvbiBhZnRlciBhbiBhcHBsaWVkIGVkaXQuCisgKi8KK3N0YXRpYyB2b2lkIGFzc29jX2FycmF5X3JjdV9jbGVhbnVwKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCAqZWRpdCA9CisJCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCwgcmN1KTsKKwlpbnQgaTsKKworCXByX2RldmVsKCItLT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZWRpdC0+ZGVhZF9sZWFmKQorCQllZGl0LT5vcHMtPmZyZWVfb2JqZWN0KGFzc29jX2FycmF5X3B0cl90b19sZWFmKGVkaXQtPmRlYWRfbGVhZikpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVkaXQtPmV4Y2lzZWRfbWV0YSk7IGkrKykKKwkJaWYgKGVkaXQtPmV4Y2lzZWRfbWV0YVtpXSkKKwkJCWtmcmVlKGFzc29jX2FycmF5X3B0cl90b19ub2RlKGVkaXQtPmV4Y2lzZWRfbWV0YVtpXSkpOworCisJaWYgKGVkaXQtPmV4Y2lzZWRfc3VidHJlZSkgeworCQlCVUdfT04oYXNzb2NfYXJyYXlfcHRyX2lzX2xlYWYoZWRpdC0+ZXhjaXNlZF9zdWJ0cmVlKSk7CisJCWlmIChhc3NvY19hcnJheV9wdHJfaXNfbm9kZShlZGl0LT5leGNpc2VkX3N1YnRyZWUpKSB7CisJCQlzdHJ1Y3QgYXNzb2NfYXJyYXlfbm9kZSAqbiA9CisJCQkJYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUoZWRpdC0+ZXhjaXNlZF9zdWJ0cmVlKTsKKwkJCW4tPmJhY2tfcG9pbnRlciA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQgKnMgPQorCQkJCWFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChlZGl0LT5leGNpc2VkX3N1YnRyZWUpOworCQkJcy0+YmFja19wb2ludGVyID0gTlVMTDsKKwkJfQorCQlhc3NvY19hcnJheV9kZXN0cm95X3N1YnRyZWUoZWRpdC0+ZXhjaXNlZF9zdWJ0cmVlLAorCQkJCQkgICAgZWRpdC0+b3BzX2Zvcl9leGNpc2VkX3N1YnRyZWUpOworCX0KKworCWtmcmVlKGVkaXQpOworfQorCisvKioKKyAqIGFzc29jX2FycmF5X2FwcGx5X2VkaXQgLSBBcHBseSBhbiBlZGl0IHNjcmlwdCB0byBhbiBhc3NvY2lhdGl2ZSBhcnJheQorICogQGVkaXQ6IFRoZSBzY3JpcHQgdG8gYXBwbHkuCisgKgorICogQXBwbHkgYW4gZWRpdCBzY3JpcHQgdG8gYW4gYXNzb2NpYXRpdmUgYXJyYXkgdG8gZWZmZWN0IGFuIGluc2VydGlvbiwKKyAqIGRlbGV0aW9uIG9yIGNsZWFyYW5jZS4gIEFzIHRoZSBlZGl0IHNjcmlwdCBpbmNsdWRlcyBwcmVhbGxvY2F0ZWQgbWVtb3J5LAorICogdGhpcyBpcyBndWFyYW50ZWVkIG5vdCB0byBmYWlsLgorICoKKyAqIFRoZSBlZGl0IHNjcmlwdCwgZGVhZCBvYmplY3RzIGFuZCBkZWFkIG1ldGFkYXRhIHdpbGwgYmUgc2NoZWR1bGVkIGZvcgorICogZGVzdHJ1Y3Rpb24gYWZ0ZXIgYW4gUkNVIGdyYWNlIHBlcmlvZCB0byBwZXJtaXQgdGhvc2UgZG9pbmcgcmVhZC1vbmx5CisgKiBhY2Nlc3NlcyBvbiB0aGUgYXJyYXkgdG8gY29udGludWUgdG8gZG8gc28gdW5kZXIgdGhlIFJDVSByZWFkIGxvY2sgd2hpbHN0CisgKiB0aGUgZWRpdCBpcyB0YWtpbmcgcGxhY2UuCisgKi8KK3ZvaWQgYXNzb2NfYXJyYXlfYXBwbHlfZWRpdChzdHJ1Y3QgYXNzb2NfYXJyYXlfZWRpdCAqZWRpdCkKK3sKKwlzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQgKnNob3J0Y3V0OworCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpub2RlOworCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnB0cjsKKwlpbnQgaTsKKworCXByX2RldmVsKCItLT4lcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlzbXBfd21iKCk7CisJaWYgKGVkaXQtPmxlYWZfcCkKKwkJKmVkaXQtPmxlYWZfcCA9IGVkaXQtPmxlYWY7CisKKwlzbXBfd21iKCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWRpdC0+c2V0X3BhcmVudF9zbG90KTsgaSsrKQorCQlpZiAoZWRpdC0+c2V0X3BhcmVudF9zbG90W2ldLnApCisJCQkqZWRpdC0+c2V0X3BhcmVudF9zbG90W2ldLnAgPSBlZGl0LT5zZXRfcGFyZW50X3Nsb3RbaV0udG87CisKKwlzbXBfd21iKCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWRpdC0+c2V0X2JhY2twb2ludGVycyk7IGkrKykKKwkJaWYgKGVkaXQtPnNldF9iYWNrcG9pbnRlcnNbaV0pCisJCQkqZWRpdC0+c2V0X2JhY2twb2ludGVyc1tpXSA9IGVkaXQtPnNldF9iYWNrcG9pbnRlcnNfdG87CisKKwlzbXBfd21iKCk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZWRpdC0+c2V0KTsgaSsrKQorCQlpZiAoZWRpdC0+c2V0W2ldLnB0cikKKwkJCSplZGl0LT5zZXRbaV0ucHRyID0gZWRpdC0+c2V0W2ldLnRvOworCisJaWYgKGVkaXQtPmFycmF5LT5yb290ID09IE5VTEwpIHsKKwkJZWRpdC0+YXJyYXktPm5yX2xlYXZlc19vbl90cmVlID0gMDsKKwl9IGVsc2UgaWYgKGVkaXQtPmFkanVzdF9jb3VudF9vbikgeworCQlub2RlID0gZWRpdC0+YWRqdXN0X2NvdW50X29uOworCQlmb3IgKDs7KSB7CisJCQlub2RlLT5ucl9sZWF2ZXNfb25fYnJhbmNoICs9IGVkaXQtPmFkanVzdF9jb3VudF9ieTsKKworCQkJcHRyID0gbm9kZS0+YmFja19wb2ludGVyOworCQkJaWYgKCFwdHIpCisJCQkJYnJlYWs7CisJCQlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KHB0cikpIHsKKwkJCQlzaG9ydGN1dCA9IGFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChwdHIpOworCQkJCXB0ciA9IHNob3J0Y3V0LT5iYWNrX3BvaW50ZXI7CisJCQkJaWYgKCFwdHIpCisJCQkJCWJyZWFrOworCQkJfQorCQkJQlVHX09OKCFhc3NvY19hcnJheV9wdHJfaXNfbm9kZShwdHIpKTsKKwkJCW5vZGUgPSBhc3NvY19hcnJheV9wdHJfdG9fbm9kZShwdHIpOworCQl9CisKKwkJZWRpdC0+YXJyYXktPm5yX2xlYXZlc19vbl90cmVlICs9IGVkaXQtPmFkanVzdF9jb3VudF9ieTsKKwl9CisKKwljYWxsX3JjdSgmZWRpdC0+cmN1LCBhc3NvY19hcnJheV9yY3VfY2xlYW51cCk7Cit9CisKKy8qKgorICogYXNzb2NfYXJyYXlfY2FuY2VsX2VkaXQgLSBEaXNjYXJkIGFuIGVkaXQgc2NyaXB0LgorICogQGVkaXQ6IFRoZSBzY3JpcHQgdG8gZGlzY2FyZC4KKyAqCisgKiBGcmVlIGFuIGVkaXQgc2NyaXB0IGFuZCBhbGwgdGhlIHByZWFsbG9jYXRlZCBkYXRhIGl0IGhvbGRzIHdpdGhvdXQgbWFraW5nCisgKiBhbnkgY2hhbmdlcyB0byB0aGUgYXNzb2NpYXRpdmUgYXJyYXkgaXQgd2FzIGludGVuZGVkIGZvci4KKyAqCisgKiBOT1RFISAgSW4gdGhlIGNhc2Ugb2YgYW4gaW5zZXJ0aW9uIHNjcmlwdCwgdGhpcyBkb2VzIF9ub3RfIHJlbGVhc2UgdGhlIGxlYWYKKyAqIHRoYXQgd2FzIHRvIGJlIGluc2VydGVkLiAgVGhhdCBpcyBsZWZ0IHRvIHRoZSBjYWxsZXIuCisgKi8KK3ZvaWQgYXNzb2NfYXJyYXlfY2FuY2VsX2VkaXQoc3RydWN0IGFzc29jX2FycmF5X2VkaXQgKmVkaXQpCit7CisJc3RydWN0IGFzc29jX2FycmF5X3B0ciAqcHRyOworCWludCBpOworCisJcHJfZGV2ZWwoIi0tPiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIENsZWFuIHVwIGFmdGVyIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlZGl0LT5uZXdfbWV0YSk7IGkrKykgeworCQlwdHIgPSBlZGl0LT5uZXdfbWV0YVtpXTsKKwkJaWYgKHB0cikgeworCQkJaWYgKGFzc29jX2FycmF5X3B0cl9pc19ub2RlKHB0cikpCisJCQkJa2ZyZWUoYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUocHRyKSk7CisJCQllbHNlCisJCQkJa2ZyZWUoYXNzb2NfYXJyYXlfcHRyX3RvX3Nob3J0Y3V0KHB0cikpOworCQl9CisJfQorCWtmcmVlKGVkaXQpOworfQorCisvKioKKyAqIGFzc29jX2FycmF5X2djIC0gR2FyYmFnZSBjb2xsZWN0IGFuIGFzc29jaWF0aXZlIGFycmF5LgorICogQGFycmF5OiBUaGUgYXJyYXkgdG8gY2xlYW4uCisgKiBAb3BzOiBUaGUgb3BlcmF0aW9ucyB0byB1c2UuCisgKiBAaXRlcmF0b3I6IEEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcGFzcyBqdWRnZW1lbnQgb24gZWFjaCBvYmplY3QuCisgKiBAaXRlcmF0b3JfZGF0YTogUHJpdmF0ZSBkYXRhIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgKgorICogQ29sbGVjdCBnYXJiYWdlIGZyb20gYW4gYXNzb2NpYXRpdmUgYXJyYXkgYW5kIHBhY2sgZG93biB0aGUgaW50ZXJuYWwgdHJlZSB0bworICogc2F2ZSBtZW1vcnkuCisgKgorICogVGhlIGl0ZXJhdG9yIGZ1bmN0aW9uIGlzIGFza2VkIHRvIHBhc3MganVkZ2VtZW50IHVwb24gZWFjaCBvYmplY3QgaW4gdGhlCisgKiBhcnJheS4gIElmIGl0IHJldHVybnMgZmFsc2UsIHRoZSBvYmplY3QgaXMgZGlzY2FyZCBhbmQgaWYgaXQgcmV0dXJucyB0cnVlLAorICogdGhlIG9iamVjdCBpcyBrZXB0LiAgSWYgaXQgcmV0dXJucyB0cnVlLCBpdCBtdXN0IGluY3JlbWVudCB0aGUgb2JqZWN0J3MKKyAqIHVzYWdlIGNvdW50IChvciB3aGF0ZXZlciBpdCBuZWVkcyB0byBkbyB0byByZXRhaW4gaXQpIGJlZm9yZSByZXR1cm5pbmcuCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCBvciAtRU5PTUVNIGlmIG91dCBvZiBtZW1vcnkuICBJbiB0aGUKKyAqIGxhdHRlciBjYXNlLCB0aGUgYXJyYXkgaXMgbm90IGNoYW5nZWQuCisgKgorICogVGhlIGNhbGxlciBzaG91bGQgbG9jayBhZ2FpbnN0IG90aGVyIG1vZGlmaWNhdGlvbnMgYW5kIG11c3QgY29udGludWUgdG8gaG9sZAorICogdGhlIGxvY2sgdW50aWwgYXNzb2NfYXJyYXlfYXBwbHlfZWRpdCgpIGhhcyBiZWVuIGNhbGxlZC4KKyAqCisgKiBBY2Nlc3NlcyB0byB0aGUgdHJlZSBtYXkgdGFrZSBwbGFjZSBjb25jdXJyZW50bHkgd2l0aCB0aGlzIGZ1bmN0aW9uLAorICogcHJvdmlkZWQgdGhleSBob2xkIHRoZSBSQ1UgcmVhZCBsb2NrLgorICovCitpbnQgYXNzb2NfYXJyYXlfZ2Moc3RydWN0IGFzc29jX2FycmF5ICphcnJheSwKKwkJICAgY29uc3Qgc3RydWN0IGFzc29jX2FycmF5X29wcyAqb3BzLAorCQkgICBib29sICgqaXRlcmF0b3IpKHZvaWQgKm9iamVjdCwgdm9pZCAqaXRlcmF0b3JfZGF0YSksCisJCSAgIHZvaWQgKml0ZXJhdG9yX2RhdGEpCit7CisJc3RydWN0IGFzc29jX2FycmF5X3Nob3J0Y3V0ICpzaG9ydGN1dCwgKm5ld19zOworCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpub2RlLCAqbmV3X247CisJc3RydWN0IGFzc29jX2FycmF5X2VkaXQgKmVkaXQ7CisJc3RydWN0IGFzc29jX2FycmF5X3B0ciAqY3Vyc29yLCAqcHRyOworCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKm5ld19yb290LCAqbmV3X3BhcmVudCwgKipuZXdfcHRyX3BwOworCXVuc2lnbmVkIGxvbmcgbnJfbGVhdmVzX29uX3RyZWU7CisJaW50IGtleWxlbiwgc2xvdCwgbnJfZnJlZSwgbmV4dF9zbG90LCBpOworCisJcHJfZGV2ZWwoIi0tPiVzKClcbiIsIF9fZnVuY19fKTsKKworCWlmICghYXJyYXktPnJvb3QpCisJCXJldHVybiAwOworCisJZWRpdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhc3NvY19hcnJheV9lZGl0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlZGl0KQorCQlyZXR1cm4gLUVOT01FTTsKKwllZGl0LT5hcnJheSA9IGFycmF5OworCWVkaXQtPm9wcyA9IG9wczsKKwllZGl0LT5vcHNfZm9yX2V4Y2lzZWRfc3VidHJlZSA9IG9wczsKKwllZGl0LT5zZXRbMF0ucHRyID0gJmFycmF5LT5yb290OworCWVkaXQtPmV4Y2lzZWRfc3VidHJlZSA9IGFycmF5LT5yb290OworCisJbmV3X3Jvb3QgPSBuZXdfcGFyZW50ID0gTlVMTDsKKwluZXdfcHRyX3BwID0gJm5ld19yb290OworCWN1cnNvciA9IGFycmF5LT5yb290OworCitkZXNjZW5kOgorCS8qIElmIHRoaXMgcG9pbnQgaXMgYSBzaG9ydGN1dCwgdGhlbiB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBpdCBhbmQKKwkgKiBhZHZhbmNlIHRoZSB0YXJnZXQgY3Vyc29yLgorCSAqLworCWlmIChhc3NvY19hcnJheV9wdHJfaXNfc2hvcnRjdXQoY3Vyc29yKSkgeworCQlzaG9ydGN1dCA9IGFzc29jX2FycmF5X3B0cl90b19zaG9ydGN1dChjdXJzb3IpOworCQlrZXlsZW4gPSByb3VuZF91cChzaG9ydGN1dC0+c2tpcF90b19sZXZlbCwgQVNTT0NfQVJSQVlfS0VZX0NIVU5LX1NJWkUpOworCQlrZXlsZW4gPj49IEFTU09DX0FSUkFZX0tFWV9DSFVOS19TSElGVDsKKwkJbmV3X3MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQpICsKKwkJCQlrZXlsZW4gKiBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCQlpZiAoIW5ld19zKQorCQkJZ290byBlbm9tZW07CisJCXByX2RldmVsKCJkdXAgc2hvcnRjdXQgJXAgLT4gJXBcbiIsIHNob3J0Y3V0LCBuZXdfcyk7CisJCW1lbWNweShuZXdfcywgc2hvcnRjdXQsIChzaXplb2Yoc3RydWN0IGFzc29jX2FycmF5X3Nob3J0Y3V0KSArCisJCQkJCSBrZXlsZW4gKiBzaXplb2YodW5zaWduZWQgbG9uZykpKTsKKwkJbmV3X3MtPmJhY2tfcG9pbnRlciA9IG5ld19wYXJlbnQ7CisJCW5ld19zLT5wYXJlbnRfc2xvdCA9IHNob3J0Y3V0LT5wYXJlbnRfc2xvdDsKKwkJKm5ld19wdHJfcHAgPSBuZXdfcGFyZW50ID0gYXNzb2NfYXJyYXlfc2hvcnRjdXRfdG9fcHRyKG5ld19zKTsKKwkJbmV3X3B0cl9wcCA9ICZuZXdfcy0+bmV4dF9ub2RlOworCQljdXJzb3IgPSBzaG9ydGN1dC0+bmV4dF9ub2RlOworCX0KKworCS8qIER1cGxpY2F0ZSB0aGUgbm9kZSBhdCB0aGlzIHBvc2l0aW9uICovCisJbm9kZSA9IGFzc29jX2FycmF5X3B0cl90b19ub2RlKGN1cnNvcik7CisJbmV3X24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXNzb2NfYXJyYXlfbm9kZSksIEdGUF9LRVJORUwpOworCWlmICghbmV3X24pCisJCWdvdG8gZW5vbWVtOworCXByX2RldmVsKCJkdXAgbm9kZSAlcCAtPiAlcFxuIiwgbm9kZSwgbmV3X24pOworCW5ld19uLT5iYWNrX3BvaW50ZXIgPSBuZXdfcGFyZW50OworCW5ld19uLT5wYXJlbnRfc2xvdCA9IG5vZGUtPnBhcmVudF9zbG90OworCSpuZXdfcHRyX3BwID0gbmV3X3BhcmVudCA9IGFzc29jX2FycmF5X25vZGVfdG9fcHRyKG5ld19uKTsKKwluZXdfcHRyX3BwID0gTlVMTDsKKwlzbG90ID0gMDsKKworY29udGludWVfbm9kZToKKwkvKiBGaWx0ZXIgYWNyb3NzIGFueSBsZWF2ZXMgYW5kIGdjIGFueSBzdWJ0cmVlcyAqLworCWZvciAoOyBzbG90IDwgQVNTT0NfQVJSQVlfRkFOX09VVDsgc2xvdCsrKSB7CisJCXB0ciA9IG5vZGUtPnNsb3RzW3Nsb3RdOworCQlpZiAoIXB0cikKKwkJCWNvbnRpbnVlOworCisJCWlmIChhc3NvY19hcnJheV9wdHJfaXNfbGVhZihwdHIpKSB7CisJCQlpZiAoaXRlcmF0b3IoYXNzb2NfYXJyYXlfcHRyX3RvX2xlYWYocHRyKSwKKwkJCQkgICAgIGl0ZXJhdG9yX2RhdGEpKQorCQkJCS8qIFRoZSBpdGVyYXRvciB3aWxsIGhhdmUgZG9uZSBhbnkgcmVmZXJlbmNlCisJCQkJICogY291bnRpbmcgb24gdGhlIG9iamVjdCBmb3IgdXMuCisJCQkJICovCisJCQkJbmV3X24tPnNsb3RzW3Nsb3RdID0gcHRyOworCQkJY29udGludWU7CisJCX0KKworCQluZXdfcHRyX3BwID0gJm5ld19uLT5zbG90c1tzbG90XTsKKwkJY3Vyc29yID0gcHRyOworCQlnb3RvIGRlc2NlbmQ7CisJfQorCisJcHJfZGV2ZWwoIi0tIGNvbXByZXNzIG5vZGUgJXAgLS1cbiIsIG5ld19uKTsKKworCS8qIENvdW50IHVwIHRoZSBudW1iZXIgb2YgZW1wdHkgc2xvdHMgaW4gdGhpcyBub2RlIGFuZCB3b3JrIG91dCB0aGUKKwkgKiBzdWJ0cmVlIGxlYWYgY291bnQuCisJICovCisJbmV3X24tPm5yX2xlYXZlc19vbl9icmFuY2ggPSAwOworCW5yX2ZyZWUgPSAwOworCWZvciAoc2xvdCA9IDA7IHNsb3QgPCBBU1NPQ19BUlJBWV9GQU5fT1VUOyBzbG90KyspIHsKKwkJcHRyID0gbmV3X24tPnNsb3RzW3Nsb3RdOworCQlpZiAoIXB0cikKKwkJCW5yX2ZyZWUrKzsKKwkJZWxzZSBpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX2xlYWYocHRyKSkKKwkJCW5ld19uLT5ucl9sZWF2ZXNfb25fYnJhbmNoKys7CisJfQorCXByX2RldmVsKCJmcmVlPSVkLCBsZWF2ZXM9JWx1XG4iLCBucl9mcmVlLCBuZXdfbi0+bnJfbGVhdmVzX29uX2JyYW5jaCk7CisKKwkvKiBTZWUgd2hhdCB3ZSBjYW4gZm9sZCBpbiAqLworCW5leHRfc2xvdCA9IDA7CisJZm9yIChzbG90ID0gMDsgc2xvdCA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IHNsb3QrKykgeworCQlzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQgKnM7CisJCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpjaGlsZDsKKworCQlwdHIgPSBuZXdfbi0+c2xvdHNbc2xvdF07CisJCWlmICghcHRyIHx8IGFzc29jX2FycmF5X3B0cl9pc19sZWFmKHB0cikpCisJCQljb250aW51ZTsKKworCQlzID0gTlVMTDsKKwkJaWYgKGFzc29jX2FycmF5X3B0cl9pc19zaG9ydGN1dChwdHIpKSB7CisJCQlzID0gYXNzb2NfYXJyYXlfcHRyX3RvX3Nob3J0Y3V0KHB0cik7CisJCQlwdHIgPSBzLT5uZXh0X25vZGU7CisJCX0KKworCQljaGlsZCA9IGFzc29jX2FycmF5X3B0cl90b19ub2RlKHB0cik7CisJCW5ld19uLT5ucl9sZWF2ZXNfb25fYnJhbmNoICs9IGNoaWxkLT5ucl9sZWF2ZXNfb25fYnJhbmNoOworCisJCWlmIChjaGlsZC0+bnJfbGVhdmVzX29uX2JyYW5jaCA8PSBucl9mcmVlICsgMSkgeworCQkJLyogRm9sZCB0aGUgY2hpbGQgbm9kZSBpbnRvIHRoaXMgb25lICovCisJCQlwcl9kZXZlbCgiWyVkXSBmb2xkIG5vZGUgJWx1LyVkIFtueCAlZF1cbiIsCisJCQkJIHNsb3QsIGNoaWxkLT5ucl9sZWF2ZXNfb25fYnJhbmNoLCBucl9mcmVlICsgMSwKKwkJCQkgbmV4dF9zbG90KTsKKworCQkJLyogV2Ugd291bGQgYWxyZWFkeSBoYXZlIHJlYXBlZCBhbiBpbnRlcnZlbmluZyBzaG9ydGN1dAorCQkJICogb24gdGhlIHdheSBiYWNrIHVwIHRoZSB0cmVlLgorCQkJICovCisJCQlCVUdfT04ocyk7CisKKwkJCW5ld19uLT5zbG90c1tzbG90XSA9IE5VTEw7CisJCQlucl9mcmVlKys7CisJCQlpZiAoc2xvdCA8IG5leHRfc2xvdCkKKwkJCQluZXh0X3Nsb3QgPSBzbG90OworCQkJZm9yIChpID0gMDsgaSA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IGkrKykgeworCQkJCXN0cnVjdCBhc3NvY19hcnJheV9wdHIgKnAgPSBjaGlsZC0+c2xvdHNbaV07CisJCQkJaWYgKCFwKQorCQkJCQljb250aW51ZTsKKwkJCQlCVUdfT04oYXNzb2NfYXJyYXlfcHRyX2lzX21ldGEocCkpOworCQkJCXdoaWxlIChuZXdfbi0+c2xvdHNbbmV4dF9zbG90XSkKKwkJCQkJbmV4dF9zbG90Kys7CisJCQkJQlVHX09OKG5leHRfc2xvdCA+PSBBU1NPQ19BUlJBWV9GQU5fT1VUKTsKKwkJCQluZXdfbi0+c2xvdHNbbmV4dF9zbG90KytdID0gcDsKKwkJCQlucl9mcmVlLS07CisJCQl9CisJCQlrZnJlZShjaGlsZCk7CisJCX0gZWxzZSB7CisJCQlwcl9kZXZlbCgiWyVkXSByZXRhaW4gbm9kZSAlbHUvJWQgW254ICVkXVxuIiwKKwkJCQkgc2xvdCwgY2hpbGQtPm5yX2xlYXZlc19vbl9icmFuY2gsIG5yX2ZyZWUgKyAxLAorCQkJCSBuZXh0X3Nsb3QpOworCQl9CisJfQorCisJcHJfZGV2ZWwoImFmdGVyOiAlbHVcbiIsIG5ld19uLT5ucl9sZWF2ZXNfb25fYnJhbmNoKTsKKworCW5yX2xlYXZlc19vbl90cmVlID0gbmV3X24tPm5yX2xlYXZlc19vbl9icmFuY2g7CisKKwkvKiBFeGNpc2UgdGhpcyBub2RlIGlmIGl0IGlzIHNpbmdseSBvY2N1cGllZCBieSBhIHNob3J0Y3V0ICovCisJaWYgKG5yX2ZyZWUgPT0gQVNTT0NfQVJSQVlfRkFOX09VVCAtIDEpIHsKKwkJZm9yIChzbG90ID0gMDsgc2xvdCA8IEFTU09DX0FSUkFZX0ZBTl9PVVQ7IHNsb3QrKykKKwkJCWlmICgocHRyID0gbmV3X24tPnNsb3RzW3Nsb3RdKSkKKwkJCQlicmVhazsKKworCQlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX21ldGEocHRyKSAmJgorCQkgICAgYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KHB0cikpIHsKKwkJCXByX2RldmVsKCJleGNpc2Ugbm9kZSAlcCB3aXRoIDEgc2hvcnRjdXRcbiIsIG5ld19uKTsKKwkJCW5ld19zID0gYXNzb2NfYXJyYXlfcHRyX3RvX3Nob3J0Y3V0KHB0cik7CisJCQluZXdfcGFyZW50ID0gbmV3X24tPmJhY2tfcG9pbnRlcjsKKwkJCXNsb3QgPSBuZXdfbi0+cGFyZW50X3Nsb3Q7CisJCQlrZnJlZShuZXdfbik7CisJCQlpZiAoIW5ld19wYXJlbnQpIHsKKwkJCQluZXdfcy0+YmFja19wb2ludGVyID0gTlVMTDsKKwkJCQluZXdfcy0+cGFyZW50X3Nsb3QgPSAwOworCQkJCW5ld19yb290ID0gcHRyOworCQkJCWdvdG8gZ2NfY29tcGxldGU7CisJCQl9CisKKwkJCWlmIChhc3NvY19hcnJheV9wdHJfaXNfc2hvcnRjdXQobmV3X3BhcmVudCkpIHsKKwkJCQkvKiBXZSBjYW4gZGlzY2FyZCBhbnkgcHJlY2VkaW5nIHNob3J0Y3V0IGFsc28gKi8KKwkJCQlzdHJ1Y3QgYXNzb2NfYXJyYXlfc2hvcnRjdXQgKnMgPQorCQkJCQlhc3NvY19hcnJheV9wdHJfdG9fc2hvcnRjdXQobmV3X3BhcmVudCk7CisKKwkJCQlwcl9kZXZlbCgiZXhjaXNlIHByZWNlZGluZyBzaG9ydGN1dFxuIik7CisKKwkJCQluZXdfcGFyZW50ID0gbmV3X3MtPmJhY2tfcG9pbnRlciA9IHMtPmJhY2tfcG9pbnRlcjsKKwkJCQlzbG90ID0gbmV3X3MtPnBhcmVudF9zbG90ID0gcy0+cGFyZW50X3Nsb3Q7CisJCQkJa2ZyZWUocyk7CisJCQkJaWYgKCFuZXdfcGFyZW50KSB7CisJCQkJCW5ld19zLT5iYWNrX3BvaW50ZXIgPSBOVUxMOworCQkJCQluZXdfcy0+cGFyZW50X3Nsb3QgPSAwOworCQkJCQluZXdfcm9vdCA9IHB0cjsKKwkJCQkJZ290byBnY19jb21wbGV0ZTsKKwkJCQl9CisJCQl9CisKKwkJCW5ld19zLT5iYWNrX3BvaW50ZXIgPSBuZXdfcGFyZW50OworCQkJbmV3X3MtPnBhcmVudF9zbG90ID0gc2xvdDsKKwkJCW5ld19uID0gYXNzb2NfYXJyYXlfcHRyX3RvX25vZGUobmV3X3BhcmVudCk7CisJCQluZXdfbi0+c2xvdHNbc2xvdF0gPSBwdHI7CisJCQlnb3RvIGFzY2VuZF9vbGRfdHJlZTsKKwkJfQorCX0KKworCS8qIEV4Y2lzZSBhbnkgc2hvcnRjdXRzIHdlIG1pZ2h0IGVuY291bnRlciB0aGF0IHBvaW50IHRvIG5vZGVzIHRoYXQKKwkgKiBvbmx5IGNvbnRhaW4gbGVhdmVzLgorCSAqLworCXB0ciA9IG5ld19uLT5iYWNrX3BvaW50ZXI7CisJaWYgKCFwdHIpCisJCWdvdG8gZ2NfY29tcGxldGU7CisKKwlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KHB0cikpIHsKKwkJbmV3X3MgPSBhc3NvY19hcnJheV9wdHJfdG9fc2hvcnRjdXQocHRyKTsKKwkJbmV3X3BhcmVudCA9IG5ld19zLT5iYWNrX3BvaW50ZXI7CisJCXNsb3QgPSBuZXdfcy0+cGFyZW50X3Nsb3Q7CisKKwkJaWYgKG5ld19uLT5ucl9sZWF2ZXNfb25fYnJhbmNoIDw9IEFTU09DX0FSUkFZX0ZBTl9PVVQpIHsKKwkJCXN0cnVjdCBhc3NvY19hcnJheV9ub2RlICpuOworCisJCQlwcl9kZXZlbCgiZXhjaXNlIHNob3J0Y3V0XG4iKTsKKwkJCW5ld19uLT5iYWNrX3BvaW50ZXIgPSBuZXdfcGFyZW50OworCQkJbmV3X24tPnBhcmVudF9zbG90ID0gc2xvdDsKKwkJCWtmcmVlKG5ld19zKTsKKwkJCWlmICghbmV3X3BhcmVudCkgeworCQkJCW5ld19yb290ID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24pOworCQkJCWdvdG8gZ2NfY29tcGxldGU7CisJCQl9CisKKwkJCW4gPSBhc3NvY19hcnJheV9wdHJfdG9fbm9kZShuZXdfcGFyZW50KTsKKwkJCW4tPnNsb3RzW3Nsb3RdID0gYXNzb2NfYXJyYXlfbm9kZV90b19wdHIobmV3X24pOworCQl9CisJfSBlbHNlIHsKKwkJbmV3X3BhcmVudCA9IHB0cjsKKwl9CisJbmV3X24gPSBhc3NvY19hcnJheV9wdHJfdG9fbm9kZShuZXdfcGFyZW50KTsKKworYXNjZW5kX29sZF90cmVlOgorCXB0ciA9IG5vZGUtPmJhY2tfcG9pbnRlcjsKKwlpZiAoYXNzb2NfYXJyYXlfcHRyX2lzX3Nob3J0Y3V0KHB0cikpIHsKKwkJc2hvcnRjdXQgPSBhc3NvY19hcnJheV9wdHJfdG9fc2hvcnRjdXQocHRyKTsKKwkJc2xvdCA9IHNob3J0Y3V0LT5wYXJlbnRfc2xvdDsKKwkJY3Vyc29yID0gc2hvcnRjdXQtPmJhY2tfcG9pbnRlcjsKKwkJaWYgKCFjdXJzb3IpCisJCQlnb3RvIGdjX2NvbXBsZXRlOworCX0gZWxzZSB7CisJCXNsb3QgPSBub2RlLT5wYXJlbnRfc2xvdDsKKwkJY3Vyc29yID0gcHRyOworCX0KKwlCVUdfT04oIWN1cnNvcik7CisJbm9kZSA9IGFzc29jX2FycmF5X3B0cl90b19ub2RlKGN1cnNvcik7CisJc2xvdCsrOworCWdvdG8gY29udGludWVfbm9kZTsKKworZ2NfY29tcGxldGU6CisJZWRpdC0+c2V0WzBdLnRvID0gbmV3X3Jvb3Q7CisJYXNzb2NfYXJyYXlfYXBwbHlfZWRpdChlZGl0KTsKKwlhcnJheS0+bnJfbGVhdmVzX29uX3RyZWUgPSBucl9sZWF2ZXNfb25fdHJlZTsKKwlyZXR1cm4gMDsKKworZW5vbWVtOgorCXByX2RldmVsKCJlbm9tZW1cbiIpOworCWFzc29jX2FycmF5X2Rlc3Ryb3lfc3VidHJlZShuZXdfcm9vdCwgZWRpdC0+b3BzKTsKKwlrZnJlZShlZGl0KTsKKwlyZXR1cm4gLUVOT01FTTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2F0b21pYzY0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hdG9taWM2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYzJkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hdG9taWM2NC5jCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiA2NC1iaXQgYXRvbWljcyB1c2luZyBzcGlubG9ja3MsCisgKiB1c2VmdWwgb24gcHJvY2Vzc29ycyB0aGF0IGRvbid0IGhhdmUgNjQtYml0IGF0b21pYyBpbnN0cnVjdGlvbnMuCisgKgorICogQ29weXJpZ2h0IMKpIDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQGF1MS5pYm0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKKy8qCisgKiBXZSB1c2UgYSBoYXNoZWQgYXJyYXkgb2Ygc3BpbmxvY2tzIHRvIHByb3ZpZGUgZXhjbHVzaXZlIGFjY2VzcworICogdG8gZWFjaCBhdG9taWM2NF90IHZhcmlhYmxlLiAgU2luY2UgdGhpcyBpcyBleHBlY3RlZCB0byB1c2VkIG9uCisgKiBzeXN0ZW1zIHdpdGggc21hbGwgbnVtYmVycyBvZiBDUFVzICg8PSA0IG9yIHNvKSwgd2UgdXNlIGEKKyAqIHJlbGF0aXZlbHkgc21hbGwgYXJyYXkgb2YgMTYgc3BpbmxvY2tzIHRvIGF2b2lkIHdhc3RpbmcgdG9vIG11Y2gKKyAqIG1lbW9yeSBvbiB0aGUgc3BpbmxvY2sgYXJyYXkuCisgKi8KKyNkZWZpbmUgTlJfTE9DS1MJMTYKKworLyoKKyAqIEVuc3VyZSBlYWNoIGxvY2sgaXMgaW4gYSBzZXBhcmF0ZSBjYWNoZWxpbmUuCisgKi8KK3N0YXRpYyB1bmlvbiB7CisJcmF3X3NwaW5sb2NrX3QgbG9jazsKKwljaGFyIHBhZFtMMV9DQUNIRV9CWVRFU107Cit9IGF0b21pYzY0X2xvY2tbTlJfTE9DS1NdIF9fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wID0geworCVswIC4uLiAoTlJfTE9DS1MgLSAxKV0gPSB7CisJCS5sb2NrID0gIF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRChhdG9taWM2NF9sb2NrLmxvY2spLAorCX0sCit9OworCitzdGF0aWMgaW5saW5lIHJhd19zcGlubG9ja190ICpsb2NrX2FkZHIoY29uc3QgYXRvbWljNjRfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZykgdjsKKworCWFkZHIgPj49IEwxX0NBQ0hFX1NISUZUOworCWFkZHIgXj0gKGFkZHIgPj4gOCkgXiAoYWRkciA+PiAxNik7CisJcmV0dXJuICZhdG9taWM2NF9sb2NrW2FkZHIgJiAoTlJfTE9DS1MgLSAxKV0ubG9jazsKK30KKworbG9uZyBsb25nIGF0b21pYzY0X3JlYWQoY29uc3QgYXRvbWljNjRfdCAqdikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJhd19zcGlubG9ja190ICpsb2NrID0gbG9ja19hZGRyKHYpOworCWxvbmcgbG9uZyB2YWw7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCXZhbCA9IHYtPmNvdW50ZXI7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X3JlYWQpOworCit2b2lkIGF0b21pYzY0X3NldChhdG9taWM2NF90ICp2LCBsb25nIGxvbmcgaSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJhd19zcGlubG9ja190ICpsb2NrID0gbG9ja19hZGRyKHYpOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwl2LT5jb3VudGVyID0gaTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X3NldCk7CisKKyNkZWZpbmUgQVRPTUlDNjRfT1Aob3AsIGNfb3ApCQkJCQkJXAordm9pZCBhdG9taWM2NF8jI29wKGxvbmcgbG9uZyBhLCBhdG9taWM2NF90ICp2KQkJCQlcCit7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAorCXJhd19zcGlubG9ja190ICpsb2NrID0gbG9ja19hZGRyKHYpOwkJCQlcCisJCQkJCQkJCQlcCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsJCQkJXAorCXYtPmNvdW50ZXIgY19vcCBhOwkJCQkJCVwKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CQkJXAorfQkJCQkJCQkJCVwKK0VYUE9SVF9TWU1CT0woYXRvbWljNjRfIyNvcCk7CisKKyNkZWZpbmUgQVRPTUlDNjRfT1BfUkVUVVJOKG9wLCBjX29wKQkJCQkJXAorbG9uZyBsb25nIGF0b21pYzY0XyMjb3AjI19yZXR1cm4obG9uZyBsb25nIGEsIGF0b21pYzY0X3QgKnYpCQlcCit7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkJCQkJXAorCXJhd19zcGlubG9ja190ICpsb2NrID0gbG9ja19hZGRyKHYpOwkJCQlcCisJbG9uZyBsb25nIHZhbDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJhd19zcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CQkJCVwKKwl2YWwgPSAodi0+Y291bnRlciBjX29wIGEpOwkJCQkJXAorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsJCQlcCisJcmV0dXJuIHZhbDsJCQkJCQkJXAorfQkJCQkJCQkJCVwKK0VYUE9SVF9TWU1CT0woYXRvbWljNjRfIyNvcCMjX3JldHVybik7CisKKyNkZWZpbmUgQVRPTUlDNjRfRkVUQ0hfT1Aob3AsIGNfb3ApCQkJCQlcCitsb25nIGxvbmcgYXRvbWljNjRfZmV0Y2hfIyNvcChsb25nIGxvbmcgYSwgYXRvbWljNjRfdCAqdikJCVwKK3sJCQkJCQkJCQlcCisJdW5zaWduZWQgbG9uZyBmbGFnczsJCQkJCQlcCisJcmF3X3NwaW5sb2NrX3QgKmxvY2sgPSBsb2NrX2FkZHIodik7CQkJCVwKKwlsb25nIGxvbmcgdmFsOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsJCQkJXAorCXZhbCA9IHYtPmNvdW50ZXI7CQkJCQkJXAorCXYtPmNvdW50ZXIgY19vcCBhOwkJCQkJCVwKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CQkJXAorCXJldHVybiB2YWw7CQkJCQkJCVwKK30JCQkJCQkJCQlcCitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X2ZldGNoXyMjb3ApOworCisjZGVmaW5lIEFUT01JQzY0X09QUyhvcCwgY19vcCkJCQkJCQlcCisJQVRPTUlDNjRfT1Aob3AsIGNfb3ApCQkJCQkJXAorCUFUT01JQzY0X09QX1JFVFVSTihvcCwgY19vcCkJCQkJCVwKKwlBVE9NSUM2NF9GRVRDSF9PUChvcCwgY19vcCkKKworQVRPTUlDNjRfT1BTKGFkZCwgKz0pCitBVE9NSUM2NF9PUFMoc3ViLCAtPSkKKworI3VuZGVmIEFUT01JQzY0X09QUworI2RlZmluZSBBVE9NSUM2NF9PUFMob3AsIGNfb3ApCQkJCQkJXAorCUFUT01JQzY0X09QKG9wLCBjX29wKQkJCQkJCVwKKwlBVE9NSUM2NF9PUF9SRVRVUk4ob3AsIGNfb3ApCQkJCQlcCisJQVRPTUlDNjRfRkVUQ0hfT1Aob3AsIGNfb3ApCisKK0FUT01JQzY0X09QUyhhbmQsICY9KQorQVRPTUlDNjRfT1BTKG9yLCB8PSkKK0FUT01JQzY0X09QUyh4b3IsIF49KQorCisjdW5kZWYgQVRPTUlDNjRfT1BTCisjdW5kZWYgQVRPTUlDNjRfRkVUQ0hfT1AKKyN1bmRlZiBBVE9NSUM2NF9PUF9SRVRVUk4KKyN1bmRlZiBBVE9NSUM2NF9PUAorCitsb25nIGxvbmcgYXRvbWljNjRfZGVjX2lmX3Bvc2l0aXZlKGF0b21pYzY0X3QgKnYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyYXdfc3BpbmxvY2tfdCAqbG9jayA9IGxvY2tfYWRkcih2KTsKKwlsb25nIGxvbmcgdmFsOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwl2YWwgPSB2LT5jb3VudGVyIC0gMTsKKwlpZiAodmFsID49IDApCisJCXYtPmNvdW50ZXIgPSB2YWw7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZSk7CisKK2xvbmcgbG9uZyBhdG9taWM2NF9jbXB4Y2hnKGF0b21pYzY0X3QgKnYsIGxvbmcgbG9uZyBvLCBsb25nIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXJhd19zcGlubG9ja190ICpsb2NrID0gbG9ja19hZGRyKHYpOworCWxvbmcgbG9uZyB2YWw7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUobG9jaywgZmxhZ3MpOworCXZhbCA9IHYtPmNvdW50ZXI7CisJaWYgKHZhbCA9PSBvKQorCQl2LT5jb3VudGVyID0gbjsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShsb2NrLCBmbGFncyk7CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0woYXRvbWljNjRfY21weGNoZyk7CisKK2xvbmcgbG9uZyBhdG9taWM2NF94Y2hnKGF0b21pYzY0X3QgKnYsIGxvbmcgbG9uZyBuZXcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyYXdfc3BpbmxvY2tfdCAqbG9jayA9IGxvY2tfYWRkcih2KTsKKwlsb25nIGxvbmcgdmFsOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKGxvY2ssIGZsYWdzKTsKKwl2YWwgPSB2LT5jb3VudGVyOworCXYtPmNvdW50ZXIgPSBuZXc7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUobG9jaywgZmxhZ3MpOworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGF0b21pYzY0X3hjaGcpOworCitpbnQgYXRvbWljNjRfYWRkX3VubGVzcyhhdG9taWM2NF90ICp2LCBsb25nIGxvbmcgYSwgbG9uZyBsb25nIHUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlyYXdfc3BpbmxvY2tfdCAqbG9jayA9IGxvY2tfYWRkcih2KTsKKwlpbnQgcmV0ID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CisJaWYgKHYtPmNvdW50ZXIgIT0gdSkgeworCQl2LT5jb3VudGVyICs9IGE7CisJCXJldCA9IDE7CisJfQorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChhdG9taWM2NF9hZGRfdW5sZXNzKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2F0b21pYzY0X3Rlc3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2F0b21pYzY0X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFiNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYXRvbWljNjRfdGVzdC5jCkBAIC0wLDAgKzEsMjgwIEBACisvKgorICogVGVzdHN1aXRlIGZvciBhdG9taWM2NF90IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCDCqSAyMDEwICBMdWNhIEJhcmJpZXJpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2CisjaW5jbHVkZSA8YXNtL2NwdWZlYXR1cmUuaD4JLyogZm9yIGJvb3RfY3B1X2hhcyBiZWxvdyAqLworI2VuZGlmCisKKyNkZWZpbmUgVEVTVChiaXQsIG9wLCBjX29wLCB2YWwpCQkJCVwKK2RvIHsJCQkJCQkJCVwKKwlhdG9taWMjI2JpdCMjX3NldCgmdiwgdjApOwkJCQlcCisJciA9IHYwOwkJCQkJCQlcCisJYXRvbWljIyNiaXQjI18jI29wKHZhbCwgJnYpOwkJCQlcCisJciBjX29wIHZhbDsJCQkJCQlcCisJV0FSTihhdG9taWMjI2JpdCMjX3JlYWQoJnYpICE9IHIsICIlTHggIT0gJUx4XG4iLAlcCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYXRvbWljIyNiaXQjI19yZWFkKCZ2KSwJXAorCQkodW5zaWduZWQgbG9uZyBsb25nKXIpOwkJCQlcCit9IHdoaWxlICgwKQorCisvKgorICogVGVzdCBmb3IgYSBhdG9taWMgb3BlcmF0aW9uIGZhbWlseSwKKyAqIEB0ZXN0IHNob3VsZCBiZSBhIG1hY3JvIGFjY2VwdGluZyBwYXJhbWV0ZXJzIChiaXQsIG9wLCAuLi4pCisgKi8KKworI2RlZmluZSBGQU1JTFlfVEVTVCh0ZXN0LCBiaXQsIG9wLCBhcmdzLi4uKQlcCitkbyB7CQkJCQkJXAorCXRlc3QoYml0LCBvcCwgIyNhcmdzKTsJCVwKKwl0ZXN0KGJpdCwgb3AjI19hY3F1aXJlLCAjI2FyZ3MpOwlcCisJdGVzdChiaXQsIG9wIyNfcmVsZWFzZSwgIyNhcmdzKTsJXAorCXRlc3QoYml0LCBvcCMjX3JlbGF4ZWQsICMjYXJncyk7CVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVEVTVF9SRVRVUk4oYml0LCBvcCwgY19vcCwgdmFsKQkJCQlcCitkbyB7CQkJCQkJCQlcCisJYXRvbWljIyNiaXQjI19zZXQoJnYsIHYwKTsJCQkJXAorCXIgPSB2MDsJCQkJCQkJXAorCXIgY19vcCB2YWw7CQkJCQkJXAorCUJVR19PTihhdG9taWMjI2JpdCMjXyMjb3AodmFsLCAmdikgIT0gcik7CQlcCisJQlVHX09OKGF0b21pYyMjYml0IyNfcmVhZCgmdikgIT0gcik7CQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX0ZFVENIKGJpdCwgb3AsIGNfb3AsIHZhbCkJCQkJXAorZG8gewkJCQkJCQkJXAorCWF0b21pYyMjYml0IyNfc2V0KCZ2LCB2MCk7CQkJCVwKKwlyID0gdjA7CQkJCQkJCVwKKwlyIGNfb3AgdmFsOwkJCQkJCVwKKwlCVUdfT04oYXRvbWljIyNiaXQjI18jI29wKHZhbCwgJnYpICE9IHYwKTsJCVwKKwlCVUdfT04oYXRvbWljIyNiaXQjI19yZWFkKCZ2KSAhPSByKTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFJFVFVSTl9GQU1JTFlfVEVTVChiaXQsIG9wLCBjX29wLCB2YWwpCQkJXAorZG8gewkJCQkJCQkJXAorCUZBTUlMWV9URVNUKFRFU1RfUkVUVVJOLCBiaXQsIG9wLCBjX29wLCB2YWwpOwkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGRVRDSF9GQU1JTFlfVEVTVChiaXQsIG9wLCBjX29wLCB2YWwpCQkJXAorZG8gewkJCQkJCQkJXAorCUZBTUlMWV9URVNUKFRFU1RfRkVUQ0gsIGJpdCwgb3AsIGNfb3AsIHZhbCk7CQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfQVJHUyhiaXQsIG9wLCBpbml0LCByZXQsIGV4cGVjdCwgYXJncy4uLikJCVwKK2RvIHsJCQkJCQkJCVwKKwlhdG9taWMjI2JpdCMjX3NldCgmdiwgaW5pdCk7CQkJCVwKKwlCVUdfT04oYXRvbWljIyNiaXQjI18jI29wKCZ2LCAjI2FyZ3MpICE9IHJldCk7CQlcCisJQlVHX09OKGF0b21pYyMjYml0IyNfcmVhZCgmdikgIT0gZXhwZWN0KTsJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgWENIR19GQU1JTFlfVEVTVChiaXQsIGluaXQsIG5ldykJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlGQU1JTFlfVEVTVChURVNUX0FSR1MsIGJpdCwgeGNoZywgaW5pdCwgaW5pdCwgbmV3LCBuZXcpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENNUFhDSEdfRkFNSUxZX1RFU1QoYml0LCBpbml0LCBuZXcsIHdyb25nKQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJRkFNSUxZX1RFU1QoVEVTVF9BUkdTLCBiaXQsIGNtcHhjaGcsIAkJCQlcCisJCQlpbml0LCBpbml0LCBuZXcsIGluaXQsIG5ldyk7CQkJXAorCUZBTUlMWV9URVNUKFRFU1RfQVJHUywgYml0LCBjbXB4Y2hnLAkJCQlcCisJCQlpbml0LCBpbml0LCBpbml0LCB3cm9uZywgbmV3KTsJCQlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIElOQ19SRVRVUk5fRkFNSUxZX1RFU1QoYml0LCBpKQkJCVwKK2RvIHsJCQkJCQkJXAorCUZBTUlMWV9URVNUKFRFU1RfQVJHUywgYml0LCBpbmNfcmV0dXJuLAkJXAorCQkJaSwgKGkpICsgb25lLCAoaSkgKyBvbmUpOwlcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERFQ19SRVRVUk5fRkFNSUxZX1RFU1QoYml0LCBpKQkJCVwKK2RvIHsJCQkJCQkJXAorCUZBTUlMWV9URVNUKFRFU1RfQVJHUywgYml0LCBkZWNfcmV0dXJuLAkJXAorCQkJaSwgKGkpIC0gb25lLCAoaSkgLSBvbmUpOwlcCit9IHdoaWxlICgwKQorCitzdGF0aWMgX19pbml0IHZvaWQgdGVzdF9hdG9taWModm9pZCkKK3sKKwlpbnQgdjAgPSAweGFhYTMxMzM3OworCWludCB2MSA9IDB4ZGVhZGJlZWY7CisJaW50IG9uZXN0d29zID0gMHgxMTExMjIyMjsKKwlpbnQgb25lID0gMTsKKworCWF0b21pY190IHY7CisJaW50IHI7CisKKwlURVNUKCwgYWRkLCArPSwgb25lc3R3b3MpOworCVRFU1QoLCBhZGQsICs9LCAtb25lKTsKKwlURVNUKCwgc3ViLCAtPSwgb25lc3R3b3MpOworCVRFU1QoLCBzdWIsIC09LCAtb25lKTsKKwlURVNUKCwgb3IsIHw9LCB2MSk7CisJVEVTVCgsIGFuZCwgJj0sIHYxKTsKKwlURVNUKCwgeG9yLCBePSwgdjEpOworCVRFU1QoLCBhbmRub3QsICY9IH4sIHYxKTsKKworCVJFVFVSTl9GQU1JTFlfVEVTVCgsIGFkZF9yZXR1cm4sICs9LCBvbmVzdHdvcyk7CisJUkVUVVJOX0ZBTUlMWV9URVNUKCwgYWRkX3JldHVybiwgKz0sIC1vbmUpOworCVJFVFVSTl9GQU1JTFlfVEVTVCgsIHN1Yl9yZXR1cm4sIC09LCBvbmVzdHdvcyk7CisJUkVUVVJOX0ZBTUlMWV9URVNUKCwgc3ViX3JldHVybiwgLT0sIC1vbmUpOworCisJRkVUQ0hfRkFNSUxZX1RFU1QoLCBmZXRjaF9hZGQsICs9LCBvbmVzdHdvcyk7CisJRkVUQ0hfRkFNSUxZX1RFU1QoLCBmZXRjaF9hZGQsICs9LCAtb25lKTsKKwlGRVRDSF9GQU1JTFlfVEVTVCgsIGZldGNoX3N1YiwgLT0sIG9uZXN0d29zKTsKKwlGRVRDSF9GQU1JTFlfVEVTVCgsIGZldGNoX3N1YiwgLT0sIC1vbmUpOworCisJRkVUQ0hfRkFNSUxZX1RFU1QoLCBmZXRjaF9vciwgIHw9LCB2MSk7CisJRkVUQ0hfRkFNSUxZX1RFU1QoLCBmZXRjaF9hbmQsICY9LCB2MSk7CisJRkVUQ0hfRkFNSUxZX1RFU1QoLCBmZXRjaF9hbmRub3QsICY9IH4sIHYxKTsKKwlGRVRDSF9GQU1JTFlfVEVTVCgsIGZldGNoX3hvciwgXj0sIHYxKTsKKworCUlOQ19SRVRVUk5fRkFNSUxZX1RFU1QoLCB2MCk7CisJREVDX1JFVFVSTl9GQU1JTFlfVEVTVCgsIHYwKTsKKworCVhDSEdfRkFNSUxZX1RFU1QoLCB2MCwgdjEpOworCUNNUFhDSEdfRkFNSUxZX1RFU1QoLCB2MCwgdjEsIG9uZXN0d29zKTsKKworfQorCisjZGVmaW5lIElOSVQoYykgZG8geyBhdG9taWM2NF9zZXQoJnYsIGMpOyByID0gYzsgfSB3aGlsZSAoMCkKK3N0YXRpYyBfX2luaXQgdm9pZCB0ZXN0X2F0b21pYzY0KHZvaWQpCit7CisJbG9uZyBsb25nIHYwID0gMHhhYWEzMTMzN2MwMDFkMDBkTEw7CisJbG9uZyBsb25nIHYxID0gMHhkZWFkYmVlZmRlYWZjYWZlTEw7CisJbG9uZyBsb25nIHYyID0gMHhmYWNlYWJhZGYwMGRmMDAxTEw7CisJbG9uZyBsb25nIHYzID0gMHg4MDAwMDAwMDAwMDAwMDAwTEw7CisJbG9uZyBsb25nIG9uZXN0d29zID0gMHgxMTExMTExMTIyMjIyMjIyTEw7CisJbG9uZyBsb25nIG9uZSA9IDFMTDsKKwlpbnQgcl9pbnQ7CisKKwlhdG9taWM2NF90IHYgPSBBVE9NSUM2NF9JTklUKHYwKTsKKwlsb25nIGxvbmcgciA9IHYwOworCUJVR19PTih2LmNvdW50ZXIgIT0gcik7CisKKwlhdG9taWM2NF9zZXQoJnYsIHYxKTsKKwlyID0gdjE7CisJQlVHX09OKHYuY291bnRlciAhPSByKTsKKwlCVUdfT04oYXRvbWljNjRfcmVhZCgmdikgIT0gcik7CisKKwlURVNUKDY0LCBhZGQsICs9LCBvbmVzdHdvcyk7CisJVEVTVCg2NCwgYWRkLCArPSwgLW9uZSk7CisJVEVTVCg2NCwgc3ViLCAtPSwgb25lc3R3b3MpOworCVRFU1QoNjQsIHN1YiwgLT0sIC1vbmUpOworCVRFU1QoNjQsIG9yLCB8PSwgdjEpOworCVRFU1QoNjQsIGFuZCwgJj0sIHYxKTsKKwlURVNUKDY0LCB4b3IsIF49LCB2MSk7CisJVEVTVCg2NCwgYW5kbm90LCAmPSB+LCB2MSk7CisKKwlSRVRVUk5fRkFNSUxZX1RFU1QoNjQsIGFkZF9yZXR1cm4sICs9LCBvbmVzdHdvcyk7CisJUkVUVVJOX0ZBTUlMWV9URVNUKDY0LCBhZGRfcmV0dXJuLCArPSwgLW9uZSk7CisJUkVUVVJOX0ZBTUlMWV9URVNUKDY0LCBzdWJfcmV0dXJuLCAtPSwgb25lc3R3b3MpOworCVJFVFVSTl9GQU1JTFlfVEVTVCg2NCwgc3ViX3JldHVybiwgLT0sIC1vbmUpOworCisJRkVUQ0hfRkFNSUxZX1RFU1QoNjQsIGZldGNoX2FkZCwgKz0sIG9uZXN0d29zKTsKKwlGRVRDSF9GQU1JTFlfVEVTVCg2NCwgZmV0Y2hfYWRkLCArPSwgLW9uZSk7CisJRkVUQ0hfRkFNSUxZX1RFU1QoNjQsIGZldGNoX3N1YiwgLT0sIG9uZXN0d29zKTsKKwlGRVRDSF9GQU1JTFlfVEVTVCg2NCwgZmV0Y2hfc3ViLCAtPSwgLW9uZSk7CisKKwlGRVRDSF9GQU1JTFlfVEVTVCg2NCwgZmV0Y2hfb3IsICB8PSwgdjEpOworCUZFVENIX0ZBTUlMWV9URVNUKDY0LCBmZXRjaF9hbmQsICY9LCB2MSk7CisJRkVUQ0hfRkFNSUxZX1RFU1QoNjQsIGZldGNoX2FuZG5vdCwgJj0gfiwgdjEpOworCUZFVENIX0ZBTUlMWV9URVNUKDY0LCBmZXRjaF94b3IsIF49LCB2MSk7CisKKwlJTklUKHYwKTsKKwlhdG9taWM2NF9pbmMoJnYpOworCXIgKz0gb25lOworCUJVR19PTih2LmNvdW50ZXIgIT0gcik7CisKKwlJTklUKHYwKTsKKwlhdG9taWM2NF9kZWMoJnYpOworCXIgLT0gb25lOworCUJVR19PTih2LmNvdW50ZXIgIT0gcik7CisKKwlJTkNfUkVUVVJOX0ZBTUlMWV9URVNUKDY0LCB2MCk7CisJREVDX1JFVFVSTl9GQU1JTFlfVEVTVCg2NCwgdjApOworCisJWENIR19GQU1JTFlfVEVTVCg2NCwgdjAsIHYxKTsKKwlDTVBYQ0hHX0ZBTUlMWV9URVNUKDY0LCB2MCwgdjEsIHYyKTsKKworCUlOSVQodjApOworCUJVR19PTihhdG9taWM2NF9hZGRfdW5sZXNzKCZ2LCBvbmUsIHYwKSk7CisJQlVHX09OKHYuY291bnRlciAhPSByKTsKKworCUlOSVQodjApOworCUJVR19PTighYXRvbWljNjRfYWRkX3VubGVzcygmdiwgb25lLCB2MSkpOworCXIgKz0gb25lOworCUJVR19PTih2LmNvdW50ZXIgIT0gcik7CisKKwlJTklUKG9uZXN0d29zKTsKKwlCVUdfT04oYXRvbWljNjRfZGVjX2lmX3Bvc2l0aXZlKCZ2KSAhPSAob25lc3R3b3MgLSAxKSk7CisJciAtPSBvbmU7CisJQlVHX09OKHYuY291bnRlciAhPSByKTsKKworCUlOSVQoMCk7CisJQlVHX09OKGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZSgmdikgIT0gLW9uZSk7CisJQlVHX09OKHYuY291bnRlciAhPSByKTsKKworCUlOSVQoLW9uZSk7CisJQlVHX09OKGF0b21pYzY0X2RlY19pZl9wb3NpdGl2ZSgmdikgIT0gKC1vbmUgLSBvbmUpKTsKKwlCVUdfT04odi5jb3VudGVyICE9IHIpOworCisJSU5JVChvbmVzdHdvcyk7CisJQlVHX09OKCFhdG9taWM2NF9pbmNfbm90X3plcm8oJnYpKTsKKwlyICs9IG9uZTsKKwlCVUdfT04odi5jb3VudGVyICE9IHIpOworCisJSU5JVCgwKTsKKwlCVUdfT04oYXRvbWljNjRfaW5jX25vdF96ZXJvKCZ2KSk7CisJQlVHX09OKHYuY291bnRlciAhPSByKTsKKworCUlOSVQoLW9uZSk7CisJQlVHX09OKCFhdG9taWM2NF9pbmNfbm90X3plcm8oJnYpKTsKKwlyICs9IG9uZTsKKwlCVUdfT04odi5jb3VudGVyICE9IHIpOworCisJLyogQ29uZmlybSB0aGUgcmV0dXJuIHZhbHVlIGZpdHMgaW4gYW4gaW50LCBldmVuIGlmIHRoZSB2YWx1ZSBkb2Vzbid0ICovCisJSU5JVCh2Myk7CisJcl9pbnQgPSBhdG9taWM2NF9pbmNfbm90X3plcm8oJnYpOworCUJVR19PTighcl9pbnQpOworfQorCitzdGF0aWMgX19pbml0IGludCB0ZXN0X2F0b21pY3NfaW5pdCh2b2lkKQoreworCXRlc3RfYXRvbWljKCk7CisJdGVzdF9hdG9taWM2NCgpOworCisjaWZkZWYgQ09ORklHX1g4NgorCXByX2luZm8oInBhc3NlZCBmb3IgJXMgcGxhdGZvcm0gJXMgQ1g4IGFuZCAlcyBTU0VcbiIsCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQkieDg2LTY0IiwKKyNlbGlmIGRlZmluZWQoQ09ORklHX1g4Nl9DTVBYQ0hHNjQpCisJCSJpNTg2KyIsCisjZWxzZQorCQkiaTM4NisiLAorI2VuZGlmCisJICAgICAgIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9DWDgpID8gIndpdGgiIDogIndpdGhvdXQiLAorCSAgICAgICBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWE1NKSA/ICJ3aXRoIiA6ICJ3aXRob3V0Iik7CisjZWxzZQorCXByX2luZm8oInBhc3NlZFxuIik7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19leGl0IHZvaWQgdGVzdF9hdG9taWNzX2V4aXQodm9pZCkge30KKworbW9kdWxlX2luaXQodGVzdF9hdG9taWNzX2luaXQpOworbW9kdWxlX2V4aXQodGVzdF9hdG9taWNzX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9hdWRpdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYXVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA0YmZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYXVkaXQuYwpAQCAtMCwwICsxLDg1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2F1ZGl0Lmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZC5oPgorCitzdGF0aWMgdW5zaWduZWQgZGlyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfZGlyX3dyaXRlLmg+Cit+MFUKK307CisKK3N0YXRpYyB1bnNpZ25lZCByZWFkX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfcmVhZC5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgd3JpdGVfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF93cml0ZS5oPgorfjBVCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhdHRyX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfY2hhbmdlX2F0dHIuaD4KK34wVQorfTsKKworc3RhdGljIHVuc2lnbmVkIHNpZ25hbF9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3NpZ25hbC5oPgorfjBVCit9OworCitpbnQgYXVkaXRfY2xhc3NpZnlfYXJjaChpbnQgYXJjaCkKK3sKKwlpZiAoYXVkaXRfaXNfY29tcGF0KGFyY2gpKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAwOworfQorCitpbnQgYXVkaXRfY2xhc3NpZnlfc3lzY2FsbChpbnQgYWJpLCB1bnNpZ25lZCBzeXNjYWxsKQoreworCWlmIChhdWRpdF9pc19jb21wYXQoYWJpKSkKKwkJcmV0dXJuIGF1ZGl0X2NsYXNzaWZ5X2NvbXBhdF9zeXNjYWxsKGFiaSwgc3lzY2FsbCk7CisKKwlzd2l0Y2goc3lzY2FsbCkgeworI2lmZGVmIF9fTlJfb3BlbgorCWNhc2UgX19OUl9vcGVuOgorCQlyZXR1cm4gMjsKKyNlbmRpZgorI2lmZGVmIF9fTlJfb3BlbmF0CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisjZW5kaWYKKyNpZmRlZiBfX05SX3NvY2tldGNhbGwKKwljYXNlIF9fTlJfc29ja2V0Y2FsbDoKKwkJcmV0dXJuIDQ7CisjZW5kaWYKKyNpZmRlZiBfX05SX2V4ZWN2ZWF0CisJY2FzZSBfX05SX2V4ZWN2ZWF0OgorI2VuZGlmCisJY2FzZSBfX05SX2V4ZWN2ZToKKwkJcmV0dXJuIDU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCBhdWRpdF9jbGFzc2VzX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfQVVESVRfQ09NUEFUX0dFTkVSSUMKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURV8zMiwgY29tcGF0X3dyaXRlX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19SRUFEXzMyLCBjb21wYXRfcmVhZF9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfRElSX1dSSVRFXzMyLCBjb21wYXRfZGlyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFJfMzIsIGNvbXBhdF9jaGF0dHJfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1NJR05BTF8zMiwgY29tcGF0X3NpZ25hbF9jbGFzcyk7CisjZW5kaWYKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19XUklURSwgd3JpdGVfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX1JFQUQsIHJlYWRfY2xhc3MpOworCWF1ZGl0X3JlZ2lzdGVyX2NsYXNzKEFVRElUX0NMQVNTX0RJUl9XUklURSwgZGlyX2NsYXNzKTsKKwlhdWRpdF9yZWdpc3Rlcl9jbGFzcyhBVURJVF9DTEFTU19DSEFUVFIsIGNoYXR0cl9jbGFzcyk7CisJYXVkaXRfcmVnaXN0ZXJfY2xhc3MoQVVESVRfQ0xBU1NfU0lHTkFMLCBzaWduYWxfY2xhc3MpOworCXJldHVybiAwOworfQorCitfX2luaXRjYWxsKGF1ZGl0X2NsYXNzZXNfaW5pdCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iY2QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2JjZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDc1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iY2QuYwpAQCAtMCwwICsxLDE1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCit1bnNpZ25lZCBfYmNkMmJpbih1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwlyZXR1cm4gKHZhbCAmIDB4MGYpICsgKHZhbCA+PiA0KSAqIDEwOworfQorRVhQT1JUX1NZTUJPTChfYmNkMmJpbik7CisKK3Vuc2lnbmVkIGNoYXIgX2JpbjJiY2QodW5zaWduZWQgdmFsKQoreworCXJldHVybiAoKHZhbCAvIDEwKSA8PCA0KSArIHZhbCAlIDEwOworfQorRVhQT1JUX1NZTUJPTChfYmluMmJjZCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iY2guYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2JjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjODlkZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iY2guYwpAQCAtMCwwICsxLDEzNjggQEAKKy8qCisgKiBHZW5lcmljIGJpbmFyeSBCQ0ggZW5jb2RpbmcvZGVjb2RpbmcgbGlicmFyeQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEKKyAqIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBQYXJyb3QgUy5BLgorICoKKyAqIEF1dGhvcjogSXZhbiBEamVsaWMgPGl2YW4uZGplbGljQHBhcnJvdC5jb20+CisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIHJ1bnRpbWUgY29uZmlndXJhYmxlIGVuY29kaW5nL2RlY29kaW5nIG9mIGJpbmFyeQorICogQm9zZS1DaGF1ZGh1cmktSG9jcXVlbmdoZW0gKEJDSCkgY29kZXMuCisgKgorICogQ2FsbCBpbml0X2JjaCB0byBnZXQgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkIGJjaF9jb250cm9sIHN0cnVjdHVyZSBmb3IKKyAqIHRoZSBnaXZlbiBtIChHYWxvaXMgZmllbGQgb3JkZXIpLCB0IChlcnJvciBjb3JyZWN0aW9uIGNhcGFiaWxpdHkpIGFuZAorICogKG9wdGlvbmFsKSBwcmltaXRpdmUgcG9seW5vbWlhbCBwYXJhbWV0ZXJzLgorICoKKyAqIENhbGwgZW5jb2RlX2JjaCB0byBjb21wdXRlIGFuZCBzdG9yZSBlY2MgcGFyaXR5IGJ5dGVzIHRvIGEgZ2l2ZW4gYnVmZmVyLgorICogQ2FsbCBkZWNvZGVfYmNoIHRvIGRldGVjdCBhbmQgbG9jYXRlIGVycm9ycyBpbiByZWNlaXZlZCBkYXRhLgorICoKKyAqIE9uIHN5c3RlbXMgc3VwcG9ydGluZyBodyBCQ0ggZmVhdHVyZXMsIGludGVybWVkaWF0ZSByZXN1bHRzIG1heSBiZSBwcm92aWRlZAorICogdG8gZGVjb2RlX2JjaCBpbiBvcmRlciB0byBza2lwIGNlcnRhaW4gc3RlcHMuIFNlZSBkZWNvZGVfYmNoKCkgZG9jdW1lbnRhdGlvbgorICogZm9yIGRldGFpbHMuCisgKgorICogT3B0aW9uIENPTkZJR19CQ0hfQ09OU1RfUEFSQU1TIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGZpeGVkIHZhbHVlcyBvZgorICogcGFyYW1ldGVycyBtIGFuZCB0OyB0aHVzIGFsbG93aW5nIGV4dHJhIGNvbXBpbGVyIG9wdGltaXphdGlvbnMgYW5kIHByb3ZpZGluZworICogYmV0dGVyICh1cCB0byAyeCkgZW5jb2RpbmcgcGVyZm9ybWFuY2UuIFVzaW5nIHRoaXMgb3B0aW9uIG1ha2VzIHNlbnNlIHdoZW4KKyAqIChtLHQpIGFyZSBmaXhlZCBhbmQga25vd24gaW4gYWR2YW5jZSwgZS5nLiB3aGVuIHVzaW5nIEJDSCBlcnJvciBjb3JyZWN0aW9uCisgKiBvbiBhIHBhcnRpY3VsYXIgTkFORCBmbGFzaCBkZXZpY2UuCisgKgorICogQWxnb3JpdGhtaWMgZGV0YWlsczoKKyAqCisgKiBFbmNvZGluZyBpcyBwZXJmb3JtZWQgYnkgcHJvY2Vzc2luZyAzMiBpbnB1dCBiaXRzIGluIHBhcmFsbGVsLCB1c2luZyA0CisgKiByZW1haW5kZXIgbG9va3VwIHRhYmxlcy4KKyAqCisgKiBUaGUgZmluYWwgc3RhZ2Ugb2YgZGVjb2RpbmcgaW52b2x2ZXMgdGhlIGZvbGxvd2luZyBpbnRlcm5hbCBzdGVwczoKKyAqIGEuIFN5bmRyb21lIGNvbXB1dGF0aW9uCisgKiBiLiBFcnJvciBsb2NhdG9yIHBvbHlub21pYWwgY29tcHV0YXRpb24gdXNpbmcgQmVybGVrYW1wLU1hc3NleSBhbGdvcml0aG0KKyAqIGMuIEVycm9yIGxvY2F0b3Igcm9vdCBmaW5kaW5nIChieSBmYXIgdGhlIG1vc3QgZXhwZW5zaXZlIHN0ZXApCisgKgorICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgc3RlcCBjIGlzIG5vdCBwZXJmb3JtZWQgdXNpbmcgdGhlIHVzdWFsIENoaWVuIHNlYXJjaC4KKyAqIEluc3RlYWQsIGFuIGFsdGVybmF0aXZlIGFwcHJvYWNoIGRlc2NyaWJlZCBpbiBbMV0gaXMgdXNlZC4gSXQgY29uc2lzdHMgaW4KKyAqIGZhY3RvcmluZyB0aGUgZXJyb3IgbG9jYXRvciBwb2x5bm9taWFsIHVzaW5nIHRoZSBCZXJsZWthbXAgVHJhY2UgYWxnb3JpdGhtCisgKiAoQlRBKSBkb3duIHRvIGEgY2VydGFpbiBkZWdyZWUgKDQpLCBhZnRlciB3aGljaCBhZCBob2MgbG93LWRlZ3JlZSBwb2x5bm9taWFsCisgKiBzb2x2aW5nIHRlY2huaXF1ZXMgWzJdIGFyZSB1c2VkLiBUaGUgcmVzdWx0aW5nIGFsZ29yaXRobSwgY2FsbGVkIEJUWiwgeWllbGRzCisgKiBtdWNoIGJldHRlciBwZXJmb3JtYW5jZSB0aGFuIENoaWVuIHNlYXJjaCBmb3IgdXN1YWwgKG0sdCkgdmFsdWVzICh0eXBpY2FsbHkKKyAqIG0gPj0gMTMsIHQgPCAzMiwgc2VlIFsxXSkuCisgKgorICogWzFdIEIuIEJpc3dhcywgVi4gSGVyYmVydC4gRWZmaWNpZW50IHJvb3QgZmluZGluZyBvZiBwb2x5bm9taWFscyBvdmVyIGZpZWxkcworICogb2YgY2hhcmFjdGVyaXN0aWMgMiwgaW46IFdlc3Rlcm4gRXVyb3BlYW4gV29ya3Nob3Agb24gUmVzZWFyY2ggaW4gQ3J5cHRvbG9neQorICogLSBXRVdvUkMgMjAwOSwgR3JheiwgQXVzdHJpYSwgTE5DUywgU3ByaW5nZXIsIEp1bHkgMjAwOSwgdG8gYXBwZWFyLgorICogWzJdIFtaaW45Nl0gVi5BLiBaaW5vdmlldi4gT24gdGhlIHNvbHV0aW9uIG9mIGVxdWF0aW9ucyBvZiBkZWdyZWUgMTAgb3ZlcgorICogZmluaXRlIGZpZWxkcyBHRigyXnEpLiBJbiBSYXBwb3J0IGRlIHJlY2hlcmNoZSBJTlJJQSBubyAyODI5LCAxOTk2LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JjaC5oPgorCisjaWYgZGVmaW5lZChDT05GSUdfQkNIX0NPTlNUX1BBUkFNUykKKyNkZWZpbmUgR0ZfTShfcCkgICAgICAgICAgICAgICAoQ09ORklHX0JDSF9DT05TVF9NKQorI2RlZmluZSBHRl9UKF9wKSAgICAgICAgICAgICAgIChDT05GSUdfQkNIX0NPTlNUX1QpCisjZGVmaW5lIEdGX04oX3ApICAgICAgICAgICAgICAgKCgxIDw8IChDT05GSUdfQkNIX0NPTlNUX00pKS0xKQorI2Vsc2UKKyNkZWZpbmUgR0ZfTShfcCkgICAgICAgICAgICAgICAoKF9wKS0+bSkKKyNkZWZpbmUgR0ZfVChfcCkgICAgICAgICAgICAgICAoKF9wKS0+dCkKKyNkZWZpbmUgR0ZfTihfcCkgICAgICAgICAgICAgICAoKF9wKS0+bikKKyNlbmRpZgorCisjZGVmaW5lIEJDSF9FQ0NfV09SRFMoX3ApICAgICAgRElWX1JPVU5EX1VQKEdGX00oX3ApKkdGX1QoX3ApLCAzMikKKyNkZWZpbmUgQkNIX0VDQ19CWVRFUyhfcCkgICAgICBESVZfUk9VTkRfVVAoR0ZfTShfcCkqR0ZfVChfcCksIDgpCisKKyNpZm5kZWYgZGJnCisjZGVmaW5lIGRiZyhfZm10LCBhcmdzLi4uKSAgICAgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIHJlcHJlc2VudCBhIHBvbHlub21pYWwgb3ZlciBHRigyXm0pCisgKi8KK3N0cnVjdCBnZl9wb2x5IHsKKwl1bnNpZ25lZCBpbnQgZGVnOyAgICAvKiBwb2x5bm9taWFsIGRlZ3JlZSAqLworCXVuc2lnbmVkIGludCBjWzBdOyAgIC8qIHBvbHlub21pYWwgdGVybXMgKi8KK307CisKKy8qIGdpdmVuIGl0cyBkZWdyZWUsIGNvbXB1dGUgYSBwb2x5bm9taWFsIHNpemUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgR0ZfUE9MWV9TWihfZCkgKHNpemVvZihzdHJ1Y3QgZ2ZfcG9seSkrKChfZCkrMSkqc2l6ZW9mKHVuc2lnbmVkIGludCkpCisKKy8qIHBvbHlub21pYWwgb2YgZGVncmVlIDEgKi8KK3N0cnVjdCBnZl9wb2x5X2RlZzEgeworCXN0cnVjdCBnZl9wb2x5IHBvbHk7CisJdW5zaWduZWQgaW50ICAgY1syXTsKK307CisKKy8qCisgKiBzYW1lIGFzIGVuY29kZV9iY2goKSwgYnV0IHByb2Nlc3MgaW5wdXQgZGF0YSBvbmUgYnl0ZSBhdCBhIHRpbWUKKyAqLworc3RhdGljIHZvaWQgZW5jb2RlX2JjaF91bmFsaWduZWQoc3RydWN0IGJjaF9jb250cm9sICpiY2gsCisJCQkJIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIHVpbnQzMl90ICplY2MpCit7CisJaW50IGk7CisJY29uc3QgdWludDMyX3QgKnA7CisJY29uc3QgaW50IGwgPSBCQ0hfRUNDX1dPUkRTKGJjaCktMTsKKworCXdoaWxlIChsZW4tLSkgeworCQlwID0gYmNoLT5tb2Q4X3RhYiArIChsKzEpKigoKGVjY1swXSA+PiAyNCleKCpkYXRhKyspKSAmIDB4ZmYpOworCisJCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspCisJCQllY2NbaV0gPSAoKGVjY1tpXSA8PCA4KXwoZWNjW2krMV0gPj4gMjQpKV4oKnArKyk7CisKKwkJZWNjW2xdID0gKGVjY1tsXSA8PCA4KV4oKnApOworCX0KK30KKworLyoKKyAqIGNvbnZlcnQgZWNjIGJ5dGVzIHRvIGFsaWduZWQsIHplcm8tcGFkZGVkIDMyLWJpdCBlY2Mgd29yZHMKKyAqLworc3RhdGljIHZvaWQgbG9hZF9lY2M4KHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCB1aW50MzJfdCAqZHN0LAorCQkgICAgICBjb25zdCB1aW50OF90ICpzcmMpCit7CisJdWludDhfdCBwYWRbNF0gPSB7MCwgMCwgMCwgMH07CisJdW5zaWduZWQgaW50IGksIG53b3JkcyA9IEJDSF9FQ0NfV09SRFMoYmNoKS0xOworCisJZm9yIChpID0gMDsgaSA8IG53b3JkczsgaSsrLCBzcmMgKz0gNCkKKwkJZHN0W2ldID0gKHNyY1swXSA8PCAyNCl8KHNyY1sxXSA8PCAxNil8KHNyY1syXSA8PCA4KXxzcmNbM107CisKKwltZW1jcHkocGFkLCBzcmMsIEJDSF9FQ0NfQllURVMoYmNoKS00Km53b3Jkcyk7CisJZHN0W253b3Jkc10gPSAocGFkWzBdIDw8IDI0KXwocGFkWzFdIDw8IDE2KXwocGFkWzJdIDw8IDgpfHBhZFszXTsKK30KKworLyoKKyAqIGNvbnZlcnQgMzItYml0IGVjYyB3b3JkcyB0byBlY2MgYnl0ZXMKKyAqLworc3RhdGljIHZvaWQgc3RvcmVfZWNjOChzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgdWludDhfdCAqZHN0LAorCQkgICAgICAgY29uc3QgdWludDMyX3QgKnNyYykKK3sKKwl1aW50OF90IHBhZFs0XTsKKwl1bnNpZ25lZCBpbnQgaSwgbndvcmRzID0gQkNIX0VDQ19XT1JEUyhiY2gpLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspIHsKKwkJKmRzdCsrID0gKHNyY1tpXSA+PiAyNCk7CisJCSpkc3QrKyA9IChzcmNbaV0gPj4gMTYpICYgMHhmZjsKKwkJKmRzdCsrID0gKHNyY1tpXSA+PiAgOCkgJiAweGZmOworCQkqZHN0KysgPSAoc3JjW2ldID4+ICAwKSAmIDB4ZmY7CisJfQorCXBhZFswXSA9IChzcmNbbndvcmRzXSA+PiAyNCk7CisJcGFkWzFdID0gKHNyY1tud29yZHNdID4+IDE2KSAmIDB4ZmY7CisJcGFkWzJdID0gKHNyY1tud29yZHNdID4+ICA4KSAmIDB4ZmY7CisJcGFkWzNdID0gKHNyY1tud29yZHNdID4+ICAwKSAmIDB4ZmY7CisJbWVtY3B5KGRzdCwgcGFkLCBCQ0hfRUNDX0JZVEVTKGJjaCktNCpud29yZHMpOworfQorCisvKioKKyAqIGVuY29kZV9iY2ggLSBjYWxjdWxhdGUgQkNIIGVjYyBwYXJpdHkgb2YgZGF0YQorICogQGJjaDogICBCQ0ggY29udHJvbCBzdHJ1Y3R1cmUKKyAqIEBkYXRhOiAgZGF0YSB0byBlbmNvZGUKKyAqIEBsZW46ICAgZGF0YSBsZW5ndGggaW4gYnl0ZXMKKyAqIEBlY2M6ICAgZWNjIHBhcml0eSBkYXRhLCBtdXN0IGJlIGluaXRpYWxpemVkIGJ5IGNhbGxlcgorICoKKyAqIFRoZSBAZWNjIHBhcml0eSBhcnJheSBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dCBwYXJhbWV0ZXIsIGluIG9yZGVyIHRvCisgKiBhbGxvdyBpbmNyZW1lbnRhbCBjb21wdXRhdGlvbnMuIEl0IHNob3VsZCBiZSBvZiB0aGUgc2l6ZSBpbmRpY2F0ZWQgYnkgbWVtYmVyCisgKiBAZWNjX2J5dGVzIG9mIEBiY2gsIGFuZCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgdG8gMCBiZWZvcmUgdGhlIGZpcnN0IGNhbGwuCisgKgorICogVGhlIGV4YWN0IG51bWJlciBvZiBjb21wdXRlZCBlY2MgcGFyaXR5IGJpdHMgaXMgZ2l2ZW4gYnkgbWVtYmVyIEBlY2NfYml0cyBvZgorICogQGJjaDsgaXQgbWF5IGJlIGxlc3MgdGhhbiBtKnQgZm9yIGxhcmdlIHZhbHVlcyBvZiB0LgorICovCit2b2lkIGVuY29kZV9iY2goc3RydWN0IGJjaF9jb250cm9sICpiY2gsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisJCXVuc2lnbmVkIGludCBsZW4sIHVpbnQ4X3QgKmVjYykKK3sKKwljb25zdCB1bnNpZ25lZCBpbnQgbCA9IEJDSF9FQ0NfV09SRFMoYmNoKS0xOworCXVuc2lnbmVkIGludCBpLCBtbGVuOworCXVuc2lnbmVkIGxvbmcgbTsKKwl1aW50MzJfdCB3LCByW2wrMV07CisJY29uc3QgdWludDMyX3QgKiBjb25zdCB0YWIwID0gYmNoLT5tb2Q4X3RhYjsKKwljb25zdCB1aW50MzJfdCAqIGNvbnN0IHRhYjEgPSB0YWIwICsgMjU2KihsKzEpOworCWNvbnN0IHVpbnQzMl90ICogY29uc3QgdGFiMiA9IHRhYjEgKyAyNTYqKGwrMSk7CisJY29uc3QgdWludDMyX3QgKiBjb25zdCB0YWIzID0gdGFiMiArIDI1NioobCsxKTsKKwljb25zdCB1aW50MzJfdCAqcGRhdGEsICpwMCwgKnAxLCAqcDIsICpwMzsKKworCWlmIChlY2MpIHsKKwkJLyogbG9hZCBlY2MgcGFyaXR5IGJ5dGVzIGludG8gaW50ZXJuYWwgMzItYml0IGJ1ZmZlciAqLworCQlsb2FkX2VjYzgoYmNoLCBiY2gtPmVjY19idWYsIGVjYyk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGJjaC0+ZWNjX2J1ZiwgMCwgc2l6ZW9mKHIpKTsKKwl9CisKKwkvKiBwcm9jZXNzIGZpcnN0IHVuYWxpZ25lZCBkYXRhIGJ5dGVzICovCisJbSA9ICgodW5zaWduZWQgbG9uZylkYXRhKSAmIDM7CisJaWYgKG0pIHsKKwkJbWxlbiA9IChsZW4gPCAoNC1tKSkgPyBsZW4gOiA0LW07CisJCWVuY29kZV9iY2hfdW5hbGlnbmVkKGJjaCwgZGF0YSwgbWxlbiwgYmNoLT5lY2NfYnVmKTsKKwkJZGF0YSArPSBtbGVuOworCQlsZW4gIC09IG1sZW47CisJfQorCisJLyogcHJvY2VzcyAzMi1iaXQgYWxpZ25lZCBkYXRhIHdvcmRzICovCisJcGRhdGEgPSAodWludDMyX3QgKilkYXRhOworCW1sZW4gID0gbGVuLzQ7CisJZGF0YSArPSA0Km1sZW47CisJbGVuICAtPSA0Km1sZW47CisJbWVtY3B5KHIsIGJjaC0+ZWNjX2J1Ziwgc2l6ZW9mKHIpKTsKKworCS8qCisJICogc3BsaXQgZWFjaCAzMi1iaXQgd29yZCBpbnRvIDQgcG9seW5vbWlhbHMgb2Ygd2VpZ2h0IDggYXMgZm9sbG93czoKKwkgKgorCSAqIDMxIC4uLjI0ICAyMyAuLi4xNiAgMTUgLi4uIDggIDcgLi4uIDAKKwkgKiB4eHh4eHh4eCAgeXl5eXl5eXkgIHp6enp6enp6ICB0dHR0dHR0dAorCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0dHR0dHR0ICBtb2QgZyA9IHIwIChwcmVjb21wdXRlZCkKKwkgKiAgICAgICAgICAgICAgICAgICAgIHp6enp6enp6ICAwMDAwMDAwMCAgbW9kIGcgPSByMSAocHJlY29tcHV0ZWQpCisJICogICAgICAgICAgIHl5eXl5eXl5ICAwMDAwMDAwMCAgMDAwMDAwMDAgIG1vZCBnID0gcjIgKHByZWNvbXB1dGVkKQorCSAqIHh4eHh4eHh4ICAwMDAwMDAwMCAgMDAwMDAwMDAgIDAwMDAwMDAwICBtb2QgZyA9IHIzIChwcmVjb21wdXRlZCkKKwkgKiB4eHh4eHh4eCAgeXl5eXl5eXkgIHp6enp6enp6ICB0dHR0dHR0dCAgbW9kIGcgPSByMF5yMV5yMl5yMworCSAqLworCXdoaWxlIChtbGVuLS0pIHsKKwkJLyogaW5wdXQgZGF0YSBpcyByZWFkIGluIGJpZy1lbmRpYW4gZm9ybWF0ICovCisJCXcgPSByWzBdXmNwdV90b19iZTMyKCpwZGF0YSsrKTsKKwkJcDAgPSB0YWIwICsgKGwrMSkqKCh3ID4+ICAwKSAmIDB4ZmYpOworCQlwMSA9IHRhYjEgKyAobCsxKSooKHcgPj4gIDgpICYgMHhmZik7CisJCXAyID0gdGFiMiArIChsKzEpKigodyA+PiAxNikgJiAweGZmKTsKKwkJcDMgPSB0YWIzICsgKGwrMSkqKCh3ID4+IDI0KSAmIDB4ZmYpOworCisJCWZvciAoaSA9IDA7IGkgPCBsOyBpKyspCisJCQlyW2ldID0gcltpKzFdXnAwW2ldXnAxW2ldXnAyW2ldXnAzW2ldOworCisJCXJbbF0gPSBwMFtsXV5wMVtsXV5wMltsXV5wM1tsXTsKKwl9CisJbWVtY3B5KGJjaC0+ZWNjX2J1Ziwgciwgc2l6ZW9mKHIpKTsKKworCS8qIHByb2Nlc3MgbGFzdCB1bmFsaWduZWQgYnl0ZXMgKi8KKwlpZiAobGVuKQorCQllbmNvZGVfYmNoX3VuYWxpZ25lZChiY2gsIGRhdGEsIGxlbiwgYmNoLT5lY2NfYnVmKTsKKworCS8qIHN0b3JlIGVjYyBwYXJpdHkgYnl0ZXMgaW50byBvcmlnaW5hbCBwYXJpdHkgYnVmZmVyICovCisJaWYgKGVjYykKKwkJc3RvcmVfZWNjOChiY2gsIGVjYywgYmNoLT5lY2NfYnVmKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVuY29kZV9iY2gpOworCitzdGF0aWMgaW5saW5lIGludCBtb2R1bG8oc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCB2KQoreworCWNvbnN0IHVuc2lnbmVkIGludCBuID0gR0ZfTihiY2gpOworCXdoaWxlICh2ID49IG4pIHsKKwkJdiAtPSBuOworCQl2ID0gKHYgJiBuKSArICh2ID4+IEdGX00oYmNoKSk7CisJfQorCXJldHVybiB2OworfQorCisvKgorICogc2hvcnRlciBhbmQgZmFzdGVyIG1vZHVsbyBmdW5jdGlvbiwgb25seSB3b3JrcyB3aGVuIHYgPCAyTi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbW9kX3Moc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCB2KQoreworCWNvbnN0IHVuc2lnbmVkIGludCBuID0gR0ZfTihiY2gpOworCXJldHVybiAodiA8IG4pID8gdiA6IHYtbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgZGVnKHVuc2lnbmVkIGludCBwb2x5KQoreworCS8qIHBvbHlub21pYWwgZGVncmVlIGlzIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBpbmRleCAqLworCXJldHVybiBmbHMocG9seSktMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGFyaXR5KHVuc2lnbmVkIGludCB4KQoreworCS8qCisJICogcHVibGljIGRvbWFpbiBjb2RlIHNuaXBwZXQsIGxpZnRlZCBmcm9tCisJICogaHR0cDovL3d3dy1ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbAorCSAqLworCXggXj0geCA+PiAxOworCXggXj0geCA+PiAyOworCXggPSAoeCAmIDB4MTExMTExMTFVKSAqIDB4MTExMTExMTFVOworCXJldHVybiAoeCA+PiAyOCkgJiAxOworfQorCisvKiBHYWxvaXMgZmllbGQgYmFzaWMgb3BlcmF0aW9uczogbXVsdGlwbHksIGRpdmlkZSwgaW52ZXJzZSwgZXRjLiAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZl9tdWwoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCBhLAorCQkJCSAgdW5zaWduZWQgaW50IGIpCit7CisJcmV0dXJuIChhICYmIGIpID8gYmNoLT5hX3Bvd190YWJbbW9kX3MoYmNoLCBiY2gtPmFfbG9nX3RhYlthXSsKKwkJCQkJICAgICAgIGJjaC0+YV9sb2dfdGFiW2JdKV0gOiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZl9zcXIoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCBhKQoreworCXJldHVybiBhID8gYmNoLT5hX3Bvd190YWJbbW9kX3MoYmNoLCAyKmJjaC0+YV9sb2dfdGFiW2FdKV0gOiAwOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZl9kaXYoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCBhLAorCQkJCSAgdW5zaWduZWQgaW50IGIpCit7CisJcmV0dXJuIGEgPyBiY2gtPmFfcG93X3RhYlttb2RfcyhiY2gsIGJjaC0+YV9sb2dfdGFiW2FdKworCQkJCQlHRl9OKGJjaCktYmNoLT5hX2xvZ190YWJbYl0pXSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdmX2ludihzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgdW5zaWduZWQgaW50IGEpCit7CisJcmV0dXJuIGJjaC0+YV9wb3dfdGFiW0dGX04oYmNoKS1iY2gtPmFfbG9nX3RhYlthXV07Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFfcG93KHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCBpbnQgaSkKK3sKKwlyZXR1cm4gYmNoLT5hX3Bvd190YWJbbW9kdWxvKGJjaCwgaSldOworfQorCitzdGF0aWMgaW5saW5lIGludCBhX2xvZyhzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgdW5zaWduZWQgaW50IHgpCit7CisJcmV0dXJuIGJjaC0+YV9sb2dfdGFiW3hdOworfQorCitzdGF0aWMgaW5saW5lIGludCBhX2lsb2coc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCB4KQoreworCXJldHVybiBtb2RfcyhiY2gsIEdGX04oYmNoKS1iY2gtPmFfbG9nX3RhYlt4XSk7Cit9CisKKy8qCisgKiBjb21wdXRlIDJ0IHN5bmRyb21lcyBvZiBlY2MgcG9seW5vbWlhbCwgaS5lLiBlY2MoYV5qKSBmb3Igaj0xLi4ydAorICovCitzdGF0aWMgdm9pZCBjb21wdXRlX3N5bmRyb21lcyhzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgdWludDMyX3QgKmVjYywKKwkJCSAgICAgIHVuc2lnbmVkIGludCAqc3luKQoreworCWludCBpLCBqLCBzOworCXVuc2lnbmVkIGludCBtOworCXVpbnQzMl90IHBvbHk7CisJY29uc3QgaW50IHQgPSBHRl9UKGJjaCk7CisKKwlzID0gYmNoLT5lY2NfYml0czsKKworCS8qIG1ha2Ugc3VyZSBleHRyYSBiaXRzIGluIGxhc3QgZWNjIHdvcmQgYXJlIGNsZWFyZWQgKi8KKwltID0gKCh1bnNpZ25lZCBpbnQpcykgJiAzMTsKKwlpZiAobSkKKwkJZWNjW3MvMzJdICY9IH4oKDF1IDw8ICgzMi1tKSktMSk7CisJbWVtc2V0KHN5biwgMCwgMip0KnNpemVvZigqc3luKSk7CisKKwkvKiBjb21wdXRlIHYoYV5qKSBmb3Igaj0xIC4uIDJ0LTEgKi8KKwlkbyB7CisJCXBvbHkgPSAqZWNjKys7CisJCXMgLT0gMzI7CisJCXdoaWxlIChwb2x5KSB7CisJCQlpID0gZGVnKHBvbHkpOworCQkJZm9yIChqID0gMDsgaiA8IDIqdDsgaiArPSAyKQorCQkJCXN5bltqXSBePSBhX3BvdyhiY2gsIChqKzEpKihpK3MpKTsKKworCQkJcG9seSBePSAoMSA8PCBpKTsKKwkJfQorCX0gd2hpbGUgKHMgPiAwKTsKKworCS8qIHYoYV4oMmopKSA9IHYoYV5qKV4yICovCisJZm9yIChqID0gMDsgaiA8IHQ7IGorKykKKwkJc3luWzIqaisxXSA9IGdmX3NxcihiY2gsIHN5bltqXSk7Cit9CisKK3N0YXRpYyB2b2lkIGdmX3BvbHlfY29weShzdHJ1Y3QgZ2ZfcG9seSAqZHN0LCBzdHJ1Y3QgZ2ZfcG9seSAqc3JjKQoreworCW1lbWNweShkc3QsIHNyYywgR0ZfUE9MWV9TWihzcmMtPmRlZykpOworfQorCitzdGF0aWMgaW50IGNvbXB1dGVfZXJyb3JfbG9jYXRvcl9wb2x5bm9taWFsKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLAorCQkJCQkgICAgY29uc3QgdW5zaWduZWQgaW50ICpzeW4pCit7CisJY29uc3QgdW5zaWduZWQgaW50IHQgPSBHRl9UKGJjaCk7CisJY29uc3QgdW5zaWduZWQgaW50IG4gPSBHRl9OKGJjaCk7CisJdW5zaWduZWQgaW50IGksIGosIHRtcCwgbCwgcGQgPSAxLCBkID0gc3luWzBdOworCXN0cnVjdCBnZl9wb2x5ICplbHAgPSBiY2gtPmVscDsKKwlzdHJ1Y3QgZ2ZfcG9seSAqcGVscCA9IGJjaC0+cG9seV8ydFswXTsKKwlzdHJ1Y3QgZ2ZfcG9seSAqZWxwX2NvcHkgPSBiY2gtPnBvbHlfMnRbMV07CisJaW50IGssIHBwID0gLTE7CisKKwltZW1zZXQocGVscCwgMCwgR0ZfUE9MWV9TWigyKnQpKTsKKwltZW1zZXQoZWxwLCAwLCBHRl9QT0xZX1NaKDIqdCkpOworCisJcGVscC0+ZGVnID0gMDsKKwlwZWxwLT5jWzBdID0gMTsKKwllbHAtPmRlZyA9IDA7CisJZWxwLT5jWzBdID0gMTsKKworCS8qIHVzZSBzaW1wbGlmaWVkIGJpbmFyeSBCZXJsZWthbXAtTWFzc2V5IGFsZ29yaXRobSAqLworCWZvciAoaSA9IDA7IChpIDwgdCkgJiYgKGVscC0+ZGVnIDw9IHQpOyBpKyspIHsKKwkJaWYgKGQpIHsKKwkJCWsgPSAyKmktcHA7CisJCQlnZl9wb2x5X2NvcHkoZWxwX2NvcHksIGVscCk7CisJCQkvKiBlW2krMV0oWCkgPSBlW2ldKFgpK2RpKmRwXi0xKlheMihpLXApKmVbcF0oWCkgKi8KKwkJCXRtcCA9IGFfbG9nKGJjaCwgZCkrbi1hX2xvZyhiY2gsIHBkKTsKKwkJCWZvciAoaiA9IDA7IGogPD0gcGVscC0+ZGVnOyBqKyspIHsKKwkJCQlpZiAocGVscC0+Y1tqXSkgeworCQkJCQlsID0gYV9sb2coYmNoLCBwZWxwLT5jW2pdKTsKKwkJCQkJZWxwLT5jW2ora10gXj0gYV9wb3coYmNoLCB0bXArbCk7CisJCQkJfQorCQkJfQorCQkJLyogY29tcHV0ZSBsW2krMV0gPSBtYXgobFtpXS0+Y1tsW3BdKzIqKGktcF0pICovCisJCQl0bXAgPSBwZWxwLT5kZWcrazsKKwkJCWlmICh0bXAgPiBlbHAtPmRlZykgeworCQkJCWVscC0+ZGVnID0gdG1wOworCQkJCWdmX3BvbHlfY29weShwZWxwLCBlbHBfY29weSk7CisJCQkJcGQgPSBkOworCQkJCXBwID0gMippOworCQkJfQorCQl9CisJCS8qIGRpKzEgPSBTKDJpKzMpK2VscFtpKzFdLjEqUygyaSsyKSsuLi4rZWxwW2krMV0ubFMoMmkrMy1sKSAqLworCQlpZiAoaSA8IHQtMSkgeworCQkJZCA9IHN5blsyKmkrMl07CisJCQlmb3IgKGogPSAxOyBqIDw9IGVscC0+ZGVnOyBqKyspCisJCQkJZCBePSBnZl9tdWwoYmNoLCBlbHAtPmNbal0sIHN5blsyKmkrMi1qXSk7CisJCX0KKwl9CisJZGJnKCJlbHA9JXNcbiIsIGdmX3BvbHlfc3RyKGVscCkpOworCXJldHVybiAoZWxwLT5kZWcgPiB0KSA/IC0xIDogKGludCllbHAtPmRlZzsKK30KKworLyoKKyAqIHNvbHZlIGEgbSB4IG0gbGluZWFyIHN5c3RlbSBpbiBHRigyKSB3aXRoIGFuIGV4cGVjdGVkIG51bWJlciBvZiBzb2x1dGlvbnMsCisgKiBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YgZm91bmQgc29sdXRpb25zCisgKi8KK3N0YXRpYyBpbnQgc29sdmVfbGluZWFyX3N5c3RlbShzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgdW5zaWduZWQgaW50ICpyb3dzLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqc29sLCBpbnQgbnNvbCkKK3sKKwljb25zdCBpbnQgbSA9IEdGX00oYmNoKTsKKwl1bnNpZ25lZCBpbnQgdG1wLCBtYXNrOworCWludCByZW0sIGMsIHIsIHAsIGssIHBhcmFtW21dOworCisJayA9IDA7CisJbWFzayA9IDEgPDwgbTsKKworCS8qIEdhdXNzaWFuIGVsaW1pbmF0aW9uICovCisJZm9yIChjID0gMDsgYyA8IG07IGMrKykgeworCQlyZW0gPSAwOworCQlwID0gYy1rOworCQkvKiBmaW5kIHN1aXRhYmxlIHJvdyBmb3IgZWxpbWluYXRpb24gKi8KKwkJZm9yIChyID0gcDsgciA8IG07IHIrKykgeworCQkJaWYgKHJvd3Nbcl0gJiBtYXNrKSB7CisJCQkJaWYgKHIgIT0gcCkgeworCQkJCQl0bXAgPSByb3dzW3JdOworCQkJCQlyb3dzW3JdID0gcm93c1twXTsKKwkJCQkJcm93c1twXSA9IHRtcDsKKwkJCQl9CisJCQkJcmVtID0gcisxOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZW0pIHsKKwkJCS8qIHBlcmZvcm0gZWxpbWluYXRpb24gb24gcmVtYWluaW5nIHJvd3MgKi8KKwkJCXRtcCA9IHJvd3NbcF07CisJCQlmb3IgKHIgPSByZW07IHIgPCBtOyByKyspIHsKKwkJCQlpZiAocm93c1tyXSAmIG1hc2spCisJCQkJCXJvd3Nbcl0gXj0gdG1wOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogZWxpbWluYXRpb24gbm90IG5lZWRlZCwgc3RvcmUgZGVmZWN0aXZlIHJvdyBpbmRleCAqLworCQkJcGFyYW1baysrXSA9IGM7CisJCX0KKwkJbWFzayA+Pj0gMTsKKwl9CisJLyogcmV3cml0ZSBzeXN0ZW0sIGluc2VydGluZyBmYWtlIHBhcmFtZXRlciByb3dzICovCisJaWYgKGsgPiAwKSB7CisJCXAgPSBrOworCQlmb3IgKHIgPSBtLTE7IHIgPj0gMDsgci0tKSB7CisJCQlpZiAoKHIgPiBtLTEtaykgJiYgcm93c1tyXSkKKwkJCQkvKiBzeXN0ZW0gaGFzIG5vIHNvbHV0aW9uICovCisJCQkJcmV0dXJuIDA7CisKKwkJCXJvd3Nbcl0gPSAocCAmJiAociA9PSBwYXJhbVtwLTFdKSkgPworCQkJCXAtLSwgMXUgPDwgKG0tcikgOiByb3dzW3ItcF07CisJCX0KKwl9CisKKwlpZiAobnNvbCAhPSAoMSA8PCBrKSkKKwkJLyogdW5leHBlY3RlZCBudW1iZXIgb2Ygc29sdXRpb25zICovCisJCXJldHVybiAwOworCisJZm9yIChwID0gMDsgcCA8IG5zb2w7IHArKykgeworCQkvKiBzZXQgcGFyYW1ldGVycyBmb3IgcC10aCBzb2x1dGlvbiAqLworCQlmb3IgKGMgPSAwOyBjIDwgazsgYysrKQorCQkJcm93c1twYXJhbVtjXV0gPSAocm93c1twYXJhbVtjXV0gJiB+MSl8KChwID4+IGMpICYgMSk7CisKKwkJLyogY29tcHV0ZSB1bmlxdWUgc29sdXRpb24gKi8KKwkJdG1wID0gMDsKKwkJZm9yIChyID0gbS0xOyByID49IDA7IHItLSkgeworCQkJbWFzayA9IHJvd3Nbcl0gJiAodG1wfDEpOworCQkJdG1wIHw9IHBhcml0eShtYXNrKSA8PCAobS1yKTsKKwkJfQorCQlzb2xbcF0gPSB0bXAgPj4gMTsKKwl9CisJcmV0dXJuIG5zb2w7Cit9CisKKy8qCisgKiB0aGlzIGZ1bmN0aW9uIGJ1aWxkcyBhbmQgc29sdmVzIGEgbGluZWFyIHN5c3RlbSBmb3IgZmluZGluZyByb290cyBvZiBhIGRlZ3JlZQorICogNCBhZmZpbmUgbW9uaWMgcG9seW5vbWlhbCBYXjQrYVheMitiWCtjIG92ZXIgR0YoMl5tKS4KKyAqLworc3RhdGljIGludCBmaW5kX2FmZmluZTRfcm9vdHMoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCBhLAorCQkJICAgICAgdW5zaWduZWQgaW50IGIsIHVuc2lnbmVkIGludCBjLAorCQkJICAgICAgdW5zaWduZWQgaW50ICpyb290cykKK3sKKwlpbnQgaSwgaiwgazsKKwljb25zdCBpbnQgbSA9IEdGX00oYmNoKTsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDB4ZmYsIHQsIHJvd3NbMTZdID0gezAsfTsKKworCWogPSBhX2xvZyhiY2gsIGIpOworCWsgPSBhX2xvZyhiY2gsIGEpOworCXJvd3NbMF0gPSBjOworCisJLyogYnVpZCBsaW5lYXIgc3lzdGVtIHRvIHNvbHZlIFheNCthWF4yK2JYK2MgPSAwICovCisJZm9yIChpID0gMDsgaSA8IG07IGkrKykgeworCQlyb3dzW2krMV0gPSBiY2gtPmFfcG93X3RhYls0KmldXgorCQkJKGEgPyBiY2gtPmFfcG93X3RhYlttb2RfcyhiY2gsIGspXSA6IDApXgorCQkJKGIgPyBiY2gtPmFfcG93X3RhYlttb2RfcyhiY2gsIGopXSA6IDApOworCQlqKys7CisJCWsgKz0gMjsKKwl9CisJLyoKKwkgKiB0cmFuc3Bvc2UgMTZ4MTYgbWF0cml4IGJlZm9yZSBwYXNzaW5nIGl0IHRvIGxpbmVhciBzb2x2ZXIKKwkgKiB3YXJuaW5nOiB0aGlzIGNvZGUgYXNzdW1lcyBtIDwgMTYKKwkgKi8KKwlmb3IgKGogPSA4OyBqICE9IDA7IGogPj49IDEsIG1hc2sgXj0gKG1hc2sgPDwgaikpIHsKKwkJZm9yIChrID0gMDsgayA8IDE2OyBrID0gKGsraisxKSAmIH5qKSB7CisJCQl0ID0gKChyb3dzW2tdID4+IGopXnJvd3NbaytqXSkgJiBtYXNrOworCQkJcm93c1trXSBePSAodCA8PCBqKTsKKwkJCXJvd3NbaytqXSBePSB0OworCQl9CisJfQorCXJldHVybiBzb2x2ZV9saW5lYXJfc3lzdGVtKGJjaCwgcm93cywgcm9vdHMsIDQpOworfQorCisvKgorICogY29tcHV0ZSByb290IHIgb2YgYSBkZWdyZWUgMSBwb2x5bm9taWFsIG92ZXIgR0YoMl5tKSAocmV0dXJuZWQgYXMgbG9nKDEvcikpCisgKi8KK3N0YXRpYyBpbnQgZmluZF9wb2x5X2RlZzFfcm9vdHMoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHN0cnVjdCBnZl9wb2x5ICpwb2x5LAorCQkJCXVuc2lnbmVkIGludCAqcm9vdHMpCit7CisJaW50IG4gPSAwOworCisJaWYgKHBvbHktPmNbMF0pCisJCS8qIHBvbHlbWF0gPSBiWCtjIHdpdGggYyE9MCwgcm9vdD1jL2IgKi8KKwkJcm9vdHNbbisrXSA9IG1vZF9zKGJjaCwgR0ZfTihiY2gpLWJjaC0+YV9sb2dfdGFiW3BvbHktPmNbMF1dKworCQkJCSAgIGJjaC0+YV9sb2dfdGFiW3BvbHktPmNbMV1dKTsKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIGNvbXB1dGUgcm9vdHMgb2YgYSBkZWdyZWUgMiBwb2x5bm9taWFsIG92ZXIgR0YoMl5tKQorICovCitzdGF0aWMgaW50IGZpbmRfcG9seV9kZWcyX3Jvb3RzKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCBzdHJ1Y3QgZ2ZfcG9seSAqcG9seSwKKwkJCQl1bnNpZ25lZCBpbnQgKnJvb3RzKQoreworCWludCBuID0gMCwgaSwgbDAsIGwxLCBsMjsKKwl1bnNpZ25lZCBpbnQgdSwgdiwgcjsKKworCWlmIChwb2x5LT5jWzBdICYmIHBvbHktPmNbMV0pIHsKKworCQlsMCA9IGJjaC0+YV9sb2dfdGFiW3BvbHktPmNbMF1dOworCQlsMSA9IGJjaC0+YV9sb2dfdGFiW3BvbHktPmNbMV1dOworCQlsMiA9IGJjaC0+YV9sb2dfdGFiW3BvbHktPmNbMl1dOworCisJCS8qIHVzaW5nIHo9YS9iWCwgdHJhbnNmb3JtIGFYXjIrYlgrYyBpbnRvIHpeMit6K3UgKHU9YWMvYl4yKSAqLworCQl1ID0gYV9wb3coYmNoLCBsMCtsMisyKihHRl9OKGJjaCktbDEpKTsKKwkJLyoKKwkJICogbGV0IHUgPSBzdW0obGkuYV5pKSBpPTAuLm0tMTsgdGhlbiBjb21wdXRlIHIgPSBzdW0obGkueGkpOgorCQkgKiByXjIrciA9IHN1bShsaS4oeGleMit4aSkpID0gc3VtKGxpLihhXmkrVHIoYV5pKS5hXmspKSA9CisJCSAqIHUgKyBzdW0obGkuVHIoYV5pKS5hXmspID0gdSthXmsuVHIoc3VtKGxpLmFeaSkpID0gdSthXmsuVHIodSkKKwkJICogaS5lLiByIGFuZCByKzEgYXJlIHJvb3RzIGlmZiBUcih1KT0wCisJCSAqLworCQlyID0gMDsKKwkJdiA9IHU7CisJCXdoaWxlICh2KSB7CisJCQlpID0gZGVnKHYpOworCQkJciBePSBiY2gtPnhpX3RhYltpXTsKKwkJCXYgXj0gKDEgPDwgaSk7CisJCX0KKwkJLyogdmVyaWZ5IHJvb3QgKi8KKwkJaWYgKChnZl9zcXIoYmNoLCByKV5yKSA9PSB1KSB7CisJCQkvKiByZXZlcnNlIHo9YS9iWCB0cmFuc2Zvcm1hdGlvbiBhbmQgY29tcHV0ZSBsb2coMS9yKSAqLworCQkJcm9vdHNbbisrXSA9IG1vZHVsbyhiY2gsIDIqR0ZfTihiY2gpLWwxLQorCQkJCQkgICAgYmNoLT5hX2xvZ190YWJbcl0rbDIpOworCQkJcm9vdHNbbisrXSA9IG1vZHVsbyhiY2gsIDIqR0ZfTihiY2gpLWwxLQorCQkJCQkgICAgYmNoLT5hX2xvZ190YWJbcl4xXStsMik7CisJCX0KKwl9CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBjb21wdXRlIHJvb3RzIG9mIGEgZGVncmVlIDMgcG9seW5vbWlhbCBvdmVyIEdGKDJebSkKKyAqLworc3RhdGljIGludCBmaW5kX3BvbHlfZGVnM19yb290cyhzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgc3RydWN0IGdmX3BvbHkgKnBvbHksCisJCQkJdW5zaWduZWQgaW50ICpyb290cykKK3sKKwlpbnQgaSwgbiA9IDA7CisJdW5zaWduZWQgaW50IGEsIGIsIGMsIGEyLCBiMiwgYzIsIGUzLCB0bXBbNF07CisKKwlpZiAocG9seS0+Y1swXSkgeworCQkvKiB0cmFuc2Zvcm0gcG9seW5vbWlhbCBpbnRvIG1vbmljIFheMyArIGEyWF4yICsgYjJYICsgYzIgKi8KKwkJZTMgPSBwb2x5LT5jWzNdOworCQljMiA9IGdmX2RpdihiY2gsIHBvbHktPmNbMF0sIGUzKTsKKwkJYjIgPSBnZl9kaXYoYmNoLCBwb2x5LT5jWzFdLCBlMyk7CisJCWEyID0gZ2ZfZGl2KGJjaCwgcG9seS0+Y1syXSwgZTMpOworCisJCS8qIChYK2EyKShYXjMrYTJYXjIrYjJYK2MyKSA9IFheNCthWF4yK2JYK2MgKGFmZmluZSkgKi8KKwkJYyA9IGdmX211bChiY2gsIGEyLCBjMik7ICAgICAgICAgICAvKiBjID0gYTJjMiAgICAgICovCisJCWIgPSBnZl9tdWwoYmNoLCBhMiwgYjIpXmMyOyAgICAgICAgLyogYiA9IGEyYjIgKyBjMiAqLworCQlhID0gZ2Zfc3FyKGJjaCwgYTIpXmIyOyAgICAgICAgICAgIC8qIGEgPSBhMl4yICsgYjIgKi8KKworCQkvKiBmaW5kIHRoZSA0IHJvb3RzIG9mIHRoaXMgYWZmaW5lIHBvbHlub21pYWwgKi8KKwkJaWYgKGZpbmRfYWZmaW5lNF9yb290cyhiY2gsIGEsIGIsIGMsIHRtcCkgPT0gNCkgeworCQkJLyogcmVtb3ZlIGEyIGZyb20gZmluYWwgbGlzdCBvZiByb290cyAqLworCQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJCWlmICh0bXBbaV0gIT0gYTIpCisJCQkJCXJvb3RzW24rK10gPSBhX2lsb2coYmNoLCB0bXBbaV0pOworCQkJfQorCQl9CisJfQorCXJldHVybiBuOworfQorCisvKgorICogY29tcHV0ZSByb290cyBvZiBhIGRlZ3JlZSA0IHBvbHlub21pYWwgb3ZlciBHRigyXm0pCisgKi8KK3N0YXRpYyBpbnQgZmluZF9wb2x5X2RlZzRfcm9vdHMoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHN0cnVjdCBnZl9wb2x5ICpwb2x5LAorCQkJCXVuc2lnbmVkIGludCAqcm9vdHMpCit7CisJaW50IGksIGwsIG4gPSAwOworCXVuc2lnbmVkIGludCBhLCBiLCBjLCBkLCBlID0gMCwgZiwgYTIsIGIyLCBjMiwgZTQ7CisKKwlpZiAocG9seS0+Y1swXSA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIHRyYW5zZm9ybSBwb2x5bm9taWFsIGludG8gbW9uaWMgWF40ICsgYVheMyArIGJYXjIgKyBjWCArIGQgKi8KKwllNCA9IHBvbHktPmNbNF07CisJZCA9IGdmX2RpdihiY2gsIHBvbHktPmNbMF0sIGU0KTsKKwljID0gZ2ZfZGl2KGJjaCwgcG9seS0+Y1sxXSwgZTQpOworCWIgPSBnZl9kaXYoYmNoLCBwb2x5LT5jWzJdLCBlNCk7CisJYSA9IGdmX2RpdihiY2gsIHBvbHktPmNbM10sIGU0KTsKKworCS8qIHVzZSBZPTEvWCB0cmFuc2Zvcm1hdGlvbiB0byBnZXQgYW4gYWZmaW5lIHBvbHlub21pYWwgKi8KKwlpZiAoYSkgeworCQkvKiBmaXJzdCwgZWxpbWluYXRlIGNYIGJ5IHVzaW5nIHo9WCtlIHdpdGggYWVeMitjPTAgKi8KKwkJaWYgKGMpIHsKKwkJCS8qIGNvbXB1dGUgZSBzdWNoIHRoYXQgZV4yID0gYy9hICovCisJCQlmID0gZ2ZfZGl2KGJjaCwgYywgYSk7CisJCQlsID0gYV9sb2coYmNoLCBmKTsKKwkJCWwgKz0gKGwgJiAxKSA/IEdGX04oYmNoKSA6IDA7CisJCQllID0gYV9wb3coYmNoLCBsLzIpOworCQkJLyoKKwkJCSAqIHVzZSB0cmFuc2Zvcm1hdGlvbiB6PVgrZToKKwkJCSAqIHpeNCtlXjQgKyBhKHpeMytlel4yK2VeMnorZV4zKSArIGIoel4yK2VeMikgK2N6K2NlK2QKKwkJCSAqIHpeNCArIGF6XjMgKyAoYWUrYil6XjIgKyAoYWVeMitjKXorZV40K2JlXjIrYWVeMytjZStkCisJCQkgKiB6XjQgKyBhel4zICsgKGFlK2Ipel4yICsgZV40K2JlXjIrZAorCQkJICogel40ICsgYXpeMyArICAgICBiJ3peMiArIGQnCisJCQkgKi8KKwkJCWQgPSBhX3BvdyhiY2gsIDIqbCleZ2ZfbXVsKGJjaCwgYiwgZileZDsKKwkJCWIgPSBnZl9tdWwoYmNoLCBhLCBlKV5iOworCQl9CisJCS8qIG5vdywgdXNlIFk9MS9YIHRvIGdldCBZXjQgKyBiL2RZXjIgKyBhL2RZICsgMS9kICovCisJCWlmIChkID09IDApCisJCQkvKiBhc3N1bWUgYWxsIHJvb3RzIGhhdmUgbXVsdGlwbGljaXR5IDEgKi8KKwkJCXJldHVybiAwOworCisJCWMyID0gZ2ZfaW52KGJjaCwgZCk7CisJCWIyID0gZ2ZfZGl2KGJjaCwgYSwgZCk7CisJCWEyID0gZ2ZfZGl2KGJjaCwgYiwgZCk7CisJfSBlbHNlIHsKKwkJLyogcG9seW5vbWlhbCBpcyBhbHJlYWR5IGFmZmluZSAqLworCQljMiA9IGQ7CisJCWIyID0gYzsKKwkJYTIgPSBiOworCX0KKwkvKiBmaW5kIHRoZSA0IHJvb3RzIG9mIHRoaXMgYWZmaW5lIHBvbHlub21pYWwgKi8KKwlpZiAoZmluZF9hZmZpbmU0X3Jvb3RzKGJjaCwgYTIsIGIyLCBjMiwgcm9vdHMpID09IDQpIHsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJLyogcG9zdC1wcm9jZXNzIHJvb3RzIChyZXZlcnNlIHRyYW5zZm9ybWF0aW9ucykgKi8KKwkJCWYgPSBhID8gZ2ZfaW52KGJjaCwgcm9vdHNbaV0pIDogcm9vdHNbaV07CisJCQlyb290c1tpXSA9IGFfaWxvZyhiY2gsIGZeZSk7CisJCX0KKwkJbiA9IDQ7CisJfQorCXJldHVybiBuOworfQorCisvKgorICogYnVpbGQgbW9uaWMsIGxvZy1iYXNlZCByZXByZXNlbnRhdGlvbiBvZiBhIHBvbHlub21pYWwKKyAqLworc3RhdGljIHZvaWQgZ2ZfcG9seV9sb2dyZXAoc3RydWN0IGJjaF9jb250cm9sICpiY2gsCisJCQkgICBjb25zdCBzdHJ1Y3QgZ2ZfcG9seSAqYSwgaW50ICpyZXApCit7CisJaW50IGksIGQgPSBhLT5kZWcsIGwgPSBHRl9OKGJjaCktYV9sb2coYmNoLCBhLT5jW2EtPmRlZ10pOworCisJLyogcmVwcmVzZW50IDAgdmFsdWVzIHdpdGggLTE7IHdhcm5pbmcsIHJlcFtkXSBpcyBub3Qgc2V0IHRvIDEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZDsgaSsrKQorCQlyZXBbaV0gPSBhLT5jW2ldID8gbW9kX3MoYmNoLCBhX2xvZyhiY2gsIGEtPmNbaV0pK2wpIDogLTE7Cit9CisKKy8qCisgKiBjb21wdXRlIHBvbHlub21pYWwgRXVjbGlkZWFuIGRpdmlzaW9uIHJlbWFpbmRlciBpbiBHRigyXm0pW1hdCisgKi8KK3N0YXRpYyB2b2lkIGdmX3BvbHlfbW9kKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCBzdHJ1Y3QgZ2ZfcG9seSAqYSwKKwkJCWNvbnN0IHN0cnVjdCBnZl9wb2x5ICpiLCBpbnQgKnJlcCkKK3sKKwlpbnQgbGEsIHAsIG07CisJdW5zaWduZWQgaW50IGksIGosICpjID0gYS0+YzsKKwljb25zdCB1bnNpZ25lZCBpbnQgZCA9IGItPmRlZzsKKworCWlmIChhLT5kZWcgPCBkKQorCQlyZXR1cm47CisKKwkvKiByZXVzZSBvciBjb21wdXRlIGxvZyByZXByZXNlbnRhdGlvbiBvZiBkZW5vbWluYXRvciAqLworCWlmICghcmVwKSB7CisJCXJlcCA9IGJjaC0+Y2FjaGU7CisJCWdmX3BvbHlfbG9ncmVwKGJjaCwgYiwgcmVwKTsKKwl9CisKKwlmb3IgKGogPSBhLT5kZWc7IGogPj0gZDsgai0tKSB7CisJCWlmIChjW2pdKSB7CisJCQlsYSA9IGFfbG9nKGJjaCwgY1tqXSk7CisJCQlwID0gai1kOworCQkJZm9yIChpID0gMDsgaSA8IGQ7IGkrKywgcCsrKSB7CisJCQkJbSA9IHJlcFtpXTsKKwkJCQlpZiAobSA+PSAwKQorCQkJCQljW3BdIF49IGJjaC0+YV9wb3dfdGFiW21vZF9zKGJjaCwKKwkJCQkJCQkJICAgICBtK2xhKV07CisJCQl9CisJCX0KKwl9CisJYS0+ZGVnID0gZC0xOworCXdoaWxlICghY1thLT5kZWddICYmIGEtPmRlZykKKwkJYS0+ZGVnLS07Cit9CisKKy8qCisgKiBjb21wdXRlIHBvbHlub21pYWwgRXVjbGlkZWFuIGRpdmlzaW9uIHF1b3RpZW50IGluIEdGKDJebSlbWF0KKyAqLworc3RhdGljIHZvaWQgZ2ZfcG9seV9kaXYoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHN0cnVjdCBnZl9wb2x5ICphLAorCQkJY29uc3Qgc3RydWN0IGdmX3BvbHkgKmIsIHN0cnVjdCBnZl9wb2x5ICpxKQoreworCWlmIChhLT5kZWcgPj0gYi0+ZGVnKSB7CisJCXEtPmRlZyA9IGEtPmRlZy1iLT5kZWc7CisJCS8qIGNvbXB1dGUgYSBtb2QgYiAobW9kaWZpZXMgYSkgKi8KKwkJZ2ZfcG9seV9tb2QoYmNoLCBhLCBiLCBOVUxMKTsKKwkJLyogcXVvdGllbnQgaXMgc3RvcmVkIGluIHVwcGVyIHBhcnQgb2YgcG9seW5vbWlhbCBhICovCisJCW1lbWNweShxLT5jLCAmYS0+Y1tiLT5kZWddLCAoMStxLT5kZWcpKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKKwl9IGVsc2UgeworCQlxLT5kZWcgPSAwOworCQlxLT5jWzBdID0gMDsKKwl9Cit9CisKKy8qCisgKiBjb21wdXRlIHBvbHlub21pYWwgR0NEIChHcmVhdGVzdCBDb21tb24gRGl2aXNvcikgaW4gR0YoMl5tKVtYXQorICovCitzdGF0aWMgc3RydWN0IGdmX3BvbHkgKmdmX3BvbHlfZ2NkKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCBzdHJ1Y3QgZ2ZfcG9seSAqYSwKKwkJCQkgICBzdHJ1Y3QgZ2ZfcG9seSAqYikKK3sKKwlzdHJ1Y3QgZ2ZfcG9seSAqdG1wOworCisJZGJnKCJnY2QoJXMsJXMpPSIsIGdmX3BvbHlfc3RyKGEpLCBnZl9wb2x5X3N0cihiKSk7CisKKwlpZiAoYS0+ZGVnIDwgYi0+ZGVnKSB7CisJCXRtcCA9IGI7CisJCWIgPSBhOworCQlhID0gdG1wOworCX0KKworCXdoaWxlIChiLT5kZWcgPiAwKSB7CisJCWdmX3BvbHlfbW9kKGJjaCwgYSwgYiwgTlVMTCk7CisJCXRtcCA9IGI7CisJCWIgPSBhOworCQlhID0gdG1wOworCX0KKworCWRiZygiJXNcbiIsIGdmX3BvbHlfc3RyKGEpKTsKKworCXJldHVybiBhOworfQorCisvKgorICogR2l2ZW4gYSBwb2x5bm9taWFsIGYgYW5kIGFuIGludGVnZXIgaywgY29tcHV0ZSBUcihhXmtYKSBtb2QgZgorICogVGhpcyBpcyB1c2VkIGluIEJlcmxla2FtcCBUcmFjZSBhbGdvcml0aG0gZm9yIHNwbGl0dGluZyBwb2x5bm9taWFscworICovCitzdGF0aWMgdm9pZCBjb21wdXRlX3RyYWNlX2JrX21vZChzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgaW50IGssCisJCQkJIGNvbnN0IHN0cnVjdCBnZl9wb2x5ICpmLCBzdHJ1Y3QgZ2ZfcG9seSAqeiwKKwkJCQkgc3RydWN0IGdmX3BvbHkgKm91dCkKK3sKKwljb25zdCBpbnQgbSA9IEdGX00oYmNoKTsKKwlpbnQgaSwgajsKKworCS8qIHogY29udGFpbnMgel4yaiBtb2QgZiAqLworCXotPmRlZyA9IDE7CisJei0+Y1swXSA9IDA7CisJei0+Y1sxXSA9IGJjaC0+YV9wb3dfdGFiW2tdOworCisJb3V0LT5kZWcgPSAwOworCW1lbXNldChvdXQsIDAsIEdGX1BPTFlfU1ooZi0+ZGVnKSk7CisKKwkvKiBjb21wdXRlIGYgbG9nIHJlcHJlc2VudGF0aW9uIG9ubHkgb25jZSAqLworCWdmX3BvbHlfbG9ncmVwKGJjaCwgZiwgYmNoLT5jYWNoZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbTsgaSsrKSB7CisJCS8qIGFkZCBhXihrKjJeaSkoel4oMl5pKSBtb2QgZikgYW5kIGNvbXB1dGUgKHpeKDJeaSkgbW9kIGYpXjIgKi8KKwkJZm9yIChqID0gei0+ZGVnOyBqID49IDA7IGotLSkgeworCQkJb3V0LT5jW2pdIF49IHotPmNbal07CisJCQl6LT5jWzIqal0gPSBnZl9zcXIoYmNoLCB6LT5jW2pdKTsKKwkJCXotPmNbMipqKzFdID0gMDsKKwkJfQorCQlpZiAoei0+ZGVnID4gb3V0LT5kZWcpCisJCQlvdXQtPmRlZyA9IHotPmRlZzsKKworCQlpZiAoaSA8IG0tMSkgeworCQkJei0+ZGVnICo9IDI7CisJCQkvKiB6XigyKGkrMSkpIG1vZCBmID0gKHpeKDJeaSkgbW9kIGYpXjIgbW9kIGYgKi8KKwkJCWdmX3BvbHlfbW9kKGJjaCwgeiwgZiwgYmNoLT5jYWNoZSk7CisJCX0KKwl9CisJd2hpbGUgKCFvdXQtPmNbb3V0LT5kZWddICYmIG91dC0+ZGVnKQorCQlvdXQtPmRlZy0tOworCisJZGJnKCJUcihhXiVkLlgpIG1vZCBmID0gJXNcbiIsIGssIGdmX3BvbHlfc3RyKG91dCkpOworfQorCisvKgorICogZmFjdG9yIGEgcG9seW5vbWlhbCB1c2luZyBCZXJsZWthbXAgVHJhY2UgYWxnb3JpdGhtIChCVEEpCisgKi8KK3N0YXRpYyB2b2lkIGZhY3Rvcl9wb2x5bm9taWFsKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCBpbnQgaywgc3RydWN0IGdmX3BvbHkgKmYsCisJCQkgICAgICBzdHJ1Y3QgZ2ZfcG9seSAqKmcsIHN0cnVjdCBnZl9wb2x5ICoqaCkKK3sKKwlzdHJ1Y3QgZ2ZfcG9seSAqZjIgPSBiY2gtPnBvbHlfMnRbMF07CisJc3RydWN0IGdmX3BvbHkgKnEgID0gYmNoLT5wb2x5XzJ0WzFdOworCXN0cnVjdCBnZl9wb2x5ICp0ayA9IGJjaC0+cG9seV8ydFsyXTsKKwlzdHJ1Y3QgZ2ZfcG9seSAqeiAgPSBiY2gtPnBvbHlfMnRbM107CisJc3RydWN0IGdmX3BvbHkgKmdjZDsKKworCWRiZygiZmFjdG9yaW5nICVzLi4uXG4iLCBnZl9wb2x5X3N0cihmKSk7CisKKwkqZyA9IGY7CisJKmggPSBOVUxMOworCisJLyogdGsgPSBUcihhXmsuWCkgbW9kIGYgKi8KKwljb21wdXRlX3RyYWNlX2JrX21vZChiY2gsIGssIGYsIHosIHRrKTsKKworCWlmICh0ay0+ZGVnID4gMCkgeworCQkvKiBjb21wdXRlIGcgPSBnY2QoZiwgdGspIChkZXN0cnVjdGl2ZSBvcGVyYXRpb24pICovCisJCWdmX3BvbHlfY29weShmMiwgZik7CisJCWdjZCA9IGdmX3BvbHlfZ2NkKGJjaCwgZjIsIHRrKTsKKwkJaWYgKGdjZC0+ZGVnIDwgZi0+ZGVnKSB7CisJCQkvKiBjb21wdXRlIGg9Zi9nY2QoZix0ayk7IHRoaXMgd2lsbCBtb2RpZnkgZiBhbmQgcSAqLworCQkJZ2ZfcG9seV9kaXYoYmNoLCBmLCBnY2QsIHEpOworCQkJLyogc3RvcmUgZyBhbmQgaCBpbi1wbGFjZSAoY2xvYmJlcmluZyBmKSAqLworCQkJKmggPSAmKChzdHJ1Y3QgZ2ZfcG9seV9kZWcxICopZilbZ2NkLT5kZWddLnBvbHk7CisJCQlnZl9wb2x5X2NvcHkoKmcsIGdjZCk7CisJCQlnZl9wb2x5X2NvcHkoKmgsIHEpOworCQl9CisJfQorfQorCisvKgorICogZmluZCByb290cyBvZiBhIHBvbHlub21pYWwsIHVzaW5nIEJUWiBhbGdvcml0aG07IHNlZSB0aGUgYmVnaW5uaW5nIG9mIHRoaXMKKyAqIGZpbGUgZm9yIGRldGFpbHMKKyAqLworc3RhdGljIGludCBmaW5kX3BvbHlfcm9vdHMoc3RydWN0IGJjaF9jb250cm9sICpiY2gsIHVuc2lnbmVkIGludCBrLAorCQkJICAgc3RydWN0IGdmX3BvbHkgKnBvbHksIHVuc2lnbmVkIGludCAqcm9vdHMpCit7CisJaW50IGNudDsKKwlzdHJ1Y3QgZ2ZfcG9seSAqZjEsICpmMjsKKworCXN3aXRjaCAocG9seS0+ZGVnKSB7CisJCS8qIGhhbmRsZSBsb3cgZGVncmVlIHBvbHlub21pYWxzIHdpdGggYWQgaG9jIHRlY2huaXF1ZXMgKi8KKwljYXNlIDE6CisJCWNudCA9IGZpbmRfcG9seV9kZWcxX3Jvb3RzKGJjaCwgcG9seSwgcm9vdHMpOworCQlicmVhazsKKwljYXNlIDI6CisJCWNudCA9IGZpbmRfcG9seV9kZWcyX3Jvb3RzKGJjaCwgcG9seSwgcm9vdHMpOworCQlicmVhazsKKwljYXNlIDM6CisJCWNudCA9IGZpbmRfcG9seV9kZWczX3Jvb3RzKGJjaCwgcG9seSwgcm9vdHMpOworCQlicmVhazsKKwljYXNlIDQ6CisJCWNudCA9IGZpbmRfcG9seV9kZWc0X3Jvb3RzKGJjaCwgcG9seSwgcm9vdHMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBmYWN0b3IgcG9seW5vbWlhbCB1c2luZyBCZXJsZWthbXAgVHJhY2UgQWxnb3JpdGhtIChCVEEpICovCisJCWNudCA9IDA7CisJCWlmIChwb2x5LT5kZWcgJiYgKGsgPD0gR0ZfTShiY2gpKSkgeworCQkJZmFjdG9yX3BvbHlub21pYWwoYmNoLCBrLCBwb2x5LCAmZjEsICZmMik7CisJCQlpZiAoZjEpCisJCQkJY250ICs9IGZpbmRfcG9seV9yb290cyhiY2gsIGsrMSwgZjEsIHJvb3RzKTsKKwkJCWlmIChmMikKKwkJCQljbnQgKz0gZmluZF9wb2x5X3Jvb3RzKGJjaCwgaysxLCBmMiwgcm9vdHMrY250KTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIGNudDsKK30KKworI2lmIGRlZmluZWQoVVNFX0NISUVOX1NFQVJDSCkKKy8qCisgKiBleGhhdXN0aXZlIHJvb3Qgc2VhcmNoIChDaGllbikgaW1wbGVtZW50YXRpb24gLSBub3QgdXNlZCwgaW5jbHVkZWQgb25seSBmb3IKKyAqIHJlZmVyZW5jZS9jb21wYXJpc29uIHRlc3RzCisgKi8KK3N0YXRpYyBpbnQgY2hpZW5fc2VhcmNoKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJc3RydWN0IGdmX3BvbHkgKnAsIHVuc2lnbmVkIGludCAqcm9vdHMpCit7CisJaW50IG07CisJdW5zaWduZWQgaW50IGksIGosIHN5biwgc3luMCwgY291bnQgPSAwOworCWNvbnN0IHVuc2lnbmVkIGludCBrID0gOCpsZW4rYmNoLT5lY2NfYml0czsKKworCS8qIHVzZSBhIGxvZy1iYXNlZCByZXByZXNlbnRhdGlvbiBvZiBwb2x5bm9taWFsICovCisJZ2ZfcG9seV9sb2dyZXAoYmNoLCBwLCBiY2gtPmNhY2hlKTsKKwliY2gtPmNhY2hlW3AtPmRlZ10gPSAwOworCXN5bjAgPSBnZl9kaXYoYmNoLCBwLT5jWzBdLCBwLT5jW3AtPmRlZ10pOworCisJZm9yIChpID0gR0ZfTihiY2gpLWsrMTsgaSA8PSBHRl9OKGJjaCk7IGkrKykgeworCQkvKiBjb21wdXRlIGVscChhXmkpICovCisJCWZvciAoaiA9IDEsIHN5biA9IHN5bjA7IGogPD0gcC0+ZGVnOyBqKyspIHsKKwkJCW0gPSBiY2gtPmNhY2hlW2pdOworCQkJaWYgKG0gPj0gMCkKKwkJCQlzeW4gXj0gYV9wb3coYmNoLCBtK2oqaSk7CisJCX0KKwkJaWYgKHN5biA9PSAwKSB7CisJCQlyb290c1tjb3VudCsrXSA9IEdGX04oYmNoKS1pOworCQkJaWYgKGNvdW50ID09IHAtPmRlZykKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gKGNvdW50ID09IHAtPmRlZykgPyBjb3VudCA6IDA7Cit9CisjZGVmaW5lIGZpbmRfcG9seV9yb290cyhfcCwgX2ssIF9lbHAsIF9sb2MpIGNoaWVuX3NlYXJjaChfcCwgbGVuLCBfZWxwLCBfbG9jKQorI2VuZGlmIC8qIFVTRV9DSElFTl9TRUFSQ0ggKi8KKworLyoqCisgKiBkZWNvZGVfYmNoIC0gZGVjb2RlIHJlY2VpdmVkIGNvZGV3b3JkIGFuZCBmaW5kIGJpdCBlcnJvciBsb2NhdGlvbnMKKyAqIEBiY2g6ICAgICAgQkNIIGNvbnRyb2wgc3RydWN0dXJlCisgKiBAZGF0YTogICAgIHJlY2VpdmVkIGRhdGEsIGlnbm9yZWQgaWYgQGNhbGNfZWNjIGlzIHByb3ZpZGVkCisgKiBAbGVuOiAgICAgIGRhdGEgbGVuZ3RoIGluIGJ5dGVzLCBtdXN0IGFsd2F5cyBiZSBwcm92aWRlZAorICogQHJlY3ZfZWNjOiByZWNlaXZlZCBlY2MsIGlmIE5VTEwgdGhlbiBhc3N1bWUgaXQgd2FzIFhPUmVkIGluIEBjYWxjX2VjYworICogQGNhbGNfZWNjOiBjYWxjdWxhdGVkIGVjYywgaWYgTlVMTCB0aGVuIGNhbGNfZWNjIGlzIGNvbXB1dGVkIGZyb20gQGRhdGEKKyAqIEBzeW46ICAgICAgaHcgY29tcHV0ZWQgc3luZHJvbWUgZGF0YSAoaWYgTlVMTCwgc3luZHJvbWUgaXMgY2FsY3VsYXRlZCkKKyAqIEBlcnJsb2M6ICAgb3V0cHV0IGFycmF5IG9mIGVycm9yIGxvY2F0aW9ucworICoKKyAqIFJldHVybnM6CisgKiAgVGhlIG51bWJlciBvZiBlcnJvcnMgZm91bmQsIG9yIC1FQkFETVNHIGlmIGRlY29kaW5nIGZhaWxlZCwgb3IgLUVJTlZBTCBpZgorICogIGludmFsaWQgcGFyYW1ldGVycyB3ZXJlIHByb3ZpZGVkCisgKgorICogRGVwZW5kaW5nIG9uIHRoZSBhdmFpbGFibGUgaHcgQkNIIHN1cHBvcnQgYW5kIHRoZSBuZWVkIHRvIGNvbXB1dGUgQGNhbGNfZWNjCisgKiBzZXBhcmF0ZWx5ICh1c2luZyBlbmNvZGVfYmNoKCkpLCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBvbmUgb2YKKyAqIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zIC0KKyAqCisgKiBieSBwcm92aWRpbmcgQGRhdGEgYW5kIEByZWN2X2VjYyBvbmx5OgorICogICBkZWNvZGVfYmNoKEBiY2gsIEBkYXRhLCBAbGVuLCBAcmVjdl9lY2MsIE5VTEwsIE5VTEwsIEBlcnJsb2MpCisgKgorICogYnkgcHJvdmlkaW5nIEByZWN2X2VjYyBhbmQgQGNhbGNfZWNjOgorICogICBkZWNvZGVfYmNoKEBiY2gsIE5VTEwsIEBsZW4sIEByZWN2X2VjYywgQGNhbGNfZWNjLCBOVUxMLCBAZXJybG9jKQorICoKKyAqIGJ5IHByb3ZpZGluZyBlY2MgPSByZWN2X2VjYyBYT1IgY2FsY19lY2M6CisgKiAgIGRlY29kZV9iY2goQGJjaCwgTlVMTCwgQGxlbiwgTlVMTCwgZWNjLCBOVUxMLCBAZXJybG9jKQorICoKKyAqIGJ5IHByb3ZpZGluZyBzeW5kcm9tZSByZXN1bHRzIEBzeW46CisgKiAgIGRlY29kZV9iY2goQGJjaCwgTlVMTCwgQGxlbiwgTlVMTCwgTlVMTCwgQHN5biwgQGVycmxvYykKKyAqCisgKiBPbmNlIGRlY29kZV9iY2goKSBoYXMgc3VjY2Vzc2Z1bGx5IHJldHVybmVkIHdpdGggYSBwb3NpdGl2ZSB2YWx1ZSwgZXJyb3IKKyAqIGxvY2F0aW9ucyByZXR1cm5lZCBpbiBhcnJheSBAZXJybG9jIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzIC0KKyAqCisgKiBpZiAoZXJybG9jW25dID49IDgqbGVuKSwgdGhlbiBuLXRoIGVycm9yIGlzIGxvY2F0ZWQgaW4gZWNjIChubyBuZWVkIGZvcgorICogZGF0YSBjb3JyZWN0aW9uKQorICoKKyAqIGlmIChlcnJsb2Nbbl0gPCA4KmxlbiksIHRoZW4gbi10aCBlcnJvciBpcyBsb2NhdGVkIGluIGRhdGEgYW5kIGNhbiBiZQorICogY29ycmVjdGVkIHdpdGggc3RhdGVtZW50IGRhdGFbZXJybG9jW25dLzhdIF49IDEgPDwgKGVycmxvY1tuXSAlIDgpOworICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gYW55IGRhdGEgY29ycmVjdGlvbiBieSBpdHNlbGYsIGl0CisgKiBtZXJlbHkgaW5kaWNhdGVzIGVycm9yIGxvY2F0aW9ucy4KKyAqLworaW50IGRlY29kZV9iY2goc3RydWN0IGJjaF9jb250cm9sICpiY2gsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHVuc2lnbmVkIGludCBsZW4sCisJICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlY3ZfZWNjLCBjb25zdCB1aW50OF90ICpjYWxjX2VjYywKKwkgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpzeW4sIHVuc2lnbmVkIGludCAqZXJybG9jKQoreworCWNvbnN0IHVuc2lnbmVkIGludCBlY2Nfd29yZHMgPSBCQ0hfRUNDX1dPUkRTKGJjaCk7CisJdW5zaWduZWQgaW50IG5iaXRzOworCWludCBpLCBlcnIsIG5yb290czsKKwl1aW50MzJfdCBzdW07CisKKwkvKiBzYW5pdHkgY2hlY2s6IG1ha2Ugc3VyZSBkYXRhIGxlbmd0aCBjYW4gYmUgaGFuZGxlZCAqLworCWlmICg4KmxlbiA+IChiY2gtPm4tYmNoLT5lY2NfYml0cykpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogaWYgY2FsbGVyIGRvZXMgbm90IHByb3ZpZGUgc3luZHJvbWVzLCBjb21wdXRlIHRoZW0gKi8KKwlpZiAoIXN5bikgeworCQlpZiAoIWNhbGNfZWNjKSB7CisJCQkvKiBjb21wdXRlIHJlY2VpdmVkIGRhdGEgZWNjIGludG8gYW4gaW50ZXJuYWwgYnVmZmVyICovCisJCQlpZiAoIWRhdGEgfHwgIXJlY3ZfZWNjKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJZW5jb2RlX2JjaChiY2gsIGRhdGEsIGxlbiwgTlVMTCk7CisJCX0gZWxzZSB7CisJCQkvKiBsb2FkIHByb3ZpZGVkIGNhbGN1bGF0ZWQgZWNjICovCisJCQlsb2FkX2VjYzgoYmNoLCBiY2gtPmVjY19idWYsIGNhbGNfZWNjKTsKKwkJfQorCQkvKiBsb2FkIHJlY2VpdmVkIGVjYyBvciBhc3N1bWUgaXQgd2FzIFhPUmVkIGluIGNhbGNfZWNjICovCisJCWlmIChyZWN2X2VjYykgeworCQkJbG9hZF9lY2M4KGJjaCwgYmNoLT5lY2NfYnVmMiwgcmVjdl9lY2MpOworCQkJLyogWE9SIHJlY2VpdmVkIGFuZCBjYWxjdWxhdGVkIGVjYyAqLworCQkJZm9yIChpID0gMCwgc3VtID0gMDsgaSA8IChpbnQpZWNjX3dvcmRzOyBpKyspIHsKKwkJCQliY2gtPmVjY19idWZbaV0gXj0gYmNoLT5lY2NfYnVmMltpXTsKKwkJCQlzdW0gfD0gYmNoLT5lY2NfYnVmW2ldOworCQkJfQorCQkJaWYgKCFzdW0pCisJCQkJLyogbm8gZXJyb3IgZm91bmQgKi8KKwkJCQlyZXR1cm4gMDsKKwkJfQorCQljb21wdXRlX3N5bmRyb21lcyhiY2gsIGJjaC0+ZWNjX2J1ZiwgYmNoLT5zeW4pOworCQlzeW4gPSBiY2gtPnN5bjsKKwl9CisKKwllcnIgPSBjb21wdXRlX2Vycm9yX2xvY2F0b3JfcG9seW5vbWlhbChiY2gsIHN5bik7CisJaWYgKGVyciA+IDApIHsKKwkJbnJvb3RzID0gZmluZF9wb2x5X3Jvb3RzKGJjaCwgMSwgYmNoLT5lbHAsIGVycmxvYyk7CisJCWlmIChlcnIgIT0gbnJvb3RzKQorCQkJZXJyID0gLTE7CisJfQorCWlmIChlcnIgPiAwKSB7CisJCS8qIHBvc3QtcHJvY2VzcyByYXcgZXJyb3IgbG9jYXRpb25zIGZvciBlYXNpZXIgY29ycmVjdGlvbiAqLworCQluYml0cyA9IChsZW4qOCkrYmNoLT5lY2NfYml0czsKKwkJZm9yIChpID0gMDsgaSA8IGVycjsgaSsrKSB7CisJCQlpZiAoZXJybG9jW2ldID49IG5iaXRzKSB7CisJCQkJZXJyID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQllcnJsb2NbaV0gPSBuYml0cy0xLWVycmxvY1tpXTsKKwkJCWVycmxvY1tpXSA9IChlcnJsb2NbaV0gJiB+Nyl8KDctKGVycmxvY1tpXSAmIDcpKTsKKwkJfQorCX0KKwlyZXR1cm4gKGVyciA+PSAwKSA/IGVyciA6IC1FQkFETVNHOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVjb2RlX2JjaCk7CisKKy8qCisgKiBnZW5lcmF0ZSBHYWxvaXMgZmllbGQgbG9va3VwIHRhYmxlcworICovCitzdGF0aWMgaW50IGJ1aWxkX2dmX3RhYmxlcyhzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCwgdW5zaWduZWQgaW50IHBvbHkpCit7CisJdW5zaWduZWQgaW50IGksIHggPSAxOworCWNvbnN0IHVuc2lnbmVkIGludCBrID0gMSA8PCBkZWcocG9seSk7CisKKwkvKiBwcmltaXRpdmUgcG9seW5vbWlhbCBtdXN0IGJlIG9mIGRlZ3JlZSBtICovCisJaWYgKGsgIT0gKDF1IDw8IEdGX00oYmNoKSkpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBHRl9OKGJjaCk7IGkrKykgeworCQliY2gtPmFfcG93X3RhYltpXSA9IHg7CisJCWJjaC0+YV9sb2dfdGFiW3hdID0gaTsKKwkJaWYgKGkgJiYgKHggPT0gMSkpCisJCQkvKiBwb2x5bm9taWFsIGlzIG5vdCBwcmltaXRpdmUgKGFeaT0xIHdpdGggMDxpPDJebS0xKSAqLworCQkJcmV0dXJuIC0xOworCQl4IDw8PSAxOworCQlpZiAoeCAmIGspCisJCQl4IF49IHBvbHk7CisJfQorCWJjaC0+YV9wb3dfdGFiW0dGX04oYmNoKV0gPSAxOworCWJjaC0+YV9sb2dfdGFiWzBdID0gMDsKKworCXJldHVybiAwOworfQorCisvKgorICogY29tcHV0ZSBnZW5lcmF0b3IgcG9seW5vbWlhbCByZW1haW5kZXIgdGFibGVzIGZvciBmYXN0IGVuY29kaW5nCisgKi8KK3N0YXRpYyB2b2lkIGJ1aWxkX21vZDhfdGFibGVzKHN0cnVjdCBiY2hfY29udHJvbCAqYmNoLCBjb25zdCB1aW50MzJfdCAqZykKK3sKKwlpbnQgaSwgaiwgYiwgZDsKKwl1aW50MzJfdCBkYXRhLCBoaSwgbG8sICp0YWI7CisJY29uc3QgaW50IGwgPSBCQ0hfRUNDX1dPUkRTKGJjaCk7CisJY29uc3QgaW50IHBsZW4gPSBESVZfUk9VTkRfVVAoYmNoLT5lY2NfYml0cysxLCAzMik7CisJY29uc3QgaW50IGVjY2xlbiA9IERJVl9ST1VORF9VUChiY2gtPmVjY19iaXRzLCAzMik7CisKKwltZW1zZXQoYmNoLT5tb2Q4X3RhYiwgMCwgNCoyNTYqbCpzaXplb2YoKmJjaC0+bW9kOF90YWIpKTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQkvKiBwKFgpPWkgaXMgYSBzbWFsbCBwb2x5bm9taWFsIG9mIHdlaWdodCA8PSA4ICovCisJCWZvciAoYiA9IDA7IGIgPCA0OyBiKyspIHsKKwkJCS8qIHdlIHdhbnQgdG8gY29tcHV0ZSAocChYKS5YXig4KmIrZGVnKGcpKSkgbW9kIGcoWCkgKi8KKwkJCXRhYiA9IGJjaC0+bW9kOF90YWIgKyAoYioyNTYraSkqbDsKKwkJCWRhdGEgPSBpIDw8ICg4KmIpOworCQkJd2hpbGUgKGRhdGEpIHsKKwkJCQlkID0gZGVnKGRhdGEpOworCQkJCS8qIHN1YnRyYWN0IFheZC5nKFgpIGZyb20gcChYKS5YXig4KmIrZGVnKGcpKSAqLworCQkJCWRhdGEgXj0gZ1swXSA+PiAoMzEtZCk7CisJCQkJZm9yIChqID0gMDsgaiA8IGVjY2xlbjsgaisrKSB7CisJCQkJCWhpID0gKGQgPCAzMSkgPyBnW2pdIDw8IChkKzEpIDogMDsKKwkJCQkJbG8gPSAoaisxIDwgcGxlbikgPworCQkJCQkJZ1tqKzFdID4+ICgzMS1kKSA6IDA7CisJCQkJCXRhYltqXSBePSBoaXxsbzsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBidWlsZCBhIGJhc2UgZm9yIGZhY3RvcmluZyBkZWdyZWUgMiBwb2x5bm9taWFscworICovCitzdGF0aWMgaW50IGJ1aWxkX2RlZzJfYmFzZShzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCkKK3sKKwljb25zdCBpbnQgbSA9IEdGX00oYmNoKTsKKwlpbnQgaSwgaiwgcjsKKwl1bnNpZ25lZCBpbnQgc3VtLCB4LCB5LCByZW1haW5pbmcsIGFrID0gMCwgeGlbbV07CisKKwkvKiBmaW5kIGsgcy50LiBUcihhXmspID0gMSBhbmQgMCA8PSBrIDwgbSAqLworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJZm9yIChqID0gMCwgc3VtID0gMDsgaiA8IG07IGorKykKKwkJCXN1bSBePSBhX3BvdyhiY2gsIGkqKDEgPDwgaikpOworCisJCWlmIChzdW0pIHsKKwkJCWFrID0gYmNoLT5hX3Bvd190YWJbaV07CisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBmaW5kIHhpLCBpPTAuLm0tMSBzdWNoIHRoYXQgeGleMit4aSA9IGFeaStUcihhXmkpLmFeayAqLworCXJlbWFpbmluZyA9IG07CisJbWVtc2V0KHhpLCAwLCBzaXplb2YoeGkpKTsKKworCWZvciAoeCA9IDA7ICh4IDw9IEdGX04oYmNoKSkgJiYgcmVtYWluaW5nOyB4KyspIHsKKwkJeSA9IGdmX3NxcihiY2gsIHgpXng7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCXIgPSBhX2xvZyhiY2gsIHkpOworCQkJaWYgKHkgJiYgKHIgPCBtKSAmJiAheGlbcl0pIHsKKwkJCQliY2gtPnhpX3RhYltyXSA9IHg7CisJCQkJeGlbcl0gPSAxOworCQkJCXJlbWFpbmluZy0tOworCQkJCWRiZygieCVkID0gJXhcbiIsIHIsIHgpOworCQkJCWJyZWFrOworCQkJfQorCQkJeSBePSBhazsKKwkJfQorCX0KKwkvKiBzaG91bGQgbm90IGhhcHBlbiBidXQgY2hlY2sgYW55d2F5ICovCisJcmV0dXJuIHJlbWFpbmluZyA/IC0xIDogMDsKK30KKworc3RhdGljIHZvaWQgKmJjaF9hbGxvYyhzaXplX3Qgc2l6ZSwgaW50ICplcnIpCit7CisJdm9pZCAqcHRyOworCisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocHRyID09IE5VTEwpCisJCSplcnIgPSAxOworCXJldHVybiBwdHI7Cit9CisKKy8qCisgKiBjb21wdXRlIGdlbmVyYXRvciBwb2x5bm9taWFsIGZvciBnaXZlbiAobSx0KSBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgdWludDMyX3QgKmNvbXB1dGVfZ2VuZXJhdG9yX3BvbHlub21pYWwoc3RydWN0IGJjaF9jb250cm9sICpiY2gpCit7CisJY29uc3QgdW5zaWduZWQgaW50IG0gPSBHRl9NKGJjaCk7CisJY29uc3QgdW5zaWduZWQgaW50IHQgPSBHRl9UKGJjaCk7CisJaW50IG4sIGVyciA9IDA7CisJdW5zaWduZWQgaW50IGksIGosIG5iaXRzLCByLCB3b3JkLCAqcm9vdHM7CisJc3RydWN0IGdmX3BvbHkgKmc7CisJdWludDMyX3QgKmdlbnBvbHk7CisKKwlnID0gYmNoX2FsbG9jKEdGX1BPTFlfU1oobSp0KSwgJmVycik7CisJcm9vdHMgPSBiY2hfYWxsb2MoKGJjaC0+bisxKSpzaXplb2YoKnJvb3RzKSwgJmVycik7CisJZ2VucG9seSA9IGJjaF9hbGxvYyhESVZfUk9VTkRfVVAobSp0KzEsIDMyKSpzaXplb2YoKmdlbnBvbHkpLCAmZXJyKTsKKworCWlmIChlcnIpIHsKKwkJa2ZyZWUoZ2VucG9seSk7CisJCWdlbnBvbHkgPSBOVUxMOworCQlnb3RvIGZpbmlzaDsKKwl9CisKKwkvKiBlbnVtZXJhdGUgYWxsIHJvb3RzIG9mIGcoWCkgKi8KKwltZW1zZXQocm9vdHMgLCAwLCAoYmNoLT5uKzEpKnNpemVvZigqcm9vdHMpKTsKKwlmb3IgKGkgPSAwOyBpIDwgdDsgaSsrKSB7CisJCWZvciAoaiA9IDAsIHIgPSAyKmkrMTsgaiA8IG07IGorKykgeworCQkJcm9vdHNbcl0gPSAxOworCQkJciA9IG1vZF9zKGJjaCwgMipyKTsKKwkJfQorCX0KKwkvKiBidWlsZCBnZW5lcmF0b3IgcG9seW5vbWlhbCBnKFgpICovCisJZy0+ZGVnID0gMDsKKwlnLT5jWzBdID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgR0ZfTihiY2gpOyBpKyspIHsKKwkJaWYgKHJvb3RzW2ldKSB7CisJCQkvKiBtdWx0aXBseSBnKFgpIGJ5IChYK3Jvb3QpICovCisJCQlyID0gYmNoLT5hX3Bvd190YWJbaV07CisJCQlnLT5jW2ctPmRlZysxXSA9IDE7CisJCQlmb3IgKGogPSBnLT5kZWc7IGogPiAwOyBqLS0pCisJCQkJZy0+Y1tqXSA9IGdmX211bChiY2gsIGctPmNbal0sIHIpXmctPmNbai0xXTsKKworCQkJZy0+Y1swXSA9IGdmX211bChiY2gsIGctPmNbMF0sIHIpOworCQkJZy0+ZGVnKys7CisJCX0KKwl9CisJLyogc3RvcmUgbGVmdC1qdXN0aWZpZWQgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGcoWCkgKi8KKwluID0gZy0+ZGVnKzE7CisJaSA9IDA7CisKKwl3aGlsZSAobiA+IDApIHsKKwkJbmJpdHMgPSAobiA+IDMyKSA/IDMyIDogbjsKKwkJZm9yIChqID0gMCwgd29yZCA9IDA7IGogPCBuYml0czsgaisrKSB7CisJCQlpZiAoZy0+Y1tuLTEtal0pCisJCQkJd29yZCB8PSAxdSA8PCAoMzEtaik7CisJCX0KKwkJZ2VucG9seVtpKytdID0gd29yZDsKKwkJbiAtPSBuYml0czsKKwl9CisJYmNoLT5lY2NfYml0cyA9IGctPmRlZzsKKworZmluaXNoOgorCWtmcmVlKGcpOworCWtmcmVlKHJvb3RzKTsKKworCXJldHVybiBnZW5wb2x5OworfQorCisvKioKKyAqIGluaXRfYmNoIC0gaW5pdGlhbGl6ZSBhIEJDSCBlbmNvZGVyL2RlY29kZXIKKyAqIEBtOiAgICAgICAgICBHYWxvaXMgZmllbGQgb3JkZXIsIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgNS0xNQorICogQHQ6ICAgICAgICAgIG1heGltdW0gZXJyb3IgY29ycmVjdGlvbiBjYXBhYmlsaXR5LCBpbiBiaXRzCisgKiBAcHJpbV9wb2x5OiAgdXNlci1wcm92aWRlZCBwcmltaXRpdmUgcG9seW5vbWlhbCAob3IgMCB0byB1c2UgZGVmYXVsdCkKKyAqCisgKiBSZXR1cm5zOgorICogIGEgbmV3bHkgYWxsb2NhdGVkIEJDSCBjb250cm9sIHN0cnVjdHVyZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQorICoKKyAqIFRoaXMgaW5pdGlhbGl6YXRpb24gY2FuIHRha2Ugc29tZSB0aW1lLCBhcyBsb29rdXAgdGFibGVzIGFyZSBidWlsdCBmb3IgZmFzdAorICogZW5jb2RpbmcvZGVjb2Rpbmc7IG1ha2Ugc3VyZSBub3QgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20gYSB0aW1lIGNyaXRpY2FsCisgKiBwYXRoLiBVc3VhbGx5LCBpbml0X2JjaCgpIHNob3VsZCBiZSBjYWxsZWQgb24gbW9kdWxlL2RyaXZlciBpbml0IGFuZAorICogZnJlZV9iY2goKSBzaG91bGQgYmUgY2FsbGVkIHRvIHJlbGVhc2UgbWVtb3J5IG9uIGV4aXQuCisgKgorICogWW91IG1heSBwcm92aWRlIHlvdXIgb3duIHByaW1pdGl2ZSBwb2x5bm9taWFsIG9mIGRlZ3JlZSBAbSBpbiBhcmd1bWVudAorICogQHByaW1fcG9seSwgb3IgbGV0IGluaXRfYmNoKCkgdXNlIGl0cyBkZWZhdWx0IHBvbHlub21pYWwuCisgKgorICogT25jZSBpbml0X2JjaCgpIGhhcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQgYSBwb2ludGVyIHRvIGEgbmV3bHkgYWxsb2NhdGVkCisgKiBCQ0ggY29udHJvbCBzdHJ1Y3R1cmUsIGVjYyBsZW5ndGggaW4gYnl0ZXMgaXMgZ2l2ZW4gYnkgbWVtYmVyIEBlY2NfYnl0ZXMgb2YKKyAqIHRoZSBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBiY2hfY29udHJvbCAqaW5pdF9iY2goaW50IG0sIGludCB0LCB1bnNpZ25lZCBpbnQgcHJpbV9wb2x5KQoreworCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGludCBpLCB3b3JkczsKKwl1aW50MzJfdCAqZ2VucG9seTsKKwlzdHJ1Y3QgYmNoX2NvbnRyb2wgKmJjaCA9IE5VTEw7CisKKwljb25zdCBpbnQgbWluX20gPSA1OworCWNvbnN0IGludCBtYXhfbSA9IDE1OworCisJLyogZGVmYXVsdCBwcmltaXRpdmUgcG9seW5vbWlhbHMgKi8KKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHByaW1fcG9seV90YWJbXSA9IHsKKwkJMHgyNSwgMHg0MywgMHg4MywgMHgxMWQsIDB4MjExLCAweDQwOSwgMHg4MDUsIDB4MTA1MywgMHgyMDFiLAorCQkweDQwMmIsIDB4ODAwMywKKwl9OworCisjaWYgZGVmaW5lZChDT05GSUdfQkNIX0NPTlNUX1BBUkFNUykKKwlpZiAoKG0gIT0gKENPTkZJR19CQ0hfQ09OU1RfTSkpIHx8ICh0ICE9IChDT05GSUdfQkNIX0NPTlNUX1QpKSkgeworCQlwcmludGsoS0VSTl9FUlIgImJjaCBlbmNvZGVyL2RlY29kZXIgd2FzIGNvbmZpZ3VyZWQgdG8gc3VwcG9ydCAiCisJCSAgICAgICAicGFyYW1ldGVycyBtPSVkLCB0PSVkIG9ubHkhXG4iLAorCQkgICAgICAgQ09ORklHX0JDSF9DT05TVF9NLCBDT05GSUdfQkNIX0NPTlNUX1QpOworCQlnb3RvIGZhaWw7CisJfQorI2VuZGlmCisJaWYgKChtIDwgbWluX20pIHx8IChtID4gbWF4X20pKQorCQkvKgorCQkgKiB2YWx1ZXMgb2YgbSBncmVhdGVyIHRoYW4gMTUgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkOworCQkgKiBzdXBwb3J0aW5nIG0gPiAxNSB3b3VsZCByZXF1aXJlIGNoYW5naW5nIHRhYmxlIGJhc2UgdHlwZQorCQkgKiAodWludDE2X3QpIGFuZCBhIHNtYWxsIHBhdGNoIGluIG1hdHJpeCB0cmFuc3Bvc2l0aW9uCisJCSAqLworCQlnb3RvIGZhaWw7CisKKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKCh0IDwgMSkgfHwgKG0qdCA+PSAoKDEgPDwgbSktMSkpKQorCQkvKiBpbnZhbGlkIHQgdmFsdWUgKi8KKwkJZ290byBmYWlsOworCisJLyogc2VsZWN0IGEgcHJpbWl0aXZlIHBvbHlub21pYWwgZm9yIGdlbmVyYXRpbmcgR0YoMl5tKSAqLworCWlmIChwcmltX3BvbHkgPT0gMCkKKwkJcHJpbV9wb2x5ID0gcHJpbV9wb2x5X3RhYlttLW1pbl9tXTsKKworCWJjaCA9IGt6YWxsb2Moc2l6ZW9mKCpiY2gpLCBHRlBfS0VSTkVMKTsKKwlpZiAoYmNoID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCWJjaC0+bSA9IG07CisJYmNoLT50ID0gdDsKKwliY2gtPm4gPSAoMSA8PCBtKS0xOworCXdvcmRzICA9IERJVl9ST1VORF9VUChtKnQsIDMyKTsKKwliY2gtPmVjY19ieXRlcyA9IERJVl9ST1VORF9VUChtKnQsIDgpOworCWJjaC0+YV9wb3dfdGFiID0gYmNoX2FsbG9jKCgxK2JjaC0+bikqc2l6ZW9mKCpiY2gtPmFfcG93X3RhYiksICZlcnIpOworCWJjaC0+YV9sb2dfdGFiID0gYmNoX2FsbG9jKCgxK2JjaC0+bikqc2l6ZW9mKCpiY2gtPmFfbG9nX3RhYiksICZlcnIpOworCWJjaC0+bW9kOF90YWIgID0gYmNoX2FsbG9jKHdvcmRzKjEwMjQqc2l6ZW9mKCpiY2gtPm1vZDhfdGFiKSwgJmVycik7CisJYmNoLT5lY2NfYnVmICAgPSBiY2hfYWxsb2Mod29yZHMqc2l6ZW9mKCpiY2gtPmVjY19idWYpLCAmZXJyKTsKKwliY2gtPmVjY19idWYyICA9IGJjaF9hbGxvYyh3b3JkcypzaXplb2YoKmJjaC0+ZWNjX2J1ZjIpLCAmZXJyKTsKKwliY2gtPnhpX3RhYiAgICA9IGJjaF9hbGxvYyhtKnNpemVvZigqYmNoLT54aV90YWIpLCAmZXJyKTsKKwliY2gtPnN5biAgICAgICA9IGJjaF9hbGxvYygyKnQqc2l6ZW9mKCpiY2gtPnN5biksICZlcnIpOworCWJjaC0+Y2FjaGUgICAgID0gYmNoX2FsbG9jKDIqdCpzaXplb2YoKmJjaC0+Y2FjaGUpLCAmZXJyKTsKKwliY2gtPmVscCAgICAgICA9IGJjaF9hbGxvYygodCsxKSpzaXplb2Yoc3RydWN0IGdmX3BvbHlfZGVnMSksICZlcnIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmNoLT5wb2x5XzJ0KTsgaSsrKQorCQliY2gtPnBvbHlfMnRbaV0gPSBiY2hfYWxsb2MoR0ZfUE9MWV9TWigyKnQpLCAmZXJyKTsKKworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCWVyciA9IGJ1aWxkX2dmX3RhYmxlcyhiY2gsIHByaW1fcG9seSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJLyogdXNlIGdlbmVyYXRvciBwb2x5bm9taWFsIGZvciBjb21wdXRpbmcgZW5jb2RpbmcgdGFibGVzICovCisJZ2VucG9seSA9IGNvbXB1dGVfZ2VuZXJhdG9yX3BvbHlub21pYWwoYmNoKTsKKwlpZiAoZ2VucG9seSA9PSBOVUxMKQorCQlnb3RvIGZhaWw7CisKKwlidWlsZF9tb2Q4X3RhYmxlcyhiY2gsIGdlbnBvbHkpOworCWtmcmVlKGdlbnBvbHkpOworCisJZXJyID0gYnVpbGRfZGVnMl9iYXNlKGJjaCk7CisJaWYgKGVycikKKwkJZ290byBmYWlsOworCisJcmV0dXJuIGJjaDsKKworZmFpbDoKKwlmcmVlX2JjaChiY2gpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9iY2gpOworCisvKioKKyAqICBmcmVlX2JjaCAtIGZyZWUgdGhlIEJDSCBjb250cm9sIHN0cnVjdHVyZQorICogIEBiY2g6ICAgIEJDSCBjb250cm9sIHN0cnVjdHVyZSB0byByZWxlYXNlCisgKi8KK3ZvaWQgZnJlZV9iY2goc3RydWN0IGJjaF9jb250cm9sICpiY2gpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoYmNoKSB7CisJCWtmcmVlKGJjaC0+YV9wb3dfdGFiKTsKKwkJa2ZyZWUoYmNoLT5hX2xvZ190YWIpOworCQlrZnJlZShiY2gtPm1vZDhfdGFiKTsKKwkJa2ZyZWUoYmNoLT5lY2NfYnVmKTsKKwkJa2ZyZWUoYmNoLT5lY2NfYnVmMik7CisJCWtmcmVlKGJjaC0+eGlfdGFiKTsKKwkJa2ZyZWUoYmNoLT5zeW4pOworCQlrZnJlZShiY2gtPmNhY2hlKTsKKwkJa2ZyZWUoYmNoLT5lbHApOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJjaC0+cG9seV8ydCk7IGkrKykKKwkJCWtmcmVlKGJjaC0+cG9seV8ydFtpXSk7CisKKwkJa2ZyZWUoYmNoKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX2JjaCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkl2YW4gRGplbGljIDxpdmFuLmRqZWxpY0BwYXJyb3QuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJCaW5hcnkgQkNIIGVuY29kZXIvZGVjb2RlciIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYml0bWFwLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmUzOGE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYml0bWFwLmMKQEAgLTAsMCArMSwxMjM0IEBACisvKgorICogbGliL2JpdG1hcC5jCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBiaXRtYXAuaC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90aHJlYWRfaW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKworLyoKKyAqIGJpdG1hcHMgcHJvdmlkZSBhbiBhcnJheSBvZiBiaXRzLCBpbXBsZW1lbnRlZCB1c2luZyBhbiBhbgorICogYXJyYXkgb2YgdW5zaWduZWQgbG9uZ3MuICBUaGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYQorICogZ2l2ZW4gYml0bWFwIGRvZXMgX25vdF8gbmVlZCB0byBiZSBhbiBleGFjdCBtdWx0aXBsZSBvZgorICogQklUU19QRVJfTE9ORy4KKyAqCisgKiBUaGUgcG9zc2libGUgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QsIHBhcnRpYWxseSB1c2VkIHdvcmQKKyAqIG9mIGEgYml0bWFwIGFyZSAnZG9uJ3QgY2FyZScuICBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMKKyAqIG5vIHBhcnRpY3VsYXIgZWZmb3J0IHRvIGtlZXAgdGhlbSB6ZXJvLiAgSXQgZW5zdXJlcyB0aGF0CisgKiB0aGVpciB2YWx1ZSB3aWxsIG5vdCBhZmZlY3QgdGhlIHJlc3VsdHMgb2YgYW55IG9wZXJhdGlvbi4KKyAqIFRoZSBiaXRtYXAgb3BlcmF0aW9ucyB0aGF0IHJldHVybiBCb29sZWFuIChiaXRtYXBfZW1wdHksCisgKiBmb3IgZXhhbXBsZSkgb3Igc2NhbGFyIChiaXRtYXBfd2VpZ2h0LCBmb3IgZXhhbXBsZSkgcmVzdWx0cworICogY2FyZWZ1bGx5IGZpbHRlciBvdXQgdGhlc2UgdW51c2VkIGJpdHMgZnJvbSBpbXBhY3RpbmcgdGhlaXIKKyAqIHJlc3VsdHMuCisgKgorICogVGhlc2Ugb3BlcmF0aW9ucyBhY3R1YWxseSBob2xkIHRvIGEgc2xpZ2h0bHkgc3Ryb25nZXIgcnVsZToKKyAqIGlmIHlvdSBkb24ndCBpbnB1dCBhbnkgYml0bWFwcyB0byB0aGVzZSBvcHMgdGhhdCBoYXZlIHNvbWUKKyAqIHVudXNlZCBiaXRzIHNldCwgdGhlbiB0aGV5IHdvbid0IG91dHB1dCBhbnkgc2V0IHVudXNlZCBiaXRzCisgKiBpbiBvdXRwdXQgYml0bWFwcy4KKyAqCisgKiBUaGUgYnl0ZSBvcmRlcmluZyBvZiBiaXRtYXBzIGlzIG1vcmUgbmF0dXJhbCBvbiBsaXR0bGUKKyAqIGVuZGlhbiBhcmNoaXRlY3R1cmVzLiAgU2VlIHRoZSBiaWctZW5kaWFuIGhlYWRlcnMKKyAqIGluY2x1ZGUvYXNtLXBwYzY0L2JpdG9wcy5oIGFuZCBpbmNsdWRlL2FzbS1zMzkwL2JpdG9wcy5oCisgKiBmb3IgdGhlIGJlc3QgZXhwbGFuYXRpb25zIG9mIHRoaXMgb3JkZXJpbmcuCisgKi8KKworaW50IF9fYml0bWFwX2VxdWFsKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDEsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisJZm9yIChrID0gMDsgayA8IGxpbTsgKytrKQorCQlpZiAoYml0bWFwMVtrXSAhPSBiaXRtYXAyW2tdKQorCQkJcmV0dXJuIDA7CisKKwlpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpCisJCWlmICgoYml0bWFwMVtrXSBeIGJpdG1hcDJba10pICYgQklUTUFQX0xBU1RfV09SRF9NQVNLKGJpdHMpKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woX19iaXRtYXBfZXF1YWwpOworCit2b2lkIF9fYml0bWFwX2NvbXBsZW1lbnQodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisJZm9yIChrID0gMDsgayA8IGxpbTsgKytrKQorCQlkc3Rba10gPSB+c3JjW2tdOworCisJaWYgKGJpdHMgJSBCSVRTX1BFUl9MT05HKQorCQlkc3Rba10gPSB+c3JjW2tdOworfQorRVhQT1JUX1NZTUJPTChfX2JpdG1hcF9jb21wbGVtZW50KTsKKworLyoqCisgKiBfX2JpdG1hcF9zaGlmdF9yaWdodCAtIGxvZ2ljYWwgcmlnaHQgc2hpZnQgb2YgdGhlIGJpdHMgaW4gYSBiaXRtYXAKKyAqICAgQGRzdCA6IGRlc3RpbmF0aW9uIGJpdG1hcAorICogICBAc3JjIDogc291cmNlIGJpdG1hcAorICogICBAc2hpZnQgOiBzaGlmdCBieSB0aGlzIG1hbnkgYml0cworICogICBAbmJpdHMgOiBiaXRtYXAgc2l6ZSwgaW4gYml0cworICoKKyAqIFNoaWZ0aW5nIHJpZ2h0IChkaXZpZGluZykgbWVhbnMgbW92aW5nIGJpdHMgaW4gdGhlIE1TIC0+IExTIGJpdAorICogZGlyZWN0aW9uLiAgWmVyb3MgYXJlIGZlZCBpbnRvIHRoZSB2YWNhdGVkIE1TIHBvc2l0aW9ucyBhbmQgdGhlCisgKiBMUyBiaXRzIHNoaWZ0ZWQgb2ZmIHRoZSBib3R0b20gYXJlIGxvc3QuCisgKi8KK3ZvaWQgX19iaXRtYXBfc2hpZnRfcmlnaHQodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsCisJCQl1bnNpZ25lZCBzaGlmdCwgdW5zaWduZWQgbmJpdHMpCit7CisJdW5zaWduZWQgaywgbGltID0gQklUU19UT19MT05HUyhuYml0cyk7CisJdW5zaWduZWQgb2ZmID0gc2hpZnQvQklUU19QRVJfTE9ORywgcmVtID0gc2hpZnQgJSBCSVRTX1BFUl9MT05HOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhuYml0cyk7CisJZm9yIChrID0gMDsgb2ZmICsgayA8IGxpbTsgKytrKSB7CisJCXVuc2lnbmVkIGxvbmcgdXBwZXIsIGxvd2VyOworCisJCS8qCisJCSAqIElmIHNoaWZ0IGlzIG5vdCB3b3JkIGFsaWduZWQsIHRha2UgbG93ZXIgcmVtIGJpdHMgb2YKKwkJICogd29yZCBhYm92ZSBhbmQgbWFrZSB0aGVtIHRoZSB0b3AgcmVtIGJpdHMgb2YgcmVzdWx0LgorCQkgKi8KKwkJaWYgKCFyZW0gfHwgb2ZmICsgayArIDEgPj0gbGltKQorCQkJdXBwZXIgPSAwOworCQllbHNlIHsKKwkJCXVwcGVyID0gc3JjW29mZiArIGsgKyAxXTsKKwkJCWlmIChvZmYgKyBrICsgMSA9PSBsaW0gLSAxKQorCQkJCXVwcGVyICY9IG1hc2s7CisJCQl1cHBlciA8PD0gKEJJVFNfUEVSX0xPTkcgLSByZW0pOworCQl9CisJCWxvd2VyID0gc3JjW29mZiArIGtdOworCQlpZiAob2ZmICsgayA9PSBsaW0gLSAxKQorCQkJbG93ZXIgJj0gbWFzazsKKwkJbG93ZXIgPj49IHJlbTsKKwkJZHN0W2tdID0gbG93ZXIgfCB1cHBlcjsKKwl9CisJaWYgKG9mZikKKwkJbWVtc2V0KCZkc3RbbGltIC0gb2ZmXSwgMCwgb2ZmKnNpemVvZih1bnNpZ25lZCBsb25nKSk7Cit9CitFWFBPUlRfU1lNQk9MKF9fYml0bWFwX3NoaWZ0X3JpZ2h0KTsKKworCisvKioKKyAqIF9fYml0bWFwX3NoaWZ0X2xlZnQgLSBsb2dpY2FsIGxlZnQgc2hpZnQgb2YgdGhlIGJpdHMgaW4gYSBiaXRtYXAKKyAqICAgQGRzdCA6IGRlc3RpbmF0aW9uIGJpdG1hcAorICogICBAc3JjIDogc291cmNlIGJpdG1hcAorICogICBAc2hpZnQgOiBzaGlmdCBieSB0aGlzIG1hbnkgYml0cworICogICBAbmJpdHMgOiBiaXRtYXAgc2l6ZSwgaW4gYml0cworICoKKyAqIFNoaWZ0aW5nIGxlZnQgKG11bHRpcGx5aW5nKSBtZWFucyBtb3ZpbmcgYml0cyBpbiB0aGUgTFMgLT4gTVMKKyAqIGRpcmVjdGlvbi4gIFplcm9zIGFyZSBmZWQgaW50byB0aGUgdmFjYXRlZCBMUyBiaXQgcG9zaXRpb25zCisgKiBhbmQgdGhvc2UgTVMgYml0cyBzaGlmdGVkIG9mZiB0aGUgdG9wIGFyZSBsb3N0LgorICovCisKK3ZvaWQgX19iaXRtYXBfc2hpZnRfbGVmdCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKKwkJCXVuc2lnbmVkIGludCBzaGlmdCwgdW5zaWduZWQgaW50IG5iaXRzKQoreworCWludCBrOworCXVuc2lnbmVkIGludCBsaW0gPSBCSVRTX1RPX0xPTkdTKG5iaXRzKTsKKwl1bnNpZ25lZCBpbnQgb2ZmID0gc2hpZnQvQklUU19QRVJfTE9ORywgcmVtID0gc2hpZnQgJSBCSVRTX1BFUl9MT05HOworCWZvciAoayA9IGxpbSAtIG9mZiAtIDE7IGsgPj0gMDsgLS1rKSB7CisJCXVuc2lnbmVkIGxvbmcgdXBwZXIsIGxvd2VyOworCisJCS8qCisJCSAqIElmIHNoaWZ0IGlzIG5vdCB3b3JkIGFsaWduZWQsIHRha2UgdXBwZXIgcmVtIGJpdHMgb2YKKwkJICogd29yZCBiZWxvdyBhbmQgbWFrZSB0aGVtIHRoZSBib3R0b20gcmVtIGJpdHMgb2YgcmVzdWx0LgorCQkgKi8KKwkJaWYgKHJlbSAmJiBrID4gMCkKKwkJCWxvd2VyID0gc3JjW2sgLSAxXSA+PiAoQklUU19QRVJfTE9ORyAtIHJlbSk7CisJCWVsc2UKKwkJCWxvd2VyID0gMDsKKwkJdXBwZXIgPSBzcmNba10gPDwgcmVtOworCQlkc3RbayArIG9mZl0gPSBsb3dlciB8IHVwcGVyOworCX0KKwlpZiAob2ZmKQorCQltZW1zZXQoZHN0LCAwLCBvZmYqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKK30KK0VYUE9SVF9TWU1CT0woX19iaXRtYXBfc2hpZnRfbGVmdCk7CisKK2ludCBfX2JpdG1hcF9hbmQodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrOworCXVuc2lnbmVkIGludCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCisJZm9yIChrID0gMDsgayA8IGxpbTsgaysrKQorCQlyZXN1bHQgfD0gKGRzdFtrXSA9IGJpdG1hcDFba10gJiBiaXRtYXAyW2tdKTsKKwlpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpCisJCXJlc3VsdCB8PSAoZHN0W2tdID0gYml0bWFwMVtrXSAmIGJpdG1hcDJba10gJgorCQkJICAgQklUTUFQX0xBU1RfV09SRF9NQVNLKGJpdHMpKTsKKwlyZXR1cm4gcmVzdWx0ICE9IDA7Cit9CitFWFBPUlRfU1lNQk9MKF9fYml0bWFwX2FuZCk7CisKK3ZvaWQgX19iaXRtYXBfb3IodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrOworCXVuc2lnbmVkIGludCBuciA9IEJJVFNfVE9fTE9OR1MoYml0cyk7CisKKwlmb3IgKGsgPSAwOyBrIDwgbnI7IGsrKykKKwkJZHN0W2tdID0gYml0bWFwMVtrXSB8IGJpdG1hcDJba107Cit9CitFWFBPUlRfU1lNQk9MKF9fYml0bWFwX29yKTsKKwordm9pZCBfX2JpdG1hcF94b3IodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrOworCXVuc2lnbmVkIGludCBuciA9IEJJVFNfVE9fTE9OR1MoYml0cyk7CisKKwlmb3IgKGsgPSAwOyBrIDwgbnI7IGsrKykKKwkJZHN0W2tdID0gYml0bWFwMVtrXSBeIGJpdG1hcDJba107Cit9CitFWFBPUlRfU1lNQk9MKF9fYml0bWFwX3hvcik7CisKK2ludCBfX2JpdG1hcF9hbmRub3QodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAxLAorCQkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrOworCXVuc2lnbmVkIGludCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOworCisJZm9yIChrID0gMDsgayA8IGxpbTsgaysrKQorCQlyZXN1bHQgfD0gKGRzdFtrXSA9IGJpdG1hcDFba10gJiB+Yml0bWFwMltrXSk7CisJaWYgKGJpdHMgJSBCSVRTX1BFUl9MT05HKQorCQlyZXN1bHQgfD0gKGRzdFtrXSA9IGJpdG1hcDFba10gJiB+Yml0bWFwMltrXSAmCisJCQkgICBCSVRNQVBfTEFTVF9XT1JEX01BU0soYml0cykpOworCXJldHVybiByZXN1bHQgIT0gMDsKK30KK0VYUE9SVF9TWU1CT0woX19iaXRtYXBfYW5kbm90KTsKKworaW50IF9fYml0bWFwX2ludGVyc2VjdHMoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMSwKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisJZm9yIChrID0gMDsgayA8IGxpbTsgKytrKQorCQlpZiAoYml0bWFwMVtrXSAmIGJpdG1hcDJba10pCisJCQlyZXR1cm4gMTsKKworCWlmIChiaXRzICUgQklUU19QRVJfTE9ORykKKwkJaWYgKChiaXRtYXAxW2tdICYgYml0bWFwMltrXSkgJiBCSVRNQVBfTEFTVF9XT1JEX01BU0soYml0cykpCisJCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19iaXRtYXBfaW50ZXJzZWN0cyk7CisKK2ludCBfX2JpdG1hcF9zdWJzZXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwMSwKKwkJICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcDIsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBrLCBsaW0gPSBiaXRzL0JJVFNfUEVSX0xPTkc7CisJZm9yIChrID0gMDsgayA8IGxpbTsgKytrKQorCQlpZiAoYml0bWFwMVtrXSAmIH5iaXRtYXAyW2tdKQorCQkJcmV0dXJuIDA7CisKKwlpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpCisJCWlmICgoYml0bWFwMVtrXSAmIH5iaXRtYXAyW2tdKSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhiaXRzKSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChfX2JpdG1hcF9zdWJzZXQpOworCitpbnQgX19iaXRtYXBfd2VpZ2h0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJdW5zaWduZWQgaW50IGssIGxpbSA9IGJpdHMvQklUU19QRVJfTE9ORzsKKwlpbnQgdyA9IDA7CisKKwlmb3IgKGsgPSAwOyBrIDwgbGltOyBrKyspCisJCXcgKz0gaHdlaWdodF9sb25nKGJpdG1hcFtrXSk7CisKKwlpZiAoYml0cyAlIEJJVFNfUEVSX0xPTkcpCisJCXcgKz0gaHdlaWdodF9sb25nKGJpdG1hcFtrXSAmIEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhiaXRzKSk7CisKKwlyZXR1cm4gdzsKK30KK0VYUE9SVF9TWU1CT0woX19iaXRtYXBfd2VpZ2h0KTsKKwordm9pZCBfX2JpdG1hcF9zZXQodW5zaWduZWQgbG9uZyAqbWFwLCB1bnNpZ25lZCBpbnQgc3RhcnQsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyAqcCA9IG1hcCArIEJJVF9XT1JEKHN0YXJ0KTsKKwljb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSA9IHN0YXJ0ICsgbGVuOworCWludCBiaXRzX3RvX3NldCA9IEJJVFNfUEVSX0xPTkcgLSAoc3RhcnQgJSBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfdG9fc2V0ID0gQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCk7CisKKwl3aGlsZSAobGVuIC0gYml0c190b19zZXQgPj0gMCkgeworCQkqcCB8PSBtYXNrX3RvX3NldDsKKwkJbGVuIC09IGJpdHNfdG9fc2V0OworCQliaXRzX3RvX3NldCA9IEJJVFNfUEVSX0xPTkc7CisJCW1hc2tfdG9fc2V0ID0gfjBVTDsKKwkJcCsrOworCX0KKwlpZiAobGVuKSB7CisJCW1hc2tfdG9fc2V0ICY9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKwkJKnAgfD0gbWFza190b19zZXQ7CisJfQorfQorRVhQT1JUX1NZTUJPTChfX2JpdG1hcF9zZXQpOworCit2b2lkIF9fYml0bWFwX2NsZWFyKHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQgaW50IHN0YXJ0LCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSBtYXAgKyBCSVRfV09SRChzdGFydCk7CisJY29uc3QgdW5zaWduZWQgaW50IHNpemUgPSBzdGFydCArIGxlbjsKKwlpbnQgYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkcgLSAoc3RhcnQgJSBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfdG9fY2xlYXIgPSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKworCXdoaWxlIChsZW4gLSBiaXRzX3RvX2NsZWFyID49IDApIHsKKwkJKnAgJj0gfm1hc2tfdG9fY2xlYXI7CisJCWxlbiAtPSBiaXRzX3RvX2NsZWFyOworCQliaXRzX3RvX2NsZWFyID0gQklUU19QRVJfTE9ORzsKKwkJbWFza190b19jbGVhciA9IH4wVUw7CisJCXArKzsKKwl9CisJaWYgKGxlbikgeworCQltYXNrX3RvX2NsZWFyICY9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKwkJKnAgJj0gfm1hc2tfdG9fY2xlYXI7CisJfQorfQorRVhQT1JUX1NZTUJPTChfX2JpdG1hcF9jbGVhcik7CisKKy8qKgorICogYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWFfb2ZmIC0gZmluZCBhIGNvbnRpZ3VvdXMgYWxpZ25lZCB6ZXJvIGFyZWEKKyAqIEBtYXA6IFRoZSBhZGRyZXNzIHRvIGJhc2UgdGhlIHNlYXJjaCBvbgorICogQHNpemU6IFRoZSBiaXRtYXAgc2l6ZSBpbiBiaXRzCisgKiBAc3RhcnQ6IFRoZSBiaXRudW1iZXIgdG8gc3RhcnQgc2VhcmNoaW5nIGF0CisgKiBAbnI6IFRoZSBudW1iZXIgb2YgemVyb2VkIGJpdHMgd2UncmUgbG9va2luZyBmb3IKKyAqIEBhbGlnbl9tYXNrOiBBbGlnbm1lbnQgbWFzayBmb3IgemVybyBhcmVhCisgKiBAYWxpZ25fb2Zmc2V0OiBBbGlnbm1lbnQgb2Zmc2V0IGZvciB6ZXJvIGFyZWEuCisgKgorICogVGhlIEBhbGlnbl9tYXNrIHNob3VsZCBiZSBvbmUgbGVzcyB0aGFuIGEgcG93ZXIgb2YgMjsgdGhlIGVmZmVjdCBpcyB0aGF0CisgKiB0aGUgYml0IG9mZnNldCBvZiBhbGwgemVybyBhcmVhcyB0aGlzIGZ1bmN0aW9uIGZpbmRzIHBsdXMgQGFsaWduX29mZnNldAorICogaXMgbXVsdGlwbGUgb2YgdGhhdCBwb3dlciBvZiAyLgorICovCit1bnNpZ25lZCBsb25nIGJpdG1hcF9maW5kX25leHRfemVyb19hcmVhX29mZih1bnNpZ25lZCBsb25nICptYXAsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG5yLAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzaywKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFsaWduX29mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4LCBlbmQsIGk7CithZ2FpbjoKKwlpbmRleCA9IGZpbmRfbmV4dF96ZXJvX2JpdChtYXAsIHNpemUsIHN0YXJ0KTsKKworCS8qIEFsaWduIGFsbG9jYXRpb24gKi8KKwlpbmRleCA9IF9fQUxJR05fTUFTSyhpbmRleCArIGFsaWduX29mZnNldCwgYWxpZ25fbWFzaykgLSBhbGlnbl9vZmZzZXQ7CisKKwllbmQgPSBpbmRleCArIG5yOworCWlmIChlbmQgPiBzaXplKQorCQlyZXR1cm4gZW5kOworCWkgPSBmaW5kX25leHRfYml0KG1hcCwgZW5kLCBpbmRleCk7CisJaWYgKGkgPCBlbmQpIHsKKwkJc3RhcnQgPSBpICsgMTsKKwkJZ290byBhZ2FpbjsKKwl9CisJcmV0dXJuIGluZGV4OworfQorRVhQT1JUX1NZTUJPTChiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYV9vZmYpOworCisvKgorICogQml0bWFwIHByaW50aW5nICYgcGFyc2luZyBmdW5jdGlvbnM6IGZpcnN0IHZlcnNpb24gYnkgTmFkaWEgWXZldHRlIENoYW1iZXJzLAorICogc2Vjb25kIHZlcnNpb24gYnkgUGF1bCBKYWNrc29uLCB0aGlyZCBieSBKb2UgS29ydHkuCisgKi8KKworI2RlZmluZSBDSFVOS1NaCQkJCTMyCisjZGVmaW5lIG5iaXRzX3RvX2hvbGRfdmFsdWUodmFsKQlmbHModmFsKQorI2RlZmluZSBCQVNFREVDIDEwCQkvKiBmYW5jaWVyIGNwdXNldCBsaXN0cyBpbnB1dCBpbiBkZWNpbWFsICovCisKKy8qKgorICogX19iaXRtYXBfcGFyc2UgLSBjb252ZXJ0IGFuIEFTQ0lJIGhleCBzdHJpbmcgaW50byBhIGJpdG1hcC4KKyAqIEBidWY6IHBvaW50ZXIgdG8gYnVmZmVyIGNvbnRhaW5pbmcgc3RyaW5nLgorICogQGJ1ZmxlbjogYnVmZmVyIHNpemUgaW4gYnl0ZXMuICBJZiBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoaXMKKyAqICAgIHRoZW4gaXQgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSBcMC4KKyAqIEBpc191c2VyOiBsb2NhdGlvbiBvZiBidWZmZXIsIDAgaW5kaWNhdGVzIGtlcm5lbCBzcGFjZQorICogQG1hc2twOiBwb2ludGVyIHRvIGJpdG1hcCBhcnJheSB0aGF0IHdpbGwgY29udGFpbiByZXN1bHQuCisgKiBAbm1hc2tiaXRzOiBzaXplIG9mIGJpdG1hcCwgaW4gYml0cy4KKyAqCisgKiBDb21tYXMgZ3JvdXAgaGV4IGRpZ2l0cyBpbnRvIGNodW5rcy4gIEVhY2ggY2h1bmsgZGVmaW5lcyBleGFjdGx5IDMyCisgKiBiaXRzIG9mIHRoZSByZXN1bHRhbnQgYml0bWFzay4gIE5vIGNodW5rIG1heSBzcGVjaWZ5IGEgdmFsdWUgbGFyZ2VyCisgKiB0aGFuIDMyIGJpdHMgKCUtRU9WRVJGTE9XKSwgYW5kIGlmIGEgY2h1bmsgc3BlY2lmaWVzIGEgc21hbGxlciB2YWx1ZQorICogdGhlbiBsZWFkaW5nIDAtYml0cyBhcmUgcHJlcGVuZGVkLiAgJS1FSU5WQUwgaXMgcmV0dXJuZWQgZm9yIGlsbGVnYWwKKyAqIGNoYXJhY3RlcnMgYW5kIGZvciBncm91cGluZyBlcnJvcnMgc3VjaCBhcyAiMSwsNSIsICIsNDQiLCAiLCIgYW5kICIiLgorICogTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhY2NlcHRlZCwgYnV0IG5vdCBlbWJlZGRlZCB3aGl0ZXNwYWNlLgorICovCitpbnQgX19iaXRtYXBfcGFyc2UoY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgYnVmbGVuLAorCQlpbnQgaXNfdXNlciwgdW5zaWduZWQgbG9uZyAqbWFza3AsCisJCWludCBubWFza2JpdHMpCit7CisJaW50IGMsIG9sZF9jLCB0b3RhbGRpZ2l0cywgbmRpZ2l0cywgbmNodW5rcywgbmJpdHM7CisJdTMyIGNodW5rOworCWNvbnN0IGNoYXIgX191c2VyIF9fZm9yY2UgKnVidWYgPSAoY29uc3QgY2hhciBfX3VzZXIgX19mb3JjZSAqKWJ1ZjsKKworCWJpdG1hcF96ZXJvKG1hc2twLCBubWFza2JpdHMpOworCisJbmNodW5rcyA9IG5iaXRzID0gdG90YWxkaWdpdHMgPSBjID0gMDsKKwlkbyB7CisJCWNodW5rID0gMDsKKwkJbmRpZ2l0cyA9IHRvdGFsZGlnaXRzOworCisJCS8qIEdldCB0aGUgbmV4dCBjaHVuayBvZiB0aGUgYml0bWFwICovCisJCXdoaWxlIChidWZsZW4pIHsKKwkJCW9sZF9jID0gYzsKKwkJCWlmIChpc191c2VyKSB7CisJCQkJaWYgKF9fZ2V0X3VzZXIoYywgdWJ1ZisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQllbHNlCisJCQkJYyA9ICpidWYrKzsKKwkJCWJ1Zmxlbi0tOworCQkJaWYgKGlzc3BhY2UoYykpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgd2FzIGEgc3BhY2UgYW5kIHRoZSBjdXJyZW50CisJCQkgKiBjaGFyYWN0ZXIgaXNuJ3QgJ1wwJywgd2UndmUgZ290IGVtYmVkZGVkIHdoaXRlc3BhY2UuCisJCQkgKiBUaGlzIGlzIGEgbm8tbm8sIHNvIHRocm93IGFuIGVycm9yLgorCQkJICovCisJCQlpZiAodG90YWxkaWdpdHMgJiYgYyAmJiBpc3NwYWNlKG9sZF9jKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogQSAnXDAnIG9yIGEgJywnIHNpZ25hbCB0aGUgZW5kIG9mIHRoZSBjaHVuayAqLworCQkJaWYgKGMgPT0gJ1wwJyB8fCBjID09ICcsJykKKwkJCQlicmVhazsKKworCQkJaWYgKCFpc3hkaWdpdChjKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyoKKwkJCSAqIE1ha2Ugc3VyZSB0aGVyZSBhcmUgYXQgbGVhc3QgNCBmcmVlIGJpdHMgaW4gJ2NodW5rJy4KKwkJCSAqIElmIG5vdCwgdGhpcyBoZXhkaWdpdCB3aWxsIG92ZXJmbG93ICdjaHVuaycsIHNvCisJCQkgKiB0aHJvdyBhbiBlcnJvci4KKwkJCSAqLworCQkJaWYgKGNodW5rICYgfigoMVVMIDw8IChDSFVOS1NaIC0gNCkpIC0gMSkpCisJCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisKKwkJCWNodW5rID0gKGNodW5rIDw8IDQpIHwgaGV4X3RvX2JpbihjKTsKKwkJCXRvdGFsZGlnaXRzKys7CisJCX0KKwkJaWYgKG5kaWdpdHMgPT0gdG90YWxkaWdpdHMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG5jaHVua3MgPT0gMCAmJiBjaHVuayA9PSAwKQorCQkJY29udGludWU7CisKKwkJX19iaXRtYXBfc2hpZnRfbGVmdChtYXNrcCwgbWFza3AsIENIVU5LU1osIG5tYXNrYml0cyk7CisJCSptYXNrcCB8PSBjaHVuazsKKwkJbmNodW5rcysrOworCQluYml0cyArPSAobmNodW5rcyA9PSAxKSA/IG5iaXRzX3RvX2hvbGRfdmFsdWUoY2h1bmspIDogQ0hVTktTWjsKKwkJaWYgKG5iaXRzID4gbm1hc2tiaXRzKQorCQkJcmV0dXJuIC1FT1ZFUkZMT1c7CisJfSB3aGlsZSAoYnVmbGVuICYmIGMgPT0gJywnKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX2JpdG1hcF9wYXJzZSk7CisKKy8qKgorICogYml0bWFwX3BhcnNlX3VzZXIgLSBjb252ZXJ0IGFuIEFTQ0lJIGhleCBzdHJpbmcgaW4gYSB1c2VyIGJ1ZmZlciBpbnRvIGEgYml0bWFwCisgKgorICogQHVidWY6IHBvaW50ZXIgdG8gdXNlciBidWZmZXIgY29udGFpbmluZyBzdHJpbmcuCisgKiBAdWxlbjogYnVmZmVyIHNpemUgaW4gYnl0ZXMuICBJZiBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoaXMKKyAqICAgIHRoZW4gaXQgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSBcMC4KKyAqIEBtYXNrcDogcG9pbnRlciB0byBiaXRtYXAgYXJyYXkgdGhhdCB3aWxsIGNvbnRhaW4gcmVzdWx0LgorICogQG5tYXNrYml0czogc2l6ZSBvZiBiaXRtYXAsIGluIGJpdHMuCisgKgorICogV3JhcHBlciBmb3IgX19iaXRtYXBfcGFyc2UoKSwgcHJvdmlkaW5nIGl0IHdpdGggdXNlciBidWZmZXIuCisgKgorICogV2UgY2Fubm90IGhhdmUgdGhpcyBhcyBhbiBpbmxpbmUgZnVuY3Rpb24gaW4gYml0bWFwLmggYmVjYXVzZSBpdCBuZWVkcworICogbGludXgvdWFjY2Vzcy5oIHRvIGdldCB0aGUgYWNjZXNzX29rKCkgZGVjbGFyYXRpb24gYW5kIHRoaXMgY2F1c2VzCisgKiBjeWNsaWMgZGVwZW5kZW5jaWVzLgorICovCitpbnQgYml0bWFwX3BhcnNlX3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCQl1bnNpZ25lZCBpbnQgdWxlbiwgdW5zaWduZWQgbG9uZyAqbWFza3AsCisJCQlpbnQgbm1hc2tiaXRzKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1YnVmLCB1bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIF9fYml0bWFwX3BhcnNlKChjb25zdCBjaGFyIF9fZm9yY2UgKil1YnVmLAorCQkJCXVsZW4sIDEsIG1hc2twLCBubWFza2JpdHMpOworCit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9wYXJzZV91c2VyKTsKKworLyoqCisgKiBiaXRtYXBfcHJpbnRfdG9fcGFnZWJ1ZiAtIGNvbnZlcnQgYml0bWFwIHRvIGxpc3Qgb3IgaGV4IGZvcm1hdCBBU0NJSSBzdHJpbmcKKyAqIEBsaXN0OiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgYml0bWFwIG11c3QgYmUgbGlzdAorICogQGJ1ZjogcGFnZSBhbGlnbmVkIGJ1ZmZlciBpbnRvIHdoaWNoIHN0cmluZyBpcyBwbGFjZWQKKyAqIEBtYXNrcDogcG9pbnRlciB0byBiaXRtYXAgdG8gY29udmVydAorICogQG5tYXNrYml0czogc2l6ZSBvZiBiaXRtYXAsIGluIGJpdHMKKyAqCisgKiBPdXRwdXQgZm9ybWF0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZGVjaW1hbCBudW1iZXJzIGFuZAorICogcmFuZ2VzIGlmIGxpc3QgaXMgc3BlY2lmaWVkIG9yIGhleCBkaWdpdHMgZ3JvdXBlZCBpbnRvIGNvbW1hLXNlcGFyYXRlZAorICogc2V0cyBvZiA4IGRpZ2l0cy9zZXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gYnVmLgorICoKKyAqIEl0IGlzIGFzc3VtZWQgdGhhdCBAYnVmIGlzIGEgcG9pbnRlciBpbnRvIGEgUEFHRV9TSVpFIGFyZWEgYW5kIHRoYXQKKyAqIHN1ZmZpY2llbnQgc3RvcmFnZSByZW1haW5zIGF0IEBidWYgdG8gYWNjb21tb2RhdGUgdGhlCisgKiBiaXRtYXBfcHJpbnRfdG9fcGFnZWJ1ZigpIG91dHB1dC4KKyAqLworaW50IGJpdG1hcF9wcmludF90b19wYWdlYnVmKGJvb2wgbGlzdCwgY2hhciAqYnVmLCBjb25zdCB1bnNpZ25lZCBsb25nICptYXNrcCwKKwkJCSAgICBpbnQgbm1hc2tiaXRzKQoreworCXB0cmRpZmZfdCBsZW4gPSBQVFJfQUxJR04oYnVmICsgUEFHRV9TSVpFIC0gMSwgUEFHRV9TSVpFKSAtIGJ1ZjsKKwlpbnQgbiA9IDA7CisKKwlpZiAobGVuID4gMSkKKwkJbiA9IGxpc3QgPyBzY25wcmludGYoYnVmLCBsZW4sICIlKnBibFxuIiwgbm1hc2tiaXRzLCBtYXNrcCkgOgorCQkJICAgc2NucHJpbnRmKGJ1ZiwgbGVuLCAiJSpwYlxuIiwgbm1hc2tiaXRzLCBtYXNrcCk7CisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9wcmludF90b19wYWdlYnVmKTsKKworLyoqCisgKiBfX2JpdG1hcF9wYXJzZWxpc3QgLSBjb252ZXJ0IGxpc3QgZm9ybWF0IEFTQ0lJIHN0cmluZyB0byBiaXRtYXAKKyAqIEBidWY6IHJlYWQgbnVsLXRlcm1pbmF0ZWQgdXNlciBzdHJpbmcgZnJvbSB0aGlzIGJ1ZmZlcgorICogQGJ1ZmxlbjogYnVmZmVyIHNpemUgaW4gYnl0ZXMuICBJZiBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoaXMKKyAqICAgIHRoZW4gaXQgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSBcMC4KKyAqIEBpc191c2VyOiBsb2NhdGlvbiBvZiBidWZmZXIsIDAgaW5kaWNhdGVzIGtlcm5lbCBzcGFjZQorICogQG1hc2twOiB3cml0ZSByZXN1bHRpbmcgbWFzayBoZXJlCisgKiBAbm1hc2tiaXRzOiBudW1iZXIgb2YgYml0cyBpbiBtYXNrIHRvIGJlIHdyaXR0ZW4KKyAqCisgKiBJbnB1dCBmb3JtYXQgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBkZWNpbWFsIG51bWJlcnMgYW5kCisgKiByYW5nZXMuICBDb25zZWN1dGl2ZWx5IHNldCBiaXRzIGFyZSBzaG93biBhcyB0d28gaHlwaGVuLXNlcGFyYXRlZAorICogZGVjaW1hbCBudW1iZXJzLCB0aGUgc21hbGxlc3QgYW5kIGxhcmdlc3QgYml0IG51bWJlcnMgc2V0IGluCisgKiB0aGUgcmFuZ2UuCisgKiBPcHRpb25hbGx5IGVhY2ggcmFuZ2UgY2FuIGJlIHBvc3RmaXhlZCB0byBkZW5vdGUgdGhhdCBvbmx5IHBhcnRzIG9mIGl0CisgKiBzaG91bGQgYmUgc2V0LiBUaGUgcmFuZ2Ugd2lsbCBkaXZpZGVkIHRvIGdyb3VwcyBvZiBzcGVjaWZpYyBzaXplLgorICogRnJvbSBlYWNoIGdyb3VwIHdpbGwgYmUgdXNlZCBvbmx5IGRlZmluZWQgYW1vdW50IG9mIGJpdHMuCisgKiBTeW50YXg6IHJhbmdlOnVzZWRfc2l6ZS9ncm91cF9zaXplCisgKiBFeGFtcGxlOiAwLTEwMjM6Mi8yNTYgPT0+IDAsMSwyNTYsMjU3LDUxMiw1MTMsNzY4LDc2OQorICoKKyAqIFJldHVybnM6IDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGludmFsaWQgaW5wdXQgc3RyaW5ncy4gRXJyb3IgdmFsdWVzOgorICoKKyAqICAgLSBgYC1FSU5WQUxgYDogc2Vjb25kIG51bWJlciBpbiByYW5nZSBzbWFsbGVyIHRoYW4gZmlyc3QKKyAqICAgLSBgYC1FSU5WQUxgYDogaW52YWxpZCBjaGFyYWN0ZXIgaW4gc3RyaW5nCisgKiAgIC0gYGAtRVJBTkdFYGA6IGJpdCBudW1iZXIgc3BlY2lmaWVkIHRvbyBsYXJnZSBmb3IgbWFzaworICovCitzdGF0aWMgaW50IF9fYml0bWFwX3BhcnNlbGlzdChjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBidWZsZW4sCisJCWludCBpc191c2VyLCB1bnNpZ25lZCBsb25nICptYXNrcCwKKwkJaW50IG5tYXNrYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgYSwgYiwgb2xkX2EsIG9sZF9iOworCXVuc2lnbmVkIGludCBncm91cF9zaXplLCB1c2VkX3NpemUsIG9mZjsKKwlpbnQgYywgb2xkX2MsIHRvdGFsZGlnaXRzLCBuZGlnaXRzOworCWNvbnN0IGNoYXIgX191c2VyIF9fZm9yY2UgKnVidWYgPSAoY29uc3QgY2hhciBfX3VzZXIgX19mb3JjZSAqKWJ1ZjsKKwlpbnQgYXRfc3RhcnQsIGluX3JhbmdlLCBpbl9wYXJ0aWFsX3JhbmdlOworCisJdG90YWxkaWdpdHMgPSBjID0gMDsKKwlvbGRfYSA9IG9sZF9iID0gMDsKKwlncm91cF9zaXplID0gdXNlZF9zaXplID0gMDsKKwliaXRtYXBfemVybyhtYXNrcCwgbm1hc2tiaXRzKTsKKwlkbyB7CisJCWF0X3N0YXJ0ID0gMTsKKwkJaW5fcmFuZ2UgPSAwOworCQlpbl9wYXJ0aWFsX3JhbmdlID0gMDsKKwkJYSA9IGIgPSAwOworCQluZGlnaXRzID0gdG90YWxkaWdpdHM7CisKKwkJLyogR2V0IHRoZSBuZXh0IGNwdSMgb3IgYSByYW5nZSBvZiBjcHUjJ3MgKi8KKwkJd2hpbGUgKGJ1ZmxlbikgeworCQkJb2xkX2MgPSBjOworCQkJaWYgKGlzX3VzZXIpIHsKKwkJCQlpZiAoX19nZXRfdXNlcihjLCB1YnVmKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0gZWxzZQorCQkJCWMgPSAqYnVmKys7CisJCQlidWZsZW4tLTsKKwkJCWlmIChpc3NwYWNlKGMpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBBICdcMCcgb3IgYSAnLCcgc2lnbmFsIHRoZSBlbmQgb2YgYSBjcHUjIG9yIHJhbmdlICovCisJCQlpZiAoYyA9PSAnXDAnIHx8IGMgPT0gJywnKQorCQkJCWJyZWFrOworCQkJLyoKKwkJCSogd2hpdGVzcGFjZXMgYmV0d2VlbiBkaWdpdHMgYXJlIG5vdCBhbGxvd2VkLAorCQkJKiBidXQgaXQncyBvayBpZiB3aGl0ZXNwYWNlcyBhcmUgb24gaGVhZCBvciB0YWlsLgorCQkJKiB3aGVuIG9sZF9jIGlzIHdoaWxlc3BhY2UsCisJCQkqIGlmIHRvdGFsZGlnaXRzID09IG5kaWdpdHMsIHdoaXRlc3BhY2UgaXMgb24gaGVhZC4KKwkJCSogaWYgd2hpdGVzcGFjZSBpcyBvbiB0YWlsLCBpdCBzaG91bGQgbm90IHJ1biBoZXJlLgorCQkJKiBhcyBjIHdhcyAnLCcgb3IgJ1wwJywKKwkJCSogdGhlIGxhc3QgY29kZSBsaW5lIGhhcyBicm9rZW4gdGhlIGN1cnJlbnQgbG9vcC4KKwkJCSovCisJCQlpZiAoKHRvdGFsZGlnaXRzICE9IG5kaWdpdHMpICYmIGlzc3BhY2Uob2xkX2MpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAoYyA9PSAnLycpIHsKKwkJCQl1c2VkX3NpemUgPSBhOworCQkJCWF0X3N0YXJ0ID0gMTsKKwkJCQlpbl9yYW5nZSA9IDA7CisJCQkJYSA9IGIgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoYyA9PSAnOicpIHsKKwkJCQlvbGRfYSA9IGE7CisJCQkJb2xkX2IgPSBiOworCQkJCWF0X3N0YXJ0ID0gMTsKKwkJCQlpbl9yYW5nZSA9IDA7CisJCQkJaW5fcGFydGlhbF9yYW5nZSA9IDE7CisJCQkJYSA9IGIgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoYyA9PSAnLScpIHsKKwkJCQlpZiAoYXRfc3RhcnQgfHwgaW5fcmFuZ2UpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWIgPSAwOworCQkJCWluX3JhbmdlID0gMTsKKwkJCQlhdF9zdGFydCA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmICghaXNkaWdpdChjKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJYiA9IGIgKiAxMCArIChjIC0gJzAnKTsKKwkJCWlmICghaW5fcmFuZ2UpCisJCQkJYSA9IGI7CisJCQlhdF9zdGFydCA9IDA7CisJCQl0b3RhbGRpZ2l0cysrOworCQl9CisJCWlmIChuZGlnaXRzID09IHRvdGFsZGlnaXRzKQorCQkJY29udGludWU7CisJCWlmIChpbl9wYXJ0aWFsX3JhbmdlKSB7CisJCQlncm91cF9zaXplID0gYTsKKwkJCWEgPSBvbGRfYTsKKwkJCWIgPSBvbGRfYjsKKwkJCW9sZF9hID0gb2xkX2IgPSAwOworCQl9IGVsc2UgeworCQkJdXNlZF9zaXplID0gZ3JvdXBfc2l6ZSA9IGIgLSBhICsgMTsKKwkJfQorCQkvKiBpZiBubyBkaWdpdCBpcyBhZnRlciAnLScsIGl0J3Mgd3JvbmcqLworCQlpZiAoYXRfc3RhcnQgJiYgaW5fcmFuZ2UpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCEoYSA8PSBiKSB8fCBncm91cF9zaXplID09IDAgfHwgISh1c2VkX3NpemUgPD0gZ3JvdXBfc2l6ZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGIgPj0gbm1hc2tiaXRzKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCXdoaWxlIChhIDw9IGIpIHsKKwkJCW9mZiA9IG1pbihiIC0gYSArIDEsIHVzZWRfc2l6ZSk7CisJCQliaXRtYXBfc2V0KG1hc2twLCBhLCBvZmYpOworCQkJYSArPSBncm91cF9zaXplOworCQl9CisJfSB3aGlsZSAoYnVmbGVuICYmIGMgPT0gJywnKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGJpdG1hcF9wYXJzZWxpc3QoY29uc3QgY2hhciAqYnAsIHVuc2lnbmVkIGxvbmcgKm1hc2twLCBpbnQgbm1hc2tiaXRzKQoreworCWNoYXIgKm5sICA9IHN0cmNocm51bChicCwgJ1xuJyk7CisJaW50IGxlbiA9IG5sIC0gYnA7CisKKwlyZXR1cm4gX19iaXRtYXBfcGFyc2VsaXN0KGJwLCBsZW4sIDAsIG1hc2twLCBubWFza2JpdHMpOworfQorRVhQT1JUX1NZTUJPTChiaXRtYXBfcGFyc2VsaXN0KTsKKworCisvKioKKyAqIGJpdG1hcF9wYXJzZWxpc3RfdXNlcigpCisgKgorICogQHVidWY6IHBvaW50ZXIgdG8gdXNlciBidWZmZXIgY29udGFpbmluZyBzdHJpbmcuCisgKiBAdWxlbjogYnVmZmVyIHNpemUgaW4gYnl0ZXMuICBJZiBzdHJpbmcgaXMgc21hbGxlciB0aGFuIHRoaXMKKyAqICAgIHRoZW4gaXQgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSBcMC4KKyAqIEBtYXNrcDogcG9pbnRlciB0byBiaXRtYXAgYXJyYXkgdGhhdCB3aWxsIGNvbnRhaW4gcmVzdWx0LgorICogQG5tYXNrYml0czogc2l6ZSBvZiBiaXRtYXAsIGluIGJpdHMuCisgKgorICogV3JhcHBlciBmb3IgYml0bWFwX3BhcnNlbGlzdCgpLCBwcm92aWRpbmcgaXQgd2l0aCB1c2VyIGJ1ZmZlci4KKyAqCisgKiBXZSBjYW5ub3QgaGF2ZSB0aGlzIGFzIGFuIGlubGluZSBmdW5jdGlvbiBpbiBiaXRtYXAuaCBiZWNhdXNlIGl0IG5lZWRzCisgKiBsaW51eC91YWNjZXNzLmggdG8gZ2V0IHRoZSBhY2Nlc3Nfb2soKSBkZWNsYXJhdGlvbiBhbmQgdGhpcyBjYXVzZXMKKyAqIGN5Y2xpYyBkZXBlbmRlbmNpZXMuCisgKi8KK2ludCBiaXRtYXBfcGFyc2VsaXN0X3VzZXIoY29uc3QgY2hhciBfX3VzZXIgKnVidWYsCisJCQl1bnNpZ25lZCBpbnQgdWxlbiwgdW5zaWduZWQgbG9uZyAqbWFza3AsCisJCQlpbnQgbm1hc2tiaXRzKQoreworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCB1YnVmLCB1bGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIF9fYml0bWFwX3BhcnNlbGlzdCgoY29uc3QgY2hhciBfX2ZvcmNlICopdWJ1ZiwKKwkJCQkJdWxlbiwgMSwgbWFza3AsIG5tYXNrYml0cyk7Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9wYXJzZWxpc3RfdXNlcik7CisKKworLyoqCisgKiBiaXRtYXBfcG9zX3RvX29yZCAtIGZpbmQgb3JkaW5hbCBvZiBzZXQgYml0IGF0IGdpdmVuIHBvc2l0aW9uIGluIGJpdG1hcAorICoJQGJ1ZjogcG9pbnRlciB0byBhIGJpdG1hcAorICoJQHBvczogYSBiaXQgcG9zaXRpb24gaW4gQGJ1ZiAoMCA8PSBAcG9zIDwgQG5iaXRzKQorICoJQG5iaXRzOiBudW1iZXIgb2YgdmFsaWQgYml0IHBvc2l0aW9ucyBpbiBAYnVmCisgKgorICogTWFwIHRoZSBiaXQgYXQgcG9zaXRpb24gQHBvcyBpbiBAYnVmIChvZiBsZW5ndGggQG5iaXRzKSB0byB0aGUKKyAqIG9yZGluYWwgb2Ygd2hpY2ggc2V0IGJpdCBpdCBpcy4gIElmIGl0IGlzIG5vdCBzZXQgb3IgaWYgQHBvcworICogaXMgbm90IGEgdmFsaWQgYml0IHBvc2l0aW9uLCBtYXAgdG8gLTEuCisgKgorICogSWYgZm9yIGV4YW1wbGUsIGp1c3QgYml0cyA0IHRocm91Z2ggNyBhcmUgc2V0IGluIEBidWYsIHRoZW4gQHBvcworICogdmFsdWVzIDQgdGhyb3VnaCA3IHdpbGwgZ2V0IG1hcHBlZCB0byAwIHRocm91Z2ggMywgcmVzcGVjdGl2ZWx5LAorICogYW5kIG90aGVyIEBwb3MgdmFsdWVzIHdpbGwgZ2V0IG1hcHBlZCB0byAtMS4gIFdoZW4gQHBvcyB2YWx1ZSA3CisgKiBnZXRzIG1hcHBlZCB0byAocmV0dXJucykgQG9yZCB2YWx1ZSAzIGluIHRoaXMgZXhhbXBsZSwgdGhhdCBtZWFucworICogdGhhdCBiaXQgNyBpcyB0aGUgM3JkIChzdGFydGluZyB3aXRoIDB0aCkgc2V0IGJpdCBpbiBAYnVmLgorICoKKyAqIFRoZSBiaXQgcG9zaXRpb25zIDAgdGhyb3VnaCBAYml0cyBhcmUgdmFsaWQgcG9zaXRpb25zIGluIEBidWYuCisgKi8KK3N0YXRpYyBpbnQgYml0bWFwX3Bvc190b19vcmQoY29uc3QgdW5zaWduZWQgbG9uZyAqYnVmLCB1bnNpZ25lZCBpbnQgcG9zLCB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisJaWYgKHBvcyA+PSBuYml0cyB8fCAhdGVzdF9iaXQocG9zLCBidWYpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gX19iaXRtYXBfd2VpZ2h0KGJ1ZiwgcG9zKTsKK30KKworLyoqCisgKiBiaXRtYXBfb3JkX3RvX3BvcyAtIGZpbmQgcG9zaXRpb24gb2Ygbi10aCBzZXQgYml0IGluIGJpdG1hcAorICoJQGJ1ZjogcG9pbnRlciB0byBiaXRtYXAKKyAqCUBvcmQ6IG9yZGluYWwgYml0IHBvc2l0aW9uIChuLXRoIHNldCBiaXQsIG4gPj0gMCkKKyAqCUBuYml0czogbnVtYmVyIG9mIHZhbGlkIGJpdCBwb3NpdGlvbnMgaW4gQGJ1ZgorICoKKyAqIE1hcCB0aGUgb3JkaW5hbCBvZmZzZXQgb2YgYml0IEBvcmQgaW4gQGJ1ZiB0byBpdHMgcG9zaXRpb24gaW4gQGJ1Zi4KKyAqIFZhbHVlIG9mIEBvcmQgc2hvdWxkIGJlIGluIHJhbmdlIDAgPD0gQG9yZCA8IHdlaWdodChidWYpLiBJZiBAb3JkCisgKiA+PSB3ZWlnaHQoYnVmKSwgcmV0dXJucyBAbmJpdHMuCisgKgorICogSWYgZm9yIGV4YW1wbGUsIGp1c3QgYml0cyA0IHRocm91Z2ggNyBhcmUgc2V0IGluIEBidWYsIHRoZW4gQG9yZAorICogdmFsdWVzIDAgdGhyb3VnaCAzIHdpbGwgZ2V0IG1hcHBlZCB0byA0IHRocm91Z2ggNywgcmVzcGVjdGl2ZWx5LAorICogYW5kIGFsbCBvdGhlciBAb3JkIHZhbHVlcyByZXR1cm5zIEBuYml0cy4gIFdoZW4gQG9yZCB2YWx1ZSAzCisgKiBnZXRzIG1hcHBlZCB0byAocmV0dXJucykgQHBvcyB2YWx1ZSA3IGluIHRoaXMgZXhhbXBsZSwgdGhhdCBtZWFucworICogdGhhdCB0aGUgM3JkIHNldCBiaXQgKHN0YXJ0aW5nIHdpdGggMHRoKSBpcyBhdCBwb3NpdGlvbiA3IGluIEBidWYuCisgKgorICogVGhlIGJpdCBwb3NpdGlvbnMgMCB0aHJvdWdoIEBuYml0cy0xIGFyZSB2YWxpZCBwb3NpdGlvbnMgaW4gQGJ1Zi4KKyAqLwordW5zaWduZWQgaW50IGJpdG1hcF9vcmRfdG9fcG9zKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJ1ZiwgdW5zaWduZWQgaW50IG9yZCwgdW5zaWduZWQgaW50IG5iaXRzKQoreworCXVuc2lnbmVkIGludCBwb3M7CisKKwlmb3IgKHBvcyA9IGZpbmRfZmlyc3RfYml0KGJ1ZiwgbmJpdHMpOworCSAgICAgcG9zIDwgbmJpdHMgJiYgb3JkOworCSAgICAgcG9zID0gZmluZF9uZXh0X2JpdChidWYsIG5iaXRzLCBwb3MgKyAxKSkKKwkJb3JkLS07CisKKwlyZXR1cm4gcG9zOworfQorCisvKioKKyAqIGJpdG1hcF9yZW1hcCAtIEFwcGx5IG1hcCBkZWZpbmVkIGJ5IGEgcGFpciBvZiBiaXRtYXBzIHRvIGFub3RoZXIgYml0bWFwCisgKglAZHN0OiByZW1hcHBlZCByZXN1bHQKKyAqCUBzcmM6IHN1YnNldCB0byBiZSByZW1hcHBlZAorICoJQG9sZDogZGVmaW5lcyBkb21haW4gb2YgbWFwCisgKglAbmV3OiBkZWZpbmVzIHJhbmdlIG9mIG1hcAorICoJQG5iaXRzOiBudW1iZXIgb2YgYml0cyBpbiBlYWNoIG9mIHRoZXNlIGJpdG1hcHMKKyAqCisgKiBMZXQgQG9sZCBhbmQgQG5ldyBkZWZpbmUgYSBtYXBwaW5nIG9mIGJpdCBwb3NpdGlvbnMsIHN1Y2ggdGhhdAorICogd2hhdGV2ZXIgcG9zaXRpb24gaXMgaGVsZCBieSB0aGUgbi10aCBzZXQgYml0IGluIEBvbGQgaXMgbWFwcGVkCisgKiB0byB0aGUgbi10aCBzZXQgYml0IGluIEBuZXcuICBJbiB0aGUgbW9yZSBnZW5lcmFsIGNhc2UsIGFsbG93aW5nCisgKiBmb3IgdGhlIHBvc3NpYmlsaXR5IHRoYXQgdGhlIHdlaWdodCAndycgb2YgQG5ldyBpcyBsZXNzIHRoYW4gdGhlCisgKiB3ZWlnaHQgb2YgQG9sZCwgbWFwIHRoZSBwb3NpdGlvbiBvZiB0aGUgbi10aCBzZXQgYml0IGluIEBvbGQgdG8KKyAqIHRoZSBwb3NpdGlvbiBvZiB0aGUgbS10aCBzZXQgYml0IGluIEBuZXcsIHdoZXJlIG0gPT0gbiAlIHcuCisgKgorICogSWYgZWl0aGVyIG9mIHRoZSBAb2xkIGFuZCBAbmV3IGJpdG1hcHMgYXJlIGVtcHR5LCBvciBpZiBAc3JjIGFuZAorICogQGRzdCBwb2ludCB0byB0aGUgc2FtZSBsb2NhdGlvbiwgdGhlbiB0aGlzIHJvdXRpbmUgY29waWVzIEBzcmMKKyAqIHRvIEBkc3QuCisgKgorICogVGhlIHBvc2l0aW9ucyBvZiB1bnNldCBiaXRzIGluIEBvbGQgYXJlIG1hcHBlZCB0byB0aGVtc2VsdmVzCisgKiAodGhlIGlkZW50aWZ5IG1hcCkuCisgKgorICogQXBwbHkgdGhlIGFib3ZlIHNwZWNpZmllZCBtYXBwaW5nIHRvIEBzcmMsIHBsYWNpbmcgdGhlIHJlc3VsdCBpbgorICogQGRzdCwgY2xlYXJpbmcgYW55IGJpdHMgcHJldmlvdXNseSBzZXQgaW4gQGRzdC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgbGV0cyBzYXkgdGhhdCBAb2xkIGhhcyBiaXRzIDQgdGhyb3VnaCA3IHNldCwgYW5kCisgKiBAbmV3IGhhcyBiaXRzIDEyIHRocm91Z2ggMTUgc2V0LiAgVGhpcyBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIGJpdAorICogcG9zaXRpb24gNCB0byAxMiwgNSB0byAxMywgNiB0byAxNCBhbmQgNyB0byAxNSwgYW5kIG9mIGFsbCBvdGhlcgorICogYml0IHBvc2l0aW9ucyB1bmNoYW5nZWQuICBTbyBpZiBzYXkgQHNyYyBjb21lcyBpbnRvIHRoaXMgcm91dGluZQorICogd2l0aCBiaXRzIDEsIDUgYW5kIDcgc2V0LCB0aGVuIEBkc3Qgc2hvdWxkIGxlYXZlIHdpdGggYml0cyAxLAorICogMTMgYW5kIDE1IHNldC4KKyAqLwordm9pZCBiaXRtYXBfcmVtYXAodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKm9sZCwgY29uc3QgdW5zaWduZWQgbG9uZyAqbmV3LAorCQl1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisJdW5zaWduZWQgaW50IG9sZGJpdCwgdzsKKworCWlmIChkc3QgPT0gc3JjKQkJLyogZm9sbG93aW5nIGRvZXNuJ3QgaGFuZGxlIGlucGxhY2UgcmVtYXBzICovCisJCXJldHVybjsKKwliaXRtYXBfemVybyhkc3QsIG5iaXRzKTsKKworCXcgPSBiaXRtYXBfd2VpZ2h0KG5ldywgbmJpdHMpOworCWZvcl9lYWNoX3NldF9iaXQob2xkYml0LCBzcmMsIG5iaXRzKSB7CisJCWludCBuID0gYml0bWFwX3Bvc190b19vcmQob2xkLCBvbGRiaXQsIG5iaXRzKTsKKworCQlpZiAobiA8IDAgfHwgdyA9PSAwKQorCQkJc2V0X2JpdChvbGRiaXQsIGRzdCk7CS8qIGlkZW50aXR5IG1hcCAqLworCQllbHNlCisJCQlzZXRfYml0KGJpdG1hcF9vcmRfdG9fcG9zKG5ldywgbiAlIHcsIG5iaXRzKSwgZHN0KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9yZW1hcCk7CisKKy8qKgorICogYml0bWFwX2JpdHJlbWFwIC0gQXBwbHkgbWFwIGRlZmluZWQgYnkgYSBwYWlyIG9mIGJpdG1hcHMgdG8gYSBzaW5nbGUgYml0CisgKglAb2xkYml0OiBiaXQgcG9zaXRpb24gdG8gYmUgbWFwcGVkCisgKglAb2xkOiBkZWZpbmVzIGRvbWFpbiBvZiBtYXAKKyAqCUBuZXc6IGRlZmluZXMgcmFuZ2Ugb2YgbWFwCisgKglAYml0czogbnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBvZiB0aGVzZSBiaXRtYXBzCisgKgorICogTGV0IEBvbGQgYW5kIEBuZXcgZGVmaW5lIGEgbWFwcGluZyBvZiBiaXQgcG9zaXRpb25zLCBzdWNoIHRoYXQKKyAqIHdoYXRldmVyIHBvc2l0aW9uIGlzIGhlbGQgYnkgdGhlIG4tdGggc2V0IGJpdCBpbiBAb2xkIGlzIG1hcHBlZAorICogdG8gdGhlIG4tdGggc2V0IGJpdCBpbiBAbmV3LiAgSW4gdGhlIG1vcmUgZ2VuZXJhbCBjYXNlLCBhbGxvd2luZworICogZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB3ZWlnaHQgJ3cnIG9mIEBuZXcgaXMgbGVzcyB0aGFuIHRoZQorICogd2VpZ2h0IG9mIEBvbGQsIG1hcCB0aGUgcG9zaXRpb24gb2YgdGhlIG4tdGggc2V0IGJpdCBpbiBAb2xkIHRvCisgKiB0aGUgcG9zaXRpb24gb2YgdGhlIG0tdGggc2V0IGJpdCBpbiBAbmV3LCB3aGVyZSBtID09IG4gJSB3LgorICoKKyAqIFRoZSBwb3NpdGlvbnMgb2YgdW5zZXQgYml0cyBpbiBAb2xkIGFyZSBtYXBwZWQgdG8gdGhlbXNlbHZlcworICogKHRoZSBpZGVudGlmeSBtYXApLgorICoKKyAqIEFwcGx5IHRoZSBhYm92ZSBzcGVjaWZpZWQgbWFwcGluZyB0byBiaXQgcG9zaXRpb24gQG9sZGJpdCwgcmV0dXJuaW5nCisgKiB0aGUgbmV3IGJpdCBwb3NpdGlvbi4KKyAqCisgKiBGb3IgZXhhbXBsZSwgbGV0cyBzYXkgdGhhdCBAb2xkIGhhcyBiaXRzIDQgdGhyb3VnaCA3IHNldCwgYW5kCisgKiBAbmV3IGhhcyBiaXRzIDEyIHRocm91Z2ggMTUgc2V0LiAgVGhpcyBkZWZpbmVzIHRoZSBtYXBwaW5nIG9mIGJpdAorICogcG9zaXRpb24gNCB0byAxMiwgNSB0byAxMywgNiB0byAxNCBhbmQgNyB0byAxNSwgYW5kIG9mIGFsbCBvdGhlcgorICogYml0IHBvc2l0aW9ucyB1bmNoYW5nZWQuICBTbyBpZiBzYXkgQG9sZGJpdCBpcyA1LCB0aGVuIHRoaXMgcm91dGluZQorICogcmV0dXJucyAxMy4KKyAqLworaW50IGJpdG1hcF9iaXRyZW1hcChpbnQgb2xkYml0LCBjb25zdCB1bnNpZ25lZCBsb25nICpvbGQsCisJCQkJY29uc3QgdW5zaWduZWQgbG9uZyAqbmV3LCBpbnQgYml0cykKK3sKKwlpbnQgdyA9IGJpdG1hcF93ZWlnaHQobmV3LCBiaXRzKTsKKwlpbnQgbiA9IGJpdG1hcF9wb3NfdG9fb3JkKG9sZCwgb2xkYml0LCBiaXRzKTsKKwlpZiAobiA8IDAgfHwgdyA9PSAwKQorCQlyZXR1cm4gb2xkYml0OworCWVsc2UKKwkJcmV0dXJuIGJpdG1hcF9vcmRfdG9fcG9zKG5ldywgbiAlIHcsIGJpdHMpOworfQorRVhQT1JUX1NZTUJPTChiaXRtYXBfYml0cmVtYXApOworCisvKioKKyAqIGJpdG1hcF9vbnRvIC0gdHJhbnNsYXRlIG9uZSBiaXRtYXAgcmVsYXRpdmUgdG8gYW5vdGhlcgorICoJQGRzdDogcmVzdWx0aW5nIHRyYW5zbGF0ZWQgYml0bWFwCisgKiAJQG9yaWc6IG9yaWdpbmFsIHVudHJhbnNsYXRlZCBiaXRtYXAKKyAqIAlAcmVsbWFwOiBiaXRtYXAgcmVsYXRpdmUgdG8gd2hpY2ggdHJhbnNsYXRlZAorICoJQGJpdHM6IG51bWJlciBvZiBiaXRzIGluIGVhY2ggb2YgdGhlc2UgYml0bWFwcworICoKKyAqIFNldCB0aGUgbi10aCBiaXQgb2YgQGRzdCBpZmYgdGhlcmUgZXhpc3RzIHNvbWUgbSBzdWNoIHRoYXQgdGhlCisgKiBuLXRoIGJpdCBvZiBAcmVsbWFwIGlzIHNldCwgdGhlIG0tdGggYml0IG9mIEBvcmlnIGlzIHNldCwgYW5kCisgKiB0aGUgbi10aCBiaXQgb2YgQHJlbG1hcCBpcyBhbHNvIHRoZSBtLXRoIF9zZXRfIGJpdCBvZiBAcmVsbWFwLgorICogKElmIHlvdSB1bmRlcnN0b29kIHRoZSBwcmV2aW91cyBzZW50ZW5jZSB0aGUgZmlyc3QgdGltZSB5b3VyCisgKiByZWFkIGl0LCB5b3UncmUgb3ZlcnF1YWxpZmllZCBmb3IgeW91ciBjdXJyZW50IGpvYi4pCisgKgorICogSW4gb3RoZXIgd29yZHMsIEBvcmlnIGlzIG1hcHBlZCBvbnRvIChzdXJqZWN0aXZlbHkpIEBkc3QsCisgKiB1c2luZyB0aGUgbWFwIHsgPG4sIG0+IHwgdGhlIG4tdGggYml0IG9mIEByZWxtYXAgaXMgdGhlCisgKiBtLXRoIHNldCBiaXQgb2YgQHJlbG1hcCB9LgorICoKKyAqIEFueSBzZXQgYml0cyBpbiBAb3JpZyBhYm92ZSBiaXQgbnVtYmVyIFcsIHdoZXJlIFcgaXMgdGhlCisgKiB3ZWlnaHQgb2YgKG51bWJlciBvZiBzZXQgYml0cyBpbikgQHJlbG1hcCBhcmUgbWFwcGVkIG5vd2hlcmUuCisgKiBJbiBwYXJ0aWN1bGFyLCBpZiBmb3IgYWxsIGJpdHMgbSBzZXQgaW4gQG9yaWcsIG0gPj0gVywgdGhlbgorICogQGRzdCB3aWxsIGVuZCB1cCBlbXB0eS4gIEluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHBvc3NpYmlsaXR5CisgKiBvZiBzdWNoIGFuIGVtcHR5IHJlc3VsdCBpcyBub3QgZGVzaXJlZCwgb25lIHdheSB0byBhdm9pZCBpdCBpcworICogdG8gdXNlIHRoZSBiaXRtYXBfZm9sZCgpIG9wZXJhdG9yLCBiZWxvdywgdG8gZmlyc3QgZm9sZCB0aGUKKyAqIEBvcmlnIGJpdG1hcCBvdmVyIGl0c2VsZiBzbyB0aGF0IGFsbCBpdHMgc2V0IGJpdHMgeCBhcmUgaW4gdGhlCisgKiByYW5nZSAwIDw9IHggPCBXLiAgVGhlIGJpdG1hcF9mb2xkKCkgb3BlcmF0b3IgZG9lcyB0aGlzIGJ5CisgKiBzZXR0aW5nIHRoZSBiaXQgKG0gJSBXKSBpbiBAZHN0LCBmb3IgZWFjaCBiaXQgKG0pIHNldCBpbiBAb3JpZy4KKyAqCisgKiBFeGFtcGxlIFsxXSBmb3IgYml0bWFwX29udG8oKToKKyAqICBMZXQncyBzYXkgQHJlbG1hcCBoYXMgYml0cyAzMC0zOSBzZXQsIGFuZCBAb3JpZyBoYXMgYml0cworICogIDEsIDMsIDUsIDcsIDkgYW5kIDExIHNldC4gIFRoZW4gb24gcmV0dXJuIGZyb20gdGhpcyByb3V0aW5lLAorICogIEBkc3Qgd2lsbCBoYXZlIGJpdHMgMzEsIDMzLCAzNSwgMzcgYW5kIDM5IHNldC4KKyAqCisgKiAgV2hlbiBiaXQgMCBpcyBzZXQgaW4gQG9yaWcsIGl0IG1lYW5zIHR1cm4gb24gdGhlIGJpdCBpbgorICogIEBkc3QgY29ycmVzcG9uZGluZyB0byB3aGF0ZXZlciBpcyB0aGUgZmlyc3QgYml0IChpZiBhbnkpCisgKiAgdGhhdCBpcyB0dXJuZWQgb24gaW4gQHJlbG1hcC4gIFNpbmNlIGJpdCAwIHdhcyBvZmYgaW4gdGhlCisgKiAgYWJvdmUgZXhhbXBsZSwgd2UgbGVhdmUgb2ZmIHRoYXQgYml0IChiaXQgMzApIGluIEBkc3QuCisgKgorICogIFdoZW4gYml0IDEgaXMgc2V0IGluIEBvcmlnIChhcyBpbiB0aGUgYWJvdmUgZXhhbXBsZSksIGl0CisgKiAgbWVhbnMgdHVybiBvbiB0aGUgYml0IGluIEBkc3QgY29ycmVzcG9uZGluZyB0byB3aGF0ZXZlcgorICogIGlzIHRoZSBzZWNvbmQgYml0IHRoYXQgaXMgdHVybmVkIG9uIGluIEByZWxtYXAuICBUaGUgc2Vjb25kCisgKiAgYml0IGluIEByZWxtYXAgdGhhdCB3YXMgdHVybmVkIG9uIGluIHRoZSBhYm92ZSBleGFtcGxlIHdhcworICogIGJpdCAzMSwgc28gd2UgdHVybmVkIG9uIGJpdCAzMSBpbiBAZHN0LgorICoKKyAqICBTaW1pbGFybHksIHdlIHR1cm5lZCBvbiBiaXRzIDMzLCAzNSwgMzcgYW5kIDM5IGluIEBkc3QsCisgKiAgYmVjYXVzZSB0aGV5IHdlcmUgdGhlIDR0aCwgNnRoLCA4dGggYW5kIDEwdGggc2V0IGJpdHMKKyAqICBzZXQgaW4gQHJlbG1hcCwgYW5kIHRoZSA0dGgsIDZ0aCwgOHRoIGFuZCAxMHRoIGJpdHMgb2YKKyAqICBAb3JpZyAoaS5lLiBiaXRzIDMsIDUsIDcgYW5kIDkpIHdlcmUgYWxzbyBzZXQuCisgKgorICogIFdoZW4gYml0IDExIGlzIHNldCBpbiBAb3JpZywgaXQgbWVhbnMgdHVybiBvbiB0aGUgYml0IGluCisgKiAgQGRzdCBjb3JyZXNwb25kaW5nIHRvIHdoYXRldmVyIGlzIHRoZSB0d2VsZnRoIGJpdCB0aGF0IGlzCisgKiAgdHVybmVkIG9uIGluIEByZWxtYXAuICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlcmUgd2VyZQorICogIG9ubHkgdGVuIGJpdHMgdHVybmVkIG9uIGluIEByZWxtYXAgKDMwLi4zOSksIHNvIHRoYXQgYml0CisgKiAgMTEgd2FzIHNldCBpbiBAb3JpZyBoYWQgbm8gYWZmZWN0IG9uIEBkc3QuCisgKgorICogRXhhbXBsZSBbMl0gZm9yIGJpdG1hcF9mb2xkKCkgKyBiaXRtYXBfb250bygpOgorICogIExldCdzIHNheSBAcmVsbWFwIGhhcyB0aGVzZSB0ZW4gYml0cyBzZXQ6OgorICoKKyAqCQk0MCA0MSA0MiA0MyA0NSA0OCA1MyA2MSA3NCA5NQorICoKKyAqICAoZm9yIHRoZSBjdXJpb3VzLCB0aGF0J3MgNDAgcGx1cyB0aGUgZmlyc3QgdGVuIHRlcm1zIG9mIHRoZQorICogIEZpYm9uYWNjaSBzZXF1ZW5jZS4pCisgKgorICogIEZ1cnRoZXIgbGV0cyBzYXkgd2UgdXNlIHRoZSBmb2xsb3dpbmcgY29kZSwgaW52b2tpbmcKKyAqICBiaXRtYXBfZm9sZCgpIHRoZW4gYml0bWFwX29udG8sIGFzIHN1Z2dlc3RlZCBhYm92ZSB0bworICogIGF2b2lkIHRoZSBwb3NzaWJpbGl0eSBvZiBhbiBlbXB0eSBAZHN0IHJlc3VsdDo6CisgKgorICoJdW5zaWduZWQgbG9uZyAqdG1wOwkvLyBhIHRlbXBvcmFyeSBiaXRtYXAncyBiaXRzCisgKgorICoJYml0bWFwX2ZvbGQodG1wLCBvcmlnLCBiaXRtYXBfd2VpZ2h0KHJlbG1hcCwgYml0cyksIGJpdHMpOworICoJYml0bWFwX29udG8oZHN0LCB0bXAsIHJlbG1hcCwgYml0cyk7CisgKgorICogIFRoZW4gdGhpcyB0YWJsZSBzaG93cyB3aGF0IHZhcmlvdXMgdmFsdWVzIG9mIEBkc3Qgd291bGQgYmUsIGZvcgorICogIHZhcmlvdXMgQG9yaWcncy4gIEkgbGlzdCB0aGUgemVyby1iYXNlZCBwb3NpdGlvbnMgb2YgZWFjaCBzZXQgYml0LgorICogIFRoZSB0bXAgY29sdW1uIHNob3dzIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0LCBhcyBjb21wdXRlZCBieQorICogIHVzaW5nIGJpdG1hcF9mb2xkKCkgdG8gZm9sZCB0aGUgQG9yaWcgYml0bWFwIG1vZHVsbyB0ZW4KKyAqICAodGhlIHdlaWdodCBvZiBAcmVsbWFwKToKKyAqCisgKiAgICAgID09PT09PT09PT09PT09PSA9PT09PT09PT09PT09PSA9PT09PT09PT09PT09PT09PQorICogICAgICBAb3JpZyAgICAgICAgICAgdG1wICAgICAgICAgICAgQGRzdAorICogICAgICAwICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgNDAKKyAqICAgICAgMSAgICAgICAgICAgICAgICAxICAgICAgICAgICAgIDQxCisgKiAgICAgIDkgICAgICAgICAgICAgICAgOSAgICAgICAgICAgICA5NQorICogICAgICAxMCAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgNDAgWyNmMV1fCisgKiAgICAgIDEgMyA1IDcgICAgICAgICAgMSAzIDUgNyAgICAgICA0MSA0MyA0OCA2MQorICogICAgICAwIDEgMiAzIDQgICAgICAgIDAgMSAyIDMgNCAgICAgNDAgNDEgNDIgNDMgNDUKKyAqICAgICAgMCA5IDE4IDI3ICAgICAgICAwIDkgOCA3ICAgICAgIDQwIDYxIDc0IDk1CisgKiAgICAgIDAgMTAgMjAgMzAgICAgICAgMCAgICAgICAgICAgICA0MAorICogICAgICAwIDExIDIyIDMzICAgICAgIDAgMSAyIDMgICAgICAgNDAgNDEgNDIgNDMKKyAqICAgICAgMCAxMiAyNCAzNiAgICAgICAwIDIgNCA2ICAgICAgIDQwIDQyIDQ1IDUzCisgKiAgICAgIDc4IDEwMiAyMTEgICAgICAgMSAyIDggICAgICAgICA0MSA0MiA3NCBbI2YxXV8KKyAqICAgICAgPT09PT09PT09PT09PT09ID09PT09PT09PT09PT09ID09PT09PT09PT09PT09PT09CisgKgorICogLi4gWyNmMV0KKyAqCisgKiAgICAgRm9yIHRoZXNlIG1hcmtlZCBsaW5lcywgaWYgd2UgaGFkbid0IGZpcnN0IGRvbmUgYml0bWFwX2ZvbGQoKQorICogICAgIGludG8gdG1wLCB0aGVuIHRoZSBAZHN0IHJlc3VsdCB3b3VsZCBoYXZlIGJlZW4gZW1wdHkuCisgKgorICogSWYgZWl0aGVyIG9mIEBvcmlnIG9yIEByZWxtYXAgaXMgZW1wdHkgKG5vIHNldCBiaXRzKSwgdGhlbiBAZHN0CisgKiB3aWxsIGJlIHJldHVybmVkIGVtcHR5LgorICoKKyAqIElmIChhcyBleHBsYWluZWQgYWJvdmUpIHRoZSBvbmx5IHNldCBiaXRzIGluIEBvcmlnIGFyZSBpbiBwb3NpdGlvbnMKKyAqIG0gd2hlcmUgbSA+PSBXLCAod2hlcmUgVyBpcyB0aGUgd2VpZ2h0IG9mIEByZWxtYXApIHRoZW4gQGRzdCB3aWxsCisgKiBvbmNlIGFnYWluIGJlIHJldHVybmVkIGVtcHR5LgorICoKKyAqIEFsbCBiaXRzIGluIEBkc3Qgbm90IHNldCBieSB0aGUgYWJvdmUgcnVsZSBhcmUgY2xlYXJlZC4KKyAqLwordm9pZCBiaXRtYXBfb250byh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKm9yaWcsCisJCQljb25zdCB1bnNpZ25lZCBsb25nICpyZWxtYXAsIHVuc2lnbmVkIGludCBiaXRzKQoreworCXVuc2lnbmVkIGludCBuLCBtOwkvKiBzYW1lIG1lYW5pbmcgYXMgaW4gYWJvdmUgY29tbWVudCAqLworCisJaWYgKGRzdCA9PSBvcmlnKQkvKiBmb2xsb3dpbmcgZG9lc24ndCBoYW5kbGUgaW5wbGFjZSBtYXBwaW5ncyAqLworCQlyZXR1cm47CisJYml0bWFwX3plcm8oZHN0LCBiaXRzKTsKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBjb2RlIGlzIGEgbW9yZSBlZmZpY2llbnQsIGJ1dCBsZXNzCisJICogb2J2aW91cywgZXF1aXZhbGVudCB0byB0aGUgbG9vcDoKKwkgKglmb3IgKG0gPSAwOyBtIDwgYml0bWFwX3dlaWdodChyZWxtYXAsIGJpdHMpOyBtKyspIHsKKwkgKgkJbiA9IGJpdG1hcF9vcmRfdG9fcG9zKG9yaWcsIG0sIGJpdHMpOworCSAqCQlpZiAodGVzdF9iaXQobSwgb3JpZykpCisJICoJCQlzZXRfYml0KG4sIGRzdCk7CisJICoJfQorCSAqLworCisJbSA9IDA7CisJZm9yX2VhY2hfc2V0X2JpdChuLCByZWxtYXAsIGJpdHMpIHsKKwkJLyogbSA9PSBiaXRtYXBfcG9zX3RvX29yZChyZWxtYXAsIG4sIGJpdHMpICovCisJCWlmICh0ZXN0X2JpdChtLCBvcmlnKSkKKwkJCXNldF9iaXQobiwgZHN0KTsKKwkJbSsrOworCX0KK30KK0VYUE9SVF9TWU1CT0woYml0bWFwX29udG8pOworCisvKioKKyAqIGJpdG1hcF9mb2xkIC0gZm9sZCBsYXJnZXIgYml0bWFwIGludG8gc21hbGxlciwgbW9kdWxvIHNwZWNpZmllZCBzaXplCisgKglAZHN0OiByZXN1bHRpbmcgc21hbGxlciBiaXRtYXAKKyAqCUBvcmlnOiBvcmlnaW5hbCBsYXJnZXIgYml0bWFwCisgKglAc3o6IHNwZWNpZmllZCBzaXplCisgKglAbmJpdHM6IG51bWJlciBvZiBiaXRzIGluIGVhY2ggb2YgdGhlc2UgYml0bWFwcworICoKKyAqIEZvciBlYWNoIGJpdCBvbGRiaXQgaW4gQG9yaWcsIHNldCBiaXQgb2xkYml0IG1vZCBAc3ogaW4gQGRzdC4KKyAqIENsZWFyIGFsbCBvdGhlciBiaXRzIGluIEBkc3QuICBTZWUgZnVydGhlciB0aGUgY29tbWVudCBhbmQKKyAqIEV4YW1wbGUgWzJdIGZvciBiaXRtYXBfb250bygpIGZvciB3aHkgYW5kIGhvdyB0byB1c2UgdGhpcy4KKyAqLwordm9pZCBiaXRtYXBfZm9sZCh1bnNpZ25lZCBsb25nICpkc3QsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKm9yaWcsCisJCQl1bnNpZ25lZCBpbnQgc3osIHVuc2lnbmVkIGludCBuYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgb2xkYml0OworCisJaWYgKGRzdCA9PSBvcmlnKQkvKiBmb2xsb3dpbmcgZG9lc24ndCBoYW5kbGUgaW5wbGFjZSBtYXBwaW5ncyAqLworCQlyZXR1cm47CisJYml0bWFwX3plcm8oZHN0LCBuYml0cyk7CisKKwlmb3JfZWFjaF9zZXRfYml0KG9sZGJpdCwgb3JpZywgbmJpdHMpCisJCXNldF9iaXQob2xkYml0ICUgc3osIGRzdCk7Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9mb2xkKTsKKworLyoKKyAqIENvbW1vbiBjb2RlIGZvciBiaXRtYXBfKl9yZWdpb24oKSByb3V0aW5lcy4KKyAqCWJpdG1hcDogYXJyYXkgb2YgdW5zaWduZWQgbG9uZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgYml0bWFwCisgKglwb3M6IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbgorICoJb3JkZXI6IHJlZ2lvbiBzaXplIChsb2cgYmFzZSAyIG9mIG51bWJlciBvZiBiaXRzKQorICoJcmVnX29wOiBvcGVyYXRpb24ocykgdG8gcGVyZm9ybSBvbiB0aGF0IHJlZ2lvbiBvZiBiaXRtYXAKKyAqCisgKiBDYW4gc2V0LCB2ZXJpZnkgYW5kL29yIHJlbGVhc2UgYSByZWdpb24gb2YgYml0cyBpbiBhIGJpdG1hcCwKKyAqIGRlcGVuZGluZyBvbiB3aGljaCBjb21iaW5hdGlvbiBvZiBSRUdfT1BfKiBmbGFnIGJpdHMgaXMgc2V0LgorICoKKyAqIEEgcmVnaW9uIG9mIGEgYml0bWFwIGlzIGEgc2VxdWVuY2Ugb2YgYml0cyBpbiB0aGUgYml0bWFwLCBvZgorICogc29tZSBzaXplICcxIDw8IG9yZGVyJyAoYSBwb3dlciBvZiB0d28pLCBhbGlnbmVkIHRvIHRoYXQgc2FtZQorICogJzEgPDwgb3JkZXInIHBvd2VyIG9mIHR3by4KKyAqCisgKiBSZXR1cm5zIDEgaWYgUkVHX09QX0lTRlJFRSBzdWNjZWVkcyAocmVnaW9uIGlzIGFsbCB6ZXJvIGJpdHMpLgorICogUmV0dXJucyAwIGluIGFsbCBvdGhlciBjYXNlcyBhbmQgcmVnX29wcy4KKyAqLworCitlbnVtIHsKKwlSRUdfT1BfSVNGUkVFLAkJLyogdHJ1ZSBpZiByZWdpb24gaXMgYWxsIHplcm8gYml0cyAqLworCVJFR19PUF9BTExPQywJCS8qIHNldCBhbGwgYml0cyBpbiByZWdpb24gKi8KKwlSRUdfT1BfUkVMRUFTRSwJCS8qIGNsZWFyIGFsbCBiaXRzIGluIHJlZ2lvbiAqLworfTsKKworc3RhdGljIGludCBfX3JlZ19vcCh1bnNpZ25lZCBsb25nICpiaXRtYXAsIHVuc2lnbmVkIGludCBwb3MsIGludCBvcmRlciwgaW50IHJlZ19vcCkKK3sKKwlpbnQgbmJpdHNfcmVnOwkJLyogbnVtYmVyIG9mIGJpdHMgaW4gcmVnaW9uICovCisJaW50IGluZGV4OwkJLyogaW5kZXggZmlyc3QgbG9uZyBvZiByZWdpb24gaW4gYml0bWFwICovCisJaW50IG9mZnNldDsJCS8qIGJpdCBvZmZzZXQgcmVnaW9uIGluIGJpdG1hcFtpbmRleF0gKi8KKwlpbnQgbmxvbmdzX3JlZzsJCS8qIG51bSBsb25ncyBzcGFubmVkIGJ5IHJlZ2lvbiBpbiBiaXRtYXAgKi8KKwlpbnQgbmJpdHNpbmxvbmc7CS8qIG51bSBiaXRzIG9mIHJlZ2lvbiBpbiBlYWNoIHNwYW5uZWQgbG9uZyAqLworCXVuc2lnbmVkIGxvbmcgbWFzazsJLyogYml0bWFzayBmb3Igb25lIGxvbmcgb2YgcmVnaW9uICovCisJaW50IGk7CQkJLyogc2NhbnMgYml0bWFwIGJ5IGxvbmdzICovCisJaW50IHJldCA9IDA7CQkvKiByZXR1cm4gdmFsdWUgKi8KKworCS8qCisJICogRWl0aGVyIG5sb25nc19yZWcgPT0gMSAoZm9yIHNtYWxsIG9yZGVycyB0aGF0IGZpdCBpbiBvbmUgbG9uZykKKwkgKiBvciAob2Zmc2V0ID09IDAgJiYgbWFzayA9PSB+MFVMKSAoZm9yIGxhcmdlciBtdWx0aXdvcmQgb3JkZXJzLikKKwkgKi8KKwluYml0c19yZWcgPSAxIDw8IG9yZGVyOworCWluZGV4ID0gcG9zIC8gQklUU19QRVJfTE9ORzsKKwlvZmZzZXQgPSBwb3MgLSAoaW5kZXggKiBCSVRTX1BFUl9MT05HKTsKKwlubG9uZ3NfcmVnID0gQklUU19UT19MT05HUyhuYml0c19yZWcpOworCW5iaXRzaW5sb25nID0gbWluKG5iaXRzX3JlZywgIEJJVFNfUEVSX0xPTkcpOworCisJLyoKKwkgKiBDYW4ndCBkbyAibWFzayA9ICgxVUwgPDwgbmJpdHNpbmxvbmcpIC0gMSIsIGFzIHRoYXQKKwkgKiBvdmVyZmxvd3MgaWYgbmJpdHNpbmxvbmcgPT0gQklUU19QRVJfTE9ORy4KKwkgKi8KKwltYXNrID0gKDFVTCA8PCAobmJpdHNpbmxvbmcgLSAxKSk7CisJbWFzayArPSBtYXNrIC0gMTsKKwltYXNrIDw8PSBvZmZzZXQ7CisKKwlzd2l0Y2ggKHJlZ19vcCkgeworCWNhc2UgUkVHX09QX0lTRlJFRToKKwkJZm9yIChpID0gMDsgaSA8IG5sb25nc19yZWc7IGkrKykgeworCQkJaWYgKGJpdG1hcFtpbmRleCArIGldICYgbWFzaykKKwkJCQlnb3RvIGRvbmU7CisJCX0KKwkJcmV0ID0gMTsJLyogYWxsIGJpdHMgaW4gcmVnaW9uIGZyZWUgKHplcm8pICovCisJCWJyZWFrOworCisJY2FzZSBSRUdfT1BfQUxMT0M6CisJCWZvciAoaSA9IDA7IGkgPCBubG9uZ3NfcmVnOyBpKyspCisJCQliaXRtYXBbaW5kZXggKyBpXSB8PSBtYXNrOworCQlicmVhazsKKworCWNhc2UgUkVHX09QX1JFTEVBU0U6CisJCWZvciAoaSA9IDA7IGkgPCBubG9uZ3NfcmVnOyBpKyspCisJCQliaXRtYXBbaW5kZXggKyBpXSAmPSB+bWFzazsKKwkJYnJlYWs7CisJfQorZG9uZToKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uIC0gZmluZCBhIGNvbnRpZ3VvdXMgYWxpZ25lZCBtZW0gcmVnaW9uCisgKglAYml0bWFwOiBhcnJheSBvZiB1bnNpZ25lZCBsb25ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBiaXRtYXAKKyAqCUBiaXRzOiBudW1iZXIgb2YgYml0cyBpbiB0aGUgYml0bWFwCisgKglAb3JkZXI6IHJlZ2lvbiBzaXplIChsb2cgYmFzZSAyIG9mIG51bWJlciBvZiBiaXRzKSB0byBmaW5kCisgKgorICogRmluZCBhIHJlZ2lvbiBvZiBmcmVlICh6ZXJvKSBiaXRzIGluIGEgQGJpdG1hcCBvZiBAYml0cyBiaXRzIGFuZAorICogYWxsb2NhdGUgdGhlbSAoc2V0IHRoZW0gdG8gb25lKS4gIE9ubHkgY29uc2lkZXIgcmVnaW9ucyBvZiBsZW5ndGgKKyAqIGEgcG93ZXIgKEBvcmRlcikgb2YgdHdvLCBhbGlnbmVkIHRvIHRoYXQgcG93ZXIgb2YgdHdvLCB3aGljaAorICogbWFrZXMgdGhlIHNlYXJjaCBhbGdvcml0aG0gbXVjaCBmYXN0ZXIuCisgKgorICogUmV0dXJuIHRoZSBiaXQgb2Zmc2V0IGluIGJpdG1hcCBvZiB0aGUgYWxsb2NhdGVkIHJlZ2lvbiwKKyAqIG9yIC1lcnJubyBvbiBmYWlsdXJlLgorICovCitpbnQgYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24odW5zaWduZWQgbG9uZyAqYml0bWFwLCB1bnNpZ25lZCBpbnQgYml0cywgaW50IG9yZGVyKQoreworCXVuc2lnbmVkIGludCBwb3MsIGVuZDsJCS8qIHNjYW5zIGJpdG1hcCBieSByZWdpb25zIG9mIHNpemUgb3JkZXIgKi8KKworCWZvciAocG9zID0gMCA7IChlbmQgPSBwb3MgKyAoMVUgPDwgb3JkZXIpKSA8PSBiaXRzOyBwb3MgPSBlbmQpIHsKKwkJaWYgKCFfX3JlZ19vcChiaXRtYXAsIHBvcywgb3JkZXIsIFJFR19PUF9JU0ZSRUUpKQorCQkJY29udGludWU7CisJCV9fcmVnX29wKGJpdG1hcCwgcG9zLCBvcmRlciwgUkVHX09QX0FMTE9DKTsKKwkJcmV0dXJuIHBvczsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9maW5kX2ZyZWVfcmVnaW9uKTsKKworLyoqCisgKiBiaXRtYXBfcmVsZWFzZV9yZWdpb24gLSByZWxlYXNlIGFsbG9jYXRlZCBiaXRtYXAgcmVnaW9uCisgKglAYml0bWFwOiBhcnJheSBvZiB1bnNpZ25lZCBsb25ncyBjb3JyZXNwb25kaW5nIHRvIHRoZSBiaXRtYXAKKyAqCUBwb3M6IGJlZ2lubmluZyBvZiBiaXQgcmVnaW9uIHRvIHJlbGVhc2UKKyAqCUBvcmRlcjogcmVnaW9uIHNpemUgKGxvZyBiYXNlIDIgb2YgbnVtYmVyIG9mIGJpdHMpIHRvIHJlbGVhc2UKKyAqCisgKiBUaGlzIGlzIHRoZSBjb21wbGVtZW50IHRvIF9fYml0bWFwX2ZpbmRfZnJlZV9yZWdpb24oKSBhbmQgcmVsZWFzZXMKKyAqIHRoZSBmb3VuZCByZWdpb24gKGJ5IGNsZWFyaW5nIGl0IGluIHRoZSBiaXRtYXApLgorICoKKyAqIE5vIHJldHVybiB2YWx1ZS4KKyAqLwordm9pZCBiaXRtYXBfcmVsZWFzZV9yZWdpb24odW5zaWduZWQgbG9uZyAqYml0bWFwLCB1bnNpZ25lZCBpbnQgcG9zLCBpbnQgb3JkZXIpCit7CisJX19yZWdfb3AoYml0bWFwLCBwb3MsIG9yZGVyLCBSRUdfT1BfUkVMRUFTRSk7Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF9yZWxlYXNlX3JlZ2lvbik7CisKKy8qKgorICogYml0bWFwX2FsbG9jYXRlX3JlZ2lvbiAtIGFsbG9jYXRlIGJpdG1hcCByZWdpb24KKyAqCUBiaXRtYXA6IGFycmF5IG9mIHVuc2lnbmVkIGxvbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJpdG1hcAorICoJQHBvczogYmVnaW5uaW5nIG9mIGJpdCByZWdpb24gdG8gYWxsb2NhdGUKKyAqCUBvcmRlcjogcmVnaW9uIHNpemUgKGxvZyBiYXNlIDIgb2YgbnVtYmVyIG9mIGJpdHMpIHRvIGFsbG9jYXRlCisgKgorICogQWxsb2NhdGUgKHNldCBiaXRzIGluKSBhIHNwZWNpZmllZCByZWdpb24gb2YgYSBiaXRtYXAuCisgKgorICogUmV0dXJuIDAgb24gc3VjY2Vzcywgb3IgJS1FQlVTWSBpZiBzcGVjaWZpZWQgcmVnaW9uIHdhc24ndAorICogZnJlZSAobm90IGFsbCBiaXRzIHdlcmUgemVybykuCisgKi8KK2ludCBiaXRtYXBfYWxsb2NhdGVfcmVnaW9uKHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IHBvcywgaW50IG9yZGVyKQoreworCWlmICghX19yZWdfb3AoYml0bWFwLCBwb3MsIG9yZGVyLCBSRUdfT1BfSVNGUkVFKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gX19yZWdfb3AoYml0bWFwLCBwb3MsIG9yZGVyLCBSRUdfT1BfQUxMT0MpOworfQorRVhQT1JUX1NZTUJPTChiaXRtYXBfYWxsb2NhdGVfcmVnaW9uKTsKKworLyoqCisgKiBiaXRtYXBfZnJvbV91MzJhcnJheSAtIGNvcHkgdGhlIGNvbnRlbnRzIG9mIGEgdTMyIGFycmF5IG9mIGJpdHMgdG8gYml0bWFwCisgKglAYml0bWFwOiBhcnJheSBvZiB1bnNpZ25lZCBsb25ncywgdGhlIGRlc3RpbmF0aW9uIGJpdG1hcCwgbm9uIE5VTEwKKyAqCUBuYml0czogbnVtYmVyIG9mIGJpdHMgaW4gQGJpdG1hcAorICoJQGJ1ZjogYXJyYXkgb2YgdTMyIChpbiBob3N0IGJ5dGUgb3JkZXIpLCB0aGUgc291cmNlIGJpdG1hcCwgbm9uIE5VTEwKKyAqCUBud29yZHM6IG51bWJlciBvZiB1MzIgd29yZHMgaW4gQGJ1ZgorICoKKyAqIGNvcHkgbWluKG5iaXRzLCAzMipud29yZHMpIGJpdHMgZnJvbSBAYnVmIHRvIEBiaXRtYXAsIHJlbWFpbmluZworICogYml0cyBiZXR3ZWVuIG53b3JkIGFuZCBuYml0cyBpbiBAYml0bWFwIChpZiBhbnkpIGFyZSBjbGVhcmVkLiBJbgorICogbGFzdCB3b3JkIG9mIEBiaXRtYXAsIHRoZSBiaXRzIGJleW9uZCBuYml0cyAoaWYgYW55KSBhcmUga2VwdAorICogdW5jaGFuZ2VkLgorICoKKyAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgZWZmZWN0aXZlbHkgY29waWVkLgorICovCit1bnNpZ25lZCBpbnQKK2JpdG1hcF9mcm9tX3UzMmFycmF5KHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IG5iaXRzLAorCQkgICAgIGNvbnN0IHUzMiAqYnVmLCB1bnNpZ25lZCBpbnQgbndvcmRzKQoreworCXVuc2lnbmVkIGludCBkc3RfaWR4LCBzcmNfaWR4OworCisJZm9yIChzcmNfaWR4ID0gZHN0X2lkeCA9IDA7IGRzdF9pZHggPCBCSVRTX1RPX0xPTkdTKG5iaXRzKTsgKytkc3RfaWR4KSB7CisJCXVuc2lnbmVkIGxvbmcgcGFydCA9IDA7CisKKwkJaWYgKHNyY19pZHggPCBud29yZHMpCisJCQlwYXJ0ID0gYnVmW3NyY19pZHgrK107CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisJCWlmIChzcmNfaWR4IDwgbndvcmRzKQorCQkJcGFydCB8PSAoKHVuc2lnbmVkIGxvbmcpIGJ1ZltzcmNfaWR4KytdKSA8PCAzMjsKKyNlbmRpZgorCisJCWlmIChkc3RfaWR4IDwgbmJpdHMvQklUU19QRVJfTE9ORykKKwkJCWJpdG1hcFtkc3RfaWR4XSA9IHBhcnQ7CisJCWVsc2UgeworCQkJdW5zaWduZWQgbG9uZyBtYXNrID0gQklUTUFQX0xBU1RfV09SRF9NQVNLKG5iaXRzKTsKKworCQkJYml0bWFwW2RzdF9pZHhdID0gKGJpdG1hcFtkc3RfaWR4XSAmIH5tYXNrKQorCQkJCXwgKHBhcnQgJiBtYXNrKTsKKwkJfQorCX0KKworCXJldHVybiBtaW5fdCh1bnNpZ25lZCBpbnQsIG5iaXRzLCAzMipud29yZHMpOworfQorRVhQT1JUX1NZTUJPTChiaXRtYXBfZnJvbV91MzJhcnJheSk7CisKKy8qKgorICogYml0bWFwX3RvX3UzMmFycmF5IC0gY29weSB0aGUgY29udGVudHMgb2YgYml0bWFwIHRvIGEgdTMyIGFycmF5IG9mIGJpdHMKKyAqCUBidWY6IGFycmF5IG9mIHUzMiAoaW4gaG9zdCBieXRlIG9yZGVyKSwgdGhlIGRlc3QgYml0bWFwLCBub24gTlVMTAorICoJQG53b3JkczogbnVtYmVyIG9mIHUzMiB3b3JkcyBpbiBAYnVmCisgKglAYml0bWFwOiBhcnJheSBvZiB1bnNpZ25lZCBsb25ncywgdGhlIHNvdXJjZSBiaXRtYXAsIG5vbiBOVUxMCisgKglAbmJpdHM6IG51bWJlciBvZiBiaXRzIGluIEBiaXRtYXAKKyAqCisgKiBjb3B5IG1pbihuYml0cywgMzIqbndvcmRzKSBiaXRzIGZyb20gQGJpdG1hcCB0byBAYnVmLiBSZW1haW5pbmcKKyAqIGJpdHMgYWZ0ZXIgbmJpdHMgaW4gQGJ1ZiAoaWYgYW55KSBhcmUgY2xlYXJlZC4KKyAqCisgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIGVmZmVjdGl2ZWx5IGNvcGllZC4KKyAqLwordW5zaWduZWQgaW50CitiaXRtYXBfdG9fdTMyYXJyYXkodTMyICpidWYsIHVuc2lnbmVkIGludCBud29yZHMsCisJCSAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwgdW5zaWduZWQgaW50IG5iaXRzKQoreworCXVuc2lnbmVkIGludCBkc3RfaWR4ID0gMCwgc3JjX2lkeCA9IDA7CisKKwl3aGlsZSAoZHN0X2lkeCA8IG53b3JkcykgeworCQl1bnNpZ25lZCBsb25nIHBhcnQgPSAwOworCisJCWlmIChzcmNfaWR4IDwgQklUU19UT19MT05HUyhuYml0cykpIHsKKwkJCXBhcnQgPSBiaXRtYXBbc3JjX2lkeF07CisJCQlpZiAoc3JjX2lkeCA+PSBuYml0cy9CSVRTX1BFUl9MT05HKQorCQkJCXBhcnQgJj0gQklUTUFQX0xBU1RfV09SRF9NQVNLKG5iaXRzKTsKKwkJCXNyY19pZHgrKzsKKwkJfQorCisJCWJ1Zltkc3RfaWR4KytdID0gcGFydCAmIDB4ZmZmZmZmZmZVTDsKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwkJaWYgKGRzdF9pZHggPCBud29yZHMpIHsKKwkJCXBhcnQgPj49IDMyOworCQkJYnVmW2RzdF9pZHgrK10gPSBwYXJ0ICYgMHhmZmZmZmZmZlVMOworCQl9CisjZW5kaWYKKwl9CisKKwlyZXR1cm4gbWluX3QodW5zaWduZWQgaW50LCBuYml0cywgMzIqbndvcmRzKTsKK30KK0VYUE9SVF9TWU1CT0woYml0bWFwX3RvX3UzMmFycmF5KTsKKworLyoqCisgKiBiaXRtYXBfY29weV9sZSAtIGNvcHkgYSBiaXRtYXAsIHB1dHRpbmcgdGhlIGJpdHMgaW50byBsaXR0bGUtZW5kaWFuIG9yZGVyLgorICogQGRzdDogICBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBzcmM6ICAgYml0bWFwIHRvIGNvcHkKKyAqIEBuYml0czogbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGJpdG1hcAorICoKKyAqIFJlcXVpcmUgbmJpdHMgJSBCSVRTX1BFUl9MT05HID09IDAuCisgKi8KKyNpZmRlZiBfX0JJR19FTkRJQU4KK3ZvaWQgYml0bWFwX2NvcHlfbGUodW5zaWduZWQgbG9uZyAqZHN0LCBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIHVuc2lnbmVkIGludCBuYml0cykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuYml0cy9CSVRTX1BFUl9MT05HOyBpKyspIHsKKwkJaWYgKEJJVFNfUEVSX0xPTkcgPT0gNjQpCisJCQlkc3RbaV0gPSBjcHVfdG9fbGU2NChzcmNbaV0pOworCQllbHNlCisJCQlkc3RbaV0gPSBjcHVfdG9fbGUzMihzcmNbaV0pOworCX0KK30KK0VYUE9SVF9TWU1CT0woYml0bWFwX2NvcHlfbGUpOworI2VuZGlmCisKK3Vuc2lnbmVkIGxvbmcgKmJpdG1hcF9hbGxvYyh1bnNpZ25lZCBpbnQgbmJpdHMsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBrbWFsbG9jX2FycmF5KEJJVFNfVE9fTE9OR1MobmJpdHMpLCBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkgICAgIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woYml0bWFwX2FsbG9jKTsKKwordW5zaWduZWQgbG9uZyAqYml0bWFwX3phbGxvYyh1bnNpZ25lZCBpbnQgbmJpdHMsIGdmcF90IGZsYWdzKQoreworCXJldHVybiBiaXRtYXBfYWxsb2MobmJpdHMsIGZsYWdzIHwgX19HRlBfWkVSTyk7Cit9CitFWFBPUlRfU1lNQk9MKGJpdG1hcF96YWxsb2MpOworCit2b2lkIGJpdG1hcF9mcmVlKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmJpdG1hcCkKK3sKKwlrZnJlZShiaXRtYXApOworfQorRVhQT1JUX1NZTUJPTChiaXRtYXBfZnJlZSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iaXRyZXYuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2JpdHJldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZmZkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9iaXRyZXYuYwpAQCAtMCwwICsxLDQ2IEBACisjaWZuZGVmIENPTkZJR19IQVZFX0FSQ0hfQklUUkVWRVJTRQorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYml0cmV2Lmg+CisKK01PRFVMRV9BVVRIT1IoIkFraW5vYnUgTWl0YSA8YWtpbm9idS5taXRhQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQml0IG9yZGVyaW5nIHJldmVyc2FsIGZ1bmN0aW9ucyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitjb25zdCB1OCBieXRlX3Jldl90YWJsZVsyNTZdID0geworCTB4MDAsIDB4ODAsIDB4NDAsIDB4YzAsIDB4MjAsIDB4YTAsIDB4NjAsIDB4ZTAsCisJMHgxMCwgMHg5MCwgMHg1MCwgMHhkMCwgMHgzMCwgMHhiMCwgMHg3MCwgMHhmMCwKKwkweDA4LCAweDg4LCAweDQ4LCAweGM4LCAweDI4LCAweGE4LCAweDY4LCAweGU4LAorCTB4MTgsIDB4OTgsIDB4NTgsIDB4ZDgsIDB4MzgsIDB4YjgsIDB4NzgsIDB4ZjgsCisJMHgwNCwgMHg4NCwgMHg0NCwgMHhjNCwgMHgyNCwgMHhhNCwgMHg2NCwgMHhlNCwKKwkweDE0LCAweDk0LCAweDU0LCAweGQ0LCAweDM0LCAweGI0LCAweDc0LCAweGY0LAorCTB4MGMsIDB4OGMsIDB4NGMsIDB4Y2MsIDB4MmMsIDB4YWMsIDB4NmMsIDB4ZWMsCisJMHgxYywgMHg5YywgMHg1YywgMHhkYywgMHgzYywgMHhiYywgMHg3YywgMHhmYywKKwkweDAyLCAweDgyLCAweDQyLCAweGMyLCAweDIyLCAweGEyLCAweDYyLCAweGUyLAorCTB4MTIsIDB4OTIsIDB4NTIsIDB4ZDIsIDB4MzIsIDB4YjIsIDB4NzIsIDB4ZjIsCisJMHgwYSwgMHg4YSwgMHg0YSwgMHhjYSwgMHgyYSwgMHhhYSwgMHg2YSwgMHhlYSwKKwkweDFhLCAweDlhLCAweDVhLCAweGRhLCAweDNhLCAweGJhLCAweDdhLCAweGZhLAorCTB4MDYsIDB4ODYsIDB4NDYsIDB4YzYsIDB4MjYsIDB4YTYsIDB4NjYsIDB4ZTYsCisJMHgxNiwgMHg5NiwgMHg1NiwgMHhkNiwgMHgzNiwgMHhiNiwgMHg3NiwgMHhmNiwKKwkweDBlLCAweDhlLCAweDRlLCAweGNlLCAweDJlLCAweGFlLCAweDZlLCAweGVlLAorCTB4MWUsIDB4OWUsIDB4NWUsIDB4ZGUsIDB4M2UsIDB4YmUsIDB4N2UsIDB4ZmUsCisJMHgwMSwgMHg4MSwgMHg0MSwgMHhjMSwgMHgyMSwgMHhhMSwgMHg2MSwgMHhlMSwKKwkweDExLCAweDkxLCAweDUxLCAweGQxLCAweDMxLCAweGIxLCAweDcxLCAweGYxLAorCTB4MDksIDB4ODksIDB4NDksIDB4YzksIDB4MjksIDB4YTksIDB4NjksIDB4ZTksCisJMHgxOSwgMHg5OSwgMHg1OSwgMHhkOSwgMHgzOSwgMHhiOSwgMHg3OSwgMHhmOSwKKwkweDA1LCAweDg1LCAweDQ1LCAweGM1LCAweDI1LCAweGE1LCAweDY1LCAweGU1LAorCTB4MTUsIDB4OTUsIDB4NTUsIDB4ZDUsIDB4MzUsIDB4YjUsIDB4NzUsIDB4ZjUsCisJMHgwZCwgMHg4ZCwgMHg0ZCwgMHhjZCwgMHgyZCwgMHhhZCwgMHg2ZCwgMHhlZCwKKwkweDFkLCAweDlkLCAweDVkLCAweGRkLCAweDNkLCAweGJkLCAweDdkLCAweGZkLAorCTB4MDMsIDB4ODMsIDB4NDMsIDB4YzMsIDB4MjMsIDB4YTMsIDB4NjMsIDB4ZTMsCisJMHgxMywgMHg5MywgMHg1MywgMHhkMywgMHgzMywgMHhiMywgMHg3MywgMHhmMywKKwkweDBiLCAweDhiLCAweDRiLCAweGNiLCAweDJiLCAweGFiLCAweDZiLCAweGViLAorCTB4MWIsIDB4OWIsIDB4NWIsIDB4ZGIsIDB4M2IsIDB4YmIsIDB4N2IsIDB4ZmIsCisJMHgwNywgMHg4NywgMHg0NywgMHhjNywgMHgyNywgMHhhNywgMHg2NywgMHhlNywKKwkweDE3LCAweDk3LCAweDU3LCAweGQ3LCAweDM3LCAweGI3LCAweDc3LCAweGY3LAorCTB4MGYsIDB4OGYsIDB4NGYsIDB4Y2YsIDB4MmYsIDB4YWYsIDB4NmYsIDB4ZWYsCisJMHgxZiwgMHg5ZiwgMHg1ZiwgMHhkZiwgMHgzZiwgMHhiZiwgMHg3ZiwgMHhmZiwKK307CitFWFBPUlRfU1lNQk9MX0dQTChieXRlX3Jldl90YWJsZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfSEFWRV9BUkNIX0JJVFJFVkVSU0UgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2JzZWFyY2guYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2JzZWFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjUxMmZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYnNlYXJjaC5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBBIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgYmluYXJ5IHNlYXJjaCBmb3IgdGhlIExpbnV4IGtlcm5lbAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IEtzcGxpY2UsIEluYy4KKyAqIEF1dGhvcjogVGltIEFiYm90dCA8dGFiYm90dEBrc3BsaWNlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYnNlYXJjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKworLyoKKyAqIGJzZWFyY2ggLSBiaW5hcnkgc2VhcmNoIGFuIGFycmF5IG9mIGVsZW1lbnRzCisgKiBAa2V5OiBwb2ludGVyIHRvIGl0ZW0gYmVpbmcgc2VhcmNoZWQgZm9yCisgKiBAYmFzZTogcG9pbnRlciB0byBmaXJzdCBlbGVtZW50IHRvIHNlYXJjaAorICogQG51bTogbnVtYmVyIG9mIGVsZW1lbnRzCisgKiBAc2l6ZTogc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKyAqIEBjbXA6IHBvaW50ZXIgdG8gY29tcGFyaXNvbiBmdW5jdGlvbgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGJpbmFyeSBzZWFyY2ggb24gdGhlIGdpdmVuIGFycmF5LiAgVGhlCisgKiBjb250ZW50cyBvZiB0aGUgYXJyYXkgc2hvdWxkIGFscmVhZHkgYmUgaW4gYXNjZW5kaW5nIHNvcnRlZCBvcmRlcgorICogdW5kZXIgdGhlIHByb3ZpZGVkIGNvbXBhcmlzb24gZnVuY3Rpb24uCisgKgorICogTm90ZSB0aGF0IHRoZSBrZXkgbmVlZCBub3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBlbGVtZW50cyBpbgorICogdGhlIGFycmF5LCBlLmcuIGtleSBjb3VsZCBiZSBhIHN0cmluZyBhbmQgdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAqIGNvdWxkIGNvbXBhcmUgdGhlIHN0cmluZyB3aXRoIHRoZSBzdHJ1Y3QncyBuYW1lIGZpZWxkLiAgSG93ZXZlciwgaWYKKyAqIHRoZSBrZXkgYW5kIGVsZW1lbnRzIGluIHRoZSBhcnJheSBhcmUgb2YgdGhlIHNhbWUgdHlwZSwgeW91IGNhbiB1c2UKKyAqIHRoZSBzYW1lIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGJvdGggc29ydCgpIGFuZCBic2VhcmNoKCkuCisgKi8KK3ZvaWQgKmJzZWFyY2goY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICpiYXNlLCBzaXplX3QgbnVtLCBzaXplX3Qgc2l6ZSwKKwkgICAgICBpbnQgKCpjbXApKGNvbnN0IHZvaWQgKmtleSwgY29uc3Qgdm9pZCAqZWx0KSkKK3sKKwljb25zdCBjaGFyICpwaXZvdDsKKwlpbnQgcmVzdWx0OworCisJd2hpbGUgKG51bSA+IDApIHsKKwkJcGl2b3QgPSBiYXNlICsgKG51bSA+PiAxKSAqIHNpemU7CisJCXJlc3VsdCA9IGNtcChrZXksIHBpdm90KTsKKworCQlpZiAocmVzdWx0ID09IDApCisJCQlyZXR1cm4gKHZvaWQgKilwaXZvdDsKKworCQlpZiAocmVzdWx0ID4gMCkgeworCQkJYmFzZSA9IHBpdm90ICsgc2l6ZTsKKwkJCW51bS0tOworCQl9CisJCW51bSA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woYnNlYXJjaCk7CitOT0tQUk9CRV9TWU1CT0woYnNlYXJjaCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9idHJlZS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTNhOTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYnRyZWUuYwpAQCAtMCwwICsxLDgwMSBAQAorLyoKKyAqIGxpYi9idHJlZS5jCS0gU2ltcGxlIEluLW1lbW9yeSBCK1RyZWUKKyAqCisgKiBBcyBzaG91bGQgYmUgb2J2aW91cyBmb3IgTGludXgga2VybmVsIGNvZGUsIGxpY2Vuc2UgaXMgR1BMdjIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKb2VybiBFbmdlbCA8am9lcm5AbG9nZnMub3JnPgorICogQml0cyBhbmQgcGllY2VzIHN0b2xlbiBmcm9tIFBldGVyIFppamxzdHJhJ3MgY29kZSwgd2hpY2ggaXMKKyAqIENvcHlyaWdodCAyMDA3LCBSZWQgSGF0IEluYy4gUGV0ZXIgWmlqbHN0cmEKKyAqIEdQTHYyCisgKgorICogc2VlIGh0dHA6Ly9wcm9ncmFtbWluZy5raWNrcy1hc3MubmV0L2tlcm5lbC1wYXRjaGVzL3ZtYV9sb29rdXAvYnRyZWUucGF0Y2gKKyAqCisgKiBBIHJlbGF0aXZlbHkgc2ltcGxlIEIrVHJlZSBpbXBsZW1lbnRhdGlvbi4gIEkgaGF2ZSB3cml0dGVuIGl0IGFzIGEgbGVhcm5pbmcKKyAqIGV4ZXJjaXNlIHRvIHVuZGVyc3RhbmQgaG93IEIrVHJlZXMgd29yay4gIFR1cm5lZCBvdXQgdG8gYmUgdXNlZnVsIGFzIHdlbGwuCisgKgorICogQitUcmVlcyBjYW4gYmUgdXNlZCBzaW1pbGFyIHRvIExpbnV4IHJhZGl4IHRyZWVzICh3aGljaCBkb24ndCBoYXZlIGFueXRoaW5nCisgKiBpbiBjb21tb24gd2l0aCB0ZXh0Ym9vayByYWRpeCB0cmVlcywgYmV3YXJlKS4gIFByZXJlcXVpc2l0ZSBmb3IgdGhlbSB3b3JraW5nCisgKiB3ZWxsIGlzIHRoYXQgYWNjZXNzIHRvIGEgcmFuZG9tIHRyZWUgbm9kZSBpcyBtdWNoIGZhc3RlciB0aGFuIGEgbGFyZ2UgbnVtYmVyCisgKiBvZiBvcGVyYXRpb25zIHdpdGhpbiBlYWNoIG5vZGUuCisgKgorICogRGlza3MgaGF2ZSBmdWxmaWxsZWQgdGhlIHByZXJlcXVpc2l0ZSBmb3IgYSBsb25nIHRpbWUuICBNb3JlIHJlY2VudGx5IERSQU0KKyAqIGhhcyBnYWluZWQgc2ltaWxhciBwcm9wZXJ0aWVzLCBhcyBtZW1vcnkgYWNjZXNzIHRpbWVzLCB3aGVuIG1lYXN1cmVkIGluIGNwdQorICogY3ljbGVzLCBoYXZlIGluY3JlYXNlZC4gIENhY2hlbGluZSBzaXplcyBoYXZlIGluY3JlYXNlZCBhcyB3ZWxsLCB3aGljaCBhbHNvCisgKiBoZWxwcyBCK1RyZWVzLgorICoKKyAqIENvbXBhcmVkIHRvIHJhZGl4IHRyZWVzLCBCK1RyZWVzIGFyZSBtb3JlIGVmZmljaWVudCB3aGVuIGRlYWxpbmcgd2l0aCBhCisgKiBzcGFyc2VseSBwb3B1bGF0ZWQgYWRkcmVzcyBzcGFjZS4gIEJldHdlZW4gMjUlIGFuZCA1MCUgb2YgdGhlIG1lbW9yeSBpcworICogb2NjdXBpZWQgd2l0aCB2YWxpZCBwb2ludGVycy4gIFdoZW4gZGVuc2VseSBwb3B1bGF0ZWQsIHJhZGl4IHRyZWVzIGNvbnRhaW4KKyAqIH45OCUgcG9pbnRlcnMgLSBoYXJkIHRvIGJlYXQuICBWZXJ5IHNwYXJzZSByYWRpeCB0cmVlcyBjb250YWluIG9ubHkgfjIlCisgKiBwb2ludGVycy4KKyAqCisgKiBUaGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gc3RvcmVzIHBvaW50ZXJzIGlkZW50aWZpZWQgYnkgYSBsb25nIHZhbHVlLgorICogU3RvcmluZyBOVUxMIHBvaW50ZXJzIGlzIGlsbGVnYWwsIGxvb2t1cCB3aWxsIHJldHVybiBOVUxMIHdoZW4gbm8gZW50cnkKKyAqIHdhcyBmb3VuZC4KKyAqCisgKiBBIHRyaWNrcyB3YXMgdXNlZCB0aGF0IGlzIG5vdCBjb21tb25seSBmb3VuZCBpbiB0ZXh0Ym9va3MuICBUaGUgbG93ZXN0CisgKiB2YWx1ZXMgYXJlIHRvIHRoZSByaWdodCwgbm90IHRvIHRoZSBsZWZ0LiAgQWxsIHVzZWQgc2xvdHMgd2l0aGluIGEgbm9kZQorICogYXJlIG9uIHRoZSBsZWZ0LCBhbGwgdW51c2VkIHNsb3RzIGNvbnRhaW4gTlVMIHZhbHVlcy4gIE1vc3Qgb3BlcmF0aW9ucworICogc2ltcGx5IGxvb3Agb25jZSBvdmVyIGFsbCBzbG90cyBhbmQgdGVybWluYXRlIG9uIHRoZSBmaXJzdCBOVUwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J0cmVlLmg+CisjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIE5PREVTSVpFIE1BWChMMV9DQUNIRV9CWVRFUywgMTI4KQorCitzdHJ1Y3QgYnRyZWVfZ2VvIHsKKwlpbnQga2V5bGVuOworCWludCBub19wYWlyczsKKwlpbnQgbm9fbG9uZ3M7Cit9OworCitzdHJ1Y3QgYnRyZWVfZ2VvIGJ0cmVlX2dlbzMyID0geworCS5rZXlsZW4gPSAxLAorCS5ub19wYWlycyA9IE5PREVTSVpFIC8gc2l6ZW9mKGxvbmcpIC8gMiwKKwkubm9fbG9uZ3MgPSBOT0RFU0laRSAvIHNpemVvZihsb25nKSAvIDIsCit9OworRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfZ2VvMzIpOworCisjZGVmaW5lIExPTkdfUEVSX1U2NCAoNjQgLyBCSVRTX1BFUl9MT05HKQorc3RydWN0IGJ0cmVlX2dlbyBidHJlZV9nZW82NCA9IHsKKwkua2V5bGVuID0gTE9OR19QRVJfVTY0LAorCS5ub19wYWlycyA9IE5PREVTSVpFIC8gc2l6ZW9mKGxvbmcpIC8gKDEgKyBMT05HX1BFUl9VNjQpLAorCS5ub19sb25ncyA9IExPTkdfUEVSX1U2NCAqIChOT0RFU0laRSAvIHNpemVvZihsb25nKSAvICgxICsgTE9OR19QRVJfVTY0KSksCit9OworRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfZ2VvNjQpOworCitzdHJ1Y3QgYnRyZWVfZ2VvIGJ0cmVlX2dlbzEyOCA9IHsKKwkua2V5bGVuID0gMiAqIExPTkdfUEVSX1U2NCwKKwkubm9fcGFpcnMgPSBOT0RFU0laRSAvIHNpemVvZihsb25nKSAvICgxICsgMiAqIExPTkdfUEVSX1U2NCksCisJLm5vX2xvbmdzID0gMiAqIExPTkdfUEVSX1U2NCAqIChOT0RFU0laRSAvIHNpemVvZihsb25nKSAvICgxICsgMiAqIExPTkdfUEVSX1U2NCkpLAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJ0cmVlX2dlbzEyOCk7CisKK3N0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqYnRyZWVfY2FjaGVwOworCit2b2lkICpidHJlZV9hbGxvYyhnZnBfdCBnZnBfbWFzaywgdm9pZCAqcG9vbF9kYXRhKQoreworCXJldHVybiBrbWVtX2NhY2hlX2FsbG9jKGJ0cmVlX2NhY2hlcCwgZ2ZwX21hc2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfYWxsb2MpOworCit2b2lkIGJ0cmVlX2ZyZWUodm9pZCAqZWxlbWVudCwgdm9pZCAqcG9vbF9kYXRhKQoreworCWttZW1fY2FjaGVfZnJlZShidHJlZV9jYWNoZXAsIGVsZW1lbnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfZnJlZSk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpidHJlZV9ub2RlX2FsbG9jKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBnZnBfdCBnZnApCit7CisJdW5zaWduZWQgbG9uZyAqbm9kZTsKKworCW5vZGUgPSBtZW1wb29sX2FsbG9jKGhlYWQtPm1lbXBvb2wsIGdmcCk7CisJaWYgKGxpa2VseShub2RlKSkKKwkJbWVtc2V0KG5vZGUsIDAsIE5PREVTSVpFKTsKKwlyZXR1cm4gbm9kZTsKK30KKworc3RhdGljIGludCBsb25nY21wKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmwxLCBjb25zdCB1bnNpZ25lZCBsb25nICpsMiwgc2l6ZV90IG4pCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCWlmIChsMVtpXSA8IGwyW2ldKQorCQkJcmV0dXJuIC0xOworCQlpZiAobDFbaV0gPiBsMltpXSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgKmxvbmdjcHkodW5zaWduZWQgbG9uZyAqZGVzdCwgY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjLAorCQlzaXplX3QgbikKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWRlc3RbaV0gPSBzcmNbaV07CisJcmV0dXJuIGRlc3Q7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nICpsb25nc2V0KHVuc2lnbmVkIGxvbmcgKnMsIHVuc2lnbmVkIGxvbmcgYywgc2l6ZV90IG4pCit7CisJc2l6ZV90IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlzW2ldID0gYzsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgZGVjX2tleShzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sIHVuc2lnbmVkIGxvbmcgKmtleSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IGdlby0+a2V5bGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJdmFsID0ga2V5W2ldOworCQlrZXlbaV0gPSB2YWwgLSAxOworCQlpZiAodmFsKQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyAqYmtleShzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sIHVuc2lnbmVkIGxvbmcgKm5vZGUsIGludCBuKQoreworCXJldHVybiAmbm9kZVtuICogZ2VvLT5rZXlsZW5dOworfQorCitzdGF0aWMgdm9pZCAqYnZhbChzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sIHVuc2lnbmVkIGxvbmcgKm5vZGUsIGludCBuKQoreworCXJldHVybiAodm9pZCAqKW5vZGVbZ2VvLT5ub19sb25ncyArIG5dOworfQorCitzdGF0aWMgdm9pZCBzZXRrZXkoc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLCB1bnNpZ25lZCBsb25nICpub2RlLCBpbnQgbiwKKwkJICAgdW5zaWduZWQgbG9uZyAqa2V5KQoreworCWxvbmdjcHkoYmtleShnZW8sIG5vZGUsIG4pLCBrZXksIGdlby0+a2V5bGVuKTsKK30KKworc3RhdGljIHZvaWQgc2V0dmFsKHN0cnVjdCBidHJlZV9nZW8gKmdlbywgdW5zaWduZWQgbG9uZyAqbm9kZSwgaW50IG4sCisJCSAgIHZvaWQgKnZhbCkKK3sKKwlub2RlW2dlby0+bm9fbG9uZ3MgKyBuXSA9ICh1bnNpZ25lZCBsb25nKSB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFycGFpcihzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sIHVuc2lnbmVkIGxvbmcgKm5vZGUsIGludCBuKQoreworCWxvbmdzZXQoYmtleShnZW8sIG5vZGUsIG4pLCAwLCBnZW8tPmtleWxlbik7CisJbm9kZVtnZW8tPm5vX2xvbmdzICsgbl0gPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19idHJlZV9pbml0KHN0cnVjdCBidHJlZV9oZWFkICpoZWFkKQoreworCWhlYWQtPm5vZGUgPSBOVUxMOworCWhlYWQtPmhlaWdodCA9IDA7Cit9CisKK3ZvaWQgYnRyZWVfaW5pdF9tZW1wb29sKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBtZW1wb29sX3QgKm1lbXBvb2wpCit7CisJX19idHJlZV9pbml0KGhlYWQpOworCWhlYWQtPm1lbXBvb2wgPSBtZW1wb29sOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfaW5pdF9tZW1wb29sKTsKKworaW50IGJ0cmVlX2luaXQoc3RydWN0IGJ0cmVlX2hlYWQgKmhlYWQpCit7CisJX19idHJlZV9pbml0KGhlYWQpOworCWhlYWQtPm1lbXBvb2wgPSBtZW1wb29sX2NyZWF0ZSgwLCBidHJlZV9hbGxvYywgYnRyZWVfZnJlZSwgTlVMTCk7CisJaWYgKCFoZWFkLT5tZW1wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0cmVlX2luaXQpOworCit2b2lkIGJ0cmVlX2Rlc3Ryb3koc3RydWN0IGJ0cmVlX2hlYWQgKmhlYWQpCit7CisJbWVtcG9vbF9mcmVlKGhlYWQtPm5vZGUsIGhlYWQtPm1lbXBvb2wpOworCW1lbXBvb2xfZGVzdHJveShoZWFkLT5tZW1wb29sKTsKKwloZWFkLT5tZW1wb29sID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0cmVlX2Rlc3Ryb3kpOworCit2b2lkICpidHJlZV9sYXN0KHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCSB1bnNpZ25lZCBsb25nICprZXkpCit7CisJaW50IGhlaWdodCA9IGhlYWQtPmhlaWdodDsKKwl1bnNpZ25lZCBsb25nICpub2RlID0gaGVhZC0+bm9kZTsKKworCWlmIChoZWlnaHQgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKCA7IGhlaWdodCA+IDE7IGhlaWdodC0tKQorCQlub2RlID0gYnZhbChnZW8sIG5vZGUsIDApOworCisJbG9uZ2NweShrZXksIGJrZXkoZ2VvLCBub2RlLCAwKSwgZ2VvLT5rZXlsZW4pOworCXJldHVybiBidmFsKGdlbywgbm9kZSwgMCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidHJlZV9sYXN0KTsKKworc3RhdGljIGludCBrZXljbXAoc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLCB1bnNpZ25lZCBsb25nICpub2RlLCBpbnQgcG9zLAorCQkgIHVuc2lnbmVkIGxvbmcgKmtleSkKK3sKKwlyZXR1cm4gbG9uZ2NtcChia2V5KGdlbywgbm9kZSwgcG9zKSwga2V5LCBnZW8tPmtleWxlbik7Cit9CisKK3N0YXRpYyBpbnQga2V5emVybyhzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sIHVuc2lnbmVkIGxvbmcgKmtleSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBnZW8tPmtleWxlbjsgaSsrKQorCQlpZiAoa2V5W2ldKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKwordm9pZCAqYnRyZWVfbG9va3VwKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCXVuc2lnbmVkIGxvbmcgKmtleSkKK3sKKwlpbnQgaSwgaGVpZ2h0ID0gaGVhZC0+aGVpZ2h0OworCXVuc2lnbmVkIGxvbmcgKm5vZGUgPSBoZWFkLT5ub2RlOworCisJaWYgKGhlaWdodCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoIDsgaGVpZ2h0ID4gMTsgaGVpZ2h0LS0pIHsKKwkJZm9yIChpID0gMDsgaSA8IGdlby0+bm9fcGFpcnM7IGkrKykKKwkJCWlmIChrZXljbXAoZ2VvLCBub2RlLCBpLCBrZXkpIDw9IDApCisJCQkJYnJlYWs7CisJCWlmIChpID09IGdlby0+bm9fcGFpcnMpCisJCQlyZXR1cm4gTlVMTDsKKwkJbm9kZSA9IGJ2YWwoZ2VvLCBub2RlLCBpKTsKKwkJaWYgKCFub2RlKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBnZW8tPm5vX3BhaXJzOyBpKyspCisJCWlmIChrZXljbXAoZ2VvLCBub2RlLCBpLCBrZXkpID09IDApCisJCQlyZXR1cm4gYnZhbChnZW8sIG5vZGUsIGkpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfbG9va3VwKTsKKworaW50IGJ0cmVlX3VwZGF0ZShzdHJ1Y3QgYnRyZWVfaGVhZCAqaGVhZCwgc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLAorCQkgdW5zaWduZWQgbG9uZyAqa2V5LCB2b2lkICp2YWwpCit7CisJaW50IGksIGhlaWdodCA9IGhlYWQtPmhlaWdodDsKKwl1bnNpZ25lZCBsb25nICpub2RlID0gaGVhZC0+bm9kZTsKKworCWlmIChoZWlnaHQgPT0gMCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlmb3IgKCA7IGhlaWdodCA+IDE7IGhlaWdodC0tKSB7CisJCWZvciAoaSA9IDA7IGkgPCBnZW8tPm5vX3BhaXJzOyBpKyspCisJCQlpZiAoa2V5Y21wKGdlbywgbm9kZSwgaSwga2V5KSA8PSAwKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSBnZW8tPm5vX3BhaXJzKQorCQkJcmV0dXJuIC1FTk9FTlQ7CisJCW5vZGUgPSBidmFsKGdlbywgbm9kZSwgaSk7CisJCWlmICghbm9kZSkKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCWlmICghbm9kZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2VvLT5ub19wYWlyczsgaSsrKQorCQlpZiAoa2V5Y21wKGdlbywgbm9kZSwgaSwga2V5KSA9PSAwKSB7CisJCQlzZXR2YWwoZ2VvLCBub2RlLCBpLCB2YWwpOworCQkJcmV0dXJuIDA7CisJCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0cmVlX3VwZGF0ZSk7CisKKy8qCisgKiBVc3VhbGx5IHRoaXMgZnVuY3Rpb24gaXMgcXVpdGUgc2ltaWxhciB0byBub3JtYWwgbG9va3VwLiAgQnV0IHRoZSBrZXkgb2YKKyAqIGEgcGFyZW50IG5vZGUgbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgc21hbGxlc3Qga2V5IG9mIGFsbCBpdHMgc2libGluZ3MuCisgKiBJbiBzdWNoIGEgY2FzZSB3ZSBjYW5ub3QganVzdCByZXR1cm4gTlVMTCwgYXMgd2UgaGF2ZSBvbmx5IHByb3ZlbiB0aGF0IG5vCisgKiBrZXkgc21hbGxlciB0aGFuIF9fa2V5LCBidXQgbGFyZ2VyIHRoYW4gdGhpcyBwYXJlbnQga2V5IGV4aXN0cy4KKyAqIFNvIHdlIHNldCBfX2tleSB0byB0aGUgcGFyZW50IGtleSBhbmQgcmV0cnkuICBXZSBoYXZlIHRvIHVzZSB0aGUgc21hbGxlc3QKKyAqIHN1Y2ggcGFyZW50IGtleSwgd2hpY2ggaXMgdGhlIGxhc3QgcGFyZW50IGtleSB3ZSBlbmNvdW50ZXJlZC4KKyAqLwordm9pZCAqYnRyZWVfZ2V0X3ByZXYoc3RydWN0IGJ0cmVlX2hlYWQgKmhlYWQsIHN0cnVjdCBidHJlZV9nZW8gKmdlbywKKwkJICAgICB1bnNpZ25lZCBsb25nICpfX2tleSkKK3sKKwlpbnQgaSwgaGVpZ2h0OworCXVuc2lnbmVkIGxvbmcgKm5vZGUsICpvbGRub2RlOworCXVuc2lnbmVkIGxvbmcgKnJldHJ5X2tleSA9IE5VTEwsIGtleVtnZW8tPmtleWxlbl07CisKKwlpZiAoa2V5emVybyhnZW8sIF9fa2V5KSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoaGVhZC0+aGVpZ2h0ID09IDApCisJCXJldHVybiBOVUxMOworCWxvbmdjcHkoa2V5LCBfX2tleSwgZ2VvLT5rZXlsZW4pOworcmV0cnk6CisJZGVjX2tleShnZW8sIGtleSk7CisKKwlub2RlID0gaGVhZC0+bm9kZTsKKwlmb3IgKGhlaWdodCA9IGhlYWQtPmhlaWdodCA7IGhlaWdodCA+IDE7IGhlaWdodC0tKSB7CisJCWZvciAoaSA9IDA7IGkgPCBnZW8tPm5vX3BhaXJzOyBpKyspCisJCQlpZiAoa2V5Y21wKGdlbywgbm9kZSwgaSwga2V5KSA8PSAwKQorCQkJCWJyZWFrOworCQlpZiAoaSA9PSBnZW8tPm5vX3BhaXJzKQorCQkJZ290byBtaXNzOworCQlvbGRub2RlID0gbm9kZTsKKwkJbm9kZSA9IGJ2YWwoZ2VvLCBub2RlLCBpKTsKKwkJaWYgKCFub2RlKQorCQkJZ290byBtaXNzOworCQlyZXRyeV9rZXkgPSBia2V5KGdlbywgb2xkbm9kZSwgaSk7CisJfQorCisJaWYgKCFub2RlKQorCQlnb3RvIG1pc3M7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2VvLT5ub19wYWlyczsgaSsrKSB7CisJCWlmIChrZXljbXAoZ2VvLCBub2RlLCBpLCBrZXkpIDw9IDApIHsKKwkJCWlmIChidmFsKGdlbywgbm9kZSwgaSkpIHsKKwkJCQlsb25nY3B5KF9fa2V5LCBia2V5KGdlbywgbm9kZSwgaSksIGdlby0+a2V5bGVuKTsKKwkJCQlyZXR1cm4gYnZhbChnZW8sIG5vZGUsIGkpOworCQkJfSBlbHNlCisJCQkJZ290byBtaXNzOworCQl9CisJfQorbWlzczoKKwlpZiAocmV0cnlfa2V5KSB7CisJCWxvbmdjcHkoa2V5LCByZXRyeV9rZXksIGdlby0+a2V5bGVuKTsKKwkJcmV0cnlfa2V5ID0gTlVMTDsKKwkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidHJlZV9nZXRfcHJldik7CisKK3N0YXRpYyBpbnQgZ2V0cG9zKHN0cnVjdCBidHJlZV9nZW8gKmdlbywgdW5zaWduZWQgbG9uZyAqbm9kZSwKKwkJdW5zaWduZWQgbG9uZyAqa2V5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGdlby0+bm9fcGFpcnM7IGkrKykgeworCQlpZiAoa2V5Y21wKGdlbywgbm9kZSwgaSwga2V5KSA8PSAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGdldGZpbGwoc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLCB1bnNpZ25lZCBsb25nICpub2RlLCBpbnQgc3RhcnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGdlby0+bm9fcGFpcnM7IGkrKykKKwkJaWYgKCFidmFsKGdlbywgbm9kZSwgaSkpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIGxvY2F0ZSB0aGUgY29ycmVjdCBsZWFmIG5vZGUgaW4gdGhlIGJ0cmVlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nICpmaW5kX2xldmVsKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCXVuc2lnbmVkIGxvbmcgKmtleSwgaW50IGxldmVsKQoreworCXVuc2lnbmVkIGxvbmcgKm5vZGUgPSBoZWFkLT5ub2RlOworCWludCBpLCBoZWlnaHQ7CisKKwlmb3IgKGhlaWdodCA9IGhlYWQtPmhlaWdodDsgaGVpZ2h0ID4gbGV2ZWw7IGhlaWdodC0tKSB7CisJCWZvciAoaSA9IDA7IGkgPCBnZW8tPm5vX3BhaXJzOyBpKyspCisJCQlpZiAoa2V5Y21wKGdlbywgbm9kZSwgaSwga2V5KSA8PSAwKQorCQkJCWJyZWFrOworCisJCWlmICgoaSA9PSBnZW8tPm5vX3BhaXJzKSB8fCAhYnZhbChnZW8sIG5vZGUsIGkpKSB7CisJCQkvKiByaWdodC1tb3N0IGtleSBpcyB0b28gbGFyZ2UsIHVwZGF0ZSBpdCAqLworCQkJLyogRklYTUU6IElmIHRoZSByaWdodC1tb3N0IGtleSBvbiBoaWdoZXIgbGV2ZWxzIGlzCisJCQkgKiBhbHdheXMgemVybywgdGhpcyB3b3VsZG4ndCBiZSBuZWNlc3NhcnkuICovCisJCQlpLS07CisJCQlzZXRrZXkoZ2VvLCBub2RlLCBpLCBrZXkpOworCQl9CisJCUJVR19PTihpIDwgMCk7CisJCW5vZGUgPSBidmFsKGdlbywgbm9kZSwgaSk7CisJfQorCUJVR19PTighbm9kZSk7CisJcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbnQgYnRyZWVfZ3JvdyhzdHJ1Y3QgYnRyZWVfaGVhZCAqaGVhZCwgc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLAorCQkgICAgICBnZnBfdCBnZnApCit7CisJdW5zaWduZWQgbG9uZyAqbm9kZTsKKwlpbnQgZmlsbDsKKworCW5vZGUgPSBidHJlZV9ub2RlX2FsbG9jKGhlYWQsIGdmcCk7CisJaWYgKCFub2RlKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoaGVhZC0+bm9kZSkgeworCQlmaWxsID0gZ2V0ZmlsbChnZW8sIGhlYWQtPm5vZGUsIDApOworCQlzZXRrZXkoZ2VvLCBub2RlLCAwLCBia2V5KGdlbywgaGVhZC0+bm9kZSwgZmlsbCAtIDEpKTsKKwkJc2V0dmFsKGdlbywgbm9kZSwgMCwgaGVhZC0+bm9kZSk7CisJfQorCWhlYWQtPm5vZGUgPSBub2RlOworCWhlYWQtPmhlaWdodCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBidHJlZV9zaHJpbmsoc3RydWN0IGJ0cmVlX2hlYWQgKmhlYWQsIHN0cnVjdCBidHJlZV9nZW8gKmdlbykKK3sKKwl1bnNpZ25lZCBsb25nICpub2RlOworCWludCBmaWxsOworCisJaWYgKGhlYWQtPmhlaWdodCA8PSAxKQorCQlyZXR1cm47CisKKwlub2RlID0gaGVhZC0+bm9kZTsKKwlmaWxsID0gZ2V0ZmlsbChnZW8sIG5vZGUsIDApOworCUJVR19PTihmaWxsID4gMSk7CisJaGVhZC0+bm9kZSA9IGJ2YWwoZ2VvLCBub2RlLCAwKTsKKwloZWFkLT5oZWlnaHQtLTsKKwltZW1wb29sX2ZyZWUobm9kZSwgaGVhZC0+bWVtcG9vbCk7Cit9CisKK3N0YXRpYyBpbnQgYnRyZWVfaW5zZXJ0X2xldmVsKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCQkgICAgICB1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKnZhbCwgaW50IGxldmVsLAorCQkJICAgICAgZ2ZwX3QgZ2ZwKQoreworCXVuc2lnbmVkIGxvbmcgKm5vZGU7CisJaW50IGksIHBvcywgZmlsbCwgZXJyOworCisJQlVHX09OKCF2YWwpOworCWlmIChoZWFkLT5oZWlnaHQgPCBsZXZlbCkgeworCQllcnIgPSBidHJlZV9ncm93KGhlYWQsIGdlbywgZ2ZwKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCityZXRyeToKKwlub2RlID0gZmluZF9sZXZlbChoZWFkLCBnZW8sIGtleSwgbGV2ZWwpOworCXBvcyA9IGdldHBvcyhnZW8sIG5vZGUsIGtleSk7CisJZmlsbCA9IGdldGZpbGwoZ2VvLCBub2RlLCBwb3MpOworCS8qIHR3byBpZGVudGljYWwga2V5cyBhcmUgbm90IGFsbG93ZWQgKi8KKwlCVUdfT04ocG9zIDwgZmlsbCAmJiBrZXljbXAoZ2VvLCBub2RlLCBwb3MsIGtleSkgPT0gMCk7CisKKwlpZiAoZmlsbCA9PSBnZW8tPm5vX3BhaXJzKSB7CisJCS8qIG5lZWQgdG8gc3BsaXQgbm9kZSAqLworCQl1bnNpZ25lZCBsb25nICpuZXc7CisKKwkJbmV3ID0gYnRyZWVfbm9kZV9hbGxvYyhoZWFkLCBnZnApOworCQlpZiAoIW5ldykKKwkJCXJldHVybiAtRU5PTUVNOworCQllcnIgPSBidHJlZV9pbnNlcnRfbGV2ZWwoaGVhZCwgZ2VvLAorCQkJCWJrZXkoZ2VvLCBub2RlLCBmaWxsIC8gMiAtIDEpLAorCQkJCW5ldywgbGV2ZWwgKyAxLCBnZnApOworCQlpZiAoZXJyKSB7CisJCQltZW1wb29sX2ZyZWUobmV3LCBoZWFkLT5tZW1wb29sKTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IGZpbGwgLyAyOyBpKyspIHsKKwkJCXNldGtleShnZW8sIG5ldywgaSwgYmtleShnZW8sIG5vZGUsIGkpKTsKKwkJCXNldHZhbChnZW8sIG5ldywgaSwgYnZhbChnZW8sIG5vZGUsIGkpKTsKKwkJCXNldGtleShnZW8sIG5vZGUsIGksIGJrZXkoZ2VvLCBub2RlLCBpICsgZmlsbCAvIDIpKTsKKwkJCXNldHZhbChnZW8sIG5vZGUsIGksIGJ2YWwoZ2VvLCBub2RlLCBpICsgZmlsbCAvIDIpKTsKKwkJCWNsZWFycGFpcihnZW8sIG5vZGUsIGkgKyBmaWxsIC8gMik7CisJCX0KKwkJaWYgKGZpbGwgJiAxKSB7CisJCQlzZXRrZXkoZ2VvLCBub2RlLCBpLCBia2V5KGdlbywgbm9kZSwgZmlsbCAtIDEpKTsKKwkJCXNldHZhbChnZW8sIG5vZGUsIGksIGJ2YWwoZ2VvLCBub2RlLCBmaWxsIC0gMSkpOworCQkJY2xlYXJwYWlyKGdlbywgbm9kZSwgZmlsbCAtIDEpOworCQl9CisJCWdvdG8gcmV0cnk7CisJfQorCUJVR19PTihmaWxsID49IGdlby0+bm9fcGFpcnMpOworCisJLyogc2hpZnQgYW5kIGluc2VydCAqLworCWZvciAoaSA9IGZpbGw7IGkgPiBwb3M7IGktLSkgeworCQlzZXRrZXkoZ2VvLCBub2RlLCBpLCBia2V5KGdlbywgbm9kZSwgaSAtIDEpKTsKKwkJc2V0dmFsKGdlbywgbm9kZSwgaSwgYnZhbChnZW8sIG5vZGUsIGkgLSAxKSk7CisJfQorCXNldGtleShnZW8sIG5vZGUsIHBvcywga2V5KTsKKwlzZXR2YWwoZ2VvLCBub2RlLCBwb3MsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGJ0cmVlX2luc2VydChzdHJ1Y3QgYnRyZWVfaGVhZCAqaGVhZCwgc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLAorCQl1bnNpZ25lZCBsb25nICprZXksIHZvaWQgKnZhbCwgZ2ZwX3QgZ2ZwKQoreworCUJVR19PTighdmFsKTsKKwlyZXR1cm4gYnRyZWVfaW5zZXJ0X2xldmVsKGhlYWQsIGdlbywga2V5LCB2YWwsIDEsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidHJlZV9pbnNlcnQpOworCitzdGF0aWMgdm9pZCAqYnRyZWVfcmVtb3ZlX2xldmVsKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCXVuc2lnbmVkIGxvbmcgKmtleSwgaW50IGxldmVsKTsKK3N0YXRpYyB2b2lkIG1lcmdlKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sIGludCBsZXZlbCwKKwkJdW5zaWduZWQgbG9uZyAqbGVmdCwgaW50IGxmaWxsLAorCQl1bnNpZ25lZCBsb25nICpyaWdodCwgaW50IHJmaWxsLAorCQl1bnNpZ25lZCBsb25nICpwYXJlbnQsIGludCBscG9zKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHJmaWxsOyBpKyspIHsKKwkJLyogTW92ZSBhbGwga2V5cyB0byB0aGUgbGVmdCAqLworCQlzZXRrZXkoZ2VvLCBsZWZ0LCBsZmlsbCArIGksIGJrZXkoZ2VvLCByaWdodCwgaSkpOworCQlzZXR2YWwoZ2VvLCBsZWZ0LCBsZmlsbCArIGksIGJ2YWwoZ2VvLCByaWdodCwgaSkpOworCX0KKwkvKiBFeGNoYW5nZSBsZWZ0IGFuZCByaWdodCBjaGlsZCBpbiBwYXJlbnQgKi8KKwlzZXR2YWwoZ2VvLCBwYXJlbnQsIGxwb3MsIHJpZ2h0KTsKKwlzZXR2YWwoZ2VvLCBwYXJlbnQsIGxwb3MgKyAxLCBsZWZ0KTsKKwkvKiBSZW1vdmUgbGVmdCAoZm9ybWVybHkgcmlnaHQpIGNoaWxkIGZyb20gcGFyZW50ICovCisJYnRyZWVfcmVtb3ZlX2xldmVsKGhlYWQsIGdlbywgYmtleShnZW8sIHBhcmVudCwgbHBvcyksIGxldmVsICsgMSk7CisJbWVtcG9vbF9mcmVlKHJpZ2h0LCBoZWFkLT5tZW1wb29sKTsKK30KKworc3RhdGljIHZvaWQgcmViYWxhbmNlKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCXVuc2lnbmVkIGxvbmcgKmtleSwgaW50IGxldmVsLCB1bnNpZ25lZCBsb25nICpjaGlsZCwgaW50IGZpbGwpCit7CisJdW5zaWduZWQgbG9uZyAqcGFyZW50LCAqbGVmdCA9IE5VTEwsICpyaWdodCA9IE5VTEw7CisJaW50IGksIG5vX2xlZnQsIG5vX3JpZ2h0OworCisJaWYgKGZpbGwgPT0gMCkgeworCQkvKiBCZWNhdXNlIHdlIGRvbid0IHN0ZWFsIGVudHJpZXMgZnJvbSBhIG5laWdoYm91ciwgdGhpcyBjYXNlCisJCSAqIGNhbiBoYXBwZW4uICBQYXJlbnQgbm9kZSBjb250YWlucyBhIHNpbmdsZSBjaGlsZCwgdGhpcworCQkgKiBub2RlLCBzbyBtZXJnaW5nIHdpdGggYSBzaWJsaW5nIG5ldmVyIGhhcHBlbnMuCisJCSAqLworCQlidHJlZV9yZW1vdmVfbGV2ZWwoaGVhZCwgZ2VvLCBrZXksIGxldmVsICsgMSk7CisJCW1lbXBvb2xfZnJlZShjaGlsZCwgaGVhZC0+bWVtcG9vbCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJlbnQgPSBmaW5kX2xldmVsKGhlYWQsIGdlbywga2V5LCBsZXZlbCArIDEpOworCWkgPSBnZXRwb3MoZ2VvLCBwYXJlbnQsIGtleSk7CisJQlVHX09OKGJ2YWwoZ2VvLCBwYXJlbnQsIGkpICE9IGNoaWxkKTsKKworCWlmIChpID4gMCkgeworCQlsZWZ0ID0gYnZhbChnZW8sIHBhcmVudCwgaSAtIDEpOworCQlub19sZWZ0ID0gZ2V0ZmlsbChnZW8sIGxlZnQsIDApOworCQlpZiAoZmlsbCArIG5vX2xlZnQgPD0gZ2VvLT5ub19wYWlycykgeworCQkJbWVyZ2UoaGVhZCwgZ2VvLCBsZXZlbCwKKwkJCQkJbGVmdCwgbm9fbGVmdCwKKwkJCQkJY2hpbGQsIGZpbGwsCisJCQkJCXBhcmVudCwgaSAtIDEpOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChpICsgMSA8IGdldGZpbGwoZ2VvLCBwYXJlbnQsIGkpKSB7CisJCXJpZ2h0ID0gYnZhbChnZW8sIHBhcmVudCwgaSArIDEpOworCQlub19yaWdodCA9IGdldGZpbGwoZ2VvLCByaWdodCwgMCk7CisJCWlmIChmaWxsICsgbm9fcmlnaHQgPD0gZ2VvLT5ub19wYWlycykgeworCQkJbWVyZ2UoaGVhZCwgZ2VvLCBsZXZlbCwKKwkJCQkJY2hpbGQsIGZpbGwsCisJCQkJCXJpZ2h0LCBub19yaWdodCwKKwkJCQkJcGFyZW50LCBpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwkvKgorCSAqIFdlIGNvdWxkIGFsc28gdHJ5IHRvIHN0ZWFsIG9uZSBlbnRyeSBmcm9tIHRoZSBsZWZ0IG9yIHJpZ2h0CisJICogbmVpZ2hib3IuICBCeSBub3QgZG9pbmcgc28gd2UgY2hhbmdlZCB0aGUgaW52YXJpYW50IGZyb20KKwkgKiAiYWxsIG5vZGVzIGFyZSBhdCBsZWFzdCBoYWxmIGZ1bGwiIHRvICJubyB0d28gbmVpZ2hib3JpbmcKKwkgKiBub2RlcyBjYW4gYmUgbWVyZ2VkIi4gIFdoaWNoIG1lYW5zIHRoYXQgdGhlIGF2ZXJhZ2UgZmlsbCBvZgorCSAqIGFsbCBub2RlcyBpcyBzdGlsbCBoYWxmIG9yIGJldHRlci4KKwkgKi8KK30KKworc3RhdGljIHZvaWQgKmJ0cmVlX3JlbW92ZV9sZXZlbChzdHJ1Y3QgYnRyZWVfaGVhZCAqaGVhZCwgc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLAorCQl1bnNpZ25lZCBsb25nICprZXksIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBsb25nICpub2RlOworCWludCBpLCBwb3MsIGZpbGw7CisJdm9pZCAqcmV0OworCisJaWYgKGxldmVsID4gaGVhZC0+aGVpZ2h0KSB7CisJCS8qIHdlIHJlY3Vyc2VkIGFsbCB0aGUgd2F5IHVwICovCisJCWhlYWQtPmhlaWdodCA9IDA7CisJCWhlYWQtPm5vZGUgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlub2RlID0gZmluZF9sZXZlbChoZWFkLCBnZW8sIGtleSwgbGV2ZWwpOworCXBvcyA9IGdldHBvcyhnZW8sIG5vZGUsIGtleSk7CisJZmlsbCA9IGdldGZpbGwoZ2VvLCBub2RlLCBwb3MpOworCWlmICgobGV2ZWwgPT0gMSkgJiYgKGtleWNtcChnZW8sIG5vZGUsIHBvcywga2V5KSAhPSAwKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0ID0gYnZhbChnZW8sIG5vZGUsIHBvcyk7CisKKwkvKiByZW1vdmUgYW5kIHNoaWZ0ICovCisJZm9yIChpID0gcG9zOyBpIDwgZmlsbCAtIDE7IGkrKykgeworCQlzZXRrZXkoZ2VvLCBub2RlLCBpLCBia2V5KGdlbywgbm9kZSwgaSArIDEpKTsKKwkJc2V0dmFsKGdlbywgbm9kZSwgaSwgYnZhbChnZW8sIG5vZGUsIGkgKyAxKSk7CisJfQorCWNsZWFycGFpcihnZW8sIG5vZGUsIGZpbGwgLSAxKTsKKworCWlmIChmaWxsIC0gMSA8IGdlby0+bm9fcGFpcnMgLyAyKSB7CisJCWlmIChsZXZlbCA8IGhlYWQtPmhlaWdodCkKKwkJCXJlYmFsYW5jZShoZWFkLCBnZW8sIGtleSwgbGV2ZWwsIG5vZGUsIGZpbGwgLSAxKTsKKwkJZWxzZSBpZiAoZmlsbCAtIDEgPT0gMSkKKwkJCWJ0cmVlX3NocmluayhoZWFkLCBnZW8pOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgKmJ0cmVlX3JlbW92ZShzdHJ1Y3QgYnRyZWVfaGVhZCAqaGVhZCwgc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLAorCQl1bnNpZ25lZCBsb25nICprZXkpCit7CisJaWYgKGhlYWQtPmhlaWdodCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBidHJlZV9yZW1vdmVfbGV2ZWwoaGVhZCwgZ2VvLCBrZXksIDEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfcmVtb3ZlKTsKKworaW50IGJ0cmVlX21lcmdlKHN0cnVjdCBidHJlZV9oZWFkICp0YXJnZXQsIHN0cnVjdCBidHJlZV9oZWFkICp2aWN0aW0sCisJCXN0cnVjdCBidHJlZV9nZW8gKmdlbywgZ2ZwX3QgZ2ZwKQoreworCXVuc2lnbmVkIGxvbmcga2V5W2dlby0+a2V5bGVuXTsKKwl1bnNpZ25lZCBsb25nIGR1cFtnZW8tPmtleWxlbl07CisJdm9pZCAqdmFsOworCWludCBlcnI7CisKKwlCVUdfT04odGFyZ2V0ID09IHZpY3RpbSk7CisKKwlpZiAoISh0YXJnZXQtPm5vZGUpKSB7CisJCS8qIHRhcmdldCBpcyBlbXB0eSwganVzdCBjb3B5IGZpZWxkcyBvdmVyICovCisJCXRhcmdldC0+bm9kZSA9IHZpY3RpbS0+bm9kZTsKKwkJdGFyZ2V0LT5oZWlnaHQgPSB2aWN0aW0tPmhlaWdodDsKKwkJX19idHJlZV9pbml0KHZpY3RpbSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRPRE86IFRoaXMgbmVlZHMgc29tZSBvcHRpbWl6YXRpb25zLiAgQ3VycmVudGx5IHdlIGRvIHRocmVlIHRyZWUKKwkgKiB3YWxrcyB0byByZW1vdmUgYSBzaW5nbGUgb2JqZWN0IGZyb20gdGhlIHZpY3RpbS4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWlmICghYnRyZWVfbGFzdCh2aWN0aW0sIGdlbywga2V5KSkKKwkJCWJyZWFrOworCQl2YWwgPSBidHJlZV9sb29rdXAodmljdGltLCBnZW8sIGtleSk7CisJCWVyciA9IGJ0cmVlX2luc2VydCh0YXJnZXQsIGdlbywga2V5LCB2YWwsIGdmcCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQkvKiBXZSBtdXN0IG1ha2UgYSBjb3B5IG9mIHRoZSBrZXksIGFzIHRoZSBvcmlnaW5hbCB3aWxsIGdldAorCQkgKiBtYW5nbGVkIGluc2lkZSBidHJlZV9yZW1vdmUuICovCisJCWxvbmdjcHkoZHVwLCBrZXksIGdlby0+a2V5bGVuKTsKKwkJYnRyZWVfcmVtb3ZlKHZpY3RpbSwgZ2VvLCBkdXApOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGJ0cmVlX21lcmdlKTsKKworc3RhdGljIHNpemVfdCBfX2J0cmVlX2Zvcl9lYWNoKHN0cnVjdCBidHJlZV9oZWFkICpoZWFkLCBzdHJ1Y3QgYnRyZWVfZ2VvICpnZW8sCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqbm9kZSwgdW5zaWduZWQgbG9uZyBvcGFxdWUsCisJCQkgICAgICAgdm9pZCAoKmZ1bmMpKHZvaWQgKmVsZW0sIHVuc2lnbmVkIGxvbmcgb3BhcXVlLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyAqa2V5LCBzaXplX3QgaW5kZXgsCisJCQkJCSAgICB2b2lkICpmdW5jMiksCisJCQkgICAgICAgdm9pZCAqZnVuYzIsIGludCByZWFwLCBpbnQgaGVpZ2h0LCBzaXplX3QgY291bnQpCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyAqY2hpbGQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ2VvLT5ub19wYWlyczsgaSsrKSB7CisJCWNoaWxkID0gYnZhbChnZW8sIG5vZGUsIGkpOworCQlpZiAoIWNoaWxkKQorCQkJYnJlYWs7CisJCWlmIChoZWlnaHQgPiAxKQorCQkJY291bnQgPSBfX2J0cmVlX2Zvcl9lYWNoKGhlYWQsIGdlbywgY2hpbGQsIG9wYXF1ZSwKKwkJCQkJZnVuYywgZnVuYzIsIHJlYXAsIGhlaWdodCAtIDEsIGNvdW50KTsKKwkJZWxzZQorCQkJZnVuYyhjaGlsZCwgb3BhcXVlLCBia2V5KGdlbywgbm9kZSwgaSksIGNvdW50KyssCisJCQkJCWZ1bmMyKTsKKwl9CisJaWYgKHJlYXApCisJCW1lbXBvb2xfZnJlZShub2RlLCBoZWFkLT5tZW1wb29sKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGVtcHR5KHZvaWQgKmVsZW0sIHVuc2lnbmVkIGxvbmcgb3BhcXVlLCB1bnNpZ25lZCBsb25nICprZXksCisJCSAgc2l6ZV90IGluZGV4LCB2b2lkICpmdW5jMikKK3sKK30KKwordm9pZCB2aXNpdG9ybCh2b2lkICplbGVtLCB1bnNpZ25lZCBsb25nIG9wYXF1ZSwgdW5zaWduZWQgbG9uZyAqa2V5LAorCSAgICAgIHNpemVfdCBpbmRleCwgdm9pZCAqX19mdW5jKQoreworCXZpc2l0b3JsX3QgZnVuYyA9IF9fZnVuYzsKKworCWZ1bmMoZWxlbSwgb3BhcXVlLCAqa2V5LCBpbmRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNpdG9ybCk7CisKK3ZvaWQgdmlzaXRvcjMyKHZvaWQgKmVsZW0sIHVuc2lnbmVkIGxvbmcgb3BhcXVlLCB1bnNpZ25lZCBsb25nICpfX2tleSwKKwkgICAgICAgc2l6ZV90IGluZGV4LCB2b2lkICpfX2Z1bmMpCit7CisJdmlzaXRvcjMyX3QgZnVuYyA9IF9fZnVuYzsKKwl1MzIgKmtleSA9ICh2b2lkICopX19rZXk7CisKKwlmdW5jKGVsZW0sIG9wYXF1ZSwgKmtleSwgaW5kZXgpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodmlzaXRvcjMyKTsKKwordm9pZCB2aXNpdG9yNjQodm9pZCAqZWxlbSwgdW5zaWduZWQgbG9uZyBvcGFxdWUsIHVuc2lnbmVkIGxvbmcgKl9fa2V5LAorCSAgICAgICBzaXplX3QgaW5kZXgsIHZvaWQgKl9fZnVuYykKK3sKKwl2aXNpdG9yNjRfdCBmdW5jID0gX19mdW5jOworCXU2NCAqa2V5ID0gKHZvaWQgKilfX2tleTsKKworCWZ1bmMoZWxlbSwgb3BhcXVlLCAqa2V5LCBpbmRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh2aXNpdG9yNjQpOworCit2b2lkIHZpc2l0b3IxMjgodm9pZCAqZWxlbSwgdW5zaWduZWQgbG9uZyBvcGFxdWUsIHVuc2lnbmVkIGxvbmcgKl9fa2V5LAorCQlzaXplX3QgaW5kZXgsIHZvaWQgKl9fZnVuYykKK3sKKwl2aXNpdG9yMTI4X3QgZnVuYyA9IF9fZnVuYzsKKwl1NjQgKmtleSA9ICh2b2lkICopX19rZXk7CisKKwlmdW5jKGVsZW0sIG9wYXF1ZSwga2V5WzBdLCBrZXlbMV0sIGluZGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZpc2l0b3IxMjgpOworCitzaXplX3QgYnRyZWVfdmlzaXRvcihzdHJ1Y3QgYnRyZWVfaGVhZCAqaGVhZCwgc3RydWN0IGJ0cmVlX2dlbyAqZ2VvLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgb3BhcXVlLAorCQkgICAgIHZvaWQgKCpmdW5jKSh2b2lkICplbGVtLCB1bnNpZ25lZCBsb25nIG9wYXF1ZSwKKwkJICAgICAJCSAgdW5zaWduZWQgbG9uZyAqa2V5LAorCQkgICAgIAkJICBzaXplX3QgaW5kZXgsIHZvaWQgKmZ1bmMyKSwKKwkJICAgICB2b2lkICpmdW5jMikKK3sKKwlzaXplX3QgY291bnQgPSAwOworCisJaWYgKCFmdW5jMikKKwkJZnVuYyA9IGVtcHR5OworCWlmIChoZWFkLT5ub2RlKQorCQljb3VudCA9IF9fYnRyZWVfZm9yX2VhY2goaGVhZCwgZ2VvLCBoZWFkLT5ub2RlLCBvcGFxdWUsIGZ1bmMsCisJCQkJZnVuYzIsIDAsIGhlYWQtPmhlaWdodCwgMCk7CisJcmV0dXJuIGNvdW50OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnRyZWVfdmlzaXRvcik7CisKK3NpemVfdCBidHJlZV9ncmltX3Zpc2l0b3Ioc3RydWN0IGJ0cmVlX2hlYWQgKmhlYWQsIHN0cnVjdCBidHJlZV9nZW8gKmdlbywKKwkJCSAgdW5zaWduZWQgbG9uZyBvcGFxdWUsCisJCQkgIHZvaWQgKCpmdW5jKSh2b2lkICplbGVtLCB1bnNpZ25lZCBsb25nIG9wYXF1ZSwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqa2V5LAorCQkJCSAgICAgICBzaXplX3QgaW5kZXgsIHZvaWQgKmZ1bmMyKSwKKwkJCSAgdm9pZCAqZnVuYzIpCit7CisJc2l6ZV90IGNvdW50ID0gMDsKKworCWlmICghZnVuYzIpCisJCWZ1bmMgPSBlbXB0eTsKKwlpZiAoaGVhZC0+bm9kZSkKKwkJY291bnQgPSBfX2J0cmVlX2Zvcl9lYWNoKGhlYWQsIGdlbywgaGVhZC0+bm9kZSwgb3BhcXVlLCBmdW5jLAorCQkJCWZ1bmMyLCAxLCBoZWFkLT5oZWlnaHQsIDApOworCV9fYnRyZWVfaW5pdChoZWFkKTsKKwlyZXR1cm4gY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChidHJlZV9ncmltX3Zpc2l0b3IpOworCitzdGF0aWMgaW50IF9faW5pdCBidHJlZV9tb2R1bGVfaW5pdCh2b2lkKQoreworCWJ0cmVlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJidHJlZV9ub2RlIiwgTk9ERVNJWkUsIDAsCisJCQlTTEFCX0hXQ0FDSEVfQUxJR04sIE5VTEwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYnRyZWVfbW9kdWxlX2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koYnRyZWVfY2FjaGVwKTsKK30KKworLyogSWYgY29yZSBjb2RlIHN0YXJ0cyB1c2luZyBidHJlZSwgaW5pdGlhbGl6YXRpb24gc2hvdWxkIGhhcHBlbiBldmVuIGVhcmxpZXIgKi8KK21vZHVsZV9pbml0KGJ0cmVlX21vZHVsZV9pbml0KTsKK21vZHVsZV9leGl0KGJ0cmVlX21vZHVsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSm9lcm4gRW5nZWwgPGpvZXJuQGxvZ2ZzLm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9idWcuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2J1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYzlhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9idWcuYwpAQCAtMCwwICsxLDIwMCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgIEdlbmVyaWMgc3VwcG9ydCBmb3IgQlVHKCkKKworICBUaGlzIHJlc3BlY3RzIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9wdGlvbnM6CisKKyAgQ09ORklHX0JVRyAtIGVtaXQgQlVHIHRyYXBzLiAgTm90aGluZyBoYXBwZW5zIHdpdGhvdXQgdGhpcy4KKyAgQ09ORklHX0dFTkVSSUNfQlVHIC0gZW5hYmxlIHRoaXMgY29kZS4KKyAgQ09ORklHX0dFTkVSSUNfQlVHX1JFTEFUSVZFX1BPSU5URVJTIC0gdXNlIDMyLWJpdCBwb2ludGVycyByZWxhdGl2ZSB0bworCXRoZSBjb250YWluaW5nIHN0cnVjdCBidWdfZW50cnkgZm9yIGJ1Z19hZGRyIGFuZCBmaWxlLgorICBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSAtIGVtaXQgZnVsbCBmaWxlK2xpbmUgaW5mb3JtYXRpb24gZm9yIGVhY2ggQlVHCisKKyAgQ09ORklHX0JVRyBhbmQgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgYXJlIHBvdGVudGlhbGx5IHVzZXItc2V0dGFibGUKKyAgKHRob3VnaCB0aGV5J3JlIGdlbmVyYWxseSBhbHdheXMgb24pLgorCisgIENPTkZJR19HRU5FUklDX0JVRyBpcyBzZXQgYnkgZWFjaCBhcmNoaXRlY3R1cmUgdXNpbmcgdGhpcyBjb2RlLgorCisgIFRvIHVzZSB0aGlzLCB5b3VyIGFyY2hpdGVjdHVyZSBtdXN0OgorCisgIDEuIFNldCB1cCB0aGUgY29uZmlnIG9wdGlvbnM6CisgICAgIC0gRW5hYmxlIENPTkZJR19HRU5FUklDX0JVRyBpZiBDT05GSUdfQlVHCisKKyAgMi4gSW1wbGVtZW50IEJVRyAoYW5kIG9wdGlvbmFsbHkgQlVHX09OLCBXQVJOLCBXQVJOX09OKQorICAgICAtIERlZmluZSBIQVZFX0FSQ0hfQlVHCisgICAgIC0gSW1wbGVtZW50IEJVRygpIHRvIGdlbmVyYXRlIGEgZmF1bHRpbmcgaW5zdHJ1Y3Rpb24KKyAgICAgLSBOT1RFOiBzdHJ1Y3QgYnVnX2VudHJ5IGRvZXMgbm90IGhhdmUgImZpbGUiIG9yICJsaW5lIiBlbnRyaWVzCisgICAgICAgd2hlbiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3QgZW5hYmxlZCwgc28geW91IG11c3QgZ2VuZXJhdGUKKyAgICAgICB0aGUgdmFsdWVzIGFjY29yZGluZ2x5LgorCisgIDMuIEltcGxlbWVudCB0aGUgdHJhcAorICAgICAtIEluIHRoZSBpbGxlZ2FsIGluc3RydWN0aW9uIHRyYXAgaGFuZGxlciAodHlwaWNhbGx5KSwgdmVyaWZ5CisgICAgICAgdGhhdCB0aGUgZmF1bHQgd2FzIGluIGtlcm5lbCBtb2RlLCBhbmQgY2FsbCByZXBvcnRfYnVnKCkKKyAgICAgLSByZXBvcnRfYnVnKCkgd2lsbCByZXR1cm4gd2hldGhlciBpdCB3YXMgYSBmYWxzZSBhbGFybSwgYSB3YXJuaW5nLAorICAgICAgIG9yIGFuIGFjdHVhbCBidWcuCisgICAgIC0gWW91IG11c3QgaW1wbGVtZW50IHRoZSBpc192YWxpZF9idWdhZGRyKGJ1Z2FkZHIpIGNhbGxiYWNrIHdoaWNoCisgICAgICAgcmV0dXJucyB0cnVlIGlmIHRoZSBlaXAgaXMgYSByZWFsIGtlcm5lbCBhZGRyZXNzLCBhbmQgaXQgcG9pbnRzCisgICAgICAgdG8gdGhlIGV4cGVjdGVkIEJVRyB0cmFwIGluc3RydWN0aW9uLgorCisgICAgSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QGdvb3Aub3JnPiAyMDA2CisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKworZXh0ZXJuIHN0cnVjdCBidWdfZW50cnkgX19zdGFydF9fX2J1Z190YWJsZVtdLCBfX3N0b3BfX19idWdfdGFibGVbXTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ1Z19hZGRyKGNvbnN0IHN0cnVjdCBidWdfZW50cnkgKmJ1ZykKK3sKKyNpZm5kZWYgQ09ORklHX0dFTkVSSUNfQlVHX1JFTEFUSVZFX1BPSU5URVJTCisJcmV0dXJuIGJ1Zy0+YnVnX2FkZHI7CisjZWxzZQorCXJldHVybiAodW5zaWduZWQgbG9uZylidWcgKyBidWctPmJ1Z19hZGRyX2Rpc3A7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJR19NT0RVTEVTCisvKiBVcGRhdGVzIGFyZSBwcm90ZWN0ZWQgYnkgbW9kdWxlIG11dGV4ICovCitzdGF0aWMgTElTVF9IRUFEKG1vZHVsZV9idWdfbGlzdCk7CisKK3N0YXRpYyBzdHJ1Y3QgYnVnX2VudHJ5ICptb2R1bGVfZmluZF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyKQoreworCXN0cnVjdCBtb2R1bGUgKm1vZDsKKwlzdHJ1Y3QgYnVnX2VudHJ5ICpidWcgPSBOVUxMOworCisJcmN1X3JlYWRfbG9ja19zY2hlZCgpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KG1vZCwgJm1vZHVsZV9idWdfbGlzdCwgYnVnX2xpc3QpIHsKKwkJdW5zaWduZWQgaTsKKworCQlidWcgPSBtb2QtPmJ1Z190YWJsZTsKKwkJZm9yIChpID0gMDsgaSA8IG1vZC0+bnVtX2J1Z3M7ICsraSwgKytidWcpCisJCQlpZiAoYnVnYWRkciA9PSBidWdfYWRkcihidWcpKQorCQkJCWdvdG8gb3V0OworCX0KKwlidWcgPSBOVUxMOworb3V0OgorCXJjdV9yZWFkX3VubG9ja19zY2hlZCgpOworCisJcmV0dXJuIGJ1ZzsKK30KKwordm9pZCBtb2R1bGVfYnVnX2ZpbmFsaXplKGNvbnN0IEVsZl9FaGRyICpoZHIsIGNvbnN0IEVsZl9TaGRyICpzZWNoZHJzLAorCQkJIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwljaGFyICpzZWNzdHJpbmdzOworCXVuc2lnbmVkIGludCBpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbW9kdWxlX211dGV4KTsKKworCW1vZC0+YnVnX3RhYmxlID0gTlVMTDsKKwltb2QtPm51bV9idWdzID0gMDsKKworCS8qIEZpbmQgdGhlIF9fYnVnX3RhYmxlIHNlY3Rpb24sIGlmIHByZXNlbnQgKi8KKwlzZWNzdHJpbmdzID0gKGNoYXIgKiloZHIgKyBzZWNoZHJzW2hkci0+ZV9zaHN0cm5keF0uc2hfb2Zmc2V0OworCWZvciAoaSA9IDE7IGkgPCBoZHItPmVfc2hudW07IGkrKykgeworCQlpZiAoc3RyY21wKHNlY3N0cmluZ3Mrc2VjaGRyc1tpXS5zaF9uYW1lLCAiX19idWdfdGFibGUiKSkKKwkJCWNvbnRpbnVlOworCQltb2QtPmJ1Z190YWJsZSA9ICh2b2lkICopIHNlY2hkcnNbaV0uc2hfYWRkcjsKKwkJbW9kLT5udW1fYnVncyA9IHNlY2hkcnNbaV0uc2hfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgYnVnX2VudHJ5KTsKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBTdHJpY3RseSBzcGVha2luZyB0aGlzIHNob3VsZCBoYXZlIGEgc3BpbmxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0CisJICogdHJhdmVyc2FscywgYnV0IHNpbmNlIHdlIG9ubHkgdHJhdmVyc2Ugb24gQlVHKClzLCBhIHNwaW5sb2NrCisJICogY291bGQgcG90ZW50aWFsbHkgbGVhZCB0byBkZWFkbG9jayBhbmQgdGh1cyBiZSBjb3VudGVyLXByb2R1Y3RpdmUuCisJICogVGh1cywgdGhpcyB1c2VzIFJDVSB0byBzYWZlbHkgbWFuaXB1bGF0ZSB0aGUgYnVnIGxpc3QsIHNpbmNlIEJVRworCSAqIG11c3QgcnVuIGluIG5vbi1pbnRlcnJ1cHRpdmUgc3RhdGUuCisJICovCisJbGlzdF9hZGRfcmN1KCZtb2QtPmJ1Z19saXN0LCAmbW9kdWxlX2J1Z19saXN0KTsKK30KKwordm9pZCBtb2R1bGVfYnVnX2NsZWFudXAoc3RydWN0IG1vZHVsZSAqbW9kKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJm1vZHVsZV9tdXRleCk7CisJbGlzdF9kZWxfcmN1KCZtb2QtPmJ1Z19saXN0KTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgYnVnX2VudHJ5ICptb2R1bGVfZmluZF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKK3N0cnVjdCBidWdfZW50cnkgKmZpbmRfYnVnKHVuc2lnbmVkIGxvbmcgYnVnYWRkcikKK3sKKwlzdHJ1Y3QgYnVnX2VudHJ5ICpidWc7CisKKwlmb3IgKGJ1ZyA9IF9fc3RhcnRfX19idWdfdGFibGU7IGJ1ZyA8IF9fc3RvcF9fX2J1Z190YWJsZTsgKytidWcpCisJCWlmIChidWdhZGRyID09IGJ1Z19hZGRyKGJ1ZykpCisJCQlyZXR1cm4gYnVnOworCisJcmV0dXJuIG1vZHVsZV9maW5kX2J1ZyhidWdhZGRyKTsKK30KKworZW51bSBidWdfdHJhcF90eXBlIHJlcG9ydF9idWcodW5zaWduZWQgbG9uZyBidWdhZGRyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYnVnX2VudHJ5ICpidWc7CisJY29uc3QgY2hhciAqZmlsZTsKKwl1bnNpZ25lZCBsaW5lLCB3YXJuaW5nLCBvbmNlLCBkb25lOworCisJaWYgKCFpc192YWxpZF9idWdhZGRyKGJ1Z2FkZHIpKQorCQlyZXR1cm4gQlVHX1RSQVBfVFlQRV9OT05FOworCisJYnVnID0gZmluZF9idWcoYnVnYWRkcik7CisJaWYgKCFidWcpCisJCXJldHVybiBCVUdfVFJBUF9UWVBFX05PTkU7CisKKwlmaWxlID0gTlVMTDsKKwlsaW5lID0gMDsKKwl3YXJuaW5nID0gMDsKKworCWlmIChidWcpIHsKKyNpZmRlZiBDT05GSUdfREVCVUdfQlVHVkVSQk9TRQorI2lmbmRlZiBDT05GSUdfR0VORVJJQ19CVUdfUkVMQVRJVkVfUE9JTlRFUlMKKwkJZmlsZSA9IGJ1Zy0+ZmlsZTsKKyNlbHNlCisJCWZpbGUgPSAoY29uc3QgY2hhciAqKWJ1ZyArIGJ1Zy0+ZmlsZV9kaXNwOworI2VuZGlmCisJCWxpbmUgPSBidWctPmxpbmU7CisjZW5kaWYKKwkJd2FybmluZyA9IChidWctPmZsYWdzICYgQlVHRkxBR19XQVJOSU5HKSAhPSAwOworCQlvbmNlID0gKGJ1Zy0+ZmxhZ3MgJiBCVUdGTEFHX09OQ0UpICE9IDA7CisJCWRvbmUgPSAoYnVnLT5mbGFncyAmIEJVR0ZMQUdfRE9ORSkgIT0gMDsKKworCQlpZiAod2FybmluZyAmJiBvbmNlKSB7CisJCQlpZiAoZG9uZSkKKwkJCQlyZXR1cm4gQlVHX1RSQVBfVFlQRV9XQVJOOworCisJCQkvKgorCQkJICogU2luY2UgdGhpcyBpcyB0aGUgb25seSBzdG9yZSwgY29uY3VycmVuY3kgaXMgbm90IGFuIGlzc3VlLgorCQkJICovCisJCQlidWctPmZsYWdzIHw9IEJVR0ZMQUdfRE9ORTsKKwkJfQorCX0KKworCWlmICh3YXJuaW5nKSB7CisJCS8qIHRoaXMgaXMgYSBXQVJOX09OIHJhdGhlciB0aGFuIEJVRy9CVUdfT04gKi8KKwkJX193YXJuKGZpbGUsIGxpbmUsICh2b2lkICopYnVnYWRkciwgQlVHX0dFVF9UQUlOVChidWcpLCByZWdzLAorCQkgICAgICAgTlVMTCk7CisJCXJldHVybiBCVUdfVFJBUF9UWVBFX1dBUk47CisJfQorCisJcHJpbnRrKEtFUk5fREVGQVVMVCAiLS0tLS0tLS0tLS0tWyBjdXQgaGVyZSBdLS0tLS0tLS0tLS0tXG4iKTsKKworCWlmIChmaWxlKQorCQlwcl9jcml0KCJrZXJuZWwgQlVHIGF0ICVzOiV1IVxuIiwgZmlsZSwgbGluZSk7CisJZWxzZQorCQlwcl9jcml0KCJLZXJuZWwgQlVHIGF0ICVwIFt2ZXJib3NlIGRlYnVnIGluZm8gdW5hdmFpbGFibGVdXG4iLAorCQkJKHZvaWQgKilidWdhZGRyKTsKKworCXJldHVybiBCVUdfVFJBUF9UWVBFX0JVRzsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2J1aWxkX09JRF9yZWdpc3RyeSBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2J1aWxkX09JRF9yZWdpc3RyeQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDk4MjcyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYnVpbGRfT0lEX3JlZ2lzdHJ5CkBAIC0wLDAgKzEsMjA3IEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgQnVpbGQgYSBzdGF0aWMgQVNOLjEgT2JqZWN0IElkZW50aWZpZWQgKE9JRCkgcmVnaXN0cnkKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDEyIFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisjIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisjIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorIyAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworCit1c2Ugc3RyaWN0OworCitteSBAbmFtZXMgPSAoKTsKK215IEBvaWRzID0gKCk7CisKK2lmICgkI0FSR1YgIT0gMSkgeworICAgIHByaW50IFNUREVSUiAiRm9ybWF0OiAiLCAkMCwgIiA8aW4taC1maWxlPiA8b3V0LWMtZmlsZT5cbiI7CisgICAgZXhpdCgyKTsKK30KKworIworIyBPcGVuIHRoZSBmaWxlIHRvIHJlYWQgZnJvbQorIworb3BlbiBJTl9GSUxFLCAiPCRBUkdWWzBdIiB8fCBkaWU7Cit3aGlsZSAoPElOX0ZJTEU+KSB7CisgICAgY2hvbXA7CisgICAgaWYgKG0hXHMrT0lEXyhbYS16QS16XVthLXpBLVowLTlfXSspLFxzKy9bKl1ccysoWzAxMl1bLjAtOV0qKVxzK1sqXS8hKSB7CisJcHVzaCBAbmFtZXMsICQxOworCXB1c2ggQG9pZHMsICQyOworICAgIH0KK30KK2Nsb3NlIElOX0ZJTEUgfHwgZGllOworCisjCisjIE9wZW4gdGhlIGZpbGVzIHRvIHdyaXRlIGludG8KKyMKK29wZW4gQ19GSUxFLCAiPiRBUkdWWzFdIiBvciBkaWU7CitwcmludCBDX0ZJTEUgIi8qXG4iOworcHJpbnQgQ19GSUxFICIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSAiLCAkMCwgIi4gIERvIG5vdCBlZGl0XG4iOworcHJpbnQgQ19GSUxFICIgKi9cbiI7CisKKyMKKyMgU3BsaXQgdGhlIGRhdGEgdXAgaW50byBzZXBhcmF0ZSBsaXN0cyBhbmQgYWxzbyBkZXRlcm1pbmUgdGhlIGxlbmd0aHMgb2YgdGhlCisjIGVuY29kZWQgZGF0YSBhcnJheXMuCisjCitteSBAaW5kaWNlcyA9ICgpOworbXkgQGxlbmd0aHMgPSAoKTsKK215ICR0b3RhbF9sZW5ndGggPSAwOworCitmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNuYW1lczsgJGkrKykgeworICAgIG15ICRuYW1lID0gJG5hbWVzWyRpXTsKKyAgICBteSAkb2lkID0gJG9pZHNbJGldOworCisgICAgbXkgQGNvbXBvbmVudHMgPSBzcGxpdCgvWy5dLywgJG9pZCk7CisKKyAgICAjIERldGVybWluZSB0aGUgZW5jb2RlZCBsZW5ndGggb2YgdGhpcyBPSUQKKyAgICBteSAkc2l6ZSA9ICQjY29tcG9uZW50czsKKyAgICBmb3IgKG15ICRsb29wID0gMjsgJGxvb3AgPD0gJCNjb21wb25lbnRzOyAkbG9vcCsrKSB7CisJbXkgJGMgPSAkY29tcG9uZW50c1skbG9vcF07CisKKwkjIFdlIHdpbGwgYmFzZTEyOCBlbmNvZGUgdGhlIG51bWJlcgorCW15ICR0bXAgPSAoJGMgPT0gMCkgPyAwIDogaW50KGxvZygkYykvbG9nKDIpKTsKKwkkdG1wID0gaW50KCR0bXAgLyA3KTsKKwkkc2l6ZSArPSAkdG1wOworICAgIH0KKyAgICBwdXNoIEBsZW5ndGhzLCAkc2l6ZTsKKyAgICBwdXNoIEBpbmRpY2VzLCAkdG90YWxfbGVuZ3RoOworICAgICR0b3RhbF9sZW5ndGggKz0gJHNpemU7Cit9CisKKyMKKyMgRW1pdCB0aGUgbG9vay11cC1ieS1PSUQgaW5kZXggdGFibGUKKyMKK3ByaW50IENfRklMRSAiXG4iOworaWYgKCR0b3RhbF9sZW5ndGggPD0gMjU1KSB7CisgICAgcHJpbnQgQ19GSUxFICJzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvaWRfaW5kZXhbT0lEX19OUiArIDFdID0ge1xuIjsKK30gZWxzZSB7CisgICAgcHJpbnQgQ19GSUxFICJzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb2lkX2luZGV4W09JRF9fTlIgKyAxXSA9IHtcbiI7Cit9Citmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNuYW1lczsgJGkrKykgeworICAgIHByaW50IENfRklMRSAiXHRbT0lEXyIsICRuYW1lc1skaV0sICJdID0gIiwgJGluZGljZXNbJGldLCAiLFxuIgorfQorcHJpbnQgQ19GSUxFICJcdFtPSURfX05SXSA9ICIsICR0b3RhbF9sZW5ndGgsICJcbiI7CitwcmludCBDX0ZJTEUgIn07XG4iOworCisjCisjIEVuY29kZSB0aGUgT0lEcworIworbXkgQGVuY29kZWRfb2lkcyA9ICgpOworCitmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNuYW1lczsgJGkrKykgeworICAgIG15IEBvY3RldHMgPSAoKTsKKworICAgIG15IEBjb21wb25lbnRzID0gc3BsaXQoL1suXS8sICRvaWRzWyRpXSk7CisKKyAgICBwdXNoIEBvY3RldHMsICRjb21wb25lbnRzWzBdICogNDAgKyAkY29tcG9uZW50c1sxXTsKKworICAgIGZvciAobXkgJGxvb3AgPSAyOyAkbG9vcCA8PSAkI2NvbXBvbmVudHM7ICRsb29wKyspIHsKKwlteSAkYyA9ICRjb21wb25lbnRzWyRsb29wXTsKKworCSMgQmFzZTEyOCBlbmNvZGUgdGhlIG51bWJlcgorCW15ICR0bXAgPSAoJGMgPT0gMCkgPyAwIDogaW50KGxvZygkYykvbG9nKDIpKTsKKwkkdG1wID0gaW50KCR0bXAgLyA3KTsKKworCWZvciAoOyAkdG1wID4gMDsgJHRtcC0tKSB7CisJICAgIHB1c2ggQG9jdGV0cywgKCgkYyA+PiAkdG1wICogNykgJiAweDdmKSB8IDB4ODA7CisJfQorCXB1c2ggQG9jdGV0cywgJGMgJiAweDdmOworICAgIH0KKworICAgIHB1c2ggQGVuY29kZWRfb2lkcywgXEBvY3RldHM7Cit9CisKKyMKKyMgQ3JlYXRlIGEgaGFzaCB2YWx1ZSBmb3IgZWFjaCBPSUQKKyMKK215IEBoYXNoX3ZhbHVlcyA9ICgpOworZm9yIChteSAkaSA9IDA7ICRpIDw9ICQjbmFtZXM7ICRpKyspIHsKKyAgICBteSBAb2N0ZXRzID0gQHskZW5jb2RlZF9vaWRzWyRpXX07CisKKyAgICBteSAkaGFzaCA9ICQjb2N0ZXRzOworICAgIGZvcmVhY2ggKEBvY3RldHMpIHsKKwkkaGFzaCArPSAkXyAqIDMzOworICAgIH0KKworICAgICRoYXNoID0gKCRoYXNoID4+IDI0KSBeICgkaGFzaCA+PiAxNikgXiAoJGhhc2ggPj4gOCkgXiAoJGhhc2gpOworCisgICAgcHVzaCBAaGFzaF92YWx1ZXMsICRoYXNoICYgMHhmZjsKK30KKworIworIyBFbWl0IHRoZSBPSUQgZGF0YQorIworcHJpbnQgQ19GSUxFICJcbiI7CitwcmludCBDX0ZJTEUgInN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG9pZF9kYXRhWyIsICR0b3RhbF9sZW5ndGgsICJdID0ge1xuIjsKK2ZvciAobXkgJGkgPSAwOyAkaSA8PSAkI25hbWVzOyAkaSsrKSB7CisgICAgbXkgQG9jdGV0cyA9IEB7JGVuY29kZWRfb2lkc1skaV19OworICAgIHByaW50IENfRklMRSAiXHQiOworICAgIHByaW50IENfRklMRSAkXywgIiwgIiBmb3JlYWNoIChAb2N0ZXRzKTsKKyAgICBwcmludCBDX0ZJTEUgIlx0Ly8gIiwgJG5hbWVzWyRpXTsKKyAgICBwcmludCBDX0ZJTEUgIlxuIjsKK30KK3ByaW50IENfRklMRSAifTtcbiI7CisKKyMKKyMgQnVpbGQgdGhlIHNlYXJjaCBpbmRleCB0YWJsZSAob3JkZXJlZCBieSBsZW5ndGggdGhlbiBoYXNoIHRoZW4gY29udGVudCkKKyMKK215IEBpbmRleF90YWJsZSA9ICggMCAuLiAkI25hbWVzICk7CisKK0BpbmRleF90YWJsZSA9IHNvcnQgeworICAgIG15IEBvY3RldHNfYSA9IEB7JGVuY29kZWRfb2lkc1skYV19OworICAgIG15IEBvY3RldHNfYiA9IEB7JGVuY29kZWRfb2lkc1skYl19OworCisgICAgcmV0dXJuICRoYXNoX3ZhbHVlc1skYV0gPD0+ICRoYXNoX3ZhbHVlc1skYl0KKwlpZiAoJGhhc2hfdmFsdWVzWyRhXSAhPSAkaGFzaF92YWx1ZXNbJGJdKTsKKyAgICByZXR1cm4gJCNvY3RldHNfYSA8PT4gJCNvY3RldHNfYgorCWlmICgkI29jdGV0c19hICE9ICQjb2N0ZXRzX2IpOworICAgIGZvciAobXkgJGkgPSAkI29jdGV0c19hOyAkaSA+PSAwOyAkaS0tKSB7CisJcmV0dXJuICRvY3RldHNfYVskaV0gPD0+ICRvY3RldHNfYlskaV0KKwkgICAgaWYgKCRvY3RldHNfYVskaV0gIT0gJG9jdGV0c19iWyRpXSk7CisgICAgfQorICAgIHJldHVybiAwOworCit9IEBpbmRleF90YWJsZTsKKworIworIyBFbWl0IHRoZSBzZWFyY2ggaW5kZXggYW5kIGhhc2ggdmFsdWUgdGFibGUKKyMKK3ByaW50IENfRklMRSAiXG4iOworcHJpbnQgQ19GSUxFICJzdGF0aWMgY29uc3Qgc3RydWN0IHtcbiI7CitwcmludCBDX0ZJTEUgIlx0dW5zaWduZWQgY2hhciBoYXNoO1xuIjsKK2lmICgkI25hbWVzIDw9IDI1NSkgeworICAgIHByaW50IENfRklMRSAiXHRlbnVtIE9JRCBvaWQgOiA4O1xuIjsKK30gZWxzZSB7CisgICAgcHJpbnQgQ19GSUxFICJcdGVudW0gT0lEIG9pZCA6IDE2O1xuIjsKK30KK3ByaW50IENfRklMRSAifSBvaWRfc2VhcmNoX3RhYmxlW09JRF9fTlJdID0ge1xuIjsKK2ZvciAobXkgJGkgPSAwOyAkaSA8PSAkI25hbWVzOyAkaSsrKSB7CisgICAgbXkgQG9jdGV0cyA9IEB7JGVuY29kZWRfb2lkc1skaW5kZXhfdGFibGVbJGldXX07CisgICAgcHJpbnRmKENfRklMRSAiXHRbJTN1XSA9IHsgJTN1LCBPSURfJS0zNXMgfSwgLy8gIiwKKwkgICAkaSwKKwkgICAkaGFzaF92YWx1ZXNbJGluZGV4X3RhYmxlWyRpXV0sCisJICAgJG5hbWVzWyRpbmRleF90YWJsZVskaV1dKTsKKyAgICBwcmludGYgQ19GSUxFICIlMDJ4IiwgJF8gZm9yZWFjaCAoQG9jdGV0cyk7CisgICAgcHJpbnQgQ19GSUxFICJcbiI7Cit9CitwcmludCBDX0ZJTEUgIn07XG4iOworCisjCisjIEVtaXQgdGhlIE9JRCBkZWJ1Z2dpbmcgbmFtZSB0YWJsZQorIworI3ByaW50IENfRklMRSAiXG4iOworI3ByaW50IENfRklMRSAiY29uc3QgY2hhciAqY29uc3Qgb2lkX25hbWVfdGFibGVbT0lEX19OUiArIDFdID0ge1xuIjsKKyMKKyNmb3IgKG15ICRpID0gMDsgJGkgPD0gJCNuYW1lczsgJGkrKykgeworIyAgICBwcmludCBDX0ZJTEUgIlx0XCIiLCAkbmFtZXNbJGldLCAiXCIsXG4iCisjfQorI3ByaW50IENfRklMRSAiXHRcIlVua25vd24tT0lEXCJcbiI7CisjcHJpbnQgQ19GSUxFICJ9O1xuIjsKKworIworIyBQb2xpc2ggb2ZmCisjCitjbG9zZSBDX0ZJTEUgb3IgZGllOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvYnVzdF9zcGlubG9ja3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2J1c3Rfc3BpbmxvY2tzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3MTk0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2J1c3Rfc3BpbmxvY2tzLmMKQEAgLTAsMCArMSwzMiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBsaWIvYnVzdF9zcGlubG9ja3MuYworICoKKyAqIFByb3ZpZGVzIGEgbWluaW1hbCBidXN0X3NwaW5sb2NrcyBmb3IgYXJjaGl0ZWN0dXJlcyB3aGljaCBkb24ndCBoYXZlIG9uZSBvZiB0aGVpciBvd24uCisgKgorICogYnVzdF9zcGlubG9ja3MoKSBjbGVhcnMgYW55IHNwaW5sb2NrcyB3aGljaCB3b3VsZCBwcmV2ZW50IG9vcHMsIGRpZSgpLCBCVUcoKQorICogYW5kIHBhbmljKCkgaW5mb3JtYXRpb24gZnJvbSByZWFjaGluZyB0aGUgdXNlci4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90dHkuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KKworCit2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBidXN0X3NwaW5sb2NrcyhpbnQgeWVzKQoreworCWlmICh5ZXMpIHsKKwkJKytvb3BzX2luX3Byb2dyZXNzOworCX0gZWxzZSB7CisjaWZkZWYgQ09ORklHX1ZUCisJCXVuYmxhbmtfc2NyZWVuKCk7CisjZW5kaWYKKwkJY29uc29sZV91bmJsYW5rKCk7CisJCWlmICgtLW9vcHNfaW5fcHJvZ3Jlc3MgPT0gMCkKKwkJCXdha2VfdXBfa2xvZ2QoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jaGFjaGEyMC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY2hhY2hhMjAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTBjZWVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY2hhY2hhMjAuYwpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ2hhQ2hhMjAgMjU2LWJpdCBjaXBoZXIgYWxnb3JpdGhtLCBSRkM3NTM5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IE1hcnRpbiBXaWxsaQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyeXB0b2hhc2guaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8Y3J5cHRvL2NoYWNoYTIwLmg+CisKK3N0YXRpYyBpbmxpbmUgdTMyIHJvdGwzMih1MzIgdiwgdTggbikKK3sKKwlyZXR1cm4gKHYgPDwgbikgfCAodiA+PiAoc2l6ZW9mKHYpICogOCAtIG4pKTsKK30KKworZXh0ZXJuIHZvaWQgY2hhY2hhMjBfYmxvY2sodTMyICpzdGF0ZSwgdm9pZCAqc3RyZWFtKQoreworCXUzMiB4WzE2XSwgKm91dCA9IHN0cmVhbTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHgpOyBpKyspCisJCXhbaV0gPSBzdGF0ZVtpXTsKKworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSArPSAyKSB7CisJCXhbMF0gICs9IHhbNF07ICAgIHhbMTJdID0gcm90bDMyKHhbMTJdIF4geFswXSwgIDE2KTsKKwkJeFsxXSAgKz0geFs1XTsgICAgeFsxM10gPSByb3RsMzIoeFsxM10gXiB4WzFdLCAgMTYpOworCQl4WzJdICArPSB4WzZdOyAgICB4WzE0XSA9IHJvdGwzMih4WzE0XSBeIHhbMl0sICAxNik7CisJCXhbM10gICs9IHhbN107ICAgIHhbMTVdID0gcm90bDMyKHhbMTVdIF4geFszXSwgIDE2KTsKKworCQl4WzhdICArPSB4WzEyXTsgICB4WzRdICA9IHJvdGwzMih4WzRdICBeIHhbOF0sICAxMik7CisJCXhbOV0gICs9IHhbMTNdOyAgIHhbNV0gID0gcm90bDMyKHhbNV0gIF4geFs5XSwgIDEyKTsKKwkJeFsxMF0gKz0geFsxNF07ICAgeFs2XSAgPSByb3RsMzIoeFs2XSAgXiB4WzEwXSwgMTIpOworCQl4WzExXSArPSB4WzE1XTsgICB4WzddICA9IHJvdGwzMih4WzddICBeIHhbMTFdLCAxMik7CisKKwkJeFswXSAgKz0geFs0XTsgICAgeFsxMl0gPSByb3RsMzIoeFsxMl0gXiB4WzBdLCAgIDgpOworCQl4WzFdICArPSB4WzVdOyAgICB4WzEzXSA9IHJvdGwzMih4WzEzXSBeIHhbMV0sICAgOCk7CisJCXhbMl0gICs9IHhbNl07ICAgIHhbMTRdID0gcm90bDMyKHhbMTRdIF4geFsyXSwgICA4KTsKKwkJeFszXSAgKz0geFs3XTsgICAgeFsxNV0gPSByb3RsMzIoeFsxNV0gXiB4WzNdLCAgIDgpOworCisJCXhbOF0gICs9IHhbMTJdOyAgIHhbNF0gID0gcm90bDMyKHhbNF0gIF4geFs4XSwgICA3KTsKKwkJeFs5XSAgKz0geFsxM107ICAgeFs1XSAgPSByb3RsMzIoeFs1XSAgXiB4WzldLCAgIDcpOworCQl4WzEwXSArPSB4WzE0XTsgICB4WzZdICA9IHJvdGwzMih4WzZdICBeIHhbMTBdLCAgNyk7CisJCXhbMTFdICs9IHhbMTVdOyAgIHhbN10gID0gcm90bDMyKHhbN10gIF4geFsxMV0sICA3KTsKKworCQl4WzBdICArPSB4WzVdOyAgICB4WzE1XSA9IHJvdGwzMih4WzE1XSBeIHhbMF0sICAxNik7CisJCXhbMV0gICs9IHhbNl07ICAgIHhbMTJdID0gcm90bDMyKHhbMTJdIF4geFsxXSwgIDE2KTsKKwkJeFsyXSAgKz0geFs3XTsgICAgeFsxM10gPSByb3RsMzIoeFsxM10gXiB4WzJdLCAgMTYpOworCQl4WzNdICArPSB4WzRdOyAgICB4WzE0XSA9IHJvdGwzMih4WzE0XSBeIHhbM10sICAxNik7CisKKwkJeFsxMF0gKz0geFsxNV07ICAgeFs1XSAgPSByb3RsMzIoeFs1XSAgXiB4WzEwXSwgMTIpOworCQl4WzExXSArPSB4WzEyXTsgICB4WzZdICA9IHJvdGwzMih4WzZdICBeIHhbMTFdLCAxMik7CisJCXhbOF0gICs9IHhbMTNdOyAgIHhbN10gID0gcm90bDMyKHhbN10gIF4geFs4XSwgIDEyKTsKKwkJeFs5XSAgKz0geFsxNF07ICAgeFs0XSAgPSByb3RsMzIoeFs0XSAgXiB4WzldLCAgMTIpOworCisJCXhbMF0gICs9IHhbNV07ICAgIHhbMTVdID0gcm90bDMyKHhbMTVdIF4geFswXSwgICA4KTsKKwkJeFsxXSAgKz0geFs2XTsgICAgeFsxMl0gPSByb3RsMzIoeFsxMl0gXiB4WzFdLCAgIDgpOworCQl4WzJdICArPSB4WzddOyAgICB4WzEzXSA9IHJvdGwzMih4WzEzXSBeIHhbMl0sICAgOCk7CisJCXhbM10gICs9IHhbNF07ICAgIHhbMTRdID0gcm90bDMyKHhbMTRdIF4geFszXSwgICA4KTsKKworCQl4WzEwXSArPSB4WzE1XTsgICB4WzVdICA9IHJvdGwzMih4WzVdICBeIHhbMTBdLCAgNyk7CisJCXhbMTFdICs9IHhbMTJdOyAgIHhbNl0gID0gcm90bDMyKHhbNl0gIF4geFsxMV0sICA3KTsKKwkJeFs4XSAgKz0geFsxM107ICAgeFs3XSAgPSByb3RsMzIoeFs3XSAgXiB4WzhdLCAgIDcpOworCQl4WzldICArPSB4WzE0XTsgICB4WzRdICA9IHJvdGwzMih4WzRdICBeIHhbOV0sICAgNyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeCk7IGkrKykKKwkJb3V0W2ldID0gY3B1X3RvX2xlMzIoeFtpXSArIHN0YXRlW2ldKTsKKworCXN0YXRlWzEyXSsrOworfQorRVhQT1JUX1NZTUJPTChjaGFjaGEyMF9ibG9jayk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jaGVja19zaWduYXR1cmUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NoZWNrX3NpZ25hdHVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTczMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jaGVja19zaWduYXR1cmUuYwpAQCAtMCwwICsxLDI3IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKy8qKgorICoJY2hlY2tfc2lnbmF0dXJlCQktCWZpbmQgQklPUyBzaWduYXR1cmVzCisgKglAaW9fYWRkcjogbW1pbyBhZGRyZXNzIHRvIGNoZWNrCisgKglAc2lnbmF0dXJlOiAgc2lnbmF0dXJlIGJsb2NrCisgKglAbGVuZ3RoOiBsZW5ndGggb2Ygc2lnbmF0dXJlCisgKgorICoJUGVyZm9ybSBhIHNpZ25hdHVyZSBjb21wYXJpc29uIHdpdGggdGhlIG1taW8gYWRkcmVzcyBpb19hZGRyLiBUaGlzCisgKglhZGRyZXNzIHNob3VsZCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgaW9yZW1hcC4KKyAqCVJldHVybnMgMSBvbiBhIG1hdGNoLgorICovCisKK2ludCBjaGVja19zaWduYXR1cmUoY29uc3Qgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICppb19hZGRyLAorCQkJY29uc3QgdW5zaWduZWQgY2hhciAqc2lnbmF0dXJlLCBpbnQgbGVuZ3RoKQoreworCXdoaWxlIChsZW5ndGgtLSkgeworCQlpZiAocmVhZGIoaW9fYWRkcikgIT0gKnNpZ25hdHVyZSkKKwkJCXJldHVybiAwOworCQlpb19hZGRyKys7CisJCXNpZ25hdHVyZSsrOworCX0KKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0woY2hlY2tfc2lnbmF0dXJlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NoZWNrc3VtLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jaGVja3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZWM5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jaGVja3N1bS5jCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICoKKyAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAorICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAorICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgorICoKKyAqCQlJUC9UQ1AvVURQIGNoZWNrc3VtbWluZyByb3V0aW5lcworICoKKyAqIEF1dGhvcnM6CUpvcmdlIEN3aWssIDxqb3JnZUBsYXNlci5zYXRsaW5rLm5ldD4KKyAqCQlBcm50IEd1bGJyYW5kc2VuLCA8YWd1bGJyYUBudmcudW5pdC5ubz4KKyAqCQlUb20gTWF5LCA8ZnRvbUBuZXRjb20uY29tPgorICoJCUFuZHJlYXMgU2Nod2FiLCA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgorICoJCUxvdHMgb2YgY29kZSBtb3ZlZCBmcm9tIHRjcC5jIGFuZCBpcC5jOyBzZWUgdGhvc2UgZmlsZXMKKyAqCQlmb3IgbW9yZSBuYW1lcy4KKyAqCisgKiAwMy8wMi85NglKZXMgU29yZW5zZW4sIEFuZHJlYXMgU2Nod2FiLCBSb21hbiBIb2RlazoKKyAqCQlGaXhlZCBzb21lIG5hc3R5IGJ1Z3MsIGNhdXNpbmcgc29tZSBob3JyaWJsZSBjcmFzaGVzLgorICoJCUE6IEF0IHNvbWUgcG9pbnRzLCB0aGUgc3VtICglMCkgd2FzIHVzZWQgYXMKKyAqCQlsZW5ndGgtY291bnRlciBpbnN0ZWFkIG9mIHRoZSBsZW5ndGggY291bnRlcgorICoJCSglMSkuIFRoYW5rcyB0byBSb21hbiBIb2RlayBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCisgKgkJQjogR0NDIHNlZW1zIHRvIG1lc3MgdXAgaWYgb25lIHVzZXMgdG9vIG1hbnkKKyAqCQlkYXRhLXJlZ2lzdGVycyB0byBob2xkIGlucHV0IHZhbHVlcyBhbmQgb25lIHRyaWVzIHRvCisgKgkJc3BlY2lmeSBkMCBhbmQgZDEgYXMgc2NyYXRjaCByZWdpc3RlcnMuIExldHRpbmcgZ2NjCisgKgkJY2hvb3NlIHRoZXNlIHJlZ2lzdGVycyBpdHNlbGYgc29sdmVzIHRoZSBwcm9ibGVtLgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKy8qIFJldmlzZWQgYnkgS2VubmV0aCBBbGJhbm93c2tpIGZvciBtNjhrbm9tbXUuIEJhc2ljIHByb2JsZW06IHVuYWxpZ25lZCBhY2Nlc3MKKyBraWxscywgc28gbW9zdCBvZiB0aGUgYXNzZW1ibHkgaGFzIHRvIGdvLiAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKyNpZm5kZWYgZG9fY3N1bQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBmcm9tMzJ0bzE2KHVuc2lnbmVkIGludCB4KQoreworCS8qIGFkZCB1cCAxNi1iaXQgYW5kIDE2LWJpdCBmb3IgMTYrYyBiaXQgKi8KKwl4ID0gKHggJiAweGZmZmYpICsgKHggPj4gMTYpOworCS8qIGFkZCB1cCBjYXJyeS4uICovCisJeCA9ICh4ICYgMHhmZmZmKSArICh4ID4+IDE2KTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBkb19jc3VtKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmYsIGludCBsZW4pCit7CisJaW50IG9kZDsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gMDsKKworCWlmIChsZW4gPD0gMCkKKwkJZ290byBvdXQ7CisJb2RkID0gMSAmICh1bnNpZ25lZCBsb25nKSBidWZmOworCWlmIChvZGQpIHsKKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKwkJcmVzdWx0ICs9ICgqYnVmZiA8PCA4KTsKKyNlbHNlCisJCXJlc3VsdCA9ICpidWZmOworI2VuZGlmCisJCWxlbi0tOworCQlidWZmKys7CisJfQorCWlmIChsZW4gPj0gMikgeworCQlpZiAoMiAmICh1bnNpZ25lZCBsb25nKSBidWZmKSB7CisJCQlyZXN1bHQgKz0gKih1bnNpZ25lZCBzaG9ydCAqKSBidWZmOworCQkJbGVuIC09IDI7CisJCQlidWZmICs9IDI7CisJCX0KKwkJaWYgKGxlbiA+PSA0KSB7CisJCQljb25zdCB1bnNpZ25lZCBjaGFyICplbmQgPSBidWZmICsgKCh1bnNpZ25lZClsZW4gJiB+Myk7CisJCQl1bnNpZ25lZCBpbnQgY2FycnkgPSAwOworCQkJZG8geworCQkJCXVuc2lnbmVkIGludCB3ID0gKih1bnNpZ25lZCBpbnQgKikgYnVmZjsKKwkJCQlidWZmICs9IDQ7CisJCQkJcmVzdWx0ICs9IGNhcnJ5OworCQkJCXJlc3VsdCArPSB3OworCQkJCWNhcnJ5ID0gKHcgPiByZXN1bHQpOworCQkJfSB3aGlsZSAoYnVmZiA8IGVuZCk7CisJCQlyZXN1bHQgKz0gY2Fycnk7CisJCQlyZXN1bHQgPSAocmVzdWx0ICYgMHhmZmZmKSArIChyZXN1bHQgPj4gMTYpOworCQl9CisJCWlmIChsZW4gJiAyKSB7CisJCQlyZXN1bHQgKz0gKih1bnNpZ25lZCBzaG9ydCAqKSBidWZmOworCQkJYnVmZiArPSAyOworCQl9CisJfQorCWlmIChsZW4gJiAxKQorI2lmZGVmIF9fTElUVExFX0VORElBTgorCQlyZXN1bHQgKz0gKmJ1ZmY7CisjZWxzZQorCQlyZXN1bHQgKz0gKCpidWZmIDw8IDgpOworI2VuZGlmCisJcmVzdWx0ID0gZnJvbTMydG8xNihyZXN1bHQpOworCWlmIChvZGQpCisJCXJlc3VsdCA9ICgocmVzdWx0ID4+IDgpICYgMHhmZikgfCAoKHJlc3VsdCAmIDB4ZmYpIDw8IDgpOworb3V0OgorCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworI2lmbmRlZiBpcF9mYXN0X2NzdW0KKy8qCisgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCisgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgorICovCitfX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCit7CisJcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oaXBoLCBpaGwqNCk7Cit9CitFWFBPUlRfU1lNQk9MKGlwX2Zhc3RfY3N1bSk7CisjZW5kaWYKKworLyoKKyAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAorICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKKyAqCisgKiByZXR1cm5zIGEgMzItYml0IG51bWJlciBzdWl0YWJsZSBmb3IgZmVlZGluZyBpbnRvIGl0c2VsZgorICogb3IgY3N1bV90Y3B1ZHBfbWFnaWMKKyAqCisgKiB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggZXZlbiBsZW5ndGhzLCBleGNlcHQKKyAqIGZvciB0aGUgbGFzdCBmcmFnbWVudCwgd2hpY2ggbWF5IGJlIG9kZAorICoKKyAqIGl0J3MgYmVzdCB0byBoYXZlIGJ1ZmYgYWxpZ25lZCBvbiBhIDMyLWJpdCBib3VuZGFyeQorICovCitfX3dzdW0gY3N1bV9wYXJ0aWFsKGNvbnN0IHZvaWQgKmJ1ZmYsIGludCBsZW4sIF9fd3N1bSB3c3VtKQoreworCXVuc2lnbmVkIGludCBzdW0gPSAoX19mb3JjZSB1bnNpZ25lZCBpbnQpd3N1bTsKKwl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOworCisJLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCisJcmVzdWx0ICs9IHN1bTsKKwlpZiAoc3VtID4gcmVzdWx0KQorCQlyZXN1bHQgKz0gMTsKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKXJlc3VsdDsKK30KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsKTsKKworLyoKKyAqIHRoaXMgcm91dGluZSBpcyB1c2VkIGZvciBtaXNjZWxsYW5lb3VzIElQLWxpa2UgY2hlY2tzdW1zLCBtYWlubHkKKyAqIGluIGljbXAuYworICovCitfX3N1bTE2IGlwX2NvbXB1dGVfY3N1bShjb25zdCB2b2lkICpidWZmLCBpbnQgbGVuKQoreworCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5kb19jc3VtKGJ1ZmYsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKGlwX2NvbXB1dGVfY3N1bSk7CisKKy8qCisgKiBjb3B5IGZyb20gZnMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKKyAqLworX193c3VtCitjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIoY29uc3Qgdm9pZCBfX3VzZXIgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLAorCQkJCQkJX193c3VtIHN1bSwgaW50ICpjc3VtX2VycikKK3sKKwlpbnQgbWlzc2luZzsKKworCW1pc3NpbmcgPSBfX2NvcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBsZW4pOworCWlmIChtaXNzaW5nKSB7CisJCW1lbXNldChkc3QgKyBsZW4gLSBtaXNzaW5nLCAwLCBtaXNzaW5nKTsKKwkJKmNzdW1fZXJyID0gLUVGQVVMVDsKKwl9IGVsc2UKKwkJKmNzdW1fZXJyID0gMDsKKworCXJldHVybiBjc3VtX3BhcnRpYWwoZHN0LCBsZW4sIHN1bSk7Cit9CitFWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcik7CisKKy8qCisgKiBjb3B5IGZyb20gZHMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKKyAqLworX193c3VtCitjc3VtX3BhcnRpYWxfY29weShjb25zdCB2b2lkICpzcmMsIHZvaWQgKmRzdCwgaW50IGxlbiwgX193c3VtIHN1bSkKK3sKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJcmV0dXJuIGNzdW1fcGFydGlhbChkc3QsIGxlbiwgc3VtKTsKK30KK0VYUE9SVF9TWU1CT0woY3N1bV9wYXJ0aWFsX2NvcHkpOworCisjaWZuZGVmIGNzdW1fdGNwdWRwX25vZm9sZAorc3RhdGljIGlubGluZSB1MzIgZnJvbTY0dG8zMih1NjQgeCkKK3sKKwkvKiBhZGQgdXAgMzItYml0IGFuZCAzMi1iaXQgZm9yIDMyK2MgYml0ICovCisJeCA9ICh4ICYgMHhmZmZmZmZmZikgKyAoeCA+PiAzMik7CisJLyogYWRkIHVwIGNhcnJ5Li4gKi8KKwl4ID0gKHggJiAweGZmZmZmZmZmKSArICh4ID4+IDMyKTsKKwlyZXR1cm4gKHUzMil4OworfQorCitfX3dzdW0gY3N1bV90Y3B1ZHBfbm9mb2xkKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAorCQkJICBfX3UzMiBsZW4sIF9fdTggcHJvdG8sIF9fd3N1bSBzdW0pCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHMgPSAoX19mb3JjZSB1MzIpc3VtOworCisJcyArPSAoX19mb3JjZSB1MzIpc2FkZHI7CisJcyArPSAoX19mb3JjZSB1MzIpZGFkZHI7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJcyArPSBwcm90byArIGxlbjsKKyNlbHNlCisJcyArPSAocHJvdG8gKyBsZW4pIDw8IDg7CisjZW5kaWYKKwlyZXR1cm4gKF9fZm9yY2UgX193c3VtKWZyb202NHRvMzIocyk7Cit9CitFWFBPUlRfU1lNQk9MKGNzdW1fdGNwdWRwX25vZm9sZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2Nsel9jdHouYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2Nsel9jdHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTExZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY2x6X2N0ei5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBsaWIvY2x6X2N0ei5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzIENoYW5obyBNaW4gPGNoYW5oby5taW5AbGdlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICogVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlbid0IGNhbGxlZCBkaXJlY3RseSwgYnV0IGFyZSByZXF1aXJlZCBieQorICogR0NDIGJ1aWx0aW5zIHN1Y2ggYXMgX19idWlsdGluX2N0eiwgYW5kIHRoZXJlZm9yZSB0aGV5IGNhbid0IGJlIHJlbW92ZWQKKyAqIGRlc3BpdGUgYXBwZWFyaW5nIHVucmVmZXJlbmNlZCBpbiBrZXJuZWwgc291cmNlLgorICoKKyAqIF9fY1tsdF16W3NkXWkyIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpbmtpbmcgYXJjaC1zcGVjaWZpYyB2ZXJzaW9ucy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisKK2ludCBfX3dlYWsgX19jdHpzaTIoaW50IHZhbCk7CitpbnQgX193ZWFrIF9fY3R6c2kyKGludCB2YWwpCit7CisJcmV0dXJuIF9fZmZzKHZhbCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fY3R6c2kyKTsKKworaW50IF9fd2VhayBfX2NsenNpMihpbnQgdmFsKTsKK2ludCBfX3dlYWsgX19jbHpzaTIoaW50IHZhbCkKK3sKKwlyZXR1cm4gMzIgLSBmbHModmFsKTsKK30KK0VYUE9SVF9TWU1CT0woX19jbHpzaTIpOworCitpbnQgX193ZWFrIF9fY2x6ZGkyKGxvbmcgdmFsKTsKK2ludCBfX3dlYWsgX19jdHpkaTIobG9uZyB2YWwpOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKworaW50IF9fd2VhayBfX2NsemRpMihsb25nIHZhbCkKK3sKKwlyZXR1cm4gMzIgLSBmbHMoKGludCl2YWwpOworfQorRVhQT1JUX1NZTUJPTChfX2NsemRpMik7CisKK2ludCBfX3dlYWsgX19jdHpkaTIobG9uZyB2YWwpCit7CisJcmV0dXJuIF9fZmZzKCh1MzIpdmFsKTsKK30KK0VYUE9SVF9TWU1CT0woX19jdHpkaTIpOworCisjZWxpZiBCSVRTX1BFUl9MT05HID09IDY0CisKK2ludCBfX3dlYWsgX19jbHpkaTIobG9uZyB2YWwpCit7CisJcmV0dXJuIDY0IC0gZmxzNjQoKHU2NCl2YWwpOworfQorRVhQT1JUX1NZTUJPTChfX2NsemRpMik7CisKK2ludCBfX3dlYWsgX19jdHpkaTIobG9uZyB2YWwpCit7CisJcmV0dXJuIF9fZmZzNjQoKHU2NCl2YWwpOworfQorRVhQT1JUX1NZTUJPTChfX2N0emRpMik7CisKKyNlbHNlCisjZXJyb3IgQklUU19QRVJfTE9ORyBub3QgMzIgb3IgNjQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY2x6X3RhYi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY2x6X3RhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTE4ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jbHpfdGFiLmMKQEAgLTAsMCArMSwxOSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKK2NvbnN0IHVuc2lnbmVkIGNoYXIgX19jbHpfdGFiW10gPSB7CisJMCwgMSwgMiwgMiwgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKwkgICAgNSwgNSwgNSwgNSwgNSwgNSwgNSwgNSwKKwk2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorCSAgICA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LAorCTcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisJICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisJNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywKKwkgICAgNywgNywgNywgNywgNywgNywgNywgNywKKwk4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorCSAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorCTgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisJICAgIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisJOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKwkgICAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKwk4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorCSAgICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NtZGxpbmUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NtZGxpbmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzFjMTliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY21kbGluZS5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogbGludXgvbGliL2NtZGxpbmUuYworICogSGVscGVyIGZ1bmN0aW9ucyBnZW5lcmFsbHkgdXNlZCBmb3IgcGFyc2luZyBrZXJuZWwgY29tbWFuZCBsaW5lCisgKiBhbmQgbW9kdWxlIG9wdGlvbnMuCisgKgorICogQ29kZSBhbmQgY29weXJpZ2h0cyBjb21lIGZyb20gaW5pdC9tYWluLmMgYW5kIGFyY2gvaTM4Ni9rZXJuZWwvc2V0dXAuYy4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogR05VIEluZGVudCBmb3JtYXR0aW5nIG9wdGlvbnMgZm9yIHRoaXMgZmlsZTogLWtyIC1pOCAtbnBzbCAtcGNzCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorCisvKgorICoJSWYgYSBoeXBoZW4gd2FzIGZvdW5kIGluIGdldF9vcHRpb24sIHRoaXMgd2lsbCBoYW5kbGUgdGhlCisgKglyYW5nZSBvZiBudW1iZXJzLCBNLU4uICBUaGlzIHdpbGwgZXhwYW5kIHRoZSByYW5nZSBhbmQgaW5zZXJ0CisgKgl0aGUgdmFsdWVzW00sIE0rMSwgLi4uLCBOXSBpbnRvIHRoZSBpbnRzIGFycmF5IGluIGdldF9vcHRpb25zLgorICovCisKK3N0YXRpYyBpbnQgZ2V0X3JhbmdlKGNoYXIgKipzdHIsIGludCAqcGludCwgaW50IG4pCit7CisJaW50IHgsIGluY19jb3VudGVyLCB1cHBlcl9yYW5nZTsKKworCSgqc3RyKSsrOworCXVwcGVyX3JhbmdlID0gc2ltcGxlX3N0cnRvbCgoKnN0ciksIE5VTEwsIDApOworCWluY19jb3VudGVyID0gdXBwZXJfcmFuZ2UgLSAqcGludDsKKwlmb3IgKHggPSAqcGludDsgbiAmJiB4IDwgdXBwZXJfcmFuZ2U7IHgrKywgbi0tKQorCQkqcGludCsrID0geDsKKwlyZXR1cm4gaW5jX2NvdW50ZXI7Cit9CisKKy8qKgorICoJZ2V0X29wdGlvbiAtIFBhcnNlIGludGVnZXIgZnJvbSBhbiBvcHRpb24gc3RyaW5nCisgKglAc3RyOiBvcHRpb24gc3RyaW5nCisgKglAcGludDogKG91dHB1dCkgaW50ZWdlciB2YWx1ZSBwYXJzZWQgZnJvbSBAc3RyCisgKgorICoJUmVhZCBhbiBpbnQgZnJvbSBhbiBvcHRpb24gc3RyaW5nOyBpZiBhdmFpbGFibGUgYWNjZXB0IGEgc3Vic2VxdWVudAorICoJY29tbWEgYXMgd2VsbC4KKyAqCisgKglSZXR1cm4gdmFsdWVzOgorICoJMCAtIG5vIGludCBpbiBzdHJpbmcKKyAqCTEgLSBpbnQgZm91bmQsIG5vIHN1YnNlcXVlbnQgY29tbWEKKyAqCTIgLSBpbnQgZm91bmQgaW5jbHVkaW5nIGEgc3Vic2VxdWVudCBjb21tYQorICoJMyAtIGh5cGhlbiBmb3VuZCB0byBkZW5vdGUgYSByYW5nZQorICovCisKK2ludCBnZXRfb3B0aW9uKGNoYXIgKipzdHIsIGludCAqcGludCkKK3sKKwljaGFyICpjdXIgPSAqc3RyOworCisJaWYgKCFjdXIgfHwgISgqY3VyKSkKKwkJcmV0dXJuIDA7CisJKnBpbnQgPSBzaW1wbGVfc3RydG9sKGN1ciwgc3RyLCAwKTsKKwlpZiAoY3VyID09ICpzdHIpCisJCXJldHVybiAwOworCWlmICgqKnN0ciA9PSAnLCcpIHsKKwkJKCpzdHIpKys7CisJCXJldHVybiAyOworCX0KKwlpZiAoKipzdHIgPT0gJy0nKQorCQlyZXR1cm4gMzsKKworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChnZXRfb3B0aW9uKTsKKworLyoqCisgKglnZXRfb3B0aW9ucyAtIFBhcnNlIGEgc3RyaW5nIGludG8gYSBsaXN0IG9mIGludGVnZXJzCisgKglAc3RyOiBTdHJpbmcgdG8gYmUgcGFyc2VkCisgKglAbmludHM6IHNpemUgb2YgaW50ZWdlciBhcnJheQorICoJQGludHM6IGludGVnZXIgYXJyYXkKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHBhcnNlcyBhIHN0cmluZyBjb250YWluaW5nIGEgY29tbWEtc2VwYXJhdGVkCisgKglsaXN0IG9mIGludGVnZXJzLCBhIGh5cGhlbi1zZXBhcmF0ZWQgcmFuZ2Ugb2YgX3Bvc2l0aXZlXyBpbnRlZ2VycywKKyAqCW9yIGEgY29tYmluYXRpb24gb2YgYm90aC4gIFRoZSBwYXJzZSBoYWx0cyB3aGVuIHRoZSBhcnJheSBpcworICoJZnVsbCwgb3Igd2hlbiBubyBtb3JlIG51bWJlcnMgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZQorICoJc3RyaW5nLgorICoKKyAqCVJldHVybiB2YWx1ZSBpcyB0aGUgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgd2hpY2ggY2F1c2VkCisgKgl0aGUgcGFyc2UgdG8gZW5kICh0eXBpY2FsbHkgYSBudWxsIHRlcm1pbmF0b3IsIGlmIEBzdHIgaXMKKyAqCWNvbXBsZXRlbHkgcGFyc2VhYmxlKS4KKyAqLworCitjaGFyICpnZXRfb3B0aW9ucyhjb25zdCBjaGFyICpzdHIsIGludCBuaW50cywgaW50ICppbnRzKQoreworCWludCByZXMsIGkgPSAxOworCisJd2hpbGUgKGkgPCBuaW50cykgeworCQlyZXMgPSBnZXRfb3B0aW9uKChjaGFyICoqKSZzdHIsIGludHMgKyBpKTsKKwkJaWYgKHJlcyA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChyZXMgPT0gMykgeworCQkJaW50IHJhbmdlX251bXM7CisJCQlyYW5nZV9udW1zID0gZ2V0X3JhbmdlKChjaGFyICoqKSZzdHIsIGludHMgKyBpLCBuaW50cyAtIGkpOworCQkJaWYgKHJhbmdlX251bXMgPCAwKQorCQkJCWJyZWFrOworCQkJLyoKKwkJCSAqIERlY3JlbWVudCB0aGUgcmVzdWx0IGJ5IG9uZSB0byBsZWF2ZSBvdXQgdGhlCisJCQkgKiBsYXN0IG51bWJlciBpbiB0aGUgcmFuZ2UuICBUaGUgbmV4dCBpdGVyYXRpb24KKwkJCSAqIHdpbGwgaGFuZGxlIHRoZSB1cHBlciBudW1iZXIgaW4gdGhlIHJhbmdlCisJCQkgKi8KKwkJCWkgKz0gKHJhbmdlX251bXMgLSAxKTsKKwkJfQorCQlpKys7CisJCWlmIChyZXMgPT0gMSkKKwkJCWJyZWFrOworCX0KKwlpbnRzWzBdID0gaSAtIDE7CisJcmV0dXJuIChjaGFyICopc3RyOworfQorRVhQT1JUX1NZTUJPTChnZXRfb3B0aW9ucyk7CisKKy8qKgorICoJbWVtcGFyc2UgLSBwYXJzZSBhIHN0cmluZyB3aXRoIG1lbSBzdWZmaXhlcyBpbnRvIGEgbnVtYmVyCisgKglAcHRyOiBXaGVyZSBwYXJzZSBiZWdpbnMKKyAqCUByZXRwdHI6IChvdXRwdXQpIE9wdGlvbmFsIHBvaW50ZXIgdG8gbmV4dCBjaGFyIGFmdGVyIHBhcnNlIGNvbXBsZXRlcworICoKKyAqCVBhcnNlcyBhIHN0cmluZyBpbnRvIGEgbnVtYmVyLiAgVGhlIG51bWJlciBzdG9yZWQgYXQgQHB0ciBpcworICoJcG90ZW50aWFsbHkgc3VmZml4ZWQgd2l0aCBLLCBNLCBHLCBULCBQLCBFLgorICovCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBtZW1wYXJzZShjb25zdCBjaGFyICpwdHIsIGNoYXIgKipyZXRwdHIpCit7CisJY2hhciAqZW5kcHRyOwkvKiBsb2NhbCBwb2ludGVyIHRvIGVuZCBvZiBwYXJzZWQgc3RyaW5nICovCisKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gc2ltcGxlX3N0cnRvdWxsKHB0ciwgJmVuZHB0ciwgMCk7CisKKwlzd2l0Y2ggKCplbmRwdHIpIHsKKwljYXNlICdFJzoKKwljYXNlICdlJzoKKwkJcmV0IDw8PSAxMDsKKwljYXNlICdQJzoKKwljYXNlICdwJzoKKwkJcmV0IDw8PSAxMDsKKwljYXNlICdUJzoKKwljYXNlICd0JzoKKwkJcmV0IDw8PSAxMDsKKwljYXNlICdHJzoKKwljYXNlICdnJzoKKwkJcmV0IDw8PSAxMDsKKwljYXNlICdNJzoKKwljYXNlICdtJzoKKwkJcmV0IDw8PSAxMDsKKwljYXNlICdLJzoKKwljYXNlICdrJzoKKwkJcmV0IDw8PSAxMDsKKwkJZW5kcHRyKys7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJldHB0cikKKwkJKnJldHB0ciA9IGVuZHB0cjsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKG1lbXBhcnNlKTsKKworLyoqCisgKglwYXJzZV9vcHRpb25fc3RyIC0gUGFyc2UgYSBzdHJpbmcgYW5kIGNoZWNrIGFuIG9wdGlvbiBpcyBzZXQgb3Igbm90CisgKglAc3RyOiBTdHJpbmcgdG8gYmUgcGFyc2VkCisgKglAb3B0aW9uOiBvcHRpb24gbmFtZQorICoKKyAqCVRoaXMgZnVuY3Rpb24gcGFyc2VzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZgorICoJc3RyaW5ncyBsaWtlIGE9YixjLgorICoKKyAqCVJldHVybiB0cnVlIGlmIHRoZXJlJ3Mgc3VjaCBvcHRpb24gaW4gdGhlIHN0cmluZywgb3IgcmV0dXJuIGZhbHNlLgorICovCitib29sIHBhcnNlX29wdGlvbl9zdHIoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpvcHRpb24pCit7CisJd2hpbGUgKCpzdHIpIHsKKwkJaWYgKCFzdHJuY21wKHN0ciwgb3B0aW9uLCBzdHJsZW4ob3B0aW9uKSkpIHsKKwkJCXN0ciArPSBzdHJsZW4ob3B0aW9uKTsKKwkJCWlmICghKnN0ciB8fCAqc3RyID09ICcsJykKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCisJCXdoaWxlICgqc3RyICYmICpzdHIgIT0gJywnKQorCQkJc3RyKys7CisKKwkJaWYgKCpzdHIgPT0gJywnKQorCQkJc3RyKys7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogUGFyc2UgYSBzdHJpbmcgdG8gZ2V0IGEgcGFyYW0gdmFsdWUgcGFpci4KKyAqIFlvdSBjYW4gdXNlICIgYXJvdW5kIHNwYWNlcywgYnV0IGNhbid0IGVzY2FwZSAiLgorICogSHlwaGVucyBhbmQgdW5kZXJzY29yZXMgZXF1aXZhbGVudCBpbiBwYXJhbWV0ZXIgbmFtZXMuCisgKi8KK2NoYXIgKm5leHRfYXJnKGNoYXIgKmFyZ3MsIGNoYXIgKipwYXJhbSwgY2hhciAqKnZhbCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgZXF1YWxzID0gMDsKKwlpbnQgaW5fcXVvdGUgPSAwLCBxdW90ZWQgPSAwOworCWNoYXIgKm5leHQ7CisKKwlpZiAoKmFyZ3MgPT0gJyInKSB7CisJCWFyZ3MrKzsKKwkJaW5fcXVvdGUgPSAxOworCQlxdW90ZWQgPSAxOworCX0KKworCWZvciAoaSA9IDA7IGFyZ3NbaV07IGkrKykgeworCQlpZiAoaXNzcGFjZShhcmdzW2ldKSAmJiAhaW5fcXVvdGUpCisJCQlicmVhazsKKwkJaWYgKGVxdWFscyA9PSAwKSB7CisJCQlpZiAoYXJnc1tpXSA9PSAnPScpCisJCQkJZXF1YWxzID0gaTsKKwkJfQorCQlpZiAoYXJnc1tpXSA9PSAnIicpCisJCQlpbl9xdW90ZSA9ICFpbl9xdW90ZTsKKwl9CisKKwkqcGFyYW0gPSBhcmdzOworCWlmICghZXF1YWxzKQorCQkqdmFsID0gTlVMTDsKKwllbHNlIHsKKwkJYXJnc1tlcXVhbHNdID0gJ1wwJzsKKwkJKnZhbCA9IGFyZ3MgKyBlcXVhbHMgKyAxOworCisJCS8qIERvbid0IGluY2x1ZGUgcXVvdGVzIGluIHZhbHVlLiAqLworCQlpZiAoKip2YWwgPT0gJyInKSB7CisJCQkoKnZhbCkrKzsKKwkJCWlmIChhcmdzW2ktMV0gPT0gJyInKQorCQkJCWFyZ3NbaS0xXSA9ICdcMCc7CisJCX0KKwl9CisJaWYgKHF1b3RlZCAmJiBhcmdzW2ktMV0gPT0gJyInKQorCQlhcmdzW2ktMV0gPSAnXDAnOworCisJaWYgKGFyZ3NbaV0pIHsKKwkJYXJnc1tpXSA9ICdcMCc7CisJCW5leHQgPSBhcmdzICsgaSArIDE7CisJfSBlbHNlCisJCW5leHQgPSBhcmdzICsgaTsKKworCS8qIENoZXcgdXAgdHJhaWxpbmcgc3BhY2VzLiAqLworCXJldHVybiBza2lwX3NwYWNlcyhuZXh0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NvbXBhdF9hdWRpdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY29tcGF0X2F1ZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlYWJhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NvbXBhdF9hdWRpdC5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3VuaXN0ZDMyLmg+CisKK3Vuc2lnbmVkIGNvbXBhdF9kaXJfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9kaXJfd3JpdGUuaD4KK34wVQorfTsKKwordW5zaWduZWQgY29tcGF0X3JlYWRfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9yZWFkLmg+Cit+MFUKK307CisKK3Vuc2lnbmVkIGNvbXBhdF93cml0ZV9jbGFzc1tdID0geworI2luY2x1ZGUgPGFzbS1nZW5lcmljL2F1ZGl0X3dyaXRlLmg+Cit+MFUKK307CisKK3Vuc2lnbmVkIGNvbXBhdF9jaGF0dHJfY2xhc3NbXSA9IHsKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9hdWRpdF9jaGFuZ2VfYXR0ci5oPgorfjBVCit9OworCit1bnNpZ25lZCBjb21wYXRfc2lnbmFsX2NsYXNzW10gPSB7CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXVkaXRfc2lnbmFsLmg+Cit+MFUKK307CisKK2ludCBhdWRpdF9jbGFzc2lmeV9jb21wYXRfc3lzY2FsbChpbnQgYWJpLCB1bnNpZ25lZCBzeXNjYWxsKQoreworCXN3aXRjaCAoc3lzY2FsbCkgeworI2lmZGVmIF9fTlJfb3BlbgorCWNhc2UgX19OUl9vcGVuOgorCQlyZXR1cm4gMjsKKyNlbmRpZgorI2lmZGVmIF9fTlJfb3BlbmF0CisJY2FzZSBfX05SX29wZW5hdDoKKwkJcmV0dXJuIDM7CisjZW5kaWYKKyNpZmRlZiBfX05SX3NvY2tldGNhbGwKKwljYXNlIF9fTlJfc29ja2V0Y2FsbDoKKwkJcmV0dXJuIDQ7CisjZW5kaWYKKwljYXNlIF9fTlJfZXhlY3ZlOgorCQlyZXR1cm4gNTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jb3JkaWMuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NvcmRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZjQ3NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jb3JkaWMuYwpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29yZGljLmg+CisKKyNkZWZpbmUgQ09SRElDX0FOR0xFX0dFTgkzOTc5NworI2RlZmluZSBDT1JESUNfUFJFQ0lTSU9OX1NISUZUCTE2CisjZGVmaW5lCUNPUkRJQ19OVU1fSVRFUgkJKENPUkRJQ19QUkVDSVNJT05fU0hJRlQgKyAyKQorCisjZGVmaW5lCUZJWEVEKFgpCSgoczMyKSgoWCkgPDwgQ09SRElDX1BSRUNJU0lPTl9TSElGVCkpCisjZGVmaW5lCUZMT0FUKFgpCSgoKFgpID49IDApIFwKKwkJPyAoKCgoWCkgPj4gKENPUkRJQ19QUkVDSVNJT05fU0hJRlQgLSAxKSkgKyAxKSA+PiAxKSBcCisJCTogLSgoKCgtKFgpKSA+PiAoQ09SRElDX1BSRUNJU0lPTl9TSElGVCAtIDEpKSArIDEpID4+IDEpKQorCitzdGF0aWMgY29uc3QgczMyIGFyY3Rhbl90YWJsZVtdID0geworCTI5NDkxMjAsCisJMTc0MDk2NywKKwk5MTk4NzksCisJNDY2OTQ1LAorCTIzNDM3OSwKKwkxMTczMDQsCisJNTg2NjYsCisJMjkzMzUsCisJMTQ2NjgsCisJNzMzNCwKKwkzNjY3LAorCTE4MzMsCisJOTE3LAorCTQ1OCwKKwkyMjksCisJMTE1LAorCTU3LAorCTI5Cit9OworCisvKgorICogY29yZGljX2NhbGNfaXEoKSAtIGNhbGN1bGF0ZXMgdGhlIGkvcSBjb29yZGluYXRlIGZvciBnaXZlbiBhbmdsZQorICoKKyAqIHRoZXRhOiBhbmdsZSBpbiBkZWdyZWVzIGZvciB3aGljaCBpL3EgY29vcmRpbmF0ZSBpcyB0byBiZSBjYWxjdWxhdGVkCisgKiBjb29yZDogZnVuY3Rpb24gb3V0cHV0IHBhcmFtZXRlciBob2xkaW5nIHRoZSBpL3EgY29vcmRpbmF0ZQorICovCitzdHJ1Y3QgY29yZGljX2lxIGNvcmRpY19jYWxjX2lxKHMzMiB0aGV0YSkKK3sKKwlzdHJ1Y3QgY29yZGljX2lxIGNvb3JkOworCXMzMiBhbmdsZSwgdmFsdG1wOworCXVuc2lnbmVkIGl0ZXI7CisJaW50IHNpZ254ID0gMTsKKwlpbnQgc2lnbnRoZXRhOworCisJY29vcmQuaSA9IENPUkRJQ19BTkdMRV9HRU47CisJY29vcmQucSA9IDA7CisJYW5nbGUgPSAwOworCisJdGhldGEgPSBGSVhFRCh0aGV0YSk7CisJc2lnbnRoZXRhID0gKHRoZXRhIDwgMCkgPyAtMSA6IDE7CisJdGhldGEgPSAoKHRoZXRhICsgRklYRUQoMTgwKSAqIHNpZ250aGV0YSkgJSBGSVhFRCgzNjApKSAtCisJCUZJWEVEKDE4MCkgKiBzaWdudGhldGE7CisKKwlpZiAoRkxPQVQodGhldGEpID4gOTApIHsKKwkJdGhldGEgLT0gRklYRUQoMTgwKTsKKwkJc2lnbnggPSAtMTsKKwl9IGVsc2UgaWYgKEZMT0FUKHRoZXRhKSA8IC05MCkgeworCQl0aGV0YSArPSBGSVhFRCgxODApOworCQlzaWdueCA9IC0xOworCX0KKworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBDT1JESUNfTlVNX0lURVI7IGl0ZXIrKykgeworCQlpZiAodGhldGEgPiBhbmdsZSkgeworCQkJdmFsdG1wID0gY29vcmQuaSAtIChjb29yZC5xID4+IGl0ZXIpOworCQkJY29vcmQucSArPSAoY29vcmQuaSA+PiBpdGVyKTsKKwkJCWFuZ2xlICs9IGFyY3Rhbl90YWJsZVtpdGVyXTsKKwkJfSBlbHNlIHsKKwkJCXZhbHRtcCA9IGNvb3JkLmkgKyAoY29vcmQucSA+PiBpdGVyKTsKKwkJCWNvb3JkLnEgLT0gKGNvb3JkLmkgPj4gaXRlcik7CisJCQlhbmdsZSAtPSBhcmN0YW5fdGFibGVbaXRlcl07CisJCX0KKwkJY29vcmQuaSA9IHZhbHRtcDsKKwl9CisKKwljb29yZC5pICo9IHNpZ254OworCWNvb3JkLnEgKj0gc2lnbng7CisJcmV0dXJuIGNvb3JkOworfQorRVhQT1JUX1NZTUJPTChjb3JkaWNfY2FsY19pcSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ09SRElDIGFsZ29yaXRobSIpOworTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NwdV9ybWFwLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcHVfcm1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MTBiMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcHVfcm1hcC5jCkBAIC0wLDAgKzEsMzA3IEBACisvKgorICogY3B1X3JtYXAuYzogQ1BVIGFmZmluaXR5IHJldmVyc2UtbWFwIHN1cHBvcnQKKyAqIENvcHlyaWdodCAyMDExIFNvbGFyZmxhcmUgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHVfcm1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisvKgorICogVGhlc2UgZnVuY3Rpb25zIG1haW50YWluIGEgbWFwcGluZyBmcm9tIENQVXMgdG8gc29tZSBvcmRlcmVkIHNldCBvZgorICogb2JqZWN0cyB3aXRoIENQVSBhZmZpbml0aWVzLiAgVGhpcyBjYW4gYmUgc2VlbiBhcyBhIHJldmVyc2UtbWFwIG9mCisgKiBDUFUgYWZmaW5pdHkuICBIb3dldmVyLCB3ZSBkbyBub3QgYXNzdW1lIHRoYXQgdGhlIG9iamVjdCBhZmZpbml0aWVzCisgKiBjb3ZlciBhbGwgQ1BVcyBpbiB0aGUgc3lzdGVtLiAgRm9yIHRob3NlIENQVXMgbm90IGRpcmVjdGx5IGNvdmVyZWQKKyAqIGJ5IG9iamVjdCBhZmZpbml0aWVzLCB3ZSBhdHRlbXB0IHRvIGZpbmQgYSBuZWFyZXN0IG9iamVjdCBiYXNlZCBvbgorICogQ1BVIHRvcG9sb2d5LgorICovCisKKy8qKgorICogYWxsb2NfY3B1X3JtYXAgLSBhbGxvY2F0ZSBDUFUgYWZmaW5pdHkgcmV2ZXJzZS1tYXAKKyAqIEBzaXplOiBOdW1iZXIgb2Ygb2JqZWN0cyB0byBiZSBtYXBwZWQKKyAqIEBmbGFnczogQWxsb2NhdGlvbiBmbGFncyBlLmcuICVHRlBfS0VSTkVMCisgKi8KK3N0cnVjdCBjcHVfcm1hcCAqYWxsb2NfY3B1X3JtYXAodW5zaWduZWQgaW50IHNpemUsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBjcHVfcm1hcCAqcm1hcDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCXNpemVfdCBvYmpfb2Zmc2V0OworCisJLyogVGhpcyBpcyBhIHNpbGx5IG51bWJlciBvZiBvYmplY3RzLCBhbmQgd2UgdXNlIHUxNiBpbmRpY2VzLiAqLworCWlmIChzaXplID4gMHhmZmZmKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIE9mZnNldCBvZiBvYmplY3QgcG9pbnRlciBhcnJheSBmcm9tIGJhc2Ugc3RydWN0dXJlICovCisJb2JqX29mZnNldCA9IEFMSUdOKG9mZnNldG9mKHN0cnVjdCBjcHVfcm1hcCwgbmVhcltucl9jcHVfaWRzXSksCisJCQkgICBzaXplb2Yodm9pZCAqKSk7CisKKwlybWFwID0ga3phbGxvYyhvYmpfb2Zmc2V0ICsgc2l6ZSAqIHNpemVvZihybWFwLT5vYmpbMF0pLCBmbGFncyk7CisJaWYgKCFybWFwKQorCQlyZXR1cm4gTlVMTDsKKworCWtyZWZfaW5pdCgmcm1hcC0+cmVmY291bnQpOworCXJtYXAtPm9iaiA9ICh2b2lkICoqKSgoY2hhciAqKXJtYXAgKyBvYmpfb2Zmc2V0KTsKKworCS8qIEluaXRpYWxseSBhc3NpZ24gQ1BVcyB0byBvYmplY3RzIG9uIGEgcm90YSwgc2luY2Ugd2UgaGF2ZQorCSAqIG5vIGlkZWEgd2hlcmUgdGhlIG9iamVjdHMgYXJlLiAgVXNlIGluZmluaXRlIGRpc3RhbmNlLCBzbworCSAqIGFueSBvYmplY3Qgd2l0aCBrbm93biBkaXN0YW5jZSBpcyBwcmVmZXJhYmxlLiAgSW5jbHVkZSB0aGUKKwkgKiBDUFVzIHRoYXQgYXJlIG5vdCBwcmVzZW50L29ubGluZSwgc2luY2Ugd2UgZGVmaW5pdGVseSB3YW50CisJICogYW55IG5ld2x5LWhvdHBsdWdnZWQgQ1BVcyB0byBoYXZlIHNvbWUgb2JqZWN0IGFzc2lnbmVkLgorCSAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJcm1hcC0+bmVhcltjcHVdLmluZGV4ID0gY3B1ICUgc2l6ZTsKKwkJcm1hcC0+bmVhcltjcHVdLmRpc3QgPSBDUFVfUk1BUF9ESVNUX0lORjsKKwl9CisKKwlybWFwLT5zaXplID0gc2l6ZTsKKwlyZXR1cm4gcm1hcDsKK30KK0VYUE9SVF9TWU1CT0woYWxsb2NfY3B1X3JtYXApOworCisvKioKKyAqIGNwdV9ybWFwX3JlbGVhc2UgLSBpbnRlcm5hbCByZWNsYWltaW5nIGhlbHBlciBjYWxsZWQgZnJvbSBrcmVmX3B1dAorICogQHJlZjoga3JlZiB0byBzdHJ1Y3QgY3B1X3JtYXAKKyAqLworc3RhdGljIHZvaWQgY3B1X3JtYXBfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqcmVmKQoreworCXN0cnVjdCBjcHVfcm1hcCAqcm1hcCA9IGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBjcHVfcm1hcCwgcmVmY291bnQpOworCWtmcmVlKHJtYXApOworfQorCisvKioKKyAqIGNwdV9ybWFwX2dldCAtIGludGVybmFsIGhlbHBlciB0byBnZXQgbmV3IHJlZiBvbiBhIGNwdV9ybWFwCisgKiBAcm1hcDogcmV2ZXJzZS1tYXAgYWxsb2NhdGVkIHdpdGggYWxsb2NfY3B1X3JtYXAoKQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3JtYXBfZ2V0KHN0cnVjdCBjcHVfcm1hcCAqcm1hcCkKK3sKKwlrcmVmX2dldCgmcm1hcC0+cmVmY291bnQpOworfQorCisvKioKKyAqIGNwdV9ybWFwX3B1dCAtIHJlbGVhc2UgcmVmIG9uIGEgY3B1X3JtYXAKKyAqIEBybWFwOiByZXZlcnNlLW1hcCBhbGxvY2F0ZWQgd2l0aCBhbGxvY19jcHVfcm1hcCgpCisgKi8KK2ludCBjcHVfcm1hcF9wdXQoc3RydWN0IGNwdV9ybWFwICpybWFwKQoreworCXJldHVybiBrcmVmX3B1dCgmcm1hcC0+cmVmY291bnQsIGNwdV9ybWFwX3JlbGVhc2UpOworfQorRVhQT1JUX1NZTUJPTChjcHVfcm1hcF9wdXQpOworCisvKiBSZWV2YWx1YXRlIG5lYXJlc3Qgb2JqZWN0IGZvciBnaXZlbiBDUFUsIGNvbXBhcmluZyB3aXRoIHRoZSBnaXZlbgorICogbmVpZ2hib3VycyBhdCB0aGUgZ2l2ZW4gZGlzdGFuY2UuCisgKi8KK3N0YXRpYyBib29sIGNwdV9ybWFwX2NvcHlfbmVpZ2goc3RydWN0IGNwdV9ybWFwICpybWFwLCB1bnNpZ25lZCBpbnQgY3B1LAorCQkJCWNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1MTYgZGlzdCkKK3sKKwlpbnQgbmVpZ2g7CisKKwlmb3JfZWFjaF9jcHUobmVpZ2gsIG1hc2spIHsKKwkJaWYgKHJtYXAtPm5lYXJbY3B1XS5kaXN0ID4gZGlzdCAmJgorCQkgICAgcm1hcC0+bmVhcltuZWlnaF0uZGlzdCA8PSBkaXN0KSB7CisJCQlybWFwLT5uZWFyW2NwdV0uaW5kZXggPSBybWFwLT5uZWFyW25laWdoXS5pbmRleDsKKwkJCXJtYXAtPm5lYXJbY3B1XS5kaXN0ID0gZGlzdDsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludF9ybWFwKGNvbnN0IHN0cnVjdCBjcHVfcm1hcCAqcm1hcCwgY29uc3QgY2hhciAqcHJlZml4KQoreworCXVuc2lnbmVkIGluZGV4OworCXVuc2lnbmVkIGludCBjcHU7CisKKwlwcl9pbmZvKCJjcHVfcm1hcCAlcCwgJXM6XG4iLCBybWFwLCBwcmVmaXgpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlpbmRleCA9IHJtYXAtPm5lYXJbY3B1XS5pbmRleDsKKwkJcHJfaW5mbygiY3B1ICVkIC0+IG9iaiAldSAoZGlzdGFuY2UgJXUpXG4iLAorCQkJY3B1LCBpbmRleCwgcm1hcC0+bmVhcltjcHVdLmRpc3QpOworCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK2RlYnVnX3ByaW50X3JtYXAoY29uc3Qgc3RydWN0IGNwdV9ybWFwICpybWFwLCBjb25zdCBjaGFyICpwcmVmaXgpCit7Cit9CisjZW5kaWYKKworLyoqCisgKiBjcHVfcm1hcF9hZGQgLSBhZGQgb2JqZWN0IHRvIGEgcm1hcAorICogQHJtYXA6IENQVSBybWFwIGFsbG9jYXRlZCB3aXRoIGFsbG9jX2NwdV9ybWFwKCkKKyAqIEBvYmo6IE9iamVjdCB0byBhZGQgdG8gcm1hcAorICoKKyAqIFJldHVybiBpbmRleCBvZiBvYmplY3QuCisgKi8KK2ludCBjcHVfcm1hcF9hZGQoc3RydWN0IGNwdV9ybWFwICpybWFwLCB2b2lkICpvYmopCit7CisJdTE2IGluZGV4OworCisJQlVHX09OKHJtYXAtPnVzZWQgPj0gcm1hcC0+c2l6ZSk7CisJaW5kZXggPSBybWFwLT51c2VkKys7CisJcm1hcC0+b2JqW2luZGV4XSA9IG9iajsKKwlyZXR1cm4gaW5kZXg7Cit9CitFWFBPUlRfU1lNQk9MKGNwdV9ybWFwX2FkZCk7CisKKy8qKgorICogY3B1X3JtYXBfdXBkYXRlIC0gdXBkYXRlIENQVSBybWFwIGZvbGxvd2luZyBhIGNoYW5nZSBvZiBvYmplY3QgYWZmaW5pdHkKKyAqIEBybWFwOiBDUFUgcm1hcCB0byB1cGRhdGUKKyAqIEBpbmRleDogSW5kZXggb2Ygb2JqZWN0IHdob3NlIGFmZmluaXR5IGNoYW5nZWQKKyAqIEBhZmZpbml0eTogTmV3IENQVSBhZmZpbml0eSBvZiBvYmplY3QKKyAqLworaW50IGNwdV9ybWFwX3VwZGF0ZShzdHJ1Y3QgY3B1X3JtYXAgKnJtYXAsIHUxNiBpbmRleCwKKwkJICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKK3sKKwljcHVtYXNrX3Zhcl90IHVwZGF0ZV9tYXNrOworCXVuc2lnbmVkIGludCBjcHU7CisKKwlpZiAodW5saWtlbHkoIXphbGxvY19jcHVtYXNrX3ZhcigmdXBkYXRlX21hc2ssIEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBJbnZhbGlkYXRlIGRpc3RhbmNlIGZvciBhbGwgQ1BVcyBmb3Igd2hpY2ggdGhpcyB1c2VkIHRvIGJlCisJICogdGhlIG5lYXJlc3Qgb2JqZWN0LiAgTWFyayB0aG9zZSBDUFVzIGZvciB1cGRhdGUuCisJICovCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKHJtYXAtPm5lYXJbY3B1XS5pbmRleCA9PSBpbmRleCkgeworCQkJcm1hcC0+bmVhcltjcHVdLmRpc3QgPSBDUFVfUk1BUF9ESVNUX0lORjsKKwkJCWNwdW1hc2tfc2V0X2NwdShjcHUsIHVwZGF0ZV9tYXNrKTsKKwkJfQorCX0KKworCWRlYnVnX3ByaW50X3JtYXAocm1hcCwgImFmdGVyIGludmFsaWRhdGluZyBvbGQgZGlzdGFuY2VzIik7CisKKwkvKiBTZXQgZGlzdGFuY2UgdG8gMCBmb3IgYWxsIENQVXMgaW4gdGhlIG5ldyBhZmZpbml0eSBtYXNrLgorCSAqIE1hcmsgYWxsIENQVXMgd2l0aGluIHRoZWlyIE5VTUEgbm9kZXMgZm9yIHVwZGF0ZS4KKwkgKi8KKwlmb3JfZWFjaF9jcHUoY3B1LCBhZmZpbml0eSkgeworCQlybWFwLT5uZWFyW2NwdV0uaW5kZXggPSBpbmRleDsKKwkJcm1hcC0+bmVhcltjcHVdLmRpc3QgPSAwOworCQljcHVtYXNrX29yKHVwZGF0ZV9tYXNrLCB1cGRhdGVfbWFzaywKKwkJCSAgIGNwdW1hc2tfb2Zfbm9kZShjcHVfdG9fbm9kZShjcHUpKSk7CisJfQorCisJZGVidWdfcHJpbnRfcm1hcChybWFwLCAiYWZ0ZXIgdXBkYXRpbmcgbmVpZ2hib3VycyIpOworCisJLyogVXBkYXRlIGRpc3RhbmNlcyBiYXNlZCBvbiB0b3BvbG9neSAqLworCWZvcl9lYWNoX2NwdShjcHUsIHVwZGF0ZV9tYXNrKSB7CisJCWlmIChjcHVfcm1hcF9jb3B5X25laWdoKHJtYXAsIGNwdSwKKwkJCQkJdG9wb2xvZ3lfc2libGluZ19jcHVtYXNrKGNwdSksIDEpKQorCQkJY29udGludWU7CisJCWlmIChjcHVfcm1hcF9jb3B5X25laWdoKHJtYXAsIGNwdSwKKwkJCQkJdG9wb2xvZ3lfY29yZV9jcHVtYXNrKGNwdSksIDIpKQorCQkJY29udGludWU7CisJCWlmIChjcHVfcm1hcF9jb3B5X25laWdoKHJtYXAsIGNwdSwKKwkJCQkJY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGNwdSkpLCAzKSkKKwkJCWNvbnRpbnVlOworCQkvKiBXZSBjb3VsZCBjb250aW51ZSBpbnRvIE5VTUEgbm9kZSBkaXN0YW5jZXMsIGJ1dCBmb3Igbm93CisJCSAqIHdlIGdpdmUgdXAuCisJCSAqLworCX0KKworCWRlYnVnX3ByaW50X3JtYXAocm1hcCwgImFmdGVyIGNvcHlpbmcgbmVpZ2hib3VycyIpOworCisJZnJlZV9jcHVtYXNrX3Zhcih1cGRhdGVfbWFzayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGNwdV9ybWFwX3VwZGF0ZSk7CisKKy8qIEdsdWUgYmV0d2VlbiBJUlEgYWZmaW5pdHkgbm90aWZpZXJzIGFuZCBDUFUgcm1hcHMgKi8KKworc3RydWN0IGlycV9nbHVlIHsKKwlzdHJ1Y3QgaXJxX2FmZmluaXR5X25vdGlmeSBub3RpZnk7CisJc3RydWN0IGNwdV9ybWFwICpybWFwOworCXUxNiBpbmRleDsKK307CisKKy8qKgorICogZnJlZV9pcnFfY3B1X3JtYXAgLSBmcmVlIGEgQ1BVIGFmZmluaXR5IHJldmVyc2UtbWFwIHVzZWQgZm9yIElSUXMKKyAqIEBybWFwOiBSZXZlcnNlLW1hcCBhbGxvY2F0ZWQgd2l0aCBhbGxvY19pcnFfY3B1X21hcCgpLCBvciAlTlVMTAorICoKKyAqIE11c3QgYmUgY2FsbGVkIGluIHByb2Nlc3MgY29udGV4dCwgYmVmb3JlIGZyZWVpbmcgdGhlIElSUXMuCisgKi8KK3ZvaWQgZnJlZV9pcnFfY3B1X3JtYXAoc3RydWN0IGNwdV9ybWFwICpybWFwKQoreworCXN0cnVjdCBpcnFfZ2x1ZSAqZ2x1ZTsKKwl1MTYgaW5kZXg7CisKKwlpZiAoIXJtYXApCisJCXJldHVybjsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IHJtYXAtPnVzZWQ7IGluZGV4KyspIHsKKwkJZ2x1ZSA9IHJtYXAtPm9ialtpbmRleF07CisJCWlycV9zZXRfYWZmaW5pdHlfbm90aWZpZXIoZ2x1ZS0+bm90aWZ5LmlycSwgTlVMTCk7CisJfQorCisJY3B1X3JtYXBfcHV0KHJtYXApOworfQorRVhQT1JUX1NZTUJPTChmcmVlX2lycV9jcHVfcm1hcCk7CisKKy8qKgorICogaXJxX2NwdV9ybWFwX25vdGlmeSAtIGNhbGxiYWNrIGZvciBJUlEgc3Vic3lzdGVtIHdoZW4gSVJRIGFmZmluaXR5IHVwZGF0ZWQKKyAqIEBub3RpZnk6IHN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5IHBhc3NlZCBieSBpcnEvbWFuYWdlLmMKKyAqIEBtYXNrOiBjcHUgbWFzayBmb3IgbmV3IFNNUCBhZmZpbml0eQorICoKKyAqIFRoaXMgaXMgZXhlY3V0ZWQgaW4gd29ya3F1ZXVlIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkCitpcnFfY3B1X3JtYXBfbm90aWZ5KHN0cnVjdCBpcnFfYWZmaW5pdHlfbm90aWZ5ICpub3RpZnksIGNvbnN0IGNwdW1hc2tfdCAqbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2dsdWUgKmdsdWUgPQorCQljb250YWluZXJfb2Yobm90aWZ5LCBzdHJ1Y3QgaXJxX2dsdWUsIG5vdGlmeSk7CisJaW50IHJjOworCisJcmMgPSBjcHVfcm1hcF91cGRhdGUoZ2x1ZS0+cm1hcCwgZ2x1ZS0+aW5kZXgsIG1hc2spOworCWlmIChyYykKKwkJcHJfd2FybmluZygiaXJxX2NwdV9ybWFwX25vdGlmeTogdXBkYXRlIGZhaWxlZDogJWRcbiIsIHJjKTsKK30KKworLyoqCisgKiBpcnFfY3B1X3JtYXBfcmVsZWFzZSAtIHJlY2xhaW1pbmcgY2FsbGJhY2sgZm9yIElSUSBzdWJzeXN0ZW0KKyAqIEByZWY6IGtyZWYgdG8gc3RydWN0IGlycV9hZmZpbml0eV9ub3RpZnkgcGFzc2VkIGJ5IGlycS9tYW5hZ2UuYworICovCitzdGF0aWMgdm9pZCBpcnFfY3B1X3JtYXBfcmVsZWFzZShzdHJ1Y3Qga3JlZiAqcmVmKQoreworCXN0cnVjdCBpcnFfZ2x1ZSAqZ2x1ZSA9CisJCWNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBpcnFfZ2x1ZSwgbm90aWZ5LmtyZWYpOworCisJY3B1X3JtYXBfcHV0KGdsdWUtPnJtYXApOworCWtmcmVlKGdsdWUpOworfQorCisvKioKKyAqIGlycV9jcHVfcm1hcF9hZGQgLSBhZGQgYW4gSVJRIHRvIGEgQ1BVIGFmZmluaXR5IHJldmVyc2UtbWFwCisgKiBAcm1hcDogVGhlIHJldmVyc2UtbWFwCisgKiBAaXJxOiBUaGUgSVJRIG51bWJlcgorICoKKyAqIFRoaXMgYWRkcyBhbiBJUlEgYWZmaW5pdHkgbm90aWZpZXIgdGhhdCB3aWxsIHVwZGF0ZSB0aGUgcmV2ZXJzZS1tYXAKKyAqIGF1dG9tYXRpY2FsbHkuCisgKgorICogTXVzdCBiZSBjYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LCBhZnRlciB0aGUgSVJRIGlzIGFsbG9jYXRlZCBidXQKKyAqIGJlZm9yZSBpdCBpcyBib3VuZCB3aXRoIHJlcXVlc3RfaXJxKCkuCisgKi8KK2ludCBpcnFfY3B1X3JtYXBfYWRkKHN0cnVjdCBjcHVfcm1hcCAqcm1hcCwgaW50IGlycSkKK3sKKwlzdHJ1Y3QgaXJxX2dsdWUgKmdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOworCWludCByYzsKKworCWlmICghZ2x1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZ2x1ZS0+bm90aWZ5Lm5vdGlmeSA9IGlycV9jcHVfcm1hcF9ub3RpZnk7CisJZ2x1ZS0+bm90aWZ5LnJlbGVhc2UgPSBpcnFfY3B1X3JtYXBfcmVsZWFzZTsKKwlnbHVlLT5ybWFwID0gcm1hcDsKKwljcHVfcm1hcF9nZXQocm1hcCk7CisJZ2x1ZS0+aW5kZXggPSBjcHVfcm1hcF9hZGQocm1hcCwgZ2x1ZSk7CisJcmMgPSBpcnFfc2V0X2FmZmluaXR5X25vdGlmaWVyKGlycSwgJmdsdWUtPm5vdGlmeSk7CisJaWYgKHJjKSB7CisJCWNwdV9ybWFwX3B1dChnbHVlLT5ybWFwKTsKKwkJa2ZyZWUoZ2x1ZSk7CisJfQorCXJldHVybiByYzsKK30KK0VYUE9SVF9TWU1CT0woaXJxX2NwdV9ybWFwX2FkZCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcHVtYXNrLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcHVtYXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVmZTE0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NwdW1hc2suYwpAQCAtMCwwICsxLDIyOSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKworLyoqCisgKiBjcHVtYXNrX25leHQgLSBnZXQgdGhlIG5leHQgY3B1IGluIGEgY3B1bWFzaworICogQG46IHRoZSBjcHUgcHJpb3IgdG8gdGhlIHBsYWNlIHRvIHNlYXJjaCAoaWUuIHJldHVybiB3aWxsIGJlID4gQG4pCisgKiBAc3JjcDogdGhlIGNwdW1hc2sgcG9pbnRlcgorICoKKyAqIFJldHVybnMgPj0gbnJfY3B1X2lkcyBpZiBubyBmdXJ0aGVyIGNwdXMgc2V0LgorICovCit1bnNpZ25lZCBpbnQgY3B1bWFza19uZXh0KGludCBuLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqc3JjcCkKK3sKKwkvKiAtMSBpcyBhIGxlZ2FsIGFyZyBoZXJlLiAqLworCWlmIChuICE9IC0xKQorCQljcHVtYXNrX2NoZWNrKG4pOworCXJldHVybiBmaW5kX25leHRfYml0KGNwdW1hc2tfYml0cyhzcmNwKSwgbnJfY3B1bWFza19iaXRzLCBuICsgMSk7Cit9CitFWFBPUlRfU1lNQk9MKGNwdW1hc2tfbmV4dCk7CisKKy8qKgorICogY3B1bWFza19uZXh0X2FuZCAtIGdldCB0aGUgbmV4dCBjcHUgaW4gKnNyYzFwICYgKnNyYzJwCisgKiBAbjogdGhlIGNwdSBwcmlvciB0byB0aGUgcGxhY2UgdG8gc2VhcmNoIChpZS4gcmV0dXJuIHdpbGwgYmUgPiBAbikKKyAqIEBzcmMxcDogdGhlIGZpcnN0IGNwdW1hc2sgcG9pbnRlcgorICogQHNyYzJwOiB0aGUgc2Vjb25kIGNwdW1hc2sgcG9pbnRlcgorICoKKyAqIFJldHVybnMgPj0gbnJfY3B1X2lkcyBpZiBubyBmdXJ0aGVyIGNwdXMgc2V0IGluIGJvdGguCisgKi8KK2ludCBjcHVtYXNrX25leHRfYW5kKGludCBuLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqc3JjMXAsCisJCSAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNyYzJwKQoreworCXdoaWxlICgobiA9IGNwdW1hc2tfbmV4dChuLCBzcmMxcCkpIDwgbnJfY3B1X2lkcykKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUobiwgc3JjMnApKQorCQkJYnJlYWs7CisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKGNwdW1hc2tfbmV4dF9hbmQpOworCisvKioKKyAqIGNwdW1hc2tfYW55X2J1dCAtIHJldHVybiBhICJyYW5kb20iIGluIGEgY3B1bWFzaywgYnV0IG5vdCB0aGlzIG9uZS4KKyAqIEBtYXNrOiB0aGUgY3B1bWFzayB0byBzZWFyY2gKKyAqIEBjcHU6IHRoZSBjcHUgdG8gaWdub3JlLgorICoKKyAqIE9mdGVuIHVzZWQgdG8gZmluZCBhbnkgY3B1IGJ1dCBzbXBfcHJvY2Vzc29yX2lkKCkgaW4gYSBtYXNrLgorICogUmV0dXJucyA+PSBucl9jcHVfaWRzIGlmIG5vIGNwdXMgc2V0LgorICovCitpbnQgY3B1bWFza19hbnlfYnV0KGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGludCBpOworCisJY3B1bWFza19jaGVjayhjcHUpOworCWZvcl9lYWNoX2NwdShpLCBtYXNrKQorCQlpZiAoaSAhPSBjcHUpCisJCQlicmVhazsKKwlyZXR1cm4gaTsKK30KK0VYUE9SVF9TWU1CT0woY3B1bWFza19hbnlfYnV0KTsKKworLyoqCisgKiBjcHVtYXNrX25leHRfd3JhcCAtIGhlbHBlciB0byBpbXBsZW1lbnQgZm9yX2VhY2hfY3B1X3dyYXAKKyAqIEBuOiB0aGUgY3B1IHByaW9yIHRvIHRoZSBwbGFjZSB0byBzZWFyY2gKKyAqIEBtYXNrOiB0aGUgY3B1bWFzayBwb2ludGVyCisgKiBAc3RhcnQ6IHRoZSBzdGFydCBwb2ludCBvZiB0aGUgaXRlcmF0aW9uCisgKiBAd3JhcDogYXNzdW1lIEBuIGNyb3NzaW5nIEBzdGFydCB0ZXJtaW5hdGVzIHRoZSBpdGVyYXRpb24KKyAqCisgKiBSZXR1cm5zID49IG5yX2NwdV9pZHMgb24gY29tcGxldGlvbgorICoKKyAqIE5vdGU6IHRoZSBAd3JhcCBhcmd1bWVudCBpcyByZXF1aXJlZCBmb3IgdGhlIHN0YXJ0IGNvbmRpdGlvbiB3aGVuCisgKiB3ZSBjYW5ub3QgYXNzdW1lIEBzdGFydCBpcyBzZXQgaW4gQG1hc2suCisgKi8KK2ludCBjcHVtYXNrX25leHRfd3JhcChpbnQgbiwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCBzdGFydCwgYm9vbCB3cmFwKQoreworCWludCBuZXh0OworCithZ2FpbjoKKwluZXh0ID0gY3B1bWFza19uZXh0KG4sIG1hc2spOworCisJaWYgKHdyYXAgJiYgbiA8IHN0YXJ0ICYmIG5leHQgPj0gc3RhcnQpIHsKKwkJcmV0dXJuIG5yX2NwdW1hc2tfYml0czsKKworCX0gZWxzZSBpZiAobmV4dCA+PSBucl9jcHVtYXNrX2JpdHMpIHsKKwkJd3JhcCA9IHRydWU7CisJCW4gPSAtMTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlyZXR1cm4gbmV4dDsKK30KK0VYUE9SVF9TWU1CT0woY3B1bWFza19uZXh0X3dyYXApOworCisvKiBUaGVzZSBhcmUgbm90IGlubGluZSBiZWNhdXNlIG9mIGhlYWRlciB0YW5nbGVzLiAqLworI2lmZGVmIENPTkZJR19DUFVNQVNLX09GRlNUQUNLCisvKioKKyAqIGFsbG9jX2NwdW1hc2tfdmFyX25vZGUgLSBhbGxvY2F0ZSBhIHN0cnVjdCBjcHVtYXNrIG9uIGEgZ2l2ZW4gbm9kZQorICogQG1hc2s6IHBvaW50ZXIgdG8gY3B1bWFza192YXJfdCB3aGVyZSB0aGUgY3B1bWFzayBpcyByZXR1cm5lZAorICogQGZsYWdzOiBHRlBfIGZsYWdzCisgKgorICogT25seSBkZWZpbmVkIHdoZW4gQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0s9eSwgb3RoZXJ3aXNlIGlzCisgKiBhIG5vcCByZXR1cm5pbmcgYSBjb25zdGFudCAxIChpbiA8bGludXgvY3B1bWFzay5oPikKKyAqIFJldHVybnMgVFJVRSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBzdWNjZWVkZWQsIEZBTFNFIG90aGVyd2lzZS4KKyAqCisgKiBJbiBhZGRpdGlvbiwgbWFzayB3aWxsIGJlIE5VTEwgaWYgdGhpcyBmYWlscy4gIE5vdGUgdGhhdCBnY2MgaXMKKyAqIHVzdWFsbHkgc21hcnQgZW5vdWdoIHRvIGtub3cgdGhhdCBtYXNrIGNhbiBuZXZlciBiZSBOVUxMIGlmCisgKiBDT05GSUdfQ1BVTUFTS19PRkZTVEFDSz1uLCBzbyBkb2VzIGNvZGUgZWxpbWluYXRpb24gaW4gdGhhdCBjYXNlCisgKiB0b28uCisgKi8KK2Jvb2wgYWxsb2NfY3B1bWFza192YXJfbm9kZShjcHVtYXNrX3Zhcl90ICptYXNrLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJKm1hc2sgPSBrbWFsbG9jX25vZGUoY3B1bWFza19zaXplKCksIGZsYWdzLCBub2RlKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19QRVJfQ1BVX01BUFMKKwlpZiAoISptYXNrKSB7CisJCXByaW50ayhLRVJOX0VSUiAiPT4gYWxsb2NfY3B1bWFza192YXI6IGZhaWxlZCFcbiIpOworCQlkdW1wX3N0YWNrKCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gKm1hc2sgIT0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woYWxsb2NfY3B1bWFza192YXJfbm9kZSk7CisKK2Jvb2wgemFsbG9jX2NwdW1hc2tfdmFyX25vZGUoY3B1bWFza192YXJfdCAqbWFzaywgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXJldHVybiBhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKG1hc2ssIGZsYWdzIHwgX19HRlBfWkVSTywgbm9kZSk7Cit9CitFWFBPUlRfU1lNQk9MKHphbGxvY19jcHVtYXNrX3Zhcl9ub2RlKTsKKworLyoqCisgKiBhbGxvY19jcHVtYXNrX3ZhciAtIGFsbG9jYXRlIGEgc3RydWN0IGNwdW1hc2sKKyAqIEBtYXNrOiBwb2ludGVyIHRvIGNwdW1hc2tfdmFyX3Qgd2hlcmUgdGhlIGNwdW1hc2sgaXMgcmV0dXJuZWQKKyAqIEBmbGFnczogR0ZQXyBmbGFncworICoKKyAqIE9ubHkgZGVmaW5lZCB3aGVuIENPTkZJR19DUFVNQVNLX09GRlNUQUNLPXksIG90aGVyd2lzZSBpcworICogYSBub3AgcmV0dXJuaW5nIGEgY29uc3RhbnQgMSAoaW4gPGxpbnV4L2NwdW1hc2suaD4pLgorICoKKyAqIFNlZSBhbGxvY19jcHVtYXNrX3Zhcl9ub2RlLgorICovCitib29sIGFsbG9jX2NwdW1hc2tfdmFyKGNwdW1hc2tfdmFyX3QgKm1hc2ssIGdmcF90IGZsYWdzKQoreworCXJldHVybiBhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKG1hc2ssIGZsYWdzLCBOVU1BX05PX05PREUpOworfQorRVhQT1JUX1NZTUJPTChhbGxvY19jcHVtYXNrX3Zhcik7CisKK2Jvb2wgemFsbG9jX2NwdW1hc2tfdmFyKGNwdW1hc2tfdmFyX3QgKm1hc2ssIGdmcF90IGZsYWdzKQoreworCXJldHVybiBhbGxvY19jcHVtYXNrX3ZhcihtYXNrLCBmbGFncyB8IF9fR0ZQX1pFUk8pOworfQorRVhQT1JUX1NZTUJPTCh6YWxsb2NfY3B1bWFza192YXIpOworCisvKioKKyAqIGFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIgLSBhbGxvY2F0ZSBhIHN0cnVjdCBjcHVtYXNrIGZyb20gdGhlIGJvb3RtZW0gYXJlbmEuCisgKiBAbWFzazogcG9pbnRlciB0byBjcHVtYXNrX3Zhcl90IHdoZXJlIHRoZSBjcHVtYXNrIGlzIHJldHVybmVkCisgKgorICogT25seSBkZWZpbmVkIHdoZW4gQ09ORklHX0NQVU1BU0tfT0ZGU1RBQ0s9eSwgb3RoZXJ3aXNlIGlzCisgKiBhIG5vcCAoaW4gPGxpbnV4L2NwdW1hc2suaD4pLgorICogRWl0aGVyIHJldHVybnMgYW4gYWxsb2NhdGVkICh6ZXJvLWZpbGxlZCkgY3B1bWFzaywgb3IgY2F1c2VzIHRoZQorICogc3lzdGVtIHRvIHBhbmljLgorICovCit2b2lkIF9faW5pdCBhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKGNwdW1hc2tfdmFyX3QgKm1hc2spCit7CisJKm1hc2sgPSBtZW1ibG9ja192aXJ0X2FsbG9jKGNwdW1hc2tfc2l6ZSgpLCAwKTsKK30KKworLyoqCisgKiBmcmVlX2NwdW1hc2tfdmFyIC0gZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYSBzdHJ1Y3QgY3B1bWFzay4KKyAqIEBtYXNrOiBjcHVtYXNrIHRvIGZyZWUKKyAqCisgKiBUaGlzIGlzIHNhZmUgb24gYSBOVUxMIG1hc2suCisgKi8KK3ZvaWQgZnJlZV9jcHVtYXNrX3ZhcihjcHVtYXNrX3Zhcl90IG1hc2spCit7CisJa2ZyZWUobWFzayk7Cit9CitFWFBPUlRfU1lNQk9MKGZyZWVfY3B1bWFza192YXIpOworCisvKioKKyAqIGZyZWVfYm9vdG1lbV9jcHVtYXNrX3ZhciAtIGZyZWVzIHJlc3VsdCBvZiBhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyCisgKiBAbWFzazogY3B1bWFzayB0byBmcmVlCisgKi8KK3ZvaWQgX19pbml0IGZyZWVfYm9vdG1lbV9jcHVtYXNrX3ZhcihjcHVtYXNrX3Zhcl90IG1hc2spCit7CisJbWVtYmxvY2tfZnJlZV9lYXJseShfX3BhKG1hc2spLCBjcHVtYXNrX3NpemUoKSk7Cit9CisjZW5kaWYKKworLyoqCisgKiBjcHVtYXNrX2xvY2FsX3NwcmVhZCAtIHNlbGVjdCB0aGUgaSd0aCBjcHUgd2l0aCBsb2NhbCBudW1hIGNwdSdzIGZpcnN0CisgKiBAaTogaW5kZXggbnVtYmVyCisgKiBAbm9kZTogbG9jYWwgbnVtYV9ub2RlCisgKgorICogVGhpcyBmdW5jdGlvbiBzZWxlY3RzIGFuIG9ubGluZSBDUFUgYWNjb3JkaW5nIHRvIGEgbnVtYSBhd2FyZSBwb2xpY3k7CisgKiBsb2NhbCBjcHVzIGFyZSByZXR1cm5lZCBmaXJzdCwgZm9sbG93ZWQgYnkgbm9uLWxvY2FsIG9uZXMsIHRoZW4gaXQKKyAqIHdyYXBzIGFyb3VuZC4KKyAqCisgKiBJdCdzIG5vdCB2ZXJ5IGVmZmljaWVudCwgYnV0IHVzZWZ1bCBmb3Igc2V0dXAuCisgKi8KK3Vuc2lnbmVkIGludCBjcHVtYXNrX2xvY2FsX3NwcmVhZCh1bnNpZ25lZCBpbnQgaSwgaW50IG5vZGUpCit7CisJaW50IGNwdTsKKworCS8qIFdyYXA6IHdlIGFsd2F5cyB3YW50IGEgY3B1LiAqLworCWkgJT0gbnVtX29ubGluZV9jcHVzKCk7CisKKwlpZiAobm9kZSA9PSAtMSkgeworCQlmb3JfZWFjaF9jcHUoY3B1LCBjcHVfb25saW5lX21hc2spCisJCQlpZiAoaS0tID09IDApCisJCQkJcmV0dXJuIGNwdTsKKwl9IGVsc2UgeworCQkvKiBOVU1BIGZpcnN0LiAqLworCQlmb3JfZWFjaF9jcHVfYW5kKGNwdSwgY3B1bWFza19vZl9ub2RlKG5vZGUpLCBjcHVfb25saW5lX21hc2spCisJCQlpZiAoaS0tID09IDApCisJCQkJcmV0dXJuIGNwdTsKKworCQlmb3JfZWFjaF9jcHUoY3B1LCBjcHVfb25saW5lX21hc2spIHsKKwkJCS8qIFNraXAgTlVNQSBub2RlcywgZG9uZSBhYm92ZS4gKi8KKwkJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgY3B1bWFza19vZl9ub2RlKG5vZGUpKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGktLSA9PSAwKQorCQkJCXJldHVybiBjcHU7CisJCX0KKwl9CisJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MKGNwdW1hc2tfbG9jYWxfc3ByZWFkKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYy1jY2l0dC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY3JjLWNjaXR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2ZGQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYy1jY2l0dC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKglsaW51eC9saWIvY3JjLWNjaXR0LmMKKyAqCisgKglUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqCVZlcnNpb24gMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMtY2NpdHQuaD4KKworLyoKKyAqIFRoaXMgbXlzdGVyaW91cyB0YWJsZSBpcyBqdXN0IHRoZSBDUkMgb2YgZWFjaCBwb3NzaWJsZSBieXRlLiBJdCBjYW4gYmUKKyAqIGNvbXB1dGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBiaXQtYXQtYS10aW1lIG1ldGhvZHMuIFRoZSBwb2x5bm9taWFsIGNhbgorICogYmUgc2VlbiBpbiBlbnRyeSAxMjgsIDB4ODQwOC4gVGhpcyBjb3JyZXNwb25kcyB0byB4XjAgKyB4XjUgKyB4XjEyLgorICogQWRkIHRoZSBpbXBsaWNpdCB4XjE2LCBhbmQgeW91IGhhdmUgdGhlIHN0YW5kYXJkIENSQy1DQ0lUVC4KKyAqLwordTE2IGNvbnN0IGNyY19jY2l0dF90YWJsZVsyNTZdID0geworCTB4MDAwMCwgMHgxMTg5LCAweDIzMTIsIDB4MzI5YiwgMHg0NjI0LCAweDU3YWQsIDB4NjUzNiwgMHg3NGJmLAorCTB4OGM0OCwgMHg5ZGMxLCAweGFmNWEsIDB4YmVkMywgMHhjYTZjLCAweGRiZTUsIDB4ZTk3ZSwgMHhmOGY3LAorCTB4MTA4MSwgMHgwMTA4LCAweDMzOTMsIDB4MjIxYSwgMHg1NmE1LCAweDQ3MmMsIDB4NzViNywgMHg2NDNlLAorCTB4OWNjOSwgMHg4ZDQwLCAweGJmZGIsIDB4YWU1MiwgMHhkYWVkLCAweGNiNjQsIDB4ZjlmZiwgMHhlODc2LAorCTB4MjEwMiwgMHgzMDhiLCAweDAyMTAsIDB4MTM5OSwgMHg2NzI2LCAweDc2YWYsIDB4NDQzNCwgMHg1NWJkLAorCTB4YWQ0YSwgMHhiY2MzLCAweDhlNTgsIDB4OWZkMSwgMHhlYjZlLCAweGZhZTcsIDB4Yzg3YywgMHhkOWY1LAorCTB4MzE4MywgMHgyMDBhLCAweDEyOTEsIDB4MDMxOCwgMHg3N2E3LCAweDY2MmUsIDB4NTRiNSwgMHg0NTNjLAorCTB4YmRjYiwgMHhhYzQyLCAweDllZDksIDB4OGY1MCwgMHhmYmVmLCAweGVhNjYsIDB4ZDhmZCwgMHhjOTc0LAorCTB4NDIwNCwgMHg1MzhkLCAweDYxMTYsIDB4NzA5ZiwgMHgwNDIwLCAweDE1YTksIDB4MjczMiwgMHgzNmJiLAorCTB4Y2U0YywgMHhkZmM1LCAweGVkNWUsIDB4ZmNkNywgMHg4ODY4LCAweDk5ZTEsIDB4YWI3YSwgMHhiYWYzLAorCTB4NTI4NSwgMHg0MzBjLCAweDcxOTcsIDB4NjAxZSwgMHgxNGExLCAweDA1MjgsIDB4MzdiMywgMHgyNjNhLAorCTB4ZGVjZCwgMHhjZjQ0LCAweGZkZGYsIDB4ZWM1NiwgMHg5OGU5LCAweDg5NjAsIDB4YmJmYiwgMHhhYTcyLAorCTB4NjMwNiwgMHg3MjhmLCAweDQwMTQsIDB4NTE5ZCwgMHgyNTIyLCAweDM0YWIsIDB4MDYzMCwgMHgxN2I5LAorCTB4ZWY0ZSwgMHhmZWM3LCAweGNjNWMsIDB4ZGRkNSwgMHhhOTZhLCAweGI4ZTMsIDB4OGE3OCwgMHg5YmYxLAorCTB4NzM4NywgMHg2MjBlLCAweDUwOTUsIDB4NDExYywgMHgzNWEzLCAweDI0MmEsIDB4MTZiMSwgMHgwNzM4LAorCTB4ZmZjZiwgMHhlZTQ2LCAweGRjZGQsIDB4Y2Q1NCwgMHhiOWViLCAweGE4NjIsIDB4OWFmOSwgMHg4YjcwLAorCTB4ODQwOCwgMHg5NTgxLCAweGE3MWEsIDB4YjY5MywgMHhjMjJjLCAweGQzYTUsIDB4ZTEzZSwgMHhmMGI3LAorCTB4MDg0MCwgMHgxOWM5LCAweDJiNTIsIDB4M2FkYiwgMHg0ZTY0LCAweDVmZWQsIDB4NmQ3NiwgMHg3Y2ZmLAorCTB4OTQ4OSwgMHg4NTAwLCAweGI3OWIsIDB4YTYxMiwgMHhkMmFkLCAweGMzMjQsIDB4ZjFiZiwgMHhlMDM2LAorCTB4MThjMSwgMHgwOTQ4LCAweDNiZDMsIDB4MmE1YSwgMHg1ZWU1LCAweDRmNmMsIDB4N2RmNywgMHg2YzdlLAorCTB4YTUwYSwgMHhiNDgzLCAweDg2MTgsIDB4OTc5MSwgMHhlMzJlLCAweGYyYTcsIDB4YzAzYywgMHhkMWI1LAorCTB4Mjk0MiwgMHgzOGNiLCAweDBhNTAsIDB4MWJkOSwgMHg2ZjY2LCAweDdlZWYsIDB4NGM3NCwgMHg1ZGZkLAorCTB4YjU4YiwgMHhhNDAyLCAweDk2OTksIDB4ODcxMCwgMHhmM2FmLCAweGUyMjYsIDB4ZDBiZCwgMHhjMTM0LAorCTB4MzljMywgMHgyODRhLCAweDFhZDEsIDB4MGI1OCwgMHg3ZmU3LCAweDZlNmUsIDB4NWNmNSwgMHg0ZDdjLAorCTB4YzYwYywgMHhkNzg1LCAweGU1MWUsIDB4ZjQ5NywgMHg4MDI4LCAweDkxYTEsIDB4YTMzYSwgMHhiMmIzLAorCTB4NGE0NCwgMHg1YmNkLCAweDY5NTYsIDB4NzhkZiwgMHgwYzYwLCAweDFkZTksIDB4MmY3MiwgMHgzZWZiLAorCTB4ZDY4ZCwgMHhjNzA0LCAweGY1OWYsIDB4ZTQxNiwgMHg5MGE5LCAweDgxMjAsIDB4YjNiYiwgMHhhMjMyLAorCTB4NWFjNSwgMHg0YjRjLCAweDc5ZDcsIDB4Njg1ZSwgMHgxY2UxLCAweDBkNjgsIDB4M2ZmMywgMHgyZTdhLAorCTB4ZTcwZSwgMHhmNjg3LCAweGM0MWMsIDB4ZDU5NSwgMHhhMTJhLCAweGIwYTMsIDB4ODIzOCwgMHg5M2IxLAorCTB4NmI0NiwgMHg3YWNmLCAweDQ4NTQsIDB4NTlkZCwgMHgyZDYyLCAweDNjZWIsIDB4MGU3MCwgMHgxZmY5LAorCTB4Zjc4ZiwgMHhlNjA2LCAweGQ0OWQsIDB4YzUxNCwgMHhiMWFiLCAweGEwMjIsIDB4OTJiOSwgMHg4MzMwLAorCTB4N2JjNywgMHg2YTRlLCAweDU4ZDUsIDB4NDk1YywgMHgzZGUzLCAweDJjNmEsIDB4MWVmMSwgMHgwZjc4Cit9OworRVhQT1JUX1NZTUJPTChjcmNfY2NpdHRfdGFibGUpOworCisvKioKKyAqCWNyY19jY2l0dCAtIHJlY29tcHV0ZSB0aGUgQ1JDIGZvciB0aGUgZGF0YSBidWZmZXIKKyAqCUBjcmM6IHByZXZpb3VzIENSQyB2YWx1ZQorICoJQGJ1ZmZlcjogZGF0YSBwb2ludGVyCisgKglAbGVuOiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICovCit1MTYgY3JjX2NjaXR0KHUxNiBjcmMsIHU4IGNvbnN0ICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCQljcmMgPSBjcmNfY2NpdHRfYnl0ZShjcmMsICpidWZmZXIrKyk7CisJcmV0dXJuIGNyYzsKK30KK0VYUE9SVF9TWU1CT0woY3JjX2NjaXR0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUkMtQ0NJVFQgY2FsY3VsYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMtaXR1LXQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYy1pdHUtdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzMjE5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMtaXR1LXQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogICAgICBjcmMtaXR1LXQuYworICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYy1pdHUtdC5oPgorCisvKiogQ1JDIHRhYmxlIGZvciB0aGUgQ1JDIElUVS1UIFYuNDEgMHgxMDIxICh4XjE2ICsgeF4xMiArIHheMTUgKyAxKSAqLworY29uc3QgdTE2IGNyY19pdHVfdF90YWJsZVsyNTZdID0geworCTB4MDAwMCwgMHgxMDIxLCAweDIwNDIsIDB4MzA2MywgMHg0MDg0LCAweDUwYTUsIDB4NjBjNiwgMHg3MGU3LAorCTB4ODEwOCwgMHg5MTI5LCAweGExNGEsIDB4YjE2YiwgMHhjMThjLCAweGQxYWQsIDB4ZTFjZSwgMHhmMWVmLAorCTB4MTIzMSwgMHgwMjEwLCAweDMyNzMsIDB4MjI1MiwgMHg1MmI1LCAweDQyOTQsIDB4NzJmNywgMHg2MmQ2LAorCTB4OTMzOSwgMHg4MzE4LCAweGIzN2IsIDB4YTM1YSwgMHhkM2JkLCAweGMzOWMsIDB4ZjNmZiwgMHhlM2RlLAorCTB4MjQ2MiwgMHgzNDQzLCAweDA0MjAsIDB4MTQwMSwgMHg2NGU2LCAweDc0YzcsIDB4NDRhNCwgMHg1NDg1LAorCTB4YTU2YSwgMHhiNTRiLCAweDg1MjgsIDB4OTUwOSwgMHhlNWVlLCAweGY1Y2YsIDB4YzVhYywgMHhkNThkLAorCTB4MzY1MywgMHgyNjcyLCAweDE2MTEsIDB4MDYzMCwgMHg3NmQ3LCAweDY2ZjYsIDB4NTY5NSwgMHg0NmI0LAorCTB4Yjc1YiwgMHhhNzdhLCAweDk3MTksIDB4ODczOCwgMHhmN2RmLCAweGU3ZmUsIDB4ZDc5ZCwgMHhjN2JjLAorCTB4NDhjNCwgMHg1OGU1LCAweDY4ODYsIDB4NzhhNywgMHgwODQwLCAweDE4NjEsIDB4MjgwMiwgMHgzODIzLAorCTB4YzljYywgMHhkOWVkLCAweGU5OGUsIDB4ZjlhZiwgMHg4OTQ4LCAweDk5NjksIDB4YTkwYSwgMHhiOTJiLAorCTB4NWFmNSwgMHg0YWQ0LCAweDdhYjcsIDB4NmE5NiwgMHgxYTcxLCAweDBhNTAsIDB4M2EzMywgMHgyYTEyLAorCTB4ZGJmZCwgMHhjYmRjLCAweGZiYmYsIDB4ZWI5ZSwgMHg5Yjc5LCAweDhiNTgsIDB4YmIzYiwgMHhhYjFhLAorCTB4NmNhNiwgMHg3Yzg3LCAweDRjZTQsIDB4NWNjNSwgMHgyYzIyLCAweDNjMDMsIDB4MGM2MCwgMHgxYzQxLAorCTB4ZWRhZSwgMHhmZDhmLCAweGNkZWMsIDB4ZGRjZCwgMHhhZDJhLCAweGJkMGIsIDB4OGQ2OCwgMHg5ZDQ5LAorCTB4N2U5NywgMHg2ZWI2LCAweDVlZDUsIDB4NGVmNCwgMHgzZTEzLCAweDJlMzIsIDB4MWU1MSwgMHgwZTcwLAorCTB4ZmY5ZiwgMHhlZmJlLCAweGRmZGQsIDB4Y2ZmYywgMHhiZjFiLCAweGFmM2EsIDB4OWY1OSwgMHg4Zjc4LAorCTB4OTE4OCwgMHg4MWE5LCAweGIxY2EsIDB4YTFlYiwgMHhkMTBjLCAweGMxMmQsIDB4ZjE0ZSwgMHhlMTZmLAorCTB4MTA4MCwgMHgwMGExLCAweDMwYzIsIDB4MjBlMywgMHg1MDA0LCAweDQwMjUsIDB4NzA0NiwgMHg2MDY3LAorCTB4ODNiOSwgMHg5Mzk4LCAweGEzZmIsIDB4YjNkYSwgMHhjMzNkLCAweGQzMWMsIDB4ZTM3ZiwgMHhmMzVlLAorCTB4MDJiMSwgMHgxMjkwLCAweDIyZjMsIDB4MzJkMiwgMHg0MjM1LCAweDUyMTQsIDB4NjI3NywgMHg3MjU2LAorCTB4YjVlYSwgMHhhNWNiLCAweDk1YTgsIDB4ODU4OSwgMHhmNTZlLCAweGU1NGYsIDB4ZDUyYywgMHhjNTBkLAorCTB4MzRlMiwgMHgyNGMzLCAweDE0YTAsIDB4MDQ4MSwgMHg3NDY2LCAweDY0NDcsIDB4NTQyNCwgMHg0NDA1LAorCTB4YTdkYiwgMHhiN2ZhLCAweDg3OTksIDB4OTdiOCwgMHhlNzVmLCAweGY3N2UsIDB4YzcxZCwgMHhkNzNjLAorCTB4MjZkMywgMHgzNmYyLCAweDA2OTEsIDB4MTZiMCwgMHg2NjU3LCAweDc2NzYsIDB4NDYxNSwgMHg1NjM0LAorCTB4ZDk0YywgMHhjOTZkLCAweGY5MGUsIDB4ZTkyZiwgMHg5OWM4LCAweDg5ZTksIDB4Yjk4YSwgMHhhOWFiLAorCTB4NTg0NCwgMHg0ODY1LCAweDc4MDYsIDB4NjgyNywgMHgxOGMwLCAweDA4ZTEsIDB4Mzg4MiwgMHgyOGEzLAorCTB4Y2I3ZCwgMHhkYjVjLCAweGViM2YsIDB4ZmIxZSwgMHg4YmY5LCAweDliZDgsIDB4YWJiYiwgMHhiYjlhLAorCTB4NGE3NSwgMHg1YTU0LCAweDZhMzcsIDB4N2ExNiwgMHgwYWYxLCAweDFhZDAsIDB4MmFiMywgMHgzYTkyLAorCTB4ZmQyZSwgMHhlZDBmLCAweGRkNmMsIDB4Y2Q0ZCwgMHhiZGFhLCAweGFkOGIsIDB4OWRlOCwgMHg4ZGM5LAorCTB4N2MyNiwgMHg2YzA3LCAweDVjNjQsIDB4NGM0NSwgMHgzY2EyLCAweDJjODMsIDB4MWNlMCwgMHgwY2MxLAorCTB4ZWYxZiwgMHhmZjNlLCAweGNmNWQsIDB4ZGY3YywgMHhhZjliLCAweGJmYmEsIDB4OGZkOSwgMHg5ZmY4LAorCTB4NmUxNywgMHg3ZTM2LCAweDRlNTUsIDB4NWU3NCwgMHgyZTkzLCAweDNlYjIsIDB4MGVkMSwgMHgxZWYwCit9OworCitFWFBPUlRfU1lNQk9MKGNyY19pdHVfdF90YWJsZSk7CisKKy8qKgorICogY3JjX2l0dV90IC0gQ29tcHV0ZSB0aGUgQ1JDLUlUVS1UIGZvciB0aGUgZGF0YSBidWZmZXIKKyAqCisgKiBAY3JjOiAgICAgcHJldmlvdXMgQ1JDIHZhbHVlCisgKiBAYnVmZmVyOiAgZGF0YSBwb2ludGVyCisgKiBAbGVuOiAgICAgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqCisgKiBSZXR1cm5zIHRoZSB1cGRhdGVkIENSQyB2YWx1ZQorICovCit1MTYgY3JjX2l0dV90KHUxNiBjcmMsIGNvbnN0IHU4ICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCQljcmMgPSBjcmNfaXR1X3RfYnl0ZShjcmMsICpidWZmZXIrKyk7CisJcmV0dXJuIGNyYzsKK30KK0VYUE9SVF9TWU1CT0woY3JjX2l0dV90KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJDUkMgSVRVLVQgVi40MSBjYWxjdWxhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY3JjLXQxMGRpZi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY3JjLXQxMGRpZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDMzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMtdDEwZGlmLmMKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIFQxMCBEYXRhIEludGVncml0eSBGaWVsZCBDUkMxNiBjYWxjdWxhdGlvbgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBPcmFjbGUgQ29ycG9yYXRpb24uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV3JpdHRlbiBieSBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNlbkBvcmFjbGUuY29tPgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYy10MTBkaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0aWNfa2V5Lmg+CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICpjcmN0MTBkaWZfdGZtOworc3RhdGljIHN0cnVjdCBzdGF0aWNfa2V5IGNyY3QxMGRpZl9mYWxsYmFjayBfX3JlYWRfbW9zdGx5OworCitfX3UxNiBjcmNfdDEwZGlmX3VwZGF0ZShfX3UxNiBjcmMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgc2hhc2hfZGVzYyBzaGFzaDsKKwkJY2hhciBjdHhbMl07CisJfSBkZXNjOworCWludCBlcnI7CisKKwlpZiAoc3RhdGljX2tleV9mYWxzZSgmY3JjdDEwZGlmX2ZhbGxiYWNrKSkKKwkJcmV0dXJuIGNyY190MTBkaWZfZ2VuZXJpYyhjcmMsIGJ1ZmZlciwgbGVuKTsKKworCWRlc2Muc2hhc2gudGZtID0gY3JjdDEwZGlmX3RmbTsKKwlkZXNjLnNoYXNoLmZsYWdzID0gMDsKKwkqKF9fdTE2ICopZGVzYy5jdHggPSBjcmM7CisKKwllcnIgPSBjcnlwdG9fc2hhc2hfdXBkYXRlKCZkZXNjLnNoYXNoLCBidWZmZXIsIGxlbik7CisJQlVHX09OKGVycik7CisKKwlyZXR1cm4gKihfX3UxNiAqKWRlc2MuY3R4OworfQorRVhQT1JUX1NZTUJPTChjcmNfdDEwZGlmX3VwZGF0ZSk7CisKK19fdTE2IGNyY190MTBkaWYoY29uc3QgdW5zaWduZWQgY2hhciAqYnVmZmVyLCBzaXplX3QgbGVuKQoreworCXJldHVybiBjcmNfdDEwZGlmX3VwZGF0ZSgwLCBidWZmZXIsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKGNyY190MTBkaWYpOworCitzdGF0aWMgaW50IF9faW5pdCBjcmNfdDEwZGlmX21vZF9pbml0KHZvaWQpCit7CisJY3JjdDEwZGlmX3RmbSA9IGNyeXB0b19hbGxvY19zaGFzaCgiY3JjdDEwZGlmIiwgMCwgMCk7CisJaWYgKElTX0VSUihjcmN0MTBkaWZfdGZtKSkgeworCQlzdGF0aWNfa2V5X3Nsb3dfaW5jKCZjcmN0MTBkaWZfZmFsbGJhY2spOworCQljcmN0MTBkaWZfdGZtID0gTlVMTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcmNfdDEwZGlmX21vZF9maW5pKHZvaWQpCit7CisJY3J5cHRvX2ZyZWVfc2hhc2goY3JjdDEwZGlmX3RmbSk7Cit9CisKK21vZHVsZV9pbml0KGNyY190MTBkaWZfbW9kX2luaXQpOworbW9kdWxlX2V4aXQoY3JjX3QxMGRpZl9tb2RfZmluaSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiVDEwIERJRiBDUkMgY2FsY3VsYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TT0ZUREVQKCJwcmU6IGNyY3QxMGRpZiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY3JjMTYuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczN2IwOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzE2LmMKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqICAgICAgY3JjMTYuYworICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzE2Lmg+CisKKy8qKiBDUkMgdGFibGUgZm9yIHRoZSBDUkMtMTYuIFRoZSBwb2x5IGlzIDB4ODAwNSAoeF4xNiArIHheMTUgKyB4XjIgKyAxKSAqLwordTE2IGNvbnN0IGNyYzE2X3RhYmxlWzI1Nl0gPSB7CisJMHgwMDAwLCAweEMwQzEsIDB4QzE4MSwgMHgwMTQwLCAweEMzMDEsIDB4MDNDMCwgMHgwMjgwLCAweEMyNDEsCisJMHhDNjAxLCAweDA2QzAsIDB4MDc4MCwgMHhDNzQxLCAweDA1MDAsIDB4QzVDMSwgMHhDNDgxLCAweDA0NDAsCisJMHhDQzAxLCAweDBDQzAsIDB4MEQ4MCwgMHhDRDQxLCAweDBGMDAsIDB4Q0ZDMSwgMHhDRTgxLCAweDBFNDAsCisJMHgwQTAwLCAweENBQzEsIDB4Q0I4MSwgMHgwQjQwLCAweEM5MDEsIDB4MDlDMCwgMHgwODgwLCAweEM4NDEsCisJMHhEODAxLCAweDE4QzAsIDB4MTk4MCwgMHhEOTQxLCAweDFCMDAsIDB4REJDMSwgMHhEQTgxLCAweDFBNDAsCisJMHgxRTAwLCAweERFQzEsIDB4REY4MSwgMHgxRjQwLCAweEREMDEsIDB4MURDMCwgMHgxQzgwLCAweERDNDEsCisJMHgxNDAwLCAweEQ0QzEsIDB4RDU4MSwgMHgxNTQwLCAweEQ3MDEsIDB4MTdDMCwgMHgxNjgwLCAweEQ2NDEsCisJMHhEMjAxLCAweDEyQzAsIDB4MTM4MCwgMHhEMzQxLCAweDExMDAsIDB4RDFDMSwgMHhEMDgxLCAweDEwNDAsCisJMHhGMDAxLCAweDMwQzAsIDB4MzE4MCwgMHhGMTQxLCAweDMzMDAsIDB4RjNDMSwgMHhGMjgxLCAweDMyNDAsCisJMHgzNjAwLCAweEY2QzEsIDB4Rjc4MSwgMHgzNzQwLCAweEY1MDEsIDB4MzVDMCwgMHgzNDgwLCAweEY0NDEsCisJMHgzQzAwLCAweEZDQzEsIDB4RkQ4MSwgMHgzRDQwLCAweEZGMDEsIDB4M0ZDMCwgMHgzRTgwLCAweEZFNDEsCisJMHhGQTAxLCAweDNBQzAsIDB4M0I4MCwgMHhGQjQxLCAweDM5MDAsIDB4RjlDMSwgMHhGODgxLCAweDM4NDAsCisJMHgyODAwLCAweEU4QzEsIDB4RTk4MSwgMHgyOTQwLCAweEVCMDEsIDB4MkJDMCwgMHgyQTgwLCAweEVBNDEsCisJMHhFRTAxLCAweDJFQzAsIDB4MkY4MCwgMHhFRjQxLCAweDJEMDAsIDB4RURDMSwgMHhFQzgxLCAweDJDNDAsCisJMHhFNDAxLCAweDI0QzAsIDB4MjU4MCwgMHhFNTQxLCAweDI3MDAsIDB4RTdDMSwgMHhFNjgxLCAweDI2NDAsCisJMHgyMjAwLCAweEUyQzEsIDB4RTM4MSwgMHgyMzQwLCAweEUxMDEsIDB4MjFDMCwgMHgyMDgwLCAweEUwNDEsCisJMHhBMDAxLCAweDYwQzAsIDB4NjE4MCwgMHhBMTQxLCAweDYzMDAsIDB4QTNDMSwgMHhBMjgxLCAweDYyNDAsCisJMHg2NjAwLCAweEE2QzEsIDB4QTc4MSwgMHg2NzQwLCAweEE1MDEsIDB4NjVDMCwgMHg2NDgwLCAweEE0NDEsCisJMHg2QzAwLCAweEFDQzEsIDB4QUQ4MSwgMHg2RDQwLCAweEFGMDEsIDB4NkZDMCwgMHg2RTgwLCAweEFFNDEsCisJMHhBQTAxLCAweDZBQzAsIDB4NkI4MCwgMHhBQjQxLCAweDY5MDAsIDB4QTlDMSwgMHhBODgxLCAweDY4NDAsCisJMHg3ODAwLCAweEI4QzEsIDB4Qjk4MSwgMHg3OTQwLCAweEJCMDEsIDB4N0JDMCwgMHg3QTgwLCAweEJBNDEsCisJMHhCRTAxLCAweDdFQzAsIDB4N0Y4MCwgMHhCRjQxLCAweDdEMDAsIDB4QkRDMSwgMHhCQzgxLCAweDdDNDAsCisJMHhCNDAxLCAweDc0QzAsIDB4NzU4MCwgMHhCNTQxLCAweDc3MDAsIDB4QjdDMSwgMHhCNjgxLCAweDc2NDAsCisJMHg3MjAwLCAweEIyQzEsIDB4QjM4MSwgMHg3MzQwLCAweEIxMDEsIDB4NzFDMCwgMHg3MDgwLCAweEIwNDEsCisJMHg1MDAwLCAweDkwQzEsIDB4OTE4MSwgMHg1MTQwLCAweDkzMDEsIDB4NTNDMCwgMHg1MjgwLCAweDkyNDEsCisJMHg5NjAxLCAweDU2QzAsIDB4NTc4MCwgMHg5NzQxLCAweDU1MDAsIDB4OTVDMSwgMHg5NDgxLCAweDU0NDAsCisJMHg5QzAxLCAweDVDQzAsIDB4NUQ4MCwgMHg5RDQxLCAweDVGMDAsIDB4OUZDMSwgMHg5RTgxLCAweDVFNDAsCisJMHg1QTAwLCAweDlBQzEsIDB4OUI4MSwgMHg1QjQwLCAweDk5MDEsIDB4NTlDMCwgMHg1ODgwLCAweDk4NDEsCisJMHg4ODAxLCAweDQ4QzAsIDB4NDk4MCwgMHg4OTQxLCAweDRCMDAsIDB4OEJDMSwgMHg4QTgxLCAweDRBNDAsCisJMHg0RTAwLCAweDhFQzEsIDB4OEY4MSwgMHg0RjQwLCAweDhEMDEsIDB4NERDMCwgMHg0QzgwLCAweDhDNDEsCisJMHg0NDAwLCAweDg0QzEsIDB4ODU4MSwgMHg0NTQwLCAweDg3MDEsIDB4NDdDMCwgMHg0NjgwLCAweDg2NDEsCisJMHg4MjAxLCAweDQyQzAsIDB4NDM4MCwgMHg4MzQxLCAweDQxMDAsIDB4ODFDMSwgMHg4MDgxLCAweDQwNDAKK307CitFWFBPUlRfU1lNQk9MKGNyYzE2X3RhYmxlKTsKKworLyoqCisgKiBjcmMxNiAtIGNvbXB1dGUgdGhlIENSQy0xNiBmb3IgdGhlIGRhdGEgYnVmZmVyCisgKiBAY3JjOglwcmV2aW91cyBDUkMgdmFsdWUKKyAqIEBidWZmZXI6CWRhdGEgcG9pbnRlcgorICogQGxlbjoJbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIKKyAqCisgKiBSZXR1cm5zIHRoZSB1cGRhdGVkIENSQyB2YWx1ZS4KKyAqLwordTE2IGNyYzE2KHUxNiBjcmMsIHU4IGNvbnN0ICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJd2hpbGUgKGxlbi0tKQorCQljcmMgPSBjcmMxNl9ieXRlKGNyYywgKmJ1ZmZlcisrKTsKKwlyZXR1cm4gY3JjOworfQorRVhQT1JUX1NZTUJPTChjcmMxNik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1JDMTYgY2FsY3VsYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzMyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZGM5MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMzMi5jCkBAIC0wLDAgKzEsMzQyIEBACisvKgorICogQXVnIDgsIDIwMTEgQm9iIFBlYXJzb24gd2l0aCBoZWxwIGZyb20gSm9ha2ltIFRqZXJubHVuZCBhbmQgR2VvcmdlIFNwZWx2aW4KKyAqIGNsZWFuZWQgdXAgY29kZSB0byBjdXJyZW50IHZlcnNpb24gb2Ygc3BhcnNlIGFuZCBhZGRlZCB0aGUgc2xpY2luZy1ieS04CisgKiBhbGdvcml0aG0gdG8gdGhlIGNsb3NlbHkgc2ltaWxhciBleGlzdGluZyBzbGljaW5nLWJ5LTQgYWxnb3JpdGhtLgorICoKKyAqIE9jdCAxNSwgMjAwMCBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiBOaWNlciBjcmMzMiBmdW5jdGlvbnMvZG9jcyBzdWJtaXR0ZWQgYnkgbGludXhAaG9yaXpvbi5jb20uICBUaGFua3MhCisgKiBDb2RlIHdhcyBmcm9tIHRoZSBwdWJsaWMgZG9tYWluLCBjb3B5cmlnaHQgYWJhbmRvbmVkLiAgQ29kZSB3YXMKKyAqIHN1YnNlcXVlbnRseSBpbmNsdWRlZCBpbiB0aGUga2VybmVsLCB0aHVzIHdhcyByZS1saWNlbnNlZCB1bmRlciB0aGUKKyAqIEdOVSBHUEwgdjIuCisgKgorICogT2N0IDEyLCAyMDAwIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4KKyAqIFNhbWUgY3JjMzIgZnVuY3Rpb24gd2FzIHVzZWQgaW4gNSBvdGhlciBwbGFjZXMgaW4gdGhlIGtlcm5lbC4KKyAqIEkgbWFkZSBvbmUgdmVyc2lvbiwgYW5kIGRlbGV0ZWQgdGhlIG90aGVycy4KKyAqIFRoZXJlIGFyZSB2YXJpb3VzIGluY2FudGF0aW9ucyBvZiBjcmMzMigpLiAgU29tZSB1c2UgYSBzZWVkIG9mIDAgb3IgfjAuCisgKiBTb21lIHhvciBhdCB0aGUgZW5kIHdpdGggfjAuICBUaGUgZ2VuZXJpYyBjcmMzMigpIGZ1bmN0aW9uIHRha2VzCisgKiBzZWVkIGFzIGFuIGFyZ3VtZW50LCBhbmQgZG9lc24ndCB4b3IgYXQgdGhlIGVuZC4gIFRoZW4gaW5kaXZpZHVhbAorICogdXNlcnMgY2FuIGRvIHdoYXRldmVyIHRoZXkgbmVlZC4KKyAqICAgZHJpdmVycy9uZXQvc21jOTE5NC5jIHVzZXMgc2VlZCB+MCwgZG9lc24ndCB4b3Igd2l0aCB+MC4KKyAqICAgZnMvamZmczIgdXNlcyBzZWVkIDAsIGRvZXNuJ3QgeG9yIHdpdGggfjAuCisgKiAgIGZzL3BhcnRpdGlvbnMvZWZpLmMgdXNlcyBzZWVkIH4wLCB4b3IncyB3aXRoIH4wLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisvKiBzZWU6IERvY3VtZW50YXRpb24vY3JjMzIudHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIGFsZ29yaXRobXMgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgImNyYzMyZGVmcy5oIgorCisjaWYgQ1JDX0xFX0JJVFMgPiA4CisjIGRlZmluZSB0b2xlKHgpICgoX19mb3JjZSB1MzIpIGNwdV90b19sZTMyKHgpKQorI2Vsc2UKKyMgZGVmaW5lIHRvbGUoeCkgKHgpCisjZW5kaWYKKworI2lmIENSQ19CRV9CSVRTID4gOAorIyBkZWZpbmUgdG9iZSh4KSAoKF9fZm9yY2UgdTMyKSBjcHVfdG9fYmUzMih4KSkKKyNlbHNlCisjIGRlZmluZSB0b2JlKHgpICh4KQorI2VuZGlmCisKKyNpbmNsdWRlICJjcmMzMnRhYmxlLmgiCisKK01PRFVMRV9BVVRIT1IoIk1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVmFyaW91cyBDUkMzMiBjYWxjdWxhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmIENSQ19MRV9CSVRTID4gOCB8fCBDUkNfQkVfQklUUyA+IDgKKworLyogaW1wbGVtZW50cyBzbGljaW5nLWJ5LTQgb3Igc2xpY2luZy1ieS04IGFsZ29yaXRobSAqLworc3RhdGljIGlubGluZSB1MzIgX19wdXJlCitjcmMzMl9ib2R5KHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKmJ1Ziwgc2l6ZV90IGxlbiwgY29uc3QgdTMyICgqdGFiKVsyNTZdKQoreworIyBpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBET19DUkMoeCkgY3JjID0gdDBbKGNyYyBeICh4KSkgJiAyNTVdIF4gKGNyYyA+PiA4KQorIyAgZGVmaW5lIERPX0NSQzQgKHQzWyhxKSAmIDI1NV0gXiB0MlsocSA+PiA4KSAmIDI1NV0gXiBcCisJCSAgIHQxWyhxID4+IDE2KSAmIDI1NV0gXiB0MFsocSA+PiAyNCkgJiAyNTVdKQorIyAgZGVmaW5lIERPX0NSQzggKHQ3WyhxKSAmIDI1NV0gXiB0NlsocSA+PiA4KSAmIDI1NV0gXiBcCisJCSAgIHQ1WyhxID4+IDE2KSAmIDI1NV0gXiB0NFsocSA+PiAyNCkgJiAyNTVdKQorIyBlbHNlCisjICBkZWZpbmUgRE9fQ1JDKHgpIGNyYyA9IHQwWygoY3JjID4+IDI0KSBeICh4KSkgJiAyNTVdIF4gKGNyYyA8PCA4KQorIyAgZGVmaW5lIERPX0NSQzQgKHQwWyhxKSAmIDI1NV0gXiB0MVsocSA+PiA4KSAmIDI1NV0gXiBcCisJCSAgIHQyWyhxID4+IDE2KSAmIDI1NV0gXiB0M1socSA+PiAyNCkgJiAyNTVdKQorIyAgZGVmaW5lIERPX0NSQzggKHQ0WyhxKSAmIDI1NV0gXiB0NVsocSA+PiA4KSAmIDI1NV0gXiBcCisJCSAgIHQ2WyhxID4+IDE2KSAmIDI1NV0gXiB0N1socSA+PiAyNCkgJiAyNTVdKQorIyBlbmRpZgorCWNvbnN0IHUzMiAqYjsKKwlzaXplX3QgICAgcmVtX2xlbjsKKyMgaWZkZWYgQ09ORklHX1g4NgorCXNpemVfdCBpOworIyBlbmRpZgorCWNvbnN0IHUzMiAqdDA9dGFiWzBdLCAqdDE9dGFiWzFdLCAqdDI9dGFiWzJdLCAqdDM9dGFiWzNdOworIyBpZiBDUkNfTEVfQklUUyAhPSAzMgorCWNvbnN0IHUzMiAqdDQgPSB0YWJbNF0sICp0NSA9IHRhYls1XSwgKnQ2ID0gdGFiWzZdLCAqdDcgPSB0YWJbN107CisjIGVuZGlmCisJdTMyIHE7CisKKwkvKiBBbGlnbiBpdCAqLworCWlmICh1bmxpa2VseSgobG9uZylidWYgJiAzICYmIGxlbikpIHsKKwkJZG8geworCQkJRE9fQ1JDKCpidWYrKyk7CisJCX0gd2hpbGUgKCgtLWxlbikgJiYgKChsb25nKWJ1ZikmMyk7CisJfQorCisjIGlmIENSQ19MRV9CSVRTID09IDMyCisJcmVtX2xlbiA9IGxlbiAmIDM7CisJbGVuID0gbGVuID4+IDI7CisjIGVsc2UKKwlyZW1fbGVuID0gbGVuICYgNzsKKwlsZW4gPSBsZW4gPj4gMzsKKyMgZW5kaWYKKworCWIgPSAoY29uc3QgdTMyICopYnVmOworIyBpZmRlZiBDT05GSUdfWDg2CisJLS1iOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworIyBlbHNlCisJZm9yICgtLWI7IGxlbjsgLS1sZW4pIHsKKyMgZW5kaWYKKwkJcSA9IGNyYyBeICorK2I7IC8qIHVzZSBwcmUgaW5jcmVtZW50IGZvciBzcGVlZCAqLworIyBpZiBDUkNfTEVfQklUUyA9PSAzMgorCQljcmMgPSBET19DUkM0OworIyBlbHNlCisJCWNyYyA9IERPX0NSQzg7CisJCXEgPSAqKytiOworCQljcmMgXj0gRE9fQ1JDNDsKKyMgZW5kaWYKKwl9CisJbGVuID0gcmVtX2xlbjsKKwkvKiBBbmQgdGhlIGxhc3QgZmV3IGJ5dGVzICovCisJaWYgKGxlbikgeworCQl1OCAqcCA9ICh1OCAqKShiICsgMSkgLSAxOworIyBpZmRlZiBDT05GSUdfWDg2CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCURPX0NSQygqKytwKTsgLyogdXNlIHByZSBpbmNyZW1lbnQgZm9yIHNwZWVkICovCisjIGVsc2UKKwkJZG8geworCQkJRE9fQ1JDKCorK3ApOyAvKiB1c2UgcHJlIGluY3JlbWVudCBmb3Igc3BlZWQgKi8KKwkJfSB3aGlsZSAoLS1sZW4pOworIyBlbmRpZgorCX0KKwlyZXR1cm4gY3JjOworI3VuZGVmIERPX0NSQworI3VuZGVmIERPX0NSQzQKKyN1bmRlZiBET19DUkM4Cit9CisjZW5kaWYKKworCisvKioKKyAqIGNyYzMyX2xlX2dlbmVyaWMoKSAtIENhbGN1bGF0ZSBiaXR3aXNlIGxpdHRsZS1lbmRpYW4gRXRoZXJuZXQgQVVUT0RJTiBJSQorICoJCQlDUkMzMi9DUkMzMkMKKyAqIEBjcmM6IHNlZWQgdmFsdWUgZm9yIGNvbXB1dGF0aW9uLiAgfjAgZm9yIEV0aGVybmV0LCBzb21ldGltZXMgMCBmb3Igb3RoZXIKKyAqCSB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIvY3JjMzJjIHZhbHVlIGlmIGNvbXB1dGluZyBpbmNyZW1lbnRhbGx5LgorICogQHA6IHBvaW50ZXIgdG8gYnVmZmVyIG92ZXIgd2hpY2ggQ1JDMzIvQ1JDMzJDIGlzIHJ1bgorICogQGxlbjogbGVuZ3RoIG9mIGJ1ZmZlciBAcAorICogQHRhYjogbGl0dGxlLWVuZGlhbiBFdGhlcm5ldCB0YWJsZQorICogQHBvbHlub21pYWw6IENSQzMyL0NSQzMyYyBMRSBwb2x5bm9taWFsCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIF9fcHVyZSBjcmMzMl9sZV9nZW5lcmljKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsCisJCQkJCSAgc2l6ZV90IGxlbiwgY29uc3QgdTMyICgqdGFiKVsyNTZdLAorCQkJCQkgIHUzMiBwb2x5bm9taWFsKQoreworI2lmIENSQ19MRV9CSVRTID09IDEKKwlpbnQgaTsKKwl3aGlsZSAobGVuLS0pIHsKKwkJY3JjIF49ICpwKys7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQljcmMgPSAoY3JjID4+IDEpIF4gKChjcmMgJiAxKSA/IHBvbHlub21pYWwgOiAwKTsKKwl9CisjIGVsaWYgQ1JDX0xFX0JJVFMgPT0gMgorCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKzsKKwkJY3JjID0gKGNyYyA+PiAyKSBeIHRhYlswXVtjcmMgJiAzXTsKKwkJY3JjID0gKGNyYyA+PiAyKSBeIHRhYlswXVtjcmMgJiAzXTsKKwkJY3JjID0gKGNyYyA+PiAyKSBeIHRhYlswXVtjcmMgJiAzXTsKKwkJY3JjID0gKGNyYyA+PiAyKSBeIHRhYlswXVtjcmMgJiAzXTsKKwl9CisjIGVsaWYgQ1JDX0xFX0JJVFMgPT0gNAorCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKzsKKwkJY3JjID0gKGNyYyA+PiA0KSBeIHRhYlswXVtjcmMgJiAxNV07CisJCWNyYyA9IChjcmMgPj4gNCkgXiB0YWJbMF1bY3JjICYgMTVdOworCX0KKyMgZWxpZiBDUkNfTEVfQklUUyA9PSA4CisJLyogYWthIFNhcndhdGUgYWxnb3JpdGhtICovCisJd2hpbGUgKGxlbi0tKSB7CisJCWNyYyBePSAqcCsrOworCQljcmMgPSAoY3JjID4+IDgpIF4gdGFiWzBdW2NyYyAmIDI1NV07CisJfQorIyBlbHNlCisJY3JjID0gKF9fZm9yY2UgdTMyKSBfX2NwdV90b19sZTMyKGNyYyk7CisJY3JjID0gY3JjMzJfYm9keShjcmMsIHAsIGxlbiwgdGFiKTsKKwljcmMgPSBfX2xlMzJfdG9fY3B1KChfX2ZvcmNlIF9fbGUzMiljcmMpOworI2VuZGlmCisJcmV0dXJuIGNyYzsKK30KKworI2lmIENSQ19MRV9CSVRTID09IDEKK3UzMiBfX3B1cmUgY3JjMzJfbGUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gY3JjMzJfbGVfZ2VuZXJpYyhjcmMsIHAsIGxlbiwgTlVMTCwgQ1JDUE9MWV9MRSk7Cit9Cit1MzIgX19wdXJlIF9fY3JjMzJjX2xlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGNyYzMyX2xlX2dlbmVyaWMoY3JjLCBwLCBsZW4sIE5VTEwsIENSQzMyQ19QT0xZX0xFKTsKK30KKyNlbHNlCit1MzIgX19wdXJlIGNyYzMyX2xlKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGNyYzMyX2xlX2dlbmVyaWMoY3JjLCBwLCBsZW4sCisJCQkoY29uc3QgdTMyICgqKVsyNTZdKWNyYzMydGFibGVfbGUsIENSQ1BPTFlfTEUpOworfQordTMyIF9fcHVyZSBfX2NyYzMyY19sZSh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuKQoreworCXJldHVybiBjcmMzMl9sZV9nZW5lcmljKGNyYywgcCwgbGVuLAorCQkJKGNvbnN0IHUzMiAoKilbMjU2XSljcmMzMmN0YWJsZV9sZSwgQ1JDMzJDX1BPTFlfTEUpOworfQorI2VuZGlmCitFWFBPUlRfU1lNQk9MKGNyYzMyX2xlKTsKK0VYUE9SVF9TWU1CT0woX19jcmMzMmNfbGUpOworCisvKgorICogVGhpcyBtdWx0aXBsaWVzIHRoZSBwb2x5bm9taWFscyB4IGFuZCB5IG1vZHVsbyB0aGUgZ2l2ZW4gbW9kdWx1cy4KKyAqIFRoaXMgZm9sbG93cyB0aGUgImxpdHRsZS1lbmRpYW4iIENSQyBjb252ZW50aW9uIHRoYXQgdGhlIGxzYml0CisgKiByZXByZXNlbnRzIHRoZSBoaWdoZXN0IHBvd2VyIG9mIHgsIGFuZCB0aGUgbXNiaXQgcmVwcmVzZW50cyB4XjAuCisgKi8KK3N0YXRpYyB1MzIgX19hdHRyaWJ1dGVfY29uc3RfXyBnZjJfbXVsdGlwbHkodTMyIHgsIHUzMiB5LCB1MzIgbW9kdWx1cykKK3sKKwl1MzIgcHJvZHVjdCA9IHggJiAxID8geSA6IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzE7IGkrKykgeworCQlwcm9kdWN0ID0gKHByb2R1Y3QgPj4gMSkgXiAocHJvZHVjdCAmIDEgPyBtb2R1bHVzIDogMCk7CisJCXggPj49IDE7CisJCXByb2R1Y3QgXj0geCAmIDEgPyB5IDogMDsKKwl9CisKKwlyZXR1cm4gcHJvZHVjdDsKK30KKworLyoqCisgKiBjcmMzMl9nZW5lcmljX3NoaWZ0IC0gQXBwZW5kIGxlbiAwIGJ5dGVzIHRvIGNyYywgaW4gbG9nYXJpdGhtaWMgdGltZQorICogQGNyYzogVGhlIG9yaWdpbmFsIGxpdHRsZS1lbmRpYW4gQ1JDIChpLmUuIGxzYml0IGlzIHheMzEgY29lZmZpY2llbnQpCisgKiBAbGVuOiBUaGUgbnVtYmVyIG9mIGJ5dGVzLiBAY3JjIGlzIG11bHRpcGxpZWQgYnkgeF4oOCpAbGVuKQorICogQHBvbHlub21pYWw6IFRoZSBtb2R1bHVzIHVzZWQgdG8gcmVkdWNlIHRoZSByZXN1bHQgdG8gMzIgYml0cy4KKyAqCisgKiBJdCdzIHBvc3NpYmxlIHRvIHBhcmFsbGVsaXplIENSQyBjb21wdXRhdGlvbnMgYnkgY29tcHV0aW5nIGEgQ1JDCisgKiBvdmVyIHNlcGFyYXRlIHJhbmdlcyBvZiBhIGJ1ZmZlciwgdGhlbiBzdW1taW5nIHRoZW0uCisgKiBUaGlzIHNoaWZ0cyB0aGUgZ2l2ZW4gQ1JDIGJ5IDgqbGVuIGJpdHMgKGkuZS4gcHJvZHVjZXMgdGhlIHNhbWUgZWZmZWN0CisgKiBhcyBhcHBlbmRpbmcgbGVuIGJ5dGVzIG9mIHplcm8gdG8gdGhlIGRhdGEpLCBpbiB0aW1lIHByb3BvcnRpb25hbAorICogdG8gbG9nKGxlbikuCisgKi8KK3N0YXRpYyB1MzIgX19hdHRyaWJ1dGVfY29uc3RfXyBjcmMzMl9nZW5lcmljX3NoaWZ0KHUzMiBjcmMsIHNpemVfdCBsZW4sCisJCQkJCQkgICB1MzIgcG9seW5vbWlhbCkKK3sKKwl1MzIgcG93ZXIgPSBwb2x5bm9taWFsOwkvKiBDUkMgb2YgeF4zMiAqLworCWludCBpOworCisJLyogU2hpZnQgdXAgdG8gMzIgYml0cyBpbiB0aGUgc2ltcGxlIGxpbmVhciB3YXkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgOCAqIChpbnQpKGxlbiAmIDMpOyBpKyspCisJCWNyYyA9IChjcmMgPj4gMSkgXiAoY3JjICYgMSA/IHBvbHlub21pYWwgOiAwKTsKKworCWxlbiA+Pj0gMjsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIGNyYzsKKworCWZvciAoOzspIHsKKwkJLyogInBvd2VyIiBpcyB4XigyXmkpLCBtb2R1bG8gdGhlIHBvbHlub21pYWwgKi8KKwkJaWYgKGxlbiAmIDEpCisJCQljcmMgPSBnZjJfbXVsdGlwbHkoY3JjLCBwb3dlciwgcG9seW5vbWlhbCk7CisKKwkJbGVuID4+PSAxOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCisJCS8qIFNxdWFyZSBwb3dlciwgYWR2YW5jaW5nIHRvIHheKDJeKGkrMSkpICovCisJCXBvd2VyID0gZ2YyX211bHRpcGx5KHBvd2VyLCBwb3dlciwgcG9seW5vbWlhbCk7CisJfQorCisJcmV0dXJuIGNyYzsKK30KKwordTMyIF9fYXR0cmlidXRlX2NvbnN0X18gY3JjMzJfbGVfc2hpZnQodTMyIGNyYywgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gY3JjMzJfZ2VuZXJpY19zaGlmdChjcmMsIGxlbiwgQ1JDUE9MWV9MRSk7Cit9CisKK3UzMiBfX2F0dHJpYnV0ZV9jb25zdF9fIF9fY3JjMzJjX2xlX3NoaWZ0KHUzMiBjcmMsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIGNyYzMyX2dlbmVyaWNfc2hpZnQoY3JjLCBsZW4sIENSQzMyQ19QT0xZX0xFKTsKK30KK0VYUE9SVF9TWU1CT0woY3JjMzJfbGVfc2hpZnQpOworRVhQT1JUX1NZTUJPTChfX2NyYzMyY19sZV9zaGlmdCk7CisKKy8qKgorICogY3JjMzJfYmVfZ2VuZXJpYygpIC0gQ2FsY3VsYXRlIGJpdHdpc2UgYmlnLWVuZGlhbiBFdGhlcm5ldCBBVVRPRElOIElJIENSQzMyCisgKiBAY3JjOiBzZWVkIHZhbHVlIGZvciBjb21wdXRhdGlvbi4gIH4wIGZvciBFdGhlcm5ldCwgc29tZXRpbWVzIDAgZm9yCisgKglvdGhlciB1c2VzLCBvciB0aGUgcHJldmlvdXMgY3JjMzIgdmFsdWUgaWYgY29tcHV0aW5nIGluY3JlbWVudGFsbHkuCisgKiBAcDogcG9pbnRlciB0byBidWZmZXIgb3ZlciB3aGljaCBDUkMzMiBpcyBydW4KKyAqIEBsZW46IGxlbmd0aCBvZiBidWZmZXIgQHAKKyAqIEB0YWI6IGJpZy1lbmRpYW4gRXRoZXJuZXQgdGFibGUKKyAqIEBwb2x5bm9taWFsOiBDUkMzMiBCRSBwb2x5bm9taWFsCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIF9fcHVyZSBjcmMzMl9iZV9nZW5lcmljKHUzMiBjcmMsIHVuc2lnbmVkIGNoYXIgY29uc3QgKnAsCisJCQkJCSAgc2l6ZV90IGxlbiwgY29uc3QgdTMyICgqdGFiKVsyNTZdLAorCQkJCQkgIHUzMiBwb2x5bm9taWFsKQoreworI2lmIENSQ19CRV9CSVRTID09IDEKKwlpbnQgaTsKKwl3aGlsZSAobGVuLS0pIHsKKwkJY3JjIF49ICpwKysgPDwgMjQ7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQljcmMgPQorCQkJICAgIChjcmMgPDwgMSkgXiAoKGNyYyAmIDB4ODAwMDAwMDApID8gcG9seW5vbWlhbCA6CisJCQkJCSAgMCk7CisJfQorIyBlbGlmIENSQ19CRV9CSVRTID09IDIKKwl3aGlsZSAobGVuLS0pIHsKKwkJY3JjIF49ICpwKysgPDwgMjQ7CisJCWNyYyA9IChjcmMgPDwgMikgXiB0YWJbMF1bY3JjID4+IDMwXTsKKwkJY3JjID0gKGNyYyA8PCAyKSBeIHRhYlswXVtjcmMgPj4gMzBdOworCQljcmMgPSAoY3JjIDw8IDIpIF4gdGFiWzBdW2NyYyA+PiAzMF07CisJCWNyYyA9IChjcmMgPDwgMikgXiB0YWJbMF1bY3JjID4+IDMwXTsKKwl9CisjIGVsaWYgQ1JDX0JFX0JJVFMgPT0gNAorCXdoaWxlIChsZW4tLSkgeworCQljcmMgXj0gKnArKyA8PCAyNDsKKwkJY3JjID0gKGNyYyA8PCA0KSBeIHRhYlswXVtjcmMgPj4gMjhdOworCQljcmMgPSAoY3JjIDw8IDQpIF4gdGFiWzBdW2NyYyA+PiAyOF07CisJfQorIyBlbGlmIENSQ19CRV9CSVRTID09IDgKKwl3aGlsZSAobGVuLS0pIHsKKwkJY3JjIF49ICpwKysgPDwgMjQ7CisJCWNyYyA9IChjcmMgPDwgOCkgXiB0YWJbMF1bY3JjID4+IDI0XTsKKwl9CisjIGVsc2UKKwljcmMgPSAoX19mb3JjZSB1MzIpIF9fY3B1X3RvX2JlMzIoY3JjKTsKKwljcmMgPSBjcmMzMl9ib2R5KGNyYywgcCwgbGVuLCB0YWIpOworCWNyYyA9IF9fYmUzMl90b19jcHUoKF9fZm9yY2UgX19iZTMyKWNyYyk7CisjIGVuZGlmCisJcmV0dXJuIGNyYzsKK30KKworI2lmIENSQ19MRV9CSVRTID09IDEKK3UzMiBfX3B1cmUgY3JjMzJfYmUodTMyIGNyYywgdW5zaWduZWQgY2hhciBjb25zdCAqcCwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gY3JjMzJfYmVfZ2VuZXJpYyhjcmMsIHAsIGxlbiwgTlVMTCwgQ1JDUE9MWV9CRSk7Cit9CisjZWxzZQordTMyIF9fcHVyZSBjcmMzMl9iZSh1MzIgY3JjLCB1bnNpZ25lZCBjaGFyIGNvbnN0ICpwLCBzaXplX3QgbGVuKQoreworCXJldHVybiBjcmMzMl9iZV9nZW5lcmljKGNyYywgcCwgbGVuLAorCQkJKGNvbnN0IHUzMiAoKilbMjU2XSljcmMzMnRhYmxlX2JlLCBDUkNQT0xZX0JFKTsKK30KKyNlbmRpZgorRVhQT1JUX1NZTUJPTChjcmMzMl9iZSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMzMmRlZnMuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzMyZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjc1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMzMmRlZnMuaApAQCAtMCwwICsxLDczIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworLyoKKyAqIFRoZXJlIGFyZSBtdWx0aXBsZSAxNi1iaXQgQ1JDIHBvbHlub21pYWxzIGluIGNvbW1vbiB1c2UsIGJ1dCB0aGlzIGlzCisgKiAqdGhlKiBzdGFuZGFyZCBDUkMtMzIgcG9seW5vbWlhbCwgZmlyc3QgcG9wdWxhcml6ZWQgYnkgRXRoZXJuZXQuCisgKiB4XjMyK3heMjYreF4yMyt4XjIyK3heMTYreF4xMit4XjExK3heMTAreF44K3heNyt4XjUreF40K3heMit4XjEreF4wCisgKi8KKyNkZWZpbmUgQ1JDUE9MWV9MRSAweGVkYjg4MzIwCisjZGVmaW5lIENSQ1BPTFlfQkUgMHgwNGMxMWRiNworCisvKgorICogVGhpcyBpcyB0aGUgQ1JDMzJjIHBvbHlub21pYWwsIGFzIG91dGxpbmVkIGJ5IENhc3RhZ25vbGkuCisgKiB4XjMyK3heMjgreF4yNyt4XjI2K3heMjUreF4yMyt4XjIyK3heMjAreF4xOSt4XjE4K3heMTQreF4xMyt4XjExK3heMTAreF45KworICogeF44K3heNit4XjAKKyAqLworI2RlZmluZSBDUkMzMkNfUE9MWV9MRSAweDgyRjYzQjc4CisKKy8qIFRyeSB0byBjaG9vc2UgYW4gaW1wbGVtZW50YXRpb24gdmFyaWFudCB2aWEgS2NvbmZpZyAqLworI2lmZGVmIENPTkZJR19DUkMzMl9TTElDRUJZOAorIyBkZWZpbmUgQ1JDX0xFX0JJVFMgNjQKKyMgZGVmaW5lIENSQ19CRV9CSVRTIDY0CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ1JDMzJfU0xJQ0VCWTQKKyMgZGVmaW5lIENSQ19MRV9CSVRTIDMyCisjIGRlZmluZSBDUkNfQkVfQklUUyAzMgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0NSQzMyX1NBUldBVEUKKyMgZGVmaW5lIENSQ19MRV9CSVRTIDgKKyMgZGVmaW5lIENSQ19CRV9CSVRTIDgKKyNlbmRpZgorI2lmZGVmIENPTkZJR19DUkMzMl9CSVQKKyMgZGVmaW5lIENSQ19MRV9CSVRTIDEKKyMgZGVmaW5lIENSQ19CRV9CSVRTIDEKKyNlbmRpZgorCisvKgorICogSG93IG1hbnkgYml0cyBhdCBhIHRpbWUgdG8gdXNlLiAgVmFsaWQgdmFsdWVzIGFyZSAxLCAyLCA0LCA4LCAzMiBhbmQgNjQuCisgKiBGb3IgbGVzcyBwZXJmb3JtYW5jZS1zZW5zaXRpdmUsIHVzZSA0IG9yIDggdG8gc2F2ZSB0YWJsZSBzaXplLgorICogRm9yIGxhcmdlciBzeXN0ZW1zIGNob29zZSBzYW1lIGFzIENQVSBhcmNoaXRlY3R1cmUgYXMgZGVmYXVsdC4KKyAqIFRoaXMgd29ya3Mgd2VsbCBvbiBYODZfNjQsIFNQQVJDNjQgc3lzdGVtcy4gVGhpcyBtYXkgcmVxdWlyZSBzb21lCisgKiBlbGFib3JhdGlvbiBhZnRlciBleHBlcmltZW50cyB3aXRoIG90aGVyIGFyY2hpdGVjdHVyZXMuCisgKi8KKyNpZm5kZWYgQ1JDX0xFX0JJVFMKKyMgIGlmZGVmIENPTkZJR182NEJJVAorIyAgZGVmaW5lIENSQ19MRV9CSVRTIDY0CisjICBlbHNlCisjICBkZWZpbmUgQ1JDX0xFX0JJVFMgMzIKKyMgIGVuZGlmCisjZW5kaWYKKyNpZm5kZWYgQ1JDX0JFX0JJVFMKKyMgIGlmZGVmIENPTkZJR182NEJJVAorIyAgZGVmaW5lIENSQ19CRV9CSVRTIDY0CisjICBlbHNlCisjICBkZWZpbmUgQ1JDX0JFX0JJVFMgMzIKKyMgIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIExpdHRsZS1lbmRpYW4gQ1JDIGNvbXB1dGF0aW9uLiAgVXNlZCB3aXRoIHNlcmlhbCBiaXQgc3RyZWFtcyBzZW50CisgKiBsc2JpdC1maXJzdC4gIEJlIHN1cmUgdG8gdXNlIGNwdV90b19sZTMyKCkgdG8gYXBwZW5kIHRoZSBjb21wdXRlZCBDUkMuCisgKi8KKyNpZiBDUkNfTEVfQklUUyA+IDY0IHx8IENSQ19MRV9CSVRTIDwgMSB8fCBDUkNfTEVfQklUUyA9PSAxNiB8fCBcCisJQ1JDX0xFX0JJVFMgJiBDUkNfTEVfQklUUy0xCisjIGVycm9yICJDUkNfTEVfQklUUyBtdXN0IGJlIG9uZSBvZiB7MSwgMiwgNCwgOCwgMzIsIDY0fSIKKyNlbmRpZgorCisvKgorICogQmlnLWVuZGlhbiBDUkMgY29tcHV0YXRpb24uICBVc2VkIHdpdGggc2VyaWFsIGJpdCBzdHJlYW1zIHNlbnQKKyAqIG1zYml0LWZpcnN0LiAgQmUgc3VyZSB0byB1c2UgY3B1X3RvX2JlMzIoKSB0byBhcHBlbmQgdGhlIGNvbXB1dGVkIENSQy4KKyAqLworI2lmIENSQ19CRV9CSVRTID4gNjQgfHwgQ1JDX0JFX0JJVFMgPCAxIHx8IENSQ19CRV9CSVRTID09IDE2IHx8IFwKKwlDUkNfQkVfQklUUyAmIENSQ19CRV9CSVRTLTEKKyMgZXJyb3IgIkNSQ19CRV9CSVRTIG11c3QgYmUgb25lIG9mIHsxLCAyLCA0LCA4LCAzMiwgNjR9IgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMzMnRlc3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzMydGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDZhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmMzMnRlc3QuYwpAQCAtMCwwICsxLDg1NiBAQAorLyoKKyAqIEF1ZyA4LCAyMDExIEJvYiBQZWFyc29uIHdpdGggaGVscCBmcm9tIEpvYWtpbSBUamVybmx1bmQgYW5kIEdlb3JnZSBTcGVsdmluCisgKiBjbGVhbmVkIHVwIGNvZGUgdG8gY3VycmVudCB2ZXJzaW9uIG9mIHNwYXJzZSBhbmQgYWRkZWQgdGhlIHNsaWNpbmctYnktOAorICogYWxnb3JpdGhtIHRvIHRoZSBjbG9zZWx5IHNpbWlsYXIgZXhpc3Rpbmcgc2xpY2luZy1ieS00IGFsZ29yaXRobS4KKyAqCisgKiBPY3QgMTUsIDIwMDAgTWF0dCBEb21zY2ggPE1hdHRfRG9tc2NoQGRlbGwuY29tPgorICogTmljZXIgY3JjMzIgZnVuY3Rpb25zL2RvY3Mgc3VibWl0dGVkIGJ5IGxpbnV4QGhvcml6b24uY29tLiAgVGhhbmtzIQorICogQ29kZSB3YXMgZnJvbSB0aGUgcHVibGljIGRvbWFpbiwgY29weXJpZ2h0IGFiYW5kb25lZC4gIENvZGUgd2FzCisgKiBzdWJzZXF1ZW50bHkgaW5jbHVkZWQgaW4gdGhlIGtlcm5lbCwgdGh1cyB3YXMgcmUtbGljZW5zZWQgdW5kZXIgdGhlCisgKiBHTlUgR1BMIHYyLgorICoKKyAqIE9jdCAxMiwgMjAwMCBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+CisgKiBTYW1lIGNyYzMyIGZ1bmN0aW9uIHdhcyB1c2VkIGluIDUgb3RoZXIgcGxhY2VzIGluIHRoZSBrZXJuZWwuCisgKiBJIG1hZGUgb25lIHZlcnNpb24sIGFuZCBkZWxldGVkIHRoZSBvdGhlcnMuCisgKiBUaGVyZSBhcmUgdmFyaW91cyBpbmNhbnRhdGlvbnMgb2YgY3JjMzIoKS4gIFNvbWUgdXNlIGEgc2VlZCBvZiAwIG9yIH4wLgorICogU29tZSB4b3IgYXQgdGhlIGVuZCB3aXRoIH4wLiAgVGhlIGdlbmVyaWMgY3JjMzIoKSBmdW5jdGlvbiB0YWtlcworICogc2VlZCBhcyBhbiBhcmd1bWVudCwgYW5kIGRvZXNuJ3QgeG9yIGF0IHRoZSBlbmQuICBUaGVuIGluZGl2aWR1YWwKKyAqIHVzZXJzIGNhbiBkbyB3aGF0ZXZlciB0aGV5IG5lZWQuCisgKiAgIGRyaXZlcnMvbmV0L3NtYzkxOTQuYyB1c2VzIHNlZWQgfjAsIGRvZXNuJ3QgeG9yIHdpdGggfjAuCisgKiAgIGZzL2pmZnMyIHVzZXMgc2VlZCAwLCBkb2Vzbid0IHhvciB3aXRoIH4wLgorICogICBmcy9wYXJ0aXRpb25zL2VmaS5jIHVzZXMgc2VlZCB+MCwgeG9yJ3Mgd2l0aCB+MC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworI2luY2x1ZGUgImNyYzMyZGVmcy5oIgorCisvKiA0MDk2IHJhbmRvbSBieXRlcyAqLworc3RhdGljIHU4IGNvbnN0IF9fYWxpZ25lZCg4KSB0ZXN0X2J1ZltdIF9faW5pdGNvbnN0ID0KK3sKKwkweDViLCAweDg1LCAweDIxLCAweGNiLCAweDA5LCAweDY4LCAweDdkLCAweDMwLAorCTB4YzcsIDB4NjksIDB4ZDcsIDB4MzAsIDB4OTIsIDB4ZGUsIDB4NTksIDB4ZTQsCisJMHhjOSwgMHg2ZSwgMHg4YiwgMHhkYiwgMHg5OCwgMHg2YiwgMHhhYSwgMHg2MCwKKwkweGE4LCAweGI1LCAweGJjLCAweDZjLCAweGE5LCAweGIxLCAweDViLCAweDJjLAorCTB4ZWEsIDB4YjQsIDB4OTIsIDB4NmEsIDB4M2YsIDB4NzksIDB4OTEsIDB4ZTQsCisJMHhlOSwgMHg3MCwgMHg1MSwgMHg4YywgMHg3ZiwgMHg5NSwgMHg2ZiwgMHgxYSwKKwkweDU2LCAweGExLCAweDVjLCAweDI3LCAweDAzLCAweDY3LCAweDlmLCAweDNhLAorCTB4ZTIsIDB4MzEsIDB4MTEsIDB4MjksIDB4NmIsIDB4OTgsIDB4ZmMsIDB4YzQsCisJMHg1MywgMHgyNCwgMHhjNSwgMHg4YiwgMHhjZSwgMHg0NywgMHhiMiwgMHhiOSwKKwkweDMyLCAweGNiLCAweGMxLCAweGQwLCAweDAzLCAweDU3LCAweDRlLCAweGQ0LAorCTB4ZTksIDB4M2MsIDB4YTEsIDB4NjMsIDB4Y2YsIDB4MTIsIDB4MGUsIDB4Y2EsCisJMHhlMSwgMHgxMywgMHhkMSwgMHg5MywgMHhhNiwgMHg4OCwgMHg1YywgMHg2MSwKKwkweDViLCAweGJiLCAweGYwLCAweDE5LCAweDQ2LCAweGI0LCAweGNmLCAweDllLAorCTB4YjYsIDB4NmIsIDB4NGMsIDB4M2EsIDB4Y2YsIDB4NjAsIDB4ZjksIDB4N2EsCisJMHg4ZCwgMHgwNywgMHg2MywgMHhkYiwgMHg0MCwgMHhlOSwgMHgwYiwgMHg2ZiwKKwkweGFkLCAweDk3LCAweGYxLCAweGVkLCAweGQwLCAweDFlLCAweDI2LCAweGZkLAorCTB4YmYsIDB4YjcsIDB4YzgsIDB4MDQsIDB4OTQsIDB4ZjgsIDB4OGIsIDB4OGMsCisJMHhmMSwgMHhhYiwgMHg3YSwgMHhkNCwgMHhkZCwgMHhmMywgMHhlOCwgMHg4OCwKKwkweGMzLCAweGVkLCAweDE3LCAweDhhLCAweDliLCAweDQwLCAweDBkLCAweDUzLAorCTB4NjIsIDB4MTIsIDB4MDMsIDB4NWYsIDB4MWIsIDB4MzUsIDB4MzIsIDB4MWYsCisJMHhiNCwgMHg3YiwgMHg5MywgMHg3OCwgMHgwZCwgMHhkYiwgMHhjZSwgMHhhNCwKKwkweGMwLCAweDQ3LCAweGQ1LCAweGJmLCAweDY4LCAweGU4LCAweDVkLCAweDc0LAorCTB4OGYsIDB4OGUsIDB4NzUsIDB4MWMsIDB4YjIsIDB4NGYsIDB4OWEsIDB4NjAsCisJMHhkMSwgMHhiZSwgMHgxMCwgMHhmNCwgMHg1YywgMHhhMSwgMHg1MywgMHgwOSwKKwkweGE1LCAweGUwLCAweDA5LCAweDU0LCAweDg1LCAweDVjLCAweGRjLCAweDA3LAorCTB4ZTcsIDB4MjEsIDB4NjksIDB4N2IsIDB4OGEsIDB4ZmQsIDB4OTAsIDB4ZjEsCisJMHgyMiwgMHhkMCwgMHhiNCwgMHgzNiwgMHgyOCwgMHhlNiwgMHhiOCwgMHgwZiwKKwkweDM5LCAweGRlLCAweGM4LCAweGYzLCAweDg2LCAweDYwLCAweDM0LCAweGQyLAorCTB4NWUsIDB4ZGYsIDB4ZmQsIDB4Y2YsIDB4MGYsIDB4YTksIDB4NjUsIDB4ZjAsCisJMHhkNSwgMHg0ZCwgMHg5NiwgMHg0MCwgMHhlMywgMHhkZiwgMHgzZiwgMHg5NSwKKwkweDVhLCAweDM5LCAweDE5LCAweDkzLCAweGY0LCAweDc1LCAweGNlLCAweDIyLAorCTB4MDAsIDB4MWMsIDB4OTMsIDB4ZTIsIDB4MDMsIDB4NjYsIDB4ZjQsIDB4OTMsCisJMHg3MywgMHg4NiwgMHg4MSwgMHg4ZSwgMHgyOSwgMHg0NCwgMHg0OCwgMHg4NiwKKwkweDYxLCAweDdjLCAweDQ4LCAweGEzLCAweDQzLCAweGQyLCAweDljLCAweDhkLAorCTB4ZDQsIDB4OTUsIDB4ZGQsIDB4ZTEsIDB4MjIsIDB4ODksIDB4M2EsIDB4NDAsCisJMHg0YywgMHgxYiwgMHg4YSwgMHgwNCwgMHhhOCwgMHgwOSwgMHg2OSwgMHg4YiwKKwkweGVhLCAweGM2LCAweDU1LCAweDhlLCAweDU3LCAweGU2LCAweDY0LCAweDM1LAorCTB4ZjAsIDB4YzcsIDB4MTYsIDB4OWYsIDB4NWQsIDB4NWUsIDB4ODYsIDB4NDAsCisJMHg0NiwgMHhiYiwgMHhlNSwgMHg0NSwgMHg4OCwgMHhmZSwgMHhjOSwgMHg2MywKKwkweDE1LCAweGZiLCAweGY1LCAweGJkLCAweDcxLCAweDYxLCAweGViLCAweDdiLAorCTB4NzgsIDB4NzAsIDB4MDcsIDB4MzEsIDB4MDMsIDB4OWYsIDB4YjIsIDB4YzgsCisJMHhhNywgMHhhYiwgMHg0NywgMHhmZCwgMHhkZiwgMHhhMCwgMHg3OCwgMHg3MiwKKwkweGE0LCAweDJhLCAweGU0LCAweGI2LCAweGJhLCAweGMwLCAweDFlLCAweDg2LAorCTB4NzEsIDB4ZTYsIDB4M2QsIDB4MTgsIDB4MzcsIDB4NzAsIDB4ZTYsIDB4ZmYsCisJMHhlMCwgMHhiYywgMHgwYiwgMHgyMiwgMHhhMCwgMHgxZiwgMHhkMywgMHhlZCwKKwkweGEyLCAweDU1LCAweDM5LCAweGFiLCAweGE4LCAweDEzLCAweDczLCAweDdjLAorCTB4M2YsIDB4YjIsIDB4ZDYsIDB4MTksIDB4YWMsIDB4ZmYsIDB4OTksIDB4ZWQsCisJMHhlOCwgMHhlNiwgMHhhNiwgMHgyMiwgMHhlMywgMHg5YywgMHhmMSwgMHgzMCwKKwkweGRjLCAweDAxLCAweDBhLCAweDU2LCAweGZhLCAweGU0LCAweGM5LCAweDk5LAorCTB4ZGQsIDB4YTgsIDB4ZDgsIDB4ZGEsIDB4MzUsIDB4NTEsIDB4NzMsIDB4YjQsCisJMHg0MCwgMHg4NiwgMHg4NSwgMHhkYiwgMHg1YywgMHhkNSwgMHg4NSwgMHg4MCwKKwkweDE0LCAweDljLCAweGZkLCAweDk4LCAweGE5LCAweDgyLCAweGM1LCAweDM3LAorCTB4ZmYsIDB4MzIsIDB4NWQsIDB4ZDAsIDB4MGIsIDB4ZmEsIDB4ZGMsIDB4MDQsCisJMHg1ZSwgMHgwOSwgMHhkMiwgMHhjYSwgMHgxNywgMHg0YiwgMHgxYSwgMHg4ZSwKKwkweDE1LCAweGUxLCAweGNjLCAweDRlLCAweDUyLCAweDg4LCAweDM1LCAweGJkLAorCTB4NDgsIDB4ZmUsIDB4MTUsIDB4YTAsIDB4OTEsIDB4ZmQsIDB4N2UsIDB4NmMsCisJMHgwZSwgMHg1ZCwgMHg3OSwgMHgxYiwgMHg4MSwgMHg3OSwgMHhkMiwgMHgwOSwKKwkweDM0LCAweDcwLCAweDNkLCAweDgxLCAweGVjLCAweGY2LCAweDI0LCAweGJiLAorCTB4ZmIsIDB4ZjEsIDB4N2IsIDB4ZGYsIDB4NTQsIDB4ZWEsIDB4ODAsIDB4OWIsCisJMHhjNywgMHg5OSwgMHg5ZSwgMHhiZCwgMHgxNiwgMHg3OCwgMHgxMiwgMHg1MywKKwkweDVlLCAweDAxLCAweGE3LCAweDRlLCAweGJkLCAweDY3LCAweGUxLCAweDliLAorCTB4NGMsIDB4MGUsIDB4NjEsIDB4NDUsIDB4OTcsIDB4ZDIsIDB4ZjAsIDB4MGYsCisJMHhmZSwgMHgxNSwgMHgwOCwgMHhiNywgMHgxMSwgMHg0YywgMHhlNywgMHhmZiwKKwkweDgxLCAweDUzLCAweGZmLCAweDkxLCAweDI1LCAweDM4LCAweDdlLCAweDQwLAorCTB4OTQsIDB4ZTUsIDB4ZTAsIDB4YWQsIDB4ZTYsIDB4ZDksIDB4NzksIDB4YjYsCisJMHg5MiwgMHhjOSwgMHhmYywgMHhkZSwgMHhjMywgMHgxYSwgMHgyMywgMHhiYiwKKwkweGRkLCAweGM4LCAweDUxLCAweDBjLCAweDNhLCAweDcyLCAweGZhLCAweDczLAorCTB4NmYsIDB4YjcsIDB4ZWUsIDB4NjEsIDB4MzksIDB4MDMsIDB4MDEsIDB4M2YsCisJMHg3ZiwgMHg5NCwgMHgyZSwgMHgyZSwgMHhiYSwgMHgzYSwgMHhiYiwgMHhiNCwKKwkweGZhLCAweDZhLCAweDE3LCAweGZlLCAweGVhLCAweGVmLCAweDVlLCAweDY2LAorCTB4OTcsIDB4M2YsIDB4MzIsIDB4M2QsIDB4ZDcsIDB4M2UsIDB4YjEsIDB4ZjEsCisJMHg2YywgMHgxNCwgMHg0YywgMHhmZCwgMHgzNywgMHhkMywgMHgzOCwgMHg4MCwKKwkweGZiLCAweGRlLCAweGE2LCAweDI0LCAweDFlLCAweGM4LCAweGNhLCAweDdmLAorCTB4M2EsIDB4OTMsIDB4ZDgsIDB4OGIsIDB4MTgsIDB4MTMsIDB4YjIsIDB4ZTUsCisJMHhlNCwgMHg5MywgMHgwNSwgMHg1MywgMHg0ZiwgMHg4NCwgMHg2NiwgMHhhNywKKwkweDU4LCAweDVjLCAweDdiLCAweDg2LCAweDUyLCAweDZkLCAweDBkLCAweGNlLAorCTB4YTQsIDB4MzAsIDB4N2QsIDB4YjYsIDB4MTgsIDB4OWYsIDB4ZWIsIDB4ZmYsCisJMHgyMiwgMHhiYiwgMHg3MiwgMHgyOSwgMHhiOSwgMHg0NCwgMHgwYiwgMHg0OCwKKwkweDFlLCAweDg0LCAweDcxLCAweDgxLCAweGUzLCAweDZkLCAweDczLCAweDI2LAorCTB4OTIsIDB4YjQsIDB4NGQsIDB4MmEsIDB4MjksIDB4YjgsIDB4MWYsIDB4NzIsCisJMHhlZCwgMHhkMCwgMHhlMSwgMHg2NCwgMHg3NywgMHhlYSwgMHg4ZSwgMHg4OCwKKwkweDBmLCAweGVmLCAweDNmLCAweGIxLCAweDNiLCAweGFkLCAweGY5LCAweGM5LAorCTB4OGIsIDB4ZDAsIDB4YWMsIDB4YzYsIDB4Y2MsIDB4YTksIDB4NDAsIDB4Y2MsCisJMHg3NiwgMHhmNiwgMHgzYiwgMHg1MywgMHhiNSwgMHg4OCwgMHhjYiwgMHhjOCwKKwkweDM3LCAweGYxLCAweGEyLCAweGJhLCAweDIzLCAweDE1LCAweDk5LCAweDA5LAorCTB4Y2MsIDB4ZTcsIDB4N2EsIDB4M2IsIDB4MzcsIDB4ZjcsIDB4NTgsIDB4YzgsCisJMHg0NiwgMHg4YywgMHgyYiwgMHgyZiwgMHg0ZSwgMHgwZSwgMHhhNiwgMHg1YywKKwkweGVhLCAweDg1LCAweDU1LCAweGJhLCAweDAyLCAweDBlLCAweDBlLCAweDQ4LAorCTB4YmMsIDB4ZTEsIDB4YjEsIDB4MDEsIDB4MzUsIDB4NzksIDB4MTMsIDB4M2QsCisJMHgxYiwgMHhjMCwgMHg1MywgMHg2OCwgMHgxMSwgMHhlNywgMHg5NSwgMHgwZiwKKwkweDlkLCAweDNmLCAweDRjLCAweDQ3LCAweDdiLCAweDRkLCAweDFjLCAweGFlLAorCTB4NTAsIDB4OWIsIDB4Y2IsIDB4ZGQsIDB4MDUsIDB4OGQsIDB4OWEsIDB4OTcsCisJMHhmZCwgMHg4YywgMHhlZiwgMHgwYywgMHgxZCwgMHg2NywgMHg3MywgMHhhOCwKKwkweDI4LCAweDM2LCAweGQ1LCAweGI2LCAweDkyLCAweDMzLCAweDQwLCAweDc1LAorCTB4MGIsIDB4NTEsIDB4YzMsIDB4NjQsIDB4YmEsIDB4MWQsIDB4YzIsIDB4Y2MsCisJMHhlZSwgMHg3ZCwgMHg1NCwgMHgwZiwgMHgyNywgMHg2OSwgMHhhNywgMHgyNywKKwkweDYzLCAweDMwLCAweDI5LCAweGQ5LCAweGM4LCAweDg0LCAweGQ4LCAweGRmLAorCTB4OWYsIDB4NjgsIDB4OGQsIDB4MDQsIDB4Y2EsIDB4YTYsIDB4YzUsIDB4YzcsCisJMHg3YSwgMHg1YywgMHhjOCwgMHhkMSwgMHhjYiwgMHg0YSwgMHhlYywgMHhkMCwKKwkweGQ4LCAweDIwLCAweDY5LCAweGM1LCAweDE3LCAweGNkLCAweDc4LCAweGM4LAorCTB4NzUsIDB4MjMsIDB4MzAsIDB4NjksIDB4YzksIDB4ZDQsIDB4ZWEsIDB4NWMsCisJMHg0ZiwgMHg2YiwgMHg4NiwgMHgzZiwgMHg4YiwgMHhmZSwgMHhlZSwgMHg0NCwKKwkweGM5LCAweDdjLCAweGI3LCAweGRkLCAweDNlLCAweGU1LCAweGVjLCAweDU0LAorCTB4MDMsIDB4M2UsIDB4YWEsIDB4ODIsIDB4YzYsIDB4ZGYsIDB4YjIsIDB4MzgsCisJMHgwZSwgMHg1ZCwgMHhiMywgMHg4OCwgMHhkOSwgMHhkMywgMHg2OSwgMHg1ZiwKKwkweDhmLCAweDcwLCAweDhhLCAweDdlLCAweDExLCAweGQ5LCAweDFlLCAweDdiLAorCTB4MzgsIDB4ZjEsIDB4NDIsIDB4MWEsIDB4YzAsIDB4MzUsIDB4ZjUsIDB4YzcsCisJMHgzNiwgMHg4NSwgMHhmNSwgMHhmNywgMHhiOCwgMHg3ZSwgMHhjNywgMHhlZiwKKwkweDE4LCAweGYxLCAweDYzLCAweGQ2LCAweDdhLCAweGM2LCAweGM5LCAweDBlLAorCTB4NGQsIDB4NjksIDB4NGYsIDB4ODQsIDB4ZWYsIDB4MjYsIDB4NDEsIDB4MGMsCisJMHhlYywgMHhjNywgMHhlMCwgMHg3ZSwgMHgzYywgMHg2NywgMHgwMSwgMHg0YywKKwkweDYyLCAweDFhLCAweDIwLCAweDZmLCAweGVlLCAweDQ3LCAweDRkLCAweGMwLAorCTB4OTksIDB4MTMsIDB4OGQsIDB4OTEsIDB4NGEsIDB4MjYsIDB4ZDQsIDB4MzcsCisJMHgyOCwgMHg5MCwgMHg1OCwgMHg3NSwgMHg2NiwgMHgyYiwgMHgwYSwgMHhkZiwKKwkweGRhLCAweGVlLCAweDkyLCAweDI1LCAweDkwLCAweDYyLCAweDM5LCAweDllLAorCTB4NDQsIDB4OTgsIDB4YWQsIDB4YzEsIDB4ODgsIDB4ZWQsIDB4ZTQsIDB4YjQsCisJMHhhZiwgMHhmNSwgMHg4YywgMHg5YiwgMHg0OCwgMHg0ZCwgMHg1NiwgMHg2MCwKKwkweDk3LCAweDBmLCAweDYxLCAweDU5LCAweDllLCAweGE2LCAweDI3LCAweGZlLAorCTB4YzEsIDB4OTEsIDB4MTUsIDB4MzgsIDB4YjgsIDB4MGYsIDB4YWUsIDB4NjEsCisJMHg3ZCwgMHgyNiwgMHgxMywgMHg1YSwgMHg3MywgMHhmZiwgMHgxYywgMHhhMywKKwkweDYxLCAweDA0LCAweDU4LCAweDQ4LCAweDU1LCAweDQ0LCAweDExLCAweGZlLAorCTB4MTUsIDB4Y2EsIDB4YzMsIDB4YmQsIDB4Y2EsIDB4YzUsIDB4YjQsIDB4NDAsCisJMHg1ZCwgMHgxYiwgMHg3ZiwgMHgzOSwgMHhiNSwgMHg5YywgMHgzNSwgMHhlYywKKwkweDYxLCAweDE1LCAweDMyLCAweDMyLCAweGI4LCAweDRlLCAweDQwLCAweDlmLAorCTB4MTcsIDB4MWYsIDB4MGEsIDB4NGQsIDB4YTksIDB4OTEsIDB4ZWYsIDB4YjcsCisJMHhiMCwgMHhlYiwgMHhjMiwgMHg4MywgMHg5YSwgMHg2YywgMHhkMiwgMHg3OSwKKwkweDQzLCAweDc4LCAweDVlLCAweDJmLCAweGU1LCAweGRkLCAweDFhLCAweDNjLAorCTB4NDUsIDB4YWIsIDB4MjksIDB4NDAsIDB4M2EsIDB4MzcsIDB4NWIsIDB4NmYsCisJMHhkNywgMHhmYywgMHg0OCwgMHg2NCwgMHgzYywgMHg0OSwgMHhmYiwgMHgyMSwKKwkweGJlLCAweGMzLCAweGZmLCAweDA3LCAweGZiLCAweDE3LCAweGU5LCAweGM5LAorCTB4MGMsIDB4NGMsIDB4NWMsIDB4MTUsIDB4OWUsIDB4OGUsIDB4MjIsIDB4MzAsCisJMHgwYSwgMHhkZSwgMHg0OCwgMHg3ZiwgMHhkYiwgMHgwZCwgMHhkMSwgMHgyYiwKKwkweDg3LCAweDM4LCAweDllLCAweGNjLCAweDVhLCAweDAxLCAweDE2LCAweGVlLAorCTB4NzUsIDB4NDksIDB4MGQsIDB4MzAsIDB4MDEsIDB4MzQsIDB4NmEsIDB4YjYsCisJMHg5YSwgMHg1YSwgMHgyYSwgMHhlYywgMHhiYiwgMHg0OCwgMHhhYywgMHhkMywKKwkweDc3LCAweDgzLCAweGQ4LCAweDA4LCAweDg2LCAweDRmLCAweDQ4LCAweDA5LAorCTB4MjksIDB4NDEsIDB4NzksIDB4YTEsIDB4MDMsIDB4MTIsIDB4YzQsIDB4Y2QsCisJMHg5MCwgMHg1NSwgMHg0NywgMHg2NiwgMHg3NCwgMHg5YSwgMHhjYywgMHg0ZiwKKwkweDM1LCAweDhjLCAweGQ2LCAweDk4LCAweGVmLCAweGViLCAweDQ1LCAweGI5LAorCTB4OWEsIDB4MjYsIDB4MmYsIDB4MzksIDB4YTUsIDB4NzAsIDB4NmQsIDB4ZmMsCisJMHhiNCwgMHg1MSwgMHhlZSwgMHhmNCwgMHg5YywgMHhlNywgMHgzOCwgMHg1OSwKKwkweGFkLCAweGY0LCAweGJjLCAweDQ2LCAweGZmLCAweDQ2LCAweDhlLCAweDYwLAorCTB4OWMsIDB4YTMsIDB4NjAsIDB4MWQsIDB4ZjgsIDB4MjYsIDB4NzIsIDB4ZjUsCisJMHg3MiwgMHg5ZCwgMHg2OCwgMHg4MCwgMHgwNCwgMHhmNiwgMHgwYiwgMHhhMSwKKwkweDBhLCAweGQ1LCAweGE3LCAweDgyLCAweDNhLCAweDNlLCAweDQ3LCAweGE4LAorCTB4NWEsIDB4ZGUsIDB4NTksIDB4NGYsIDB4N2IsIDB4MDcsIDB4YjMsIDB4ZTksCisJMHgyNCwgMHgxOSwgMHgzZCwgMHgzNCwgMHgwNSwgMHhlYywgMHhmMSwgMHhhYiwKKwkweDZlLCAweDY0LCAweDhmLCAweGQzLCAweGU2LCAweDQxLCAweDg2LCAweDgwLAorCTB4NzAsIDB4ZTMsIDB4OGQsIDB4NjAsIDB4OWMsIDB4MzQsIDB4MjUsIDB4MDEsCisJMHgwNywgMHg0ZCwgMHgxOSwgMHg0MSwgMHg0ZSwgMHgzZCwgMHg1YywgMHg3ZSwKKwkweGE4LCAweGY1LCAweGNjLCAweGQ1LCAweDdiLCAweGUyLCAweDdkLCAweDNkLAorCTB4NDksIDB4ODYsIDB4N2QsIDB4MDcsIDB4YjcsIDB4MTAsIDB4ZTMsIDB4MzUsCisJMHhiOCwgMHg4NCwgMHg2ZCwgMHg3NiwgMHhhYiwgMHgxNywgMHhjNiwgMHgzOCwKKwkweGI0LCAweGQzLCAweDI4LCAweDU3LCAweGFkLCAweGQzLCAweDg4LCAweDVhLAorCTB4ZGEsIDB4ZWEsIDB4YzgsIDB4OTQsIDB4Y2MsIDB4MzcsIDB4MTksIDB4YWMsCisJMHg5YywgMHg5ZiwgMHg0YiwgMHgwMCwgMHgxNSwgMHhjMCwgMHhjOCwgMHhjYSwKKwkweDFmLCAweDE1LCAweGFhLCAweGUwLCAweGRiLCAweGY5LCAweDJmLCAweDU3LAorCTB4MWIsIDB4MjQsIDB4YzcsIDB4NmYsIDB4NzYsIDB4MjksIDB4ZmIsIDB4ZWQsCisJMHgyNSwgMHgwZCwgMHhjMCwgMHhmZSwgMHhiZCwgMHg1YSwgMHhiZiwgMHgyMCwKKwkweDA4LCAweDUxLCAweDA1LCAweGVjLCAweDcxLCAweGEzLCAweGJmLCAweGVmLAorCTB4NWUsIDB4OTksIDB4NzUsIDB4ZGIsIDB4M2MsIDB4NWYsIDB4OWEsIDB4OGMsCisJMHhiYiwgMHgxOSwgMHg1YywgMHgwZSwgMHg5MywgMHgxOSwgMHhmOCwgMHg2YSwKKwkweGJjLCAweGYyLCAweDEyLCAweDU0LCAweDJmLCAweGNiLCAweDI4LCAweDY0LAorCTB4ODgsIDB4YjMsIDB4OTIsIDB4MGQsIDB4OTYsIDB4ZDEsIDB4YTYsIDB4ZTQsCisJMHgxZiwgMHhmMSwgMHg0ZCwgMHhhNCwgMHhhYiwgMHgxYywgMHhlZSwgMHg1NCwKKwkweGYyLCAweGFkLCAweDI5LCAweDZkLCAweDMyLCAweDM3LCAweGIyLCAweDE2LAorCTB4NzcsIDB4NWMsIDB4ZGMsIDB4MmUsIDB4NTQsIDB4ZWMsIDB4NzUsIDB4MjYsCisJMHhjNiwgMHgzNiwgMHhkOSwgMHgxNywgMHgyYywgMHhmMSwgMHg3YSwgMHhkYywKKwkweDRiLCAweGYxLCAweGUyLCAweGQ5LCAweDk1LCAweGJhLCAweGFjLCAweDg3LAorCTB4YzEsIDB4ZjMsIDB4OGUsIDB4NTgsIDB4MDgsIDB4ZDgsIDB4ODcsIDB4NjAsCisJMHhjOSwgMHhlZSwgMHg2YSwgMHhkZSwgMHhhNCwgMHhkMiwgMHhmYywgMHgwZCwKKwkweGU1LCAweDM2LCAweGM0LCAweDVjLCAweDUyLCAweGIzLCAweDA3LCAweDU0LAorCTB4NjUsIDB4MjQsIDB4YzEsIDB4YjEsIDB4ZDEsIDB4YjEsIDB4NTMsIDB4MTMsCisJMHgzMSwgMHg3OSwgMHg3ZiwgMHgwNSwgMHg3NiwgMHhlYiwgMHgzNywgMHg1OSwKKwkweDE1LCAweDJiLCAweGQxLCAweDNmLCAweGFjLCAweDA4LCAweDk3LCAweGViLAorCTB4OTEsIDB4OTgsIDB4ZGYsIDB4NmMsIDB4MDksIDB4MGQsIDB4MDQsIDB4OWYsCisJMHhkYywgMHgzYiwgMHgwZSwgMHg2MCwgMHg2OCwgMHg0NywgMHgyMywgMHgxNSwKKwkweDE2LCAweGM2LCAweDBiLCAweDM1LCAweGY4LCAweDc3LCAweGEyLCAweDc4LAorCTB4NTAsIDB4ZDQsIDB4NjQsIDB4MjIsIDB4MzMsIDB4ZmYsIDB4ZmIsIDB4OTMsCisJMHg3MSwgMHg0NiwgMHg1MCwgMHgzOSwgMHgxYiwgMHg5YywgMHhlYSwgMHg0ZSwKKwkweDhkLCAweDBjLCAweDM3LCAweGU1LCAweDVjLCAweDUxLCAweDNhLCAweDMxLAorCTB4YjIsIDB4ODUsIDB4ODQsIDB4M2YsIDB4NDEsIDB4ZWUsIDB4YTIsIDB4YzEsCisJMHhjNiwgMHgxMywgMHgzYiwgMHg1NCwgMHgyOCwgMHhkMiwgMHgxOCwgMHgzNywKKwkweGNjLCAweDQ2LCAweDlmLCAweDZhLCAweDkxLCAweDNkLCAweDVhLCAweDE1LAorCTB4M2MsIDB4ODksIDB4YTMsIDB4NjEsIDB4MDYsIDB4N2QsIDB4MmUsIDB4NzgsCisJMHhiZSwgMHg3ZCwgMHg0MCwgMHhiYSwgMHgyZiwgMHg5NSwgMHhiMSwgMHgyZiwKKwkweDg3LCAweDNiLCAweDhhLCAweGJlLCAweDZhLCAweGY0LCAweGMyLCAweDMxLAorCTB4NzQsIDB4ZWUsIDB4OTEsIDB4ZTAsIDB4MjMsIDB4YWEsIDB4NWQsIDB4N2YsCisJMHhkZCwgMHhmMCwgMHg0NCwgMHg4YywgMHgwYiwgMHg1OSwgMHgyYiwgMHhmYywKKwkweDQ4LCAweDNhLCAweGRmLCAweDA3LCAweDA1LCAweDM4LCAweDZjLCAweGM5LAorCTB4ZWIsIDB4MTgsIDB4MjQsIDB4NjgsIDB4OGQsIDB4NTgsIDB4OTgsIDB4ZDMsCisJMHgzMSwgMHhhMywgMHhlNCwgMHg3MCwgMHg1OSwgMHhiMSwgMHgyMSwgMHhiZSwKKwkweDdlLCAweDY1LCAweDdkLCAweGI4LCAweDA0LCAweGFiLCAweGY2LCAweGU0LAorCTB4ZDcsIDB4ZGEsIDB4ZWMsIDB4MDksIDB4OGYsIDB4ZGEsIDB4NmQsIDB4MjQsCisJMHgwNywgMHhjYywgMHgyOSwgMHgxNywgMHgwNSwgMHg3OCwgMHgxYSwgMHhjMSwKKwkweGIxLCAweGNlLCAweGZjLCAweGFhLCAweDJkLCAweGU3LCAweGNjLCAweDg1LAorCTB4ODQsIDB4ODQsIDB4MDMsIDB4MmEsIDB4MGMsIDB4M2YsIDB4YTksIDB4ZjgsCisJMHhmZCwgMHg4NCwgMHg1MywgMHg1OSwgMHg1YywgMHhmMCwgMHhkNCwgMHgwOSwKKwkweGYwLCAweGQyLCAweDZjLCAweDMyLCAweDAzLCAweGIwLCAweGEwLCAweDhjLAorCTB4NTIsIDB4ZWIsIDB4MjMsIDB4OTEsIDB4ODgsIDB4NDMsIDB4MTMsIDB4NDYsCisJMHhmNiwgMHgxZSwgMHhiNCwgMHgxYiwgMHhmNSwgMHg4ZSwgMHgzYSwgMHhiNSwKKwkweDNkLCAweDAwLCAweGY2LCAweGU1LCAweDA4LCAweDNkLCAweDVmLCAweDM5LAorCTB4ZDMsIDB4MjEsIDB4NjksIDB4YmMsIDB4MDMsIDB4MjIsIDB4M2EsIDB4ZDIsCisJMHg1YywgMHg4NCwgMHhmOCwgMHgxNSwgMHhjNCwgMHg4MCwgMHgwYiwgMHhiYywKKwkweDI5LCAweDNjLCAweGYzLCAweDk1LCAweDk4LCAweGNkLCAweDhmLCAweDM1LAorCTB4YmMsIDB4YTUsIDB4M2UsIDB4ZmMsIDB4ZDQsIDB4MTMsIDB4OWUsIDB4ZGUsCisJMHg0ZiwgMHhjZSwgMHg3MSwgMHg5ZCwgMHgwOSwgMHhhZCwgMHhmMiwgMHg4MCwKKwkweDZiLCAweDY1LCAweDdmLCAweDAzLCAweDAwLCAweDE0LCAweDdjLCAweDE1LAorCTB4ODUsIDB4NDAsIDB4NmQsIDB4NzAsIDB4ZWEsIDB4ZGMsIDB4YjMsIDB4NjMsCisJMHgzNSwgMHg0ZiwgMHg0ZCwgMHhlMCwgMHhkOSwgMHhkNSwgMHgzYywgMHg1OCwKKwkweDU2LCAweDIzLCAweDgwLCAweGUyLCAweDM2LCAweGRkLCAweDc1LCAweDFkLAorCTB4OTQsIDB4MTEsIDB4NDEsIDB4OGUsIDB4ZTAsIDB4ODEsIDB4OGUsIDB4Y2YsCisJMHhlMCwgMHhlNSwgMHhmNiwgMHhkZSwgMHhkMSwgMHhlNywgMHgwNCwgMHgxMiwKKwkweDc5LCAweDkyLCAweDJiLCAweDcxLCAweDJhLCAweDc5LCAweDhiLCAweDdjLAorCTB4NDQsIDB4NzksIDB4MTYsIDB4MzAsIDB4NGUsIDB4ZjQsIDB4ZjYsIDB4OWIsCisJMHhiNywgMHg0MCwgMHhhMywgMHg1YSwgMHhhNywgMHg2OSwgMHgzZSwgMHhjMSwKKwkweDNhLCAweDA0LCAweGQwLCAweDg4LCAweGEwLCAweDNiLCAweGRkLCAweGM2LAorCTB4OWUsIDB4N2UsIDB4MWUsIDB4MWUsIDB4OGYsIDB4NDQsIDB4ZjcsIDB4NzMsCisJMHg2NywgMHgxZSwgMHgxYSwgMHg3OCwgMHhmYSwgMHg2MiwgMHhmNCwgMHhhOSwKKwkweGE4LCAweGM2LCAweDViLCAweGI4LCAweGZhLCAweDA2LCAweDdkLCAweDVlLAorCTB4MzgsIDB4MWMsIDB4OWEsIDB4MzksIDB4ZTksIDB4MzksIDB4OTgsIDB4MjIsCisJMHgwYiwgMHhhNywgMHhhYywgMHgwYiwgMHhmMywgMHhiYywgMHhmMSwgMHhlYiwKKwkweDhjLCAweDgxLCAweGUzLCAweDQ4LCAweDhhLCAweGVkLCAweDQyLCAweGMyLAorCTB4MzgsIDB4Y2YsIDB4M2UsIDB4ZGEsIDB4ZDIsIDB4ODksIDB4OGQsIDB4OWMsCisJMHg1MywgMHhiNSwgMHgyZiwgMHg0MSwgMHgwMSwgMHgyNiwgMHg4NCwgMHg5YywKKwkweGEzLCAweDU2LCAweGY2LCAweDQ5LCAweGM3LCAweGQ0LCAweDlmLCAweDkzLAorCTB4MWIsIDB4OTYsIDB4NDksIDB4NWUsIDB4YWQsIDB4YjMsIDB4ODQsIDB4MWYsCisJMHgzYywgMHhhNCwgMHhlMCwgMHg5YiwgMHhkMSwgMHg5MCwgMHhiYywgMHgzOCwKKwkweDZjLCAweGRkLCAweDk1LCAweDRkLCAweDlkLCAweGIxLCAweDcxLCAweDU3LAorCTB4MmQsIDB4MzQsIDB4ZTgsIDB4YjgsIDB4NDIsIDB4YzcsIDB4OTksIDB4MDMsCisJMHhjNywgMHgwNywgMHgzMCwgMHg2NSwgMHg5MSwgMHg1NSwgMHhkNSwgMHg5MCwKKwkweDcwLCAweDk3LCAweDM3LCAweDY4LCAweGQ0LCAweDExLCAweGY5LCAweGU4LAorCTB4Y2UsIDB4ZWMsIDB4ZGMsIDB4MzQsIDB4ZDUsIDB4ZDMsIDB4YjcsIDB4YzQsCisJMHhiOCwgMHg5NywgMHgwNSwgMHg5MiwgMHhhZCwgMHhmOCwgMHhlMiwgMHgzNiwKKwkweDY0LCAweDQxLCAweGM5LCAweGM1LCAweDQxLCAweDc3LCAweDUyLCAweGQ3LAorCTB4MmMsIDB4YTUsIDB4MjQsIDB4MmYsIDB4ZDksIDB4MzQsIDB4MGIsIDB4NDcsCisJMHgzNSwgMHhhNywgMHgyOCwgMHg4YiwgMHhjNSwgMHhjZCwgMHhlOSwgMHg0NiwKKwkweGFjLCAweDM5LCAweDk0LCAweDNjLCAweDEwLCAweGM2LCAweDI5LCAweDczLAorCTB4MGUsIDB4MGUsIDB4NWQsIDB4ZTAsIDB4NzEsIDB4MDMsIDB4OGEsIDB4NzIsCisJMHgwZSwgMHgyNiwgMHhiMCwgMHg3ZCwgMHg4NCwgMHhlZCwgMHg5NSwgMHgyMywKKwkweDQ5LCAweDVhLCAweDQ1LCAweDgzLCAweDQ1LCAweDYwLCAweDExLCAweDRhLAorCTB4NDYsIDB4MzEsIDB4ZDQsIDB4ZDgsIDB4MTYsIDB4NTQsIDB4OTgsIDB4NTgsCisJMHhlZCwgMHg2ZCwgMHhjYywgMHg1ZCwgMHhkNiwgMHg1MCwgMHg2MSwgMHg5ZiwKKwkweDlkLCAweGM1LCAweDNlLCAweDlkLCAweDMyLCAweDQ3LCAweGRlLCAweDk2LAorCTB4ZTEsIDB4NWQsIDB4ZDgsIDB4ZjgsIDB4YjQsIDB4NjksIDB4NmYsIDB4YjksCisJMHgxNSwgMHg5MCwgMHg1NywgMHg3YSwgMHhmNiwgMHhhZCwgMHhiMCwgMHg1YiwKKwkweGY1LCAweGE2LCAweDM2LCAweDk0LCAweGZkLCAweDg0LCAweGNlLCAweDFjLAorCTB4MGYsIDB4NGIsIDB4ZDAsIDB4YzIsIDB4NWIsIDB4NmIsIDB4NTYsIDB4ZWYsCisJMHg3MywgMHg5MywgMHgwYiwgMHhjMywgMHhlZSwgMHhkOSwgMHhjZiwgMHhkMywKKwkweGE0LCAweDIyLCAweDU4LCAweGNkLCAweDUwLCAweDZlLCAweDY1LCAweGY0LAorCTB4ZTksIDB4YjcsIDB4NzEsIDB4YWYsIDB4NGIsIDB4YjMsIDB4YjYsIDB4MmYsCisJMHgwZiwgMHgwZSwgMHgzYiwgMHhjOSwgMHg4NSwgMHgxNCwgMHhmNSwgMHgxNywKKwkweGU4LCAweDdhLCAweDNhLCAweGJmLCAweDVmLCAweDVlLCAweGY4LCAweDE4LAorCTB4NDgsIDB4YTYsIDB4NzIsIDB4YWIsIDB4MDYsIDB4OTUsIDB4ZTksIDB4YzgsCisJMHhhNywgMHhmNCwgMHgzMiwgMHg0NCwgMHgwNCwgMHgwYywgMHg4NCwgMHg5OCwKKwkweDczLCAweGUzLCAweDg5LCAweDhkLCAweDVmLCAweDdlLCAweDRhLCAweDQyLAorCTB4OGYsIDB4YzUsIDB4MjgsIDB4YjEsIDB4ODIsIDB4ZWYsIDB4MWMsIDB4OTcsCisJMHgzMSwgMHgzYiwgMHg0ZCwgMHhlMCwgMHgwZSwgMHgxMCwgMHgxMCwgMHg5NywKKwkweDkzLCAweDQ5LCAweDc4LCAweDJmLCAweDBkLCAweDg2LCAweDhiLCAweGExLAorCTB4NTMsIDB4YTksIDB4ODEsIDB4MjAsIDB4NzksIDB4ZTcsIDB4MDcsIDB4NzcsCisJMHhiNiwgMHhhYywgMHg1ZSwgMHhkMiwgMHgwNSwgMHhjZCwgMHhlOSwgMHhkYiwKKwkweDhhLCAweDk0LCAweDgyLCAweDhhLCAweDIzLCAweGI5LCAweDNkLCAweDFjLAorCTB4YTksIDB4N2QsIDB4NzIsIDB4NGEsIDB4ZWQsIDB4MzMsIDB4YTMsIDB4ZGIsCisJMHgyMSwgMHhhNywgMHg4NiwgMHgzMywgMHg0NSwgMHhhNSwgMHhhYSwgMHg1NiwKKwkweDQ1LCAweGI1LCAweDgzLCAweDI5LCAweDQwLCAweDQ3LCAweDc5LCAweDA0LAorCTB4NmUsIDB4YjksIDB4OTUsIDB4ZDAsIDB4ODEsIDB4NzcsIDB4MmQsIDB4NDgsCisJMHgxZSwgMHhmZSwgMHhjMywgMHhjMiwgMHgxZSwgMHhlNSwgMHhmMiwgMHhiZSwKKwkweGZkLCAweDNiLCAweDk0LCAweDlmLCAweGM0LCAweGM0LCAweDI2LCAweDlkLAorCTB4ZTQsIDB4NjYsIDB4MWUsIDB4MTksIDB4ZWUsIDB4NmMsIDB4NzksIDB4OTcsCisJMHgxMSwgMHgzMSwgMHg0YiwgMHgwZCwgMHgwMSwgMHhjYiwgMHhkZSwgMHhhOCwKKwkweGY2LCAweDZkLCAweDdjLCAweDM5LCAweDQ2LCAweDRlLCAweDdlLCAweDNmLAorCTB4OTQsIDB4MTcsIDB4ZGYsIDB4YTEsIDB4N2QsIDB4ZDksIDB4MWMsIDB4OGUsCisJMHhiYywgMHg3ZCwgMHgzMywgMHg3ZCwgMHhlMywgMHgxMiwgMHg0MCwgMHhjYSwKKwkweGFiLCAweDM3LCAweDExLCAweDQ2LCAweGQ0LCAweGFlLCAweGVmLCAweDQ0LAorCTB4YTIsIDB4YjMsIDB4NmEsIDB4NjYsIDB4MGUsIDB4MGMsIDB4OTAsIDB4N2YsCisJMHhkZiwgMHg1YywgMHg2NiwgMHg1ZiwgMHhmMiwgMHg5NCwgMHg5ZiwgMHhhNiwKKwkweDczLCAweDRmLCAweGViLCAweDBkLCAweGFkLCAweGJmLCAweGMwLCAweDYzLAorCTB4NWMsIDB4ZGMsIDB4NDYsIDB4NTEsIDB4ZTgsIDB4OGUsIDB4OTAsIDB4MTksCisJMHhhOCwgMHhhNCwgMHgzYywgMHg5MSwgMHg3OSwgMHhmYSwgMHg3ZSwgMHg1OCwKKwkweDg1LCAweDEzLCAweDU1LCAweGM1LCAweDE5LCAweDgyLCAweDM3LCAweDFiLAorCTB4MGEsIDB4MDIsIDB4MWYsIDB4OTksIDB4NmIsIDB4MTgsIDB4ZjEsIDB4MjgsCisJMHgwOCwgMHhhMiwgMHg3MywgMHhiOCwgMHgwZiwgMHgyZSwgMHhjZCwgMHhiZiwKKwkweGYzLCAweDg2LCAweDdmLCAweGVhLCAweGVmLCAweGQwLCAweGJiLCAweGE2LAorCTB4MjEsIDB4ZGYsIDB4NDksIDB4NzMsIDB4NTEsIDB4Y2MsIDB4MzYsIDB4ZDMsCisJMHgzZSwgMHhhMCwgMHhmOCwgMHg0NCwgMHhkZiwgMHhkMywgMHhhNiwgMHhiZSwKKwkweDhhLCAweGQ0LCAweDU3LCAweGRkLCAweDcyLCAweDk0LCAweDYxLCAweDBmLAorCTB4ODIsIDB4ZDEsIDB4MDcsIDB4YjgsIDB4N2MsIDB4MTgsIDB4ODMsIDB4ZGYsCisJMHgzYSwgMHhlNSwgMHg1MCwgMHg2YSwgMHg4MiwgMHgyMCwgMHhhYywgMHhhOSwKKwkweGE4LCAweGZmLCAweGQ5LCAweGYzLCAweDc3LCAweDMzLCAweDVhLCAweDllLAorCTB4N2YsIDB4NmQsIDB4ZmUsIDB4NWQsIDB4MzMsIDB4NDEsIDB4NDIsIDB4ZTcsCisJMHg2YywgMHgxOSwgMHhlMCwgMHg0NCwgMHg4YSwgMHgxNSwgMHhmNiwgMHg3MCwKKwkweDk4LCAweGI3LCAweDY4LCAweDRkLCAweGZhLCAweDk3LCAweDM5LCAweGIwLAorCTB4OGUsIDB4ZTgsIDB4ODQsIDB4OGIsIDB4NzUsIDB4MzAsIDB4YjcsIDB4N2QsCisJMHg5MiwgMHg2OSwgMHgyMCwgMHg5YywgMHg4MSwgMHhmYiwgMHg0YiwgMHhmNCwKKwkweDAxLCAweDUwLCAweGViLCAweGNlLCAweDBjLCAweDFjLCAweDZjLCAweGI1LAorCTB4NGEsIDB4ZDcsIDB4MjcsIDB4MGMsIDB4Y2UsIDB4YmIsIDB4ZTUsIDB4ODUsCisJMHhmMCwgMHhiNiwgMHhlZSwgMHhkNSwgMHg3MCwgMHhkZCwgMHgzYiwgMHhmYywKKwkweGQ0LCAweDk5LCAweGYxLCAweDMzLCAweGRkLCAweDhiLCAweGM0LCAweDJmLAorCTB4YWUsIDB4YWIsIDB4NzQsIDB4OTYsIDB4MzIsIDB4YzcsIDB4NGMsIDB4NTYsCisJMHgzYywgMHg4OSwgMHgwZiwgMHg5NiwgMHgwYiwgMHg0MiwgMHhjMCwgMHhjYiwKKwkweGVlLCAweDBmLCAweDBiLCAweDhjLCAweGZiLCAweDdlLCAweDQ3LCAweDdiLAorCTB4NjQsIDB4NDgsIDB4ZmQsIDB4YjIsIDB4MDAsIDB4ODAsIDB4ODksIDB4YTUsCisJMHgxMywgMHg1NSwgMHg2MiwgMHhmYywgMHg4ZiwgMHhlMiwgMHg0MiwgMHgwMywKKwkweGI3LCAweDRlLCAweDJhLCAweDc5LCAweGI0LCAweDgyLCAweGVhLCAweDIzLAorCTB4NDksIDB4ZGEsIDB4YWYsIDB4NTIsIDB4NjMsIDB4MWUsIDB4NjAsIDB4MDMsCisJMHg4OSwgMHgwNiwgMHg0NCwgMHg0NiwgMHgwOCwgMHhjMywgMHhjNCwgMHg4NywKKwkweDcwLCAweDJlLCAweGRhLCAweDk0LCAweGFkLCAweDZiLCAweGUwLCAweGU0LAorCTB4ZDEsIDB4OGEsIDB4MDYsIDB4YzIsIDB4YTgsIDB4YzAsIDB4YTcsIDB4NDMsCisJMHgzYywgMHg0NywgMHg1MiwgMHgwZSwgMHhjMywgMHg3NywgMHg4MSwgMHgxMSwKKwkweDY3LCAweDBlLCAweGEwLCAweDcwLCAweDA0LCAweDQ3LCAweDI5LCAweDQwLAorCTB4ODYsIDB4MGQsIDB4MzQsIDB4NTYsIDB4YTcsIDB4YzksIDB4MzUsIDB4NTksCisJMHg2OCwgMHhkYywgMHg5MywgMHg4MSwgMHg3MCwgMHhlZSwgMHg4NiwgMHhkOSwKKwkweDgwLCAweDA2LCAweDQwLCAweDRmLCAweDFhLCAweDBkLCAweDQwLCAweDMwLAorCTB4MGIsIDB4Y2IsIDB4OTYsIDB4NDcsIDB4YzEsIDB4YjcsIDB4NTIsIDB4ZmQsCisJMHg1NiwgMHhlMCwgMHg3MiwgMHg0YiwgMHhmYiwgMHhiZCwgMHg5MiwgMHg0NSwKKwkweDYxLCAweDcxLCAweGMyLCAweDMzLCAweDExLCAweGJmLCAweDUyLCAweDgzLAorCTB4NzksIDB4MjYsIDB4ZTAsIDB4NDksIDB4NmIsIDB4YjcsIDB4MDUsIDB4OGIsCisJMHhlOCwgMHgwZSwgMHg4NywgMHgzMSwgMHhkNywgMHg5ZCwgMHg4YSwgMHhmNSwKKwkweGMwLCAweDVmLCAweDJlLCAweDU4LCAweDRhLCAweGRiLCAweDExLCAweGIzLAorCTB4NmMsIDB4MzAsIDB4MmEsIDB4NDYsIDB4MTksIDB4ZTMsIDB4MjcsIDB4ODQsCisJMHgxZiwgMHg2MywgMHg2ZSwgMHhmNiwgMHg1NywgMHhjNywgMHhjOSwgMHhkOCwKKwkweDVlLCAweGJhLCAweGIzLCAweDg3LCAweGQ1LCAweDgzLCAweDI2LCAweDM0LAorCTB4MjEsIDB4OWUsIDB4NjUsIDB4ZGUsIDB4NDIsIDB4ZDMsIDB4YmUsIDB4N2IsCisJMHhiYywgMHg5MSwgMHg3MSwgMHg0NCwgMHg0ZCwgMHg5OSwgMHgzYiwgMHgzMSwKKwkweGU1LCAweDNmLCAweDExLCAweDRlLCAweDdmLCAweDEzLCAweDUxLCAweDNiLAorCTB4YWUsIDB4NzksIDB4YzksIDB4ZDMsIDB4ODEsIDB4OGUsIDB4MjUsIDB4NDAsCisJMHgxMCwgMHhmYywgMHgwNywgMHgxZSwgMHhmOSwgMHg3YiwgMHg5YSwgMHg0YiwKKwkweDZjLCAweGUzLCAweGIzLCAweGFkLCAweDFhLCAweDBhLCAweGRkLCAweDllLAorCTB4NTksIDB4MGMsIDB4YTIsIDB4Y2QsIDB4YWUsIDB4NDgsIDB4NGEsIDB4MzgsCisJMHg1YiwgMHg0NywgMHg0MSwgMHg5NCwgMHg2NSwgMHg2YiwgMHhiYiwgMHhlYiwKKwkweDViLCAweGUzLCAweGFmLCAweDA3LCAweDViLCAweGQ0LCAweDRhLCAweGEyLAorCTB4YzksIDB4NWQsIDB4MmYsIDB4NjQsIDB4MDMsIDB4ZDcsIDB4M2EsIDB4MmMsCisJMHg2ZSwgMHhjZSwgMHg3NiwgMHg5NSwgMHhiNCwgMHhiMywgMHhjMCwgMHhmMSwKKwkweGUyLCAweDQ1LCAweDczLCAweDdhLCAweDVjLCAweGFiLCAweGMxLCAweGZjLAorCTB4MDIsIDB4OGQsIDB4ODEsIDB4MjksIDB4YjMsIDB4YWMsIDB4MDcsIDB4ZWMsCisJMHg0MCwgMHg3ZCwgMHg0NSwgMHhkOSwgMHg3YSwgMHg1OSwgMHhlZSwgMHgzNCwKKwkweGYwLCAweGU5LCAweGQ1LCAweDdiLCAweDk2LCAweGIxLCAweDNkLCAweDk1LAorCTB4Y2MsIDB4ODYsIDB4YjUsIDB4YjYsIDB4MDQsIDB4MmQsIDB4YjUsIDB4OTIsCisJMHg3ZSwgMHg3NiwgMHhmNCwgMHgwNiwgMHhhOSwgMHhhMywgMHgxMiwgMHgwZiwKKwkweGIxLCAweGFmLCAweDI2LCAweGJhLCAweDdjLCAweGZjLCAweDdlLCAweDFjLAorCTB4YmMsIDB4MmMsIDB4NDksIDB4OTcsIDB4NTMsIDB4NjAsIDB4MTMsIDB4MGIsCisJMHhhNiwgMHg2MSwgMHg4MywgMHg4OSwgMHg0MiwgMHhkNCwgMHgxNywgMHgwYywKKwkweDZjLCAweDI2LCAweDUyLCAweGMzLCAweGIzLCAweGQ0LCAweDY3LCAweGY1LAorCTB4ZTMsIDB4MDQsIDB4YjcsIDB4ZjQsIDB4Y2IsIDB4ODAsIDB4YjgsIDB4Y2IsCisJMHg3NywgMHg1NiwgMHgzZSwgMHhhYSwgMHg1NywgMHg1NCwgMHhlZSwgMHhiNCwKKwkweDJjLCAweDY3LCAweGNmLCAweGYyLCAweGRjLCAweGJlLCAweDU1LCAweGY5LAorCTB4NDMsIDB4MWYsIDB4NmUsIDB4MjIsIDB4OTcsIDB4NjcsIDB4N2YsIDB4YzQsCisJMHhlZiwgMHhiMSwgMHgyNiwgMHgzMSwgMHgxZSwgMHgyNywgMHhkZiwgMHg0MSwKKwkweDgwLCAweDQ3LCAweDZjLCAweGUyLCAweGZhLCAweGE5LCAweDhjLCAweDJhLAorCTB4ZjYsIDB4ZjIsIDB4YWIsIDB4ZjAsIDB4MTUsIDB4ZGEsIDB4NmMsIDB4YzgsCisJMHhmZSwgMHhiNSwgMHgyMywgMHhkZSwgMHhhOSwgMHgwNSwgMHgzZiwgMHgwNiwKKwkweDU0LCAweDRjLCAweGNkLCAweGUxLCAweGFiLCAweGZjLCAweDBlLCAweDYyLAorCTB4MzMsIDB4MzEsIDB4NzMsIDB4MmMsIDB4NzYsIDB4Y2IsIDB4YjQsIDB4NDcsCisJMHgxZSwgMHgyMCwgMHhhZCwgMHhkOCwgMHhmMiwgMHgzMSwgMHhkZCwgMHhjNCwKKwkweDhiLCAweDBjLCAweDc3LCAweGJlLCAweGUxLCAweDhiLCAweDI2LCAweDAwLAorCTB4MDIsIDB4NTgsIDB4ZDYsIDB4OGQsIDB4ZWYsIDB4YWQsIDB4NzQsIDB4NjcsCisJMHhhYiwgMHgzZiwgMHhlZiwgMHhjYiwgMHg2ZiwgMHhiMCwgMHhjYywgMHg4MSwKKwkweDQ0LCAweDRjLCAweGFmLCAweGU5LCAweDQ5LCAweDRmLCAweGRiLCAweGEwLAorCTB4MjUsIDB4YTQsIDB4ZjAsIDB4ODksIDB4ZjEsIDB4YmUsIDB4ZDgsIDB4MTAsCisJMHhmZiwgMHhiMSwgMHgzYiwgMHg0YiwgMHhmYSwgMHg5OCwgMHhmNSwgMHg3OSwKKwkweDZkLCAweDFlLCAweDY5LCAweDRkLCAweDU3LCAweGIxLCAweGM4LCAweDE5LAorCTB4MWIsIDB4YmQsIDB4MWUsIDB4OGMsIDB4ODQsIDB4YjcsIDB4N2IsIDB4ZTgsCisJMHhkMiwgMHgyZCwgMHgwOSwgMHg0MSwgMHg0MSwgMHgzNywgMHgzZCwgMHhiMSwKKwkweDZmLCAweDI2LCAweDVkLCAweDcxLCAweDE2LCAweDNkLCAweGI3LCAweDgzLAorCTB4MjcsIDB4MmMsIDB4YTcsIDB4YjYsIDB4NTAsIDB4YmQsIDB4OTEsIDB4ODYsCisJMHhhYiwgMHgyNCwgMHhhMSwgMHgzOCwgMHhmZCwgMHhlYSwgMHg3MSwgMHg1NSwKKwkweDdlLCAweDlhLCAweDA3LCAweDc3LCAweDRiLCAweGZhLCAweDYxLCAweDY2LAorCTB4MjAsIDB4MWUsIDB4MjgsIDB4OTUsIDB4MTgsIDB4MWIsIDB4YTQsIDB4YTAsCisJMHhmZCwgMHhjMCwgMHg4OSwgMHg3MiwgMHg0MywgMHhkOSwgMHgzYiwgMHg0OSwKKwkweDVhLCAweDNmLCAweDlkLCAweGJmLCAweGRiLCAweGI0LCAweDQ2LCAweGVhLAorCTB4NDIsIDB4MDEsIDB4NzcsIDB4MjMsIDB4NjgsIDB4OTUsIDB4YjYsIDB4MjQsCisJMHhiMywgMHhhOCwgMHg2YywgMHgyOCwgMHgzYiwgMHgxMSwgMHg0MCwgMHg3ZSwKKwkweDE4LCAweDY1LCAweDZkLCAweGQ4LCAweDI0LCAweDQyLCAweDdkLCAweDg4LAorCTB4YzAsIDB4NTIsIDB4ZDksIDB4MDUsIDB4ZTQsIDB4OTUsIDB4OTAsIDB4ODcsCisJMHg4YywgMHhmNCwgMHhkMCwgMHg2YiwgMHhiOSwgMHg4MywgMHg5OSwgMHgzNCwKKwkweDZkLCAweGZlLCAweDU0LCAweDQwLCAweDk0LCAweDUyLCAweDIxLCAweDRmLAorCTB4MTQsIDB4MjUsIDB4YzUsIDB4ZDYsIDB4NWUsIDB4OTUsIDB4ZGMsIDB4MGEsCisJMHgyYiwgMHg4OSwgMHgyMCwgMHgxMSwgMHg4NCwgMHg0OCwgMHhkNiwgMHgzYSwKKwkweGNkLCAweDVjLCAweDI0LCAweGFkLCAweDYyLCAweGUzLCAweGIxLCAweDkzLAorCTB4MjUsIDB4OGQsIDB4Y2QsIDB4N2UsIDB4ZmMsIDB4MjcsIDB4YTMsIDB4MzcsCisJMHhmZCwgMHg4NCwgMHhmYywgMHgxYiwgMHhiMiwgMHhmMSwgMHgyNywgMHgzOCwKKwkweDVhLCAweGI3LCAweGZjLCAweGYyLCAweGZhLCAweDk1LCAweDY2LCAweGQ0LAorCTB4ZmIsIDB4YmEsIDB4YTcsIDB4ZDcsIDB4YTMsIDB4NzIsIDB4NjksIDB4NDgsCisJMHg0OCwgMHg4YywgMHhlYiwgMHgyOCwgMHg4OSwgMHhmZSwgMHgzMywgMHg2NSwKKwkweDVhLCAweDM2LCAweDAxLCAweDdlLCAweDA2LCAweDc5LCAweDBhLCAweDA5LAorCTB4M2IsIDB4NzQsIDB4MTEsIDB4OWEsIDB4NmUsIDB4YmYsIDB4ZDQsIDB4OWUsCisJMHg1OCwgMHg5MCwgMHg0OSwgMHg0ZiwgMHg0ZCwgMHgwOCwgMHhkNCwgMHhlNSwKKwkweDRhLCAweDA5LCAweDIxLCAweGVmLCAweDhiLCAweGI4LCAweDc0LCAweDNiLAorCTB4OTEsIDB4ZGQsIDB4MzYsIDB4ODUsIDB4NjAsIDB4MmQsIDB4ZmEsIDB4ZDQsCisJMHg0NSwgMHg3YiwgMHg0NSwgMHg1MywgMHhmNSwgMHg0NywgMHg4NywgMHg3ZSwKKwkweGE2LCAweDM3LCAweGM4LCAweDc4LCAweDdhLCAweDY4LCAweDlkLCAweDhkLAorCTB4NjUsIDB4MmMsIDB4MGUsIDB4OTEsIDB4NWMsIDB4YTIsIDB4NjAsIDB4ZjAsCisJMHg4ZSwgMHgzZiwgMHhlOSwgMHgxYSwgMHhjZCwgMHhhYSwgMHhlNywgMHhkNSwKKwkweDc3LCAweDE4LCAweGFmLCAweGM5LCAweGJjLCAweDE4LCAweGVhLCAweDQ4LAorCTB4MWIsIDB4ZmIsIDB4MjIsIDB4NDgsIDB4NzAsIDB4MTYsIDB4MjksIDB4OWUsCisJMHg1YiwgMHhjMSwgMHgyYywgMHg2NiwgMHgyMywgMHhiYywgMHhmMCwgMHgxZiwKKwkweGVmLCAweGFmLCAweGU0LCAweGQ2LCAweDA0LCAweDE5LCAweDgyLCAweDdhLAorCTB4MGIsIDB4YmEsIDB4NGIsIDB4NDYsIDB4YjEsIDB4NmEsIDB4ODUsIDB4NWQsCisJMHhiNCwgMHg3MywgMHhkNiwgMHgyMSwgMHhhMSwgMHg3MSwgMHg2MCwgMHgxNCwKKwkweGVlLCAweDBhLCAweDc3LCAweGM0LCAweDY2LCAweDJlLCAweGY5LCAweDY5LAorCTB4MzAsIDB4YWYsIDB4NDEsIDB4MGIsIDB4YzgsIDB4ODMsIDB4M2MsIDB4NTMsCisJMHg5OSwgMHgxOSwgMHgyNywgMHg0NiwgMHhmNywgMHg0MSwgMHg2ZSwgMHg1NiwKKwkweGRjLCAweDk0LCAweDI4LCAweDY3LCAweDRlLCAweGI3LCAweDI1LCAweDQ4LAorCTB4OGEsIDB4YzIsIDB4ZTAsIDB4NjAsIDB4OTYsIDB4Y2MsIDB4MTgsIDB4ZjQsCisJMHg4NCwgMHhkZCwgMHhhNywgMHg1ZSwgMHgzZSwgMHgwNSwgMHgwYiwgMHgyNiwKKwkweDI2LCAweGIyLCAweDVjLCAweDFmLCAweDU3LCAweDFhLCAweDA0LCAweDdlLAorCTB4NmEsIDB4ZTMsIDB4MmYsIDB4YjQsIDB4MzUsIDB4YjYsIDB4MzgsIDB4NDAsCisJMHg0MCwgMHhjZCwgMHg2ZiwgMHg4NywgMHgyZSwgMHhlZiwgMHhhMywgMHhkNywKKwkweGE5LCAweGMyLCAweGU4LCAweDBkLCAweDI3LCAweGRmLCAweDQ0LCAweDYyLAorCTB4OTksIDB4YTAsIDB4ZmMsIDB4Y2YsIDB4ODEsIDB4NzgsIDB4Y2IsIDB4ZmUsCisJMHhlNSwgMHhhMCwgMHgwMywgMHg0ZSwgMHg2YywgMHhkNywgMHhmNCwgMHhhZiwKKwkweDdhLCAweGJiLCAweDYxLCAweDgyLCAweGZlLCAweDcxLCAweDg5LCAweGIyLAorCTB4MjIsIDB4N2MsIDB4OGUsIDB4ODMsIDB4MDQsIDB4Y2UsIDB4ZjYsIDB4NWQsCisJMHg4NCwgMHg4ZiwgMHg5NSwgMHg2YSwgMHg3ZiwgMHhhZCwgMHhmZCwgMHgzMiwKKwkweDljLCAweDVlLCAweGU0LCAweDljLCAweDg5LCAweDYwLCAweDU0LCAweGFhLAorCTB4OTYsIDB4NzIsIDB4ZDIsIDB4ZDcsIDB4MzYsIDB4ODUsIDB4YTksIDB4NDUsCisJMHhkMiwgMHgyYSwgMHhhMSwgMHg4MSwgMHg0OSwgMHg2ZiwgMHg3ZSwgMHgwNCwKKwkweGZhLCAweGUyLCAweGZlLCAweDkwLCAweDI2LCAweDc3LCAweDVhLCAweDMzLAorCTB4YjgsIDB4MDQsIDB4OWEsIDB4N2EsIDB4ZTYsIDB4NGMsIDB4NGYsIDB4YWQsCisJMHg3MiwgMHg5NiwgMHgwOCwgMHgyOCwgMHg1OCwgMHgxMywgMHhmOCwgMHhjNCwKKwkweDFjLCAweGYwLCAweGMzLCAweDQ1LCAweDk1LCAweDQ5LCAweDIwLCAweDhjLAorCTB4OWYsIDB4MzksIDB4NzAsIDB4ZTEsIDB4NzcsIDB4ZmUsIDB4ZDUsIDB4NGIsCisJMHhhZiwgMHg4NiwgMHhkYSwgMHhlZiwgMHgyMiwgMHgwNiwgMHg4MywgMHgzNiwKKwkweDI5LCAweDEyLCAweDExLCAweDQwLCAweGJjLCAweDNiLCAweDg2LCAweGFhLAorCTB4YWEsIDB4NjUsIDB4NjAsIDB4YzMsIDB4ODAsIDB4Y2EsIDB4ZWQsIDB4YTksCisJMHhmMywgMHhiMCwgMHg3OSwgMHg5NiwgMHhhMiwgMHg1NSwgMHgyNywgMHgyOCwKKwkweDU1LCAweDczLCAweDI2LCAweGE1LCAweDUwLCAweGVhLCAweDkyLCAweDRiLAorCTB4M2MsIDB4NWMsIDB4ODIsIDB4MzMsIDB4ZjAsIDB4MDEsIDB4M2YsIDB4MDMsCisJMHhjMSwgMHgwOCwgMHgwNSwgMHhiZiwgMHg5OCwgMHhmNCwgMHg5YiwgMHg2ZCwKKwkweGE1LCAweGE4LCAweGI0LCAweDgyLCAweDBjLCAweDA2LCAweGZhLCAweGZmLAorCTB4MmQsIDB4MDgsIDB4ZjMsIDB4MDUsIDB4NGYsIDB4NTcsIDB4MmEsIDB4MzksCisJMHhkNCwgMHg4MywgMHgwZCwgMHg3NSwgMHg1MSwgMHhkOCwgMHg1YiwgMHgxYiwKKwkweGQzLCAweDUxLCAweDVhLCAweDMyLCAweDJhLCAweDliLCAweDMyLCAweGIyLAorCTB4ZjIsIDB4YTQsIDB4OTYsIDB4MTIsIDB4ZjIsIDB4YWUsIDB4NDAsIDB4MzQsCisJMHg2NywgMHhhOCwgMHhmNSwgMHg0NCwgMHhkNSwgMHgzNSwgMHg1MywgMHhmZSwKKwkweGEzLCAweDYwLCAweDk2LCAweDYzLCAweDBmLCAweDFmLCAweDZlLCAweGIwLAorCTB4NWEsIDB4NDIsIDB4YTYsIDB4ZmMsIDB4NTEsIDB4MGIsIDB4NjAsIDB4MjcsCisJMHhiYywgMHgwNiwgMHg3MSwgMHhlZCwgMHg2NSwgMHg1YiwgMHgyMywgMHg4NiwKKwkweDRhLCAweDA3LCAweDNiLCAweDIyLCAweDA3LCAweDQ2LCAweGU2LCAweDkwLAorCTB4M2UsIDB4ZjMsIDB4MjUsIDB4NTAsIDB4MWIsIDB4NGMsIDB4N2YsIDB4MDMsCisJMHgwOCwgMHhhOCwgMHgzNiwgMHg2YiwgMHg4NywgMHhlNSwgMHhlMywgMHhkYiwKKwkweDlhLCAweDM4LCAweDgzLCAweGZmLCAweDlmLCAweDFhLCAweDlmLCAweDU3LAorCTB4YTQsIDB4MmEsIDB4ZjYsIDB4MzcsIDB4YmMsIDB4MWEsIDB4ZmYsIDB4YzksCisJMHgxZSwgMHgzNSwgMHgwYywgMHhjMywgMHg3YywgMHhhMywgMHhiMiwgMHhlNSwKKwkweGQyLCAweGM2LCAweGI0LCAweDU3LCAweDQ3LCAweGU0LCAweDMyLCAweDE2LAorCTB4NmQsIDB4YTksIDB4YWUsIDB4NjQsIDB4ZTYsIDB4MmQsIDB4OGQsIDB4YzUsCisJMHg4ZCwgMHg1MCwgMHg4ZSwgMHhlOCwgMHgxYSwgMHgyMiwgMHgzNCwgMHgyYSwKKwkweGQ5LCAweGViLCAweDUxLCAweDkwLCAweDRhLCAweGIxLCAweDQxLCAweDdkLAorCTB4NjQsIDB4ZjksIDB4YjksIDB4MGQsIDB4ZjYsIDB4MjMsIDB4MzMsIDB4YjAsCisJMHgzMywgMHhmNCwgMHhmNywgMHgzZiwgMHgyNywgMHg4NCwgMHhjNiwgMHgwZiwKKwkweDU0LCAweGE1LCAweGMwLCAweDJlLCAweGVjLCAweDBiLCAweDNhLCAweDQ4LAorCTB4NmUsIDB4ODAsIDB4MzUsIDB4ODEsIDB4NDMsIDB4OWIsIDB4OTAsIDB4YjEsCisJMHhkMCwgMHgyYiwgMHhlYSwgMHgyMSwgMHhkYywgMHhkYSwgMHg1YiwgMHgwOSwKKwkweGY0LCAweGNjLCAweDEwLCAweGI0LCAweGM3LCAweGZlLCAweDc5LCAweDUxLAorCTB4YzMsIDB4YzUsIDB4YWMsIDB4ODgsIDB4NzQsIDB4ODQsIDB4MGIsIDB4NGIsCisJMHhjYSwgMHg3OSwgMHgxNiwgMHgyOSwgMHhmYiwgMHg2OSwgMHg1NCwgMHhkZiwKKwkweDQxLCAweDdlLCAweGU5LCAweGM3LCAweDhlLCAweGVhLCAweGE1LCAweGZlLAorCTB4ZmMsIDB4NzYsIDB4MGUsIDB4OTAsIDB4YzQsIDB4OTIsIDB4MzgsIDB4YWQsCisJMHg3YiwgMHg0OCwgMHhlNiwgMHg2ZSwgMHhmNywgMHgyMSwgMHhmZCwgMHg0ZSwKKwkweDkzLCAweDBhLCAweDdiLCAweDQxLCAweDgzLCAweDY4LCAweGZiLCAweDU3LAorCTB4NTEsIDB4NzYsIDB4MzQsIDB4YTksIDB4NmMsIDB4MDAsIDB4YWEsIDB4NGYsCisJMHg2NiwgMHg2NSwgMHg5OCwgMHg0YSwgMHg0ZiwgMHhhMywgMHhhMCwgMHhlZiwKKwkweDY5LCAweDNmLCAweGUzLCAweDFjLCAweDkyLCAweDhjLCAweGZkLCAweGQ4LAorCTB4ZTgsIDB4ZGUsIDB4N2MsIDB4N2YsIDB4M2UsIDB4ODQsIDB4OGUsIDB4NjksCisJMHgzYywgMHhmMSwgMHhmMiwgMHgwNSwgMHg0NiwgMHhkYywgMHgyZiwgMHg5ZCwKKwkweDVlLCAweDZlLCAweDRjLCAweGZiLCAweGI1LCAweDk5LCAweDJhLCAweDU5LAorCTB4NjMsIDB4YzEsIDB4MzQsIDB4YmMsIDB4NTcsIDB4YzAsIDB4MGQsIDB4YjksCisJMHg2MSwgMHgyNSwgMHhmMywgMHgzMywgMHgyMywgMHg1MSwgMHhiNiwgMHgwZCwKKwkweDA3LCAweGE2LCAweGFiLCAweDk0LCAweDRhLCAweGI3LCAweDJhLCAweGVhLAorCTB4ZWUsIDB4YWMsIDB4YTMsIDB4YzMsIDB4MDQsIDB4OGIsIDB4MGUsIDB4NTYsCisJMHhmZSwgMHg0NCwgMHhhNywgMHgzOSwgMHhlMiwgMHhlZCwgMHhlZCwgMHhiNCwKKwkweDIyLCAweDJiLCAweGFjLCAweDEyLCAweDMyLCAweDI4LCAweDkxLCAweGQ4LAorCTB4YTUsIDB4YWIsIDB4ZmYsIDB4NWYsIDB4ZTAsIDB4NGIsIDB4ZGEsIDB4NzgsCisJMHgxNywgMHhkYSwgMHhmMSwgMHgwMSwgMHg1YiwgMHhjZCwgMHhlMiwgMHg1ZiwKKwkweDUwLCAweDQ1LCAweDczLCAweDJiLCAweGU0LCAweDc2LCAweDc3LCAweGY0LAorCTB4NjQsIDB4MWQsIDB4NDMsIDB4ZmIsIDB4ODQsIDB4N2EsIDB4ZWEsIDB4OTEsCisJMHhhZSwgMHhmOSwgMHg5ZSwgMHhiNywgMHhiNCwgMHhiMCwgMHg5MSwgMHg1ZiwKKwkweDE2LCAweDM1LCAweDlhLCAweDExLCAweGI4LCAweGM3LCAweGMxLCAweDhjLAorCTB4YzYsIDB4MTAsIDB4OGQsIDB4MmYsIDB4NjMsIDB4NGEsIDB4YTcsIDB4NTcsCisJMHgzYSwgMHg1MSwgMHhkNiwgMHgzMiwgMHgyZCwgMHg2NCwgMHg3MiwgMHhkNCwKKwkweDY2LCAweGRjLCAweDEwLCAweGE2LCAweDY3LCAweGQ2LCAweDA0LCAweDIzLAorCTB4OWQsIDB4MGEsIDB4MTEsIDB4NzcsIDB4ZGQsIDB4MzcsIDB4OTQsIDB4MTcsCisJMHgzYywgMHhiZiwgMHg4YiwgMHg2NSwgMHhiMCwgMHgyZSwgMHg1ZSwgMHg2NiwKKwkweDQ3LCAweDY0LCAweGFjLCAweGRkLCAweGYwLCAweDg0LCAweGZkLCAweDM5LAorCTB4ZmEsIDB4MTUsIDB4NWQsIDB4ZWYsIDB4YWUsIDB4Y2EsIDB4YzEsIDB4MzYsCisJMHhhNywgMHg1YywgMHhiZiwgMHhjNywgMHgwOCwgMHhjMiwgMHg2NiwgMHgwMCwKKwkweDc0LCAweDc0LCAweDRlLCAweDI3LCAweDNmLCAweDU1LCAweDhhLCAweGI3LAorCTB4MzgsIDB4NjYsIDB4ODMsIDB4NmQsIDB4Y2YsIDB4OTksIDB4OWUsIDB4NjAsCisJMHg4ZiwgMHhkZCwgMHgyZSwgMHg2MiwgMHgyMiwgMHgwZSwgMHhlZiwgMHgwYywKKwkweDk4LCAweGE3LCAweDg1LCAweDc0LCAweDNiLCAweDlkLCAweGVjLCAweDllLAorCTB4YTksIDB4MTksIDB4NzIsIDB4YTUsIDB4N2YsIDB4MmMsIDB4MzksIDB4YjcsCisJMHg3ZCwgMHhiNywgMHhmMSwgMHgxMiwgMHg2NSwgMHgyNywgMHg0YiwgMHg1YSwKKwkweGRlLCAweDE3LCAweGZlLCAweGFkLCAweDQ0LCAweGYzLCAweDIwLCAweDRkLAorCTB4ZmQsIDB4ZTQsIDB4MWYsIDB4YjUsIDB4ODEsIDB4YjAsIDB4MzYsIDB4MzcsCisJMHgwOCwgMHg2ZiwgMHhjMywgMHgwYywgMHhlOSwgMHg4NSwgMHg5OCwgMHg4MiwKKwkweGE5LCAweDYyLCAweDBjLCAweGM0LCAweDk3LCAweGMwLCAweDUwLCAweGM4LAorCTB4YTcsIDB4M2MsIDB4NTAsIDB4OWYsIDB4NDMsIDB4YjksIDB4Y2QsIDB4NWUsCisJMHg0ZCwgMHhmYSwgMHgxYywgMHg0YiwgMHgwYiwgMHhhOSwgMHg5OCwgMHg4NSwKKwkweDM4LCAweDkyLCAweGFjLCAweDhkLCAweGU0LCAweGFkLCAweDliLCAweDk4LAorCTB4YWIsIDB4ZDksIDB4MzgsIDB4YWMsIDB4NjIsIDB4NTIsIDB4YTMsIDB4MjIsCisJMHg2MywgMHgwZiwgMHhiZiwgMHg5NSwgMHg0OCwgMHhkZiwgMHg2OSwgMHhlNywKKwkweDhiLCAweDMzLCAweGQ1LCAweGIyLCAweGJkLCAweDA1LCAweDQ5LCAweDQ5LAorCTB4OWQsIDB4NTcsIDB4NzMsIDB4MTksIDB4MzMsIDB4YWUsIDB4ZmEsIDB4MzMsCisJMHhmMSwgMHgxOSwgMHhhOCwgMHg4MCwgMHhjZSwgMHgwNCwgMHg5ZiwgMHhiYywKKwkweDFkLCAweDY1LCAweDgyLCAweDFiLCAweGU1LCAweDNhLCAweDUxLCAweGM4LAorCTB4MWMsIDB4MjEsIDB4ZTMsIDB4NWQsIDB4ZjMsIDB4N2QsIDB4OWIsIDB4MmYsCisJMHgyYywgMHgxZCwgMHg0YSwgMHg3ZiwgMHg5YiwgMHg2OCwgMHgzNSwgMHhhMywKKwkweGIyLCAweDUwLCAweGY3LCAweDYyLCAweDc5LCAweGNkLCAweGY0LCAweDk4LAorCTB4NGYsIDB4ZTUsIDB4NjMsIDB4N2MsIDB4M2UsIDB4NDUsIDB4MzEsIDB4OGMsCisJMHgxNiwgMHhhMCwgMHgxMiwgMHhjOCwgMHg1OCwgMHhjZSwgMHgzOSwgMHhhNiwKKwkweGJjLCAweDU0LCAweGRiLCAweGM1LCAweGUwLCAweGQ1LCAweGJhLCAweGJjLAorCTB4YjksIDB4MDQsIDB4ZjQsIDB4OGQsIDB4ZTgsIDB4MmYsIDB4MTUsIDB4OWQsCit9OworCisvKiAxMDAgdGVzdCBjYXNlcyAqLworc3RhdGljIHN0cnVjdCBjcmNfdGVzdCB7CisJdTMyIGNyYzsJLyogcmFuZG9tIHN0YXJ0aW5nIGNyYyAqLworCXUzMiBzdGFydDsJLyogcmFuZG9tIDYgYml0IG9mZnNldCBpbiBidWYgKi8KKwl1MzIgbGVuZ3RoOwkvKiByYW5kb20gMTEgYml0IGxlbmd0aCBvZiB0ZXN0ICovCisJdTMyIGNyY19sZTsJLyogZXhwZWN0ZWQgY3JjMzJfbGUgcmVzdWx0ICovCisJdTMyIGNyY19iZTsJLyogZXhwZWN0ZWQgY3JjMzJfYmUgcmVzdWx0ICovCisJdTMyIGNyYzMyY19sZTsJLyogZXhwZWN0ZWQgY3JjMzJjX2xlIHJlc3VsdCAqLworfSBjb25zdCB0ZXN0W10gX19pbml0Y29uc3QgPQoreworCXsweDY3NGJmMTFkLCAweDAwMDAwMDM4LCAweDAwMDAwNTQyLCAweDBhZjZkNDY2LCAweGQ4YjZlNGMxLCAweGY2ZTkzZDZjfSwKKwl7MHgzNWM2NzJjNiwgMHgwMDAwMDAzYSwgMHgwMDAwMDFhYSwgMHhjNmQzZGZiYSwgMHgyOGFhZjNhZCwgMHgwZmU5MmFjYX0sCisJezB4NDk2ZGEyOGUsIDB4MDAwMDAwMzksIDB4MDAwMDA1YWYsIDB4ZDkzMzY2MGYsIDB4NWQ1N2U4MWYsIDB4NTJlMWViYjh9LAorCXsweDA5YTliOTBlLCAweDAwMDAwMDI3LCAweDAwMDAwMWY4LCAweGI0NWZlMDA3LCAweGY0NWZjYTlhLCAweDA3OThhZjlhfSwKKwl7MHhkYzk3ZTVhOSwgMHgwMDAwMDAyNSwgMHgwMDAwMDNiNiwgMHhmODFhMzU2MiwgMHhlMDEyNmJhMiwgMHgxOGViMzE1Mn0sCisJezB4NDdjNTg5MDAsIDB4MDAwMDAwMGEsIDB4MDAwMDAwYjksIDB4OGU1OGVjY2YsIDB4ZjNhZmM3OTMsIDB4ZDAwZDA4Yzd9LAorCXsweDI5MjU2MWU4LCAweDAwMDAwMDBjLCAweDAwMDAwNDAzLCAweGEyYmE4YWFmLCAweDBiNzk3YWVkLCAweDhiYTk2NmJjfSwKKwl7MHg0MTUwMzdmNiwgMHgwMDAwMDAwMywgMHgwMDAwMDY3NiwgMHhhMTdkNTJlOCwgMHg3ZjBmZGYzNSwgMHgxMWQ2OTRhMn0sCisJezB4MzQ2NmU3MDcsIDB4MDAwMDAwMjYsIDB4MDAwMDAwNDIsIDB4MjU4MzE5YmUsIDB4NzVjNDg0YTIsIDB4NmFiMzIwOGR9LAorCXsweGFmZDEyODFiLCAweDAwMDAwMDIzLCAweDAwMDAwMmVlLCAweDQ0MjhlYWY4LCAweDA2YzdhZDEwLCAweGJhNDYwM2M1fSwKKwl7MHhkMzg1N2IxOCwgMHgwMDAwMDAyOCwgMHgwMDAwMDRhMiwgMHg1YzQzMDgyMSwgMHhiMDYyYjdjYiwgMHhlNjA3MWM2Zn0sCisJezB4MWQ4MjVhOGYsIDB4MDAwMDAwMmIsIDB4MDAwMDA1MGIsIDB4ZDJjNDVmMGMsIDB4ZDY4NjM0ZTAsIDB4MTc5ZWMzMGF9LAorCXsweDUwMzNlM2JjLCAweDAwMDAwMDBiLCAweDAwMDAwMDc4LCAweGEzZWE0MTEzLCAweGFjNmQzMWZiLCAweDA5MDNiZWI4fSwKKwl7MHg5NGYxZmI1ZSwgMHgwMDAwMDAwZiwgMHgwMDAwMDNhMiwgMHhmYmZjNTBiMSwgMHgzY2ZlNTBlZCwgMHg2YTdjYjRmYX0sCisJezB4YzlhMGZlMTQsIDB4MDAwMDAwMDksIDB4MDAwMDA0NzMsIDB4NWZiNjE4OTQsIDB4ODcwNzA1OTEsIDB4ZGI1MzU4MDF9LAorCXsweDg4YTAzNGIxLCAweDAwMDAwMDFjLCAweDAwMDAwNWFkLCAweGMxYjE2MDUzLCAweDQ2Zjk1YzY3LCAweDkyYmVkNTk3fSwKKwl7MHhmMGY3MjIzOSwgMHgwMDAwMDAyMCwgMHgwMDAwMDI2ZCwgMHhhNmZhNThmMywgMHhmOGMyYzFkZCwgMHgxOTJhM2YxYn0sCisJezB4Y2MyMGE1ZTMsIDB4MDAwMDAwM2IsIDB4MDAwMDA2N2EsIDB4Nzc0MDE4NWEsIDB4MzA4Yjk3OWEsIDB4Y2NiYWVjMWF9LAorCXsweGNlNTg5Yzk1LCAweDAwMDAwMDJiLCAweDAwMDAwNjQxLCAweGQwNTVlOTg3LCAweDQwYWFlMjViLCAweDdlYWJhZTRkfSwKKwl7MHg3OGVkYzg4NSwgMHgwMDAwMDAzNSwgMHgwMDAwMDViZSwgMHhhMzljYjE0YiwgMHgwMzViMGQxZiwgMHgyOGM3Mjk4Mn0sCisJezB4OWQ0MGEzNzcsIDB4MDAwMDAwM2IsIDB4MDAwMDAwMzgsIDB4MWY0N2NjZDIsIDB4MTk3ZmJjOWQsIDB4YzNjZDRkMTh9LAorCXsweDcwM2QwZTAxLCAweDAwMDAwMDNjLCAweDAwMDAwNmYxLCAweDg4NzM1ZTdjLCAweGZlZDU3YzVhLCAweGJjYThmMGU3fSwKKwl7MHg3NzZiZjUwNSwgMHgwMDAwMDAwZiwgMHgwMDAwMDViMiwgMHg1Y2M0ZmMwMSwgMHhmMzJlZmI5NywgMHg3MTNmNjBiM30sCisJezB4NGEzZTc4NTQsIDB4MDAwMDAwMjcsIDB4MDAwMDA0YjgsIDB4OGQ5MjNjODIsIDB4MGNiZmI0YTIsIDB4ZWJkMDhmZDV9LAorCXsweDIwOTE3MmRkLCAweDAwMDAwMDNiLCAweDAwMDAwMzU2LCAweGI4OWU5YzJiLCAweGQ3ODY4MTM4LCAweDY0NDA2YzU5fSwKKwl7MHgzYmE0Y2M1YiwgMHgwMDAwMDAyZiwgMHgwMDAwMDIwMywgMHhlNTE2MDFhOSwgMHg1YjJhMTAzMiwgMHg3NDIxODkwZX0sCisJezB4ZmM2MmYyOTcsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNzksIDB4NzFhOGUxYTIsIDB4NWQ4ODY4NWYsIDB4ZTkzNDc2MDN9LAorCXsweDY0MjgwYjhiLCAweDAwMDAwMDE2LCAweDAwMDAwN2FiLCAweDBmYTdhMzBjLCAweGRhM2E0NTVmLCAweDFiZWY5MDYwfSwKKwl7MHg5N2RkNzI0YiwgMHgwMDAwMDAzMywgMHgwMDAwMDdhZCwgMHg1Nzg4YjJmNCwgMHhkNzMyNmQzMiwgMHgzNDcyMDA3Mn0sCisJezB4NjEzOTRiNTIsIDB4MDAwMDAwMzUsIDB4MDAwMDA1NzEsIDB4YzY2NTI1ZjEsIDB4Y2FiZTdmZWYsIDB4NDgzMTBmNTl9LAorCXsweDI5YjRmYWZmLCAweDAwMDAwMDI0LCAweDAwMDAwMDZlLCAweGNhMTM3NTFlLCAweDk5MzY0OGUwLCAweDc4M2E0MjEzfSwKKwl7MHgyOWJmYjFkYywgMHgwMDAwMDAwYiwgMHgwMDAwMDI0NCwgMHg0MzZjNDNmNywgMHg0MjlmN2E1OSwgMHg5ZThlZmQ0MX0sCisJezB4ODZhZTkzNGIsIDB4MDAwMDAwMzUsIDB4MDAwMDAxMDQsIDB4MDc2MGVjOTMsIDB4OWNmN2QwZjQsIDB4ZmMzZDM0YTV9LAorCXsweGM0YzEwMjRlLCAweDAwMDAwMDJlLCAweDAwMDAwNmIxLCAweDY1MTZhM2VjLCAweDE5MzIxZjljLCAweDE3YTUyYWUyfSwKKwl7MHgzMjg3YTgwYSwgMHgwMDAwMDAyNiwgMHgwMDAwMDQ5NiwgMHgwYjI1N2ViMSwgMHg3NTRlYmQ1MSwgMHg4ODZkOTM1YX0sCisJezB4YTRkYjQyM2UsIDB4MDAwMDAwMjMsIDB4MDAwMDA0NWQsIDB4OWIzYTY2ZGMsIDB4ODczZTlmMTEsIDB4ZWFhZWFlYjJ9LAorCXsweDdhMTA3OGRmLCAweDAwMDAwMDE1LCAweDAwMDAwMTRhLCAweDhjMjQ4NGM1LCAweDZhNjI4NjU5LCAweDhlOTAwYTRifSwKKwl7MHg2MDQ4YmQ1YiwgMHgwMDAwMDAwNiwgMHgwMDAwMDA2YSwgMHg4OTdlMzU1OSwgMHhhYzk5NjFhZiwgMHhkNzQ2NjJiMX0sCisJezB4ZDhmOWVhMjAsIDB4MDAwMDAwM2QsIDB4MDAwMDAyNzcsIDB4NjBlYjkwNWIsIDB4ZWQyYWFmOTksIDB4ZDI2NzUyYmF9LAorCXsweGVhNWVjM2I0LCAweDAwMDAwMDJhLCAweDAwMDAwNGZlLCAweDg2OTk2NWRjLCAweDZjMWY4MzNiLCAweDhiMWZjZDYyfSwKKwl7MHgyZGZiMDA1ZCwgMHgwMDAwMDAxNiwgMHgwMDAwMDM0NSwgMHg2YTNiMTE3ZSwgMHhmMDVlODUyMSwgMHhmNTQzNDJmZX0sCisJezB4NWEyMTRhZGUsIDB4MDAwMDAwMjAsIDB4MDAwMDA1YjYsIDB4NDY3ZjcwYmUsIDB4Y2IyMmNjZDMsIDB4NWI5NWI5ODh9LAorCXsweGYwYWI5Y2NhLCAweDAwMDAwMDMyLCAweDAwMDAwNTE1LCAweGVkMjIzZGYzLCAweDdmM2VmMDFkLCAweDJlMTE3NmJlfSwKKwl7MHg5MWI0NDRmOSwgMHgwMDAwMDAyZSwgMHgwMDAwMDdmOCwgMHg4NGU5YTk4MywgMHg1Njc2NzU2ZiwgMHg2NjEyMDU0Nn0sCisJezB4MWI1ZDJkZGIsIDB4MDAwMDAwMmUsIDB4MDAwMDAxMmMsIDB4YmE2MzhjNGMsIDB4M2Y0MjA0N2IsIDB4ZjI1NmE1Y2N9LAorCXsweGQ4MjRkMWJiLCAweDAwMDAwMDNhLCAweDAwMDAwN2I1LCAweDYyODg2NTNiLCAweDNhM2ViZWEwLCAweDRhZjFkZDY5fSwKKwl7MHgwNDcwMTgwYywgMHgwMDAwMDAzNCwgMHgwMDAwMDFmMCwgMHg5ZDViODBkNiwgMHgzZGUwODE5NSwgMHg1NmYwYTA0YX0sCisJezB4ZmZhYTNhM2YsIDB4MDAwMDAwMzYsIDB4MDAwMDAyOTksIDB4ZjNhODJhYjgsIDB4NTNlMGMxM2QsIDB4NzRmNmI2YjJ9LAorCXsweDY0MDZjZmViLCAweDAwMDAwMDIzLCAweDAwMDAwNjAwLCAweGE5MjBiOGU4LCAweGU0ZTJhY2Y0LCAweDA4NTk1MWZkfSwKKwl7MHhiMjRhYWEzOCwgMHgwMDAwMDAzZSwgMHgwMDAwMDRhMSwgMHg2NTdjYzMyOCwgMHg1MDc3YjJjMywgMHhjNjUzODdlYn0sCisJezB4NThiMmFiN2MsIDB4MDAwMDAwMzksIDB4MDAwMDAyYjQsIDB4M2ExN2VlN2UsIDB4OWRjYjM2NDMsIDB4MWNhOTI1N2J9LAorCXsweDNkYjg1OTcwLCAweDAwMDAwMDA2LCAweDAwMDAwMmI2LCAweDk1MjY4YjU5LCAweGI5ODEyYzEwLCAweGZkMTk2ZDc2fSwKKwl7MHg4NTc4MzBjNSwgMHgwMDAwMDAwMywgMHgwMDAwMDU5MCwgMHg0ZWY0MzlkNSwgMHhmMDQyMTYxZCwgMHg1ZWY4ODMzOX0sCisJezB4ZTFmY2Q5NzgsIDB4MDAwMDAwM2UsIDB4MDAwMDA3ZDgsIDB4YWU4ZDg2OTksIDB4Y2UwYTFlZjUsIDB4MmMzNzE0ZDl9LAorCXsweGI5ODJhNzY4LCAweDAwMDAwMDE2LCAweDAwMDAwNmUwLCAweDYyZmFkM2RmLCAweDVmOGEwNjdiLCAweDU4NTc2NTQ4fSwKKwl7MHgxZDU4MWNlOCwgMHgwMDAwMDAxZSwgMHgwMDAwMDU4YiwgMHhmMGY1ZGE1MywgMHgyNmUzOWVlZSwgMHhmZDdjNTdkZX0sCisJezB4MjQ1NjcxOWIsIDB4MDAwMDAwMjUsIDB4MDAwMDA1MDMsIDB4NDI5NmFjNjQsIDB4ZDUwZTRjMTQsIDB4ZDVmZWRkNTl9LAorCXsweGZhZTZkOGYyLCAweDAwMDAwMDAwLCAweDAwMDAwNTVkLCAweDA1N2ZkZjJlLCAweDJhMzEzOTFhLCAweDFjYzNiMTdifSwKKwl7MHhjYmE4MjhlMywgMHgwMDAwMDAzOSwgMHgwMDAwMDJjZSwgMHhlM2YyMjM1MSwgMHg4ZjAwODc3YiwgMHgyNzBlZWQ3M30sCisJezB4MTNkMjU5NTIsIDB4MDAwMDAwMGEsIDB4MDAwMDA3MmQsIDB4NzZkNGI0Y2MsIDB4NWViNjdlYzMsIDB4OTFlY2JiMTF9LAorCXsweDAzNDJiZTNmLCAweDAwMDAwMDE1LCAweDAwMDAwNTk5LCAweGVjNzVkOWYxLCAweDlkNGQyODI2LCAweDA1ZWQ4ZDBjfSwKKwl7MHhlYWEzNDRlMCwgMHgwMDAwMDAxNCwgMHgwMDAwMDRkOCwgMHg3MmE0Yzk4MSwgMHgyMDY0ZWEwNiwgMHgwYjA5YWQ1Yn0sCisJezB4YmJiNTIwMjEsIDB4MDAwMDAwM2IsIDB4MDAwMDAyNzIsIDB4MDRhZjk5ZmMsIDB4YWYwNDJkMzUsIDB4ZjhkNTExZmJ9LAorCXsweGI2NjM4NGRjLCAweDAwMDAwMDFkLCAweDAwMDAwN2ZjLCAweGQ3NjI5MTE2LCAweDc4MmJkODAxLCAweDVhZDgzMmNjfSwKKwl7MHg2MTZjMDFiNiwgMHgwMDAwMDAyMiwgMHgwMDAwMDJjOCwgMHg1YjFkYWIzMCwgMHg3ODNjZTdkMiwgMHgxMjE0ZDE5Nn0sCisJezB4Y2UyYmRhYWQsIDB4MDAwMDAwMTYsIDB4MDAwMDA2MmEsIDB4OTMyNTM1YzgsIDB4M2YwMjkyNmQsIDB4NTc0NzIxOGF9LAorCXsweDAwZmU4NGQ3LCAweDAwMDAwMDA1LCAweDAwMDAwMjA1LCAweDg1MGU1MGFhLCAweDc1M2Q2NDljLCAweGRlOGYxNGRlfSwKKwl7MHhiZWJkY2I0YywgMHgwMDAwMDAwNiwgMHgwMDAwMDU1ZCwgMHhiZWFhMzdhMiwgMHgyZDhjOWViYSwgMHgzNTYzYjdiOX0sCisJezB4ZDhiMWEwMmEsIDB4MDAwMDAwMTAsIDB4MDAwMDAzODcsIDB4NTAxN2QyZmMsIDB4NTAzNTQxYTUsIDB4MDcxNDc1ZDB9LAorCXsweDNiOTZjYWQyLCAweDAwMDAwMDM2LCAweDAwMDAwMzQ3LCAweDFkMjM3MmFlLCAweDkyNmNkOTBiLCAweDU0Yzc5ZDYwfSwKKwl7MHhjOTRjMWVkNywgMHgwMDAwMDAwNSwgMHgwMDAwMDM4YiwgMHg5ZTlmZGIyMiwgMHgxNDRhOTE3OCwgMHg0YzUzZWVlNn0sCisJezB4MWFhZDQ1NGUsIDB4MDAwMDAwMjUsIDB4MDAwMDAyYjIsIDB4YzNmNjMxNWMsIDB4NWM3YTM1YjMsIDB4MTAxMzdhM2N9LAorCXsweGE0ZmVjOWE2LCAweDAwMDAwMDAwLCAweDAwMDAwNmQ2LCAweDkwYmU1MDgwLCAweGE0MTA3NjA1LCAweGFhOWQ2YzczfSwKKwl7MHgxYmJlNzFlMiwgMHgwMDAwMDAxZiwgMHgwMDAwMDJmZCwgMHg0ZTUwNGMzYiwgMHgyODRjY2FmMSwgMHhiNjNkMjNlN30sCisJezB4NDIwMWM3ZTQsIDB4MDAwMDAwMDIsIDB4MDAwMDAyYjcsIDB4NzgyMmUzZjksIDB4MGNjOTEyYTksIDB4N2Y1M2U5Y2Z9LAorCXsweDIzZmRkYzk2LCAweDAwMDAwMDAzLCAweDAwMDAwNjI3LCAweDhhMzg1MTI1LCAweDA3NzY3ZTc4LCAweDEzYzFjZDgzfSwKKwl7MHhkODJiYTI1YywgMHgwMDAwMDAxNiwgMHgwMDAwMDYzZSwgMHg5OGU0MTQ4YSwgMHgyODMzMzBjOSwgMHg0OWZmNTg2N30sCisJezB4Nzg2ZjIwMzIsIDB4MDAwMDAwMmQsIDB4MDAwMDA2MGYsIDB4ZjIwMTYwMGEsIDB4ZjU2MWJmY2QsIDB4ODQ2N2YyMTF9LAorCXsweGZlYmU0ZTFmLCAweDAwMDAwMDJhLCAweDAwMDAwNGYyLCAweDk1ZTUxOTYxLCAweGZkODBkY2FiLCAweDNmOTY4M2IyfSwKKwl7MHgxYTZlMGEzOSwgMHgwMDAwMDAwOCwgMHgwMDAwMDY3MiwgMHg4YWY2YzJhNSwgMHg3OGRkODRjYiwgMHg3NmEzZjg3NH0sCisJezB4NTYwMDBhYjgsIDB4MDAwMDAwMGUsIDB4MDAwMDAwZTUsIDB4MzZiYWNiOGYsIDB4MjJlZTFmNzcsIDB4ODYzYjcwMmZ9LAorCXsweDQ3MTdmZTBjLCAweDAwMDAwMDAwLCAweDAwMDAwNmVjLCAweDg0MzlmMzQyLCAweDVjOGUwM2RhLCAweGRjNmM1OGZmfSwKKwl7MHhkNWQ1ZDY4ZSwgMHgwMDAwMDAzYywgMHgwMDAwMDNhMywgMHg0NmZmZjA4MywgMHgxNzdkMWIzOSwgMHgwNjIyY2M5NX0sCisJezB4YzI1ZGQ2YzYsIDB4MDAwMDAwMjQsIDB4MDAwMDA2YzAsIDB4NWNlYjhlYjQsIDB4ODkyYjBkMTYsIDB4ZTg1NjA1Y2R9LAorCXsweGU5YjExMzAwLCAweDAwMDAwMDIzLCAweDAwMDAwNjgzLCAweDA3YTVkNTlhLCAweDZjNmEzMjA4LCAweDMxZGE1ZjA2fSwKKwl7MHg5NWNkMjg1ZSwgMHgwMDAwMDAwMSwgMHgwMDAwMDA0NywgMHg3YjNhNDM2OCwgMHgwMjAyYzA3ZSwgMHhhMWYyZTc4NH0sCisJezB4ZDkyNDVhMjUsIDB4MDAwMDAwMWUsIDB4MDAwMDAzYTYsIDB4ZDMzYzE4NDEsIDB4MTkzNmMwZDUsIDB4YjA3Y2M2MTZ9LAorCXsweDEwMzI3OWRiLCAweDAwMDAwMDA2LCAweDAwMDAwMzliLCAweGNhMDliOGEwLCAweDc3ZDYyODkyLCAweGJmOTQzYjZjfSwKKwl7MHgxY2JhMzE3MiwgMHgwMDAwMDAyNywgMHgwMDAwMDFjOCwgMHhjYjM3NzE5NCwgMHhlYmU2ODJkYiwgMHgyYzAxYWYxY30sCisJezB4OGY2MTM3MzksIDB4MDAwMDAwMGMsIDB4MDAwMDAxZGYsIDB4YjRiMGJjODcsIDB4NzcxMGJkNDMsIDB4MGZlNWY1NmR9LAorCXsweDFjNmFhOTBkLCAweDAwMDAwMDFiLCAweDAwMDAwNTNjLCAweDcwNTU5MjQ1LCAweGRhNzg5NGFjLCAweGY4OTQzYjJkfSwKKwl7MHhhYWJlNWI5MywgMHgwMDAwMDAzZCwgMHgwMDAwMDcxNSwgMHhjZGJmNDJmYSwgMHgwYzNiOTllNywgMHhlNGQ4OTI3Mn0sCisJezB4ZjE1ZGQwMzgsIDB4MDAwMDAwMDYsIDB4MDAwMDA2ZGIsIDB4NmUxMDRhZWEsIDB4OGQ1OTY3ZjIsIDB4N2MyZjZiYmJ9LAorCXsweDU4NGRkNDljLCAweDAwMDAwMDIwLCAweDAwMDAwN2JjLCAweDM2YjZjZmQ2LCAweGFkNGUyM2IyLCAweGFiYmYzODhifSwKKwl7MHg1ZDhjOTUwNiwgMHgwMDAwMDAyMCwgMHgwMDAwMDQ3MCwgMHg0YzYyMzc4ZSwgMHgzMWQ5MjY0MCwgMHgxZGNhMWY0ZX0sCisJezB4YjgwZDE3YjAsIDB4MDAwMDAwMzIsIDB4MDAwMDAzNDYsIDB4MjJhNWJiODgsIDB4OWE3ZWM4OWYsIDB4NWMxNzBlMjN9LAorCXsweGRhZjA1OTJlLCAweDAwMDAwMDIzLCAweDAwMDAwN2IwLCAweDNjYWIzZjk5LCAweDliMWZkZDk5LCAweGMwZTlkNjcyfSwKKwl7MHg0NzkzY2M4NSwgMHgwMDAwMDAwZCwgMHgwMDAwMDcwNiwgMHhlODJlMDRmNiwgMHhlZDNkYjZiNywgMHhjMThiZGM4Nn0sCisJezB4ODJlYmY2NGUsIDB4MDAwMDAwMDksIDB4MDAwMDA3YzMsIDB4NjlkNTkwYTksIDB4OWVmYTg0OTksIDB4YTg3NGZjZGR9LAorCXsweGIxOGEwMzE5LCAweDAwMDAwMDI2LCAweDAwMDAwN2RiLCAweDFjZjk4ZGNjLCAweDhmYTlhZDZhLCAweDlkYzBiYjQ4fSwKK307CisKKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKK3N0YXRpYyBpbnQgX19pbml0IGNyYzMyY190ZXN0KHZvaWQpCit7CisJaW50IGk7CisJaW50IGVycm9ycyA9IDA7CisJaW50IGJ5dGVzID0gMDsKKwl1NjQgbnNlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoga2VlcCBzdGF0aWMgdG8gcHJldmVudCBjYWNoZSB3YXJtaW5nIGNvZGUgZnJvbQorCSAqIGdldHRpbmcgZWxpbWluYXRlZCBieSB0aGUgY29tcGlsZXIgKi8KKwlzdGF0aWMgdTMyIGNyYzsKKworCS8qIHByZS13YXJtIHRoZSBjYWNoZSAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlieXRlcyArPSAyKnRlc3RbaV0ubGVuZ3RoOworCisJCWNyYyBePSBfX2NyYzMyY19sZSh0ZXN0W2ldLmNyYywgdGVzdF9idWYgKworCQkgICAgdGVzdFtpXS5zdGFydCwgdGVzdFtpXS5sZW5ndGgpOworCX0KKworCS8qIHJlZHVjZSBPUyBub2lzZSAqLworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJbnNlYyA9IGt0aW1lX2dldF9ucygpOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAodGVzdFtpXS5jcmMzMmNfbGUgIT0gX19jcmMzMmNfbGUodGVzdFtpXS5jcmMsIHRlc3RfYnVmICsKKwkJICAgIHRlc3RbaV0uc3RhcnQsIHRlc3RbaV0ubGVuZ3RoKSkKKwkJCWVycm9ycysrOworCX0KKwluc2VjID0ga3RpbWVfZ2V0X25zKCkgLSBuc2VjOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXByX2luZm8oImNyYzMyYzogQ1JDX0xFX0JJVFMgPSAlZFxuIiwgQ1JDX0xFX0JJVFMpOworCisJaWYgKGVycm9ycykKKwkJcHJfd2FybigiY3JjMzJjOiAlZCBzZWxmIHRlc3RzIGZhaWxlZFxuIiwgZXJyb3JzKTsKKwllbHNlIHsKKwkJcHJfaW5mbygiY3JjMzJjOiBzZWxmIHRlc3RzIHBhc3NlZCwgcHJvY2Vzc2VkICVkIGJ5dGVzIGluICVsbGQgbnNlY1xuIiwKKwkJCWJ5dGVzLCBuc2VjKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY3JjMzJjX2NvbWJpbmVfdGVzdCh2b2lkKQoreworCWludCBpLCBqOworCWludCBlcnJvcnMgPSAwLCBydW5zID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisJCXUzMiBjcmNfZnVsbDsKKworCQljcmNfZnVsbCA9IF9fY3JjMzJjX2xlKHRlc3RbaV0uY3JjLCB0ZXN0X2J1ZiArIHRlc3RbaV0uc3RhcnQsCisJCQkJICAgICAgIHRlc3RbaV0ubGVuZ3RoKTsKKwkJZm9yIChqID0gMDsgaiA8PSB0ZXN0W2ldLmxlbmd0aDsgKytqKSB7CisJCQl1MzIgY3JjMSwgY3JjMjsKKwkJCXUzMiBsZW4xID0gaiwgbGVuMiA9IHRlc3RbaV0ubGVuZ3RoIC0gajsKKworCQkJY3JjMSA9IF9fY3JjMzJjX2xlKHRlc3RbaV0uY3JjLCB0ZXN0X2J1ZiArCisJCQkJCSAgIHRlc3RbaV0uc3RhcnQsIGxlbjEpOworCQkJY3JjMiA9IF9fY3JjMzJjX2xlKDAsIHRlc3RfYnVmICsgdGVzdFtpXS5zdGFydCArCisJCQkJCSAgIGxlbjEsIGxlbjIpOworCisJCQlpZiAoIShjcmNfZnVsbCA9PSBfX2NyYzMyY19sZV9jb21iaW5lKGNyYzEsIGNyYzIsIGxlbjIpICYmCisJCQkgICAgICBjcmNfZnVsbCA9PSB0ZXN0W2ldLmNyYzMyY19sZSkpCisJCQkJZXJyb3JzKys7CisJCQlydW5zKys7CisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCX0KKworCWlmIChlcnJvcnMpCisJCXByX3dhcm4oImNyYzMyY19jb21iaW5lOiAlZC8lZCBzZWxmIHRlc3RzIGZhaWxlZFxuIiwgZXJyb3JzLCBydW5zKTsKKwllbHNlCisJCXByX2luZm8oImNyYzMyY19jb21iaW5lOiAlZCBzZWxmIHRlc3RzIHBhc3NlZFxuIiwgcnVucyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY3JjMzJfdGVzdCh2b2lkKQoreworCWludCBpOworCWludCBlcnJvcnMgPSAwOworCWludCBieXRlcyA9IDA7CisJdTY0IG5zZWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGtlZXAgc3RhdGljIHRvIHByZXZlbnQgY2FjaGUgd2FybWluZyBjb2RlIGZyb20KKwkgKiBnZXR0aW5nIGVsaW1pbmF0ZWQgYnkgdGhlIGNvbXBpbGVyICovCisJc3RhdGljIHUzMiBjcmM7CisKKwkvKiBwcmUtd2FybSB0aGUgY2FjaGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJYnl0ZXMgKz0gMip0ZXN0W2ldLmxlbmd0aDsKKworCQljcmMgXj0gY3JjMzJfbGUodGVzdFtpXS5jcmMsIHRlc3RfYnVmICsKKwkJICAgIHRlc3RbaV0uc3RhcnQsIHRlc3RbaV0ubGVuZ3RoKTsKKworCQljcmMgXj0gY3JjMzJfYmUodGVzdFtpXS5jcmMsIHRlc3RfYnVmICsKKwkJICAgIHRlc3RbaV0uc3RhcnQsIHRlc3RbaV0ubGVuZ3RoKTsKKwl9CisKKwkvKiByZWR1Y2UgT1Mgbm9pc2UgKi8KKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKworCW5zZWMgPSBrdGltZV9nZXRfbnMoKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJaWYgKHRlc3RbaV0uY3JjX2xlICE9IGNyYzMyX2xlKHRlc3RbaV0uY3JjLCB0ZXN0X2J1ZiArCisJCSAgICB0ZXN0W2ldLnN0YXJ0LCB0ZXN0W2ldLmxlbmd0aCkpCisJCQllcnJvcnMrKzsKKworCQlpZiAodGVzdFtpXS5jcmNfYmUgIT0gY3JjMzJfYmUodGVzdFtpXS5jcmMsIHRlc3RfYnVmICsKKwkJICAgIHRlc3RbaV0uc3RhcnQsIHRlc3RbaV0ubGVuZ3RoKSkKKwkJCWVycm9ycysrOworCX0KKwluc2VjID0ga3RpbWVfZ2V0X25zKCkgLSBuc2VjOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXByX2luZm8oImNyYzMyOiBDUkNfTEVfQklUUyA9ICVkLCBDUkNfQkUgQklUUyA9ICVkXG4iLAorCQkgQ1JDX0xFX0JJVFMsIENSQ19CRV9CSVRTKTsKKworCWlmIChlcnJvcnMpCisJCXByX3dhcm4oImNyYzMyOiAlZCBzZWxmIHRlc3RzIGZhaWxlZFxuIiwgZXJyb3JzKTsKKwllbHNlIHsKKwkJcHJfaW5mbygiY3JjMzI6IHNlbGYgdGVzdHMgcGFzc2VkLCBwcm9jZXNzZWQgJWQgYnl0ZXMgaW4gJWxsZCBuc2VjXG4iLAorCQkJYnl0ZXMsIG5zZWMpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjcmMzMl9jb21iaW5lX3Rlc3Qodm9pZCkKK3sKKwlpbnQgaSwgajsKKwlpbnQgZXJyb3JzID0gMCwgcnVucyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgeworCQl1MzIgY3JjX2Z1bGw7CisKKwkJY3JjX2Z1bGwgPSBjcmMzMl9sZSh0ZXN0W2ldLmNyYywgdGVzdF9idWYgKyB0ZXN0W2ldLnN0YXJ0LAorCQkJCSAgICB0ZXN0W2ldLmxlbmd0aCk7CisJCWZvciAoaiA9IDA7IGogPD0gdGVzdFtpXS5sZW5ndGg7ICsraikgeworCQkJdTMyIGNyYzEsIGNyYzI7CisJCQl1MzIgbGVuMSA9IGosIGxlbjIgPSB0ZXN0W2ldLmxlbmd0aCAtIGo7CisKKwkJCWNyYzEgPSBjcmMzMl9sZSh0ZXN0W2ldLmNyYywgdGVzdF9idWYgKworCQkJCQl0ZXN0W2ldLnN0YXJ0LCBsZW4xKTsKKwkJCWNyYzIgPSBjcmMzMl9sZSgwLCB0ZXN0X2J1ZiArIHRlc3RbaV0uc3RhcnQgKworCQkJCQlsZW4xLCBsZW4yKTsKKworCQkJaWYgKCEoY3JjX2Z1bGwgPT0gY3JjMzJfbGVfY29tYmluZShjcmMxLCBjcmMyLCBsZW4yKSAmJgorCQkJICAgICAgY3JjX2Z1bGwgPT0gdGVzdFtpXS5jcmNfbGUpKQorCQkJCWVycm9ycysrOworCQkJcnVucysrOworCQkJY29uZF9yZXNjaGVkKCk7CisJCX0KKwl9CisKKwlpZiAoZXJyb3JzKQorCQlwcl93YXJuKCJjcmMzMl9jb21iaW5lOiAlZC8lZCBzZWxmIHRlc3RzIGZhaWxlZFxuIiwgZXJyb3JzLCBydW5zKTsKKwllbHNlCisJCXByX2luZm8oImNyYzMyX2NvbWJpbmU6ICVkIHNlbGYgdGVzdHMgcGFzc2VkXG4iLCBydW5zKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjcmMzMnRlc3RfaW5pdCh2b2lkKQoreworCWNyYzMyX3Rlc3QoKTsKKwljcmMzMmNfdGVzdCgpOworCisJY3JjMzJfY29tYmluZV90ZXN0KCk7CisJY3JjMzJjX2NvbWJpbmVfdGVzdCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjcmMzMl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KGNyYzMydGVzdF9pbml0KTsKK21vZHVsZV9leGl0KGNyYzMyX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzMyIHNlbGZ0ZXN0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmM0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmM0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2ZGI0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzQuYwpAQCAtMCwwICsxLDQ2IEBACisvKgorICogY3JjNC5jIC0gc2ltcGxlIGNyYy00IGNhbGN1bGF0aW9ucy4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgVmVyc2lvbgorICogMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3JjNC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdGF0aWMgY29uc3QgdWludDhfdCBjcmM0X3RhYltdID0geworCTB4MCwgMHg3LCAweGUsIDB4OSwgMHhiLCAweGMsIDB4NSwgMHgyLAorCTB4MSwgMHg2LCAweGYsIDB4OCwgMHhhLCAweGQsIDB4NCwgMHgzLAorfTsKKworLyoqCisgKiBjcmM0IC0gY2FsY3VsYXRlIHRoZSA0LWJpdCBjcmMgb2YgYSB2YWx1ZS4KKyAqIEBjcmM6ICBzdGFydGluZyBjcmM0CisgKiBAeDogICAgdmFsdWUgdG8gY2hlY2tzdW0KKyAqIEBiaXRzOiBudW1iZXIgb2YgYml0cyBpbiBAeCB0byBjaGVja3N1bQorICoKKyAqIFJldHVybnMgdGhlIGNyYzQgdmFsdWUgb2YgQHgsIHVzaW5nIHBvbHlub21pYWwgMGIxMDExMS4KKyAqCisgKiBUaGUgQHggdmFsdWUgaXMgdHJlYXRlZCBhcyBsZWZ0LWFsaWduZWQsIGFuZCBiaXRzIGFib3ZlIEBiaXRzIGFyZSBpZ25vcmVkCisgKiBpbiB0aGUgY3JjIGNhbGN1bGF0aW9ucy4KKyAqLwordWludDhfdCBjcmM0KHVpbnQ4X3QgYywgdWludDY0X3QgeCwgaW50IGJpdHMpCit7CisJaW50IGk7CisKKwkvKiBtYXNrIG9mZiBhbnl0aGluZyBhYm92ZSB0aGUgdG9wIGJpdCAqLworCXggJj0gKDF1bGwgPDwgYml0cykgLSAxOworCisJLyogQWxpZ24gdG8gNC1iaXRzICovCisJYml0cyA9IChiaXRzICsgMykgJiB+MHgzOworCisJLyogQ2FsY3VsYXRlIGNyYzQgb3ZlciBmb3VyLWJpdCBuaWJibGVzLCBzdGFydGluZyBhdCB0aGUgTVNiaXQgKi8KKwlmb3IgKGkgPSBiaXRzIC0gNDsgaSA+PSAwOyBpIC09IDQpCisJCWMgPSBjcmM0X3RhYltjIF4gKCh4ID4+IGkpICYgMHhmKV07CisKKwlyZXR1cm4gYzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNyYzQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzQgY2FsY3VsYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmM3LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jcmM3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MjU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzcuYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogICAgICBjcmM3LmMKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CisKKworLyoKKyAqIFRhYmxlIGZvciBDUkMtNyAocG9seW5vbWlhbCB4XjcgKyB4XjMgKyAxKS4KKyAqIFRoaXMgaXMgYSBiaWctZW5kaWFuIENSQyAobXNiaXQgaXMgaGlnaGVzdCBwb3dlciBvZiB4KSwKKyAqIGFsaWduZWQgc28gdGhlIG1zYml0IG9mIHRoZSBieXRlIGlzIHRoZSB4XjYgY29lZmZpY2llbnQKKyAqIGFuZCB0aGUgbHNiaXQgaXMgbm90IHVzZWQuCisgKi8KK2NvbnN0IHU4IGNyYzdfYmVfc3luZHJvbWVfdGFibGVbMjU2XSA9IHsKKwkweDAwLCAweDEyLCAweDI0LCAweDM2LCAweDQ4LCAweDVhLCAweDZjLCAweDdlLAorCTB4OTAsIDB4ODIsIDB4YjQsIDB4YTYsIDB4ZDgsIDB4Y2EsIDB4ZmMsIDB4ZWUsCisJMHgzMiwgMHgyMCwgMHgxNiwgMHgwNCwgMHg3YSwgMHg2OCwgMHg1ZSwgMHg0YywKKwkweGEyLCAweGIwLCAweDg2LCAweDk0LCAweGVhLCAweGY4LCAweGNlLCAweGRjLAorCTB4NjQsIDB4NzYsIDB4NDAsIDB4NTIsIDB4MmMsIDB4M2UsIDB4MDgsIDB4MWEsCisJMHhmNCwgMHhlNiwgMHhkMCwgMHhjMiwgMHhiYywgMHhhZSwgMHg5OCwgMHg4YSwKKwkweDU2LCAweDQ0LCAweDcyLCAweDYwLCAweDFlLCAweDBjLCAweDNhLCAweDI4LAorCTB4YzYsIDB4ZDQsIDB4ZTIsIDB4ZjAsIDB4OGUsIDB4OWMsIDB4YWEsIDB4YjgsCisJMHhjOCwgMHhkYSwgMHhlYywgMHhmZSwgMHg4MCwgMHg5MiwgMHhhNCwgMHhiNiwKKwkweDU4LCAweDRhLCAweDdjLCAweDZlLCAweDEwLCAweDAyLCAweDM0LCAweDI2LAorCTB4ZmEsIDB4ZTgsIDB4ZGUsIDB4Y2MsIDB4YjIsIDB4YTAsIDB4OTYsIDB4ODQsCisJMHg2YSwgMHg3OCwgMHg0ZSwgMHg1YywgMHgyMiwgMHgzMCwgMHgwNiwgMHgxNCwKKwkweGFjLCAweGJlLCAweDg4LCAweDlhLCAweGU0LCAweGY2LCAweGMwLCAweGQyLAorCTB4M2MsIDB4MmUsIDB4MTgsIDB4MGEsIDB4NzQsIDB4NjYsIDB4NTAsIDB4NDIsCisJMHg5ZSwgMHg4YywgMHhiYSwgMHhhOCwgMHhkNiwgMHhjNCwgMHhmMiwgMHhlMCwKKwkweDBlLCAweDFjLCAweDJhLCAweDM4LCAweDQ2LCAweDU0LCAweDYyLCAweDcwLAorCTB4ODIsIDB4OTAsIDB4YTYsIDB4YjQsIDB4Y2EsIDB4ZDgsIDB4ZWUsIDB4ZmMsCisJMHgxMiwgMHgwMCwgMHgzNiwgMHgyNCwgMHg1YSwgMHg0OCwgMHg3ZSwgMHg2YywKKwkweGIwLCAweGEyLCAweDk0LCAweDg2LCAweGY4LCAweGVhLCAweGRjLCAweGNlLAorCTB4MjAsIDB4MzIsIDB4MDQsIDB4MTYsIDB4NjgsIDB4N2EsIDB4NGMsIDB4NWUsCisJMHhlNiwgMHhmNCwgMHhjMiwgMHhkMCwgMHhhZSwgMHhiYywgMHg4YSwgMHg5OCwKKwkweDc2LCAweDY0LCAweDUyLCAweDQwLCAweDNlLCAweDJjLCAweDFhLCAweDA4LAorCTB4ZDQsIDB4YzYsIDB4ZjAsIDB4ZTIsIDB4OWMsIDB4OGUsIDB4YjgsIDB4YWEsCisJMHg0NCwgMHg1NiwgMHg2MCwgMHg3MiwgMHgwYywgMHgxZSwgMHgyOCwgMHgzYSwKKwkweDRhLCAweDU4LCAweDZlLCAweDdjLCAweDAyLCAweDEwLCAweDI2LCAweDM0LAorCTB4ZGEsIDB4YzgsIDB4ZmUsIDB4ZWMsIDB4OTIsIDB4ODAsIDB4YjYsIDB4YTQsCisJMHg3OCwgMHg2YSwgMHg1YywgMHg0ZSwgMHgzMCwgMHgyMiwgMHgxNCwgMHgwNiwKKwkweGU4LCAweGZhLCAweGNjLCAweGRlLCAweGEwLCAweGIyLCAweDg0LCAweDk2LAorCTB4MmUsIDB4M2MsIDB4MGEsIDB4MTgsIDB4NjYsIDB4NzQsIDB4NDIsIDB4NTAsCisJMHhiZSwgMHhhYywgMHg5YSwgMHg4OCwgMHhmNiwgMHhlNCwgMHhkMiwgMHhjMCwKKwkweDFjLCAweDBlLCAweDM4LCAweDJhLCAweDU0LCAweDQ2LCAweDcwLCAweDYyLAorCTB4OGMsIDB4OWUsIDB4YTgsIDB4YmEsIDB4YzQsIDB4ZDYsIDB4ZTAsIDB4ZjIKK307CitFWFBPUlRfU1lNQk9MKGNyYzdfYmVfc3luZHJvbWVfdGFibGUpOworCisvKioKKyAqIGNyYzcgLSB1cGRhdGUgdGhlIENSQzcgZm9yIHRoZSBkYXRhIGJ1ZmZlcgorICogQGNyYzogICAgIHByZXZpb3VzIENSQzcgdmFsdWUKKyAqIEBidWZmZXI6ICBkYXRhIHBvaW50ZXIKKyAqIEBsZW46ICAgICBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgorICogQ29udGV4dDogYW55CisgKgorICogUmV0dXJucyB0aGUgdXBkYXRlZCBDUkM3IHZhbHVlLgorICogVGhlIENSQzcgaXMgbGVmdC1hbGlnbmVkIGluIHRoZSBieXRlICh0aGUgbHNiaXQgaXMgYWx3YXlzIDApLCBhcyB0aGF0CisgKiBtYWtlcyB0aGUgY29tcHV0YXRpb24gZWFzaWVyLCBhbmQgYWxsIGNhbGxlcnMgd2FudCBpdCBpbiB0aGF0IGZvcm0uCisgKgorICovCit1OCBjcmM3X2JlKHU4IGNyYywgY29uc3QgdTggKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwl3aGlsZSAobGVuLS0pCisJCWNyYyA9IGNyYzdfYmVfYnl0ZShjcmMsICpidWZmZXIrKyk7CisJcmV0dXJuIGNyYzsKK30KK0VYUE9SVF9TWU1CT0woY3JjN19iZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiQ1JDNyBjYWxjdWxhdGlvbnMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzguYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2NyYzguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2I1OWNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvY3JjOC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTgorICogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorICogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpCQlLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjOC5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorCisvKgorICogY3JjOF9wb3B1bGF0ZV9tc2IgLSBmaWxsIGNyYyB0YWJsZSBmb3IgZ2l2ZW4gcG9seW5vbWlhbCBpbiByZXZlcnNlIGJpdCBvcmRlci4KKyAqCisgKiB0YWJsZToJdGFibGUgdG8gYmUgZmlsbGVkLgorICogcG9seW5vbWlhbDoJcG9seW5vbWlhbCBmb3Igd2hpY2ggdGFibGUgaXMgdG8gYmUgZmlsbGVkLgorICovCit2b2lkIGNyYzhfcG9wdWxhdGVfbXNiKHU4IHRhYmxlW0NSQzhfVEFCTEVfU0laRV0sIHU4IHBvbHlub21pYWwpCit7CisJaW50IGksIGo7CisJY29uc3QgdTggbXNiaXQgPSAweDgwOworCXU4IHQgPSBtc2JpdDsKKworCXRhYmxlWzBdID0gMDsKKworCWZvciAoaSA9IDE7IGkgPCBDUkM4X1RBQkxFX1NJWkU7IGkgKj0gMikgeworCQl0ID0gKHQgPDwgMSkgXiAodCAmIG1zYml0ID8gcG9seW5vbWlhbCA6IDApOworCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJdGFibGVbaStqXSA9IHRhYmxlW2pdIF4gdDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGNyYzhfcG9wdWxhdGVfbXNiKTsKKworLyoKKyAqIGNyYzhfcG9wdWxhdGVfbHNiIC0gZmlsbCBjcmMgdGFibGUgZm9yIGdpdmVuIHBvbHlub21pYWwgaW4gcmVndWxhciBiaXQgb3JkZXIuCisgKgorICogdGFibGU6CXRhYmxlIHRvIGJlIGZpbGxlZC4KKyAqIHBvbHlub21pYWw6CXBvbHlub21pYWwgZm9yIHdoaWNoIHRhYmxlIGlzIHRvIGJlIGZpbGxlZC4KKyAqLwordm9pZCBjcmM4X3BvcHVsYXRlX2xzYih1OCB0YWJsZVtDUkM4X1RBQkxFX1NJWkVdLCB1OCBwb2x5bm9taWFsKQoreworCWludCBpLCBqOworCXU4IHQgPSAxOworCisJdGFibGVbMF0gPSAwOworCisJZm9yIChpID0gKENSQzhfVEFCTEVfU0laRSA+PiAxKTsgaTsgaSA+Pj0gMSkgeworCQl0ID0gKHQgPj4gMSkgXiAodCAmIDEgPyBwb2x5bm9taWFsIDogMCk7CisJCWZvciAoaiA9IDA7IGogPCBDUkM4X1RBQkxFX1NJWkU7IGogKz0gMippKQorCQkJdGFibGVbaStqXSA9IHRhYmxlW2pdIF4gdDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGNyYzhfcG9wdWxhdGVfbHNiKTsKKworLyoKKyAqIGNyYzggLSBjYWxjdWxhdGUgYSBjcmM4IG92ZXIgdGhlIGdpdmVuIGlucHV0IGRhdGEuCisgKgorICogdGFibGU6IGNyYyB0YWJsZSB1c2VkIGZvciBjYWxjdWxhdGlvbi4KKyAqIHBkYXRhOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICogbmJ5dGVzOiBudW1iZXIgb2YgYnl0ZXMgaW4gZGF0YSBidWZmZXIuCisgKiBjcmM6CXByZXZpb3VzIHJldHVybmVkIGNyYzggdmFsdWUuCisgKi8KK3U4IGNyYzgoY29uc3QgdTggdGFibGVbQ1JDOF9UQUJMRV9TSVpFXSwgdTggKnBkYXRhLCBzaXplX3QgbmJ5dGVzLCB1OCBjcmMpCit7CisJLyogbG9vcCBvdmVyIHRoZSBidWZmZXIgZGF0YSAqLworCXdoaWxlIChuYnl0ZXMtLSA+IDApCisJCWNyYyA9IHRhYmxlWyhjcmMgXiAqcGRhdGErKykgJiAweGZmXTsKKworCXJldHVybiBjcmM7Cit9CitFWFBPUlRfU1lNQk9MKGNyYzgpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzggKGJ5IFdpbGxpYW1zLCBSb3NzIE4uKSBmdW5jdGlvbiIpOworTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2N0eXBlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MTlmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9jdHlwZS5jCkBAIC0wLDAgKzEsMzggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogIGxpbnV4L2xpYi9jdHlwZS5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCitjb25zdCB1bnNpZ25lZCBjaGFyIF9jdHlwZVtdID0geworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJCS8qIDAtNyAqLworX0MsX0N8X1MsX0N8X1MsX0N8X1MsX0N8X1MsX0N8X1MsX0MsX0MsCQkJLyogOC0xNSAqLworX0MsX0MsX0MsX0MsX0MsX0MsX0MsX0MsCQkJCS8qIDE2LTIzICovCitfQyxfQyxfQyxfQyxfQyxfQyxfQyxfQywJCQkJLyogMjQtMzEgKi8KK19TfF9TUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkJLyogMzItMzkgKi8KK19QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLAkJCQkvKiA0MC00NyAqLworX0QsX0QsX0QsX0QsX0QsX0QsX0QsX0QsCQkJCS8qIDQ4LTU1ICovCitfRCxfRCxfUCxfUCxfUCxfUCxfUCxfUCwJCQkJLyogNTYtNjMgKi8KK19QLF9VfF9YLF9VfF9YLF9VfF9YLF9VfF9YLF9VfF9YLF9VfF9YLF9VLAkJLyogNjQtNzEgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9VLAkJCQkvKiA3Mi03OSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsCQkJCS8qIDgwLTg3ICovCitfVSxfVSxfVSxfUCxfUCxfUCxfUCxfUCwJCQkJLyogODgtOTUgKi8KK19QLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MfF9YLF9MLAkJLyogOTYtMTAzICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwJCQkJLyogMTA0LTExMSAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0wsCQkJCS8qIDExMi0xMTkgKi8KK19MLF9MLF9MLF9QLF9QLF9QLF9QLF9DLAkJCQkvKiAxMjAtMTI3ICovCiswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLAkJCS8qIDEyOC0xNDMgKi8KKzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsCQkJLyogMTQ0LTE1OSAqLworX1N8X1NQLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLF9QLAkvKiAxNjAtMTc1ICovCitfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCxfUCwJLyogMTc2LTE5MSAqLworX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsX1UsCS8qIDE5Mi0yMDcgKi8KK19VLF9VLF9VLF9VLF9VLF9VLF9VLF9QLF9VLF9VLF9VLF9VLF9VLF9VLF9VLF9MLAkvKiAyMDgtMjIzICovCitfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCxfTCwJLyogMjI0LTIzOSAqLworX0wsX0wsX0wsX0wsX0wsX0wsX0wsX1AsX0wsX0wsX0wsX0wsX0wsX0wsX0wsX0x9OwkvKiAyNDAtMjU1ICovCisKK0VYUE9SVF9TWU1CT0woX2N0eXBlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlYnVnX2luZm8uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlYnVnX2luZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmRhZjc1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVidWdfaW5mby5jCkBAIC0wLDAgKzEsMjggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZW5zdXJlIGRlYnVnIGluZm9ybWF0aW9uIGZvciBzb21lIGNvcmUKKyAqIGRhdGEgc3RydWN0dXJlcyBpcyBpbmNsdWRlZCBpbiB0aGUgZmluYWwgaW1hZ2UgZXZlbiBmb3IKKyAqIENPTkZJR19ERUJVR19JTkZPX1JFRFVDRUQuIFBsZWFzZSBkbyBub3QgYWRkIGFjdHVhbCBjb2RlLiBIb3dldmVyLAorICogYWRkaW5nIGFwcHJvcHJpYXRlICNpbmNsdWRlcyBpcyBmaW5lLgorICovCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlIDxsaW51eC9jcmVkLmg+CisjaW5jbHVkZSA8bGludXgvY3J5cHRvLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9mc2NhY2hlLWNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvdGNwLmg+CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWJ1Z19sb2Nrcy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVidWdfbG9ja3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjRmZGYyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVidWdfbG9ja3MuYwpAQCAtMCwwICsxLDQ4IEBACisvKgorICogbGliL2RlYnVnX2xvY2tzLmMKKyAqCisgKiBHZW5lcmljIHBsYWNlIGZvciBjb21tb24gZGVidWdnaW5nIGZhY2lsaXRpZXMgZm9yIHZhcmlvdXMgbG9ja3M6CisgKiBzcGlubG9ja3MsIHJ3bG9ja3MsIG11dGV4ZXMgYW5kIHJ3c2Vtcy4KKyAqCisgKiBTdGFydGVkIGJ5IEluZ28gTW9sbmFyOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgorCisvKgorICogV2Ugd2FudCB0byB0dXJuIGFsbCBsb2NrLWRlYnVnZ2luZyBmYWNpbGl0aWVzIG9uL29mZiBhdCBvbmNlLAorICogdmlhIGEgZ2xvYmFsIGZsYWcuIFRoZSByZWFzb24gaXMgdGhhdCBvbmNlIGEgc2luZ2xlIGJ1ZyBoYXMgYmVlbgorICogZGV0ZWN0ZWQgYW5kIHJlcG9ydGVkLCB0aGVyZSBtaWdodCBiZSBjYXNjYWRlIG9mIGZvbGxvd3VwIGJ1Z3MKKyAqIHRoYXQgd291bGQganVzdCBtdWRkeSB0aGUgbG9nLiBTbyB3ZSByZXBvcnQgdGhlIGZpcnN0IG9uZSBhbmQKKyAqIHNodXQgdXAgYWZ0ZXIgdGhhdC4KKyAqLworaW50IGRlYnVnX2xvY2tzID0gMTsKK0VYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX2xvY2tzKTsKKworLyoKKyAqIFRoZSBsb2NraW5nLXRlc3RzdWl0ZSB1c2VzIDxkZWJ1Z19sb2Nrc19zaWxlbnQ+IHRvIGdldCBhCisgKiAnc2lsZW50IGZhaWx1cmUnOiBub3RoaW5nIGlzIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgd2hlbgorICogYSBsb2NraW5nIGJ1ZyBpcyBkZXRlY3RlZC4KKyAqLworaW50IGRlYnVnX2xvY2tzX3NpbGVudDsKK0VYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX2xvY2tzX3NpbGVudCk7CisKKy8qCisgKiBHZW5lcmljICd0dXJuIG9mZiBhbGwgbG9jayBkZWJ1Z2dpbmcnIGZ1bmN0aW9uOgorICovCitpbnQgZGVidWdfbG9ja3Nfb2ZmKHZvaWQpCit7CisJaWYgKGRlYnVnX2xvY2tzICYmIF9fZGVidWdfbG9ja3Nfb2ZmKCkpIHsKKwkJaWYgKCFkZWJ1Z19sb2Nrc19zaWxlbnQpIHsKKwkJCWNvbnNvbGVfdmVyYm9zZSgpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z19sb2Nrc19vZmYpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVidWdvYmplY3RzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWJ1Z29iamVjdHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWNiMDBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVidWdvYmplY3RzLmMKQEAgLTAsMCArMSwxMTU5IEBACisvKgorICogR2VuZXJpYyBpbmZyYXN0cnVjdHVyZSBmb3IgbGlmZXRpbWUgZGVidWdnaW5nIG9mIG9iamVjdHMuCisgKgorICogU3RhcnRlZCBieSBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICoKKyAqIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgIk9ERUJVRzogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnb2JqZWN0cy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvdGFza19zdGFjay5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisjaW5jbHVkZSA8bGludXgva21lbWxlYWsuaD4KKworI2RlZmluZSBPREVCVUdfSEFTSF9CSVRTCTE0CisjZGVmaW5lIE9ERUJVR19IQVNIX1NJWkUJKDEgPDwgT0RFQlVHX0hBU0hfQklUUykKKworI2RlZmluZSBPREVCVUdfUE9PTF9TSVpFCTEwMjQKKyNkZWZpbmUgT0RFQlVHX1BPT0xfTUlOX0xFVkVMCTI1NgorCisjZGVmaW5lIE9ERUJVR19DSFVOS19TSElGVAlQQUdFX1NISUZUCisjZGVmaW5lIE9ERUJVR19DSFVOS19TSVpFCSgxIDw8IE9ERUJVR19DSFVOS19TSElGVCkKKyNkZWZpbmUgT0RFQlVHX0NIVU5LX01BU0sJKH4oT0RFQlVHX0NIVU5LX1NJWkUgLSAxKSkKKworc3RydWN0IGRlYnVnX2J1Y2tldCB7CisJc3RydWN0IGhsaXN0X2hlYWQJbGlzdDsKKwlyYXdfc3BpbmxvY2tfdAkJbG9jazsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfYnVja2V0CW9ial9oYXNoW09ERUJVR19IQVNIX1NJWkVdOworCitzdGF0aWMgc3RydWN0IGRlYnVnX29iagkJb2JqX3N0YXRpY19wb29sW09ERUJVR19QT09MX1NJWkVdIF9faW5pdGRhdGE7CisKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHBvb2xfbG9jayk7CisKK3N0YXRpYyBITElTVF9IRUFEKG9ial9wb29sKTsKKworc3RhdGljIGludAkJCW9ial9wb29sX21pbl9mcmVlID0gT0RFQlVHX1BPT0xfU0laRTsKK3N0YXRpYyBpbnQJCQlvYmpfcG9vbF9mcmVlID0gT0RFQlVHX1BPT0xfU0laRTsKK3N0YXRpYyBpbnQJCQlvYmpfcG9vbF91c2VkOworc3RhdGljIGludAkJCW9ial9wb29sX21heF91c2VkOworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlCSpvYmpfY2FjaGU7CisKK3N0YXRpYyBpbnQJCQlkZWJ1Z19vYmplY3RzX21heGNoYWluIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19maXh1cHMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBpbnQJCQlkZWJ1Z19vYmplY3RzX3dhcm5pbmdzIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19lbmFibGVkIF9fcmVhZF9tb3N0bHkKKwkJCQk9IENPTkZJR19ERUJVR19PQkpFQ1RTX0VOQUJMRV9ERUZBVUxUOworc3RhdGljIGludAkJCWRlYnVnX29iamVjdHNfcG9vbF9zaXplIF9fcmVhZF9tb3N0bHkKKwkJCQk9IE9ERUJVR19QT09MX1NJWkU7CitzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19wb29sX21pbl9sZXZlbCBfX3JlYWRfbW9zdGx5CisJCQkJPSBPREVCVUdfUE9PTF9NSU5fTEVWRUw7CitzdGF0aWMgc3RydWN0IGRlYnVnX29ial9kZXNjcgkqZGVzY3JfdGVzdCAgX19yZWFkX21vc3RseTsKKworLyoKKyAqIFRyYWNrIG51bWJlcnMgb2Yga21lbV9jYWNoZV9hbGxvYygpL2ZyZWUoKSBjYWxscyBkb25lLgorICovCitzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19hbGxvY2F0ZWQ7CitzdGF0aWMgaW50CQkJZGVidWdfb2JqZWN0c19mcmVlZDsKKworc3RhdGljIHZvaWQgZnJlZV9vYmpfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIERFQ0xBUkVfV09SSyhkZWJ1Z19vYmpfd29yaywgZnJlZV9vYmpfd29yayk7CisKK3N0YXRpYyBpbnQgX19pbml0IGVuYWJsZV9vYmplY3RfZGVidWcoY2hhciAqc3RyKQoreworCWRlYnVnX29iamVjdHNfZW5hYmxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRpc2FibGVfb2JqZWN0X2RlYnVnKGNoYXIgKnN0cikKK3sKKwlkZWJ1Z19vYmplY3RzX2VuYWJsZWQgPSAwOworCXJldHVybiAwOworfQorCitlYXJseV9wYXJhbSgiZGVidWdfb2JqZWN0cyIsIGVuYWJsZV9vYmplY3RfZGVidWcpOworZWFybHlfcGFyYW0oIm5vX2RlYnVnX29iamVjdHMiLCBkaXNhYmxlX29iamVjdF9kZWJ1Zyk7CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfc3RhdGVzW09ERUJVR19TVEFURV9NQVhdID0geworCVtPREVCVUdfU1RBVEVfTk9ORV0JCT0gIm5vbmUiLAorCVtPREVCVUdfU1RBVEVfSU5JVF0JCT0gImluaXRpYWxpemVkIiwKKwlbT0RFQlVHX1NUQVRFX0lOQUNUSVZFXQkJPSAiaW5hY3RpdmUiLAorCVtPREVCVUdfU1RBVEVfQUNUSVZFXQkJPSAiYWN0aXZlIiwKKwlbT0RFQlVHX1NUQVRFX0RFU1RST1lFRF0JPSAiZGVzdHJveWVkIiwKKwlbT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRV0JPSAibm90IGF2YWlsYWJsZSIsCit9OworCitzdGF0aWMgdm9pZCBmaWxsX3Bvb2wodm9pZCkKK3sKKwlnZnBfdCBnZnAgPSBHRlBfQVRPTUlDIHwgX19HRlBfTk9SRVRSWSB8IF9fR0ZQX05PV0FSTjsKKwlzdHJ1Y3QgZGVidWdfb2JqICpuZXc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChsaWtlbHkob2JqX3Bvb2xfZnJlZSA+PSBkZWJ1Z19vYmplY3RzX3Bvb2xfbWluX2xldmVsKSkKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KCFvYmpfY2FjaGUpKQorCQlyZXR1cm47CisKKwl3aGlsZSAob2JqX3Bvb2xfZnJlZSA8IGRlYnVnX29iamVjdHNfcG9vbF9taW5fbGV2ZWwpIHsKKworCQluZXcgPSBrbWVtX2NhY2hlX3phbGxvYyhvYmpfY2FjaGUsIGdmcCk7CisJCWlmICghbmV3KQorCQkJcmV0dXJuOworCisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG9vbF9sb2NrLCBmbGFncyk7CisJCWhsaXN0X2FkZF9oZWFkKCZuZXctPm5vZGUsICZvYmpfcG9vbCk7CisJCWRlYnVnX29iamVjdHNfYWxsb2NhdGVkKys7CisJCW9ial9wb29sX2ZyZWUrKzsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2xfbG9jaywgZmxhZ3MpOworCX0KK30KKworLyoKKyAqIExvb2t1cCBhbiBvYmplY3QgaW4gdGhlIGhhc2ggYnVja2V0LgorICovCitzdGF0aWMgc3RydWN0IGRlYnVnX29iaiAqbG9va3VwX29iamVjdCh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfYnVja2V0ICpiKQoreworCXN0cnVjdCBkZWJ1Z19vYmogKm9iajsKKwlpbnQgY250ID0gMDsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG9iaiwgJmItPmxpc3QsIG5vZGUpIHsKKwkJY250Kys7CisJCWlmIChvYmotPm9iamVjdCA9PSBhZGRyKQorCQkJcmV0dXJuIG9iajsKKwl9CisJaWYgKGNudCA+IGRlYnVnX29iamVjdHNfbWF4Y2hhaW4pCisJCWRlYnVnX29iamVjdHNfbWF4Y2hhaW4gPSBjbnQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEFsbG9jYXRlIGEgbmV3IG9iamVjdC4gSWYgdGhlIHBvb2wgaXMgZW1wdHksIHN3aXRjaCBvZmYgdGhlIGRlYnVnZ2VyLgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgc3RydWN0IGRlYnVnX29iaiAqCithbGxvY19vYmplY3Qodm9pZCAqYWRkciwgc3RydWN0IGRlYnVnX2J1Y2tldCAqYiwgc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3IpCit7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqID0gTlVMTDsKKworCXJhd19zcGluX2xvY2soJnBvb2xfbG9jayk7CisJaWYgKG9ial9wb29sLmZpcnN0KSB7CisJCW9iagkgICAgPSBobGlzdF9lbnRyeShvYmpfcG9vbC5maXJzdCwgdHlwZW9mKCpvYmopLCBub2RlKTsKKworCQlvYmotPm9iamVjdCA9IGFkZHI7CisJCW9iai0+ZGVzY3IgID0gZGVzY3I7CisJCW9iai0+c3RhdGUgID0gT0RFQlVHX1NUQVRFX05PTkU7CisJCW9iai0+YXN0YXRlID0gMDsKKwkJaGxpc3RfZGVsKCZvYmotPm5vZGUpOworCisJCWhsaXN0X2FkZF9oZWFkKCZvYmotPm5vZGUsICZiLT5saXN0KTsKKworCQlvYmpfcG9vbF91c2VkKys7CisJCWlmIChvYmpfcG9vbF91c2VkID4gb2JqX3Bvb2xfbWF4X3VzZWQpCisJCQlvYmpfcG9vbF9tYXhfdXNlZCA9IG9ial9wb29sX3VzZWQ7CisKKwkJb2JqX3Bvb2xfZnJlZS0tOworCQlpZiAob2JqX3Bvb2xfZnJlZSA8IG9ial9wb29sX21pbl9mcmVlKQorCQkJb2JqX3Bvb2xfbWluX2ZyZWUgPSBvYmpfcG9vbF9mcmVlOworCX0KKwlyYXdfc3Bpbl91bmxvY2soJnBvb2xfbG9jayk7CisKKwlyZXR1cm4gb2JqOworfQorCisvKgorICogd29ya3F1ZXVlIGZ1bmN0aW9uIHRvIGZyZWUgb2JqZWN0cy4KKyAqCisgKiBUbyByZWR1Y2UgY29udGVudGlvbiBvbiB0aGUgZ2xvYmFsIHBvb2xfbG9jaywgdGhlIGFjdHVhbCBmcmVlaW5nIG9mCisgKiBkZWJ1ZyBvYmplY3RzIHdpbGwgYmUgZGVsYXllZCBpZiB0aGUgcG9vbF9sb2NrIGlzIGJ1c3kuIFdlIGFsc28gZnJlZQorICogdGhlIG9iamVjdHMgaW4gYSBiYXRjaCBvZiA0IGZvciBlYWNoIGxvY2svdW5sb2NrIGN5Y2xlLgorICovCisjZGVmaW5lIE9ERUJVR19GUkVFX0JBVENICTQKKworc3RhdGljIHZvaWQgZnJlZV9vYmpfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRlYnVnX29iaiAqb2Jqc1tPREVCVUdfRlJFRV9CQVRDSF07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWlmICghcmF3X3NwaW5fdHJ5bG9ja19pcnFzYXZlKCZwb29sX2xvY2ssIGZsYWdzKSkKKwkJcmV0dXJuOworCXdoaWxlIChvYmpfcG9vbF9mcmVlID49IGRlYnVnX29iamVjdHNfcG9vbF9zaXplICsgT0RFQlVHX0ZSRUVfQkFUQ0gpIHsKKwkJZm9yIChpID0gMDsgaSA8IE9ERUJVR19GUkVFX0JBVENIOyBpKyspIHsKKwkJCW9ianNbaV0gPSBobGlzdF9lbnRyeShvYmpfcG9vbC5maXJzdCwKKwkJCQkJICAgICAgdHlwZW9mKCpvYmpzWzBdKSwgbm9kZSk7CisJCQlobGlzdF9kZWwoJm9ianNbaV0tPm5vZGUpOworCQl9CisKKwkJb2JqX3Bvb2xfZnJlZSAtPSBPREVCVUdfRlJFRV9CQVRDSDsKKwkJZGVidWdfb2JqZWN0c19mcmVlZCArPSBPREVCVUdfRlJFRV9CQVRDSDsKKwkJLyoKKwkJICogV2UgcmVsZWFzZSBwb29sX2xvY2sgYWNyb3NzIGttZW1fY2FjaGVfZnJlZSgpIHRvCisJCSAqIGF2b2lkIGNvbnRlbnRpb24gb24gcG9vbF9sb2NrLgorCQkgKi8KKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2xfbG9jaywgZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgT0RFQlVHX0ZSRUVfQkFUQ0g7IGkrKykKKwkJCWttZW1fY2FjaGVfZnJlZShvYmpfY2FjaGUsIG9ianNbaV0pOworCQlpZiAoIXJhd19zcGluX3RyeWxvY2tfaXJxc2F2ZSgmcG9vbF9sb2NrLCBmbGFncykpCisJCQlyZXR1cm47CisJfQorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFB1dCB0aGUgb2JqZWN0IGJhY2sgaW50byB0aGUgcG9vbCBhbmQgc2NoZWR1bGUgd29yayB0byBmcmVlIG9iamVjdHMKKyAqIGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIHZvaWQgZnJlZV9vYmplY3Qoc3RydWN0IGRlYnVnX29iaiAqb2JqKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNjaGVkID0gMDsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcG9vbF9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBzY2hlZHVsZSB3b3JrIHdoZW4gdGhlIHBvb2wgaXMgZmlsbGVkIGFuZCB0aGUgY2FjaGUgaXMKKwkgKiBpbml0aWFsaXplZDoKKwkgKi8KKwlpZiAob2JqX3Bvb2xfZnJlZSA+IGRlYnVnX29iamVjdHNfcG9vbF9zaXplICYmIG9ial9jYWNoZSkKKwkJc2NoZWQgPSAxOworCWhsaXN0X2FkZF9oZWFkKCZvYmotPm5vZGUsICZvYmpfcG9vbCk7CisJb2JqX3Bvb2xfZnJlZSsrOworCW9ial9wb29sX3VzZWQtLTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbF9sb2NrLCBmbGFncyk7CisJaWYgKHNjaGVkKQorCQlzY2hlZHVsZV93b3JrKCZkZWJ1Z19vYmpfd29yayk7Cit9CisKKy8qCisgKiBXZSBydW4gb3V0IG9mIG1lbW9yeS4gVGhhdCBtZWFucyB3ZSBwcm9iYWJseSBoYXZlIHRvbnMgb2Ygb2JqZWN0cworICogYWxsb2NhdGVkLgorICovCitzdGF0aWMgdm9pZCBkZWJ1Z19vYmplY3RzX29vbSh2b2lkKQoreworCXN0cnVjdCBkZWJ1Z19idWNrZXQgKmRiID0gb2JqX2hhc2g7CisJc3RydWN0IGhsaXN0X25vZGUgKnRtcDsKKwlITElTVF9IRUFEKGZyZWVsaXN0KTsKKwlzdHJ1Y3QgZGVidWdfb2JqICpvYmo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXByX3dhcm4oIk91dCBvZiBtZW1vcnkuIE9ERUJVRyBkaXNhYmxlZFxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgT0RFQlVHX0hBU0hfU0laRTsgaSsrLCBkYisrKSB7CisJCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJaGxpc3RfbW92ZV9saXN0KCZkYi0+bGlzdCwgJmZyZWVsaXN0KTsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwkJLyogTm93IGZyZWUgdGhlbSAqLworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgdG1wLCAmZnJlZWxpc3QsIG5vZGUpIHsKKwkJCWhsaXN0X2RlbCgmb2JqLT5ub2RlKTsKKwkJCWZyZWVfb2JqZWN0KG9iaik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBXZSB1c2UgdGhlIHBmbiBvZiB0aGUgYWRkcmVzcyBmb3IgdGhlIGhhc2guIFRoYXQgd2F5IHdlIGNhbiBjaGVjaworICogZm9yIGZyZWVkIG9iamVjdHMgc2ltcGx5IGJ5IGNoZWNraW5nIHRoZSBhZmZlY3RlZCBidWNrZXQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfYnVja2V0ICpnZXRfYnVja2V0KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIGhhc2g7CisKKwloYXNoID0gaGFzaF9sb25nKChhZGRyID4+IE9ERUJVR19DSFVOS19TSElGVCksIE9ERUJVR19IQVNIX0JJVFMpOworCXJldHVybiAmb2JqX2hhc2hbaGFzaF07Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX3ByaW50X29iamVjdChzdHJ1Y3QgZGVidWdfb2JqICpvYmosIGNoYXIgKm1zZykKK3sKKwlzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjciA9IG9iai0+ZGVzY3I7CisJc3RhdGljIGludCBsaW1pdDsKKworCWlmIChsaW1pdCA8IDUgJiYgZGVzY3IgIT0gZGVzY3JfdGVzdCkgeworCQl2b2lkICpoaW50ID0gZGVzY3ItPmRlYnVnX2hpbnQgPworCQkJZGVzY3ItPmRlYnVnX2hpbnQob2JqLT5vYmplY3QpIDogTlVMTDsKKwkJbGltaXQrKzsKKwkJV0FSTigxLCBLRVJOX0VSUiAiT0RFQlVHOiAlcyAlcyAoYWN0aXZlIHN0YXRlICV1KSAiCisJCQkJICJvYmplY3QgdHlwZTogJXMgaGludDogJXBTXG4iLAorCQkJbXNnLCBvYmpfc3RhdGVzW29iai0+c3RhdGVdLCBvYmotPmFzdGF0ZSwKKwkJCWRlc2NyLT5uYW1lLCBoaW50KTsKKwl9CisJZGVidWdfb2JqZWN0c193YXJuaW5ncysrOworfQorCisvKgorICogVHJ5IHRvIHJlcGFpciB0aGUgZGFtYWdlLCBzbyB3ZSBoYXZlIGEgYmV0dGVyIGNoYW5jZSB0byBnZXQgdXNlZnVsCisgKiBkZWJ1ZyBvdXRwdXQuCisgKi8KK3N0YXRpYyBib29sCitkZWJ1Z19vYmplY3RfZml4dXAoYm9vbCAoKmZpeHVwKSh2b2lkICphZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSksCisJCSAgIHZvaWQgKiBhZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSkKK3sKKwlpZiAoZml4dXAgJiYgZml4dXAoYWRkciwgc3RhdGUpKSB7CisJCWRlYnVnX29iamVjdHNfZml4dXBzKys7CisJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX29iamVjdF9pc19vbl9zdGFjayh2b2lkICphZGRyLCBpbnQgb25zdGFjaykKK3sKKwlpbnQgaXNfb25fc3RhY2s7CisJc3RhdGljIGludCBsaW1pdDsKKworCWlmIChsaW1pdCA+IDQpCisJCXJldHVybjsKKworCWlzX29uX3N0YWNrID0gb2JqZWN0X2lzX29uX3N0YWNrKGFkZHIpOworCWlmIChpc19vbl9zdGFjayA9PSBvbnN0YWNrKQorCQlyZXR1cm47CisKKwlsaW1pdCsrOworCWlmIChpc19vbl9zdGFjaykKKwkJcHJfd2Fybigib2JqZWN0ICVwIGlzIG9uIHN0YWNrICVwLCBidXQgTk9UIGFubm90YXRlZC5cbiIsIGFkZHIsCisJCQkgdGFza19zdGFja19wYWdlKGN1cnJlbnQpKTsKKwllbHNlCisJCXByX3dhcm4oIm9iamVjdCAlcCBpcyBOT1Qgb24gc3RhY2sgJXAsIGJ1dCBhbm5vdGF0ZWQuXG4iLCBhZGRyLAorCQkJIHRhc2tfc3RhY2tfcGFnZShjdXJyZW50KSk7CisKKwlXQVJOX09OKDEpOworfQorCitzdGF0aWMgdm9pZAorX19kZWJ1Z19vYmplY3RfaW5pdCh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjciwgaW50IG9uc3RhY2spCit7CisJZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGU7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGI7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlmaWxsX3Bvb2woKTsKKworCWRiID0gZ2V0X2J1Y2tldCgodW5zaWduZWQgbG9uZykgYWRkcik7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwlvYmogPSBsb29rdXBfb2JqZWN0KGFkZHIsIGRiKTsKKwlpZiAoIW9iaikgeworCQlvYmogPSBhbGxvY19vYmplY3QoYWRkciwgZGIsIGRlc2NyKTsKKwkJaWYgKCFvYmopIHsKKwkJCWRlYnVnX29iamVjdHNfZW5hYmxlZCA9IDA7CisJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJCWRlYnVnX29iamVjdHNfb29tKCk7CisJCQlyZXR1cm47CisJCX0KKwkJZGVidWdfb2JqZWN0X2lzX29uX3N0YWNrKGFkZHIsIG9uc3RhY2spOworCX0KKworCXN3aXRjaCAob2JqLT5zdGF0ZSkgeworCWNhc2UgT0RFQlVHX1NUQVRFX05PTkU6CisJY2FzZSBPREVCVUdfU1RBVEVfSU5JVDoKKwljYXNlIE9ERUJVR19TVEFURV9JTkFDVElWRToKKwkJb2JqLT5zdGF0ZSA9IE9ERUJVR19TVEFURV9JTklUOworCQlicmVhazsKKworCWNhc2UgT0RFQlVHX1NUQVRFX0FDVElWRToKKwkJZGVidWdfcHJpbnRfb2JqZWN0KG9iaiwgImluaXQiKTsKKwkJc3RhdGUgPSBvYmotPnN0YXRlOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJZGVidWdfb2JqZWN0X2ZpeHVwKGRlc2NyLT5maXh1cF9pbml0LCBhZGRyLCBzdGF0ZSk7CisJCXJldHVybjsKKworCWNhc2UgT0RFQlVHX1NUQVRFX0RFU1RST1lFRDoKKwkJZGVidWdfcHJpbnRfb2JqZWN0KG9iaiwgImluaXQiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogZGVidWdfb2JqZWN0X2luaXQgLSBkZWJ1ZyBjaGVja3Mgd2hlbiBhbiBvYmplY3QgaXMgaW5pdGlhbGl6ZWQKKyAqIEBhZGRyOglhZGRyZXNzIG9mIHRoZSBvYmplY3QKKyAqIEBkZXNjcjoJcG9pbnRlciB0byBhbiBvYmplY3Qgc3BlY2lmaWMgZGVidWcgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKi8KK3ZvaWQgZGVidWdfb2JqZWN0X2luaXQodm9pZCAqYWRkciwgc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3IpCit7CisJaWYgKCFkZWJ1Z19vYmplY3RzX2VuYWJsZWQpCisJCXJldHVybjsKKworCV9fZGVidWdfb2JqZWN0X2luaXQoYWRkciwgZGVzY3IsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdfb2JqZWN0X2luaXQpOworCisvKioKKyAqIGRlYnVnX29iamVjdF9pbml0X29uX3N0YWNrIC0gZGVidWcgY2hlY2tzIHdoZW4gYW4gb2JqZWN0IG9uIHN0YWNrIGlzCisgKgkJCQlpbml0aWFsaXplZAorICogQGFkZHI6CWFkZHJlc3Mgb2YgdGhlIG9iamVjdAorICogQGRlc2NyOglwb2ludGVyIHRvIGFuIG9iamVjdCBzcGVjaWZpYyBkZWJ1ZyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqLwordm9pZCBkZWJ1Z19vYmplY3RfaW5pdF9vbl9zdGFjayh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcikKK3sKKwlpZiAoIWRlYnVnX29iamVjdHNfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJX19kZWJ1Z19vYmplY3RfaW5pdChhZGRyLCBkZXNjciwgMSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z19vYmplY3RfaW5pdF9vbl9zdGFjayk7CisKKy8qKgorICogZGVidWdfb2JqZWN0X2FjdGl2YXRlIC0gZGVidWcgY2hlY2tzIHdoZW4gYW4gb2JqZWN0IGlzIGFjdGl2YXRlZAorICogQGFkZHI6CWFkZHJlc3Mgb2YgdGhlIG9iamVjdAorICogQGRlc2NyOglwb2ludGVyIHRvIGFuIG9iamVjdCBzcGVjaWZpYyBkZWJ1ZyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqIFJldHVybnMgMCBmb3Igc3VjY2VzcywgLUVJTlZBTCBmb3IgY2hlY2sgZmFpbGVkLgorICovCitpbnQgZGVidWdfb2JqZWN0X2FjdGl2YXRlKHZvaWQgKmFkZHIsIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgKmRlc2NyKQoreworCWVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlOworCXN0cnVjdCBkZWJ1Z19idWNrZXQgKmRiOworCXN0cnVjdCBkZWJ1Z19vYmogKm9iajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJc3RydWN0IGRlYnVnX29iaiBvID0geyAub2JqZWN0ID0gYWRkciwKKwkJCSAgICAgICAuc3RhdGUgPSBPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFLAorCQkJICAgICAgIC5kZXNjciA9IGRlc2NyIH07CisKKwlpZiAoIWRlYnVnX29iamVjdHNfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlkYiA9IGdldF9idWNrZXQoKHVuc2lnbmVkIGxvbmcpIGFkZHIpOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJb2JqID0gbG9va3VwX29iamVjdChhZGRyLCBkYik7CisJaWYgKG9iaikgeworCQlzd2l0Y2ggKG9iai0+c3RhdGUpIHsKKwkJY2FzZSBPREVCVUdfU1RBVEVfSU5JVDoKKwkJY2FzZSBPREVCVUdfU1RBVEVfSU5BQ1RJVkU6CisJCQlvYmotPnN0YXRlID0gT0RFQlVHX1NUQVRFX0FDVElWRTsKKwkJCXJldCA9IDA7CisJCQlicmVhazsKKworCQljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCQlkZWJ1Z19wcmludF9vYmplY3Qob2JqLCAiYWN0aXZhdGUiKTsKKwkJCXN0YXRlID0gb2JqLT5zdGF0ZTsKKwkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQkJcmV0ID0gZGVidWdfb2JqZWN0X2ZpeHVwKGRlc2NyLT5maXh1cF9hY3RpdmF0ZSwgYWRkciwgc3RhdGUpOworCQkJcmV0dXJuIHJldCA/IDAgOiAtRUlOVkFMOworCisJCWNhc2UgT0RFQlVHX1NUQVRFX0RFU1RST1lFRDoKKwkJCWRlYnVnX3ByaW50X29iamVjdChvYmosICJhY3RpdmF0ZSIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gMDsKKwkJCWJyZWFrOworCQl9CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCS8qCisJICogV2UgYXJlIGhlcmUgd2hlbiBhIHN0YXRpYyBvYmplY3QgaXMgYWN0aXZhdGVkLiBXZQorCSAqIGxldCB0aGUgdHlwZSBzcGVjaWZpYyBjb2RlIGNvbmZpcm0gd2hldGhlciB0aGlzIGlzCisJICogdHJ1ZSBvciBub3QuIGlmIHRydWUsIHdlIGp1c3QgbWFrZSBzdXJlIHRoYXQgdGhlCisJICogc3RhdGljIG9iamVjdCBpcyB0cmFja2VkIGluIHRoZSBvYmplY3QgdHJhY2tlci4gSWYKKwkgKiBub3QsIHRoaXMgbXVzdCBiZSBhIGJ1Zywgc28gd2UgdHJ5IHRvIGZpeCBpdCB1cC4KKwkgKi8KKwlpZiAoZGVzY3ItPmlzX3N0YXRpY19vYmplY3QgJiYgZGVzY3ItPmlzX3N0YXRpY19vYmplY3QoYWRkcikpIHsKKwkJLyogdHJhY2sgdGhpcyBzdGF0aWMgb2JqZWN0ICovCisJCWRlYnVnX29iamVjdF9pbml0KGFkZHIsIGRlc2NyKTsKKwkJZGVidWdfb2JqZWN0X2FjdGl2YXRlKGFkZHIsIGRlc2NyKTsKKwl9IGVsc2UgeworCQlkZWJ1Z19wcmludF9vYmplY3QoJm8sICJhY3RpdmF0ZSIpOworCQlyZXQgPSBkZWJ1Z19vYmplY3RfZml4dXAoZGVzY3ItPmZpeHVwX2FjdGl2YXRlLCBhZGRyLAorCQkJCQlPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFKTsKKwkJcmV0dXJuIHJldCA/IDAgOiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRlYnVnX29iamVjdF9hY3RpdmF0ZSk7CisKKy8qKgorICogZGVidWdfb2JqZWN0X2RlYWN0aXZhdGUgLSBkZWJ1ZyBjaGVja3Mgd2hlbiBhbiBvYmplY3QgaXMgZGVhY3RpdmF0ZWQKKyAqIEBhZGRyOglhZGRyZXNzIG9mIHRoZSBvYmplY3QKKyAqIEBkZXNjcjoJcG9pbnRlciB0byBhbiBvYmplY3Qgc3BlY2lmaWMgZGVidWcgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKi8KK3ZvaWQgZGVidWdfb2JqZWN0X2RlYWN0aXZhdGUodm9pZCAqYWRkciwgc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3IpCit7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGI7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRlYnVnX29iamVjdHNfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJZGIgPSBnZXRfYnVja2V0KCh1bnNpZ25lZCBsb25nKSBhZGRyKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCW9iaiA9IGxvb2t1cF9vYmplY3QoYWRkciwgZGIpOworCWlmIChvYmopIHsKKwkJc3dpdGNoIChvYmotPnN0YXRlKSB7CisJCWNhc2UgT0RFQlVHX1NUQVRFX0lOSVQ6CisJCWNhc2UgT0RFQlVHX1NUQVRFX0lOQUNUSVZFOgorCQljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCQlpZiAoIW9iai0+YXN0YXRlKQorCQkJCW9iai0+c3RhdGUgPSBPREVCVUdfU1RBVEVfSU5BQ1RJVkU7CisJCQllbHNlCisJCQkJZGVidWdfcHJpbnRfb2JqZWN0KG9iaiwgImRlYWN0aXZhdGUiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0RFQlVHX1NUQVRFX0RFU1RST1lFRDoKKwkJCWRlYnVnX3ByaW50X29iamVjdChvYmosICJkZWFjdGl2YXRlIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3RydWN0IGRlYnVnX29iaiBvID0geyAub2JqZWN0ID0gYWRkciwKKwkJCQkgICAgICAgLnN0YXRlID0gT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRSwKKwkJCQkgICAgICAgLmRlc2NyID0gZGVzY3IgfTsKKworCQlkZWJ1Z19wcmludF9vYmplY3QoJm8sICJkZWFjdGl2YXRlIik7CisJfQorCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z19vYmplY3RfZGVhY3RpdmF0ZSk7CisKKy8qKgorICogZGVidWdfb2JqZWN0X2Rlc3Ryb3kgLSBkZWJ1ZyBjaGVja3Mgd2hlbiBhbiBvYmplY3QgaXMgZGVzdHJveWVkCisgKiBAYWRkcjoJYWRkcmVzcyBvZiB0aGUgb2JqZWN0CisgKiBAZGVzY3I6CXBvaW50ZXIgdG8gYW4gb2JqZWN0IHNwZWNpZmljIGRlYnVnIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorICovCit2b2lkIGRlYnVnX29iamVjdF9kZXN0cm95KHZvaWQgKmFkZHIsIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgKmRlc2NyKQoreworCWVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlOworCXN0cnVjdCBkZWJ1Z19idWNrZXQgKmRiOworCXN0cnVjdCBkZWJ1Z19vYmogKm9iajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkZWJ1Z19vYmplY3RzX2VuYWJsZWQpCisJCXJldHVybjsKKworCWRiID0gZ2V0X2J1Y2tldCgodW5zaWduZWQgbG9uZykgYWRkcik7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwlvYmogPSBsb29rdXBfb2JqZWN0KGFkZHIsIGRiKTsKKwlpZiAoIW9iaikKKwkJZ290byBvdXRfdW5sb2NrOworCisJc3dpdGNoIChvYmotPnN0YXRlKSB7CisJY2FzZSBPREVCVUdfU1RBVEVfTk9ORToKKwljYXNlIE9ERUJVR19TVEFURV9JTklUOgorCWNhc2UgT0RFQlVHX1NUQVRFX0lOQUNUSVZFOgorCQlvYmotPnN0YXRlID0gT0RFQlVHX1NUQVRFX0RFU1RST1lFRDsKKwkJYnJlYWs7CisJY2FzZSBPREVCVUdfU1RBVEVfQUNUSVZFOgorCQlkZWJ1Z19wcmludF9vYmplY3Qob2JqLCAiZGVzdHJveSIpOworCQlzdGF0ZSA9IG9iai0+c3RhdGU7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQlkZWJ1Z19vYmplY3RfZml4dXAoZGVzY3ItPmZpeHVwX2Rlc3Ryb3ksIGFkZHIsIHN0YXRlKTsKKwkJcmV0dXJuOworCisJY2FzZSBPREVCVUdfU1RBVEVfREVTVFJPWUVEOgorCQlkZWJ1Z19wcmludF9vYmplY3Qob2JqLCAiZGVzdHJveSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CitvdXRfdW5sb2NrOgorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdfb2JqZWN0X2Rlc3Ryb3kpOworCisvKioKKyAqIGRlYnVnX29iamVjdF9mcmVlIC0gZGVidWcgY2hlY2tzIHdoZW4gYW4gb2JqZWN0IGlzIGZyZWVkCisgKiBAYWRkcjoJYWRkcmVzcyBvZiB0aGUgb2JqZWN0CisgKiBAZGVzY3I6CXBvaW50ZXIgdG8gYW4gb2JqZWN0IHNwZWNpZmljIGRlYnVnIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorICovCit2b2lkIGRlYnVnX29iamVjdF9mcmVlKHZvaWQgKmFkZHIsIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgKmRlc2NyKQoreworCWVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlOworCXN0cnVjdCBkZWJ1Z19idWNrZXQgKmRiOworCXN0cnVjdCBkZWJ1Z19vYmogKm9iajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFkZWJ1Z19vYmplY3RzX2VuYWJsZWQpCisJCXJldHVybjsKKworCWRiID0gZ2V0X2J1Y2tldCgodW5zaWduZWQgbG9uZykgYWRkcik7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmRiLT5sb2NrLCBmbGFncyk7CisKKwlvYmogPSBsb29rdXBfb2JqZWN0KGFkZHIsIGRiKTsKKwlpZiAoIW9iaikKKwkJZ290byBvdXRfdW5sb2NrOworCisJc3dpdGNoIChvYmotPnN0YXRlKSB7CisJY2FzZSBPREVCVUdfU1RBVEVfQUNUSVZFOgorCQlkZWJ1Z19wcmludF9vYmplY3Qob2JqLCAiZnJlZSIpOworCQlzdGF0ZSA9IG9iai0+c3RhdGU7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQlkZWJ1Z19vYmplY3RfZml4dXAoZGVzY3ItPmZpeHVwX2ZyZWUsIGFkZHIsIHN0YXRlKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWhsaXN0X2RlbCgmb2JqLT5ub2RlKTsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCWZyZWVfb2JqZWN0KG9iaik7CisJCXJldHVybjsKKwl9CitvdXRfdW5sb2NrOgorCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVidWdfb2JqZWN0X2ZyZWUpOworCisvKioKKyAqIGRlYnVnX29iamVjdF9hc3NlcnRfaW5pdCAtIGRlYnVnIGNoZWNrcyB3aGVuIG9iamVjdCBzaG91bGQgYmUgaW5pdC1lZAorICogQGFkZHI6CWFkZHJlc3Mgb2YgdGhlIG9iamVjdAorICogQGRlc2NyOglwb2ludGVyIHRvIGFuIG9iamVjdCBzcGVjaWZpYyBkZWJ1ZyBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKyAqLwordm9pZCBkZWJ1Z19vYmplY3RfYXNzZXJ0X2luaXQodm9pZCAqYWRkciwgc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3IpCit7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGI7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRlYnVnX29iamVjdHNfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJZGIgPSBnZXRfYnVja2V0KCh1bnNpZ25lZCBsb25nKSBhZGRyKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCW9iaiA9IGxvb2t1cF9vYmplY3QoYWRkciwgZGIpOworCWlmICghb2JqKSB7CisJCXN0cnVjdCBkZWJ1Z19vYmogbyA9IHsgLm9iamVjdCA9IGFkZHIsCisJCQkJICAgICAgIC5zdGF0ZSA9IE9ERUJVR19TVEFURV9OT1RBVkFJTEFCTEUsCisJCQkJICAgICAgIC5kZXNjciA9IGRlc2NyIH07CisKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJCS8qCisJCSAqIE1heWJlIHRoZSBvYmplY3QgaXMgc3RhdGljLCBhbmQgd2UgbGV0IHRoZSB0eXBlIHNwZWNpZmljCisJCSAqIGNvZGUgY29uZmlybS4gVHJhY2sgdGhpcyBzdGF0aWMgb2JqZWN0IGlmIHRydWUsIGVsc2UgaW52b2tlCisJCSAqIGZpeHVwLgorCQkgKi8KKwkJaWYgKGRlc2NyLT5pc19zdGF0aWNfb2JqZWN0ICYmIGRlc2NyLT5pc19zdGF0aWNfb2JqZWN0KGFkZHIpKSB7CisJCQkvKiBUcmFjayB0aGlzIHN0YXRpYyBvYmplY3QgKi8KKwkJCWRlYnVnX29iamVjdF9pbml0KGFkZHIsIGRlc2NyKTsKKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50X29iamVjdCgmbywgImFzc2VydF9pbml0Iik7CisJCQlkZWJ1Z19vYmplY3RfZml4dXAoZGVzY3ItPmZpeHVwX2Fzc2VydF9pbml0LCBhZGRyLAorCQkJCQkgICBPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z19vYmplY3RfYXNzZXJ0X2luaXQpOworCisvKioKKyAqIGRlYnVnX29iamVjdF9hY3RpdmVfc3RhdGUgLSBkZWJ1ZyBjaGVja3Mgb2JqZWN0IHVzYWdlIHN0YXRlIG1hY2hpbmUKKyAqIEBhZGRyOglhZGRyZXNzIG9mIHRoZSBvYmplY3QKKyAqIEBkZXNjcjoJcG9pbnRlciB0byBhbiBvYmplY3Qgc3BlY2lmaWMgZGVidWcgZGVzY3JpcHRpb24gc3RydWN0dXJlCisgKiBAZXhwZWN0OglleHBlY3RlZCBzdGF0ZQorICogQG5leHQ6CXN0YXRlIHRvIG1vdmUgdG8gaWYgZXhwZWN0ZWQgc3RhdGUgaXMgZm91bmQKKyAqLwordm9pZAorZGVidWdfb2JqZWN0X2FjdGl2ZV9zdGF0ZSh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjciwKKwkJCSAgdW5zaWduZWQgaW50IGV4cGVjdCwgdW5zaWduZWQgaW50IG5leHQpCit7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGI7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWRlYnVnX29iamVjdHNfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJZGIgPSBnZXRfYnVja2V0KCh1bnNpZ25lZCBsb25nKSBhZGRyKTsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZGItPmxvY2ssIGZsYWdzKTsKKworCW9iaiA9IGxvb2t1cF9vYmplY3QoYWRkciwgZGIpOworCWlmIChvYmopIHsKKwkJc3dpdGNoIChvYmotPnN0YXRlKSB7CisJCWNhc2UgT0RFQlVHX1NUQVRFX0FDVElWRToKKwkJCWlmIChvYmotPmFzdGF0ZSA9PSBleHBlY3QpCisJCQkJb2JqLT5hc3RhdGUgPSBuZXh0OworCQkJZWxzZQorCQkJCWRlYnVnX3ByaW50X29iamVjdChvYmosICJhY3RpdmVfc3RhdGUiKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlkZWJ1Z19wcmludF9vYmplY3Qob2JqLCAiYWN0aXZlX3N0YXRlIik7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCXN0cnVjdCBkZWJ1Z19vYmogbyA9IHsgLm9iamVjdCA9IGFkZHIsCisJCQkJICAgICAgIC5zdGF0ZSA9IE9ERUJVR19TVEFURV9OT1RBVkFJTEFCTEUsCisJCQkJICAgICAgIC5kZXNjciA9IGRlc2NyIH07CisKKwkJZGVidWdfcHJpbnRfb2JqZWN0KCZvLCAiYWN0aXZlX3N0YXRlIik7CisJfQorCisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChkZWJ1Z19vYmplY3RfYWN0aXZlX3N0YXRlKTsKKworI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX0ZSRUUKK3N0YXRpYyB2b2lkIF9fZGVidWdfY2hlY2tfbm9fb2JqX2ZyZWVkKGNvbnN0IHZvaWQgKmFkZHJlc3MsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCBvYWRkciwgc2FkZHIsIGVhZGRyLCBwYWRkciwgY2h1bmtzOworCXN0cnVjdCBobGlzdF9ub2RlICp0bXA7CisJSExJU1RfSEVBRChmcmVlbGlzdCk7CisJc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3I7CisJZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGU7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGI7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqOworCWludCBjbnQ7CisKKwlzYWRkciA9ICh1bnNpZ25lZCBsb25nKSBhZGRyZXNzOworCWVhZGRyID0gc2FkZHIgKyBzaXplOworCXBhZGRyID0gc2FkZHIgJiBPREVCVUdfQ0hVTktfTUFTSzsKKwljaHVua3MgPSAoKGVhZGRyIC0gcGFkZHIpICsgKE9ERUJVR19DSFVOS19TSVpFIC0gMSkpOworCWNodW5rcyA+Pj0gT0RFQlVHX0NIVU5LX1NISUZUOworCisJZm9yICg7Y2h1bmtzID4gMDsgY2h1bmtzLS0sIHBhZGRyICs9IE9ERUJVR19DSFVOS19TSVpFKSB7CisJCWRiID0gZ2V0X2J1Y2tldChwYWRkcik7CisKK3JlcGVhdDoKKwkJY250ID0gMDsKKwkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgdG1wLCAmZGItPmxpc3QsIG5vZGUpIHsKKwkJCWNudCsrOworCQkJb2FkZHIgPSAodW5zaWduZWQgbG9uZykgb2JqLT5vYmplY3Q7CisJCQlpZiAob2FkZHIgPCBzYWRkciB8fCBvYWRkciA+PSBlYWRkcikKKwkJCQljb250aW51ZTsKKworCQkJc3dpdGNoIChvYmotPnN0YXRlKSB7CisJCQljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCQkJZGVidWdfcHJpbnRfb2JqZWN0KG9iaiwgImZyZWUiKTsKKwkJCQlkZXNjciA9IG9iai0+ZGVzY3I7CisJCQkJc3RhdGUgPSBvYmotPnN0YXRlOworCQkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCQkJCWRlYnVnX29iamVjdF9maXh1cChkZXNjci0+Zml4dXBfZnJlZSwKKwkJCQkJCSAgICh2b2lkICopIG9hZGRyLCBzdGF0ZSk7CisJCQkJZ290byByZXBlYXQ7CisJCQlkZWZhdWx0OgorCQkJCWhsaXN0X2RlbCgmb2JqLT5ub2RlKTsKKwkJCQlobGlzdF9hZGRfaGVhZCgmb2JqLT5ub2RlLCAmZnJlZWxpc3QpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJCS8qIE5vdyBmcmVlIHRoZW0gKi8KKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvYmosIHRtcCwgJmZyZWVsaXN0LCBub2RlKSB7CisJCQlobGlzdF9kZWwoJm9iai0+bm9kZSk7CisJCQlmcmVlX29iamVjdChvYmopOworCQl9CisKKwkJaWYgKGNudCA+IGRlYnVnX29iamVjdHNfbWF4Y2hhaW4pCisJCQlkZWJ1Z19vYmplY3RzX21heGNoYWluID0gY250OworCX0KK30KKwordm9pZCBkZWJ1Z19jaGVja19ub19vYmpfZnJlZWQoY29uc3Qgdm9pZCAqYWRkcmVzcywgdW5zaWduZWQgbG9uZyBzaXplKQoreworCWlmIChkZWJ1Z19vYmplY3RzX2VuYWJsZWQpCisJCV9fZGVidWdfY2hlY2tfbm9fb2JqX2ZyZWVkKGFkZHJlc3MsIHNpemUpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKworc3RhdGljIGludCBkZWJ1Z19zdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzZXFfcHJpbnRmKG0sICJtYXhfY2hhaW4gICAgIDolZFxuIiwgZGVidWdfb2JqZWN0c19tYXhjaGFpbik7CisJc2VxX3ByaW50ZihtLCAid2FybmluZ3MgICAgICA6JWRcbiIsIGRlYnVnX29iamVjdHNfd2FybmluZ3MpOworCXNlcV9wcmludGYobSwgImZpeHVwcyAgICAgICAgOiVkXG4iLCBkZWJ1Z19vYmplY3RzX2ZpeHVwcyk7CisJc2VxX3ByaW50ZihtLCAicG9vbF9mcmVlICAgICA6JWRcbiIsIG9ial9wb29sX2ZyZWUpOworCXNlcV9wcmludGYobSwgInBvb2xfbWluX2ZyZWUgOiVkXG4iLCBvYmpfcG9vbF9taW5fZnJlZSk7CisJc2VxX3ByaW50ZihtLCAicG9vbF91c2VkICAgICA6JWRcbiIsIG9ial9wb29sX3VzZWQpOworCXNlcV9wcmludGYobSwgInBvb2xfbWF4X3VzZWQgOiVkXG4iLCBvYmpfcG9vbF9tYXhfdXNlZCk7CisJc2VxX3ByaW50ZihtLCAib2Jqc19hbGxvY2F0ZWQ6JWRcbiIsIGRlYnVnX29iamVjdHNfYWxsb2NhdGVkKTsKKwlzZXFfcHJpbnRmKG0sICJvYmpzX2ZyZWVkICAgIDolZFxuIiwgZGVidWdfb2JqZWN0c19mcmVlZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfc3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgZGVidWdfc3RhdHNfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRlYnVnX3N0YXRzX2ZvcHMgPSB7CisJLm9wZW4JCT0gZGVidWdfc3RhdHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNpbmdsZV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZGVidWdfb2JqZWN0c19pbml0X2RlYnVnZnModm9pZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkYmdkaXIsICpkYmdzdGF0czsKKworCWlmICghZGVidWdfb2JqZWN0c19lbmFibGVkKQorCQlyZXR1cm4gMDsKKworCWRiZ2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGVidWdfb2JqZWN0cyIsIE5VTEwpOworCWlmICghZGJnZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRiZ3N0YXRzID0gZGVidWdmc19jcmVhdGVfZmlsZSgic3RhdHMiLCAwNDQ0LCBkYmdkaXIsIE5VTEwsCisJCQkJICAgICAgICZkZWJ1Z19zdGF0c19mb3BzKTsKKwlpZiAoIWRiZ3N0YXRzKQorCQlnb3RvIGVycjsKKworCXJldHVybiAwOworCitlcnI6CisJZGVidWdmc19yZW1vdmUoZGJnZGlyKTsKKworCXJldHVybiAtRU5PTUVNOworfQorX19pbml0Y2FsbChkZWJ1Z19vYmplY3RzX2luaXRfZGVidWdmcyk7CisKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfb2JqZWN0c19pbml0X2RlYnVnZnModm9pZCkgeyB9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTX1NFTEZURVNUCisKKy8qIFJhbmRvbSBkYXRhIHN0cnVjdHVyZSBmb3IgdGhlIHNlbGYgdGVzdCAqLworc3RydWN0IHNlbGZfdGVzdCB7CisJdW5zaWduZWQgbG9uZwlkdW1teTFbNl07CisJaW50CQlzdGF0aWNfaW5pdDsKKwl1bnNpZ25lZCBsb25nCWR1bW15MlszXTsKK307CisKK3N0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgZGVzY3JfdHlwZV90ZXN0OworCitzdGF0aWMgYm9vbCBfX2luaXQgaXNfc3RhdGljX29iamVjdCh2b2lkICphZGRyKQoreworCXN0cnVjdCBzZWxmX3Rlc3QgKm9iaiA9IGFkZHI7CisKKwlyZXR1cm4gb2JqLT5zdGF0aWNfaW5pdDsKK30KKworLyoKKyAqIGZpeHVwX2luaXQgaXMgY2FsbGVkIHdoZW46CisgKiAtIGFuIGFjdGl2ZSBvYmplY3QgaXMgaW5pdGlhbGl6ZWQKKyAqLworc3RhdGljIGJvb2wgX19pbml0IGZpeHVwX2luaXQodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IHNlbGZfdGVzdCAqb2JqID0gYWRkcjsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCWRlYnVnX29iamVjdF9kZWFjdGl2YXRlKG9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJCWRlYnVnX29iamVjdF9pbml0KG9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qCisgKiBmaXh1cF9hY3RpdmF0ZSBpcyBjYWxsZWQgd2hlbjoKKyAqIC0gYW4gYWN0aXZlIG9iamVjdCBpcyBhY3RpdmF0ZWQKKyAqIC0gYW4gdW5rbm93biBub24tc3RhdGljIG9iamVjdCBpcyBhY3RpdmF0ZWQKKyAqLworc3RhdGljIGJvb2wgX19pbml0IGZpeHVwX2FjdGl2YXRlKHZvaWQgKmFkZHIsIGVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlKQoreworCXN0cnVjdCBzZWxmX3Rlc3QgKm9iaiA9IGFkZHI7CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCWRlYnVnX29iamVjdF9kZWFjdGl2YXRlKG9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJCWRlYnVnX29iamVjdF9hY3RpdmF0ZShvYmosICZkZXNjcl90eXBlX3Rlc3QpOworCQlyZXR1cm4gdHJ1ZTsKKworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKKy8qCisgKiBmaXh1cF9kZXN0cm95IGlzIGNhbGxlZCB3aGVuOgorICogLSBhbiBhY3RpdmUgb2JqZWN0IGlzIGRlc3Ryb3llZAorICovCitzdGF0aWMgYm9vbCBfX2luaXQgZml4dXBfZGVzdHJveSh2b2lkICphZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3Qgc2VsZl90ZXN0ICpvYmogPSBhZGRyOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgT0RFQlVHX1NUQVRFX0FDVElWRToKKwkJZGVidWdfb2JqZWN0X2RlYWN0aXZhdGUob2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwkJZGVidWdfb2JqZWN0X2Rlc3Ryb3kob2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwkJcmV0dXJuIHRydWU7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworLyoKKyAqIGZpeHVwX2ZyZWUgaXMgY2FsbGVkIHdoZW46CisgKiAtIGFuIGFjdGl2ZSBvYmplY3QgaXMgZnJlZWQKKyAqLworc3RhdGljIGJvb2wgX19pbml0IGZpeHVwX2ZyZWUodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IHNlbGZfdGVzdCAqb2JqID0gYWRkcjsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIE9ERUJVR19TVEFURV9BQ1RJVkU6CisJCWRlYnVnX29iamVjdF9kZWFjdGl2YXRlKG9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJCWRlYnVnX29iamVjdF9mcmVlKG9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0CitjaGVja19yZXN1bHRzKHZvaWQgKmFkZHIsIGVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlLCBpbnQgZml4dXBzLCBpbnQgd2FybmluZ3MpCit7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGI7CisJc3RydWN0IGRlYnVnX29iaiAqb2JqOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlcyA9IC1FSU5WQUw7CisKKwlkYiA9IGdldF9idWNrZXQoKHVuc2lnbmVkIGxvbmcpIGFkZHIpOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJb2JqID0gbG9va3VwX29iamVjdChhZGRyLCBkYik7CisJaWYgKCFvYmogJiYgc3RhdGUgIT0gT0RFQlVHX1NUQVRFX05PTkUpIHsKKwkJV0FSTigxLCBLRVJOX0VSUiAiT0RFQlVHOiBzZWxmdGVzdCBvYmplY3Qgbm90IGZvdW5kXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChvYmogJiYgb2JqLT5zdGF0ZSAhPSBzdGF0ZSkgeworCQlXQVJOKDEsIEtFUk5fRVJSICJPREVCVUc6IHNlbGZ0ZXN0IHdyb25nIHN0YXRlOiAlZCAhPSAlZFxuIiwKKwkJICAgICAgIG9iai0+c3RhdGUsIHN0YXRlKTsKKwkJZ290byBvdXQ7CisJfQorCWlmIChmaXh1cHMgIT0gZGVidWdfb2JqZWN0c19maXh1cHMpIHsKKwkJV0FSTigxLCBLRVJOX0VSUiAiT0RFQlVHOiBzZWxmdGVzdCBmaXh1cHMgZmFpbGVkICVkICE9ICVkXG4iLAorCQkgICAgICAgZml4dXBzLCBkZWJ1Z19vYmplY3RzX2ZpeHVwcyk7CisJCWdvdG8gb3V0OworCX0KKwlpZiAod2FybmluZ3MgIT0gZGVidWdfb2JqZWN0c193YXJuaW5ncykgeworCQlXQVJOKDEsIEtFUk5fRVJSICJPREVCVUc6IHNlbGZ0ZXN0IHdhcm5pbmdzIGZhaWxlZCAlZCAhPSAlZFxuIiwKKwkJICAgICAgIHdhcm5pbmdzLCBkZWJ1Z19vYmplY3RzX3dhcm5pbmdzKTsKKwkJZ290byBvdXQ7CisJfQorCXJlcyA9IDA7CitvdXQ6CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRiLT5sb2NrLCBmbGFncyk7CisJaWYgKHJlcykKKwkJZGVidWdfb2JqZWN0c19lbmFibGVkID0gMDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgX19pbml0ZGF0YSBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyIGRlc2NyX3R5cGVfdGVzdCA9IHsKKwkubmFtZQkJCT0gInNlbGZ0ZXN0IiwKKwkuaXNfc3RhdGljX29iamVjdAk9IGlzX3N0YXRpY19vYmplY3QsCisJLmZpeHVwX2luaXQJCT0gZml4dXBfaW5pdCwKKwkuZml4dXBfYWN0aXZhdGUJCT0gZml4dXBfYWN0aXZhdGUsCisJLmZpeHVwX2Rlc3Ryb3kJCT0gZml4dXBfZGVzdHJveSwKKwkuZml4dXBfZnJlZQkJPSBmaXh1cF9mcmVlLAorfTsKKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IHNlbGZfdGVzdCBvYmogPSB7IC5zdGF0aWNfaW5pdCA9IDAgfTsKKworc3RhdGljIHZvaWQgX19pbml0IGRlYnVnX29iamVjdHNfc2VsZnRlc3Qodm9pZCkKK3sKKwlpbnQgZml4dXBzLCBvbGRmaXh1cHMsIHdhcm5pbmdzLCBvbGR3YXJuaW5nczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZml4dXBzID0gb2xkZml4dXBzID0gZGVidWdfb2JqZWN0c19maXh1cHM7CisJd2FybmluZ3MgPSBvbGR3YXJuaW5ncyA9IGRlYnVnX29iamVjdHNfd2FybmluZ3M7CisJZGVzY3JfdGVzdCA9ICZkZXNjcl90eXBlX3Rlc3Q7CisKKwlkZWJ1Z19vYmplY3RfaW5pdCgmb2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwlpZiAoY2hlY2tfcmVzdWx0cygmb2JqLCBPREVCVUdfU1RBVEVfSU5JVCwgZml4dXBzLCB3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCWRlYnVnX29iamVjdF9hY3RpdmF0ZSgmb2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwlpZiAoY2hlY2tfcmVzdWx0cygmb2JqLCBPREVCVUdfU1RBVEVfQUNUSVZFLCBmaXh1cHMsIHdhcm5pbmdzKSkKKwkJZ290byBvdXQ7CisJZGVidWdfb2JqZWN0X2FjdGl2YXRlKCZvYmosICZkZXNjcl90eXBlX3Rlc3QpOworCWlmIChjaGVja19yZXN1bHRzKCZvYmosIE9ERUJVR19TVEFURV9BQ1RJVkUsICsrZml4dXBzLCArK3dhcm5pbmdzKSkKKwkJZ290byBvdXQ7CisJZGVidWdfb2JqZWN0X2RlYWN0aXZhdGUoJm9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJaWYgKGNoZWNrX3Jlc3VsdHMoJm9iaiwgT0RFQlVHX1NUQVRFX0lOQUNUSVZFLCBmaXh1cHMsIHdhcm5pbmdzKSkKKwkJZ290byBvdXQ7CisJZGVidWdfb2JqZWN0X2Rlc3Ryb3koJm9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJaWYgKGNoZWNrX3Jlc3VsdHMoJm9iaiwgT0RFQlVHX1NUQVRFX0RFU1RST1lFRCwgZml4dXBzLCB3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCWRlYnVnX29iamVjdF9pbml0KCZvYmosICZkZXNjcl90eXBlX3Rlc3QpOworCWlmIChjaGVja19yZXN1bHRzKCZvYmosIE9ERUJVR19TVEFURV9ERVNUUk9ZRUQsIGZpeHVwcywgKyt3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCWRlYnVnX29iamVjdF9hY3RpdmF0ZSgmb2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwlpZiAoY2hlY2tfcmVzdWx0cygmb2JqLCBPREVCVUdfU1RBVEVfREVTVFJPWUVELCBmaXh1cHMsICsrd2FybmluZ3MpKQorCQlnb3RvIG91dDsKKwlkZWJ1Z19vYmplY3RfZGVhY3RpdmF0ZSgmb2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwlpZiAoY2hlY2tfcmVzdWx0cygmb2JqLCBPREVCVUdfU1RBVEVfREVTVFJPWUVELCBmaXh1cHMsICsrd2FybmluZ3MpKQorCQlnb3RvIG91dDsKKwlkZWJ1Z19vYmplY3RfZnJlZSgmb2JqLCAmZGVzY3JfdHlwZV90ZXN0KTsKKwlpZiAoY2hlY2tfcmVzdWx0cygmb2JqLCBPREVCVUdfU1RBVEVfTk9ORSwgZml4dXBzLCB3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCisJb2JqLnN0YXRpY19pbml0ID0gMTsKKwlkZWJ1Z19vYmplY3RfYWN0aXZhdGUoJm9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJaWYgKGNoZWNrX3Jlc3VsdHMoJm9iaiwgT0RFQlVHX1NUQVRFX0FDVElWRSwgZml4dXBzLCB3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCWRlYnVnX29iamVjdF9pbml0KCZvYmosICZkZXNjcl90eXBlX3Rlc3QpOworCWlmIChjaGVja19yZXN1bHRzKCZvYmosIE9ERUJVR19TVEFURV9JTklULCArK2ZpeHVwcywgKyt3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCWRlYnVnX29iamVjdF9mcmVlKCZvYmosICZkZXNjcl90eXBlX3Rlc3QpOworCWlmIChjaGVja19yZXN1bHRzKCZvYmosIE9ERUJVR19TVEFURV9OT05FLCBmaXh1cHMsIHdhcm5pbmdzKSkKKwkJZ290byBvdXQ7CisKKyNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19GUkVFCisJZGVidWdfb2JqZWN0X2luaXQoJm9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJaWYgKGNoZWNrX3Jlc3VsdHMoJm9iaiwgT0RFQlVHX1NUQVRFX0lOSVQsIGZpeHVwcywgd2FybmluZ3MpKQorCQlnb3RvIG91dDsKKwlkZWJ1Z19vYmplY3RfYWN0aXZhdGUoJm9iaiwgJmRlc2NyX3R5cGVfdGVzdCk7CisJaWYgKGNoZWNrX3Jlc3VsdHMoJm9iaiwgT0RFQlVHX1NUQVRFX0FDVElWRSwgZml4dXBzLCB3YXJuaW5ncykpCisJCWdvdG8gb3V0OworCV9fZGVidWdfY2hlY2tfbm9fb2JqX2ZyZWVkKCZvYmosIHNpemVvZihvYmopKTsKKwlpZiAoY2hlY2tfcmVzdWx0cygmb2JqLCBPREVCVUdfU1RBVEVfTk9ORSwgKytmaXh1cHMsICsrd2FybmluZ3MpKQorCQlnb3RvIG91dDsKKyNlbmRpZgorCXByX2luZm8oInNlbGZ0ZXN0IHBhc3NlZFxuIik7CisKK291dDoKKwlkZWJ1Z19vYmplY3RzX2ZpeHVwcyA9IG9sZGZpeHVwczsKKwlkZWJ1Z19vYmplY3RzX3dhcm5pbmdzID0gb2xkd2FybmluZ3M7CisJZGVzY3JfdGVzdCA9IE5VTEw7CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX29iamVjdHNfc2VsZnRlc3Qodm9pZCkgeyB9CisjZW5kaWYKKworLyoKKyAqIENhbGxlZCBkdXJpbmcgZWFybHkgYm9vdCB0byBpbml0aWFsaXplIHRoZSBoYXNoIGJ1Y2tldHMgYW5kIGxpbmsKKyAqIHRoZSBzdGF0aWMgb2JqZWN0IHBvb2wgb2JqZWN0cyBpbnRvIHRoZSBwb2xsIGxpc3QuIEFmdGVyIHRoaXMgY2FsbAorICogdGhlIG9iamVjdCB0cmFja2VyIGlzIGZ1bGx5IG9wZXJhdGlvbmFsLgorICovCit2b2lkIF9faW5pdCBkZWJ1Z19vYmplY3RzX2Vhcmx5X2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBPREVCVUdfSEFTSF9TSVpFOyBpKyspCisJCXJhd19zcGluX2xvY2tfaW5pdCgmb2JqX2hhc2hbaV0ubG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgT0RFQlVHX1BPT0xfU0laRTsgaSsrKQorCQlobGlzdF9hZGRfaGVhZCgmb2JqX3N0YXRpY19wb29sW2ldLm5vZGUsICZvYmpfcG9vbCk7Cit9CisKKy8qCisgKiBDb252ZXJ0IHRoZSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBvYmplY3RzIHRvIGR5bmFtaWMgb25lczoKKyAqLworc3RhdGljIGludCBfX2luaXQgZGVidWdfb2JqZWN0c19yZXBsYWNlX3N0YXRpY19vYmplY3RzKHZvaWQpCit7CisJc3RydWN0IGRlYnVnX2J1Y2tldCAqZGIgPSBvYmpfaGFzaDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqdG1wOworCXN0cnVjdCBkZWJ1Z19vYmogKm9iaiwgKm5ldzsKKwlITElTVF9IRUFEKG9iamVjdHMpOworCWludCBpLCBjbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IE9ERUJVR19QT09MX1NJWkU7IGkrKykgeworCQlvYmogPSBrbWVtX2NhY2hlX3phbGxvYyhvYmpfY2FjaGUsIEdGUF9LRVJORUwpOworCQlpZiAoIW9iaikKKwkJCWdvdG8gZnJlZTsKKwkJaGxpc3RfYWRkX2hlYWQoJm9iai0+bm9kZSwgJm9iamVjdHMpOworCX0KKworCS8qCisJICogV2hlbiBkZWJ1Z19vYmplY3RzX21lbV9pbml0KCkgaXMgY2FsbGVkIHdlIGtub3cgdGhhdCBvbmx5CisJICogb25lIENQVSBpcyB1cCwgc28gZGlzYWJsaW5nIGludGVycnVwdHMgaXMgZW5vdWdoCisJICogcHJvdGVjdGlvbi4gVGhpcyBhdm9pZHMgdGhlIGxvY2tkZXAgaGVsbCBvZiBsb2NrIG9yZGVyaW5nLgorCSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBSZW1vdmUgdGhlIHN0YXRpY2FsbHkgYWxsb2NhdGVkIG9iamVjdHMgZnJvbSB0aGUgcG9vbCAqLworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqLCB0bXAsICZvYmpfcG9vbCwgbm9kZSkKKwkJaGxpc3RfZGVsKCZvYmotPm5vZGUpOworCS8qIE1vdmUgdGhlIGFsbG9jYXRlZCBvYmplY3RzIHRvIHRoZSBwb29sICovCisJaGxpc3RfbW92ZV9saXN0KCZvYmplY3RzLCAmb2JqX3Bvb2wpOworCisJLyogUmVwbGFjZSB0aGUgYWN0aXZlIG9iamVjdCByZWZlcmVuY2VzICovCisJZm9yIChpID0gMDsgaSA8IE9ERUJVR19IQVNIX1NJWkU7IGkrKywgZGIrKykgeworCQlobGlzdF9tb3ZlX2xpc3QoJmRiLT5saXN0LCAmb2JqZWN0cyk7CisKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkob2JqLCAmb2JqZWN0cywgbm9kZSkgeworCQkJbmV3ID0gaGxpc3RfZW50cnkob2JqX3Bvb2wuZmlyc3QsIHR5cGVvZigqb2JqKSwgbm9kZSk7CisJCQlobGlzdF9kZWwoJm5ldy0+bm9kZSk7CisJCQkvKiBjb3B5IG9iamVjdCBkYXRhICovCisJCQkqbmV3ID0gKm9iajsKKwkJCWhsaXN0X2FkZF9oZWFkKCZuZXctPm5vZGUsICZkYi0+bGlzdCk7CisJCQljbnQrKzsKKwkJfQorCX0KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlwcl9kZWJ1ZygiJWQgb2YgJWQgYWN0aXZlIG9iamVjdHMgcmVwbGFjZWRcbiIsCisJCSBjbnQsIG9ial9wb29sX3VzZWQpOworCXJldHVybiAwOworZnJlZToKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgdG1wLCAmb2JqZWN0cywgbm9kZSkgeworCQlobGlzdF9kZWwoJm9iai0+bm9kZSk7CisJCWttZW1fY2FjaGVfZnJlZShvYmpfY2FjaGUsIG9iaik7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIHRoZSBrbWVtX2NhY2hlcyBhcmUgZnVuY3Rpb25hbCB0byBzZXR1cCBhIGRlZGljYXRlZAorICogY2FjaGUgcG9vbCwgd2hpY2ggaGFzIHRoZSBTTEFCX0RFQlVHX09CSkVDVFMgZmxhZyBzZXQuIFRoaXMgZmxhZworICogcHJldmVudHMgdGhhdCB0aGUgZGVidWcgY29kZSBpcyBjYWxsZWQgb24ga21lbV9jYWNoZV9mcmVlKCkgZm9yIHRoZQorICogZGVidWcgdHJhY2tlciBvYmplY3RzIHRvIGF2b2lkIHJlY3Vyc2l2ZSBjYWxscy4KKyAqLwordm9pZCBfX2luaXQgZGVidWdfb2JqZWN0c19tZW1faW5pdCh2b2lkKQoreworCWlmICghZGVidWdfb2JqZWN0c19lbmFibGVkKQorCQlyZXR1cm47CisKKwlvYmpfY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgiZGVidWdfb2JqZWN0c19jYWNoZSIsCisJCQkJICAgICAgc2l6ZW9mIChzdHJ1Y3QgZGVidWdfb2JqKSwgMCwKKwkJCQkgICAgICBTTEFCX0RFQlVHX09CSkVDVFMgfCBTTEFCX05PTEVBS1RSQUNFLAorCQkJCSAgICAgIE5VTEwpOworCisJaWYgKCFvYmpfY2FjaGUgfHwgZGVidWdfb2JqZWN0c19yZXBsYWNlX3N0YXRpY19vYmplY3RzKCkpIHsKKwkJZGVidWdfb2JqZWN0c19lbmFibGVkID0gMDsKKwkJaWYgKG9ial9jYWNoZSkKKwkJCWttZW1fY2FjaGVfZGVzdHJveShvYmpfY2FjaGUpOworCQlwcl93YXJuKCJvdXQgb2YgbWVtb3J5LlxuIik7CisJfSBlbHNlCisJCWRlYnVnX29iamVjdHNfc2VsZnRlc3QoKTsKKworCS8qCisJICogSW5jcmVhc2UgdGhlIHRocmVzaG9sZHMgZm9yIGFsbG9jYXRpbmcgYW5kIGZyZWVpbmcgb2JqZWN0cworCSAqIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIENQVXMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uCisJICovCisJZGVidWdfb2JqZWN0c19wb29sX3NpemUgKz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSAqIDMyOworCWRlYnVnX29iamVjdHNfcG9vbF9taW5fbGV2ZWwgKz0gbnVtX3Bvc3NpYmxlX2NwdXMoKSAqIDQ7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNfYW5kX2xvY2suYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlY19hbmRfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0N2ZhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNfYW5kX2xvY2suYwpAQCAtMCwwICsxLDM1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKKy8qCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBub3Rpb24gb2YgImRlY3JlbWVudCBhCisgKiByZWZlcmVuY2UgY291bnQsIGFuZCByZXR1cm4gbG9ja2VkIGlmIGl0IGRlY3JlbWVudGVkIHRvIHplcm8iLgorICoKKyAqIE5PVEUgTk9URSBOT1RFISBUaGlzIGlzIF9ub3RfIGVxdWl2YWxlbnQgdG8KKyAqCisgKglpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmYXRvbWljKSkgeworICoJCXNwaW5fbG9jaygmbG9jayk7CisgKgkJcmV0dXJuIDE7CisgKgl9CisgKglyZXR1cm4gMDsKKyAqCisgKiBiZWNhdXNlIHRoZSBzcGluLWxvY2sgYW5kIHRoZSBkZWNyZW1lbnQgbXVzdCBiZQorICogImF0b21pYyIuCisgKi8KK2ludCBfYXRvbWljX2RlY19hbmRfbG9jayhhdG9taWNfdCAqYXRvbWljLCBzcGlubG9ja190ICpsb2NrKQoreworCS8qIFN1YnRyYWN0IDEgZnJvbSBjb3VudGVyIHVubGVzcyB0aGF0IGRyb3BzIGl0IHRvIDAgKGllLiBpdCB3YXMgMSkgKi8KKwlpZiAoYXRvbWljX2FkZF91bmxlc3MoYXRvbWljLCAtMSwgMSkpCisJCXJldHVybiAwOworCisJLyogT3RoZXJ3aXNlIGRvIGl0IHRoZSBzbG93IHdheSAqLworCXNwaW5fbG9jayhsb2NrKTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdChhdG9taWMpKQorCQlyZXR1cm4gMTsKKwlzcGluX3VubG9jayhsb2NrKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTChfYXRvbWljX2RlY19hbmRfbG9jayk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU3YWIxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlY29tcHJlc3MuYwpAQCAtMCwwICsxLDc5IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIGRlY29tcHJlc3MuYworICoKKyAqIERldGVjdCB0aGUgZGVjb21wcmVzc2lvbiBtZXRob2QgYmFzZWQgb24gbWFnaWMgbnVtYmVyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvZ2VuZXJpYy5oPgorCisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9idW56aXAyLmg+CisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy91bmx6bWEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VueHouaD4KKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL2luZmxhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VubHpvLmg+CisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy91bmx6NC5oPgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisKKyNpZm5kZWYgQ09ORklHX0RFQ09NUFJFU1NfR1pJUAorIyBkZWZpbmUgZ3VuemlwIE5VTEwKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfREVDT01QUkVTU19CWklQMgorIyBkZWZpbmUgYnVuemlwMiBOVUxMCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0RFQ09NUFJFU1NfTFpNQQorIyBkZWZpbmUgdW5sem1hIE5VTEwKKyNlbmRpZgorI2lmbmRlZiBDT05GSUdfREVDT01QUkVTU19YWgorIyBkZWZpbmUgdW54eiBOVUxMCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0RFQ09NUFJFU1NfTFpPCisjIGRlZmluZSB1bmx6byBOVUxMCisjZW5kaWYKKyNpZm5kZWYgQ09ORklHX0RFQ09NUFJFU1NfTFo0CisjIGRlZmluZSB1bmx6NCBOVUxMCisjZW5kaWYKKworc3RydWN0IGNvbXByZXNzX2Zvcm1hdCB7CisJdW5zaWduZWQgY2hhciBtYWdpY1syXTsKKwljb25zdCBjaGFyICpuYW1lOworCWRlY29tcHJlc3NfZm4gZGVjb21wcmVzc29yOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb21wcmVzc19mb3JtYXQgY29tcHJlc3NlZF9mb3JtYXRzW10gX19pbml0Y29uc3QgPSB7CisJeyB7MHgxZiwgMHg4Yn0sICJnemlwIiwgZ3VuemlwIH0sCisJeyB7MHgxZiwgMHg5ZX0sICJnemlwIiwgZ3VuemlwIH0sCisJeyB7MHg0MiwgMHg1YX0sICJiemlwMiIsIGJ1bnppcDIgfSwKKwl7IHsweDVkLCAweDAwfSwgImx6bWEiLCB1bmx6bWEgfSwKKwl7IHsweGZkLCAweDM3fSwgInh6IiwgdW54eiB9LAorCXsgezB4ODksIDB4NGN9LCAibHpvIiwgdW5sem8gfSwKKwl7IHsweDAyLCAweDIxfSwgImx6NCIsIHVubHo0IH0sCisJeyB7MCwgMH0sIE5VTEwsIE5VTEwgfQorfTsKKworZGVjb21wcmVzc19mbiBfX2luaXQgZGVjb21wcmVzc19tZXRob2QoY29uc3QgdW5zaWduZWQgY2hhciAqaW5idWYsIGxvbmcgbGVuLAorCQkJCWNvbnN0IGNoYXIgKipuYW1lKQoreworCWNvbnN0IHN0cnVjdCBjb21wcmVzc19mb3JtYXQgKmNmOworCisJaWYgKGxlbiA8IDIpIHsKKwkJaWYgKG5hbWUpCisJCQkqbmFtZSA9IE5VTEw7CisJCXJldHVybiBOVUxMOwkvKiBOZWVkIGF0IGxlYXN0IHRoaXMgbXVjaC4uLiAqLworCX0KKworCXByX2RlYnVnKCJDb21wcmVzc2VkIGRhdGEgbWFnaWM6ICUjLjJ4ICUjLjJ4XG4iLCBpbmJ1ZlswXSwgaW5idWZbMV0pOworCisJZm9yIChjZiA9IGNvbXByZXNzZWRfZm9ybWF0czsgY2YtPm5hbWU7IGNmKyspIHsKKwkJaWYgKCFtZW1jbXAoaW5idWYsIGNmLT5tYWdpYywgMikpCisJCQlicmVhazsKKworCX0KKwlpZiAobmFtZSkKKwkJKm5hbWUgPSBjZi0+bmFtZTsKKwlyZXR1cm4gY2YtPmRlY29tcHJlc3NvcjsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlY29tcHJlc3NfYnVuemlwMi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc19idW56aXAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzNDM2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlY29tcHJlc3NfYnVuemlwMi5jCkBAIC0wLDAgKzEsNzU1IEBACisvKglTbWFsbCBiemlwMiBkZWZsYXRlIGltcGxlbWVudGF0aW9uLCBieSBSb2IgTGFuZGxleSAocm9iQGxhbmRsZXkubmV0KS4KKworCUJhc2VkIG9uIGJ6aXAyIGRlY29tcHJlc3Npb24gY29kZSBieSBKdWxpYW4gUiBTZXdhcmQgKGpzZXdhcmRAYWNtLm9yZyksCisJd2hpY2ggYWxzbyBhY2tub3dsZWRnZXMgY29udHJpYnV0aW9ucyBieSBNaWtlIEJ1cnJvd3MsIERhdmlkIFdoZWVsZXIsCisJUGV0ZXIgRmVud2ljaywgQWxpc3RhaXIgTW9mZmF0LCBSYWRmb3JkIE5lYWwsIElhbiBILiBXaXR0ZW4sCisJUm9iZXJ0IFNlZGdld2ljaywgYW5kIEpvbiBMLiBCZW50bGV5LgorCisJVGhpcyBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBMR1BMdjI6CisJCUxHUEwgKGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9sZ3BsLmh0bWwKKyovCisKKy8qCisJU2l6ZSBhbmQgc3BlZWQgb3B0aW1pemF0aW9ucyBieSBNYW51ZWwgTm92b2EgSUlJICAobWpuM0Bjb2RlcG9ldC5vcmcpLgorCisJTW9yZSBlZmZpY2llbnQgcmVhZGluZyBvZiBIdWZmbWFuIGNvZGVzLCBhIHN0cmVhbWxpbmVkIHJlYWRfYnVuemlwKCkKKwlmdW5jdGlvbiwgYW5kIHZhcmlvdXMgb3RoZXIgdHdlYWtzLiAgSW4gKGxpbWl0ZWQpIHRlc3RzLCBhcHByb3hpbWF0ZWx5CisJMjAlIGZhc3RlciB0aGFuIGJ6Y2F0IG9uIHg4NiBhbmQgYWJvdXQgMTAlIGZhc3RlciBvbiBhcm0uCisKKwlOb3RlIHRoYXQgYWJvdXQgMi8zIG9mIHRoZSB0aW1lIGlzIHNwZW50IGluIHJlYWRfdW56aXAoKSByZXZlcnNpbmcKKwl0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybWF0aW9uLiAgTXVjaCBvZiB0aGF0IHRpbWUgaXMgZGVsYXkKKwlyZXN1bHRpbmcgZnJvbSBjYWNoZSBtaXNzZXMuCisKKwlJIHdvdWxkIGFzayB0aGF0IGFueW9uZSBiZW5lZml0aW5nIGZyb20gdGhpcyB3b3JrLCBlc3BlY2lhbGx5IHRob3NlCisJdXNpbmcgaXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cywgY29uc2lkZXIgbWFraW5nIGEgZG9uYXRpb24gdG8gbXkgbG9jYWwKKwlub24tcHJvZml0IGhvc3BpY2Ugb3JnYW5pemF0aW9uIGluIHRoZSBuYW1lIG9mIHRoZSB3b21hbiBJIGxvdmVkLCB3aG8KKwlwYXNzZWQgYXdheSBGZWIuIDEyLCAyMDAzLgorCisJCUluIG1lbW9yeSBvZiBUb25pIFcuIEhhZ2FuCisKKwkJSG9zcGljZSBvZiBBY2FkaWFuYSwgSW5jLgorCQkyNjAwIEpvaG5zdG9uIFN0LiwgU3VpdGUgMjAwCisJCUxhZmF5ZXR0ZSwgTEEgNzA1MDMtMzI0MAorCisJCVBob25lICgzMzcpIDIzMi0xMjM0IG9yIDEtODAwLTczOC0yMjI2CisJCUZheCAgICgzMzcpIDIzMi0xMjk3CisKKwkJaHR0cDovL3d3dy5ob3NwaWNlYWNhZGlhbmEuY29tLworCisJTWFudWVsCisgKi8KKworLyoKKwlNYWRlIGl0IGZpdCBmb3IgcnVubmluZyBpbiBMaW51eCBLZXJuZWwgYnkgQWxhaW4gS25hZmYgKGFsYWluQGtuYWZmLmx1KQorKi8KKworCisjaWZkZWYgU1RBVElDCisjZGVmaW5lIFBSRUJPT1QKKyNlbHNlCisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9idW56aXAyLmg+CisjZW5kaWYgLyogU1RBVElDICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL21tLmg+CisKKyNpZm5kZWYgSU5UX01BWAorI2RlZmluZSBJTlRfTUFYIDB4N2ZmZmZmZmYKKyNlbmRpZgorCisvKiBDb25zdGFudHMgZm9yIEh1ZmZtYW4gY29kaW5nICovCisjZGVmaW5lIE1BWF9HUk9VUFMJCTYKKyNkZWZpbmUgR1JPVVBfU0laRSAgIAkJNTAJLyogNjQgd291bGQgaGF2ZSBiZWVuIG1vcmUgZWZmaWNpZW50ICovCisjZGVmaW5lIE1BWF9IVUZDT0RFX0JJVFMgCTIwCS8qIExvbmdlc3QgSHVmZm1hbiBjb2RlIGFsbG93ZWQgKi8KKyNkZWZpbmUgTUFYX1NZTUJPTFMgCQkyNTgJLyogMjU2IGxpdGVyYWxzICsgUlVOQSArIFJVTkIgKi8KKyNkZWZpbmUgU1lNQk9MX1JVTkEJCTAKKyNkZWZpbmUgU1lNQk9MX1JVTkIJCTEKKworLyogU3RhdHVzIHJldHVybiB2YWx1ZXMgKi8KKyNkZWZpbmUgUkVUVkFMX09LCQkJMAorI2RlZmluZSBSRVRWQUxfTEFTVF9CTE9DSwkJKC0xKQorI2RlZmluZSBSRVRWQUxfTk9UX0JaSVBfREFUQQkJKC0yKQorI2RlZmluZSBSRVRWQUxfVU5FWFBFQ1RFRF9JTlBVVF9FT0YJKC0zKQorI2RlZmluZSBSRVRWQUxfVU5FWFBFQ1RFRF9PVVRQVVRfRU9GCSgtNCkKKyNkZWZpbmUgUkVUVkFMX0RBVEFfRVJST1IJCSgtNSkKKyNkZWZpbmUgUkVUVkFMX09VVF9PRl9NRU1PUlkJCSgtNikKKyNkZWZpbmUgUkVUVkFMX09CU09MRVRFX0lOUFVUCQkoLTcpCisKKy8qIE90aGVyIGhvdXNla2VlcGluZyBjb25zdGFudHMgKi8KKyNkZWZpbmUgQlpJUDJfSU9CVUZfU0laRQkJNDA5NgorCisvKiBUaGlzIGlzIHdoYXQgd2Uga25vdyBhYm91dCBlYWNoIEh1ZmZtYW4gY29kaW5nIGdyb3VwICovCitzdHJ1Y3QgZ3JvdXBfZGF0YSB7CisJLyogV2UgaGF2ZSBhbiBleHRyYSBzbG90IGF0IHRoZSBlbmQgb2YgbGltaXRbXSBmb3IgYSBzZW50aW5hbCB2YWx1ZS4gKi8KKwlpbnQgbGltaXRbTUFYX0hVRkNPREVfQklUUysxXTsKKwlpbnQgYmFzZVtNQVhfSFVGQ09ERV9CSVRTXTsKKwlpbnQgcGVybXV0ZVtNQVhfU1lNQk9MU107CisJaW50IG1pbkxlbiwgbWF4TGVuOworfTsKKworLyogU3RydWN0dXJlIGhvbGRpbmcgYWxsIHRoZSBob3VzZWtlZXBpbmcgZGF0YSwgaW5jbHVkaW5nIElPIGJ1ZmZlcnMgYW5kCisgICBtZW1vcnkgdGhhdCBwZXJzaXN0cyBiZXR3ZWVuIGNhbGxzIHRvIGJ1bnppcCAqLworc3RydWN0IGJ1bnppcF9kYXRhIHsKKwkvKiBTdGF0ZSBmb3IgaW50ZXJydXB0aW5nIG91dHB1dCBsb29wICovCisJaW50IHdyaXRlQ29waWVzLCB3cml0ZVBvcywgd3JpdGVSdW5Db3VudGRvd24sIHdyaXRlQ291bnQsIHdyaXRlQ3VycmVudDsKKwkvKiBJL08gdHJhY2tpbmcgZGF0YSAoZmlsZSBoYW5kbGVzLCBidWZmZXJzLCBwb3NpdGlvbnMsIGV0Yy4pICovCisJbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKTsKKwlsb25nIGluYnVmQ291bnQsIGluYnVmUG9zIC8qLCBvdXRidWZQb3MqLzsKKwl1bnNpZ25lZCBjaGFyICppbmJ1ZiAvKiwqb3V0YnVmKi87CisJdW5zaWduZWQgaW50IGluYnVmQml0Q291bnQsIGluYnVmQml0czsKKwkvKiBUaGUgQ1JDIHZhbHVlcyBzdG9yZWQgaW4gdGhlIGJsb2NrIGhlYWRlciBhbmQgY2FsY3VsYXRlZCBmcm9tIHRoZQorCWRhdGEgKi8KKwl1bnNpZ25lZCBpbnQgY3JjMzJUYWJsZVsyNTZdLCBoZWFkZXJDUkMsIHRvdGFsQ1JDLCB3cml0ZUNSQzsKKwkvKiBJbnRlcm1lZGlhdGUgYnVmZmVyIGFuZCBpdHMgc2l6ZSAoaW4gYnl0ZXMpICovCisJdW5zaWduZWQgaW50ICpkYnVmLCBkYnVmU2l6ZTsKKwkvKiBUaGVzZSB0aGluZ3MgYXJlIGEgYml0IHRvbyBiaWcgdG8gZ28gb24gdGhlIHN0YWNrICovCisJdW5zaWduZWQgY2hhciBzZWxlY3RvcnNbMzI3NjhdOwkJLyogblNlbGVjdG9ycyA9IDE1IGJpdHMgKi8KKwlzdHJ1Y3QgZ3JvdXBfZGF0YSBncm91cHNbTUFYX0dST1VQU107CS8qIEh1ZmZtYW4gY29kaW5nIHRhYmxlcyAqLworCWludCBpb19lcnJvcjsJCQkvKiBub24temVybyBpZiB3ZSBoYXZlIElPIGVycm9yICovCisJaW50IGJ5dGVDb3VudFsyNTZdOworCXVuc2lnbmVkIGNoYXIgc3ltVG9CeXRlWzI1Nl0sIG10ZlN5bWJvbFsyNTZdOworfTsKKworCisvKiBSZXR1cm4gdGhlIG5leHQgbm5uIGJpdHMgb2YgaW5wdXQuICBBbGwgcmVhZHMgZnJvbSB0aGUgY29tcHJlc3NlZCBpbnB1dAorICAgYXJlIGRvbmUgdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLiAgQWxsIHJlYWRzIGFyZSBiaWcgZW5kaWFuICovCitzdGF0aWMgdW5zaWduZWQgaW50IElOSVQgZ2V0X2JpdHMoc3RydWN0IGJ1bnppcF9kYXRhICpiZCwgY2hhciBiaXRzX3dhbnRlZCkKK3sKKwl1bnNpZ25lZCBpbnQgYml0cyA9IDA7CisKKwkvKiBJZiB3ZSBuZWVkIHRvIGdldCBtb3JlIGRhdGEgZnJvbSB0aGUgYnl0ZSBidWZmZXIsIGRvIHNvLgorCSAgIChMb29wIGdldHRpbmcgb25lIGJ5dGUgYXQgYSB0aW1lIHRvIGVuZm9yY2UgZW5kaWFubmVzcyBhbmQgYXZvaWQKKwkgICB1bmFsaWduZWQgYWNjZXNzLikgKi8KKwl3aGlsZSAoYmQtPmluYnVmQml0Q291bnQgPCBiaXRzX3dhbnRlZCkgeworCQkvKiBJZiB3ZSBuZWVkIHRvIHJlYWQgbW9yZSBkYXRhIGZyb20gZmlsZSBpbnRvIGJ5dGUgYnVmZmVyLCBkbworCQkgICBzbyAqLworCQlpZiAoYmQtPmluYnVmUG9zID09IGJkLT5pbmJ1ZkNvdW50KSB7CisJCQlpZiAoYmQtPmlvX2Vycm9yKQorCQkJCXJldHVybiAwOworCQkJYmQtPmluYnVmQ291bnQgPSBiZC0+ZmlsbChiZC0+aW5idWYsIEJaSVAyX0lPQlVGX1NJWkUpOworCQkJaWYgKGJkLT5pbmJ1ZkNvdW50IDw9IDApIHsKKwkJCQliZC0+aW9fZXJyb3IgPSBSRVRWQUxfVU5FWFBFQ1RFRF9JTlBVVF9FT0Y7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQliZC0+aW5idWZQb3MgPSAwOworCQl9CisJCS8qIEF2b2lkIDMyLWJpdCBvdmVyZmxvdyAoZHVtcCBiaXQgYnVmZmVyIHRvIHRvcCBvZiBvdXRwdXQpICovCisJCWlmIChiZC0+aW5idWZCaXRDb3VudCA+PSAyNCkgeworCQkJYml0cyA9IGJkLT5pbmJ1ZkJpdHMmKCgxIDw8IGJkLT5pbmJ1ZkJpdENvdW50KS0xKTsKKwkJCWJpdHNfd2FudGVkIC09IGJkLT5pbmJ1ZkJpdENvdW50OworCQkJYml0cyA8PD0gYml0c193YW50ZWQ7CisJCQliZC0+aW5idWZCaXRDb3VudCA9IDA7CisJCX0KKwkJLyogR3JhYiBuZXh0IDggYml0cyBvZiBpbnB1dCBmcm9tIGJ1ZmZlci4gKi8KKwkJYmQtPmluYnVmQml0cyA9IChiZC0+aW5idWZCaXRzIDw8IDgpfGJkLT5pbmJ1ZltiZC0+aW5idWZQb3MrK107CisJCWJkLT5pbmJ1ZkJpdENvdW50ICs9IDg7CisJfQorCS8qIENhbGN1bGF0ZSByZXN1bHQgKi8KKwliZC0+aW5idWZCaXRDb3VudCAtPSBiaXRzX3dhbnRlZDsKKwliaXRzIHw9IChiZC0+aW5idWZCaXRzID4+IGJkLT5pbmJ1ZkJpdENvdW50KSYoKDEgPDwgYml0c193YW50ZWQpLTEpOworCisJcmV0dXJuIGJpdHM7Cit9CisKKy8qIFVucGFja3MgdGhlIG5leHQgYmxvY2sgYW5kIHNldHMgdXAgZm9yIHRoZSBpbnZlcnNlIGJ1cnJvd3Mtd2hlZWxlciBzdGVwLiAqLworCitzdGF0aWMgaW50IElOSVQgZ2V0X25leHRfYmxvY2soc3RydWN0IGJ1bnppcF9kYXRhICpiZCkKK3sKKwlzdHJ1Y3QgZ3JvdXBfZGF0YSAqaHVmR3JvdXAgPSBOVUxMOworCWludCAqYmFzZSA9IE5VTEw7CisJaW50ICpsaW1pdCA9IE5VTEw7CisJaW50IGRidWZDb3VudCwgbmV4dFN5bSwgZGJ1ZlNpemUsIGdyb3VwQ291bnQsIHNlbGVjdG9yLAorCQlpLCBqLCBrLCB0LCBydW5Qb3MsIHN5bUNvdW50LCBzeW1Ub3RhbCwgblNlbGVjdG9ycywgKmJ5dGVDb3VudDsKKwl1bnNpZ25lZCBjaGFyIHVjLCAqc3ltVG9CeXRlLCAqbXRmU3ltYm9sLCAqc2VsZWN0b3JzOworCXVuc2lnbmVkIGludCAqZGJ1Ziwgb3JpZ1B0cjsKKworCWRidWYgPSBiZC0+ZGJ1ZjsKKwlkYnVmU2l6ZSA9IGJkLT5kYnVmU2l6ZTsKKwlzZWxlY3RvcnMgPSBiZC0+c2VsZWN0b3JzOworCWJ5dGVDb3VudCA9IGJkLT5ieXRlQ291bnQ7CisJc3ltVG9CeXRlID0gYmQtPnN5bVRvQnl0ZTsKKwltdGZTeW1ib2wgPSBiZC0+bXRmU3ltYm9sOworCisJLyogUmVhZCBpbiBoZWFkZXIgc2lnbmF0dXJlIGFuZCBDUkMsIHRoZW4gdmFsaWRhdGUgc2lnbmF0dXJlLgorCSAgIChsYXN0IGJsb2NrIHNpZ25hdHVyZSBtZWFucyBDUkMgaXMgZm9yIHdob2xlIGZpbGUsIHJldHVybiBub3cpICovCisJaSA9IGdldF9iaXRzKGJkLCAyNCk7CisJaiA9IGdldF9iaXRzKGJkLCAyNCk7CisJYmQtPmhlYWRlckNSQyA9IGdldF9iaXRzKGJkLCAzMik7CisJaWYgKChpID09IDB4MTc3MjQ1KSAmJiAoaiA9PSAweDM4NTA5MCkpCisJCXJldHVybiBSRVRWQUxfTEFTVF9CTE9DSzsKKwlpZiAoKGkgIT0gMHgzMTQxNTkpIHx8IChqICE9IDB4MjY1MzU5KSkKKwkJcmV0dXJuIFJFVFZBTF9OT1RfQlpJUF9EQVRBOworCS8qIFdlIGNhbiBhZGQgc3VwcG9ydCBmb3IgYmxvY2tSYW5kb21pc2VkIGlmIGFueWJvZHkgY29tcGxhaW5zLgorCSAgIFRoZXJlIHdhcyBzb21lIGNvZGUgZm9yIHRoaXMgaW4gYnVzeWJveCAxLjAuMC1wcmUzLCBidXQgbm9ib2R5IGV2ZXIKKwkgICBub3RpY2VkIHRoYXQgaXQgZGlkbid0IGFjdHVhbGx5IHdvcmsuICovCisJaWYgKGdldF9iaXRzKGJkLCAxKSkKKwkJcmV0dXJuIFJFVFZBTF9PQlNPTEVURV9JTlBVVDsKKwlvcmlnUHRyID0gZ2V0X2JpdHMoYmQsIDI0KTsKKwlpZiAob3JpZ1B0ciA+PSBkYnVmU2l6ZSkKKwkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCS8qIG1hcHBpbmcgdGFibGU6IGlmIHNvbWUgYnl0ZSB2YWx1ZXMgYXJlIG5ldmVyIHVzZWQgKGVuY29kaW5nIHRoaW5ncworCSAgIGxpa2UgYXNjaWkgdGV4dCksIHRoZSBjb21wcmVzc2lvbiBjb2RlIHJlbW92ZXMgdGhlIGdhcHMgdG8gaGF2ZSBmZXdlcgorCSAgIHN5bWJvbHMgdG8gZGVhbCB3aXRoLCBhbmQgd3JpdGVzIGEgc3BhcnNlIGJpdGZpZWxkIGluZGljYXRpbmcgd2hpY2gKKwkgICB2YWx1ZXMgd2VyZSBwcmVzZW50LiAgV2UgbWFrZSBhIHRyYW5zbGF0aW9uIHRhYmxlIHRvIGNvbnZlcnQgdGhlCisJICAgc3ltYm9scyBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGVzLiAqLworCXQgPSBnZXRfYml0cyhiZCwgMTYpOworCXN5bVRvdGFsID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAodCYoMSA8PCAoMTUtaSkpKSB7CisJCQlrID0gZ2V0X2JpdHMoYmQsIDE2KTsKKwkJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCQkJCWlmIChrJigxIDw8ICgxNS1qKSkpCisJCQkJCXN5bVRvQnl0ZVtzeW1Ub3RhbCsrXSA9ICgxNippKStqOworCQl9CisJfQorCS8qIEhvdyBtYW55IGRpZmZlcmVudCBIdWZmbWFuIGNvZGluZyBncm91cHMgZG9lcyB0aGlzIGJsb2NrIHVzZT8gKi8KKwlncm91cENvdW50ID0gZ2V0X2JpdHMoYmQsIDMpOworCWlmIChncm91cENvdW50IDwgMiB8fCBncm91cENvdW50ID4gTUFYX0dST1VQUykKKwkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCS8qIG5TZWxlY3RvcnM6IEV2ZXJ5IEdST1VQX1NJWkUgbWFueSBzeW1ib2xzIHdlIHNlbGVjdCBhIG5ldworCSAgIEh1ZmZtYW4gY29kaW5nIGdyb3VwLiAgUmVhZCBpbiB0aGUgZ3JvdXAgc2VsZWN0b3IgbGlzdCwKKwkgICB3aGljaCBpcyBzdG9yZWQgYXMgTVRGIGVuY29kZWQgYml0IHJ1bnMuICAoTVRGID0gTW92ZSBUbworCSAgIEZyb250LCBhcyBlYWNoIHZhbHVlIGlzIHVzZWQgaXQncyBtb3ZlZCB0byB0aGUgc3RhcnQgb2YgdGhlCisJICAgbGlzdC4pICovCisJblNlbGVjdG9ycyA9IGdldF9iaXRzKGJkLCAxNSk7CisJaWYgKCFuU2VsZWN0b3JzKQorCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJZm9yIChpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKykKKwkJbXRmU3ltYm9sW2ldID0gaTsKKwlmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7CisJCS8qIEdldCBuZXh0IHZhbHVlICovCisJCWZvciAoaiA9IDA7IGdldF9iaXRzKGJkLCAxKTsgaisrKQorCQkJaWYgKGogPj0gZ3JvdXBDb3VudCkKKwkJCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCS8qIERlY29kZSBNVEYgdG8gZ2V0IHRoZSBuZXh0IHNlbGVjdG9yICovCisJCXVjID0gbXRmU3ltYm9sW2pdOworCQlmb3IgKDsgajsgai0tKQorCQkJbXRmU3ltYm9sW2pdID0gbXRmU3ltYm9sW2otMV07CisJCW10ZlN5bWJvbFswXSA9IHNlbGVjdG9yc1tpXSA9IHVjOworCX0KKwkvKiBSZWFkIHRoZSBIdWZmbWFuIGNvZGluZyB0YWJsZXMgZm9yIGVhY2ggZ3JvdXAsIHdoaWNoIGNvZGUKKwkgICBmb3Igc3ltVG90YWwgbGl0ZXJhbCBzeW1ib2xzLCBwbHVzIHR3byBydW4gc3ltYm9scyAoUlVOQSwKKwkgICBSVU5CKSAqLworCXN5bUNvdW50ID0gc3ltVG90YWwrMjsKKwlmb3IgKGogPSAwOyBqIDwgZ3JvdXBDb3VudDsgaisrKSB7CisJCXVuc2lnbmVkIGNoYXIgbGVuZ3RoW01BWF9TWU1CT0xTXSwgdGVtcFtNQVhfSFVGQ09ERV9CSVRTKzFdOworCQlpbnQJbWluTGVuLAltYXhMZW4sIHBwOworCQkvKiBSZWFkIEh1ZmZtYW4gY29kZSBsZW5ndGhzIGZvciBlYWNoIHN5bWJvbC4gIFRoZXkncmUKKwkJICAgc3RvcmVkIGluIGEgd2F5IHNpbWlsYXIgdG8gbXRmOyByZWNvcmQgYSBzdGFydGluZworCQkgICB2YWx1ZSBmb3IgdGhlIGZpcnN0IHN5bWJvbCwgYW5kIGFuIG9mZnNldCBmcm9tIHRoZQorCQkgICBwcmV2aW91cyB2YWx1ZSBmb3IgZXZlcnlzIHN5bWJvbCBhZnRlciB0aGF0LgorCQkgICAoU3VidHJhY3RpbmcgMSBiZWZvcmUgdGhlIGxvb3AgYW5kIHRoZW4gYWRkaW5nIGl0CisJCSAgIGJhY2sgYXQgdGhlIGVuZCBpcyBhbiBvcHRpbWl6YXRpb24gdGhhdCBtYWtlcyB0aGUKKwkJICAgdGVzdCBpbnNpZGUgdGhlIGxvb3Agc2ltcGxlcjogc3ltYm9sIGxlbmd0aCAwCisJCSAgIGJlY29tZXMgbmVnYXRpdmUsIHNvIGFuIHVuc2lnbmVkIGluZXF1YWxpdHkgY2F0Y2hlcworCQkgICBpdC4pICovCisJCXQgPSBnZXRfYml0cyhiZCwgNSktMTsKKwkJZm9yIChpID0gMDsgaSA8IHN5bUNvdW50OyBpKyspIHsKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoKCh1bnNpZ25lZCl0KSA+IChNQVhfSFVGQ09ERV9CSVRTLTEpKQorCQkJCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisKKwkJCQkvKiBJZiBmaXJzdCBiaXQgaXMgMCwgc3RvcC4gIEVsc2UKKwkJCQkgICBzZWNvbmQgYml0IGluZGljYXRlcyB3aGV0aGVyIHRvCisJCQkJICAgaW5jcmVtZW50IG9yIGRlY3JlbWVudCB0aGUgdmFsdWUuCisJCQkJICAgT3B0aW1pemF0aW9uOiBncmFiIDIgYml0cyBhbmQgdW5nZXQKKwkJCQkgICB0aGUgc2Vjb25kIGlmIHRoZSBmaXJzdCB3YXMgMC4gKi8KKworCQkJCWsgPSBnZXRfYml0cyhiZCwgMik7CisJCQkJaWYgKGsgPCAyKSB7CisJCQkJCWJkLT5pbmJ1ZkJpdENvdW50Kys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBBZGQgb25lIGlmIHNlY29uZCBiaXQgMSwgZWxzZQorCQkJCSAqIHN1YnRyYWN0IDEuICBBdm9pZHMgaWYvZWxzZSAqLworCQkJCXQgKz0gKCgoaysxKSYyKS0xKTsKKwkJCX0KKwkJCS8qIENvcnJlY3QgZm9yIHRoZSBpbml0aWFsIC0xLCB0byBnZXQgdGhlCisJCQkgKiBmaW5hbCBzeW1ib2wgbGVuZ3RoICovCisJCQlsZW5ndGhbaV0gPSB0KzE7CisJCX0KKwkJLyogRmluZCBsYXJnZXN0IGFuZCBzbWFsbGVzdCBsZW5ndGhzIGluIHRoaXMgZ3JvdXAgKi8KKwkJbWluTGVuID0gbWF4TGVuID0gbGVuZ3RoWzBdOworCisJCWZvciAoaSA9IDE7IGkgPCBzeW1Db3VudDsgaSsrKSB7CisJCQlpZiAobGVuZ3RoW2ldID4gbWF4TGVuKQorCQkJCW1heExlbiA9IGxlbmd0aFtpXTsKKwkJCWVsc2UgaWYgKGxlbmd0aFtpXSA8IG1pbkxlbikKKwkJCQltaW5MZW4gPSBsZW5ndGhbaV07CisJCX0KKworCQkvKiBDYWxjdWxhdGUgcGVybXV0ZVtdLCBiYXNlW10sIGFuZCBsaW1pdFtdIHRhYmxlcyBmcm9tCisJCSAqIGxlbmd0aFtdLgorCQkgKgorCQkgKiBwZXJtdXRlW10gaXMgdGhlIGxvb2t1cCB0YWJsZSBmb3IgY29udmVydGluZworCQkgKiBIdWZmbWFuIGNvZGVkIHN5bWJvbHMgaW50byBkZWNvZGVkIHN5bWJvbHMuICBiYXNlW10KKwkJICogaXMgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHRoZSB2YWx1ZSBvZiBhCisJCSAqIEh1ZmZtYW4gc3ltYm9sIG9mIGEgZ2l2ZW4gbGVuZ3RoIHdoZW4gdXNpbmcKKwkJICogcGVybXV0ZVtdLgorCQkgKgorCQkgKiBsaW1pdFtdIGluZGljYXRlcyB0aGUgbGFyZ2VzdCBudW1lcmljYWwgdmFsdWUgYQorCQkgKiBzeW1ib2wgd2l0aCBhIGdpdmVuIG51bWJlciBvZiBiaXRzIGNhbiBoYXZlLiAgVGhpcworCQkgKiBpcyBob3cgdGhlIEh1ZmZtYW4gY29kZXMgY2FuIHZhcnkgaW4gbGVuZ3RoOiBlYWNoCisJCSAqIGNvZGUgd2l0aCBhIHZhbHVlID4gbGltaXRbbGVuZ3RoXSBuZWVkcyBhbm90aGVyCisJCSAqIGJpdC4KKwkJICovCisJCWh1Zkdyb3VwID0gYmQtPmdyb3VwcytqOworCQlodWZHcm91cC0+bWluTGVuID0gbWluTGVuOworCQlodWZHcm91cC0+bWF4TGVuID0gbWF4TGVuOworCQkvKiBOb3RlIHRoYXQgbWluTGVuIGNhbid0IGJlIHNtYWxsZXIgdGhhbiAxLCBzbyB3ZQorCQkgICBhZGp1c3QgdGhlIGJhc2UgYW5kIGxpbWl0IGFycmF5IHBvaW50ZXJzIHNvIHdlJ3JlCisJCSAgIG5vdCBhbHdheXMgd2FzdGluZyB0aGUgZmlyc3QgZW50cnkuICBXZSBkbyB0aGlzCisJCSAgIGFnYWluIHdoZW4gdXNpbmcgdGhlbSAoZHVyaW5nIHN5bWJvbCBkZWNvZGluZykuKi8KKwkJYmFzZSA9IGh1Zkdyb3VwLT5iYXNlLTE7CisJCWxpbWl0ID0gaHVmR3JvdXAtPmxpbWl0LTE7CisJCS8qIENhbGN1bGF0ZSBwZXJtdXRlW10uICBDb25jdXJyZW50bHksIGluaXRpYWxpemUKKwkJICogdGVtcFtdIGFuZCBsaW1pdFtdLiAqLworCQlwcCA9IDA7CisJCWZvciAoaSA9IG1pbkxlbjsgaSA8PSBtYXhMZW47IGkrKykgeworCQkJdGVtcFtpXSA9IGxpbWl0W2ldID0gMDsKKwkJCWZvciAodCA9IDA7IHQgPCBzeW1Db3VudDsgdCsrKQorCQkJCWlmIChsZW5ndGhbdF0gPT0gaSkKKwkJCQkJaHVmR3JvdXAtPnBlcm11dGVbcHArK10gPSB0OworCQl9CisJCS8qIENvdW50IHN5bWJvbHMgY29kZWQgZm9yIGF0IGVhY2ggYml0IGxlbmd0aCAqLworCQlmb3IgKGkgPSAwOyBpIDwgc3ltQ291bnQ7IGkrKykKKwkJCXRlbXBbbGVuZ3RoW2ldXSsrOworCQkvKiBDYWxjdWxhdGUgbGltaXRbXSAodGhlIGxhcmdlc3Qgc3ltYm9sLWNvZGluZyB2YWx1ZQorCQkgKmF0IGVhY2ggYml0IGxlbmd0aCwgd2hpY2ggaXMgKHByZXZpb3VzIGxpbWl0IDw8CisJCSAqMSkrc3ltYm9scyBhdCB0aGlzIGxldmVsKSwgYW5kIGJhc2VbXSAobnVtYmVyIG9mCisJCSAqc3ltYm9scyB0byBpZ25vcmUgYXQgZWFjaCBiaXQgbGVuZ3RoLCB3aGljaCBpcyBsaW1pdAorCQkgKm1pbnVzIHRoZSBjdW11bGF0aXZlIGNvdW50IG9mIHN5bWJvbHMgY29kZWQgZm9yCisJCSAqYWxyZWFkeSkuICovCisJCXBwID0gdCA9IDA7CisJCWZvciAoaSA9IG1pbkxlbjsgaSA8IG1heExlbjsgaSsrKSB7CisJCQlwcCArPSB0ZW1wW2ldOworCQkJLyogV2UgcmVhZCB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBzeW1ib2wgc2l6ZQorCQkJICAgYW5kIHRoZW4gdW5nZXQgYml0cyBhZnRlciBkZXRlcm1pbmluZyBob3cKKwkJCSAgIG1hbnkgd2UgbmVlZCwgYW5kIHRob3NlIGV4dHJhIGJpdHMgY291bGQgYmUKKwkJCSAgIHNldCB0byBhbnl0aGluZy4gIChUaGV5J3JlIG5vaXNlIGZyb20KKwkJCSAgIGZ1dHVyZSBzeW1ib2xzLikgIEF0IGVhY2ggbGV2ZWwgd2UncmUKKwkJCSAgIHJlYWxseSBvbmx5IGludGVyZXN0ZWQgaW4gdGhlIGZpcnN0IGZldworCQkJICAgYml0cywgc28gaGVyZSB3ZSBzZXQgYWxsIHRoZSB0cmFpbGluZworCQkJICAgdG8tYmUtaWdub3JlZCBiaXRzIHRvIDEgc28gdGhleSBkb24ndAorCQkJICAgYWZmZWN0IHRoZSB2YWx1ZSA+IGxpbWl0W2xlbmd0aF0KKwkJCSAgIGNvbXBhcmlzb24uICovCisJCQlsaW1pdFtpXSA9IChwcCA8PCAobWF4TGVuIC0gaSkpIC0gMTsKKwkJCXBwIDw8PSAxOworCQkJYmFzZVtpKzFdID0gcHAtKHQgKz0gdGVtcFtpXSk7CisJCX0KKwkJbGltaXRbbWF4TGVuKzFdID0gSU5UX01BWDsgLyogU2VudGluYWwgdmFsdWUgZm9yCisJCQkJCSAgICAqIHJlYWRpbmcgbmV4dCBzeW0uICovCisJCWxpbWl0W21heExlbl0gPSBwcCt0ZW1wW21heExlbl0tMTsKKwkJYmFzZVttaW5MZW5dID0gMDsKKwl9CisJLyogV2UndmUgZmluaXNoZWQgcmVhZGluZyBhbmQgZGlnZXN0aW5nIHRoZSBibG9jayBoZWFkZXIuICBOb3cKKwkgICByZWFkIHRoaXMgYmxvY2sncyBIdWZmbWFuIGNvZGVkIHN5bWJvbHMgZnJvbSB0aGUgZmlsZSBhbmQKKwkgICB1bmRvIHRoZSBIdWZmbWFuIGNvZGluZyBhbmQgcnVuIGxlbmd0aCBlbmNvZGluZywgc2F2aW5nIHRoZQorCSAgIHJlc3VsdCBpbnRvIGRidWZbZGJ1ZkNvdW50KytdID0gdWMgKi8KKworCS8qIEluaXRpYWxpemUgc3ltYm9sIG9jY3VycmVuY2UgY291bnRlcnMgYW5kIHN5bWJvbCBNb3ZlIFRvCisJICogRnJvbnQgdGFibGUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJYnl0ZUNvdW50W2ldID0gMDsKKwkJbXRmU3ltYm9sW2ldID0gKHVuc2lnbmVkIGNoYXIpaTsKKwl9CisJLyogTG9vcCB0aHJvdWdoIGNvbXByZXNzZWQgc3ltYm9scy4gKi8KKwlydW5Qb3MgPSBkYnVmQ291bnQgPSBzeW1Db3VudCA9IHNlbGVjdG9yID0gMDsKKwlmb3IgKDs7KSB7CisJCS8qIERldGVybWluZSB3aGljaCBIdWZmbWFuIGNvZGluZyBncm91cCB0byB1c2UuICovCisJCWlmICghKHN5bUNvdW50LS0pKSB7CisJCQlzeW1Db3VudCA9IEdST1VQX1NJWkUtMTsKKwkJCWlmIChzZWxlY3RvciA+PSBuU2VsZWN0b3JzKQorCQkJCXJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKwkJCWh1Zkdyb3VwID0gYmQtPmdyb3VwcytzZWxlY3RvcnNbc2VsZWN0b3IrK107CisJCQliYXNlID0gaHVmR3JvdXAtPmJhc2UtMTsKKwkJCWxpbWl0ID0gaHVmR3JvdXAtPmxpbWl0LTE7CisJCX0KKwkJLyogUmVhZCBuZXh0IEh1ZmZtYW4tY29kZWQgc3ltYm9sLiAqLworCQkvKiBOb3RlOiBJdCBpcyBmYXIgY2hlYXBlciB0byByZWFkIG1heExlbiBiaXRzIGFuZAorCQkgICBiYWNrIHVwIHRoYW4gaXQgaXMgdG8gcmVhZCBtaW5MZW4gYml0cyBhbmQgdGhlbiBhbgorCQkgICBhZGRpdGlvbmFsIGJpdCBhdCBhIHRpbWUsIHRlc3RpbmcgYXMgd2UgZ28uCisJCSAgIEJlY2F1c2UgdGhlcmUgaXMgYSB0cmFpbGluZyBsYXN0IGJsb2NrICh3aXRoIGZpbGUKKwkJICAgQ1JDKSwgdGhlcmUgaXMgbm8gZGFuZ2VyIG9mIHRoZSBvdmVycmVhZCBjYXVzaW5nIGFuCisJCSAgIHVuZXhwZWN0ZWQgRU9GIGZvciBhIHZhbGlkIGNvbXByZXNzZWQgZmlsZS4gIEFzIGEKKwkJICAgZnVydGhlciBvcHRpbWl6YXRpb24sIHdlIGRvIHRoZSByZWFkIGlubGluZQorCQkgICAoZmFsbGluZyBiYWNrIHRvIGEgY2FsbCB0byBnZXRfYml0cyBpZiB0aGUgYnVmZmVyCisJCSAgIHJ1bnMgZHJ5KS4gIFRoZSBmb2xsb3dpbmcgKHVwIHRvIGdvdF9odWZmX2JpdHM6KSBpcworCQkgICBlcXVpdmFsZW50IHRvIGogPSBnZXRfYml0cyhiZCwgaHVmR3JvdXAtPm1heExlbik7CisJCSAqLworCQl3aGlsZSAoYmQtPmluYnVmQml0Q291bnQgPCBodWZHcm91cC0+bWF4TGVuKSB7CisJCQlpZiAoYmQtPmluYnVmUG9zID09IGJkLT5pbmJ1ZkNvdW50KSB7CisJCQkJaiA9IGdldF9iaXRzKGJkLCBodWZHcm91cC0+bWF4TGVuKTsKKwkJCQlnb3RvIGdvdF9odWZmX2JpdHM7CisJCQl9CisJCQliZC0+aW5idWZCaXRzID0KKwkJCQkoYmQtPmluYnVmQml0cyA8PCA4KXxiZC0+aW5idWZbYmQtPmluYnVmUG9zKytdOworCQkJYmQtPmluYnVmQml0Q291bnQgKz0gODsKKwkJfTsKKwkJYmQtPmluYnVmQml0Q291bnQgLT0gaHVmR3JvdXAtPm1heExlbjsKKwkJaiA9IChiZC0+aW5idWZCaXRzID4+IGJkLT5pbmJ1ZkJpdENvdW50KSYKKwkJCSgoMSA8PCBodWZHcm91cC0+bWF4TGVuKS0xKTsKK2dvdF9odWZmX2JpdHM6CisJCS8qIEZpZ3VyZSBob3cgaG93IG1hbnkgYml0cyBhcmUgaW4gbmV4dCBzeW1ib2wgYW5kCisJCSAqIHVuZ2V0IGV4dHJhcyAqLworCQlpID0gaHVmR3JvdXAtPm1pbkxlbjsKKwkJd2hpbGUgKGogPiBsaW1pdFtpXSkKKwkJCSsraTsKKwkJYmQtPmluYnVmQml0Q291bnQgKz0gKGh1Zkdyb3VwLT5tYXhMZW4gLSBpKTsKKwkJLyogSHVmZm1hbiBkZWNvZGUgdmFsdWUgdG8gZ2V0IG5leHRTeW0gKHdpdGggYm91bmRzIGNoZWNraW5nKSAqLworCQlpZiAoKGkgPiBodWZHcm91cC0+bWF4TGVuKQorCQkJfHwgKCgodW5zaWduZWQpKGogPSAoaj4+KGh1Zkdyb3VwLT5tYXhMZW4taSkpLWJhc2VbaV0pKQorCQkJCT49IE1BWF9TWU1CT0xTKSkKKwkJCXJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKwkJbmV4dFN5bSA9IGh1Zkdyb3VwLT5wZXJtdXRlW2pdOworCQkvKiBXZSBoYXZlIG5vdyBkZWNvZGVkIHRoZSBzeW1ib2wsIHdoaWNoIGluZGljYXRlcworCQkgICBlaXRoZXIgYSBuZXcgbGl0ZXJhbCBieXRlLCBvciBhIHJlcGVhdGVkIHJ1biBvZiB0aGUKKwkJICAgbW9zdCByZWNlbnQgbGl0ZXJhbCBieXRlLiAgRmlyc3QsIGNoZWNrIGlmIG5leHRTeW0KKwkJICAgaW5kaWNhdGVzIGEgcmVwZWF0ZWQgcnVuLCBhbmQgaWYgc28gbG9vcCBjb2xsZWN0aW5nCisJCSAgIGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgbGFzdCBsaXRlcmFsLiAqLworCQlpZiAoKCh1bnNpZ25lZCluZXh0U3ltKSA8PSBTWU1CT0xfUlVOQikgeyAvKiBSVU5BIG9yIFJVTkIgKi8KKwkJCS8qIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHJ1biwgemVybyBvdXQKKwkJCSAqIGNvdW50ZXIgKi8KKwkJCWlmICghcnVuUG9zKSB7CisJCQkJcnVuUG9zID0gMTsKKwkJCQl0ID0gMDsKKwkJCX0KKwkJCS8qIE5lYXQgdHJpY2sgdGhhdCBzYXZlcyAxIHN5bWJvbDogaW5zdGVhZCBvZgorCQkJICAgb3ItaW5nIDAgb3IgMSBhdCBlYWNoIGJpdCBwb3NpdGlvbiwgYWRkIDEKKwkJCSAgIG9yIDIgaW5zdGVhZC4gIEZvciBleGFtcGxlLCAxMDExIGlzIDEgPDwgMAorCQkJICAgKyAxIDw8IDEgKyAyIDw8IDIuICAxMDEwIGlzIDIgPDwgMCArIDIgPDwgMQorCQkJICAgKyAxIDw8IDIuICBZb3UgY2FuIG1ha2UgYW55IGJpdCBwYXR0ZXJuCisJCQkgICB0aGF0IHdheSB1c2luZyAxIGxlc3Mgc3ltYm9sIHRoYW4gdGhlIGJhc2ljCisJCQkgICBvciAwLzEgbWV0aG9kIChleGNlcHQgYWxsIGJpdHMgMCwgd2hpY2gKKwkJCSAgIHdvdWxkIHVzZSBubyBzeW1ib2xzLCBidXQgYSBydW4gb2YgbGVuZ3RoIDAKKwkJCSAgIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyBpbiB0aGlzIGNvbnRleHQpLgorCQkJICAgVGh1cyBzcGFjZSBpcyBzYXZlZC4gKi8KKwkJCXQgKz0gKHJ1blBvcyA8PCBuZXh0U3ltKTsKKwkJCS8qICtydW5Qb3MgaWYgUlVOQTsgKzIqcnVuUG9zIGlmIFJVTkIgKi8KKworCQkJcnVuUG9zIDw8PSAxOworCQkJY29udGludWU7CisJCX0KKwkJLyogV2hlbiB3ZSBoaXQgdGhlIGZpcnN0IG5vbi1ydW4gc3ltYm9sIGFmdGVyIGEgcnVuLAorCQkgICB3ZSBub3cga25vdyBob3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIGxhc3QKKwkJICAgbGl0ZXJhbCwgc28gYXBwZW5kIHRoYXQgbWFueSBjb3BpZXMgdG8gb3VyIGJ1ZmZlcgorCQkgICBvZiBkZWNvZGVkIHN5bWJvbHMgKGRidWYpIG5vdy4gIChUaGUgbGFzdCBsaXRlcmFsCisJCSAgIHVzZWQgaXMgdGhlIG9uZSBhdCB0aGUgaGVhZCBvZiB0aGUgbXRmU3ltYm9sCisJCSAgIGFycmF5LikgKi8KKwkJaWYgKHJ1blBvcykgeworCQkJcnVuUG9zID0gMDsKKwkJCWlmIChkYnVmQ291bnQrdCA+PSBkYnVmU2l6ZSkKKwkJCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisKKwkJCXVjID0gc3ltVG9CeXRlW210ZlN5bWJvbFswXV07CisJCQlieXRlQ291bnRbdWNdICs9IHQ7CisJCQl3aGlsZSAodC0tKQorCQkJCWRidWZbZGJ1ZkNvdW50KytdID0gdWM7CisJCX0KKwkJLyogSXMgdGhpcyB0aGUgdGVybWluYXRpbmcgc3ltYm9sPyAqLworCQlpZiAobmV4dFN5bSA+IHN5bVRvdGFsKQorCQkJYnJlYWs7CisJCS8qIEF0IHRoaXMgcG9pbnQsIG5leHRTeW0gaW5kaWNhdGVzIGEgbmV3IGxpdGVyYWwKKwkJICAgY2hhcmFjdGVyLiAgU3VidHJhY3Qgb25lIHRvIGdldCB0aGUgcG9zaXRpb24gaW4gdGhlCisJCSAgIE1URiBhcnJheSBhdCB3aGljaCB0aGlzIGxpdGVyYWwgaXMgY3VycmVudGx5IHRvIGJlCisJCSAgIGZvdW5kLiAgKE5vdGUgdGhhdCB0aGUgcmVzdWx0IGNhbid0IGJlIC0xIG9yIDAsCisJCSAgIGJlY2F1c2UgMCBhbmQgMSBhcmUgUlVOQSBhbmQgUlVOQi4gIEJ1dCBhbm90aGVyCisJCSAgIGluc3RhbmNlIG9mIHRoZSBmaXJzdCBzeW1ib2wgaW4gdGhlIG10ZiBhcnJheSwKKwkJICAgcG9zaXRpb24gMCwgd291bGQgaGF2ZSBiZWVuIGhhbmRsZWQgYXMgcGFydCBvZiBhCisJCSAgIHJ1biBhYm92ZS4gIFRoZXJlZm9yZSAxIHVudXNlZCBtdGYgcG9zaXRpb24gbWludXMgMgorCQkgICBub24tbGl0ZXJhbCBuZXh0U3ltIHZhbHVlcyBlcXVhbHMgLTEuKSAqLworCQlpZiAoZGJ1ZkNvdW50ID49IGRidWZTaXplKQorCQkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQlpID0gbmV4dFN5bSAtIDE7CisJCXVjID0gbXRmU3ltYm9sW2ldOworCQkvKiBBZGp1c3QgdGhlIE1URiBhcnJheS4gIFNpbmNlIHdlIHR5cGljYWxseSBleHBlY3QgdG8KKwkJICptb3ZlIG9ubHkgYSBzbWFsbCBudW1iZXIgb2Ygc3ltYm9scywgYW5kIGFyZSBib3VuZAorCQkgKmJ5IDI1NiBpbiBhbnkgY2FzZSwgdXNpbmcgbWVtbW92ZSBoZXJlIHdvdWxkCisJCSAqdHlwaWNhbGx5IGJlIGJpZ2dlciBhbmQgc2xvd2VyIGR1ZSB0byBmdW5jdGlvbiBjYWxsCisJCSAqb3ZlcmhlYWQgYW5kIG90aGVyIGFzc29ydGVkIHNldHVwIGNvc3RzLiAqLworCQlkbyB7CisJCQltdGZTeW1ib2xbaV0gPSBtdGZTeW1ib2xbaS0xXTsKKwkJfSB3aGlsZSAoLS1pKTsKKwkJbXRmU3ltYm9sWzBdID0gdWM7CisJCXVjID0gc3ltVG9CeXRlW3VjXTsKKwkJLyogV2UgaGF2ZSBvdXIgbGl0ZXJhbCBieXRlLiAgU2F2ZSBpdCBpbnRvIGRidWYuICovCisJCWJ5dGVDb3VudFt1Y10rKzsKKwkJZGJ1ZltkYnVmQ291bnQrK10gPSAodW5zaWduZWQgaW50KXVjOworCX0KKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSd2ZSByZWFkIGFsbCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2xzCisJICAgKGFuZCByZXBlYXRlZCBydW5zKSBmb3IgdGhpcyBibG9jayBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sCisJICAgYW5kIGRlY29kZWQgdGhlbSBpbnRvIHRoZSBpbnRlcm1lZGlhdGUgYnVmZmVyLiAgVGhlcmUgYXJlCisJICAgZGJ1ZkNvdW50IG1hbnkgZGVjb2RlZCBieXRlcyBpbiBkYnVmW10uICBOb3cgdW5kbyB0aGUKKwkgICBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtIG9uIGRidWYuICBTZWUKKwkgICBodHRwOi8vZG9nbWEubmV0L21hcmtuL2FydGljbGVzL2J3dC9id3QuaHRtCisJICovCisJLyogVHVybiBieXRlQ291bnQgaW50byBjdW11bGF0aXZlIG9jY3VycmVuY2UgY291bnRzIG9mIDAgdG8gbi0xLiAqLworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlrID0gaitieXRlQ291bnRbaV07CisJCWJ5dGVDb3VudFtpXSA9IGo7CisJCWogPSBrOworCX0KKwkvKiBGaWd1cmUgb3V0IHdoYXQgb3JkZXIgZGJ1ZiB3b3VsZCBiZSBpbiBpZiB3ZSBzb3J0ZWQgaXQuICovCisJZm9yIChpID0gMDsgaSA8IGRidWZDb3VudDsgaSsrKSB7CisJCXVjID0gKHVuc2lnbmVkIGNoYXIpKGRidWZbaV0gJiAweGZmKTsKKwkJZGJ1ZltieXRlQ291bnRbdWNdXSB8PSAoaSA8PCA4KTsKKwkJYnl0ZUNvdW50W3VjXSsrOworCX0KKwkvKiBEZWNvZGUgZmlyc3QgYnl0ZSBieSBoYW5kIHRvIGluaXRpYWxpemUgInByZXZpb3VzIiBieXRlLgorCSAgIE5vdGUgdGhhdCBpdCBkb2Vzbid0IGdldCBvdXRwdXQsIGFuZCBpZiB0aGUgZmlyc3QgdGhyZWUKKwkgICBjaGFyYWN0ZXJzIGFyZSBpZGVudGljYWwgaXQgZG9lc24ndCBxdWFsaWZ5IGFzIGEgcnVuIChoZW5jZQorCSAgIHdyaXRlUnVuQ291bnRkb3duID0gNSkuICovCisJaWYgKGRidWZDb3VudCkgeworCQlpZiAob3JpZ1B0ciA+PSBkYnVmQ291bnQpCisJCQlyZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCWJkLT53cml0ZVBvcyA9IGRidWZbb3JpZ1B0cl07CisJCWJkLT53cml0ZUN1cnJlbnQgPSAodW5zaWduZWQgY2hhcikoYmQtPndyaXRlUG9zJjB4ZmYpOworCQliZC0+d3JpdGVQb3MgPj49IDg7CisJCWJkLT53cml0ZVJ1bkNvdW50ZG93biA9IDU7CisJfQorCWJkLT53cml0ZUNvdW50ID0gZGJ1ZkNvdW50OworCisJcmV0dXJuIFJFVFZBTF9PSzsKK30KKworLyogVW5kbyBidXJyb3dzLXdoZWVsZXIgdHJhbnNmb3JtIG9uIGludGVybWVkaWF0ZSBidWZmZXIgdG8gcHJvZHVjZSBvdXRwdXQuCisgICBJZiBzdGFydF9idW56aXAgd2FzIGluaXRpYWxpemVkIHdpdGggb3V0X2ZkID0tMSwgdGhlbiB1cCB0byBsZW4gYnl0ZXMgb2YKKyAgIGRhdGEgYXJlIHdyaXR0ZW4gdG8gb3V0YnVmLiAgUmV0dXJuIHZhbHVlIGlzIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yCisgICBlcnJvciAoYWxsIGVycm9ycyBhcmUgbmVnYXRpdmUgbnVtYmVycykuICBJZiBvdXRfZmQhPS0xLCBvdXRidWYgYW5kIGxlbgorICAgYXJlIGlnbm9yZWQsIGRhdGEgaXMgd3JpdHRlbiB0byBvdXRfZmQgYW5kIHJldHVybiBpcyBSRVRWQUxfT0sgb3IgZXJyb3IuCisqLworCitzdGF0aWMgaW50IElOSVQgcmVhZF9idW56aXAoc3RydWN0IGJ1bnppcF9kYXRhICpiZCwgY2hhciAqb3V0YnVmLCBpbnQgbGVuKQoreworCWNvbnN0IHVuc2lnbmVkIGludCAqZGJ1ZjsKKwlpbnQgcG9zLCB4Y3VycmVudCwgcHJldmlvdXMsIGdvdGNvdW50OworCisJLyogSWYgbGFzdCByZWFkIHdhcyBzaG9ydCBkdWUgdG8gZW5kIG9mIGZpbGUsIHJldHVybiBsYXN0IGJsb2NrIG5vdyAqLworCWlmIChiZC0+d3JpdGVDb3VudCA8IDApCisJCXJldHVybiBiZC0+d3JpdGVDb3VudDsKKworCWdvdGNvdW50ID0gMDsKKwlkYnVmID0gYmQtPmRidWY7CisJcG9zID0gYmQtPndyaXRlUG9zOworCXhjdXJyZW50ID0gYmQtPndyaXRlQ3VycmVudDsKKworCS8qIFdlIHdpbGwgYWx3YXlzIGhhdmUgcGVuZGluZyBkZWNvZGVkIGRhdGEgdG8gd3JpdGUgaW50byB0aGUgb3V0cHV0CisJICAgYnVmZmVyIHVubGVzcyB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgKGluIHdoaWNoIGNhc2Ugd2UgaGF2ZW4ndAorCSAgIEh1ZmZtYW4tZGVjb2RlZCBhIGJsb2NrIGludG8gdGhlIGludGVybWVkaWF0ZSBidWZmZXIgeWV0KS4gKi8KKworCWlmIChiZC0+d3JpdGVDb3BpZXMpIHsKKwkJLyogSW5zaWRlIHRoZSBsb29wLCB3cml0ZUNvcGllcyBtZWFucyBleHRyYSBjb3BpZXMgKGJleW9uZCAxKSAqLworCQktLWJkLT53cml0ZUNvcGllczsKKwkJLyogTG9vcCBvdXRwdXR0aW5nIGJ5dGVzICovCisJCWZvciAoOzspIHsKKwkJCS8qIElmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwsIHNuYXBzaG90CisJCQkgKiBzdGF0ZSBhbmQgcmV0dXJuICovCisJCQlpZiAoZ290Y291bnQgPj0gbGVuKSB7CisJCQkJYmQtPndyaXRlUG9zID0gcG9zOworCQkJCWJkLT53cml0ZUN1cnJlbnQgPSB4Y3VycmVudDsKKwkJCQliZC0+d3JpdGVDb3BpZXMrKzsKKwkJCQlyZXR1cm4gbGVuOworCQkJfQorCQkJLyogV3JpdGUgbmV4dCBieXRlIGludG8gb3V0cHV0IGJ1ZmZlciwgdXBkYXRpbmcgQ1JDICovCisJCQlvdXRidWZbZ290Y291bnQrK10gPSB4Y3VycmVudDsKKwkJCWJkLT53cml0ZUNSQyA9ICgoKGJkLT53cml0ZUNSQykgPDwgOCkKKwkJCQleYmQtPmNyYzMyVGFibGVbKChiZC0+d3JpdGVDUkMpID4+IDI0KQorCQkJCV54Y3VycmVudF0pOworCQkJLyogTG9vcCBub3cgaWYgd2UncmUgb3V0cHV0dGluZyBtdWx0aXBsZQorCQkJICogY29waWVzIG9mIHRoaXMgYnl0ZSAqLworCQkJaWYgKGJkLT53cml0ZUNvcGllcykgeworCQkJCS0tYmQtPndyaXRlQ29waWVzOworCQkJCWNvbnRpbnVlOworCQkJfQorZGVjb2RlX25leHRfYnl0ZToKKwkJCWlmICghYmQtPndyaXRlQ291bnQtLSkKKwkJCQlicmVhazsKKwkJCS8qIEZvbGxvdyBzZXF1ZW5jZSB2ZWN0b3IgdG8gdW5kbworCQkJICogQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSAqLworCQkJcHJldmlvdXMgPSB4Y3VycmVudDsKKwkJCXBvcyA9IGRidWZbcG9zXTsKKwkJCXhjdXJyZW50ID0gcG9zJjB4ZmY7CisJCQlwb3MgPj49IDg7CisJCQkvKiBBZnRlciAzIGNvbnNlY3V0aXZlIGNvcGllcyBvZiB0aGUgc2FtZQorCQkJICAgYnl0ZSwgdGhlIDR0aCBpcyBhIHJlcGVhdCBjb3VudC4gIFdlIGNvdW50CisJCQkgICBkb3duIGZyb20gNCBpbnN0ZWFkICpvZiBjb3VudGluZyB1cCBiZWNhdXNlCisJCQkgICB0ZXN0aW5nIGZvciBub24temVybyBpcyBmYXN0ZXIgKi8KKwkJCWlmICgtLWJkLT53cml0ZVJ1bkNvdW50ZG93bikgeworCQkJCWlmICh4Y3VycmVudCAhPSBwcmV2aW91cykKKwkJCQkJYmQtPndyaXRlUnVuQ291bnRkb3duID0gNDsKKwkJCX0gZWxzZSB7CisJCQkJLyogV2UgaGF2ZSBhIHJlcGVhdGVkIHJ1biwgdGhpcyBieXRlCisJCQkJICogaW5kaWNhdGVzIHRoZSBjb3VudCAqLworCQkJCWJkLT53cml0ZUNvcGllcyA9IHhjdXJyZW50OworCQkJCXhjdXJyZW50ID0gcHJldmlvdXM7CisJCQkJYmQtPndyaXRlUnVuQ291bnRkb3duID0gNTsKKwkJCQkvKiBTb21ldGltZXMgdGhlcmUgYXJlIGp1c3QgMyBieXRlcworCQkJCSAqIChydW4gbGVuZ3RoIDApICovCisJCQkJaWYgKCFiZC0+d3JpdGVDb3BpZXMpCisJCQkJCWdvdG8gZGVjb2RlX25leHRfYnl0ZTsKKwkJCQkvKiBTdWJ0cmFjdCB0aGUgMSBjb3B5IHdlJ2Qgb3V0cHV0CisJCQkJICogYW55d2F5IHRvIGdldCBleHRyYXMgKi8KKwkJCQktLWJkLT53cml0ZUNvcGllczsKKwkJCX0KKwkJfQorCQkvKiBEZWNvbXByZXNzaW9uIG9mIHRoaXMgYmxvY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworCQliZC0+d3JpdGVDUkMgPSB+YmQtPndyaXRlQ1JDOworCQliZC0+dG90YWxDUkMgPSAoKGJkLT50b3RhbENSQyA8PCAxKSB8CisJCQkJKGJkLT50b3RhbENSQyA+PiAzMSkpIF4gYmQtPndyaXRlQ1JDOworCQkvKiBJZiB0aGlzIGJsb2NrIGhhZCBhIENSQyBlcnJvciwgZm9yY2UgZmlsZSBsZXZlbCBDUkMgZXJyb3IuICovCisJCWlmIChiZC0+d3JpdGVDUkMgIT0gYmQtPmhlYWRlckNSQykgeworCQkJYmQtPnRvdGFsQ1JDID0gYmQtPmhlYWRlckNSQysxOworCQkJcmV0dXJuIFJFVFZBTF9MQVNUX0JMT0NLOworCQl9CisJfQorCisJLyogUmVmaWxsIHRoZSBpbnRlcm1lZGlhdGUgYnVmZmVyIGJ5IEh1ZmZtYW4tZGVjb2RpbmcgbmV4dAorCSAqIGJsb2NrIG9mIGlucHV0ICovCisJLyogKHByZXZpb3VzIGlzIGp1c3QgYSBjb252ZW5pZW50IHVudXNlZCB0ZW1wIHZhcmlhYmxlIGhlcmUpICovCisJcHJldmlvdXMgPSBnZXRfbmV4dF9ibG9jayhiZCk7CisJaWYgKHByZXZpb3VzKSB7CisJCWJkLT53cml0ZUNvdW50ID0gcHJldmlvdXM7CisJCXJldHVybiAocHJldmlvdXMgIT0gUkVUVkFMX0xBU1RfQkxPQ0spID8gcHJldmlvdXMgOiBnb3Rjb3VudDsKKwl9CisJYmQtPndyaXRlQ1JDID0gMHhmZmZmZmZmZlVMOworCXBvcyA9IGJkLT53cml0ZVBvczsKKwl4Y3VycmVudCA9IGJkLT53cml0ZUN1cnJlbnQ7CisJZ290byBkZWNvZGVfbmV4dF9ieXRlOworfQorCitzdGF0aWMgbG9uZyBJTklUIG5vZmlsbCh2b2lkICpidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXJldHVybiAtMTsKK30KKworLyogQWxsb2NhdGUgdGhlIHN0cnVjdHVyZSwgcmVhZCBmaWxlIGhlYWRlci4gIElmIGluX2ZkID09LTEsIGluYnVmIG11c3QgY29udGFpbgorICAgYSBjb21wbGV0ZSBidW56aXAgZmlsZSAobGVuIGJ5dGVzIGxvbmcpLiAgSWYgaW5fZmQhPS0xLCBpbmJ1ZiBhbmQgbGVuIGFyZQorICAgaWdub3JlZCwgYW5kIGRhdGEgaXMgcmVhZCBmcm9tIGZpbGUgaGFuZGxlIGludG8gdGVtcG9yYXJ5IGJ1ZmZlci4gKi8KK3N0YXRpYyBpbnQgSU5JVCBzdGFydF9idW56aXAoc3RydWN0IGJ1bnppcF9kYXRhICoqYmRwLCB2b2lkICppbmJ1ZiwgbG9uZyBsZW4sCisJCQkgICAgIGxvbmcgKCpmaWxsKSh2b2lkKiwgdW5zaWduZWQgbG9uZykpCit7CisJc3RydWN0IGJ1bnppcF9kYXRhICpiZDsKKwl1bnNpZ25lZCBpbnQgaSwgaiwgYzsKKwljb25zdCB1bnNpZ25lZCBpbnQgQlpoMCA9CisJCSgoKHVuc2lnbmVkIGludCknQicpIDw8IDI0KSsoKCh1bnNpZ25lZCBpbnQpJ1onKSA8PCAxNikKKwkJKygoKHVuc2lnbmVkIGludCknaCcpIDw8IDgpKyh1bnNpZ25lZCBpbnQpJzAnOworCisJLyogRmlndXJlIG91dCBob3cgbXVjaCBkYXRhIHRvIGFsbG9jYXRlICovCisJaSA9IHNpemVvZihzdHJ1Y3QgYnVuemlwX2RhdGEpOworCisJLyogQWxsb2NhdGUgYnVuemlwX2RhdGEuICBNb3N0IGZpZWxkcyBpbml0aWFsaXplIHRvIHplcm8uICovCisJYmQgPSAqYmRwID0gbWFsbG9jKGkpOworCWlmICghYmQpCisJCXJldHVybiBSRVRWQUxfT1VUX09GX01FTU9SWTsKKwltZW1zZXQoYmQsIDAsIHNpemVvZihzdHJ1Y3QgYnVuemlwX2RhdGEpKTsKKwkvKiBTZXR1cCBpbnB1dCBidWZmZXIgKi8KKwliZC0+aW5idWYgPSBpbmJ1ZjsKKwliZC0+aW5idWZDb3VudCA9IGxlbjsKKwlpZiAoZmlsbCAhPSBOVUxMKQorCQliZC0+ZmlsbCA9IGZpbGw7CisJZWxzZQorCQliZC0+ZmlsbCA9IG5vZmlsbDsKKworCS8qIEluaXQgdGhlIENSQzMyIHRhYmxlIChiaWcgZW5kaWFuKSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQljID0gaSA8PCAyNDsKKwkJZm9yIChqID0gODsgajsgai0tKQorCQkJYyA9IGMmMHg4MDAwMDAwMCA/IChjIDw8IDEpXjB4MDRjMTFkYjcgOiAoYyA8PCAxKTsKKwkJYmQtPmNyYzMyVGFibGVbaV0gPSBjOworCX0KKworCS8qIEVuc3VyZSB0aGF0IGZpbGUgc3RhcnRzIHdpdGggIkJaaFsnMSctJzknXS4iICovCisJaSA9IGdldF9iaXRzKGJkLCAzMik7CisJaWYgKCgodW5zaWduZWQgaW50KShpLUJaaDAtMSkpID49IDkpCisJCXJldHVybiBSRVRWQUxfTk9UX0JaSVBfREFUQTsKKworCS8qIEZvdXJ0aCBieXRlIChhc2NpaSAnMSctJzknKSwgaW5kaWNhdGVzIGJsb2NrIHNpemUgaW4gdW5pdHMgb2YgMTAwayBvZgorCSAgIHVuY29tcHJlc3NlZCBkYXRhLiAgQWxsb2NhdGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciBmb3IgYmxvY2suICovCisJYmQtPmRidWZTaXplID0gMTAwMDAwKihpLUJaaDApOworCisJYmQtPmRidWYgPSBsYXJnZV9tYWxsb2MoYmQtPmRidWZTaXplICogc2l6ZW9mKGludCkpOworCWlmICghYmQtPmRidWYpCisJCXJldHVybiBSRVRWQUxfT1VUX09GX01FTU9SWTsKKwlyZXR1cm4gUkVUVkFMX09LOworfQorCisvKiBFeGFtcGxlIHVzYWdlOiBkZWNvbXByZXNzIHNyY19mZCB0byBkc3RfZmQuICAoU3RvcHMgYXQgZW5kIG9mIGJ6aXAyIGRhdGEsCisgICBub3QgZW5kIG9mIGZpbGUuKSAqLworU1RBVElDIGludCBJTklUIGJ1bnppcDIodW5zaWduZWQgY2hhciAqYnVmLCBsb25nIGxlbiwKKwkJCWxvbmcgKCpmaWxsKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksCisJCQlsb25nICgqZmx1c2gpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJCXVuc2lnbmVkIGNoYXIgKm91dGJ1ZiwKKwkJCWxvbmcgKnBvcywKKwkJCXZvaWQoKmVycm9yKShjaGFyICp4KSkKK3sKKwlzdHJ1Y3QgYnVuemlwX2RhdGEgKmJkOworCWludCBpID0gLTE7CisJdW5zaWduZWQgY2hhciAqaW5idWY7CisKKwlpZiAoZmx1c2gpCisJCW91dGJ1ZiA9IG1hbGxvYyhCWklQMl9JT0JVRl9TSVpFKTsKKworCWlmICghb3V0YnVmKSB7CisJCWVycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgb3V0cHV0IGJ1ZmZlciIpOworCQlyZXR1cm4gUkVUVkFMX09VVF9PRl9NRU1PUlk7CisJfQorCWlmIChidWYpCisJCWluYnVmID0gYnVmOworCWVsc2UKKwkJaW5idWYgPSBtYWxsb2MoQlpJUDJfSU9CVUZfU0laRSk7CisJaWYgKCFpbmJ1ZikgeworCQllcnJvcigiQ291bGQgbm90IGFsbG9jYXRlIGlucHV0IGJ1ZmZlciIpOworCQlpID0gUkVUVkFMX09VVF9PRl9NRU1PUlk7CisJCWdvdG8gZXhpdF8wOworCX0KKwlpID0gc3RhcnRfYnVuemlwKCZiZCwgaW5idWYsIGxlbiwgZmlsbCk7CisJaWYgKCFpKSB7CisJCWZvciAoOzspIHsKKwkJCWkgPSByZWFkX2J1bnppcChiZCwgb3V0YnVmLCBCWklQMl9JT0JVRl9TSVpFKTsKKwkJCWlmIChpIDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoIWZsdXNoKQorCQkJCW91dGJ1ZiArPSBpOworCQkJZWxzZQorCQkJCWlmIChpICE9IGZsdXNoKG91dGJ1ZiwgaSkpIHsKKwkJCQkJaSA9IFJFVFZBTF9VTkVYUEVDVEVEX09VVFBVVF9FT0Y7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJfQorCX0KKwkvKiBDaGVjayBDUkMgYW5kIHJlbGVhc2UgbWVtb3J5ICovCisJaWYgKGkgPT0gUkVUVkFMX0xBU1RfQkxPQ0spIHsKKwkJaWYgKGJkLT5oZWFkZXJDUkMgIT0gYmQtPnRvdGFsQ1JDKQorCQkJZXJyb3IoIkRhdGEgaW50ZWdyaXR5IGVycm9yIHdoZW4gZGVjb21wcmVzc2luZy4iKTsKKwkJZWxzZQorCQkJaSA9IFJFVFZBTF9PSzsKKwl9IGVsc2UgaWYgKGkgPT0gUkVUVkFMX1VORVhQRUNURURfT1VUUFVUX0VPRikgeworCQllcnJvcigiQ29tcHJlc3NlZCBmaWxlIGVuZHMgdW5leHBlY3RlZGx5Iik7CisJfQorCWlmICghYmQpCisJCWdvdG8gZXhpdF8xOworCWlmIChiZC0+ZGJ1ZikKKwkJbGFyZ2VfZnJlZShiZC0+ZGJ1Zik7CisJaWYgKHBvcykKKwkJKnBvcyA9IGJkLT5pbmJ1ZlBvczsKKwlmcmVlKGJkKTsKK2V4aXRfMToKKwlpZiAoIWJ1ZikKKwkJZnJlZShpbmJ1Zik7CitleGl0XzA6CisJaWYgKGZsdXNoKQorCQlmcmVlKG91dGJ1Zik7CisJcmV0dXJuIGk7Cit9CisKKyNpZmRlZiBQUkVCT09UCitTVEFUSUMgaW50IElOSVQgX19kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBsZW4sCisJCQlsb25nICgqZmlsbCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJbG9uZyAoKmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksCisJCQl1bnNpZ25lZCBjaGFyICpvdXRidWYsIGxvbmcgb2xlbiwKKwkJCWxvbmcgKnBvcywKKwkJCXZvaWQgKCplcnJvcikoY2hhciAqeCkpCit7CisJcmV0dXJuIGJ1bnppcDIoYnVmLCBsZW4gLSA0LCBmaWxsLCBmbHVzaCwgb3V0YnVmLCBwb3MsIGVycm9yKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc19pbmZsYXRlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzX2luZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2I0YjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc19pbmZsYXRlLmMKQEAgLTAsMCArMSwyMDYgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaWZkZWYgU1RBVElDCisjZGVmaW5lIFBSRUJPT1QKKy8qIFByZS1ib290IGVudmlyb25tZW50OiBpbmNsdWRlZCAqLworCisvKiBwcmV2ZW50IGluY2x1c2lvbiBvZiBfTElOVVhfS0VSTkVMX0ggaW4gcHJlLWJvb3QgZW52aXJvbm1lbnQ6IGxvdHMKKyAqIGVycm9ycyBhYm91dCBjb25zb2xlX3ByaW50ayBldGMuLi4gb24gQVJNICovCisjZGVmaW5lIF9MSU5VWF9LRVJORUxfSAorCisjaW5jbHVkZSAiemxpYl9pbmZsYXRlL2luZnRyZWVzLmMiCisjaW5jbHVkZSAiemxpYl9pbmZsYXRlL2luZmZhc3QuYyIKKyNpbmNsdWRlICJ6bGliX2luZmxhdGUvaW5mbGF0ZS5jIgorCisjZWxzZSAvKiBTVEFUSUMgKi8KKy8qIGluaXRyYW1mcyBldCBhbDogbGlua2VkICovCisKKyNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgorCisjaW5jbHVkZSAiemxpYl9pbmZsYXRlL2luZnRyZWVzLmgiCisjaW5jbHVkZSAiemxpYl9pbmZsYXRlL2luZmZhc3QuaCIKKyNpbmNsdWRlICJ6bGliX2luZmxhdGUvaW5mbGF0ZS5oIgorCisjaW5jbHVkZSAiemxpYl9pbmZsYXRlL2luZnV0aWwuaCIKKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL2luZmxhdGUuaD4KKworI2VuZGlmIC8qIFNUQVRJQyAqLworCisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9tbS5oPgorCisjZGVmaW5lIEdaSVBfSU9CVUZfU0laRSAoMTYqMTAyNCkKKworc3RhdGljIGxvbmcgSU5JVCBub2ZpbGwodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qIEluY2x1ZGVkIGZyb20gaW5pdHJhbWZzIGV0IGFsIGNvZGUgKi8KK1NUQVRJQyBpbnQgSU5JVCBfX2d1bnppcCh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgbGVuLAorCQkgICAgICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJICAgICAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3V0X2J1ZiwgbG9uZyBvdXRfbGVuLAorCQkgICAgICAgbG9uZyAqcG9zLAorCQkgICAgICAgdm9pZCgqZXJyb3IpKGNoYXIgKngpKSB7CisJdTggKnpidWY7CisJc3RydWN0IHpfc3RyZWFtX3MgKnN0cm07CisJaW50IHJjOworCisJcmMgPSAtMTsKKwlpZiAoZmx1c2gpIHsKKwkJb3V0X2xlbiA9IDB4ODAwMDsgLyogMzIgSyAqLworCQlvdXRfYnVmID0gbWFsbG9jKG91dF9sZW4pOworCX0gZWxzZSB7CisJCWlmICghb3V0X2xlbikKKwkJCW91dF9sZW4gPSAoKHNpemVfdCl+MCkgLSAoc2l6ZV90KW91dF9idWY7IC8qIG5vIGxpbWl0ICovCisJfQorCWlmICghb3V0X2J1ZikgeworCQllcnJvcigiT3V0IG9mIG1lbW9yeSB3aGlsZSBhbGxvY2F0aW5nIG91dHB1dCBidWZmZXIiKTsKKwkJZ290byBndW56aXBfbm9tZW0xOworCX0KKworCWlmIChidWYpCisJCXpidWYgPSBidWY7CisJZWxzZSB7CisJCXpidWYgPSBtYWxsb2MoR1pJUF9JT0JVRl9TSVpFKTsKKwkJbGVuID0gMDsKKwl9CisJaWYgKCF6YnVmKSB7CisJCWVycm9yKCJPdXQgb2YgbWVtb3J5IHdoaWxlIGFsbG9jYXRpbmcgaW5wdXQgYnVmZmVyIik7CisJCWdvdG8gZ3VuemlwX25vbWVtMjsKKwl9CisKKwlzdHJtID0gbWFsbG9jKHNpemVvZigqc3RybSkpOworCWlmIChzdHJtID09IE5VTEwpIHsKKwkJZXJyb3IoIk91dCBvZiBtZW1vcnkgd2hpbGUgYWxsb2NhdGluZyB6X3N0cmVhbSIpOworCQlnb3RvIGd1bnppcF9ub21lbTM7CisJfQorCisJc3RybS0+d29ya3NwYWNlID0gbWFsbG9jKGZsdXNoID8gemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUoKSA6CisJCQkJIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOworCWlmIChzdHJtLT53b3Jrc3BhY2UgPT0gTlVMTCkgeworCQllcnJvcigiT3V0IG9mIG1lbW9yeSB3aGlsZSBhbGxvY2F0aW5nIHdvcmtzcGFjZSIpOworCQlnb3RvIGd1bnppcF9ub21lbTQ7CisJfQorCisJaWYgKCFmaWxsKQorCQlmaWxsID0gbm9maWxsOworCisJaWYgKGxlbiA9PSAwKQorCQlsZW4gPSBmaWxsKHpidWYsIEdaSVBfSU9CVUZfU0laRSk7CisKKwkvKiB2ZXJpZnkgdGhlIGd6aXAgaGVhZGVyICovCisJaWYgKGxlbiA8IDEwIHx8CisJICAgemJ1ZlswXSAhPSAweDFmIHx8IHpidWZbMV0gIT0gMHg4YiB8fCB6YnVmWzJdICE9IDB4MDgpIHsKKwkJaWYgKHBvcykKKwkJCSpwb3MgPSAwOworCQllcnJvcigiTm90IGEgZ3ppcCBmaWxlIik7CisJCWdvdG8gZ3VuemlwXzU7CisJfQorCisJLyogc2tpcCBvdmVyIGd6aXAgaGVhZGVyICgxZiw4YiwwOC4uLiAxMCBieXRlcyB0b3RhbCArCisJICogcG9zc2libGUgYXNjaXogZmlsZW5hbWUpCisJICovCisJc3RybS0+bmV4dF9pbiA9IHpidWYgKyAxMDsKKwlzdHJtLT5hdmFpbF9pbiA9IGxlbiAtIDEwOworCS8qIHNraXAgb3ZlciBhc2NpeiBmaWxlbmFtZSAqLworCWlmICh6YnVmWzNdICYgMHg4KSB7CisJCWRvIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlsZW5hbWUgZG9lc24ndCBmaXQgaW50byB0aGUgYnVmZmVyLAorCQkJICogdGhlIGZpbGUgaXMgdmVyeSBwcm9iYWJseSBjb3JydXB0LiBEb24ndCB0cnkKKwkJCSAqIHRvIHJlYWQgbW9yZSBkYXRhLgorCQkJICovCisJCQlpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCkgeworCQkJCWVycm9yKCJoZWFkZXIgZXJyb3IiKTsKKwkJCQlnb3RvIGd1bnppcF81OworCQkJfQorCQkJLS1zdHJtLT5hdmFpbF9pbjsKKwkJfSB3aGlsZSAoKnN0cm0tPm5leHRfaW4rKyk7CisJfQorCisJc3RybS0+bmV4dF9vdXQgPSBvdXRfYnVmOworCXN0cm0tPmF2YWlsX291dCA9IG91dF9sZW47CisKKwlyYyA9IHpsaWJfaW5mbGF0ZUluaXQyKHN0cm0sIC1NQVhfV0JJVFMpOworCisJaWYgKCFmbHVzaCkgeworCQlXUyhzdHJtKS0+aW5mbGF0ZV9zdGF0ZS53c2l6ZSA9IDA7CisJCVdTKHN0cm0pLT5pbmZsYXRlX3N0YXRlLndpbmRvdyA9IE5VTEw7CisJfQorCisJd2hpbGUgKHJjID09IFpfT0spIHsKKwkJaWYgKHN0cm0tPmF2YWlsX2luID09IDApIHsKKwkJCS8qIFRPRE86IGhhbmRsZSBjYXNlIHdoZXJlIGJvdGggcG9zIGFuZCBmaWxsIGFyZSBzZXQgKi8KKwkJCWxlbiA9IGZpbGwoemJ1ZiwgR1pJUF9JT0JVRl9TSVpFKTsKKwkJCWlmIChsZW4gPCAwKSB7CisJCQkJcmMgPSAtMTsKKwkJCQllcnJvcigicmVhZCBlcnJvciIpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RybS0+bmV4dF9pbiA9IHpidWY7CisJCQlzdHJtLT5hdmFpbF9pbiA9IGxlbjsKKwkJfQorCQlyYyA9IHpsaWJfaW5mbGF0ZShzdHJtLCAwKTsKKworCQkvKiBXcml0ZSBhbnkgZGF0YSBnZW5lcmF0ZWQgKi8KKwkJaWYgKGZsdXNoICYmIHN0cm0tPm5leHRfb3V0ID4gb3V0X2J1ZikgeworCQkJbG9uZyBsID0gc3RybS0+bmV4dF9vdXQgLSBvdXRfYnVmOworCQkJaWYgKGwgIT0gZmx1c2gob3V0X2J1ZiwgbCkpIHsKKwkJCQlyYyA9IC0xOworCQkJCWVycm9yKCJ3cml0ZSBlcnJvciIpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3RybS0+bmV4dF9vdXQgPSBvdXRfYnVmOworCQkJc3RybS0+YXZhaWxfb3V0ID0gb3V0X2xlbjsKKwkJfQorCisJCS8qIGFmdGVyIFpfRklOSVNILCBvbmx5IFpfU1RSRUFNX0VORCBpcyAid2UgdW5wYWNrZWQgaXQgYWxsIiAqLworCQlpZiAocmMgPT0gWl9TVFJFQU1fRU5EKSB7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmIChyYyAhPSBaX09LKSB7CisJCQllcnJvcigidW5jb21wcmVzc2lvbiBlcnJvciIpOworCQkJcmMgPSAtMTsKKwkJfQorCX0KKworCXpsaWJfaW5mbGF0ZUVuZChzdHJtKTsKKwlpZiAocG9zKQorCQkvKiBhZGQgKyA4IHRvIHNraXAgb3ZlciB0cmFpbGVyICovCisJCSpwb3MgPSBzdHJtLT5uZXh0X2luIC0gemJ1Zis4OworCitndW56aXBfNToKKwlmcmVlKHN0cm0tPndvcmtzcGFjZSk7CitndW56aXBfbm9tZW00OgorCWZyZWUoc3RybSk7CitndW56aXBfbm9tZW0zOgorCWlmICghYnVmKQorCQlmcmVlKHpidWYpOworZ3VuemlwX25vbWVtMjoKKwlpZiAoZmx1c2gpCisJCWZyZWUob3V0X2J1Zik7CitndW56aXBfbm9tZW0xOgorCXJldHVybiByYzsgLyogcmV0dXJucyBaX09LICgwKSBpZiBzdWNjZXNzZnVsICovCit9CisKKyNpZm5kZWYgUFJFQk9PVAorU1RBVElDIGludCBJTklUIGd1bnppcCh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgbGVuLAorCQkgICAgICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJICAgICAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqb3V0X2J1ZiwKKwkJICAgICAgIGxvbmcgKnBvcywKKwkJICAgICAgIHZvaWQgKCplcnJvcikoY2hhciAqeCkpCit7CisJcmV0dXJuIF9fZ3VuemlwKGJ1ZiwgbGVuLCBmaWxsLCBmbHVzaCwgb3V0X2J1ZiwgMCwgcG9zLCBlcnJvcik7Cit9CisjZWxzZQorU1RBVElDIGludCBJTklUIF9fZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgbGVuLAorCQkJICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJCSAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJICAgdW5zaWduZWQgY2hhciAqb3V0X2J1ZiwgbG9uZyBvdXRfbGVuLAorCQkJICAgbG9uZyAqcG9zLAorCQkJICAgdm9pZCAoKmVycm9yKShjaGFyICp4KSkKK3sKKwlyZXR1cm4gX19ndW56aXAoYnVmLCBsZW4sIGZpbGwsIGZsdXNoLCBvdXRfYnVmLCBvdXRfbGVuLCBwb3MsIGVycm9yKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc191bmx6NC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc191bmx6NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMGJhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzX3VubHo0LmMKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBXcmFwcGVyIGZvciBkZWNvbXByZXNzaW5nIExaNC1jb21wcmVzc2VkIGtlcm5lbCwgaW5pdHJhbWZzLCBhbmQgaW5pdHJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEzLCBMRyBFbGVjdHJvbmljcywgS3l1bmdzaWsgTGVlIDxreXVuZ3Npay5sZWVAbGdlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZmRlZiBTVEFUSUMKKyNkZWZpbmUgUFJFQk9PVAorI2luY2x1ZGUgImx6NC9sejRfZGVjb21wcmVzcy5jIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VubHo0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2x6NC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisvKgorICogTm90ZTogVW5jb21wcmVzc2VkIGNodW5rIHNpemUgaXMgdXNlZCBpbiB0aGUgY29tcHJlc3NvciBzaWRlCisgKiAodXNlcnNwYWNlIHNpZGUgZm9yIGNvbXByZXNzaW9uKS4KKyAqIEl0IGlzIGhhcmRjb2RlZCBiZWNhdXNlIHRoZXJlIGlzIG5vdCBwcm9wZXIgd2F5IHRvIGV4dHJhY3QgaXQKKyAqIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0gd2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IHRoZSBwcmVsaW1pbmFyeQorICogdmVyc2lvbiBvZiBMWjQgdG9vbCBzbyBmYXIuCisgKi8KKyNkZWZpbmUgTFo0X0RFRkFVTFRfVU5DT01QUkVTU0VEX0NIVU5LX1NJWkUgKDggPDwgMjApCisjZGVmaW5lIEFSQ0hJVkVfTUFHSUNOVU1CRVIgMHgxODRDMjEwMgorCitTVEFUSUMgaW5saW5lIGludCBJTklUIHVubHo0KHU4ICppbnB1dCwgbG9uZyBpbl9sZW4sCisJCQkJbG9uZyAoKmZpbGwpKHZvaWQgKiwgdW5zaWduZWQgbG9uZyksCisJCQkJbG9uZyAoKmZsdXNoKSh2b2lkICosIHVuc2lnbmVkIGxvbmcpLAorCQkJCXU4ICpvdXRwdXQsIGxvbmcgKnBvc3AsCisJCQkJdm9pZCAoKmVycm9yKSAoY2hhciAqeCkpCit7CisJaW50IHJldCA9IC0xOworCXNpemVfdCBjaHVua3NpemUgPSAwOworCXNpemVfdCB1bmNvbXBfY2h1bmtzaXplID0gTFo0X0RFRkFVTFRfVU5DT01QUkVTU0VEX0NIVU5LX1NJWkU7CisJdTggKmlucDsKKwl1OCAqaW5wX3N0YXJ0OworCXU4ICpvdXRwOworCWxvbmcgc2l6ZSA9IGluX2xlbjsKKyNpZmRlZiBQUkVCT09UCisJc2l6ZV90IG91dF9sZW4gPSBnZXRfdW5hbGlnbmVkX2xlMzIoaW5wdXQgKyBpbl9sZW4pOworI2VuZGlmCisJc2l6ZV90IGRlc3RfbGVuOworCisKKwlpZiAob3V0cHV0KSB7CisJCW91dHAgPSBvdXRwdXQ7CisJfSBlbHNlIGlmICghZmx1c2gpIHsKKwkJZXJyb3IoIk5VTEwgb3V0cHV0IHBvaW50ZXIgYW5kIG5vIGZsdXNoIGZ1bmN0aW9uIHByb3ZpZGVkIik7CisJCWdvdG8gZXhpdF8wOworCX0gZWxzZSB7CisJCW91dHAgPSBsYXJnZV9tYWxsb2ModW5jb21wX2NodW5rc2l6ZSk7CisJCWlmICghb3V0cCkgeworCQkJZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIik7CisJCQlnb3RvIGV4aXRfMDsKKwkJfQorCX0KKworCWlmIChpbnB1dCAmJiBmaWxsKSB7CisJCWVycm9yKCJCb3RoIGlucHV0IHBvaW50ZXIgYW5kIGZpbGwgZnVuY3Rpb24gcHJvdmlkZWQsIik7CisJCWdvdG8gZXhpdF8xOworCX0gZWxzZSBpZiAoaW5wdXQpIHsKKwkJaW5wID0gaW5wdXQ7CisJfSBlbHNlIGlmICghZmlsbCkgeworCQllcnJvcigiTlVMTCBpbnB1dCBwb2ludGVyIGFuZCBtaXNzaW5nIGZpbGwgZnVuY3Rpb24iKTsKKwkJZ290byBleGl0XzE7CisJfSBlbHNlIHsKKwkJaW5wID0gbGFyZ2VfbWFsbG9jKExaNF9jb21wcmVzc0JvdW5kKHVuY29tcF9jaHVua3NpemUpKTsKKwkJaWYgKCFpbnApIHsKKwkJCWVycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgaW5wdXQgYnVmZmVyIik7CisJCQlnb3RvIGV4aXRfMTsKKwkJfQorCX0KKwlpbnBfc3RhcnQgPSBpbnA7CisKKwlpZiAocG9zcCkKKwkJKnBvc3AgPSAwOworCisJaWYgKGZpbGwpIHsKKwkJc2l6ZSA9IGZpbGwoaW5wLCA0KTsKKwkJaWYgKHNpemUgPCA0KSB7CisJCQllcnJvcigiZGF0YSBjb3JydXB0ZWQiKTsKKwkJCWdvdG8gZXhpdF8yOworCQl9CisJfQorCisJY2h1bmtzaXplID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGlucCk7CisJaWYgKGNodW5rc2l6ZSA9PSBBUkNISVZFX01BR0lDTlVNQkVSKSB7CisJCWlmICghZmlsbCkgeworCQkJaW5wICs9IDQ7CisJCQlzaXplIC09IDQ7CisJCX0KKwl9IGVsc2UgeworCQllcnJvcigiaW52YWxpZCBoZWFkZXIiKTsKKwkJZ290byBleGl0XzI7CisJfQorCisJaWYgKHBvc3ApCisJCSpwb3NwICs9IDQ7CisKKwlmb3IgKDs7KSB7CisKKwkJaWYgKGZpbGwpIHsKKwkJCXNpemUgPSBmaWxsKGlucCwgNCk7CisJCQlpZiAoc2l6ZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpemUgPCA0KSB7CisJCQkJZXJyb3IoImRhdGEgY29ycnVwdGVkIik7CisJCQkJZ290byBleGl0XzI7CisJCQl9CisJCX0KKworCQljaHVua3NpemUgPSBnZXRfdW5hbGlnbmVkX2xlMzIoaW5wKTsKKwkJaWYgKGNodW5rc2l6ZSA9PSBBUkNISVZFX01BR0lDTlVNQkVSKSB7CisJCQlpZiAoIWZpbGwpIHsKKwkJCQlpbnAgKz0gNDsKKwkJCQlzaXplIC09IDQ7CisJCQl9CisJCQlpZiAocG9zcCkKKwkJCQkqcG9zcCArPSA0OworCQkJY29udGludWU7CisJCX0KKworCisJCWlmIChwb3NwKQorCQkJKnBvc3AgKz0gNDsKKworCQlpZiAoIWZpbGwpIHsKKwkJCWlucCArPSA0OworCQkJc2l6ZSAtPSA0OworCQl9IGVsc2UgeworCQkJaWYgKGNodW5rc2l6ZSA+IExaNF9jb21wcmVzc0JvdW5kKHVuY29tcF9jaHVua3NpemUpKSB7CisJCQkJZXJyb3IoImNodW5rIGxlbmd0aCBpcyBsb25nZXIgdGhhbiBhbGxvY2F0ZWQiKTsKKwkJCQlnb3RvIGV4aXRfMjsKKwkJCX0KKwkJCXNpemUgPSBmaWxsKGlucCwgY2h1bmtzaXplKTsKKwkJCWlmIChzaXplIDwgY2h1bmtzaXplKSB7CisJCQkJZXJyb3IoImRhdGEgY29ycnVwdGVkIik7CisJCQkJZ290byBleGl0XzI7CisJCQl9CisJCX0KKyNpZmRlZiBQUkVCT09UCisJCWlmIChvdXRfbGVuID49IHVuY29tcF9jaHVua3NpemUpIHsKKwkJCWRlc3RfbGVuID0gdW5jb21wX2NodW5rc2l6ZTsKKwkJCW91dF9sZW4gLT0gZGVzdF9sZW47CisJCX0gZWxzZQorCQkJZGVzdF9sZW4gPSBvdXRfbGVuOworCisJCXJldCA9IExaNF9kZWNvbXByZXNzX2Zhc3QoaW5wLCBvdXRwLCBkZXN0X2xlbik7CisJCWNodW5rc2l6ZSA9IHJldDsKKyNlbHNlCisJCWRlc3RfbGVuID0gdW5jb21wX2NodW5rc2l6ZTsKKworCQlyZXQgPSBMWjRfZGVjb21wcmVzc19zYWZlKGlucCwgb3V0cCwgY2h1bmtzaXplLCBkZXN0X2xlbik7CisJCWRlc3RfbGVuID0gcmV0OworI2VuZGlmCisJCWlmIChyZXQgPCAwKSB7CisJCQllcnJvcigiRGVjb2RpbmcgZmFpbGVkIik7CisJCQlnb3RvIGV4aXRfMjsKKwkJfQorCisJCXJldCA9IC0xOworCQlpZiAoZmx1c2ggJiYgZmx1c2gob3V0cCwgZGVzdF9sZW4pICE9IGRlc3RfbGVuKQorCQkJZ290byBleGl0XzI7CisJCWlmIChvdXRwdXQpCisJCQlvdXRwICs9IGRlc3RfbGVuOworCQlpZiAocG9zcCkKKwkJCSpwb3NwICs9IGNodW5rc2l6ZTsKKworCQlpZiAoIWZpbGwpIHsKKwkJCXNpemUgLT0gY2h1bmtzaXplOworCisJCQlpZiAoc2l6ZSA9PSAwKQorCQkJCWJyZWFrOworCQkJZWxzZSBpZiAoc2l6ZSA8IDApIHsKKwkJCQllcnJvcigiZGF0YSBjb3JydXB0ZWQiKTsKKwkJCQlnb3RvIGV4aXRfMjsKKwkJCX0KKwkJCWlucCArPSBjaHVua3NpemU7CisJCX0KKwl9CisKKwlyZXQgPSAwOworZXhpdF8yOgorCWlmICghaW5wdXQpCisJCWxhcmdlX2ZyZWUoaW5wX3N0YXJ0KTsKK2V4aXRfMToKKwlpZiAoIW91dHB1dCkKKwkJbGFyZ2VfZnJlZShvdXRwKTsKK2V4aXRfMDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgUFJFQk9PVAorU1RBVElDIGludCBJTklUIF9fZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgaW5fbGVuLAorCQkJICAgICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJCSAgICAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0LCBsb25nIG91dF9sZW4sCisJCQkgICAgICBsb25nICpwb3NwLAorCQkJICAgICAgdm9pZCAoKmVycm9yKShjaGFyICp4KQorCSkKK3sKKwlyZXR1cm4gdW5sejQoYnVmLCBpbl9sZW4gLSA0LCBmaWxsLCBmbHVzaCwgb3V0cHV0LCBwb3NwLCBlcnJvcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RlY29tcHJlc3NfdW5sem1hLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzX3VubHptYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkN2ExZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzX3VubHptYS5jCkBAIC0wLDAgKzEsNjc5IEBACisvKiBMem1hIGRlY29tcHJlc3NvciBmb3IgTGludXgga2VybmVsLiBTaGFtZWxlc3NseSBzbmFyZmVkCisgKmZyb20gYnVzeWJveCAxLjEuMQorICoKKyAqTGludXgga2VybmVsIGFkYXB0YXRpb24KKyAqQ29weXJpZ2h0IChDKSAyMDA2ICBBbGFpbiA8IGFsYWluQGtuYWZmLmx1ID4KKyAqCisgKkJhc2VkIG9uIHNtYWxsIGx6bWEgZGVmbGF0ZSBpbXBsZW1lbnRhdGlvbi9TbWFsbCByYW5nZSBjb2RlcgorICppbXBsZW1lbnRhdGlvbiBmb3IgbHptYS4KKyAqQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPCBhdXJlbEBnbnVhZ2Uub3JnID4KKyAqCisgKkJhc2VkIG9uIEx6bWFEZWNvZGUuYyBmcm9tIHRoZSBMWk1BIFNESyA0LjIyIChodHRwOi8vd3d3LjctemlwLm9yZy8pCisgKkNvcHlyaWdodCAoQykgMTk5OS0yMDA1ICBJZ29yIFBhdmxvdgorICoKKyAqQ29weXJpZ2h0cyBvZiB0aGUgcGFydHMsIHNlZSBoZWFkZXJzIGJlbG93LgorICoKKyAqCisgKlRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICpMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICpUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICpGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZmRlZiBTVEFUSUMKKyNkZWZpbmUgUFJFQk9PVAorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VubHptYS5oPgorI2VuZGlmIC8qIFNUQVRJQyAqLworCisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9tbS5oPgorCisjZGVmaW5lCU1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK3N0YXRpYyBsb25nIGxvbmcgSU5JVCByZWFkX2ludCh1bnNpZ25lZCBjaGFyICpwdHIsIGludCBzaXplKQoreworCWludCBpOworCWxvbmcgbG9uZyByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJcmV0ID0gKHJldCA8PCA4KSB8IHB0cltzaXplLWktMV07CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBFTkRJQU5fQ09OVkVSVCh4KSBcCisgIHggPSAodHlwZW9mKHgpKXJlYWRfaW50KCh1bnNpZ25lZCBjaGFyICopJngsIHNpemVvZih4KSkKKworCisvKiBTbWFsbCByYW5nZSBjb2RlciBpbXBsZW1lbnRhdGlvbiBmb3IgbHptYS4KKyAqQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPCBhdXJlbEBnbnVhZ2Uub3JnID4KKyAqCisgKkJhc2VkIG9uIEx6bWFEZWNvZGUuYyBmcm9tIHRoZSBMWk1BIFNESyA0LjIyIChodHRwOi8vd3d3LjctemlwLm9yZy8pCisgKkNvcHlyaWdodCAoYykgMTk5OS0yMDA1ICBJZ29yIFBhdmxvdgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorCisjZGVmaW5lIExaTUFfSU9CVUZfU0laRQkweDEwMDAwCisKK3N0cnVjdCByYyB7CisJbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKTsKKwl1aW50OF90ICpwdHI7CisJdWludDhfdCAqYnVmZmVyOworCXVpbnQ4X3QgKmJ1ZmZlcl9lbmQ7CisJbG9uZyBidWZmZXJfc2l6ZTsKKwl1aW50MzJfdCBjb2RlOworCXVpbnQzMl90IHJhbmdlOworCXVpbnQzMl90IGJvdW5kOworCXZvaWQgKCplcnJvcikoY2hhciAqKTsKK307CisKKworI2RlZmluZSBSQ19UT1BfQklUUyAyNAorI2RlZmluZSBSQ19NT1ZFX0JJVFMgNQorI2RlZmluZSBSQ19NT0RFTF9UT1RBTF9CSVRTIDExCisKKworc3RhdGljIGxvbmcgSU5JVCBub2ZpbGwodm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qIENhbGxlZCB0d2ljZTogb25jZSBhdCBzdGFydHVwIGFuZCBvbmNlIGluIHJjX25vcm1hbGl6ZSgpICovCitzdGF0aWMgdm9pZCBJTklUIHJjX3JlYWQoc3RydWN0IHJjICpyYykKK3sKKwlyYy0+YnVmZmVyX3NpemUgPSByYy0+ZmlsbCgoY2hhciAqKXJjLT5idWZmZXIsIExaTUFfSU9CVUZfU0laRSk7CisJaWYgKHJjLT5idWZmZXJfc2l6ZSA8PSAwKQorCQlyYy0+ZXJyb3IoInVuZXhwZWN0ZWQgRU9GIik7CisJcmMtPnB0ciA9IHJjLT5idWZmZXI7CisJcmMtPmJ1ZmZlcl9lbmQgPSByYy0+YnVmZmVyICsgcmMtPmJ1ZmZlcl9zaXplOworfQorCisvKiBDYWxsZWQgb25jZSAqLworc3RhdGljIGlubGluZSB2b2lkIElOSVQgcmNfaW5pdChzdHJ1Y3QgcmMgKnJjLAorCQkJCSAgICAgICBsb25nICgqZmlsbCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJCSAgICAgICBjaGFyICpidWZmZXIsIGxvbmcgYnVmZmVyX3NpemUpCit7CisJaWYgKGZpbGwpCisJCXJjLT5maWxsID0gZmlsbDsKKwllbHNlCisJCXJjLT5maWxsID0gbm9maWxsOworCXJjLT5idWZmZXIgPSAodWludDhfdCAqKWJ1ZmZlcjsKKwlyYy0+YnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKKwlyYy0+YnVmZmVyX2VuZCA9IHJjLT5idWZmZXIgKyByYy0+YnVmZmVyX3NpemU7CisJcmMtPnB0ciA9IHJjLT5idWZmZXI7CisKKwlyYy0+Y29kZSA9IDA7CisJcmMtPnJhbmdlID0gMHhGRkZGRkZGRjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIElOSVQgcmNfaW5pdF9jb2RlKHN0cnVjdCByYyAqcmMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisJCWlmIChyYy0+cHRyID49IHJjLT5idWZmZXJfZW5kKQorCQkJcmNfcmVhZChyYyk7CisJCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IDgpIHwgKnJjLT5wdHIrKzsKKwl9Cit9CisKKworLyogQ2FsbGVkIHR3aWNlLCBidXQgb25lIGNhbGxzaXRlIGlzIGluIGlubGluZSdkIHJjX2lzX2JpdF8wX2hlbHBlcigpICovCitzdGF0aWMgdm9pZCBJTklUIHJjX2RvX25vcm1hbGl6ZShzdHJ1Y3QgcmMgKnJjKQoreworCWlmIChyYy0+cHRyID49IHJjLT5idWZmZXJfZW5kKQorCQlyY19yZWFkKHJjKTsKKwlyYy0+cmFuZ2UgPDw9IDg7CisJcmMtPmNvZGUgPSAocmMtPmNvZGUgPDwgOCkgfCAqcmMtPnB0cisrOworfQorc3RhdGljIGlubGluZSB2b2lkIElOSVQgcmNfbm9ybWFsaXplKHN0cnVjdCByYyAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8ICgxIDw8IFJDX1RPUF9CSVRTKSkKKwkJcmNfZG9fbm9ybWFsaXplKHJjKTsKK30KKworLyogQ2FsbGVkIDkgdGltZXMgKi8KKy8qIFdoeSByY19pc19iaXRfMF9oZWxwZXIgZXhpc3RzPworICpCZWNhdXNlIHdlIHdhbnQgdG8gYWx3YXlzIGV4cG9zZSAocmMtPmNvZGUgPCByYy0+Ym91bmQpIHRvIG9wdGltaXplcgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IElOSVQgcmNfaXNfYml0XzBfaGVscGVyKHN0cnVjdCByYyAqcmMsIHVpbnQxNl90ICpwKQoreworCXJjX25vcm1hbGl6ZShyYyk7CisJcmMtPmJvdW5kID0gKnAgKiAocmMtPnJhbmdlID4+IFJDX01PREVMX1RPVEFMX0JJVFMpOworCXJldHVybiByYy0+Ym91bmQ7Cit9CitzdGF0aWMgaW5saW5lIGludCBJTklUIHJjX2lzX2JpdF8wKHN0cnVjdCByYyAqcmMsIHVpbnQxNl90ICpwKQoreworCXVpbnQzMl90IHQgPSByY19pc19iaXRfMF9oZWxwZXIocmMsIHApOworCXJldHVybiByYy0+Y29kZSA8IHQ7Cit9CisKKy8qIENhbGxlZCB+MTAgdGltZXMsIGJ1dCB2ZXJ5IHNtYWxsLCB0aHVzIGlubGluZWQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBJTklUIHJjX3VwZGF0ZV9iaXRfMChzdHJ1Y3QgcmMgKnJjLCB1aW50MTZfdCAqcCkKK3sKKwlyYy0+cmFuZ2UgPSByYy0+Ym91bmQ7CisJKnAgKz0gKCgxIDw8IFJDX01PREVMX1RPVEFMX0JJVFMpIC0gKnApID4+IFJDX01PVkVfQklUUzsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBJTklUIHJjX3VwZGF0ZV9iaXRfMShzdHJ1Y3QgcmMgKnJjLCB1aW50MTZfdCAqcCkKK3sKKwlyYy0+cmFuZ2UgLT0gcmMtPmJvdW5kOworCXJjLT5jb2RlIC09IHJjLT5ib3VuZDsKKwkqcCAtPSAqcCA+PiBSQ19NT1ZFX0JJVFM7Cit9CisKKy8qIENhbGxlZCA0IHRpbWVzIGluIHVubHptYSBsb29wICovCitzdGF0aWMgaW50IElOSVQgcmNfZ2V0X2JpdChzdHJ1Y3QgcmMgKnJjLCB1aW50MTZfdCAqcCwgaW50ICpzeW1ib2wpCit7CisJaWYgKHJjX2lzX2JpdF8wKHJjLCBwKSkgeworCQlyY191cGRhdGVfYml0XzAocmMsIHApOworCQkqc3ltYm9sICo9IDI7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCXJjX3VwZGF0ZV9iaXRfMShyYywgcCk7CisJCSpzeW1ib2wgPSAqc3ltYm9sICogMiArIDE7CisJCXJldHVybiAxOworCX0KK30KKworLyogQ2FsbGVkIG9uY2UgKi8KK3N0YXRpYyBpbmxpbmUgaW50IElOSVQgcmNfZGlyZWN0X2JpdChzdHJ1Y3QgcmMgKnJjKQoreworCXJjX25vcm1hbGl6ZShyYyk7CisJcmMtPnJhbmdlID4+PSAxOworCWlmIChyYy0+Y29kZSA+PSByYy0+cmFuZ2UpIHsKKwkJcmMtPmNvZGUgLT0gcmMtPnJhbmdlOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB0d2ljZSAqLworc3RhdGljIGlubGluZSB2b2lkIElOSVQKK3JjX2JpdF90cmVlX2RlY29kZShzdHJ1Y3QgcmMgKnJjLCB1aW50MTZfdCAqcCwgaW50IG51bV9sZXZlbHMsIGludCAqc3ltYm9sKQoreworCWludCBpID0gbnVtX2xldmVsczsKKworCSpzeW1ib2wgPSAxOworCXdoaWxlIChpLS0pCisJCXJjX2dldF9iaXQocmMsIHAgKyAqc3ltYm9sLCBzeW1ib2wpOworCSpzeW1ib2wgLT0gMSA8PCBudW1fbGV2ZWxzOworfQorCisKKy8qCisgKiBTbWFsbCBsem1hIGRlZmxhdGUgaW1wbGVtZW50YXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8IGF1cmVsQGdudWFnZS5vcmcgPgorICoKKyAqIEJhc2VkIG9uIEx6bWFEZWNvZGUuYyBmcm9tIHRoZSBMWk1BIFNESyA0LjIyIChodHRwOi8vd3d3LjctemlwLm9yZy8pCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSAgSWdvciBQYXZsb3YKKyAqLworCisKK3N0cnVjdCBsem1hX2hlYWRlciB7CisJdWludDhfdCBwb3M7CisJdWludDMyX3QgZGljdF9zaXplOworCXVpbnQ2NF90IGRzdF9zaXplOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgOworCisKKyNkZWZpbmUgTFpNQV9CQVNFX1NJWkUgMTg0NgorI2RlZmluZSBMWk1BX0xJVF9TSVpFIDc2OAorCisjZGVmaW5lIExaTUFfTlVNX1BPU19CSVRTX01BWCA0CisKKyNkZWZpbmUgTFpNQV9MRU5fTlVNX0xPV19CSVRTIDMKKyNkZWZpbmUgTFpNQV9MRU5fTlVNX01JRF9CSVRTIDMKKyNkZWZpbmUgTFpNQV9MRU5fTlVNX0hJR0hfQklUUyA4CisKKyNkZWZpbmUgTFpNQV9MRU5fQ0hPSUNFIDAKKyNkZWZpbmUgTFpNQV9MRU5fQ0hPSUNFXzIgKExaTUFfTEVOX0NIT0lDRSArIDEpCisjZGVmaW5lIExaTUFfTEVOX0xPVyAoTFpNQV9MRU5fQ0hPSUNFXzIgKyAxKQorI2RlZmluZSBMWk1BX0xFTl9NSUQgKExaTUFfTEVOX0xPVyBcCisJCSAgICAgICsgKDEgPDwgKExaTUFfTlVNX1BPU19CSVRTX01BWCArIExaTUFfTEVOX05VTV9MT1dfQklUUykpKQorI2RlZmluZSBMWk1BX0xFTl9ISUdIIChMWk1BX0xFTl9NSUQgXAorCQkgICAgICAgKygxIDw8IChMWk1BX05VTV9QT1NfQklUU19NQVggKyBMWk1BX0xFTl9OVU1fTUlEX0JJVFMpKSkKKyNkZWZpbmUgTFpNQV9OVU1fTEVOX1BST0JTIChMWk1BX0xFTl9ISUdIICsgKDEgPDwgTFpNQV9MRU5fTlVNX0hJR0hfQklUUykpCisKKyNkZWZpbmUgTFpNQV9OVU1fU1RBVEVTIDEyCisjZGVmaW5lIExaTUFfTlVNX0xJVF9TVEFURVMgNworCisjZGVmaW5lIExaTUFfU1RBUlRfUE9TX01PREVMX0lOREVYIDQKKyNkZWZpbmUgTFpNQV9FTkRfUE9TX01PREVMX0lOREVYIDE0CisjZGVmaW5lIExaTUFfTlVNX0ZVTExfRElTVEFOQ0VTICgxIDw8IChMWk1BX0VORF9QT1NfTU9ERUxfSU5ERVggPj4gMSkpCisKKyNkZWZpbmUgTFpNQV9OVU1fUE9TX1NMT1RfQklUUyA2CisjZGVmaW5lIExaTUFfTlVNX0xFTl9UT19QT1NfU1RBVEVTIDQKKworI2RlZmluZSBMWk1BX05VTV9BTElHTl9CSVRTIDQKKworI2RlZmluZSBMWk1BX01BVENIX01JTl9MRU4gMgorCisjZGVmaW5lIExaTUFfSVNfTUFUQ0ggMAorI2RlZmluZSBMWk1BX0lTX1JFUCAoTFpNQV9JU19NQVRDSCArIChMWk1BX05VTV9TVEFURVMgPDwgTFpNQV9OVU1fUE9TX0JJVFNfTUFYKSkKKyNkZWZpbmUgTFpNQV9JU19SRVBfRzAgKExaTUFfSVNfUkVQICsgTFpNQV9OVU1fU1RBVEVTKQorI2RlZmluZSBMWk1BX0lTX1JFUF9HMSAoTFpNQV9JU19SRVBfRzAgKyBMWk1BX05VTV9TVEFURVMpCisjZGVmaW5lIExaTUFfSVNfUkVQX0cyIChMWk1BX0lTX1JFUF9HMSArIExaTUFfTlVNX1NUQVRFUykKKyNkZWZpbmUgTFpNQV9JU19SRVBfMF9MT05HIChMWk1BX0lTX1JFUF9HMiArIExaTUFfTlVNX1NUQVRFUykKKyNkZWZpbmUgTFpNQV9QT1NfU0xPVCAoTFpNQV9JU19SRVBfMF9MT05HIFwKKwkJICAgICAgICsgKExaTUFfTlVNX1NUQVRFUyA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpKQorI2RlZmluZSBMWk1BX1NQRUNfUE9TIChMWk1BX1BPU19TTE9UIFwKKwkJICAgICAgICsoTFpNQV9OVU1fTEVOX1RPX1BPU19TVEFURVMgPDwgTFpNQV9OVU1fUE9TX1NMT1RfQklUUykpCisjZGVmaW5lIExaTUFfQUxJR04gKExaTUFfU1BFQ19QT1MgXAorCQkgICAgKyBMWk1BX05VTV9GVUxMX0RJU1RBTkNFUyAtIExaTUFfRU5EX1BPU19NT0RFTF9JTkRFWCkKKyNkZWZpbmUgTFpNQV9MRU5fQ09ERVIgKExaTUFfQUxJR04gKyAoMSA8PCBMWk1BX05VTV9BTElHTl9CSVRTKSkKKyNkZWZpbmUgTFpNQV9SRVBfTEVOX0NPREVSIChMWk1BX0xFTl9DT0RFUiArIExaTUFfTlVNX0xFTl9QUk9CUykKKyNkZWZpbmUgTFpNQV9MSVRFUkFMIChMWk1BX1JFUF9MRU5fQ09ERVIgKyBMWk1BX05VTV9MRU5fUFJPQlMpCisKKworc3RydWN0IHdyaXRlciB7CisJdWludDhfdCAqYnVmZmVyOworCXVpbnQ4X3QgcHJldmlvdXNfYnl0ZTsKKwlzaXplX3QgYnVmZmVyX3BvczsKKwlpbnQgYnVmc2l6ZTsKKwlzaXplX3QgZ2xvYmFsX3BvczsKKwlsb25nICgqZmx1c2gpKHZvaWQqLCB1bnNpZ25lZCBsb25nKTsKKwlzdHJ1Y3QgbHptYV9oZWFkZXIgKmhlYWRlcjsKK307CisKK3N0cnVjdCBjc3RhdGUgeworCWludCBzdGF0ZTsKKwl1aW50MzJfdCByZXAwLCByZXAxLCByZXAyLCByZXAzOworfTsKKworc3RhdGljIGlubGluZSBzaXplX3QgSU5JVCBnZXRfcG9zKHN0cnVjdCB3cml0ZXIgKndyKQoreworCXJldHVybgorCQl3ci0+Z2xvYmFsX3BvcyArIHdyLT5idWZmZXJfcG9zOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgSU5JVCBwZWVrX29sZF9ieXRlKHN0cnVjdCB3cml0ZXIgKndyLAorCQkJCQkJdWludDMyX3Qgb2ZmcykKK3sKKwlpZiAoIXdyLT5mbHVzaCkgeworCQlpbnQzMl90IHBvczsKKwkJd2hpbGUgKG9mZnMgPiB3ci0+aGVhZGVyLT5kaWN0X3NpemUpCisJCQlvZmZzIC09IHdyLT5oZWFkZXItPmRpY3Rfc2l6ZTsKKwkJcG9zID0gd3ItPmJ1ZmZlcl9wb3MgLSBvZmZzOworCQlyZXR1cm4gd3ItPmJ1ZmZlcltwb3NdOworCX0gZWxzZSB7CisJCXVpbnQzMl90IHBvcyA9IHdyLT5idWZmZXJfcG9zIC0gb2ZmczsKKwkJd2hpbGUgKHBvcyA+PSB3ci0+aGVhZGVyLT5kaWN0X3NpemUpCisJCQlwb3MgKz0gd3ItPmhlYWRlci0+ZGljdF9zaXplOworCQlyZXR1cm4gd3ItPmJ1ZmZlcltwb3NdOworCX0KKworfQorCitzdGF0aWMgaW5saW5lIGludCBJTklUIHdyaXRlX2J5dGUoc3RydWN0IHdyaXRlciAqd3IsIHVpbnQ4X3QgYnl0ZSkKK3sKKwl3ci0+YnVmZmVyW3dyLT5idWZmZXJfcG9zKytdID0gd3ItPnByZXZpb3VzX2J5dGUgPSBieXRlOworCWlmICh3ci0+Zmx1c2ggJiYgd3ItPmJ1ZmZlcl9wb3MgPT0gd3ItPmhlYWRlci0+ZGljdF9zaXplKSB7CisJCXdyLT5idWZmZXJfcG9zID0gMDsKKwkJd3ItPmdsb2JhbF9wb3MgKz0gd3ItPmhlYWRlci0+ZGljdF9zaXplOworCQlpZiAod3ItPmZsdXNoKChjaGFyICopd3ItPmJ1ZmZlciwgd3ItPmhlYWRlci0+ZGljdF9zaXplKQorCQkJCSE9IHdyLT5oZWFkZXItPmRpY3Rfc2l6ZSkKKwkJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgSU5JVCBjb3B5X2J5dGUoc3RydWN0IHdyaXRlciAqd3IsIHVpbnQzMl90IG9mZnMpCit7CisJcmV0dXJuIHdyaXRlX2J5dGUod3IsIHBlZWtfb2xkX2J5dGUod3IsIG9mZnMpKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgSU5JVCBjb3B5X2J5dGVzKHN0cnVjdCB3cml0ZXIgKndyLAorCQkJCQkgdWludDMyX3QgcmVwMCwgaW50IGxlbikKK3sKKwlkbyB7CisJCWlmIChjb3B5X2J5dGUod3IsIHJlcDApKQorCQkJcmV0dXJuIC0xOworCQlsZW4tLTsKKwl9IHdoaWxlIChsZW4gIT0gMCAmJiB3ci0+YnVmZmVyX3BvcyA8IHdyLT5oZWFkZXItPmRzdF9zaXplKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IElOSVQgcHJvY2Vzc19iaXQwKHN0cnVjdCB3cml0ZXIgKndyLCBzdHJ1Y3QgcmMgKnJjLAorCQkJCSAgICAgc3RydWN0IGNzdGF0ZSAqY3N0LCB1aW50MTZfdCAqcCwKKwkJCQkgICAgIGludCBwb3Nfc3RhdGUsIHVpbnQxNl90ICpwcm9iLAorCQkJCSAgICAgaW50IGxjLCB1aW50MzJfdCBsaXRlcmFsX3Bvc19tYXNrKSB7CisJaW50IG1pID0gMTsKKwlyY191cGRhdGVfYml0XzAocmMsIHByb2IpOworCXByb2IgPSAocCArIExaTUFfTElURVJBTCArCisJCShMWk1BX0xJVF9TSVpFCisJCSAqICgoKGdldF9wb3Mod3IpICYgbGl0ZXJhbF9wb3NfbWFzaykgPDwgbGMpCisJCSAgICArICh3ci0+cHJldmlvdXNfYnl0ZSA+PiAoOCAtIGxjKSkpKQorCQkpOworCisJaWYgKGNzdC0+c3RhdGUgPj0gTFpNQV9OVU1fTElUX1NUQVRFUykgeworCQlpbnQgbWF0Y2hfYnl0ZSA9IHBlZWtfb2xkX2J5dGUod3IsIGNzdC0+cmVwMCk7CisJCWRvIHsKKwkJCWludCBiaXQ7CisJCQl1aW50MTZfdCAqcHJvYl9saXQ7CisKKwkJCW1hdGNoX2J5dGUgPDw9IDE7CisJCQliaXQgPSBtYXRjaF9ieXRlICYgMHgxMDA7CisJCQlwcm9iX2xpdCA9IHByb2IgKyAweDEwMCArIGJpdCArIG1pOworCQkJaWYgKHJjX2dldF9iaXQocmMsIHByb2JfbGl0LCAmbWkpKSB7CisJCQkJaWYgKCFiaXQpCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoYml0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJfSB3aGlsZSAobWkgPCAweDEwMCk7CisJfQorCXdoaWxlIChtaSA8IDB4MTAwKSB7CisJCXVpbnQxNl90ICpwcm9iX2xpdCA9IHByb2IgKyBtaTsKKwkJcmNfZ2V0X2JpdChyYywgcHJvYl9saXQsICZtaSk7CisJfQorCWlmIChjc3QtPnN0YXRlIDwgNCkKKwkJY3N0LT5zdGF0ZSA9IDA7CisJZWxzZSBpZiAoY3N0LT5zdGF0ZSA8IDEwKQorCQljc3QtPnN0YXRlIC09IDM7CisJZWxzZQorCQljc3QtPnN0YXRlIC09IDY7CisKKwlyZXR1cm4gd3JpdGVfYnl0ZSh3ciwgbWkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBJTklUIHByb2Nlc3NfYml0MShzdHJ1Y3Qgd3JpdGVyICp3ciwgc3RydWN0IHJjICpyYywKKwkJCQkJICAgIHN0cnVjdCBjc3RhdGUgKmNzdCwgdWludDE2X3QgKnAsCisJCQkJCSAgICBpbnQgcG9zX3N0YXRlLCB1aW50MTZfdCAqcHJvYikgeworICBpbnQgb2Zmc2V0OworCXVpbnQxNl90ICpwcm9iX2xlbjsKKwlpbnQgbnVtX2JpdHM7CisJaW50IGxlbjsKKworCXJjX3VwZGF0ZV9iaXRfMShyYywgcHJvYik7CisJcHJvYiA9IHAgKyBMWk1BX0lTX1JFUCArIGNzdC0+c3RhdGU7CisJaWYgKHJjX2lzX2JpdF8wKHJjLCBwcm9iKSkgeworCQlyY191cGRhdGVfYml0XzAocmMsIHByb2IpOworCQljc3QtPnJlcDMgPSBjc3QtPnJlcDI7CisJCWNzdC0+cmVwMiA9IGNzdC0+cmVwMTsKKwkJY3N0LT5yZXAxID0gY3N0LT5yZXAwOworCQljc3QtPnN0YXRlID0gY3N0LT5zdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPyAwIDogMzsKKwkJcHJvYiA9IHAgKyBMWk1BX0xFTl9DT0RFUjsKKwl9IGVsc2UgeworCQlyY191cGRhdGVfYml0XzEocmMsIHByb2IpOworCQlwcm9iID0gcCArIExaTUFfSVNfUkVQX0cwICsgY3N0LT5zdGF0ZTsKKwkJaWYgKHJjX2lzX2JpdF8wKHJjLCBwcm9iKSkgeworCQkJcmNfdXBkYXRlX2JpdF8wKHJjLCBwcm9iKTsKKwkJCXByb2IgPSAocCArIExaTUFfSVNfUkVQXzBfTE9ORworCQkJCSsgKGNzdC0+c3RhdGUgPDwKKwkJCQkgICBMWk1BX05VTV9QT1NfQklUU19NQVgpICsKKwkJCQlwb3Nfc3RhdGUpOworCQkJaWYgKHJjX2lzX2JpdF8wKHJjLCBwcm9iKSkgeworCQkJCXJjX3VwZGF0ZV9iaXRfMChyYywgcHJvYik7CisKKwkJCQljc3QtPnN0YXRlID0gY3N0LT5zdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPworCQkJCQk5IDogMTE7CisJCQkJcmV0dXJuIGNvcHlfYnl0ZSh3ciwgY3N0LT5yZXAwKTsKKwkJCX0gZWxzZSB7CisJCQkJcmNfdXBkYXRlX2JpdF8xKHJjLCBwcm9iKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVpbnQzMl90IGRpc3RhbmNlOworCisJCQlyY191cGRhdGVfYml0XzEocmMsIHByb2IpOworCQkJcHJvYiA9IHAgKyBMWk1BX0lTX1JFUF9HMSArIGNzdC0+c3RhdGU7CisJCQlpZiAocmNfaXNfYml0XzAocmMsIHByb2IpKSB7CisJCQkJcmNfdXBkYXRlX2JpdF8wKHJjLCBwcm9iKTsKKwkJCQlkaXN0YW5jZSA9IGNzdC0+cmVwMTsKKwkJCX0gZWxzZSB7CisJCQkJcmNfdXBkYXRlX2JpdF8xKHJjLCBwcm9iKTsKKwkJCQlwcm9iID0gcCArIExaTUFfSVNfUkVQX0cyICsgY3N0LT5zdGF0ZTsKKwkJCQlpZiAocmNfaXNfYml0XzAocmMsIHByb2IpKSB7CisJCQkJCXJjX3VwZGF0ZV9iaXRfMChyYywgcHJvYik7CisJCQkJCWRpc3RhbmNlID0gY3N0LT5yZXAyOworCQkJCX0gZWxzZSB7CisJCQkJCXJjX3VwZGF0ZV9iaXRfMShyYywgcHJvYik7CisJCQkJCWRpc3RhbmNlID0gY3N0LT5yZXAzOworCQkJCQljc3QtPnJlcDMgPSBjc3QtPnJlcDI7CisJCQkJfQorCQkJCWNzdC0+cmVwMiA9IGNzdC0+cmVwMTsKKwkJCX0KKwkJCWNzdC0+cmVwMSA9IGNzdC0+cmVwMDsKKwkJCWNzdC0+cmVwMCA9IGRpc3RhbmNlOworCQl9CisJCWNzdC0+c3RhdGUgPSBjc3QtPnN0YXRlIDwgTFpNQV9OVU1fTElUX1NUQVRFUyA/IDggOiAxMTsKKwkJcHJvYiA9IHAgKyBMWk1BX1JFUF9MRU5fQ09ERVI7CisJfQorCisJcHJvYl9sZW4gPSBwcm9iICsgTFpNQV9MRU5fQ0hPSUNFOworCWlmIChyY19pc19iaXRfMChyYywgcHJvYl9sZW4pKSB7CisJCXJjX3VwZGF0ZV9iaXRfMChyYywgcHJvYl9sZW4pOworCQlwcm9iX2xlbiA9IChwcm9iICsgTFpNQV9MRU5fTE9XCisJCQkgICAgKyAocG9zX3N0YXRlIDw8CisJCQkgICAgICAgTFpNQV9MRU5fTlVNX0xPV19CSVRTKSk7CisJCW9mZnNldCA9IDA7CisJCW51bV9iaXRzID0gTFpNQV9MRU5fTlVNX0xPV19CSVRTOworCX0gZWxzZSB7CisJCXJjX3VwZGF0ZV9iaXRfMShyYywgcHJvYl9sZW4pOworCQlwcm9iX2xlbiA9IHByb2IgKyBMWk1BX0xFTl9DSE9JQ0VfMjsKKwkJaWYgKHJjX2lzX2JpdF8wKHJjLCBwcm9iX2xlbikpIHsKKwkJCXJjX3VwZGF0ZV9iaXRfMChyYywgcHJvYl9sZW4pOworCQkJcHJvYl9sZW4gPSAocHJvYiArIExaTUFfTEVOX01JRAorCQkJCSAgICArIChwb3Nfc3RhdGUgPDwKKwkJCQkgICAgICAgTFpNQV9MRU5fTlVNX01JRF9CSVRTKSk7CisJCQlvZmZzZXQgPSAxIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUzsKKwkJCW51bV9iaXRzID0gTFpNQV9MRU5fTlVNX01JRF9CSVRTOworCQl9IGVsc2UgeworCQkJcmNfdXBkYXRlX2JpdF8xKHJjLCBwcm9iX2xlbik7CisJCQlwcm9iX2xlbiA9IHByb2IgKyBMWk1BX0xFTl9ISUdIOworCQkJb2Zmc2V0ID0gKCgxIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUykKKwkJCQkgICsgKDEgPDwgTFpNQV9MRU5fTlVNX01JRF9CSVRTKSk7CisJCQludW1fYml0cyA9IExaTUFfTEVOX05VTV9ISUdIX0JJVFM7CisJCX0KKwl9CisKKwlyY19iaXRfdHJlZV9kZWNvZGUocmMsIHByb2JfbGVuLCBudW1fYml0cywgJmxlbik7CisJbGVuICs9IG9mZnNldDsKKworCWlmIChjc3QtPnN0YXRlIDwgNCkgeworCQlpbnQgcG9zX3Nsb3Q7CisKKwkJY3N0LT5zdGF0ZSArPSBMWk1BX05VTV9MSVRfU1RBVEVTOworCQlwcm9iID0KKwkJCXAgKyBMWk1BX1BPU19TTE9UICsKKwkJCSgobGVuIDwKKwkJCSAgTFpNQV9OVU1fTEVOX1RPX1BPU19TVEFURVMgPyBsZW4gOgorCQkJICBMWk1BX05VTV9MRU5fVE9fUE9TX1NUQVRFUyAtIDEpCisJCQkgPDwgTFpNQV9OVU1fUE9TX1NMT1RfQklUUyk7CisJCXJjX2JpdF90cmVlX2RlY29kZShyYywgcHJvYiwKKwkJCQkgICBMWk1BX05VTV9QT1NfU0xPVF9CSVRTLAorCQkJCSAgICZwb3Nfc2xvdCk7CisJCWlmIChwb3Nfc2xvdCA+PSBMWk1BX1NUQVJUX1BPU19NT0RFTF9JTkRFWCkgeworCQkJaW50IGksIG1pOworCQkJbnVtX2JpdHMgPSAocG9zX3Nsb3QgPj4gMSkgLSAxOworCQkJY3N0LT5yZXAwID0gMiB8IChwb3Nfc2xvdCAmIDEpOworCQkJaWYgKHBvc19zbG90IDwgTFpNQV9FTkRfUE9TX01PREVMX0lOREVYKSB7CisJCQkJY3N0LT5yZXAwIDw8PSBudW1fYml0czsKKwkJCQlwcm9iID0gcCArIExaTUFfU1BFQ19QT1MgKworCQkJCQljc3QtPnJlcDAgLSBwb3Nfc2xvdCAtIDE7CisJCQl9IGVsc2UgeworCQkJCW51bV9iaXRzIC09IExaTUFfTlVNX0FMSUdOX0JJVFM7CisJCQkJd2hpbGUgKG51bV9iaXRzLS0pCisJCQkJCWNzdC0+cmVwMCA9IChjc3QtPnJlcDAgPDwgMSkgfAorCQkJCQkJcmNfZGlyZWN0X2JpdChyYyk7CisJCQkJcHJvYiA9IHAgKyBMWk1BX0FMSUdOOworCQkJCWNzdC0+cmVwMCA8PD0gTFpNQV9OVU1fQUxJR05fQklUUzsKKwkJCQludW1fYml0cyA9IExaTUFfTlVNX0FMSUdOX0JJVFM7CisJCQl9CisJCQlpID0gMTsKKwkJCW1pID0gMTsKKwkJCXdoaWxlIChudW1fYml0cy0tKSB7CisJCQkJaWYgKHJjX2dldF9iaXQocmMsIHByb2IgKyBtaSwgJm1pKSkKKwkJCQkJY3N0LT5yZXAwIHw9IGk7CisJCQkJaSA8PD0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQljc3QtPnJlcDAgPSBwb3Nfc2xvdDsKKwkJaWYgKCsrKGNzdC0+cmVwMCkgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoY3N0LT5yZXAwID4gd3ItPmhlYWRlci0+ZGljdF9zaXplCisJCQkJfHwgY3N0LT5yZXAwID4gZ2V0X3Bvcyh3cikpCisJCQlyZXR1cm4gLTE7CisJfQorCisJbGVuICs9IExaTUFfTUFUQ0hfTUlOX0xFTjsKKworCXJldHVybiBjb3B5X2J5dGVzKHdyLCBjc3QtPnJlcDAsIGxlbik7Cit9CisKKworCitTVEFUSUMgaW5saW5lIGludCBJTklUIHVubHptYSh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgaW5fbGVuLAorCQkJICAgICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJCSAgICAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJICAgICAgdW5zaWduZWQgY2hhciAqb3V0cHV0LAorCQkJICAgICAgbG9uZyAqcG9zcCwKKwkJCSAgICAgIHZvaWQoKmVycm9yKShjaGFyICp4KQorCSkKK3sKKwlzdHJ1Y3QgbHptYV9oZWFkZXIgaGVhZGVyOworCWludCBsYywgcGIsIGxwOworCXVpbnQzMl90IHBvc19zdGF0ZV9tYXNrOworCXVpbnQzMl90IGxpdGVyYWxfcG9zX21hc2s7CisJdWludDE2X3QgKnA7CisJaW50IG51bV9wcm9iczsKKwlzdHJ1Y3QgcmMgcmM7CisJaW50IGksIG1pOworCXN0cnVjdCB3cml0ZXIgd3I7CisJc3RydWN0IGNzdGF0ZSBjc3Q7CisJdW5zaWduZWQgY2hhciAqaW5idWY7CisJaW50IHJldCA9IC0xOworCisJcmMuZXJyb3IgPSBlcnJvcjsKKworCWlmIChidWYpCisJCWluYnVmID0gYnVmOworCWVsc2UKKwkJaW5idWYgPSBtYWxsb2MoTFpNQV9JT0JVRl9TSVpFKTsKKwlpZiAoIWluYnVmKSB7CisJCWVycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgaW5wdXQgYnVmZmVyIik7CisJCWdvdG8gZXhpdF8wOworCX0KKworCWNzdC5zdGF0ZSA9IDA7CisJY3N0LnJlcDAgPSBjc3QucmVwMSA9IGNzdC5yZXAyID0gY3N0LnJlcDMgPSAxOworCisJd3IuaGVhZGVyID0gJmhlYWRlcjsKKwl3ci5mbHVzaCA9IGZsdXNoOworCXdyLmdsb2JhbF9wb3MgPSAwOworCXdyLnByZXZpb3VzX2J5dGUgPSAwOworCXdyLmJ1ZmZlcl9wb3MgPSAwOworCisJcmNfaW5pdCgmcmMsIGZpbGwsIGluYnVmLCBpbl9sZW4pOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihoZWFkZXIpOyBpKyspIHsKKwkJaWYgKHJjLnB0ciA+PSByYy5idWZmZXJfZW5kKQorCQkJcmNfcmVhZCgmcmMpOworCQkoKHVuc2lnbmVkIGNoYXIgKikmaGVhZGVyKVtpXSA9ICpyYy5wdHIrKzsKKwl9CisKKwlpZiAoaGVhZGVyLnBvcyA+PSAoOSAqIDUgKiA1KSkgeworCQllcnJvcigiYmFkIGhlYWRlciIpOworCQlnb3RvIGV4aXRfMTsKKwl9CisKKwltaSA9IDA7CisJbGMgPSBoZWFkZXIucG9zOworCXdoaWxlIChsYyA+PSA5KSB7CisJCW1pKys7CisJCWxjIC09IDk7CisJfQorCXBiID0gMDsKKwlscCA9IG1pOworCXdoaWxlIChscCA+PSA1KSB7CisJCXBiKys7CisJCWxwIC09IDU7CisJfQorCXBvc19zdGF0ZV9tYXNrID0gKDEgPDwgcGIpIC0gMTsKKwlsaXRlcmFsX3Bvc19tYXNrID0gKDEgPDwgbHApIC0gMTsKKworCUVORElBTl9DT05WRVJUKGhlYWRlci5kaWN0X3NpemUpOworCUVORElBTl9DT05WRVJUKGhlYWRlci5kc3Rfc2l6ZSk7CisKKwlpZiAoaGVhZGVyLmRpY3Rfc2l6ZSA9PSAwKQorCQloZWFkZXIuZGljdF9zaXplID0gMTsKKworCWlmIChvdXRwdXQpCisJCXdyLmJ1ZmZlciA9IG91dHB1dDsKKwllbHNlIHsKKwkJd3IuYnVmc2l6ZSA9IE1JTihoZWFkZXIuZHN0X3NpemUsIGhlYWRlci5kaWN0X3NpemUpOworCQl3ci5idWZmZXIgPSBsYXJnZV9tYWxsb2Mod3IuYnVmc2l6ZSk7CisJfQorCWlmICh3ci5idWZmZXIgPT0gTlVMTCkKKwkJZ290byBleGl0XzE7CisKKwludW1fcHJvYnMgPSBMWk1BX0JBU0VfU0laRSArIChMWk1BX0xJVF9TSVpFIDw8IChsYyArIGxwKSk7CisJcCA9ICh1aW50MTZfdCAqKSBsYXJnZV9tYWxsb2MobnVtX3Byb2JzICogc2l6ZW9mKCpwKSk7CisJaWYgKHAgPT0gTlVMTCkKKwkJZ290byBleGl0XzI7CisJbnVtX3Byb2JzID0gTFpNQV9MSVRFUkFMICsgKExaTUFfTElUX1NJWkUgPDwgKGxjICsgbHApKTsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3Byb2JzOyBpKyspCisJCXBbaV0gPSAoMSA8PCBSQ19NT0RFTF9UT1RBTF9CSVRTKSA+PiAxOworCisJcmNfaW5pdF9jb2RlKCZyYyk7CisKKwl3aGlsZSAoZ2V0X3Bvcygmd3IpIDwgaGVhZGVyLmRzdF9zaXplKSB7CisJCWludCBwb3Nfc3RhdGUgPQlnZXRfcG9zKCZ3cikgJiBwb3Nfc3RhdGVfbWFzazsKKwkJdWludDE2X3QgKnByb2IgPSBwICsgTFpNQV9JU19NQVRDSCArCisJCQkoY3N0LnN0YXRlIDw8IExaTUFfTlVNX1BPU19CSVRTX01BWCkgKyBwb3Nfc3RhdGU7CisJCWlmIChyY19pc19iaXRfMCgmcmMsIHByb2IpKSB7CisJCQlpZiAocHJvY2Vzc19iaXQwKCZ3ciwgJnJjLCAmY3N0LCBwLCBwb3Nfc3RhdGUsIHByb2IsCisJCQkJCWxjLCBsaXRlcmFsX3Bvc19tYXNrKSkgeworCQkJCWVycm9yKCJMWk1BIGRhdGEgaXMgY29ycnVwdCIpOworCQkJCWdvdG8gZXhpdF8zOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHByb2Nlc3NfYml0MSgmd3IsICZyYywgJmNzdCwgcCwgcG9zX3N0YXRlLCBwcm9iKSkgeworCQkJCWVycm9yKCJMWk1BIGRhdGEgaXMgY29ycnVwdCIpOworCQkJCWdvdG8gZXhpdF8zOworCQkJfQorCQkJaWYgKGNzdC5yZXAwID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJjLmJ1ZmZlcl9zaXplIDw9IDApCisJCQlnb3RvIGV4aXRfMzsKKwl9CisKKwlpZiAocG9zcCkKKwkJKnBvc3AgPSByYy5wdHItcmMuYnVmZmVyOworCWlmICghd3IuZmx1c2ggfHwgd3IuZmx1c2god3IuYnVmZmVyLCB3ci5idWZmZXJfcG9zKSA9PSB3ci5idWZmZXJfcG9zKQorCQlyZXQgPSAwOworZXhpdF8zOgorCWxhcmdlX2ZyZWUocCk7CitleGl0XzI6CisJaWYgKCFvdXRwdXQpCisJCWxhcmdlX2ZyZWUod3IuYnVmZmVyKTsKK2V4aXRfMToKKwlpZiAoIWJ1ZikKKwkJZnJlZShpbmJ1Zik7CitleGl0XzA6CisJcmV0dXJuIHJldDsKK30KKworI2lmZGVmIFBSRUJPT1QKK1NUQVRJQyBpbnQgSU5JVCBfX2RlY29tcHJlc3ModW5zaWduZWQgY2hhciAqYnVmLCBsb25nIGluX2xlbiwKKwkJCSAgICAgIGxvbmcgKCpmaWxsKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksCisJCQkgICAgICBsb25nICgqZmx1c2gpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKm91dHB1dCwgbG9uZyBvdXRfbGVuLAorCQkJICAgICAgbG9uZyAqcG9zcCwKKwkJCSAgICAgIHZvaWQgKCplcnJvcikoY2hhciAqeCkpCit7CisJcmV0dXJuIHVubHptYShidWYsIGluX2xlbiAtIDQsIGZpbGwsIGZsdXNoLCBvdXRwdXQsIHBvc3AsIGVycm9yKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc191bmx6by5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc191bmx6by5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzE1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzX3VubHpvLmMKQEAgLTAsMCArMSwzMDEgQEAKKy8qCisgKiBMWk8gZGVjb21wcmVzc29yIGZvciB0aGUgTGludXgga2VybmVsLiBDb2RlIGJvcnJvd2VkIGZyb20gdGhlIGx6bworICogaW1wbGVtZW50YXRpb24gYnkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lci4KKyAqCisgKiBMaW51eCBrZXJuZWwgYWRhcHRhdGlvbjoKKyAqIENvcHlyaWdodCAoQykgMjAwOQorICogQWxiaW4gVG9ubmVycmUsIEZyZWUgRWxlY3Ryb25zIDxhbGJpbi50b25uZXJyZUBmcmVlLWVsZWN0cm9ucy5jb20+CisgKgorICogT3JpZ2luYWwgY29kZToKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDA1IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogbHpvcCBhbmQgdGhlIExaTyBsaWJyYXJ5IGFyZSBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSB0aGVtCisgKiBhbmQvb3IgbW9kaWZ5IHRoZW0gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAqIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKgorICogTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIKKyAqIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAqIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6b3AvCisgKi8KKworI2lmZGVmIFNUQVRJQworI2RlZmluZSBQUkVCT09UCisjaW5jbHVkZSAibHpvL2x6bzF4X2RlY29tcHJlc3Nfc2FmZS5jIgorI2Vsc2UKKyNpbmNsdWRlIDxsaW51eC9kZWNvbXByZXNzL3VubHpvLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbHpvLmg+CisjaW5jbHVkZSA8bGludXgvZGVjb21wcmVzcy9tbS5oPgorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGx6b3BfbWFnaWNbXSA9IHsKKwkweDg5LCAweDRjLCAweDVhLCAweDRmLCAweDAwLCAweDBkLCAweDBhLCAweDFhLCAweDBhIH07CisKKyNkZWZpbmUgTFpPX0JMT0NLX1NJWkUgICAgICAgICgyNTYqMTAyNGwpCisjZGVmaW5lIEhFQURFUl9IQVNfRklMVEVSICAgICAgMHgwMDAwMDgwMEwKKyNkZWZpbmUgSEVBREVSX1NJWkVfTUlOICAgICAgICg5ICsgNyAgICAgKyA0ICsgOCAgICAgKyAxICAgICAgICsgNCkKKyNkZWZpbmUgSEVBREVSX1NJWkVfTUFYICAgICAgICg5ICsgNyArIDEgKyA4ICsgOCArIDQgKyAxICsgMjU1ICsgNCkKKworU1RBVElDIGlubGluZSBsb25nIElOSVQgcGFyc2VfaGVhZGVyKHU4ICppbnB1dCwgbG9uZyAqc2tpcCwgbG9uZyBpbl9sZW4pCit7CisJaW50IGw7CisJdTggKnBhcnNlID0gaW5wdXQ7CisJdTggKmVuZCA9IGlucHV0ICsgaW5fbGVuOworCXU4IGxldmVsID0gMDsKKwl1MTYgdmVyc2lvbjsKKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGVyZSdzIGVub3VnaCBpbnB1dCB0byBwb3NzaWJseSBoYXZlIGEgdmFsaWQgaGVhZGVyLgorCSAqIFRoZW4gaXQgaXMgcG9zc2libGUgdG8gcGFyc2Ugc2V2ZXJhbCBmaWVsZHMgdW50aWwgdGhlIG1pbmltdW0KKwkgKiBzaXplIG1heSBoYXZlIGJlZW4gdXNlZC4KKwkgKi8KKwlpZiAoaW5fbGVuIDwgSEVBREVSX1NJWkVfTUlOKQorCQlyZXR1cm4gMDsKKworCS8qIHJlYWQgbWFnaWM6IDkgZmlyc3QgYml0cyAqLworCWZvciAobCA9IDA7IGwgPCA5OyBsKyspIHsKKwkJaWYgKCpwYXJzZSsrICE9IGx6b3BfbWFnaWNbbF0pCisJCQlyZXR1cm4gMDsKKwl9CisJLyogZ2V0IHZlcnNpb24gKDJieXRlcyksIHNraXAgbGlicmFyeSB2ZXJzaW9uICgyKSwKKwkgKiAnbmVlZCB0byBiZSBleHRyYWN0ZWQnIHZlcnNpb24gKDIpIGFuZAorCSAqIG1ldGhvZCAoMSkgKi8KKwl2ZXJzaW9uID0gZ2V0X3VuYWxpZ25lZF9iZTE2KHBhcnNlKTsKKwlwYXJzZSArPSA3OworCWlmICh2ZXJzaW9uID49IDB4MDk0MCkKKwkJbGV2ZWwgPSAqcGFyc2UrKzsKKwlpZiAoZ2V0X3VuYWxpZ25lZF9iZTMyKHBhcnNlKSAmIEhFQURFUl9IQVNfRklMVEVSKQorCQlwYXJzZSArPSA4OyAvKiBmbGFncyArIGZpbHRlciBpbmZvICovCisJZWxzZQorCQlwYXJzZSArPSA0OyAvKiBmbGFncyAqLworCisJLyoKKwkgKiBBdCBsZWFzdCBtb2RlLCBtdGltZV9sb3csIGZpbGVuYW1lIGxlbmd0aCwgYW5kIGNoZWNrc3VtIG11c3QKKwkgKiBiZSBsZWZ0IHRvIGJlIHBhcnNlZC4gSWYgYWxzbyBtdGltZV9oaWdoIGlzIHByZXNlbnQsIGl0J3MgT0sKKwkgKiBiZWNhdXNlIHRoZSBuZXh0IGlucHV0IGJ1ZmZlciBjaGVjayBpcyBhZnRlciByZWFkaW5nIHRoZQorCSAqIGZpbGVuYW1lIGxlbmd0aC4KKwkgKi8KKwlpZiAoZW5kIC0gcGFyc2UgPCA4ICsgMSArIDQpCisJCXJldHVybiAwOworCisJLyogc2tpcCBtb2RlIGFuZCBtdGltZV9sb3cgKi8KKwlwYXJzZSArPSA4OworCWlmICh2ZXJzaW9uID49IDB4MDk0MCkKKwkJcGFyc2UgKz0gNDsJLyogc2tpcCBtdGltZV9oaWdoICovCisKKwlsID0gKnBhcnNlKys7CisJLyogZG9uJ3QgY2FyZSBhYm91dCB0aGUgZmlsZSBuYW1lLCBhbmQgc2tpcCBjaGVja3N1bSAqLworCWlmIChlbmQgLSBwYXJzZSA8IGwgKyA0KQorCQlyZXR1cm4gMDsKKwlwYXJzZSArPSBsICsgNDsKKworCSpza2lwID0gcGFyc2UgLSBpbnB1dDsKKwlyZXR1cm4gMTsKK30KKworU1RBVElDIGludCBJTklUIHVubHpvKHU4ICppbnB1dCwgbG9uZyBpbl9sZW4sCisJCQkJbG9uZyAoKmZpbGwpKHZvaWQgKiwgdW5zaWduZWQgbG9uZyksCisJCQkJbG9uZyAoKmZsdXNoKSh2b2lkICosIHVuc2lnbmVkIGxvbmcpLAorCQkJCXU4ICpvdXRwdXQsIGxvbmcgKnBvc3AsCisJCQkJdm9pZCAoKmVycm9yKSAoY2hhciAqeCkpCit7CisJdTggciA9IDA7CisJbG9uZyBza2lwID0gMDsKKwl1MzIgc3JjX2xlbiwgZHN0X2xlbjsKKwlzaXplX3QgdG1wOworCXU4ICppbl9idWYsICppbl9idWZfc2F2ZSwgKm91dF9idWY7CisJaW50IHJldCA9IC0xOworCisJaWYgKG91dHB1dCkgeworCQlvdXRfYnVmID0gb3V0cHV0OworCX0gZWxzZSBpZiAoIWZsdXNoKSB7CisJCWVycm9yKCJOVUxMIG91dHB1dCBwb2ludGVyIGFuZCBubyBmbHVzaCBmdW5jdGlvbiBwcm92aWRlZCIpOworCQlnb3RvIGV4aXQ7CisJfSBlbHNlIHsKKwkJb3V0X2J1ZiA9IG1hbGxvYyhMWk9fQkxPQ0tfU0laRSk7CisJCWlmICghb3V0X2J1ZikgeworCQkJZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyIik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwlpZiAoaW5wdXQgJiYgZmlsbCkgeworCQllcnJvcigiQm90aCBpbnB1dCBwb2ludGVyIGFuZCBmaWxsIGZ1bmN0aW9uIHByb3ZpZGVkLCBkb24ndCBrbm93IHdoYXQgdG8gZG8iKTsKKwkJZ290byBleGl0XzE7CisJfSBlbHNlIGlmIChpbnB1dCkgeworCQlpbl9idWYgPSBpbnB1dDsKKwl9IGVsc2UgaWYgKCFmaWxsKSB7CisJCWVycm9yKCJOVUxMIGlucHV0IHBvaW50ZXIgYW5kIG1pc3NpbmcgZmlsbCBmdW5jdGlvbiIpOworCQlnb3RvIGV4aXRfMTsKKwl9IGVsc2UgeworCQlpbl9idWYgPSBtYWxsb2MobHpvMXhfd29yc3RfY29tcHJlc3MoTFpPX0JMT0NLX1NJWkUpKTsKKwkJaWYgKCFpbl9idWYpIHsKKwkJCWVycm9yKCJDb3VsZCBub3QgYWxsb2NhdGUgaW5wdXQgYnVmZmVyIik7CisJCQlnb3RvIGV4aXRfMTsKKwkJfQorCX0KKwlpbl9idWZfc2F2ZSA9IGluX2J1ZjsKKworCWlmIChwb3NwKQorCQkqcG9zcCA9IDA7CisKKwlpZiAoZmlsbCkgeworCQkvKgorCQkgKiBTdGFydCBmcm9tIGluX2J1ZiArIEhFQURFUl9TSVpFX01BWCB0byBtYWtlIGl0IHBvc3NpYmxlCisJCSAqIHRvIHVzZSBtZW1jcHkoKSB0byBjb3B5IHRoZSB1bnVzZWQgZGF0YSB0byB0aGUgYmVnaW5uaW5nCisJCSAqIG9mIHRoZSBidWZmZXIuIFRoaXMgd2F5IG1lbW1vdmUoKSBpc24ndCBuZWVkZWQgd2hpY2gKKwkJICogaXMgbWlzc2luZyBmcm9tIHByZS1ib290IGVudmlyb25tZW50cyBvZiBtb3N0IGFyY2hzLgorCQkgKi8KKwkJaW5fYnVmICs9IEhFQURFUl9TSVpFX01BWDsKKwkJaW5fbGVuID0gZmlsbChpbl9idWYsIEhFQURFUl9TSVpFX01BWCk7CisJfQorCisJaWYgKCFwYXJzZV9oZWFkZXIoaW5fYnVmLCAmc2tpcCwgaW5fbGVuKSkgeworCQllcnJvcigiaW52YWxpZCBoZWFkZXIiKTsKKwkJZ290byBleGl0XzI7CisJfQorCWluX2J1ZiArPSBza2lwOworCWluX2xlbiAtPSBza2lwOworCisJaWYgKGZpbGwpIHsKKwkJLyogTW92ZSB0aGUgdW51c2VkIGRhdGEgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAqLworCQltZW1jcHkoaW5fYnVmX3NhdmUsIGluX2J1ZiwgaW5fbGVuKTsKKwkJaW5fYnVmID0gaW5fYnVmX3NhdmU7CisJfQorCisJaWYgKHBvc3ApCisJCSpwb3NwID0gc2tpcDsKKworCWZvciAoOzspIHsKKwkJLyogcmVhZCB1bmNvbXByZXNzZWQgYmxvY2sgc2l6ZSAqLworCQlpZiAoZmlsbCAmJiBpbl9sZW4gPCA0KSB7CisJCQlza2lwID0gZmlsbChpbl9idWYgKyBpbl9sZW4sIDQgLSBpbl9sZW4pOworCQkJaWYgKHNraXAgPiAwKQorCQkJCWluX2xlbiArPSBza2lwOworCQl9CisJCWlmIChpbl9sZW4gPCA0KSB7CisJCQllcnJvcigiZmlsZSBjb3JydXB0ZWQiKTsKKwkJCWdvdG8gZXhpdF8yOworCQl9CisJCWRzdF9sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMzIoaW5fYnVmKTsKKwkJaW5fYnVmICs9IDQ7CisJCWluX2xlbiAtPSA0OworCisJCS8qIGV4aXQgaWYgbGFzdCBibG9jayAqLworCQlpZiAoZHN0X2xlbiA9PSAwKSB7CisJCQlpZiAocG9zcCkKKwkJCQkqcG9zcCArPSA0OworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZHN0X2xlbiA+IExaT19CTE9DS19TSVpFKSB7CisJCQllcnJvcigiZGVzdCBsZW4gbG9uZ2VyIHRoYW4gYmxvY2sgc2l6ZSIpOworCQkJZ290byBleGl0XzI7CisJCX0KKworCQkvKiByZWFkIGNvbXByZXNzZWQgYmxvY2sgc2l6ZSwgYW5kIHNraXAgYmxvY2sgY2hlY2tzdW0gaW5mbyAqLworCQlpZiAoZmlsbCAmJiBpbl9sZW4gPCA4KSB7CisJCQlza2lwID0gZmlsbChpbl9idWYgKyBpbl9sZW4sIDggLSBpbl9sZW4pOworCQkJaWYgKHNraXAgPiAwKQorCQkJCWluX2xlbiArPSBza2lwOworCQl9CisJCWlmIChpbl9sZW4gPCA4KSB7CisJCQllcnJvcigiZmlsZSBjb3JydXB0ZWQiKTsKKwkJCWdvdG8gZXhpdF8yOworCQl9CisJCXNyY19sZW4gPSBnZXRfdW5hbGlnbmVkX2JlMzIoaW5fYnVmKTsKKwkJaW5fYnVmICs9IDg7CisJCWluX2xlbiAtPSA4OworCisJCWlmIChzcmNfbGVuIDw9IDAgfHwgc3JjX2xlbiA+IGRzdF9sZW4pIHsKKwkJCWVycm9yKCJmaWxlIGNvcnJ1cHRlZCIpOworCQkJZ290byBleGl0XzI7CisJCX0KKworCQkvKiBkZWNvbXByZXNzICovCisJCWlmIChmaWxsICYmIGluX2xlbiA8IHNyY19sZW4pIHsKKwkJCXNraXAgPSBmaWxsKGluX2J1ZiArIGluX2xlbiwgc3JjX2xlbiAtIGluX2xlbik7CisJCQlpZiAoc2tpcCA+IDApCisJCQkJaW5fbGVuICs9IHNraXA7CisJCX0KKwkJaWYgKGluX2xlbiA8IHNyY19sZW4pIHsKKwkJCWVycm9yKCJmaWxlIGNvcnJ1cHRlZCIpOworCQkJZ290byBleGl0XzI7CisJCX0KKwkJdG1wID0gZHN0X2xlbjsKKworCQkvKiBXaGVuIHRoZSBpbnB1dCBkYXRhIGlzIG5vdCBjb21wcmVzc2VkIGF0IGFsbCwKKwkJICogbHpvMXhfZGVjb21wcmVzc19zYWZlIHdpbGwgZmFpbCwgc28gY2FsbCBtZW1jcHkoKQorCQkgKiBpbnN0ZWFkICovCisJCWlmICh1bmxpa2VseShkc3RfbGVuID09IHNyY19sZW4pKQorCQkJbWVtY3B5KG91dF9idWYsIGluX2J1Ziwgc3JjX2xlbik7CisJCWVsc2UgeworCQkJciA9IGx6bzF4X2RlY29tcHJlc3Nfc2FmZSgodTggKikgaW5fYnVmLCBzcmNfbGVuLAorCQkJCQkJb3V0X2J1ZiwgJnRtcCk7CisKKwkJCWlmIChyICE9IExaT19FX09LIHx8IGRzdF9sZW4gIT0gdG1wKSB7CisJCQkJZXJyb3IoIkNvbXByZXNzZWQgZGF0YSB2aW9sYXRpb24iKTsKKwkJCQlnb3RvIGV4aXRfMjsKKwkJCX0KKwkJfQorCisJCWlmIChmbHVzaCAmJiBmbHVzaChvdXRfYnVmLCBkc3RfbGVuKSAhPSBkc3RfbGVuKQorCQkJZ290byBleGl0XzI7CisJCWlmIChvdXRwdXQpCisJCQlvdXRfYnVmICs9IGRzdF9sZW47CisJCWlmIChwb3NwKQorCQkJKnBvc3AgKz0gc3JjX2xlbiArIDEyOworCisJCWluX2J1ZiArPSBzcmNfbGVuOworCQlpbl9sZW4gLT0gc3JjX2xlbjsKKwkJaWYgKGZpbGwpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGVyZSBoYXBwZW5zIHRvIHN0aWxsIGJlIHVudXNlZCBkYXRhIGxlZnQgaW4KKwkJCSAqIGluX2J1ZiwgbW92ZSBpdCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisJCQkgKiBVc2UgYSBsb29wIHRvIGF2b2lkIG1lbW1vdmUoKSBkZXBlbmRlbmN5LgorCQkJICovCisJCQlpZiAoaW5fbGVuID4gMCkKKwkJCQlmb3IgKHNraXAgPSAwOyBza2lwIDwgaW5fbGVuOyArK3NraXApCisJCQkJCWluX2J1Zl9zYXZlW3NraXBdID0gaW5fYnVmW3NraXBdOworCQkJaW5fYnVmID0gaW5fYnVmX3NhdmU7CisJCX0KKwl9CisKKwlyZXQgPSAwOworZXhpdF8yOgorCWlmICghaW5wdXQpCisJCWZyZWUoaW5fYnVmX3NhdmUpOworZXhpdF8xOgorCWlmICghb3V0cHV0KQorCQlmcmVlKG91dF9idWYpOworZXhpdDoKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgUFJFQk9PVAorU1RBVElDIGludCBJTklUIF9fZGVjb21wcmVzcyh1bnNpZ25lZCBjaGFyICpidWYsIGxvbmcgbGVuLAorCQkJICAgbG9uZyAoKmZpbGwpKHZvaWQqLCB1bnNpZ25lZCBsb25nKSwKKwkJCSAgIGxvbmcgKCpmbHVzaCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJICAgdW5zaWduZWQgY2hhciAqb3V0X2J1ZiwgbG9uZyBvbGVuLAorCQkJICAgbG9uZyAqcG9zLAorCQkJICAgdm9pZCAoKmVycm9yKShjaGFyICp4KSkKK3sKKwlyZXR1cm4gdW5sem8oYnVmLCBsZW4sIGZpbGwsIGZsdXNoLCBvdXRfYnVmLCBwb3MsIGVycm9yKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc191bnh6LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kZWNvbXByZXNzX3VueHouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQ1OWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGVjb21wcmVzc191bnh6LmMKQEAgLTAsMCArMSw0MDcgQEAKKy8qCisgKiBXcmFwcGVyIGZvciBkZWNvbXByZXNzaW5nIFhaLWNvbXByZXNzZWQga2VybmVsLCBpbml0cmFtZnMsIGFuZCBpbml0cmQKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIEltcG9ydGFudCBub3RlcyBhYm91dCBpbi1wbGFjZSBkZWNvbXByZXNzaW9uCisgKgorICogQXQgbGVhc3Qgb24geDg2LCB0aGUga2VybmVsIGlzIGRlY29tcHJlc3NlZCBpbiBwbGFjZTogdGhlIGNvbXByZXNzZWQgZGF0YQorICogaXMgcGxhY2VkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIsIGFuZCB0aGUgZGVjb21wcmVzc29yIG92ZXJ3cml0ZXMKKyAqIG1vc3Qgb2YgdGhlIGNvbXByZXNzZWQgZGF0YS4gVGhlcmUgbXVzdCBiZSBlbm91Z2ggc2FmZXR5IG1hcmdpbiB0bworICogZ3VhcmFudGVlIHRoYXQgdGhlIHdyaXRlIHBvc2l0aW9uIGlzIGFsd2F5cyBiZWhpbmQgdGhlIHJlYWQgcG9zaXRpb24uCisgKgorICogVGhlIHNhZmV0eSBtYXJnaW4gZm9yIFhaIHdpdGggTFpNQTIgb3IgQkNKK0xaTUEyIGlzIGNhbGN1bGF0ZWQgYmVsb3cuCisgKiBOb3RlIHRoYXQgdGhlIG1hcmdpbiB3aXRoIFhaIGlzIGJpZ2dlciB0aGFuIHdpdGggRGVmbGF0ZSAoZ3ppcCkhCisgKgorICogVGhlIHdvcnN0IGNhc2UgZm9yIGluLXBsYWNlIGRlY29tcHJlc3Npb24gaXMgdGhhdCB0aGUgYmVnaW5uaW5nIG9mCisgKiB0aGUgZmlsZSBpcyBjb21wcmVzc2VkIGV4dHJlbWVseSB3ZWxsLCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUgaXMKKyAqIHVuY29tcHJlc3NpYmxlLiBUaHVzLCB3ZSBtdXN0IGxvb2sgZm9yIHdvcnN0LWNhc2UgZXhwYW5zaW9uIHdoZW4gdGhlCisgKiBjb21wcmVzc29yIGlzIGVuY29kaW5nIHVuY29tcHJlc3NpYmxlIGRhdGEuCisgKgorICogVGhlIHN0cnVjdHVyZSBvZiB0aGUgLnh6IGZpbGUgaW4gY2FzZSBvZiBhIGNvbXByZXNlZCBrZXJuZWwgaXMgYXMgZm9sbG93cy4KKyAqIFNpemVzIChhcyBieXRlcykgb2YgdGhlIGZpZWxkcyBhcmUgaW4gcGFyZW50aGVzaXMuCisgKgorICogICAgU3RyZWFtIEhlYWRlciAoMTIpCisgKiAgICBCbG9jayBIZWFkZXI6CisgKiAgICAgIEJsb2NrIEhlYWRlciAoOC0xMikKKyAqICAgICAgQ29tcHJlc3NlZCBEYXRhIChOKQorICogICAgICBCbG9jayBQYWRkaW5nICgwLTMpCisgKiAgICAgIENSQzMyICg0KQorICogICAgSW5kZXggKDgtMjApCisgKiAgICBTdHJlYW0gRm9vdGVyICgxMikKKyAqCisgKiBOb3JtYWxseSB0aGVyZSBpcyBleGFjdGx5IG9uZSBCbG9jaywgYnV0IGxldCdzIGFzc3VtZSB0aGF0IHRoZXJlIGFyZQorICogMi00IEJsb2NrcyBqdXN0IGluIGNhc2UuIEJlY2F1c2UgU3RyZWFtIEhlYWRlciBhbmQgYWxzbyBCbG9jayBIZWFkZXIKKyAqIG9mIHRoZSBmaXJzdCBCbG9jayBkb24ndCBtYWtlIHRoZSBkZWNvbXByZXNzb3IgcHJvZHVjZSBhbnkgdW5jb21wcmVzc2VkCisgKiBkYXRhLCB3ZSBjYW4gaWdub3JlIHRoZW0gZnJvbSBvdXIgY2FsY3VsYXRpb25zLiBCbG9jayBIZWFkZXJzIG9mIHBvc3NpYmxlCisgKiBhZGRpdGlvbmFsIEJsb2NrcyBoYXZlIHRvIGJlIHRha2VuIGludG8gYWNjb3VudCBzdGlsbC4gV2l0aCB0aGVzZQorICogYXNzdW1wdGlvbnMsIGl0IGlzIHNhZmUgdG8gYXNzdW1lIHRoYXQgdGhlIHRvdGFsIGhlYWRlciBvdmVyaGVhZCBpcworICogbGVzcyB0aGFuIDEyOCBieXRlcy4KKyAqCisgKiBDb21wcmVzc2VkIERhdGEgY29udGFpbnMgTFpNQTIgb3IgQkNKK0xaTUEyIGVuY29kZWQgZGF0YS4gU2luY2UgQkNKCisgKiBkb2Vzbid0IGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSwgaXQgaXMgZW5vdWdoIHRvIGNhbGN1bGF0ZSB0aGUKKyAqIHNhZmV0eSBtYXJnaW4gZm9yIExaTUEyLgorICoKKyAqIExaTUEyIHN0b3JlcyB0aGUgZGF0YSBpbiBjaHVua3MuIEVhY2ggY2h1bmsgaGFzIGEgaGVhZGVyIHdob3NlIHNpemUgaXMKKyAqIGEgbWF4aW11bSBvZiA2IGJ5dGVzLCBidXQgdG8gZ2V0IHJvdW5kIDJebiBudW1iZXJzLCBsZXQncyBhc3N1bWUgdGhhdAorICogdGhlIG1heGltdW0gY2h1bmsgaGVhZGVyIHNpemUgaXMgOCBieXRlcy4gQWZ0ZXIgdGhlIGNodW5rIGhlYWRlciwgdGhlcmUKKyAqIG1heSBiZSB1cCB0byA2NCBLaUIgb2YgYWN0dWFsIHBheWxvYWQgaW4gdGhlIGNodW5rLiBPZnRlbiB0aGUgcGF5bG9hZCBpcworICogcXVpdGUgYSBiaXQgc21hbGxlciB0aG91Z2g7IHRvIGJlIHNhZmUsIGxldCdzIGFzc3VtZSB0aGF0IGFuIGF2ZXJhZ2UKKyAqIGNodW5rIGhhcyBvbmx5IDMyIEtpQiBvZiBwYXlsb2FkLgorICoKKyAqIFRoZSBtYXhpbXVtIHVuY29tcHJlc3NlZCBzaXplIG9mIHRoZSBwYXlsb2FkIGlzIDIgTWlCLiBUaGUgbWluaW11bQorICogdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIHBheWxvYWQgaXMgaW4gcHJhY3RpY2UgbmV2ZXIgbGVzcyB0aGFuIHRoZQorICogcGF5bG9hZCBzaXplIGl0c2VsZi4gVGhlIExaTUEyIGZvcm1hdCB3b3VsZCBhbGxvdyB1bmNvbXByZXNzZWQgc2l6ZQorICogdG8gYmUgbGVzcyB0aGFuIHRoZSBwYXlsb2FkIHNpemUsIGJ1dCBubyBzYW5lIGNvbXByZXNzb3IgY3JlYXRlcyBzdWNoCisgKiBmaWxlcy4gTFpNQTIgc3VwcG9ydHMgc3RvcmluZyB1bmNvbXByZXNzaWJsZSBkYXRhIGluIHVuY29tcHJlc3NlZCBmb3JtLAorICogc28gdGhlcmUncyBuZXZlciBhIG5lZWQgdG8gY3JlYXRlIHBheWxvYWRzIHdob3NlIHVuY29tcHJlc3NlZCBzaXplIGlzCisgKiBzbWFsbGVyIHRoYW4gdGhlIGNvbXByZXNzZWQgc2l6ZS4KKyAqCisgKiBUaGUgYXNzdW1wdGlvbiwgdGhhdCB0aGUgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIHBheWxvYWQgaXMgbmV2ZXIKKyAqIHNtYWxsZXIgdGhhbiB0aGUgcGF5bG9hZCBpdHNlbGYsIGlzIHZhbGlkIG9ubHkgd2hlbiB0YWxraW5nIGFib3V0CisgKiB0aGUgcGF5bG9hZCBhcyBhIHdob2xlLiBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYXlsb2FkIGhhcyBwYXJ0cyB3aGVyZQorICogdGhlIGRlY29tcHJlc3NvciBjb25zdW1lcyBtb3JlIGlucHV0IHRoYW4gaXQgcHJvZHVjZXMgb3V0cHV0LiBDYWxjdWxhdGluZworICogdGhlIHdvcnN0IGNhc2UgZm9yIHRoaXMgd291bGQgYmUgdHJpY2t5LiBJbnN0ZWFkIG9mIHRyeWluZyB0byBkbyB0aGF0LAorICogbGV0J3Mgc2ltcGx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBkZWNvbXByZXNzb3IgbmV2ZXIgb3ZlcndyaXRlcyBhbnkgYnl0ZXMKKyAqIG9mIHRoZSBwYXlsb2FkIHdoaWNoIGl0IGlzIGN1cnJlbnRseSByZWFkaW5nLgorICoKKyAqIE5vdyB3ZSBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBjYWxjdWxhdGUgdGhlIHNhZmV0eSBtYXJnaW4uIFdlIG5lZWQKKyAqICAgLSAxMjggYnl0ZXMgZm9yIHRoZSAueHogZmlsZSBmb3JtYXQgaGVhZGVyczsKKyAqICAgLSA4IGJ5dGVzIHBlciBldmVyeSAzMiBLaUIgb2YgdW5jb21wcmVzc2VkIHNpemUgKG9uZSBMWk1BMiBjaHVuayBoZWFkZXIKKyAqICAgICBwZXIgY2h1bmssIGVhY2ggY2h1bmsgaGF2aW5nIGF2ZXJhZ2UgcGF5bG9hZCBzaXplIG9mIDMyIEtpQik7IGFuZAorICogICAtIDY0IEtpQiAoYmlnZ2VzdCBwb3NzaWJsZSBMWk1BMiBjaHVuayBwYXlsb2FkIHNpemUpIHRvIG1ha2Ugc3VyZSB0aGF0CisgKiAgICAgdGhlIGRlY29tcHJlc3NvciBuZXZlciBvdmVyd3JpdGVzIGFueXRoaW5nIGZyb20gdGhlIExaTUEyIGNodW5rCisgKiAgICAgcGF5bG9hZCBpdCBpcyBjdXJyZW50bHkgcmVhZGluZy4KKyAqCisgKiBXZSBnZXQgdGhlIGZvbGxvd2luZyBmb3JtdWxhOgorICoKKyAqICAgIHNhZmV0eV9tYXJnaW4gPSAxMjggKyB1bmNvbXByZXNzZWRfc2l6ZSAqIDggLyAzMjc2OCArIDY1NTM2CisgKiAgICAgICAgICAgICAgICAgID0gMTI4ICsgKHVuY29tcHJlc3NlZF9zaXplID4+IDEyKSArIDY1NTM2CisgKgorICogRm9yIGNvbXBhcmlzb24sIGFjY29yZGluZyB0byBhcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jLCB0aGUKKyAqIGVxdWl2YWxlbnQgZm9ybXVsYSBmb3IgRGVmbGF0ZSBpcyB0aGlzOgorICoKKyAqICAgIHNhZmV0eV9tYXJnaW4gPSAxOCArICh1bmNvbXByZXNzZWRfc2l6ZSA+PiAxMikgKyAzMjc2OAorICoKKyAqIFRodXMsIHdoZW4gdXBkYXRpbmcgRGVmbGF0ZS1vbmx5IGluLXBsYWNlIGtlcm5lbCBkZWNvbXByZXNzb3IgdG8KKyAqIHN1cHBvcnQgWFosIHRoZSBmaXhlZCBvdmVyaGVhZCBoYXMgdG8gYmUgaW5jcmVhc2VkIGZyb20gMTgrMzI3NjggYnl0ZXMKKyAqIHRvIDEyOCs2NTUzNiBieXRlcy4KKyAqLworCisvKgorICogU1RBVElDIGlzIGRlZmluZWQgdG8gInN0YXRpYyIgaWYgd2UgYXJlIGJlaW5nIGJ1aWx0IGZvciBrZXJuZWwKKyAqIGRlY29tcHJlc3Npb24gKHByZS1ib290IGNvZGUpLiA8bGludXgvZGVjb21wcmVzcy9tbS5oPiB3aWxsIGRlZmluZQorICogU1RBVElDIHRvIGVtcHR5IGlmIGl0IHdhc24ndCBhbHJlYWR5IGRlZmluZWQuIFNpbmNlIHdlIHdpbGwgbmVlZCB0bworICoga25vdyBsYXRlciBpZiB3ZSBhcmUgYmVpbmcgdXNlZCBmb3Iga2VybmVsIGRlY29tcHJlc3Npb24sIHdlIGRlZmluZQorICogWFpfUFJFQk9PVCBoZXJlLgorICovCisjaWZkZWYgU1RBVElDCisjCWRlZmluZSBYWl9QUkVCT09UCisjZW5kaWYKKyNpZmRlZiBfX0tFUk5FTF9fCisjCWluY2x1ZGUgPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4KKyNlbmRpZgorI2RlZmluZSBYWl9FWFRFUk4gU1RBVElDCisKKyNpZm5kZWYgWFpfUFJFQk9PVAorIwlpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjCWluY2x1ZGUgPGxpbnV4L3h6Lmg+CisjZWxzZQorLyoKKyAqIFVzZSB0aGUgaW50ZXJuYWwgQ1JDMzIgY29kZSBpbnN0ZWFkIG9mIGtlcm5lbCdzIENSQzMyIG1vZHVsZSwgd2hpY2gKKyAqIGlzIG5vdCBhdmFpbGFibGUgaW4gZWFybHkgcGhhc2Ugb2YgYm9vdGluZy4KKyAqLworI2RlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAxCisKKy8qCisgKiBGb3IgYm9vdCB0aW1lIHVzZSwgd2UgZW5hYmxlIG9ubHkgdGhlIEJDSiBmaWx0ZXIgb2YgdGhlIGN1cnJlbnQKKyAqIGFyY2hpdGVjdHVyZSBvciBub25lIGlmIG5vIEJDSiBmaWx0ZXIgaXMgYXZhaWxhYmxlIGZvciB0aGUgYXJjaGl0ZWN0dXJlLgorICovCisjaWZkZWYgQ09ORklHX1g4NgorIwlkZWZpbmUgWFpfREVDX1g4NgorI2VuZGlmCisjaWZkZWYgQ09ORklHX1BQQworIwlkZWZpbmUgWFpfREVDX1BPV0VSUEMKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BUk0KKyMJZGVmaW5lIFhaX0RFQ19BUk0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19JQTY0CisjCWRlZmluZSBYWl9ERUNfSUE2NAorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NQQVJDCisjCWRlZmluZSBYWl9ERUNfU1BBUkMKKyNlbmRpZgorCisvKgorICogVGhpcyB3aWxsIGdldCB0aGUgYmFzaWMgaGVhZGVycyBzbyB0aGF0IG1lbWVxKCkgYW5kIG90aGVycworICogY2FuIGJlIGRlZmluZWQuCisgKi8KKyNpbmNsdWRlICJ4ei94el9wcml2YXRlLmgiCisKKy8qCisgKiBSZXBsYWNlIHRoZSBub3JtYWwgYWxsb2NhdGlvbiBmdW5jdGlvbnMgd2l0aCB0aGUgdmVyc2lvbnMgZnJvbQorICogPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4uIHZmcmVlKCkgbmVlZHMgdG8gc3VwcG9ydCB2ZnJlZShOVUxMKQorICogd2hlbiBYWl9EWU5BTExPQyBpcyB1c2VkLCBidXQgdGhlIHByZS1ib290IGZyZWUoKSBkb2Vzbid0IHN1cHBvcnQgaXQuCisgKiBXb3JrYXJvdW5kIGl0IGhlcmUgYmVjYXVzZSB0aGUgb3RoZXIgZGVjb21wcmVzc29ycyBkb24ndCBuZWVkIGl0LgorICovCisjdW5kZWYga21hbGxvYworI3VuZGVmIGtmcmVlCisjdW5kZWYgdm1hbGxvYworI3VuZGVmIHZmcmVlCisjZGVmaW5lIGttYWxsb2Moc2l6ZSwgZmxhZ3MpIG1hbGxvYyhzaXplKQorI2RlZmluZSBrZnJlZShwdHIpIGZyZWUocHRyKQorI2RlZmluZSB2bWFsbG9jKHNpemUpIG1hbGxvYyhzaXplKQorI2RlZmluZSB2ZnJlZShwdHIpIGRvIHsgaWYgKHB0ciAhPSBOVUxMKSBmcmVlKHB0cik7IH0gd2hpbGUgKDApCisKKy8qCisgKiBGSVhNRTogTm90IGFsbCBiYXNpYyBtZW1vcnkgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCBpbiBhcmNoaXRlY3R1cmUtc3BlY2lmaWMKKyAqIGZpbGVzICh5ZXQpLiBXZSBkZWZpbmUgb3VyIG93biB2ZXJzaW9ucyBoZXJlIGZvciBub3csIGJ1dCB0aGlzIHNob3VsZCBiZQorICogb25seSBhIHRlbXBvcmFyeSBzb2x1dGlvbi4KKyAqCisgKiBtZW1lcSBhbmQgbWVtemVybyBhcmUgbm90IHVzZWQgbXVjaCBhbmQgYW55IHJlbW90ZWx5IHNhbmUgaW1wbGVtZW50YXRpb24KKyAqIGlzIGZhc3QgZW5vdWdoLiBtZW1jcHkvbWVtbW92ZSBzcGVlZCBtYXR0ZXJzIGluIG11bHRpLWNhbGwgbW9kZSwgYnV0CisgKiB0aGUga2VybmVsIGltYWdlIGlzIGRlY29tcHJlc3NlZCBpbiBzaW5nbGUtY2FsbCBtb2RlLCBpbiB3aGljaCBvbmx5CisgKiBtZW1jcHkgc3BlZWQgY2FuIG1hdHRlciBhbmQgb25seSBpZiB0aGVyZSBpcyBhIGxvdCBvZiB1bmNvbXByZXNzaWJsZSBkYXRhCisgKiAoTFpNQTIgc3RvcmVzIHVuY29tcHJlc3NpYmxlIGNodW5rcyBpbiB1bmNvbXByZXNzZWQgZm9ybSkuIFRodXMsIHRoZQorICogZnVuY3Rpb25zIGJlbG93IHNob3VsZCBqdXN0IGJlIGtlcHQgc21hbGw7IGl0J3MgcHJvYmFibHkgbm90IHdvcnRoCisgKiBvcHRpbWl6aW5nIGZvciBzcGVlZC4KKyAqLworCisjaWZuZGVmIG1lbWVxCitzdGF0aWMgYm9vbCBtZW1lcShjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiLCBzaXplX3Qgc2l6ZSkKK3sKKwljb25zdCB1aW50OF90ICp4ID0gYTsKKwljb25zdCB1aW50OF90ICp5ID0gYjsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpCisJCWlmICh4W2ldICE9IHlbaV0pCisJCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCisjaWZuZGVmIG1lbXplcm8KK3N0YXRpYyB2b2lkIG1lbXplcm8odm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwl1aW50OF90ICpiID0gYnVmOworCXVpbnQ4X3QgKmUgPSBiICsgc2l6ZTsKKworCXdoaWxlIChiICE9IGUpCisJCSpiKysgPSAnXDAnOworfQorI2VuZGlmCisKKyNpZm5kZWYgbWVtbW92ZQorLyogTm90IHN0YXRpYyB0byBhdm9pZCBhIGNvbmZsaWN0IHdpdGggdGhlIHByb3RvdHlwZSBpbiB0aGUgTGludXggaGVhZGVycy4gKi8KK3ZvaWQgKm1lbW1vdmUodm9pZCAqZGVzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwl1aW50OF90ICpkID0gZGVzdDsKKwljb25zdCB1aW50OF90ICpzID0gc3JjOworCXNpemVfdCBpOworCisJaWYgKGQgPCBzKSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpCisJCQlkW2ldID0gc1tpXTsKKwl9IGVsc2UgaWYgKGQgPiBzKSB7CisJCWkgPSBzaXplOworCQl3aGlsZSAoaS0tID4gMCkKKwkJCWRbaV0gPSBzW2ldOworCX0KKworCXJldHVybiBkZXN0OworfQorI2VuZGlmCisKKy8qCisgKiBTaW5jZSB3ZSBuZWVkIG1lbW1vdmUgYW55d2F5LCB3b3VsZCB1c2UgaXQgYXMgbWVtY3B5IHRvby4KKyAqIENvbW1lbnRlZCBvdXQgZm9yIG5vdyB0byBhdm9pZCBicmVha2luZyB0aGluZ3MuCisgKi8KKy8qCisjaWZuZGVmIG1lbWNweQorIwlkZWZpbmUgbWVtY3B5IG1lbW1vdmUKKyNlbmRpZgorKi8KKworI2luY2x1ZGUgInh6L3h6X2NyYzMyLmMiCisjaW5jbHVkZSAieHoveHpfZGVjX3N0cmVhbS5jIgorI2luY2x1ZGUgInh6L3h6X2RlY19sem1hMi5jIgorI2luY2x1ZGUgInh6L3h6X2RlY19iY2ouYyIKKworI2VuZGlmIC8qIFhaX1BSRUJPT1QgKi8KKworLyogU2l6ZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGluIG11bHRpLWNhbGwgbW9kZSAqLworI2RlZmluZSBYWl9JT0JVRl9TSVpFIDQwOTYKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgQVBJIGRlZmluZWQgaW4gPGxpbnV4L2RlY29tcHJlc3MvZ2VuZXJpYy5oPi4KKyAqCisgKiBUaGlzIHdyYXBwZXIgd2lsbCBhdXRvbWF0aWNhbGx5IGNob29zZSBzaW5nbGUtY2FsbCBvciBtdWx0aS1jYWxsIG1vZGUKKyAqIG9mIHRoZSBuYXRpdmUgWFogZGVjb2RlciBBUEkuIFRoZSBzaW5nbGUtY2FsbCBtb2RlIGNhbiBiZSB1c2VkIG9ubHkgd2hlbgorICogYm90aCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGF2YWlsYWJsZSBhcyBhIHNpbmdsZSBjaHVuaywgaS5lLiB3aGVuCisgKiBmaWxsKCkgYW5kIGZsdXNoKCkgd29uJ3QgYmUgdXNlZC4KKyAqLworU1RBVElDIGludCBJTklUIHVueHoodW5zaWduZWQgY2hhciAqaW4sIGxvbmcgaW5fc2l6ZSwKKwkJICAgICBsb25nICgqZmlsbCkodm9pZCAqZGVzdCwgdW5zaWduZWQgbG9uZyBzaXplKSwKKwkJICAgICBsb25nICgqZmx1c2gpKHZvaWQgKnNyYywgdW5zaWduZWQgbG9uZyBzaXplKSwKKwkJICAgICB1bnNpZ25lZCBjaGFyICpvdXQsIGxvbmcgKmluX3VzZWQsCisJCSAgICAgdm9pZCAoKmVycm9yKShjaGFyICp4KSkKK3sKKwlzdHJ1Y3QgeHpfYnVmIGI7CisJc3RydWN0IHh6X2RlYyAqczsKKwllbnVtIHh6X3JldCByZXQ7CisJYm9vbCBtdXN0X2ZyZWVfaW4gPSBmYWxzZTsKKworI2lmIFhaX0lOVEVSTkFMX0NSQzMyCisJeHpfY3JjMzJfaW5pdCgpOworI2VuZGlmCisKKwlpZiAoaW5fdXNlZCAhPSBOVUxMKQorCQkqaW5fdXNlZCA9IDA7CisKKwlpZiAoZmlsbCA9PSBOVUxMICYmIGZsdXNoID09IE5VTEwpCisJCXMgPSB4el9kZWNfaW5pdChYWl9TSU5HTEUsIDApOworCWVsc2UKKwkJcyA9IHh6X2RlY19pbml0KFhaX0RZTkFMTE9DLCAodWludDMyX3QpLTEpOworCisJaWYgKHMgPT0gTlVMTCkKKwkJZ290byBlcnJvcl9hbGxvY19zdGF0ZTsKKworCWlmIChmbHVzaCA9PSBOVUxMKSB7CisJCWIub3V0ID0gb3V0OworCQliLm91dF9zaXplID0gKHNpemVfdCktMTsKKwl9IGVsc2UgeworCQliLm91dF9zaXplID0gWFpfSU9CVUZfU0laRTsKKwkJYi5vdXQgPSBtYWxsb2MoWFpfSU9CVUZfU0laRSk7CisJCWlmIChiLm91dCA9PSBOVUxMKQorCQkJZ290byBlcnJvcl9hbGxvY19vdXQ7CisJfQorCisJaWYgKGluID09IE5VTEwpIHsKKwkJbXVzdF9mcmVlX2luID0gdHJ1ZTsKKwkJaW4gPSBtYWxsb2MoWFpfSU9CVUZfU0laRSk7CisJCWlmIChpbiA9PSBOVUxMKQorCQkJZ290byBlcnJvcl9hbGxvY19pbjsKKwl9CisKKwliLmluID0gaW47CisJYi5pbl9wb3MgPSAwOworCWIuaW5fc2l6ZSA9IGluX3NpemU7CisJYi5vdXRfcG9zID0gMDsKKworCWlmIChmaWxsID09IE5VTEwgJiYgZmx1c2ggPT0gTlVMTCkgeworCQlyZXQgPSB4el9kZWNfcnVuKHMsICZiKTsKKwl9IGVsc2UgeworCQlkbyB7CisJCQlpZiAoYi5pbl9wb3MgPT0gYi5pbl9zaXplICYmIGZpbGwgIT0gTlVMTCkgeworCQkJCWlmIChpbl91c2VkICE9IE5VTEwpCisJCQkJCSppbl91c2VkICs9IGIuaW5fcG9zOworCisJCQkJYi5pbl9wb3MgPSAwOworCisJCQkJaW5fc2l6ZSA9IGZpbGwoaW4sIFhaX0lPQlVGX1NJWkUpOworCQkJCWlmIChpbl9zaXplIDwgMCkgeworCQkJCQkvKgorCQkJCQkgKiBUaGlzIGlzbid0IGFuIG9wdGltYWwgZXJyb3IgY29kZQorCQkJCQkgKiBidXQgaXQgcHJvYmFibHkgaXNuJ3Qgd29ydGggbWFraW5nCisJCQkJCSAqIGEgbmV3IG9uZSBlaXRoZXIuCisJCQkJCSAqLworCQkJCQlyZXQgPSBYWl9CVUZfRVJST1I7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWIuaW5fc2l6ZSA9IGluX3NpemU7CisJCQl9CisKKwkJCXJldCA9IHh6X2RlY19ydW4ocywgJmIpOworCisJCQlpZiAoZmx1c2ggIT0gTlVMTCAmJiAoYi5vdXRfcG9zID09IGIub3V0X3NpemUKKwkJCQkJfHwgKHJldCAhPSBYWl9PSyAmJiBiLm91dF9wb3MgPiAwKSkpIHsKKwkJCQkvKgorCQkJCSAqIFNldHRpbmcgcmV0IGhlcmUgbWF5IGhpZGUgYW4gZXJyb3IKKwkJCQkgKiByZXR1cm5lZCBieSB4el9kZWNfcnVuKCksIGJ1dCBwcm9iYWJseQorCQkJCSAqIGl0J3Mgbm90IHRvbyBiYWQuCisJCQkJICovCisJCQkJaWYgKGZsdXNoKGIub3V0LCBiLm91dF9wb3MpICE9IChsb25nKWIub3V0X3BvcykKKwkJCQkJcmV0ID0gWFpfQlVGX0VSUk9SOworCisJCQkJYi5vdXRfcG9zID0gMDsKKwkJCX0KKwkJfSB3aGlsZSAocmV0ID09IFhaX09LKTsKKworCQlpZiAobXVzdF9mcmVlX2luKQorCQkJZnJlZShpbik7CisKKwkJaWYgKGZsdXNoICE9IE5VTEwpCisJCQlmcmVlKGIub3V0KTsKKwl9CisKKwlpZiAoaW5fdXNlZCAhPSBOVUxMKQorCQkqaW5fdXNlZCArPSBiLmluX3BvczsKKworCXh6X2RlY19lbmQocyk7CisKKwlzd2l0Y2ggKHJldCkgeworCWNhc2UgWFpfU1RSRUFNX0VORDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFhaX01FTV9FUlJPUjoKKwkJLyogVGhpcyBjYW4gb2NjdXIgb25seSBpbiBtdWx0aS1jYWxsIG1vZGUuICovCisJCWVycm9yKCJYWiBkZWNvbXByZXNzb3IgcmFuIG91dCBvZiBtZW1vcnkiKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0ZPUk1BVF9FUlJPUjoKKwkJZXJyb3IoIklucHV0IGlzIG5vdCBpbiB0aGUgWFogZm9ybWF0ICh3cm9uZyBtYWdpYyBieXRlcykiKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX09QVElPTlNfRVJST1I6CisJCWVycm9yKCJJbnB1dCB3YXMgZW5jb2RlZCB3aXRoIHNldHRpbmdzIHRoYXQgYXJlIG5vdCAiCisJCQkJInN1cHBvcnRlZCBieSB0aGlzIFhaIGRlY29kZXIiKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0RBVEFfRVJST1I6CisJY2FzZSBYWl9CVUZfRVJST1I6CisJCWVycm9yKCJYWi1jb21wcmVzc2VkIGRhdGEgaXMgY29ycnVwdCIpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVycm9yKCJCdWcgaW4gdGhlIFhaIGRlY29tcHJlc3NvciIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLTE7CisKK2Vycm9yX2FsbG9jX2luOgorCWlmIChmbHVzaCAhPSBOVUxMKQorCQlmcmVlKGIub3V0KTsKKworZXJyb3JfYWxsb2Nfb3V0OgorCXh6X2RlY19lbmQocyk7CisKK2Vycm9yX2FsbG9jX3N0YXRlOgorCWVycm9yKCJYWiBkZWNvbXByZXNzb3IgcmFuIG91dCBvZiBtZW1vcnkiKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBUaGlzIG1hY3JvIGlzIHVzZWQgYnkgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGZpbGVzIHRvIGRlY29tcHJlc3MKKyAqIHRoZSBrZXJuZWwgaW1hZ2UuCisgKi8KKyNpZmRlZiBYWl9QUkVCT09UCitTVEFUSUMgaW50IElOSVQgX19kZWNvbXByZXNzKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgbG9uZyBsZW4sCisJCQkgICBsb25nICgqZmlsbCkodm9pZCosIHVuc2lnbmVkIGxvbmcpLAorCQkJICAgbG9uZyAoKmZsdXNoKSh2b2lkKiwgdW5zaWduZWQgbG9uZyksCisJCQkgICB1bnNpZ25lZCBjaGFyICpvdXRfYnVmLCBsb25nIG9sZW4sCisJCQkgICBsb25nICpwb3MsCisJCQkgICB2b2lkICgqZXJyb3IpKGNoYXIgKngpKQoreworCXJldHVybiB1bnh6KGJ1ZiwgbGVuLCBmaWxsLCBmbHVzaCwgb3V0X2J1ZiwgcG9zLCBlcnJvcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RldnJlcy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGV2cmVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBhOGIxMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RldnJlcy5jCkBAIC0wLDAgKzEsNDMyIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKK3ZvaWQgZGV2bV9pb3JlbWFwX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJaW91bm1hcCgqKHZvaWQgX19pb21lbSAqKilyZXMpOworfQorCitzdGF0aWMgaW50IGRldm1faW9yZW1hcF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqbWF0Y2hfZGF0YSkKK3sKKwlyZXR1cm4gKih2b2lkICoqKXJlcyA9PSBtYXRjaF9kYXRhOworfQorCisvKioKKyAqIGRldm1faW9yZW1hcCAtIE1hbmFnZWQgaW9yZW1hcCgpCisgKiBAZGV2OiBHZW5lcmljIGRldmljZSB0byByZW1hcCBJTyBhZGRyZXNzIGZvcgorICogQG9mZnNldDogUmVzb3VyY2UgYWRkcmVzcyB0byBtYXAKKyAqIEBzaXplOiBTaXplIG9mIG1hcAorICoKKyAqIE1hbmFnZWQgaW9yZW1hcCgpLiAgTWFwIGlzIGF1dG9tYXRpY2FsbHkgdW5tYXBwZWQgb24gZHJpdmVyIGRldGFjaC4KKyAqLwordm9pZCBfX2lvbWVtICpkZXZtX2lvcmVtYXAoc3RydWN0IGRldmljZSAqZGV2LCByZXNvdXJjZV9zaXplX3Qgb2Zmc2V0LAorCQkJICAgcmVzb3VyY2Vfc2l6ZV90IHNpemUpCit7CisJdm9pZCBfX2lvbWVtICoqcHRyLCAqYWRkcjsKKworCXB0ciA9IGRldnJlc19hbGxvYyhkZXZtX2lvcmVtYXBfcmVsZWFzZSwgc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlhZGRyID0gaW9yZW1hcChvZmZzZXQsIHNpemUpOworCWlmIChhZGRyKSB7CisJCSpwdHIgPSBhZGRyOworCQlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKwl9IGVsc2UKKwkJZGV2cmVzX2ZyZWUocHRyKTsKKworCXJldHVybiBhZGRyOworfQorRVhQT1JUX1NZTUJPTChkZXZtX2lvcmVtYXApOworCisvKioKKyAqIGRldm1faW9yZW1hcF9ub2NhY2hlIC0gTWFuYWdlZCBpb3JlbWFwX25vY2FjaGUoKQorICogQGRldjogR2VuZXJpYyBkZXZpY2UgdG8gcmVtYXAgSU8gYWRkcmVzcyBmb3IKKyAqIEBvZmZzZXQ6IFJlc291cmNlIGFkZHJlc3MgdG8gbWFwCisgKiBAc2l6ZTogU2l6ZSBvZiBtYXAKKyAqCisgKiBNYW5hZ2VkIGlvcmVtYXBfbm9jYWNoZSgpLiAgTWFwIGlzIGF1dG9tYXRpY2FsbHkgdW5tYXBwZWQgb24gZHJpdmVyCisgKiBkZXRhY2guCisgKi8KK3ZvaWQgX19pb21lbSAqZGV2bV9pb3JlbWFwX25vY2FjaGUoc3RydWN0IGRldmljZSAqZGV2LCByZXNvdXJjZV9zaXplX3Qgb2Zmc2V0LAorCQkJCSAgIHJlc291cmNlX3NpemVfdCBzaXplKQoreworCXZvaWQgX19pb21lbSAqKnB0ciwgKmFkZHI7CisKKwlwdHIgPSBkZXZyZXNfYWxsb2MoZGV2bV9pb3JlbWFwX3JlbGVhc2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpCisJCXJldHVybiBOVUxMOworCisJYWRkciA9IGlvcmVtYXBfbm9jYWNoZShvZmZzZXQsIHNpemUpOworCWlmIChhZGRyKSB7CisJCSpwdHIgPSBhZGRyOworCQlkZXZyZXNfYWRkKGRldiwgcHRyKTsKKwl9IGVsc2UKKwkJZGV2cmVzX2ZyZWUocHRyKTsKKworCXJldHVybiBhZGRyOworfQorRVhQT1JUX1NZTUJPTChkZXZtX2lvcmVtYXBfbm9jYWNoZSk7CisKKy8qKgorICogZGV2bV9pb3JlbWFwX3djIC0gTWFuYWdlZCBpb3JlbWFwX3djKCkKKyAqIEBkZXY6IEdlbmVyaWMgZGV2aWNlIHRvIHJlbWFwIElPIGFkZHJlc3MgZm9yCisgKiBAb2Zmc2V0OiBSZXNvdXJjZSBhZGRyZXNzIHRvIG1hcAorICogQHNpemU6IFNpemUgb2YgbWFwCisgKgorICogTWFuYWdlZCBpb3JlbWFwX3djKCkuICBNYXAgaXMgYXV0b21hdGljYWxseSB1bm1hcHBlZCBvbiBkcml2ZXIgZGV0YWNoLgorICovCit2b2lkIF9faW9tZW0gKmRldm1faW9yZW1hcF93YyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHJlc291cmNlX3NpemVfdCBvZmZzZXQsCisJCQkgICAgICByZXNvdXJjZV9zaXplX3Qgc2l6ZSkKK3sKKwl2b2lkIF9faW9tZW0gKipwdHIsICphZGRyOworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faW9yZW1hcF9yZWxlYXNlLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHIgPSBpb3JlbWFwX3djKG9mZnNldCwgc2l6ZSk7CisJaWYgKGFkZHIpIHsKKwkJKnB0ciA9IGFkZHI7CisJCWRldnJlc19hZGQoZGV2LCBwdHIpOworCX0gZWxzZQorCQlkZXZyZXNfZnJlZShwdHIpOworCisJcmV0dXJuIGFkZHI7Cit9CitFWFBPUlRfU1lNQk9MKGRldm1faW9yZW1hcF93Yyk7CisKKy8qKgorICogZGV2bV9pb3VubWFwIC0gTWFuYWdlZCBpb3VubWFwKCkKKyAqIEBkZXY6IEdlbmVyaWMgZGV2aWNlIHRvIHVubWFwIGZvcgorICogQGFkZHI6IEFkZHJlc3MgdG8gdW5tYXAKKyAqCisgKiBNYW5hZ2VkIGlvdW5tYXAoKS4gIEBhZGRyIG11c3QgaGF2ZSBiZWVuIG1hcHBlZCB1c2luZyBkZXZtX2lvcmVtYXAqKCkuCisgKi8KK3ZvaWQgZGV2bV9pb3VubWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCVdBUk5fT04oZGV2cmVzX2Rlc3Ryb3koZGV2LCBkZXZtX2lvcmVtYXBfcmVsZWFzZSwgZGV2bV9pb3JlbWFwX21hdGNoLAorCQkJICAgICAgIChfX2ZvcmNlIHZvaWQgKilhZGRyKSk7CisJaW91bm1hcChhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0woZGV2bV9pb3VubWFwKTsKKworLyoqCisgKiBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoKSAtIGNoZWNrLCByZXF1ZXN0IHJlZ2lvbiwgYW5kIGlvcmVtYXAgcmVzb3VyY2UKKyAqIEBkZXY6IGdlbmVyaWMgZGV2aWNlIHRvIGhhbmRsZSB0aGUgcmVzb3VyY2UgZm9yCisgKiBAcmVzOiByZXNvdXJjZSB0byBiZSBoYW5kbGVkCisgKgorICogQ2hlY2tzIHRoYXQgYSByZXNvdXJjZSBpcyBhIHZhbGlkIG1lbW9yeSByZWdpb24sIHJlcXVlc3RzIHRoZSBtZW1vcnkKKyAqIHJlZ2lvbiBhbmQgaW9yZW1hcHMgaXQuIEFsbCBvcGVyYXRpb25zIGFyZSBtYW5hZ2VkIGFuZCB3aWxsIGJlIHVuZG9uZQorICogb24gZHJpdmVyIGRldGFjaC4KKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVtYXBwZWQgbWVtb3J5IG9yIGFuIEVSUl9QVFIoKSBlbmNvZGVkIGVycm9yIGNvZGUKKyAqIG9uIGZhaWx1cmUuIFVzYWdlIGV4YW1wbGU6CisgKgorICoJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKyAqCWJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKyAqCWlmIChJU19FUlIoYmFzZSkpCisgKgkJcmV0dXJuIFBUUl9FUlIoYmFzZSk7CisgKi8KK3ZvaWQgX19pb21lbSAqZGV2bV9pb3JlbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMpCit7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemU7CisJY29uc3QgY2hhciAqbmFtZTsKKwl2b2lkIF9faW9tZW0gKmRlc3RfcHRyOworCisJQlVHX09OKCFkZXYpOworCisJaWYgKCFyZXMgfHwgcmVzb3VyY2VfdHlwZShyZXMpICE9IElPUkVTT1VSQ0VfTUVNKSB7CisJCWRldl9lcnIoZGV2LCAiaW52YWxpZCByZXNvdXJjZVxuIik7CisJCXJldHVybiBJT01FTV9FUlJfUFRSKC1FSU5WQUwpOworCX0KKworCXNpemUgPSByZXNvdXJjZV9zaXplKHJlcyk7CisJbmFtZSA9IHJlcy0+bmFtZSA/OiBkZXZfbmFtZShkZXYpOworCisJaWYgKCFkZXZtX3JlcXVlc3RfbWVtX3JlZ2lvbihkZXYsIHJlcy0+c3RhcnQsIHNpemUsIG5hbWUpKSB7CisJCWRldl9lcnIoZGV2LCAiY2FuJ3QgcmVxdWVzdCByZWdpb24gZm9yIHJlc291cmNlICVwUlxuIiwgcmVzKTsKKwkJcmV0dXJuIElPTUVNX0VSUl9QVFIoLUVCVVNZKTsKKwl9CisKKwlkZXN0X3B0ciA9IGRldm1faW9yZW1hcChkZXYsIHJlcy0+c3RhcnQsIHNpemUpOworCWlmICghZGVzdF9wdHIpIHsKKwkJZGV2X2VycihkZXYsICJpb3JlbWFwIGZhaWxlZCBmb3IgcmVzb3VyY2UgJXBSXG4iLCByZXMpOworCQlkZXZtX3JlbGVhc2VfbWVtX3JlZ2lvbihkZXYsIHJlcy0+c3RhcnQsIHNpemUpOworCQlkZXN0X3B0ciA9IElPTUVNX0VSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcmV0dXJuIGRlc3RfcHRyOworfQorRVhQT1JUX1NZTUJPTChkZXZtX2lvcmVtYXBfcmVzb3VyY2UpOworCisjaWZkZWYgQ09ORklHX0hBU19JT1BPUlRfTUFQCisvKgorICogR2VuZXJpYyBpb21hcCBkZXZyZXMKKyAqLworc3RhdGljIHZvaWQgZGV2bV9pb3BvcnRfbWFwX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpyZXMpCit7CisJaW9wb3J0X3VubWFwKCoodm9pZCBfX2lvbWVtICoqKXJlcyk7Cit9CisKK3N0YXRpYyBpbnQgZGV2bV9pb3BvcnRfbWFwX21hdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzLAorCQkJCSB2b2lkICptYXRjaF9kYXRhKQoreworCXJldHVybiAqKHZvaWQgKiopcmVzID09IG1hdGNoX2RhdGE7Cit9CisKKy8qKgorICogZGV2bV9pb3BvcnRfbWFwIC0gTWFuYWdlZCBpb3BvcnRfbWFwKCkKKyAqIEBkZXY6IEdlbmVyaWMgZGV2aWNlIHRvIG1hcCBpb3BvcnQgZm9yCisgKiBAcG9ydDogUG9ydCB0byBtYXAKKyAqIEBucjogTnVtYmVyIG9mIHBvcnRzIHRvIG1hcAorICoKKyAqIE1hbmFnZWQgaW9wb3J0X21hcCgpLiAgTWFwIGlzIGF1dG9tYXRpY2FsbHkgdW5tYXBwZWQgb24gZHJpdmVyCisgKiBkZXRhY2guCisgKi8KK3ZvaWQgX19pb21lbSAqZGV2bV9pb3BvcnRfbWFwKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgbG9uZyBwb3J0LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBucikKK3sKKwl2b2lkIF9faW9tZW0gKipwdHIsICphZGRyOworCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1faW9wb3J0X21hcF9yZWxlYXNlLCBzaXplb2YoKnB0ciksIEdGUF9LRVJORUwpOworCWlmICghcHRyKQorCQlyZXR1cm4gTlVMTDsKKworCWFkZHIgPSBpb3BvcnRfbWFwKHBvcnQsIG5yKTsKKwlpZiAoYWRkcikgeworCQkqcHRyID0gYWRkcjsKKwkJZGV2cmVzX2FkZChkZXYsIHB0cik7CisJfSBlbHNlCisJCWRldnJlc19mcmVlKHB0cik7CisKKwlyZXR1cm4gYWRkcjsKK30KK0VYUE9SVF9TWU1CT0woZGV2bV9pb3BvcnRfbWFwKTsKKworLyoqCisgKiBkZXZtX2lvcG9ydF91bm1hcCAtIE1hbmFnZWQgaW9wb3J0X3VubWFwKCkKKyAqIEBkZXY6IEdlbmVyaWMgZGV2aWNlIHRvIHVubWFwIGZvcgorICogQGFkZHI6IEFkZHJlc3MgdG8gdW5tYXAKKyAqCisgKiBNYW5hZ2VkIGlvcG9ydF91bm1hcCgpLiAgQGFkZHIgbXVzdCBoYXZlIGJlZW4gbWFwcGVkIHVzaW5nCisgKiBkZXZtX2lvcG9ydF9tYXAoKS4KKyAqLwordm9pZCBkZXZtX2lvcG9ydF91bm1hcChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlpb3BvcnRfdW5tYXAoYWRkcik7CisJV0FSTl9PTihkZXZyZXNfZGVzdHJveShkZXYsIGRldm1faW9wb3J0X21hcF9yZWxlYXNlLAorCQkJICAgICAgIGRldm1faW9wb3J0X21hcF9tYXRjaCwgKF9fZm9yY2Ugdm9pZCAqKWFkZHIpKTsKK30KK0VYUE9SVF9TWU1CT0woZGV2bV9pb3BvcnRfdW5tYXApOworI2VuZGlmIC8qIENPTkZJR19IQVNfSU9QT1JUX01BUCAqLworCisjaWZkZWYgQ09ORklHX1BDSQorLyoKKyAqIFBDSSBpb21hcCBkZXZyZXMKKyAqLworI2RlZmluZSBQQ0lNX0lPTUFQX01BWAlQQ0lfUk9NX1JFU09VUkNFCisKK3N0cnVjdCBwY2ltX2lvbWFwX2RldnJlcyB7CisJdm9pZCBfX2lvbWVtICp0YWJsZVtQQ0lNX0lPTUFQX01BWF07Cit9OworCitzdGF0aWMgdm9pZCBwY2ltX2lvbWFwX3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZ2VuZGV2LCB2b2lkICpyZXMpCit7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IHRvX3BjaV9kZXYoZ2VuZGV2KTsKKwlzdHJ1Y3QgcGNpbV9pb21hcF9kZXZyZXMgKnRoaXMgPSByZXM7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJTV9JT01BUF9NQVg7IGkrKykKKwkJaWYgKHRoaXMtPnRhYmxlW2ldKQorCQkJcGNpX2lvdW5tYXAoZGV2LCB0aGlzLT50YWJsZVtpXSk7Cit9CisKKy8qKgorICogcGNpbV9pb21hcF90YWJsZSAtIGFjY2VzcyBpb21hcCBhbGxvY2F0aW9uIHRhYmxlCisgKiBAcGRldjogUENJIGRldmljZSB0byBhY2Nlc3MgaW9tYXAgdGFibGUgZm9yCisgKgorICogQWNjZXNzIGlvbWFwIGFsbG9jYXRpb24gdGFibGUgZm9yIEBkZXYuICBJZiBpb21hcCB0YWJsZSBkb2Vzbid0CisgKiBleGlzdCBhbmQgQHBkZXYgaXMgbWFuYWdlZCwgaXQgd2lsbCBiZSBhbGxvY2F0ZWQuICBBbGwgaW9tYXBzCisgKiByZWNvcmRlZCBpbiB0aGUgaW9tYXAgdGFibGUgYXJlIGF1dG9tYXRpY2FsbHkgdW5tYXBwZWQgb24gZHJpdmVyCisgKiBkZXRhY2guCisgKgorICogVGhpcyBmdW5jdGlvbiBtaWdodCBzbGVlcCB3aGVuIHRoZSB0YWJsZSBpcyBmaXJzdCBhbGxvY2F0ZWQgYnV0IGNhbgorICogYmUgc2FmZWx5IGNhbGxlZCB3aXRob3V0IGNvbnRleHQgYW5kIGd1YXJhbnRlZWQgdG8gc3VjY2VkIG9uY2UKKyAqIGFsbG9jYXRlZC4KKyAqLwordm9pZCBfX2lvbWVtICogY29uc3QgKnBjaW1faW9tYXBfdGFibGUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IHBjaW1faW9tYXBfZGV2cmVzICpkciwgKm5ld19kcjsKKworCWRyID0gZGV2cmVzX2ZpbmQoJnBkZXYtPmRldiwgcGNpbV9pb21hcF9yZWxlYXNlLCBOVUxMLCBOVUxMKTsKKwlpZiAoZHIpCisJCXJldHVybiBkci0+dGFibGU7CisKKwluZXdfZHIgPSBkZXZyZXNfYWxsb2MocGNpbV9pb21hcF9yZWxlYXNlLCBzaXplb2YoKm5ld19kciksIEdGUF9LRVJORUwpOworCWlmICghbmV3X2RyKQorCQlyZXR1cm4gTlVMTDsKKwlkciA9IGRldnJlc19nZXQoJnBkZXYtPmRldiwgbmV3X2RyLCBOVUxMLCBOVUxMKTsKKwlyZXR1cm4gZHItPnRhYmxlOworfQorRVhQT1JUX1NZTUJPTChwY2ltX2lvbWFwX3RhYmxlKTsKKworLyoqCisgKiBwY2ltX2lvbWFwIC0gTWFuYWdlZCBwY2ltX2lvbWFwKCkKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRvIGlvbWFwIGZvcgorICogQGJhcjogQkFSIHRvIGlvbWFwCisgKiBAbWF4bGVuOiBNYXhpbXVtIGxlbmd0aCBvZiBpb21hcAorICoKKyAqIE1hbmFnZWQgcGNpX2lvbWFwKCkuICBNYXAgaXMgYXV0b21hdGljYWxseSB1bm1hcHBlZCBvbiBkcml2ZXIKKyAqIGRldGFjaC4KKyAqLwordm9pZCBfX2lvbWVtICpwY2ltX2lvbWFwKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heGxlbikKK3sKKwl2b2lkIF9faW9tZW0gKip0Ymw7CisKKwlCVUdfT04oYmFyID49IFBDSU1fSU9NQVBfTUFYKTsKKworCXRibCA9ICh2b2lkIF9faW9tZW0gKiopcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwlpZiAoIXRibCB8fCB0YmxbYmFyXSkJLyogZHVwbGljYXRlIG1hcHBpbmdzIG5vdCBhbGxvd2VkICovCisJCXJldHVybiBOVUxMOworCisJdGJsW2Jhcl0gPSBwY2lfaW9tYXAocGRldiwgYmFyLCBtYXhsZW4pOworCXJldHVybiB0YmxbYmFyXTsKK30KK0VYUE9SVF9TWU1CT0wocGNpbV9pb21hcCk7CisKKy8qKgorICogcGNpbV9pb3VubWFwIC0gTWFuYWdlZCBwY2lfaW91bm1hcCgpCisgKiBAcGRldjogUENJIGRldmljZSB0byBpb3VubWFwIGZvcgorICogQGFkZHI6IEFkZHJlc3MgdG8gdW5tYXAKKyAqCisgKiBNYW5hZ2VkIHBjaV9pb3VubWFwKCkuICBAYWRkciBtdXN0IGhhdmUgYmVlbiBtYXBwZWQgdXNpbmcgcGNpbV9pb21hcCgpLgorICovCit2b2lkIHBjaW1faW91bm1hcChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdm9pZCBfX2lvbWVtICphZGRyKQoreworCXZvaWQgX19pb21lbSAqKnRibDsKKwlpbnQgaTsKKworCXBjaV9pb3VubWFwKHBkZXYsIGFkZHIpOworCisJdGJsID0gKHZvaWQgX19pb21lbSAqKilwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOworCUJVR19PTighdGJsKTsKKworCWZvciAoaSA9IDA7IGkgPCBQQ0lNX0lPTUFQX01BWDsgaSsrKQorCQlpZiAodGJsW2ldID09IGFkZHIpIHsKKwkJCXRibFtpXSA9IE5VTEw7CisJCQlyZXR1cm47CisJCX0KKwlXQVJOX09OKDEpOworfQorRVhQT1JUX1NZTUJPTChwY2ltX2lvdW5tYXApOworCisvKioKKyAqIHBjaW1faW9tYXBfcmVnaW9ucyAtIFJlcXVlc3QgYW5kIGlvbWFwIFBDSSBCQVJzCisgKiBAcGRldjogUENJIGRldmljZSB0byBtYXAgSU8gcmVzb3VyY2VzIGZvcgorICogQG1hc2s6IE1hc2sgb2YgQkFScyB0byByZXF1ZXN0IGFuZCBpb21hcAorICogQG5hbWU6IE5hbWUgdXNlZCB3aGVuIHJlcXVlc3RpbmcgcmVnaW9ucworICoKKyAqIFJlcXVlc3QgYW5kIGlvbWFwIHJlZ2lvbnMgc3BlY2lmaWVkIGJ5IEBtYXNrLgorICovCitpbnQgcGNpbV9pb21hcF9yZWdpb25zKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbWFzaywgY29uc3QgY2hhciAqbmFtZSkKK3sKKwl2b2lkIF9faW9tZW0gKiBjb25zdCAqaW9tYXA7CisJaW50IGksIHJjOworCisJaW9tYXAgPSBwY2ltX2lvbWFwX3RhYmxlKHBkZXYpOworCWlmICghaW9tYXApCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgbGVuOworCisJCWlmICghKG1hc2sgJiAoMSA8PCBpKSkpCisJCQljb250aW51ZTsKKworCQlyYyA9IC1FSU5WQUw7CisJCWxlbiA9IHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSk7CisJCWlmICghbGVuKQorCQkJZ290byBlcnJfaW52YWw7CisKKwkJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb24ocGRldiwgaSwgbmFtZSk7CisJCWlmIChyYykKKwkJCWdvdG8gZXJyX2ludmFsOworCisJCXJjID0gLUVOT01FTTsKKwkJaWYgKCFwY2ltX2lvbWFwKHBkZXYsIGksIDApKQorCQkJZ290byBlcnJfcmVnaW9uOworCX0KKworCXJldHVybiAwOworCisgZXJyX3JlZ2lvbjoKKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgaSk7CisgZXJyX2ludmFsOgorCXdoaWxlICgtLWkgPj0gMCkgeworCQlpZiAoIShtYXNrICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisJCXBjaW1faW91bm1hcChwZGV2LCBpb21hcFtpXSk7CisJCXBjaV9yZWxlYXNlX3JlZ2lvbihwZGV2LCBpKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MKHBjaW1faW9tYXBfcmVnaW9ucyk7CisKKy8qKgorICogcGNpbV9pb21hcF9yZWdpb25zX3JlcXVlc3RfYWxsIC0gUmVxdWVzdCBhbGwgQkFScyBhbmQgaW9tYXAgc3BlY2lmaWVkIG9uZXMKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRvIG1hcCBJTyByZXNvdXJjZXMgZm9yCisgKiBAbWFzazogTWFzayBvZiBCQVJzIHRvIGlvbWFwCisgKiBAbmFtZTogTmFtZSB1c2VkIHdoZW4gcmVxdWVzdGluZyByZWdpb25zCisgKgorICogUmVxdWVzdCBhbGwgUENJIEJBUnMgYW5kIGlvbWFwIHJlZ2lvbnMgc3BlY2lmaWVkIGJ5IEBtYXNrLgorICovCitpbnQgcGNpbV9pb21hcF9yZWdpb25zX3JlcXVlc3RfYWxsKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQgbWFzaywKKwkJCQkgICBjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXF1ZXN0X21hc2sgPSAoKDEgPDwgNikgLSAxKSAmIH5tYXNrOworCWludCByYzsKKworCXJjID0gcGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhwZGV2LCByZXF1ZXN0X21hc2ssIG5hbWUpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwY2ltX2lvbWFwX3JlZ2lvbnMocGRldiwgbWFzaywgbmFtZSk7CisJaWYgKHJjKQorCQlwY2lfcmVsZWFzZV9zZWxlY3RlZF9yZWdpb25zKHBkZXYsIHJlcXVlc3RfbWFzayk7CisJcmV0dXJuIHJjOworfQorRVhQT1JUX1NZTUJPTChwY2ltX2lvbWFwX3JlZ2lvbnNfcmVxdWVzdF9hbGwpOworCisvKioKKyAqIHBjaW1faW91bm1hcF9yZWdpb25zIC0gVW5tYXAgYW5kIHJlbGVhc2UgUENJIEJBUnMKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIHRvIG1hcCBJTyByZXNvdXJjZXMgZm9yCisgKiBAbWFzazogTWFzayBvZiBCQVJzIHRvIHVubWFwIGFuZCByZWxlYXNlCisgKgorICogVW5tYXAgYW5kIHJlbGVhc2UgcmVnaW9ucyBzcGVjaWZpZWQgYnkgQG1hc2suCisgKi8KK3ZvaWQgcGNpbV9pb3VubWFwX3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBtYXNrKQoreworCXZvaWQgX19pb21lbSAqIGNvbnN0ICppb21hcDsKKwlpbnQgaTsKKworCWlvbWFwID0gcGNpbV9pb21hcF90YWJsZShwZGV2KTsKKwlpZiAoIWlvbWFwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgUENJTV9JT01BUF9NQVg7IGkrKykgeworCQlpZiAoIShtYXNrICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJcGNpbV9pb3VubWFwKHBkZXYsIGlvbWFwW2ldKTsKKwkJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGkpOworCX0KK30KK0VYUE9SVF9TWU1CT0wocGNpbV9pb3VubWFwX3JlZ2lvbnMpOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RpZ3NpZy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZGlnc2lnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhNmZjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RpZ3NpZy5jCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIE5va2lhIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBBdXRob3I6CisgKiBEbWl0cnkgS2FzYXRraW4gPGRtaXRyeS5rYXNhdGtpbkBub2tpYS5jb20+CisgKiAgICAgICAgICAgICAgICAgPGRtaXRyeS5rYXNhdGtpbkBpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogRmlsZTogc2lnbi5jCisgKglpbXBsZW1lbnRzIHNpZ25hdHVyZSAoUlNBKSB2ZXJpZmljYXRpb24KKyAqCXBrY3MgZGVjb2RpbmcgaXMgYmFzZWQgb24gTGliVG9tQ3J5cHQgY29kZQorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXkuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG8uaD4KKyNpbmNsdWRlIDxjcnlwdG8vaGFzaC5oPgorI2luY2x1ZGUgPGNyeXB0by9zaGEuaD4KKyNpbmNsdWRlIDxrZXlzL3VzZXItdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L21waS5oPgorI2luY2x1ZGUgPGxpbnV4L2RpZ3NpZy5oPgorCitzdGF0aWMgc3RydWN0IGNyeXB0b19zaGFzaCAqc2hhc2g7CisKK3N0YXRpYyBjb25zdCBjaGFyICpwa2NzXzFfdjFfNV9kZWNvZGVfZW1zYShjb25zdCB1bnNpZ25lZCBjaGFyICptc2csCisJCQkJCQl1bnNpZ25lZCBsb25nICBtc2dsZW4sCisJCQkJCQl1bnNpZ25lZCBsb25nICBtb2R1bHVzX2JpdGxlbiwKKwkJCQkJCXVuc2lnbmVkIGxvbmcgKm91dGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIG1vZHVsdXNfbGVuLCBwc19sZW4sIGk7CisKKwltb2R1bHVzX2xlbiA9IChtb2R1bHVzX2JpdGxlbiA+PiAzKSArIChtb2R1bHVzX2JpdGxlbiAmIDcgPyAxIDogMCk7CisKKwkvKiB0ZXN0IG1lc3NhZ2Ugc2l6ZSAqLworCWlmICgobXNnbGVuID4gbW9kdWx1c19sZW4pIHx8IChtb2R1bHVzX2xlbiA8IDExKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBzZXBhcmF0ZSBlbmNvZGVkIG1lc3NhZ2UgKi8KKwlpZiAobXNnWzBdICE9IDB4MDAgfHwgbXNnWzFdICE9IDB4MDEpCisJCXJldHVybiBOVUxMOworCisJZm9yIChpID0gMjsgaSA8IG1vZHVsdXNfbGVuIC0gMTsgaSsrKQorCQlpZiAobXNnW2ldICE9IDB4RkYpCisJCQlicmVhazsKKworCS8qIHNlcGFyYXRvciBjaGVjayAqLworCWlmIChtc2dbaV0gIT0gMCkKKwkJLyogVGhlcmUgd2FzIG5vIG9jdGV0IHdpdGggaGV4YWRlY2ltYWwgdmFsdWUgMHgwMAorCQl0byBzZXBhcmF0ZSBwcyBmcm9tIG0uICovCisJCXJldHVybiBOVUxMOworCisJcHNfbGVuID0gaSAtIDI7CisKKwkqb3V0bGVuID0gKG1zZ2xlbiAtICgyICsgcHNfbGVuICsgMSkpOworCisJcmV0dXJuIG1zZyArIDIgKyBwc19sZW4gKyAxOworfQorCisvKgorICogUlNBIFNpZ25hdHVyZSB2ZXJpZmljYXRpb24gd2l0aCBwdWJsaWMga2V5CisgKi8KK3N0YXRpYyBpbnQgZGlnc2lnX3ZlcmlmeV9yc2Eoc3RydWN0IGtleSAqa2V5LAorCQkgICAgY29uc3QgY2hhciAqc2lnLCBpbnQgc2lnbGVuLAorCQkgICAgICAgY29uc3QgY2hhciAqaCwgaW50IGhsZW4pCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBsZW47CisJdW5zaWduZWQgbG9uZyBtbGVuLCBtYmxlbjsKKwl1bnNpZ25lZCBucmV0LCBsOworCWludCBoZWFkLCBpOworCXVuc2lnbmVkIGNoYXIgKm91dDEgPSBOVUxMOworCWNvbnN0IGNoYXIgKm07CisJTVBJIGluID0gTlVMTCwgcmVzID0gTlVMTCwgcGtleVsyXTsKKwl1aW50OF90ICpwLCAqZGF0YXA7CisJY29uc3QgdWludDhfdCAqZW5kcDsKKwljb25zdCBzdHJ1Y3QgdXNlcl9rZXlfcGF5bG9hZCAqdWtwOworCXN0cnVjdCBwdWJrZXlfaGRyICpwa2g7CisKKwlkb3duX3JlYWQoJmtleS0+c2VtKTsKKwl1a3AgPSB1c2VyX2tleV9wYXlsb2FkX2xvY2tlZChrZXkpOworCisJaWYgKCF1a3ApIHsKKwkJLyoga2V5IHdhcyByZXZva2VkIGJlZm9yZSB3ZSBhY3F1aXJlZCBpdHMgc2VtYXBob3JlICovCisJCWVyciA9IC1FS0VZUkVWT0tFRDsKKwkJZ290byBlcnIxOworCX0KKworCWlmICh1a3AtPmRhdGFsZW4gPCBzaXplb2YoKnBraCkpCisJCWdvdG8gZXJyMTsKKworCXBraCA9IChzdHJ1Y3QgcHVia2V5X2hkciAqKXVrcC0+ZGF0YTsKKworCWlmIChwa2gtPnZlcnNpb24gIT0gMSkKKwkJZ290byBlcnIxOworCisJaWYgKHBraC0+YWxnbyAhPSBQVUJLRVlfQUxHT19SU0EpCisJCWdvdG8gZXJyMTsKKworCWlmIChwa2gtPm5tcGkgIT0gMikKKwkJZ290byBlcnIxOworCisJZGF0YXAgPSBwa2gtPm1waTsKKwllbmRwID0gdWtwLT5kYXRhICsgdWtwLT5kYXRhbGVuOworCisJZm9yIChpID0gMDsgaSA8IHBraC0+bm1waTsgaSsrKSB7CisJCXVuc2lnbmVkIGludCByZW1haW5pbmcgPSBlbmRwIC0gZGF0YXA7CisJCXBrZXlbaV0gPSBtcGlfcmVhZF9mcm9tX2J1ZmZlcihkYXRhcCwgJnJlbWFpbmluZyk7CisJCWlmIChJU19FUlIocGtleVtpXSkpIHsKKwkJCWVyciA9IFBUUl9FUlIocGtleVtpXSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlkYXRhcCArPSByZW1haW5pbmc7CisJfQorCisJbWJsZW4gPSBtcGlfZ2V0X25iaXRzKHBrZXlbMF0pOworCW1sZW4gPSBESVZfUk9VTkRfVVAobWJsZW4sIDgpOworCisJaWYgKG1sZW4gPT0gMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCisJb3V0MSA9IGt6YWxsb2MobWxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFvdXQxKQorCQlnb3RvIGVycjsKKworCW5yZXQgPSBzaWdsZW47CisJaW4gPSBtcGlfcmVhZF9mcm9tX2J1ZmZlcihzaWcsICZucmV0KTsKKwlpZiAoSVNfRVJSKGluKSkgeworCQllcnIgPSBQVFJfRVJSKGluKTsKKwkJZ290byBlcnI7CisJfQorCisJcmVzID0gbXBpX2FsbG9jKG1waV9nZXRfbmxpbWJzKGluKSAqIDIpOworCWlmICghcmVzKQorCQlnb3RvIGVycjsKKworCWVyciA9IG1waV9wb3dtKHJlcywgaW4sIHBrZXlbMV0sIHBrZXlbMF0pOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJaWYgKG1waV9nZXRfbmxpbWJzKHJlcykgKiBCWVRFU19QRVJfTVBJX0xJTUIgPiBtbGVuKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyOworCX0KKworCXAgPSBtcGlfZ2V0X2J1ZmZlcihyZXMsICZsLCBOVUxMKTsKKwlpZiAoIXApIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJbGVuID0gbWxlbjsKKwloZWFkID0gbGVuIC0gbDsKKwltZW1zZXQob3V0MSwgMCwgaGVhZCk7CisJbWVtY3B5KG91dDEgKyBoZWFkLCBwLCBsKTsKKworCWtmcmVlKHApOworCisJbSA9IHBrY3NfMV92MV81X2RlY29kZV9lbXNhKG91dDEsIGxlbiwgbWJsZW4sICZsZW4pOworCisJaWYgKCFtIHx8IGxlbiAhPSBobGVuIHx8IG1lbWNtcChtLCBoLCBobGVuKSkKKwkJZXJyID0gLUVJTlZBTDsKKworZXJyOgorCW1waV9mcmVlKGluKTsKKwltcGlfZnJlZShyZXMpOworCWtmcmVlKG91dDEpOworCXdoaWxlICgtLWkgPj0gMCkKKwkJbXBpX2ZyZWUocGtleVtpXSk7CitlcnIxOgorCXVwX3JlYWQoJmtleS0+c2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZGlnc2lnX3ZlcmlmeSgpIC0gZGlnaXRhbCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIHdpdGggcHVibGljIGtleQorICogQGtleXJpbmc6CWtleXJpbmcgdG8gc2VhcmNoIGtleSBpbgorICogQHNpZzoJZGlnaXRhbCBzaWduYXR1cmUKKyAqIEBzaWdsZW46CWxlbmd0aCBvZiB0aGUgc2lnbmF0dXJlCisgKiBAZGF0YToJZGF0YQorICogQGRhdGFsZW46CWxlbmd0aCBvZiB0aGUgZGF0YQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG90aGVyd2lzZQorICoKKyAqIFZlcmlmaWVzIGRhdGEgaW50ZWdyaXR5IGFnYWluc3QgZGlnaXRhbCBzaWduYXR1cmUuCisgKiBDdXJyZW50bHkgb25seSBSU0EgaXMgc3VwcG9ydGVkLgorICogTm9ybWFsbHkgaGFzaCBvZiB0aGUgY29udGVudCBpcyB1c2VkIGFzIGEgZGF0YSBmb3IgdGhpcyBmdW5jdGlvbi4KKyAqCisgKi8KK2ludCBkaWdzaWdfdmVyaWZ5KHN0cnVjdCBrZXkgKmtleXJpbmcsIGNvbnN0IGNoYXIgKnNpZywgaW50IHNpZ2xlbiwKKwkJCQkJCWNvbnN0IGNoYXIgKmRhdGEsIGludCBkYXRhbGVuKQoreworCWludCBlcnIgPSAtRU5PTUVNOworCXN0cnVjdCBzaWduYXR1cmVfaGRyICpzaCA9IChzdHJ1Y3Qgc2lnbmF0dXJlX2hkciAqKXNpZzsKKwlzdHJ1Y3Qgc2hhc2hfZGVzYyAqZGVzYyA9IE5VTEw7CisJdW5zaWduZWQgY2hhciBoYXNoW1NIQTFfRElHRVNUX1NJWkVdOworCXN0cnVjdCBrZXkgKmtleTsKKwljaGFyIG5hbWVbMjBdOworCisJaWYgKHNpZ2xlbiA8IHNpemVvZigqc2gpICsgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoc2gtPmFsZ28gIT0gUFVCS0VZX0FMR09fUlNBKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJc3ByaW50ZihuYW1lLCAiJWxsWCIsIF9fYmU2NF90b19jcHVwKCh1aW50NjRfdCAqKXNoLT5rZXlpZCkpOworCisJaWYgKGtleXJpbmcpIHsKKwkJLyogc2VhcmNoIGluIHNwZWNpZmljIGtleXJpbmcgKi8KKwkJa2V5X3JlZl90IGtyZWY7CisJCWtyZWYgPSBrZXlyaW5nX3NlYXJjaChtYWtlX2tleV9yZWYoa2V5cmluZywgMVVMKSwKKwkJCQkJCSZrZXlfdHlwZV91c2VyLCBuYW1lKTsKKwkJaWYgKElTX0VSUihrcmVmKSkKKwkJCWtleSA9IEVSUl9DQVNUKGtyZWYpOworCQllbHNlCisJCQlrZXkgPSBrZXlfcmVmX3RvX3B0cihrcmVmKTsKKwl9IGVsc2UgeworCQlrZXkgPSByZXF1ZXN0X2tleSgma2V5X3R5cGVfdXNlciwgbmFtZSwgTlVMTCk7CisJfQorCWlmIChJU19FUlIoa2V5KSkgeworCQlwcl9lcnIoImtleSBub3QgZm91bmQsIGlkOiAlc1xuIiwgbmFtZSk7CisJCXJldHVybiBQVFJfRVJSKGtleSk7CisJfQorCisJZGVzYyA9IGt6YWxsb2Moc2l6ZW9mKCpkZXNjKSArIGNyeXB0b19zaGFzaF9kZXNjc2l6ZShzaGFzaCksCisJCSAgICAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpCisJCWdvdG8gZXJyOworCisJZGVzYy0+dGZtID0gc2hhc2g7CisJZGVzYy0+ZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CisKKwljcnlwdG9fc2hhc2hfaW5pdChkZXNjKTsKKwljcnlwdG9fc2hhc2hfdXBkYXRlKGRlc2MsIGRhdGEsIGRhdGFsZW4pOworCWNyeXB0b19zaGFzaF91cGRhdGUoZGVzYywgc2lnLCBzaXplb2YoKnNoKSk7CisJY3J5cHRvX3NoYXNoX2ZpbmFsKGRlc2MsIGhhc2gpOworCisJa2ZyZWUoZGVzYyk7CisKKwkvKiBwYXNzIHNpZ25hdHVyZSBtcGlzIGFkZHJlc3MgKi8KKwllcnIgPSBkaWdzaWdfdmVyaWZ5X3JzYShrZXksIHNpZyArIHNpemVvZigqc2gpLCBzaWdsZW4gLSBzaXplb2YoKnNoKSwKKwkJCSAgICAgaGFzaCwgc2l6ZW9mKGhhc2gpKTsKKworZXJyOgorCWtleV9wdXQoa2V5KTsKKworCXJldHVybiBlcnIgPyAtRUlOVkFMIDogMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRpZ3NpZ192ZXJpZnkpOworCitzdGF0aWMgaW50IF9faW5pdCBkaWdzaWdfaW5pdCh2b2lkKQoreworCXNoYXNoID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJzaGExIiwgMCwgMCk7CisJaWYgKElTX0VSUihzaGFzaCkpIHsKKwkJcHJfZXJyKCJzaGFzaCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAgUFRSX0VSUihzaGFzaCk7CisJfQorCisJcmV0dXJuIDA7CisKK30KKworc3RhdGljIHZvaWQgX19leGl0IGRpZ3NpZ19jbGVhbnVwKHZvaWQpCit7CisJY3J5cHRvX2ZyZWVfc2hhc2goc2hhc2gpOworfQorCittb2R1bGVfaW5pdChkaWdzaWdfaW5pdCk7Cittb2R1bGVfZXhpdChkaWdzaWdfY2xlYW51cCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RpdjY0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kaXY2NC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjg4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kaXY2NC5jCkBAIC0wLDAgKzEsMTg2IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBCZXJuYXJkbyBJbm5vY2VudGkgPGJlcm5pZUBkZXZlbGVyLmNvbT4KKyAqCisgKiBCYXNlZCBvbiBmb3JtZXIgZG9fZGl2KCkgaW1wbGVtZW50YXRpb24gZnJvbSBhc20tcGFyaXNjL2RpdjY0Lmg6CisgKglDb3B5cmlnaHQgKEMpIDE5OTkgSGV3bGV0dC1QYWNrYXJkIENvCisgKglDb3B5cmlnaHQgKEMpIDE5OTkgRGF2aWQgTW9zYmVyZ2VyLVRhbmcgPGRhdmlkbUBocGwuaHAuY29tPgorICoKKyAqCisgKiBHZW5lcmljIEMgdmVyc2lvbiBvZiA2NGJpdC8zMmJpdCBkaXZpc2lvbiBhbmQgbW9kdWxvLCB3aXRoCisgKiA2NGJpdCByZXN1bHQgYW5kIDMyYml0IHJlbWFpbmRlci4KKyAqCisgKiBUaGUgZmFzdCBjYXNlIGZvciAobj4+MzIgPT0gMCkgaXMgaGFuZGxlZCBpbmxpbmUgYnkgZG9fZGl2KCkuIAorICoKKyAqIENvZGUgZ2VuZXJhdGVkIGZvciB0aGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIHZlcnkgaW5lZmZpY2llbnQKKyAqIGZvciBzb21lIENQVXMuIF9fZGl2NjRfMzIoKSBjYW4gYmUgb3ZlcnJpZGRlbiBieSBsaW5raW5nIGFyY2gtc3BlY2lmaWMKKyAqIGFzc2VtYmx5IHZlcnNpb25zIHN1Y2ggYXMgYXJjaC9wcGMvbGliL2RpdjY0LlMgYW5kIGFyY2gvc2gvbGliL2RpdjY0LlMKKyAqIG9yIGJ5IGRlZmluaW5nIGEgcHJlcHJvY2Vzc29yIG1hY3JvIGluIGFyY2gvaW5jbHVkZS9hc20vZGl2NjQuaC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisKKy8qIE5vdCBuZWVkZWQgb24gNjRiaXQgYXJjaGl0ZWN0dXJlcyAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKworI2lmbmRlZiBfX2RpdjY0XzMyCit1aW50MzJfdCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgX19kaXY2NF8zMih1aW50NjRfdCAqbiwgdWludDMyX3QgYmFzZSkKK3sKKwl1aW50NjRfdCByZW0gPSAqbjsKKwl1aW50NjRfdCBiID0gYmFzZTsKKwl1aW50NjRfdCByZXMsIGQgPSAxOworCXVpbnQzMl90IGhpZ2ggPSByZW0gPj4gMzI7CisKKwkvKiBSZWR1Y2UgdGhlIHRoaW5nIGEgYml0IGZpcnN0ICovCisJcmVzID0gMDsKKwlpZiAoaGlnaCA+PSBiYXNlKSB7CisJCWhpZ2ggLz0gYmFzZTsKKwkJcmVzID0gKHVpbnQ2NF90KSBoaWdoIDw8IDMyOworCQlyZW0gLT0gKHVpbnQ2NF90KSAoaGlnaCpiYXNlKSA8PCAzMjsKKwl9CisKKwl3aGlsZSAoKGludDY0X3QpYiA+IDAgJiYgYiA8IHJlbSkgeworCQliID0gYitiOworCQlkID0gZCtkOworCX0KKworCWRvIHsKKwkJaWYgKHJlbSA+PSBiKSB7CisJCQlyZW0gLT0gYjsKKwkJCXJlcyArPSBkOworCQl9CisJCWIgPj49IDE7CisJCWQgPj49IDE7CisJfSB3aGlsZSAoZCk7CisKKwkqbiA9IHJlczsKKwlyZXR1cm4gcmVtOworfQorRVhQT1JUX1NZTUJPTChfX2RpdjY0XzMyKTsKKyNlbmRpZgorCisjaWZuZGVmIGRpdl9zNjRfcmVtCitzNjQgZGl2X3M2NF9yZW0oczY0IGRpdmlkZW5kLCBzMzIgZGl2aXNvciwgczMyICpyZW1haW5kZXIpCit7CisJdTY0IHF1b3RpZW50OworCisJaWYgKGRpdmlkZW5kIDwgMCkgeworCQlxdW90aWVudCA9IGRpdl91NjRfcmVtKC1kaXZpZGVuZCwgYWJzKGRpdmlzb3IpLCAodTMyICopcmVtYWluZGVyKTsKKwkJKnJlbWFpbmRlciA9IC0qcmVtYWluZGVyOworCQlpZiAoZGl2aXNvciA+IDApCisJCQlxdW90aWVudCA9IC1xdW90aWVudDsKKwl9IGVsc2UgeworCQlxdW90aWVudCA9IGRpdl91NjRfcmVtKGRpdmlkZW5kLCBhYnMoZGl2aXNvciksICh1MzIgKilyZW1haW5kZXIpOworCQlpZiAoZGl2aXNvciA8IDApCisJCQlxdW90aWVudCA9IC1xdW90aWVudDsKKwl9CisJcmV0dXJuIHF1b3RpZW50OworfQorRVhQT1JUX1NZTUJPTChkaXZfczY0X3JlbSk7CisjZW5kaWYKKworLyoqCisgKiBkaXY2NF91NjRfcmVtIC0gdW5zaWduZWQgNjRiaXQgZGl2aWRlIHdpdGggNjRiaXQgZGl2aXNvciBhbmQgcmVtYWluZGVyCisgKiBAZGl2aWRlbmQ6CTY0Yml0IGRpdmlkZW5kCisgKiBAZGl2aXNvcjoJNjRiaXQgZGl2aXNvcgorICogQHJlbWFpbmRlcjogIDY0Yml0IHJlbWFpbmRlcgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBjb21wYXJhYmxlIHRvIGFsZ29yaXRobSB1c2VkIGJ5IGRpdjY0X3U2NC4KKyAqIEJ1dCB0aGlzIG9wZXJhdGlvbiwgd2hpY2ggaW5jbHVkZXMgbWF0aCBmb3IgY2FsY3VsYXRpbmcgdGhlIHJlbWFpbmRlciwKKyAqIGlzIGtlcHQgZGlzdGluY3QgdG8gYXZvaWQgc2xvd2luZyBkb3duIHRoZSBkaXY2NF91NjQgb3BlcmF0aW9uIG9uIDMyYml0CisgKiBzeXN0ZW1zLgorICovCisjaWZuZGVmIGRpdjY0X3U2NF9yZW0KK3U2NCBkaXY2NF91NjRfcmVtKHU2NCBkaXZpZGVuZCwgdTY0IGRpdmlzb3IsIHU2NCAqcmVtYWluZGVyKQoreworCXUzMiBoaWdoID0gZGl2aXNvciA+PiAzMjsKKwl1NjQgcXVvdDsKKworCWlmIChoaWdoID09IDApIHsKKwkJdTMyIHJlbTMyOworCQlxdW90ID0gZGl2X3U2NF9yZW0oZGl2aWRlbmQsIGRpdmlzb3IsICZyZW0zMik7CisJCSpyZW1haW5kZXIgPSByZW0zMjsKKwl9IGVsc2UgeworCQlpbnQgbiA9IGZscyhoaWdoKTsKKwkJcXVvdCA9IGRpdl91NjQoZGl2aWRlbmQgPj4gbiwgZGl2aXNvciA+PiBuKTsKKworCQlpZiAocXVvdCAhPSAwKQorCQkJcXVvdC0tOworCisJCSpyZW1haW5kZXIgPSBkaXZpZGVuZCAtIHF1b3QgKiBkaXZpc29yOworCQlpZiAoKnJlbWFpbmRlciA+PSBkaXZpc29yKSB7CisJCQlxdW90Kys7CisJCQkqcmVtYWluZGVyIC09IGRpdmlzb3I7CisJCX0KKwl9CisKKwlyZXR1cm4gcXVvdDsKK30KK0VYUE9SVF9TWU1CT0woZGl2NjRfdTY0X3JlbSk7CisjZW5kaWYKKworLyoqCisgKiBkaXY2NF91NjQgLSB1bnNpZ25lZCA2NGJpdCBkaXZpZGUgd2l0aCA2NGJpdCBkaXZpc29yCisgKiBAZGl2aWRlbmQ6CTY0Yml0IGRpdmlkZW5kCisgKiBAZGl2aXNvcjoJNjRiaXQgZGl2aXNvcgorICoKKyAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBhbGdvcml0aG0gcHJvcG9zZWQKKyAqIGJ5IHRoZSBib29rICdIYWNrZXIncyBEZWxpZ2h0Jy4gIFRoZSBvcmlnaW5hbCBzb3VyY2UgYW5kIGZ1bGwgcHJvb2YKKyAqIGNhbiBiZSBmb3VuZCBoZXJlIGFuZCBpcyBhdmFpbGFibGUgZm9yIHVzZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorICoKKyAqICdodHRwOi8vd3d3LmhhY2tlcnNkZWxpZ2h0Lm9yZy9oZGNvZGV0eHQvZGl2RG91YmxlLmMudHh0JworICovCisjaWZuZGVmIGRpdjY0X3U2NAordTY0IGRpdjY0X3U2NCh1NjQgZGl2aWRlbmQsIHU2NCBkaXZpc29yKQoreworCXUzMiBoaWdoID0gZGl2aXNvciA+PiAzMjsKKwl1NjQgcXVvdDsKKworCWlmIChoaWdoID09IDApIHsKKwkJcXVvdCA9IGRpdl91NjQoZGl2aWRlbmQsIGRpdmlzb3IpOworCX0gZWxzZSB7CisJCWludCBuID0gZmxzKGhpZ2gpOworCQlxdW90ID0gZGl2X3U2NChkaXZpZGVuZCA+PiBuLCBkaXZpc29yID4+IG4pOworCisJCWlmIChxdW90ICE9IDApCisJCQlxdW90LS07CisJCWlmICgoZGl2aWRlbmQgLSBxdW90ICogZGl2aXNvcikgPj0gZGl2aXNvcikKKwkJCXF1b3QrKzsKKwl9CisKKwlyZXR1cm4gcXVvdDsKK30KK0VYUE9SVF9TWU1CT0woZGl2NjRfdTY0KTsKKyNlbmRpZgorCisvKioKKyAqIGRpdjY0X3M2NCAtIHNpZ25lZCA2NGJpdCBkaXZpZGUgd2l0aCA2NGJpdCBkaXZpc29yCisgKiBAZGl2aWRlbmQ6CTY0Yml0IGRpdmlkZW5kCisgKiBAZGl2aXNvcjoJNjRiaXQgZGl2aXNvcgorICovCisjaWZuZGVmIGRpdjY0X3M2NAorczY0IGRpdjY0X3M2NChzNjQgZGl2aWRlbmQsIHM2NCBkaXZpc29yKQoreworCXM2NCBxdW90LCB0OworCisJcXVvdCA9IGRpdjY0X3U2NChhYnMoZGl2aWRlbmQpLCBhYnMoZGl2aXNvcikpOworCXQgPSAoZGl2aWRlbmQgXiBkaXZpc29yKSA+PiA2MzsKKworCXJldHVybiAocXVvdCBeIHQpIC0gdDsKK30KK0VYUE9SVF9TWU1CT0woZGl2NjRfczY0KTsKKyNlbmRpZgorCisjZW5kaWYgLyogQklUU19QRVJfTE9ORyA9PSAzMiAqLworCisvKgorICogSXRlcmF0aXZlIGRpdi9tb2QgZm9yIHVzZSB3aGVuIGRpdmlkZW5kIGlzIG5vdCBleHBlY3RlZCB0byBiZSBtdWNoCisgKiBiaWdnZXIgdGhhbiBkaXZpc29yLgorICovCit1MzIgaXRlcl9kaXZfdTY0X3JlbSh1NjQgZGl2aWRlbmQsIHUzMiBkaXZpc29yLCB1NjQgKnJlbWFpbmRlcikKK3sKKwlyZXR1cm4gX19pdGVyX2Rpdl91NjRfcmVtKGRpdmlkZW5kLCBkaXZpc29yLCByZW1haW5kZXIpOworfQorRVhQT1JUX1NZTUJPTChpdGVyX2Rpdl91NjRfcmVtKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RtYS1kZWJ1Zy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZG1hLWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFlNzI0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RtYS1kZWJ1Zy5jCkBAIC0wLDAgKzEsMTczNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogQXV0aG9yOiBKb2VyZyBSb2VkZWwgPGpvZXJnLnJvZWRlbEBhbWQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3IFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC90YXNrX3N0YWNrLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFja3RyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisKKyNkZWZpbmUgSEFTSF9TSVpFICAgICAgIDEwMjRVTEwKKyNkZWZpbmUgSEFTSF9GTl9TSElGVCAgIDEzCisjZGVmaW5lIEhBU0hfRk5fTUFTSyAgICAoSEFTSF9TSVpFIC0gMSkKKworZW51bSB7CisJZG1hX2RlYnVnX3NpbmdsZSwKKwlkbWFfZGVidWdfcGFnZSwKKwlkbWFfZGVidWdfc2csCisJZG1hX2RlYnVnX2NvaGVyZW50LAorCWRtYV9kZWJ1Z19yZXNvdXJjZSwKK307CisKK2VudW0gbWFwX2Vycl90eXBlcyB7CisJTUFQX0VSUl9DSEVDS19OT1RfQVBQTElDQUJMRSwKKwlNQVBfRVJSX05PVF9DSEVDS0VELAorCU1BUF9FUlJfQ0hFQ0tFRCwKK307CisKKyNkZWZpbmUgRE1BX0RFQlVHX1NUQUNLVFJBQ0VfRU5UUklFUyA1CisKKy8qKgorICogc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAtIHRyYWNrIGEgZG1hX21hcCogb3IgZG1hX2FsbG9jX2NvaGVyZW50IG1hcHBpbmcKKyAqIEBsaXN0OiBub2RlIG9uIHByZS1hbGxvY2F0ZWQgZnJlZV9lbnRyaWVzIGxpc3QKKyAqIEBkZXY6ICdkZXYnIGFyZ3VtZW50IHRvIGRtYV9tYXBfe3BhZ2V8c2luZ2xlfHNnfSBvciBkbWFfYWxsb2NfY29oZXJlbnQKKyAqIEB0eXBlOiBzaW5nbGUsIHBhZ2UsIHNnLCBjb2hlcmVudAorICogQHBmbjogcGFnZSBmcmFtZSBvZiB0aGUgc3RhcnQgYWRkcmVzcworICogQG9mZnNldDogb2Zmc2V0IG9mIG1hcHBpbmcgcmVsYXRpdmUgdG8gcGZuCisgKiBAc2l6ZTogbGVuZ3RoIG9mIHRoZSBtYXBwaW5nCisgKiBAZGlyZWN0aW9uOiBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbgorICogQHNnX2NhbGxfZW50czogJ25lbnRzJyBmcm9tIGRtYV9tYXBfc2cKKyAqIEBzZ19tYXBwZWRfZW50czogJ21hcHBlZF9lbnRzJyBmcm9tIGRtYV9tYXBfc2cKKyAqIEBtYXBfZXJyX3R5cGU6IHRyYWNrIHdoZXRoZXIgZG1hX21hcHBpbmdfZXJyb3IoKSB3YXMgY2hlY2tlZAorICogQHN0YWNrdHJhY2U6IHN1cHBvcnQgYmFja3RyYWNlcyB3aGVuIGEgdmlvbGF0aW9uIGlzIGRldGVjdGVkCisgKi8KK3N0cnVjdCBkbWFfZGVidWdfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZGV2aWNlICAgICpkZXY7CisJaW50ICAgICAgICAgICAgICB0eXBlOworCXVuc2lnbmVkIGxvbmcJIHBmbjsKKwlzaXplX3QJCSBvZmZzZXQ7CisJdTY0ICAgICAgICAgICAgICBkZXZfYWRkcjsKKwl1NjQgICAgICAgICAgICAgIHNpemU7CisJaW50ICAgICAgICAgICAgICBkaXJlY3Rpb247CisJaW50CQkgc2dfY2FsbF9lbnRzOworCWludAkJIHNnX21hcHBlZF9lbnRzOworCWVudW0gbWFwX2Vycl90eXBlcyAgbWFwX2Vycl90eXBlOworI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJc3RydWN0CQkgc3RhY2tfdHJhY2Ugc3RhY2t0cmFjZTsKKwl1bnNpZ25lZCBsb25nCSBzdF9lbnRyaWVzW0RNQV9ERUJVR19TVEFDS1RSQUNFX0VOVFJJRVNdOworI2VuZGlmCit9OworCit0eXBlZGVmIGJvb2wgKCptYXRjaF9mbikoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqLCBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICopOworCitzdHJ1Y3QgaGFzaF9idWNrZXQgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzcGlubG9ja190IGxvY2s7Cit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKy8qIEhhc2ggbGlzdCB0byBzYXZlIHRoZSBhbGxvY2F0ZWQgZG1hIGFkZHJlc3NlcyAqLworc3RhdGljIHN0cnVjdCBoYXNoX2J1Y2tldCBkbWFfZW50cnlfaGFzaFtIQVNIX1NJWkVdOworLyogTGlzdCBvZiBwcmUtYWxsb2NhdGVkIGRtYV9kZWJ1Z19lbnRyeSdzICovCitzdGF0aWMgTElTVF9IRUFEKGZyZWVfZW50cmllcyk7CisvKiBMb2NrIGZvciB0aGUgbGlzdCBhYm92ZSAqLworc3RhdGljIERFRklORV9TUElOTE9DSyhmcmVlX2VudHJpZXNfbG9jayk7CisKKy8qIEdsb2JhbCBkaXNhYmxlIGZsYWcgLSB3aWxsIGJlIHNldCBpbiBjYXNlIG9mIGFuIGVycm9yICovCitzdGF0aWMgYm9vbCBnbG9iYWxfZGlzYWJsZSBfX3JlYWRfbW9zdGx5OworCisvKiBFYXJseSBpbml0aWFsaXphdGlvbiBkaXNhYmxlIGZsYWcsIHNldCBhdCB0aGUgZW5kIG9mIGRtYV9kZWJ1Z19pbml0ICovCitzdGF0aWMgYm9vbCBkbWFfZGVidWdfaW5pdGlhbGl6ZWQgX19yZWFkX21vc3RseTsKKworc3RhdGljIGlubGluZSBib29sIGRtYV9kZWJ1Z19kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiBnbG9iYWxfZGlzYWJsZSB8fCAhZG1hX2RlYnVnX2luaXRpYWxpemVkOworfQorCisvKiBHbG9iYWwgZXJyb3IgY291bnQgKi8KK3N0YXRpYyB1MzIgZXJyb3JfY291bnQ7CisKKy8qIEdsb2JhbCBlcnJvciBzaG93IGVuYWJsZSovCitzdGF0aWMgdTMyIHNob3dfYWxsX2Vycm9ycyBfX3JlYWRfbW9zdGx5OworLyogTnVtYmVyIG9mIGVycm9ycyB0byBzaG93ICovCitzdGF0aWMgdTMyIHNob3dfbnVtX2Vycm9ycyA9IDE7CisKK3N0YXRpYyB1MzIgbnVtX2ZyZWVfZW50cmllczsKK3N0YXRpYyB1MzIgbWluX2ZyZWVfZW50cmllczsKK3N0YXRpYyB1MzIgbnJfdG90YWxfZW50cmllczsKKworLyogbnVtYmVyIG9mIHByZWFsbG9jYXRlZCBlbnRyaWVzIHJlcXVlc3RlZCBieSBrZXJuZWwgY21kbGluZSAqLworc3RhdGljIHUzMiByZXFfZW50cmllczsKKworLyogZGVidWdmcyBkZW50cnkncyBmb3IgdGhlIHN0dWZmIGFib3ZlICovCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZG1hX2RlYnVnX2RlbnQgICAgICAgIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZ2xvYmFsX2Rpc2FibGVfZGVudCAgIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZXJyb3JfY291bnRfZGVudCAgICAgIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2hvd19hbGxfZXJyb3JzX2RlbnQgIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2hvd19udW1fZXJyb3JzX2RlbnQgIF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnVtX2ZyZWVfZW50cmllc19kZW50IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqbWluX2ZyZWVfZW50cmllc19kZW50IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZmlsdGVyX2RlbnQgICAgICAgICAgIF9fcmVhZF9tb3N0bHk7CisKKy8qIHBlci1kcml2ZXIgZmlsdGVyIHJlbGF0ZWQgc3RhdGUgKi8KKworI2RlZmluZSBOQU1FX01BWF9MRU4JNjQKKworc3RhdGljIGNoYXIgICAgICAgICAgICAgICAgICBjdXJyZW50X2RyaXZlcl9uYW1lW05BTUVfTUFYX0xFTl0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqY3VycmVudF9kcml2ZXIgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGRyaXZlcl9uYW1lX2xvY2spOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbWFwZXJyMnN0cltdID0geworCVtNQVBfRVJSX0NIRUNLX05PVF9BUFBMSUNBQkxFXSA9ICJkbWEgbWFwIGVycm9yIGNoZWNrIG5vdCBhcHBsaWNhYmxlIiwKKwlbTUFQX0VSUl9OT1RfQ0hFQ0tFRF0gPSAiZG1hIG1hcCBlcnJvciBub3QgY2hlY2tlZCIsCisJW01BUF9FUlJfQ0hFQ0tFRF0gPSAiZG1hIG1hcCBlcnJvciBjaGVja2VkIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICp0eXBlMm5hbWVbNV0gPSB7ICJzaW5nbGUiLCAicGFnZSIsCisJCQkJICAgICJzY2F0aGVyLWdhdGhlciIsICJjb2hlcmVudCIsCisJCQkJICAgICJyZXNvdXJjZSIgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmRpcjJuYW1lWzRdID0geyAiRE1BX0JJRElSRUNUSU9OQUwiLCAiRE1BX1RPX0RFVklDRSIsCisJCQkJICAgIkRNQV9GUk9NX0RFVklDRSIsICJETUFfTk9ORSIgfTsKKworLyoKKyAqIFRoZSBhY2Nlc3MgdG8gc29tZSB2YXJpYWJsZXMgaW4gdGhpcyBtYWNybyBpcyByYWN5LiBXZSBjYW4ndCB1c2UgYXRvbWljX3QKKyAqIGhlcmUgYmVjYXVzZSBhbGwgdGhlc2UgdmFyaWFibGVzIGFyZSBleHBvcnRlZCB0byBkZWJ1Z2ZzLiBTb21lIG9mIHRoZW0gZXZlbgorICogd3JpdGVhYmxlLiBUaGlzIGlzIGFsc28gdGhlIHJlYXNvbiB3aHkgYSBsb2NrIHdvbid0IGhlbHAgbXVjaC4gQnV0IGFueXdheSwKKyAqIHRoZSByYWNlcyBhcmUgbm8gYmlnIGRlYWwuIEhlcmUgaXMgd2h5OgorICoKKyAqICAgZXJyb3JfY291bnQ6IHRoZSBhZGRpdGlvbiBpcyByYWN5LCBidXQgdGhlIHdvcnN0IHRoaW5nIHRoYXQgY2FuIGhhcHBlbiBpcworICogICAgICAgICAgICAgICAgdGhhdCB3ZSBkb24ndCBjb3VudCBzb21lIGVycm9ycworICogICBzaG93X251bV9lcnJvcnM6IHRoZSBzdWJ0cmFjdGlvbiBpcyByYWN5LiBBbHNvIG5vIGJpZyBkZWFsIGJlY2F1c2UgaW4KKyAqICAgICAgICAgICAgICAgICAgICB3b3JzdCBjYXNlIHRoaXMgd2lsbCByZXN1bHQgaW4gb25lIHdhcm5pbmcgbW9yZSBpbiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gbG9nIHRoYW4gdGhlIHVzZXIgY29uZmlndXJlZC4gVGhpcyB2YXJpYWJsZSBpcworICogICAgICAgICAgICAgICAgICAgIHdyaXRlYWJsZSB2aWEgZGVidWdmcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfZW50cnlfdHJhY2Uoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnkpCit7CisjaWZkZWYgQ09ORklHX1NUQUNLVFJBQ0UKKwlpZiAoZW50cnkpIHsKKwkJcHJfd2FybmluZygiTWFwcGVkIGF0OlxuIik7CisJCXByaW50X3N0YWNrX3RyYWNlKCZlbnRyeS0+c3RhY2t0cmFjZSwgMCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBib29sIGRyaXZlcl9maWx0ZXIoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHJldDsKKworCS8qIGRyaXZlciBmaWx0ZXIgb2ZmICovCisJaWYgKGxpa2VseSghY3VycmVudF9kcml2ZXJfbmFtZVswXSkpCisJCXJldHVybiB0cnVlOworCisJLyogZHJpdmVyIGZpbHRlciBvbiBhbmQgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoY3VycmVudF9kcml2ZXIgJiYgZGV2ICYmIGRldi0+ZHJpdmVyID09IGN1cnJlbnRfZHJpdmVyKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIGRyaXZlciBmaWx0ZXIgb24sIGJ1dCB3ZSBjYW4ndCBmaWx0ZXIgb24gYSBOVUxMIGRldmljZS4uLiAqLworCWlmICghZGV2KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoY3VycmVudF9kcml2ZXIgfHwgIWN1cnJlbnRfZHJpdmVyX25hbWVbMF0pCisJCXJldHVybiBmYWxzZTsKKworCS8qIGRyaXZlciBmaWx0ZXIgb24gYnV0IG5vdCB5ZXQgaW5pdGlhbGl6ZWQgKi8KKwlkcnYgPSBkZXYtPmRyaXZlcjsKKwlpZiAoIWRydikKKwkJcmV0dXJuIGZhbHNlOworCisJLyogbG9jayB0byBwcm90ZWN0IGFnYWluc3QgY2hhbmdlIG9mIGN1cnJlbnRfZHJpdmVyX25hbWUgKi8KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCisJcmV0ID0gZmFsc2U7CisJaWYgKGRydi0+bmFtZSAmJgorCSAgICBzdHJuY21wKGN1cnJlbnRfZHJpdmVyX25hbWUsIGRydi0+bmFtZSwgTkFNRV9NQVhfTEVOIC0gMSkgPT0gMCkgeworCQljdXJyZW50X2RyaXZlciA9IGRydjsKKwkJcmV0ID0gdHJ1ZTsKKwl9CisKKwlyZWFkX3VubG9ja19pcnFyZXN0b3JlKCZkcml2ZXJfbmFtZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIGVycl9wcmludGsoZGV2LCBlbnRyeSwgZm9ybWF0LCBhcmcuLi4pIGRvIHsJCQlcCisJCWVycm9yX2NvdW50ICs9IDE7CQkJCQlcCisJCWlmIChkcml2ZXJfZmlsdGVyKGRldikgJiYJCQkJXAorCQkgICAgKHNob3dfYWxsX2Vycm9ycyB8fCBzaG93X251bV9lcnJvcnMgPiAwKSkgewkJXAorCQkJV0FSTigxLCAiJXMgJXM6ICIgZm9ybWF0LAkJCVwKKwkJCSAgICAgZGV2ID8gZGV2X2RyaXZlcl9zdHJpbmcoZGV2KSA6ICJOVUxMIiwJXAorCQkJICAgICBkZXYgPyBkZXZfbmFtZShkZXYpIDogIk5VTEwiLCAjIyBhcmcpOwlcCisJCQlkdW1wX2VudHJ5X3RyYWNlKGVudHJ5KTsJCQlcCisJCX0JCQkJCQkJXAorCQlpZiAoIXNob3dfYWxsX2Vycm9ycyAmJiBzaG93X251bV9lcnJvcnMgPiAwKQkJXAorCQkJc2hvd19udW1fZXJyb3JzIC09IDE7CQkJCVwKKwl9IHdoaWxlICgwKTsKKworLyoKKyAqIEhhc2ggcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKiBFdmVyeSBETUEtQVBJIHJlcXVlc3QgaXMgc2F2ZWQgaW50byBhIHN0cnVjdCBkbWFfZGVidWdfZW50cnkuIFRvCisgKiBoYXZlIHF1aWNrIGFjY2VzcyB0byB0aGVzZSBzdHJ1Y3RzIHRoZXkgYXJlIHN0b3JlZCBpbnRvIGEgaGFzaC4KKyAqLworc3RhdGljIGludCBoYXNoX2ZuKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQoreworCS8qCisJICogSGFzaCBmdW5jdGlvbiBpcyBiYXNlZCBvbiB0aGUgZG1hIGFkZHJlc3MuCisJICogV2UgdXNlIGJpdHMgMjAtMjcgaGVyZSBhcyB0aGUgaW5kZXggaW50byB0aGUgaGFzaAorCSAqLworCXJldHVybiAoZW50cnktPmRldl9hZGRyID4+IEhBU0hfRk5fU0hJRlQpICYgSEFTSF9GTl9NQVNLOworfQorCisvKgorICogUmVxdWVzdCBleGNsdXNpdmUgYWNjZXNzIHRvIGEgaGFzaCBidWNrZXQgZm9yIGEgZ2l2ZW4gZG1hX2RlYnVnX2VudHJ5LgorICovCitzdGF0aWMgc3RydWN0IGhhc2hfYnVja2V0ICpnZXRfaGFzaF9idWNrZXQoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnksCisJCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorCV9fYWNxdWlyZXMoJmRtYV9lbnRyeV9oYXNoW2lkeF0ubG9jaykKK3sKKwlpbnQgaWR4ID0gaGFzaF9mbihlbnRyeSk7CisJdW5zaWduZWQgbG9uZyBfX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9lbnRyeV9oYXNoW2lkeF0ubG9jaywgX19mbGFncyk7CisJKmZsYWdzID0gX19mbGFnczsKKwlyZXR1cm4gJmRtYV9lbnRyeV9oYXNoW2lkeF07Cit9CisKKy8qCisgKiBHaXZlIHVwIGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGhhc2ggYnVja2V0CisgKi8KK3N0YXRpYyB2b2lkIHB1dF9oYXNoX2J1Y2tldChzdHJ1Y3QgaGFzaF9idWNrZXQgKmJ1Y2tldCwKKwkJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncykKKwlfX3JlbGVhc2VzKCZidWNrZXQtPmxvY2spCit7CisJdW5zaWduZWQgbG9uZyBfX2ZsYWdzID0gKmZsYWdzOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVja2V0LT5sb2NrLCBfX2ZsYWdzKTsKK30KKworc3RhdGljIGJvb2wgZXhhY3RfbWF0Y2goc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqYSwgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqYikKK3sKKwlyZXR1cm4gKChhLT5kZXZfYWRkciA9PSBiLT5kZXZfYWRkcikgJiYKKwkJKGEtPmRldiA9PSBiLT5kZXYpKSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgY29udGFpbmluZ19tYXRjaChzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICphLAorCQkJICAgICBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpiKQoreworCWlmIChhLT5kZXYgIT0gYi0+ZGV2KQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoKGItPmRldl9hZGRyIDw9IGEtPmRldl9hZGRyKSAmJgorCSAgICAoKGItPmRldl9hZGRyICsgYi0+c2l6ZSkgPj0gKGEtPmRldl9hZGRyICsgYS0+c2l6ZSkpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIFNlYXJjaCBhIGdpdmVuIGVudHJ5IGluIHRoZSBoYXNoIGJ1Y2tldCBsaXN0CisgKi8KK3N0YXRpYyBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpfX2hhc2hfYnVja2V0X2ZpbmQoc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQsCisJCQkJCQkgIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKnJlZiwKKwkJCQkJCSAgbWF0Y2hfZm4gbWF0Y2gpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnksICpyZXQgPSBOVUxMOworCWludCBtYXRjaGVzID0gMCwgbWF0Y2hfbHZsLCBsYXN0X2x2bCA9IC0xOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmJ1Y2tldC0+bGlzdCwgbGlzdCkgeworCQlpZiAoIW1hdGNoKHJlZiwgZW50cnkpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogU29tZSBkcml2ZXJzIG1hcCB0aGUgc2FtZSBwaHlzaWNhbCBhZGRyZXNzIG11bHRpcGxlCisJCSAqIHRpbWVzLiBXaXRob3V0IGEgaGFyZHdhcmUgSU9NTVUgdGhpcyByZXN1bHRzIGluIHRoZQorCQkgKiBzYW1lIGRldmljZSBhZGRyZXNzZXMgYmVpbmcgcHV0IGludG8gdGhlIGRtYS1kZWJ1ZworCQkgKiBoYXNoIG11bHRpcGxlIHRpbWVzIHRvby4gVGhpcyBjYW4gcmVzdWx0IGluIGZhbHNlCisJCSAqIHBvc2l0aXZlcyBiZWluZyByZXBvcnRlZC4gVGhlcmVmb3JlIHdlIGltcGxlbWVudCBhCisJCSAqIGJlc3QtZml0IGFsZ29yaXRobSBoZXJlIHdoaWNoIHJldHVybnMgdGhlIGVudHJ5IGZyb20KKwkJICogdGhlIGhhc2ggd2hpY2ggZml0cyBiZXN0IHRvIHRoZSByZWZlcmVuY2UgdmFsdWUKKwkJICogaW5zdGVhZCBvZiB0aGUgZmlyc3QtZml0LgorCQkgKi8KKwkJbWF0Y2hlcyArPSAxOworCQltYXRjaF9sdmwgPSAwOworCQllbnRyeS0+c2l6ZSAgICAgICAgID09IHJlZi0+c2l6ZSAgICAgICAgID8gKyttYXRjaF9sdmwgOiAwOworCQllbnRyeS0+dHlwZSAgICAgICAgID09IHJlZi0+dHlwZSAgICAgICAgID8gKyttYXRjaF9sdmwgOiAwOworCQllbnRyeS0+ZGlyZWN0aW9uICAgID09IHJlZi0+ZGlyZWN0aW9uICAgID8gKyttYXRjaF9sdmwgOiAwOworCQllbnRyeS0+c2dfY2FsbF9lbnRzID09IHJlZi0+c2dfY2FsbF9lbnRzID8gKyttYXRjaF9sdmwgOiAwOworCisJCWlmIChtYXRjaF9sdmwgPT0gNCkgeworCQkJLyogcGVyZmVjdC1maXQgLSByZXR1cm4gdGhlIHJlc3VsdCAqLworCQkJcmV0dXJuIGVudHJ5OworCQl9IGVsc2UgaWYgKG1hdGNoX2x2bCA+IGxhc3RfbHZsKSB7CisJCQkvKgorCQkJICogV2UgZm91bmQgYW4gZW50cnkgdGhhdCBmaXRzIGJldHRlciB0aGVuIHRoZQorCQkJICogcHJldmlvdXMgb25lIG9yIGl0IGlzIHRoZSAxc3QgbWF0Y2guCisJCQkgKi8KKwkJCWxhc3RfbHZsID0gbWF0Y2hfbHZsOworCQkJcmV0ICAgICAgPSBlbnRyeTsKKwkJfQorCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBtdWx0aXBsZSBtYXRjaGVzIGJ1dCBubyBwZXJmZWN0LWZpdCwganVzdCByZXR1cm4KKwkgKiBOVUxMLgorCSAqLworCXJldCA9IChtYXRjaGVzID09IDEpID8gcmV0IDogTlVMTDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpidWNrZXRfZmluZF9leGFjdChzdHJ1Y3QgaGFzaF9idWNrZXQgKmJ1Y2tldCwKKwkJCQkJCSBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYpCit7CisJcmV0dXJuIF9faGFzaF9idWNrZXRfZmluZChidWNrZXQsIHJlZiwgZXhhY3RfbWF0Y2gpOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqYnVja2V0X2ZpbmRfY29udGFpbihzdHJ1Y3QgaGFzaF9idWNrZXQgKipidWNrZXQsCisJCQkJCQkgICBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYsCisJCQkJCQkgICB1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKworCXVuc2lnbmVkIGludCBtYXhfcmFuZ2UgPSBkbWFfZ2V0X21heF9zZWdfc2l6ZShyZWYtPmRldik7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnksIGluZGV4ID0gKnJlZjsKKwl1bnNpZ25lZCBpbnQgcmFuZ2UgPSAwOworCisJd2hpbGUgKHJhbmdlIDw9IG1heF9yYW5nZSkgeworCQllbnRyeSA9IF9faGFzaF9idWNrZXRfZmluZCgqYnVja2V0LCByZWYsIGNvbnRhaW5pbmdfbWF0Y2gpOworCisJCWlmIChlbnRyeSkKKwkJCXJldHVybiBlbnRyeTsKKworCQkvKgorCQkgKiBOb3RoaW5nIGZvdW5kLCBnbyBiYWNrIGEgaGFzaCBidWNrZXQKKwkJICovCisJCXB1dF9oYXNoX2J1Y2tldCgqYnVja2V0LCBmbGFncyk7CisJCXJhbmdlICAgICAgICAgICs9ICgxIDw8IEhBU0hfRk5fU0hJRlQpOworCQlpbmRleC5kZXZfYWRkciAtPSAoMSA8PCBIQVNIX0ZOX1NISUZUKTsKKwkJKmJ1Y2tldCA9IGdldF9oYXNoX2J1Y2tldCgmaW5kZXgsIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIEFkZCBhbiBlbnRyeSB0byBhIGhhc2ggYnVja2V0CisgKi8KK3N0YXRpYyB2b2lkIGhhc2hfYnVja2V0X2FkZChzdHJ1Y3QgaGFzaF9idWNrZXQgKmJ1Y2tldCwKKwkJCSAgICBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeSkKK3sKKwlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJmJ1Y2tldC0+bGlzdCk7Cit9CisKKy8qCisgKiBSZW1vdmUgZW50cnkgZnJvbSBhIGhhc2ggYnVja2V0IGxpc3QKKyAqLworc3RhdGljIHZvaWQgaGFzaF9idWNrZXRfZGVsKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQoreworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgcGh5c19hZGRyKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQoreworCWlmIChlbnRyeS0+dHlwZSA9PSBkbWFfZGVidWdfcmVzb3VyY2UpCisJCXJldHVybiBfX3Bmbl90b19waHlzKGVudHJ5LT5wZm4pICsgZW50cnktPm9mZnNldDsKKworCXJldHVybiBwYWdlX3RvX3BoeXMocGZuX3RvX3BhZ2UoZW50cnktPnBmbikpICsgZW50cnktPm9mZnNldDsKK30KKworLyoKKyAqIER1bXAgbWFwcGluZyBlbnRyaWVzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyAqLwordm9pZCBkZWJ1Z19kbWFfZHVtcF9tYXBwaW5ncyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgSEFTSF9TSVpFOyBpZHgrKykgeworCQlzdHJ1Y3QgaGFzaF9idWNrZXQgKmJ1Y2tldCA9ICZkbWFfZW50cnlfaGFzaFtpZHhdOworCQlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnVja2V0LT5sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmJ1Y2tldC0+bGlzdCwgbGlzdCkgeworCQkJaWYgKCFkZXYgfHwgZGV2ID09IGVudHJ5LT5kZXYpIHsKKwkJCQlkZXZfaW5mbyhlbnRyeS0+ZGV2LAorCQkJCQkgIiVzIGlkeCAlZCBQPSVMeCBOPSVseCBEPSVMeCBMPSVMeCAlcyAlc1xuIiwKKwkJCQkJIHR5cGUybmFtZVtlbnRyeS0+dHlwZV0sIGlkeCwKKwkJCQkJIHBoeXNfYWRkcihlbnRyeSksIGVudHJ5LT5wZm4sCisJCQkJCSBlbnRyeS0+ZGV2X2FkZHIsIGVudHJ5LT5zaXplLAorCQkJCQkgZGlyMm5hbWVbZW50cnktPmRpcmVjdGlvbl0sCisJCQkJCSBtYXBlcnIyc3RyW2VudHJ5LT5tYXBfZXJyX3R5cGVdKTsKKwkJCX0KKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJ1Y2tldC0+bG9jaywgZmxhZ3MpOworCQljb25kX3Jlc2NoZWQoKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9kdW1wX21hcHBpbmdzKTsKKworLyoKKyAqIEZvciBlYWNoIG1hcHBpbmcgKGluaXRpYWwgY2FjaGVsaW5lIGluIHRoZSBjYXNlIG9mCisgKiBkbWFfYWxsb2NfY29oZXJlbnQvZG1hX21hcF9wYWdlLCBpbml0aWFsIGNhY2hlbGluZSBpbiBlYWNoIHBhZ2Ugb2YgYQorICogc2NhdHRlcmxpc3QsIG9yIHRoZSBjYWNoZWxpbmUgc3BlY2lmaWVkIGluIGRtYV9tYXBfc2luZ2xlKSBpbnNlcnQKKyAqIGludG8gdGhpcyB0cmVlIHVzaW5nIHRoZSBjYWNoZWxpbmUgYXMgdGhlIGtleS4gQXQKKyAqIGRtYV91bm1hcF97c2luZ2xlfHNnfHBhZ2V9IG9yIGRtYV9mcmVlX2NvaGVyZW50IGRlbGV0ZSB0aGUgZW50cnkuICBJZgorICogdGhlIGVudHJ5IGFscmVhZHkgZXhpc3RzIGF0IGluc2VydGlvbiB0aW1lIGFkZCBhIHRhZyBhcyBhIHJlZmVyZW5jZQorICogY291bnQgZm9yIHRoZSBvdmVybGFwcGluZyBtYXBwaW5ncy4gIEZvciBub3csIHRoZSBvdmVybGFwIHRyYWNraW5nCisgKiBqdXN0IGVuc3VyZXMgdGhhdCAndW5tYXBzJyBiYWxhbmNlICdtYXBzJyBiZWZvcmUgbWFya2luZyB0aGUKKyAqIGNhY2hlbGluZSBpZGxlLCBidXQgd2Ugc2hvdWxkIGFsc28gYmUgZmxhZ2dpbmcgb3ZlcmxhcHMgYXMgYW4gQVBJCisgKiB2aW9sYXRpb24uCisgKgorICogTWVtb3J5IHVzYWdlIGlzIG1vc3RseSBjb25zdHJhaW5lZCBieSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYXZhaWxhYmxlCisgKiBkbWEtZGVidWcgZW50cmllcyBpbiB0aGF0IHdlIG5lZWQgYSBmcmVlIGRtYV9kZWJ1Z19lbnRyeSBiZWZvcmUKKyAqIGluc2VydGluZyBpbnRvIHRoZSB0cmVlLiAgSW4gdGhlIGNhc2Ugb2YgZG1hX21hcF9wYWdlIGFuZAorICogZG1hX2FsbG9jX2NvaGVyZW50IHRoZXJlIGlzIG9ubHkgb25lIGRtYV9kZWJ1Z19lbnRyeSBhbmQgb25lCisgKiBkbWFfYWN0aXZlX2NhY2hlbGluZSBlbnRyeSB0byB0cmFjayBwZXIgZXZlbnQuICBkbWFfbWFwX3NnKCksIG9uIHRoZQorICogb3RoZXIgaGFuZCwgY29uc3VtZXMgYSBzaW5nbGUgZG1hX2RlYnVnX2VudHJ5LCBidXQgaW5zZXJ0cyAnbmVudHMnCisgKiBlbnRyaWVzIGludG8gdGhlIHRyZWUuCisgKgorICogQXQgYW55IHRpbWUgZGVidWdfZG1hX2Fzc2VydF9pZGxlKCkgY2FuIGJlIGNhbGxlZCB0byB0cmlnZ2VyIGEKKyAqIHdhcm5pbmcgaWYgYW55IGNhY2hlbGluZXMgaW4gdGhlIGdpdmVuIHBhZ2UgYXJlIGluIHRoZSBhY3RpdmUgc2V0LgorICovCitzdGF0aWMgUkFESVhfVFJFRShkbWFfYWN0aXZlX2NhY2hlbGluZSwgR0ZQX05PV0FJVCk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJhZGl4X2xvY2spOworI2RlZmluZSBBQ1RJVkVfQ0FDSEVMSU5FX01BWF9PVkVSTEFQICgoMSA8PCBSQURJWF9UUkVFX01BWF9UQUdTKSAtIDEpCisjZGVmaW5lIENBQ0hFTElORV9QRVJfUEFHRV9TSElGVCAoUEFHRV9TSElGVCAtIEwxX0NBQ0hFX1NISUZUKQorI2RlZmluZSBDQUNIRUxJTkVTX1BFUl9QQUdFICgxIDw8IENBQ0hFTElORV9QRVJfUEFHRV9TSElGVCkKKworc3RhdGljIHBoeXNfYWRkcl90IHRvX2NhY2hlbGluZV9udW1iZXIoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnkpCit7CisJcmV0dXJuIChlbnRyeS0+cGZuIDw8IENBQ0hFTElORV9QRVJfUEFHRV9TSElGVCkgKworCQkoZW50cnktPm9mZnNldCA+PiBMMV9DQUNIRV9TSElGVCk7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZlX2NhY2hlbGluZV9yZWFkX292ZXJsYXAocGh5c19hZGRyX3QgY2xuKQoreworCWludCBvdmVybGFwID0gMCwgaTsKKworCWZvciAoaSA9IFJBRElYX1RSRUVfTUFYX1RBR1MgLSAxOyBpID49IDA7IGktLSkKKwkJaWYgKHJhZGl4X3RyZWVfdGFnX2dldCgmZG1hX2FjdGl2ZV9jYWNoZWxpbmUsIGNsbiwgaSkpCisJCQlvdmVybGFwIHw9IDEgPDwgaTsKKwlyZXR1cm4gb3ZlcmxhcDsKK30KKworc3RhdGljIGludCBhY3RpdmVfY2FjaGVsaW5lX3NldF9vdmVybGFwKHBoeXNfYWRkcl90IGNsbiwgaW50IG92ZXJsYXApCit7CisJaW50IGk7CisKKwlpZiAob3ZlcmxhcCA+IEFDVElWRV9DQUNIRUxJTkVfTUFYX09WRVJMQVAgfHwgb3ZlcmxhcCA8IDApCisJCXJldHVybiBvdmVybGFwOworCisJZm9yIChpID0gUkFESVhfVFJFRV9NQVhfVEFHUyAtIDE7IGkgPj0gMDsgaS0tKQorCQlpZiAob3ZlcmxhcCAmIDEgPDwgaSkKKwkJCXJhZGl4X3RyZWVfdGFnX3NldCgmZG1hX2FjdGl2ZV9jYWNoZWxpbmUsIGNsbiwgaSk7CisJCWVsc2UKKwkJCXJhZGl4X3RyZWVfdGFnX2NsZWFyKCZkbWFfYWN0aXZlX2NhY2hlbGluZSwgY2xuLCBpKTsKKworCXJldHVybiBvdmVybGFwOworfQorCitzdGF0aWMgdm9pZCBhY3RpdmVfY2FjaGVsaW5lX2luY19vdmVybGFwKHBoeXNfYWRkcl90IGNsbikKK3sKKwlpbnQgb3ZlcmxhcCA9IGFjdGl2ZV9jYWNoZWxpbmVfcmVhZF9vdmVybGFwKGNsbik7CisKKwlvdmVybGFwID0gYWN0aXZlX2NhY2hlbGluZV9zZXRfb3ZlcmxhcChjbG4sICsrb3ZlcmxhcCk7CisKKwkvKiBJZiB3ZSBvdmVyZmxvd2VkIHRoZSBvdmVybGFwIGNvdW50ZXIgdGhlbiB3ZSdyZSBwb3RlbnRpYWxseQorCSAqIGxlYWtpbmcgZG1hLW1hcHBpbmdzLiAgT3RoZXJ3aXNlLCBpZiBtYXBzIGFuZCB1bm1hcHMgYXJlCisJICogYmFsYW5jZWQgdGhlbiB0aGlzIG92ZXJmbG93IG1heSBjYXVzZSBmYWxzZSBuZWdhdGl2ZXMgaW4KKwkgKiBkZWJ1Z19kbWFfYXNzZXJ0X2lkbGUoKSBhcyB0aGUgY2FjaGVsaW5lIG1heSBiZSBtYXJrZWQgaWRsZQorCSAqIHByZW1hdHVyZWx5LgorCSAqLworCVdBUk5fT05DRShvdmVybGFwID4gQUNUSVZFX0NBQ0hFTElORV9NQVhfT1ZFUkxBUCwKKwkJICAiRE1BLUFQSTogZXhjZWVkZWQgJWQgb3ZlcmxhcHBpbmcgbWFwcGluZ3Mgb2YgY2FjaGVsaW5lICVwYVxuIiwKKwkJICBBQ1RJVkVfQ0FDSEVMSU5FX01BWF9PVkVSTEFQLCAmY2xuKTsKK30KKworc3RhdGljIGludCBhY3RpdmVfY2FjaGVsaW5lX2RlY19vdmVybGFwKHBoeXNfYWRkcl90IGNsbikKK3sKKwlpbnQgb3ZlcmxhcCA9IGFjdGl2ZV9jYWNoZWxpbmVfcmVhZF9vdmVybGFwKGNsbik7CisKKwlyZXR1cm4gYWN0aXZlX2NhY2hlbGluZV9zZXRfb3ZlcmxhcChjbG4sIC0tb3ZlcmxhcCk7Cit9CisKK3N0YXRpYyBpbnQgYWN0aXZlX2NhY2hlbGluZV9pbnNlcnQoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnkpCit7CisJcGh5c19hZGRyX3QgY2xuID0gdG9fY2FjaGVsaW5lX251bWJlcihlbnRyeSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwkvKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCB3cml0aW5nIG1lbW9yeSB0aGVuIHdlIGRvbid0IGhhdmUgYW55CisJICogY29uY2VybnMgYWJvdXQgdGhlIGNwdSBjb25zdW1pbmcgc3RhbGUgZGF0YS4gIFRoaXMgbWl0aWdhdGVzCisJICogbGVnaXRpbWF0ZSB1c2FnZXMgb2Ygb3ZlcmxhcHBpbmcgbWFwcGluZ3MuCisJICovCisJaWYgKGVudHJ5LT5kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmFkaXhfbG9jaywgZmxhZ3MpOworCXJjID0gcmFkaXhfdHJlZV9pbnNlcnQoJmRtYV9hY3RpdmVfY2FjaGVsaW5lLCBjbG4sIGVudHJ5KTsKKwlpZiAocmMgPT0gLUVFWElTVCkKKwkJYWN0aXZlX2NhY2hlbGluZV9pbmNfb3ZlcmxhcChjbG4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJhZGl4X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQgYWN0aXZlX2NhY2hlbGluZV9yZW1vdmUoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnkpCit7CisJcGh5c19hZGRyX3QgY2xuID0gdG9fY2FjaGVsaW5lX251bWJlcihlbnRyeSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIC4uLm1pcnJvciB0aGUgaW5zZXJ0IGNhc2UgKi8KKwlpZiAoZW50cnktPmRpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmFkaXhfbG9jaywgZmxhZ3MpOworCS8qIHNpbmNlIHdlIGFyZSBjb3VudGluZyBvdmVybGFwcyB0aGUgZmluYWwgcHV0IG9mIHRoZQorCSAqIGNhY2hlbGluZSB3aWxsIG9jY3VyIHdoZW4gdGhlIG92ZXJsYXAgY291bnQgaXMgMC4KKwkgKiBhY3RpdmVfY2FjaGVsaW5lX2RlY19vdmVybGFwKCkgcmV0dXJucyAtMSBpbiB0aGF0IGNhc2UKKwkgKi8KKwlpZiAoYWN0aXZlX2NhY2hlbGluZV9kZWNfb3ZlcmxhcChjbG4pIDwgMCkKKwkJcmFkaXhfdHJlZV9kZWxldGUoJmRtYV9hY3RpdmVfY2FjaGVsaW5lLCBjbG4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJhZGl4X2xvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiBkZWJ1Z19kbWFfYXNzZXJ0X2lkbGUoKSAtIGFzc2VydCB0aGF0IGEgcGFnZSBpcyBub3QgdW5kZXJnb2luZyBkbWEKKyAqIEBwYWdlOiBwYWdlIHRvIGxvb2t1cCBpbiB0aGUgZG1hX2FjdGl2ZV9jYWNoZWxpbmUgdHJlZQorICoKKyAqIFBsYWNlIGEgY2FsbCB0byB0aGlzIHJvdXRpbmUgaW4gY2FzZXMgd2hlcmUgdGhlIGNwdSB0b3VjaGluZyB0aGUgcGFnZQorICogYmVmb3JlIHRoZSBkbWEgY29tcGxldGVzIChwYWdlIGlzIGRtYV91bm1hcHBlZCkgd2lsbCBsZWFkIHRvIGRhdGEKKyAqIGNvcnJ1cHRpb24uCisgKi8KK3ZvaWQgZGVidWdfZG1hX2Fzc2VydF9pZGxlKHN0cnVjdCBwYWdlICpwYWdlKQoreworCXN0YXRpYyBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRzW0NBQ0hFTElORVNfUEVSX1BBR0VdOworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwl2b2lkICoqcmVzdWx0cyA9ICh2b2lkICoqKSAmZW50czsKKwl1bnNpZ25lZCBpbnQgbmVudHMsIGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwaHlzX2FkZHJfdCBjbG47CisKKwlpZiAoZG1hX2RlYnVnX2Rpc2FibGVkKCkpCisJCXJldHVybjsKKworCWlmICghcGFnZSkKKwkJcmV0dXJuOworCisJY2xuID0gKHBoeXNfYWRkcl90KSBwYWdlX3RvX3BmbihwYWdlKSA8PCBDQUNIRUxJTkVfUEVSX1BBR0VfU0hJRlQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJhZGl4X2xvY2ssIGZsYWdzKTsKKwluZW50cyA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoJmRtYV9hY3RpdmVfY2FjaGVsaW5lLCByZXN1bHRzLCBjbG4sCisJCQkJICAgICAgIENBQ0hFTElORVNfUEVSX1BBR0UpOworCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrKSB7CisJCXBoeXNfYWRkcl90IGVudF9jbG4gPSB0b19jYWNoZWxpbmVfbnVtYmVyKGVudHNbaV0pOworCisJCWlmIChlbnRfY2xuID09IGNsbikgeworCQkJZW50cnkgPSBlbnRzW2ldOworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAoZW50X2NsbiA+PSBjbG4gKyBDQUNIRUxJTkVTX1BFUl9QQUdFKQorCQkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJhZGl4X2xvY2ssIGZsYWdzKTsKKworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWNsbiA9IHRvX2NhY2hlbGluZV9udW1iZXIoZW50cnkpOworCWVycl9wcmludGsoZW50cnktPmRldiwgZW50cnksCisJCSAgICJETUEtQVBJOiBjcHUgdG91Y2hpbmcgYW4gYWN0aXZlIGRtYSBtYXBwZWQgY2FjaGVsaW5lIFtjbG49JXBhXVxuIiwKKwkJICAgJmNsbik7Cit9CisKKy8qCisgKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBhZGRpbmcgYW4gZW50cnkgdG8gdGhlIGhhc2guCisgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgbG9ja2luZyBpdHNlbGYuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9kbWFfZW50cnkoc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnkpCit7CisJc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlidWNrZXQgPSBnZXRfaGFzaF9idWNrZXQoZW50cnksICZmbGFncyk7CisJaGFzaF9idWNrZXRfYWRkKGJ1Y2tldCwgZW50cnkpOworCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7CisKKwlyYyA9IGFjdGl2ZV9jYWNoZWxpbmVfaW5zZXJ0KGVudHJ5KTsKKwlpZiAocmMgPT0gLUVOT01FTSkgeworCQlwcl9lcnIoIkRNQS1BUEk6IGNhY2hlbGluZSB0cmFja2luZyBFTk9NRU0sIGRtYS1kZWJ1ZyBkaXNhYmxlZFxuIik7CisJCWdsb2JhbF9kaXNhYmxlID0gdHJ1ZTsKKwl9CisKKwkvKiBUT0RPOiByZXBvcnQgLUVFWElTVCBlcnJvcnMgaGVyZSBhcyBvdmVybGFwcGluZyBtYXBwaW5ncyBhcmUKKwkgKiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBETUEgQVBJCisJICovCit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpfX2RtYV9lbnRyeV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCisJZW50cnkgPSBsaXN0X2VudHJ5KGZyZWVfZW50cmllcy5uZXh0LCBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5LCBsaXN0KTsKKwlsaXN0X2RlbCgmZW50cnktPmxpc3QpOworCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCisJbnVtX2ZyZWVfZW50cmllcyAtPSAxOworCWlmIChudW1fZnJlZV9lbnRyaWVzIDwgbWluX2ZyZWVfZW50cmllcykKKwkJbWluX2ZyZWVfZW50cmllcyA9IG51bV9mcmVlX2VudHJpZXM7CisKKwlyZXR1cm4gZW50cnk7Cit9CisKKy8qIHN0cnVjdCBkbWFfZW50cnkgYWxsb2NhdG9yCisgKgorICogVGhlIG5leHQgdHdvIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGFsbG9jYXRvciBmb3IKKyAqIHN0cnVjdCBkbWFfZGVidWdfZW50cmllcy4KKyAqLworc3RhdGljIHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmRtYV9lbnRyeV9hbGxvYyh2b2lkKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZV9lbnRyaWVzX2xvY2ssIGZsYWdzKTsKKworCWlmIChsaXN0X2VtcHR5KCZmcmVlX2VudHJpZXMpKSB7CisJCWdsb2JhbF9kaXNhYmxlID0gdHJ1ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnJlZV9lbnRyaWVzX2xvY2ssIGZsYWdzKTsKKwkJcHJfZXJyKCJETUEtQVBJOiBkZWJ1Z2dpbmcgb3V0IG9mIG1lbW9yeSAtIGRpc2FibGluZ1xuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWVudHJ5ID0gX19kbWFfZW50cnlfYWxsb2MoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfU1RBQ0tUUkFDRQorCWVudHJ5LT5zdGFja3RyYWNlLm1heF9lbnRyaWVzID0gRE1BX0RFQlVHX1NUQUNLVFJBQ0VfRU5UUklFUzsKKwllbnRyeS0+c3RhY2t0cmFjZS5lbnRyaWVzID0gZW50cnktPnN0X2VudHJpZXM7CisJZW50cnktPnN0YWNrdHJhY2Uuc2tpcCA9IDI7CisJc2F2ZV9zdGFja190cmFjZSgmZW50cnktPnN0YWNrdHJhY2UpOworI2VuZGlmCisKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkIGRtYV9lbnRyeV9mcmVlKHN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhY3RpdmVfY2FjaGVsaW5lX3JlbW92ZShlbnRyeSk7CisKKwkvKgorCSAqIGFkZCB0byBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgLSB0aGlzIHdheSB0aGUgZW50cmllcyBhcmUKKwkgKiBtb3JlIGxpa2VseSBjYWNoZSBob3Qgd2hlbiB0aGV5IGFyZSByZWFsbG9jYXRlZC4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZV9lbnRyaWVzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZmcmVlX2VudHJpZXMpOworCW51bV9mcmVlX2VudHJpZXMgKz0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworfQorCitpbnQgZG1hX2RlYnVnX3Jlc2l6ZV9lbnRyaWVzKHUzMiBudW1fZW50cmllcykKK3sKKwlpbnQgaSwgZGVsdGEsIHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKwlMSVNUX0hFQUQodG1wKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworCisJaWYgKG5yX3RvdGFsX2VudHJpZXMgPCBudW1fZW50cmllcykgeworCQlkZWx0YSA9IG51bV9lbnRyaWVzIC0gbnJfdG90YWxfZW50cmllczsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworCisJCWZvciAoaSA9IDA7IGkgPCBkZWx0YTsgaSsrKSB7CisJCQllbnRyeSA9IGt6YWxsb2Moc2l6ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOworCQkJaWYgKCFlbnRyeSkKKwkJCQlicmVhazsKKworCQkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZ0bXApOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CisKKwkJbGlzdF9zcGxpY2UoJnRtcCwgJmZyZWVfZW50cmllcyk7CisJCW5yX3RvdGFsX2VudHJpZXMgKz0gaTsKKwkJbnVtX2ZyZWVfZW50cmllcyArPSBpOworCX0gZWxzZSB7CisJCWRlbHRhID0gbnJfdG90YWxfZW50cmllcyAtIG51bV9lbnRyaWVzOworCisJCWZvciAoaSA9IDA7IGkgPCBkZWx0YSAmJiAhbGlzdF9lbXB0eSgmZnJlZV9lbnRyaWVzKTsgaSsrKSB7CisJCQllbnRyeSA9IF9fZG1hX2VudHJ5X2FsbG9jKCk7CisJCQlrZnJlZShlbnRyeSk7CisJCX0KKworCQlucl90b3RhbF9lbnRyaWVzIC09IGk7CisJfQorCisJaWYgKG5yX3RvdGFsX2VudHJpZXMgIT0gbnVtX2VudHJpZXMpCisJCXJldCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZG1hX2RlYnVnX3Jlc2l6ZV9lbnRyaWVzKTsKKworLyoKKyAqIERNQS1BUEkgZGVidWdnaW5nIGluaXQgY29kZQorICoKKyAqIFRoZSBpbml0IGNvZGUgZG9lcyB0d28gdGhpbmdzOgorICogICAxLiBJbml0aWFsaXplIGNvcmUgZGF0YSBzdHJ1Y3R1cmVzCisgKiAgIDIuIFByZWFsbG9jYXRlIGEgZ2l2ZW4gbnVtYmVyIG9mIGRtYV9kZWJ1Z19lbnRyeSBzdHJ1Y3RzCisgKi8KKworc3RhdGljIGludCBwcmVhbGxvY19tZW1vcnkodTMyIG51bV9lbnRyaWVzKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCAqbmV4dF9lbnRyeTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fZW50cmllczsgKytpKSB7CisJCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZW50cnkpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJbGlzdF9hZGRfdGFpbCgmZW50cnktPmxpc3QsICZmcmVlX2VudHJpZXMpOworCX0KKworCW51bV9mcmVlX2VudHJpZXMgPSBudW1fZW50cmllczsKKwltaW5fZnJlZV9lbnRyaWVzID0gbnVtX2VudHJpZXM7CisKKwlwcl9pbmZvKCJETUEtQVBJOiBwcmVhbGxvY2F0ZWQgJWQgZGVidWcgZW50cmllc1xuIiwgbnVtX2VudHJpZXMpOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZW50cnksIG5leHRfZW50cnksICZmcmVlX2VudHJpZXMsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwkJa2ZyZWUoZW50cnkpOworCX0KKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgc3NpemVfdCBmaWx0ZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZbTkFNRV9NQVhfTEVOICsgMV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbGVuOworCisJaWYgKCFjdXJyZW50X2RyaXZlcl9uYW1lWzBdKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogV2UgY2FuJ3QgY29weSB0byB1c2Vyc3BhY2UgZGlyZWN0bHkgYmVjYXVzZSBjdXJyZW50X2RyaXZlcl9uYW1lIGNhbgorCSAqIG9ubHkgYmUgcmVhZCB1bmRlciB0aGUgZHJpdmVyX25hbWVfbG9jayB3aXRoIGlycXMgZGlzYWJsZWQuIFNvCisJICogY3JlYXRlIGEgdGVtcG9yYXJ5IGNvcHkgZmlyc3QuCisJICovCisJcmVhZF9sb2NrX2lycXNhdmUoJmRyaXZlcl9uYW1lX2xvY2ssIGZsYWdzKTsKKwlsZW4gPSBzY25wcmludGYoYnVmLCBOQU1FX01BWF9MRU4gKyAxLCAiJXNcbiIsIGN1cnJlbnRfZHJpdmVyX25hbWUpOworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmRyaXZlcl9uYW1lX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgZmlsdGVyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZltOQU1FX01BWF9MRU5dOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2l6ZV90IGxlbjsKKwlpbnQgaTsKKworCS8qCisJICogV2UgY2FuJ3QgY29weSBmcm9tIHVzZXJzcGFjZSBkaXJlY3RseS4gQWNjZXNzIHRvCisJICogY3VycmVudF9kcml2ZXJfbmFtZSBpcyBwcm90ZWN0ZWQgd2l0aCBhIHdyaXRlX2xvY2sgd2l0aCBpcnFzCisJICogZGlzYWJsZWQuIFNpbmNlIGNvcHlfZnJvbV91c2VyIGNhbiBmYXVsdCBhbmQgbWF5IHNsZWVwIHdlCisJICogbmVlZCB0byBjb3B5IHRvIHRlbXBvcmFyeSBidWZmZXIgZmlyc3QKKwkgKi8KKwlsZW4gPSBtaW4oY291bnQsIChzaXplX3QpKE5BTUVfTUFYX0xFTiAtIDEpKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gMDsKKworCXdyaXRlX2xvY2tfaXJxc2F2ZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBOb3cgaGFuZGxlIHRoZSBzdHJpbmcgd2UgZ290IGZyb20gdXNlcnNwYWNlIHZlcnkgY2FyZWZ1bGx5LgorCSAqIFRoZSBydWxlcyBhcmU6CisJICogICAgICAgICAtIG9ubHkgdXNlIHRoZSBmaXJzdCB0b2tlbiB3ZSBnb3QKKwkgKiAgICAgICAgIC0gdG9rZW4gZGVsaW1pdGVyIGlzIGV2ZXJ5dGhpbmcgbG9va2luZyBsaWtlIGEgc3BhY2UKKwkgKiAgICAgICAgICAgY2hhcmFjdGVyICgnICcsICdcbicsICdcdCcgLi4uKQorCSAqCisJICovCisJaWYgKCFpc2FsbnVtKGJ1ZlswXSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIGZpcnN0IGNoYXJhY3RlciB1c2Vyc3BhY2UgZ2F2ZSB1cyBpcyBub3QKKwkJICogYWxwaGFudW1lcmljYWwgdGhlbiBhc3N1bWUgdGhlIGZpbHRlciBzaG91bGQgYmUKKwkJICogc3dpdGNoZWQgb2ZmLgorCQkgKi8KKwkJaWYgKGN1cnJlbnRfZHJpdmVyX25hbWVbMF0pCisJCQlwcl9pbmZvKCJETUEtQVBJOiBzd2l0Y2hpbmcgb2ZmIGRtYS1kZWJ1ZyBkcml2ZXIgZmlsdGVyXG4iKTsKKwkJY3VycmVudF9kcml2ZXJfbmFtZVswXSA9IDA7CisJCWN1cnJlbnRfZHJpdmVyID0gTlVMTDsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCS8qCisJICogTm93IHBhcnNlIG91dCB0aGUgZmlyc3QgdG9rZW4gYW5kIHVzZSBpdCBhcyB0aGUgbmFtZSBmb3IgdGhlCisJICogZHJpdmVyIHRvIGZpbHRlciBmb3IuCisJICovCisJZm9yIChpID0gMDsgaSA8IE5BTUVfTUFYX0xFTiAtIDE7ICsraSkgeworCQljdXJyZW50X2RyaXZlcl9uYW1lW2ldID0gYnVmW2ldOworCQlpZiAoaXNzcGFjZShidWZbaV0pIHx8IGJ1ZltpXSA9PSAnICcgfHwgYnVmW2ldID09IDApCisJCQlicmVhazsKKwl9CisJY3VycmVudF9kcml2ZXJfbmFtZVtpXSA9IDA7CisJY3VycmVudF9kcml2ZXIgPSBOVUxMOworCisJcHJfaW5mbygiRE1BLUFQSTogZW5hYmxlIGRyaXZlciBmaWx0ZXIgZm9yIGRyaXZlciBbJXNdXG4iLAorCQljdXJyZW50X2RyaXZlcl9uYW1lKTsKKworb3V0X3VubG9jazoKKwl3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWx0ZXJfZm9wcyA9IHsKKwkucmVhZCAgPSBmaWx0ZXJfcmVhZCwKKwkud3JpdGUgPSBmaWx0ZXJfd3JpdGUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIGludCBkbWFfZGVidWdfZnNfaW5pdCh2b2lkKQoreworCWRtYV9kZWJ1Z19kZW50ID0gZGVidWdmc19jcmVhdGVfZGlyKCJkbWEtYXBpIiwgTlVMTCk7CisJaWYgKCFkbWFfZGVidWdfZGVudCkgeworCQlwcl9lcnIoIkRNQS1BUEk6IGNhbiBub3QgY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2xvYmFsX2Rpc2FibGVfZGVudCA9IGRlYnVnZnNfY3JlYXRlX2Jvb2woImRpc2FibGVkIiwgMDQ0NCwKKwkJCWRtYV9kZWJ1Z19kZW50LAorCQkJJmdsb2JhbF9kaXNhYmxlKTsKKwlpZiAoIWdsb2JhbF9kaXNhYmxlX2RlbnQpCisJCWdvdG8gb3V0X2VycjsKKworCWVycm9yX2NvdW50X2RlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoImVycm9yX2NvdW50IiwgMDQ0NCwKKwkJCWRtYV9kZWJ1Z19kZW50LCAmZXJyb3JfY291bnQpOworCWlmICghZXJyb3JfY291bnRfZGVudCkKKwkJZ290byBvdXRfZXJyOworCisJc2hvd19hbGxfZXJyb3JzX2RlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV91MzIoImFsbF9lcnJvcnMiLCAwNjQ0LAorCQkJZG1hX2RlYnVnX2RlbnQsCisJCQkmc2hvd19hbGxfZXJyb3JzKTsKKwlpZiAoIXNob3dfYWxsX2Vycm9yc19kZW50KQorCQlnb3RvIG91dF9lcnI7CisKKwlzaG93X251bV9lcnJvcnNfZGVudCA9IGRlYnVnZnNfY3JlYXRlX3UzMigibnVtX2Vycm9ycyIsIDA2NDQsCisJCQlkbWFfZGVidWdfZGVudCwKKwkJCSZzaG93X251bV9lcnJvcnMpOworCWlmICghc2hvd19udW1fZXJyb3JzX2RlbnQpCisJCWdvdG8gb3V0X2VycjsKKworCW51bV9mcmVlX2VudHJpZXNfZGVudCA9IGRlYnVnZnNfY3JlYXRlX3UzMigibnVtX2ZyZWVfZW50cmllcyIsIDA0NDQsCisJCQlkbWFfZGVidWdfZGVudCwKKwkJCSZudW1fZnJlZV9lbnRyaWVzKTsKKwlpZiAoIW51bV9mcmVlX2VudHJpZXNfZGVudCkKKwkJZ290byBvdXRfZXJyOworCisJbWluX2ZyZWVfZW50cmllc19kZW50ID0gZGVidWdmc19jcmVhdGVfdTMyKCJtaW5fZnJlZV9lbnRyaWVzIiwgMDQ0NCwKKwkJCWRtYV9kZWJ1Z19kZW50LAorCQkJJm1pbl9mcmVlX2VudHJpZXMpOworCWlmICghbWluX2ZyZWVfZW50cmllc19kZW50KQorCQlnb3RvIG91dF9lcnI7CisKKwlmaWx0ZXJfZGVudCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImRyaXZlcl9maWx0ZXIiLCAwNjQ0LAorCQkJCQkgIGRtYV9kZWJ1Z19kZW50LCBOVUxMLCAmZmlsdGVyX2ZvcHMpOworCWlmICghZmlsdGVyX2RlbnQpCisJCWdvdG8gb3V0X2VycjsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkbWFfZGVidWdfZGVudCk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBkZXZpY2VfZG1hX2FsbG9jYXRpb25zKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqKm91dF9lbnRyeSkKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IDAsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYV9lbnRyeV9oYXNoW2ldLmxvY2ssIGZsYWdzKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmRtYV9lbnRyeV9oYXNoW2ldLmxpc3QsIGxpc3QpIHsKKwkJCWlmIChlbnRyeS0+ZGV2ID09IGRldikgeworCQkJCWNvdW50ICs9IDE7CisJCQkJKm91dF9lbnRyeSA9IGVudHJ5OworCQkJfQorCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYV9lbnRyeV9oYXNoW2ldLmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2RlYnVnX2RldmljZV9jaGFuZ2Uoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICp1bmluaXRpYWxpemVkX3ZhcihlbnRyeSk7CisJaW50IGNvdW50OworCisJaWYgKGRtYV9kZWJ1Z19kaXNhYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSOgorCQljb3VudCA9IGRldmljZV9kbWFfYWxsb2NhdGlvbnMoZGV2LCAmZW50cnkpOworCQlpZiAoY291bnQgPT0gMCkKKwkJCWJyZWFrOworCQllcnJfcHJpbnRrKGRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIGhhcyBwZW5kaW5nICIKKwkJCQkiRE1BIGFsbG9jYXRpb25zIHdoaWxlIHJlbGVhc2VkIGZyb20gZGV2aWNlICIKKwkJCQkiW2NvdW50PSVkXVxuIgorCQkJCSJPbmUgb2YgbGVha2VkIGVudHJpZXMgZGV0YWlsczogIgorCQkJCSJbZGV2aWNlIGFkZHJlc3M9MHglMDE2bGx4XSBbc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkJIlttYXBwZWQgd2l0aCAlc10gW21hcHBlZCBhcyAlc11cbiIsCisJCQljb3VudCwgZW50cnktPmRldl9hZGRyLCBlbnRyeS0+c2l6ZSwKKwkJCWRpcjJuYW1lW2VudHJ5LT5kaXJlY3Rpb25dLCB0eXBlMm5hbWVbZW50cnktPnR5cGVdKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZG1hX2RlYnVnX2FkZF9idXMoc3RydWN0IGJ1c190eXBlICpidXMpCit7CisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYjsKKworCWlmIChkbWFfZGVidWdfZGlzYWJsZWQoKSkKKwkJcmV0dXJuOworCisJbmIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2spLCBHRlBfS0VSTkVMKTsKKwlpZiAobmIgPT0gTlVMTCkgeworCQlwcl9lcnIoImRtYV9kZWJ1Z19hZGRfYnVzOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCW5iLT5ub3RpZmllcl9jYWxsID0gZG1hX2RlYnVnX2RldmljZV9jaGFuZ2U7CisKKwlidXNfcmVnaXN0ZXJfbm90aWZpZXIoYnVzLCBuYik7Cit9CisKKy8qCisgKiBMZXQgdGhlIGFyY2hpdGVjdHVyZXMgZGVjaWRlIGhvdyBtYW55IGVudHJpZXMgc2hvdWxkIGJlIHByZWFsbG9jYXRlZC4KKyAqLwordm9pZCBkbWFfZGVidWdfaW5pdCh1MzIgbnVtX2VudHJpZXMpCit7CisJaW50IGk7CisKKwkvKiBEbyBub3QgdXNlIGRtYV9kZWJ1Z19pbml0aWFsaXplZCBoZXJlLCBzaW5jZSB3ZSByZWFsbHkgd2FudCB0byBiZQorCSAqIGNhbGxlZCB0byBzZXQgZG1hX2RlYnVnX2luaXRpYWxpemVkCisJICovCisJaWYgKGdsb2JhbF9kaXNhYmxlKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgSEFTSF9TSVpFOyArK2kpIHsKKwkJSU5JVF9MSVNUX0hFQUQoJmRtYV9lbnRyeV9oYXNoW2ldLmxpc3QpOworCQlzcGluX2xvY2tfaW5pdCgmZG1hX2VudHJ5X2hhc2hbaV0ubG9jayk7CisJfQorCisJaWYgKGRtYV9kZWJ1Z19mc19pbml0KCkgIT0gMCkgeworCQlwcl9lcnIoIkRNQS1BUEk6IGVycm9yIGNyZWF0aW5nIGRlYnVnZnMgZW50cmllcyAtIGRpc2FibGluZ1xuIik7CisJCWdsb2JhbF9kaXNhYmxlID0gdHJ1ZTsKKworCQlyZXR1cm47CisJfQorCisJaWYgKHJlcV9lbnRyaWVzKQorCQludW1fZW50cmllcyA9IHJlcV9lbnRyaWVzOworCisJaWYgKHByZWFsbG9jX21lbW9yeShudW1fZW50cmllcykgIT0gMCkgeworCQlwcl9lcnIoIkRNQS1BUEk6IGRlYnVnZ2luZyBvdXQgb2YgbWVtb3J5IGVycm9yIC0gZGlzYWJsZWRcbiIpOworCQlnbG9iYWxfZGlzYWJsZSA9IHRydWU7CisKKwkJcmV0dXJuOworCX0KKworCW5yX3RvdGFsX2VudHJpZXMgPSBudW1fZnJlZV9lbnRyaWVzOworCisJZG1hX2RlYnVnX2luaXRpYWxpemVkID0gdHJ1ZTsKKworCXByX2luZm8oIkRNQS1BUEk6IGRlYnVnZ2luZyBlbmFibGVkIGJ5IGtlcm5lbCBjb25maWdcbiIpOworfQorCitzdGF0aWMgX19pbml0IGludCBkbWFfZGVidWdfY21kbGluZShjaGFyICpzdHIpCit7CisJaWYgKCFzdHIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHN0cm5jbXAoc3RyLCAib2ZmIiwgMykgPT0gMCkgeworCQlwcl9pbmZvKCJETUEtQVBJOiBkZWJ1Z2dpbmcgZGlzYWJsZWQgb24ga2VybmVsIGNvbW1hbmQgbGluZVxuIik7CisJCWdsb2JhbF9kaXNhYmxlID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgZG1hX2RlYnVnX2VudHJpZXNfY21kbGluZShjaGFyICpzdHIpCit7CisJaW50IHJlczsKKworCWlmICghc3RyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlcyA9IGdldF9vcHRpb24oJnN0ciwgJnJlcV9lbnRyaWVzKTsKKworCWlmICghcmVzKQorCQlyZXFfZW50cmllcyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworX19zZXR1cCgiZG1hX2RlYnVnPSIsIGRtYV9kZWJ1Z19jbWRsaW5lKTsKK19fc2V0dXAoImRtYV9kZWJ1Z19lbnRyaWVzPSIsIGRtYV9kZWJ1Z19lbnRyaWVzX2NtZGxpbmUpOworCitzdGF0aWMgdm9pZCBjaGVja191bm1hcChzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisJc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJ1Y2tldCA9IGdldF9oYXNoX2J1Y2tldChyZWYsICZmbGFncyk7CisJZW50cnkgPSBidWNrZXRfZmluZF9leGFjdChidWNrZXQsIHJlZik7CisKKwlpZiAoIWVudHJ5KSB7CisJCS8qIG11c3QgZHJvcCBsb2NrIGJlZm9yZSBjYWxsaW5nIGRtYV9tYXBwaW5nX2Vycm9yICovCisJCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7CisKKwkJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKHJlZi0+ZGV2LCByZWYtPmRldl9hZGRyKSkgeworCQkJZXJyX3ByaW50ayhyZWYtPmRldiwgTlVMTCwKKwkJCQkgICAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciB0cmllcyB0byBmcmVlIGFuICIKKwkJCQkgICAiaW52YWxpZCBETUEgbWVtb3J5IGFkZHJlc3NcbiIpOworCQl9IGVsc2UgeworCQkJZXJyX3ByaW50ayhyZWYtPmRldiwgTlVMTCwKKwkJCQkgICAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciB0cmllcyB0byBmcmVlIERNQSAiCisJCQkJICAgIm1lbW9yeSBpdCBoYXMgbm90IGFsbG9jYXRlZCBbZGV2aWNlICIKKwkJCQkgICAiYWRkcmVzcz0weCUwMTZsbHhdIFtzaXplPSVsbHUgYnl0ZXNdXG4iLAorCQkJCSAgIHJlZi0+ZGV2X2FkZHIsIHJlZi0+c2l6ZSk7CisJCX0KKwkJcmV0dXJuOworCX0KKworCWlmIChyZWYtPnNpemUgIT0gZW50cnktPnNpemUpIHsKKwkJZXJyX3ByaW50ayhyZWYtPmRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIGZyZWVzICIKKwkJCSAgICJETUEgbWVtb3J5IHdpdGggZGlmZmVyZW50IHNpemUgIgorCQkJICAgIltkZXZpY2UgYWRkcmVzcz0weCUwMTZsbHhdIFttYXAgc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkgICAiW3VubWFwIHNpemU9JWxsdSBieXRlc11cbiIsCisJCQkgICByZWYtPmRldl9hZGRyLCBlbnRyeS0+c2l6ZSwgcmVmLT5zaXplKTsKKwl9CisKKwlpZiAocmVmLT50eXBlICE9IGVudHJ5LT50eXBlKSB7CisJCWVycl9wcmludGsocmVmLT5kZXYsIGVudHJ5LCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBmcmVlcyAiCisJCQkgICAiRE1BIG1lbW9yeSB3aXRoIHdyb25nIGZ1bmN0aW9uICIKKwkJCSAgICJbZGV2aWNlIGFkZHJlc3M9MHglMDE2bGx4XSBbc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkgICAiW21hcHBlZCBhcyAlc10gW3VubWFwcGVkIGFzICVzXVxuIiwKKwkJCSAgIHJlZi0+ZGV2X2FkZHIsIHJlZi0+c2l6ZSwKKwkJCSAgIHR5cGUybmFtZVtlbnRyeS0+dHlwZV0sIHR5cGUybmFtZVtyZWYtPnR5cGVdKTsKKwl9IGVsc2UgaWYgKChlbnRyeS0+dHlwZSA9PSBkbWFfZGVidWdfY29oZXJlbnQpICYmCisJCSAgIChwaHlzX2FkZHIocmVmKSAhPSBwaHlzX2FkZHIoZW50cnkpKSkgeworCQllcnJfcHJpbnRrKHJlZi0+ZGV2LCBlbnRyeSwgIkRNQS1BUEk6IGRldmljZSBkcml2ZXIgZnJlZXMgIgorCQkJICAgIkRNQSBtZW1vcnkgd2l0aCBkaWZmZXJlbnQgQ1BVIGFkZHJlc3MgIgorCQkJICAgIltkZXZpY2UgYWRkcmVzcz0weCUwMTZsbHhdIFtzaXplPSVsbHUgYnl0ZXNdICIKKwkJCSAgICJbY3B1IGFsbG9jIGFkZHJlc3M9MHglMDE2bGx4XSAiCisJCQkgICAiW2NwdSBmcmVlIGFkZHJlc3M9MHglMDE2bGx4XSIsCisJCQkgICByZWYtPmRldl9hZGRyLCByZWYtPnNpemUsCisJCQkgICBwaHlzX2FkZHIoZW50cnkpLAorCQkJICAgcGh5c19hZGRyKHJlZikpOworCX0KKworCWlmIChyZWYtPnNnX2NhbGxfZW50cyAmJiByZWYtPnR5cGUgPT0gZG1hX2RlYnVnX3NnICYmCisJICAgIHJlZi0+c2dfY2FsbF9lbnRzICE9IGVudHJ5LT5zZ19jYWxsX2VudHMpIHsKKwkJZXJyX3ByaW50ayhyZWYtPmRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIGZyZWVzICIKKwkJCSAgICJETUEgc2cgbGlzdCB3aXRoIGRpZmZlcmVudCBlbnRyeSBjb3VudCAiCisJCQkgICAiW21hcCBjb3VudD0lZF0gW3VubWFwIGNvdW50PSVkXVxuIiwKKwkJCSAgIGVudHJ5LT5zZ19jYWxsX2VudHMsIHJlZi0+c2dfY2FsbF9lbnRzKTsKKwl9CisKKwkvKgorCSAqIFRoaXMgbWF5IGJlIG5vIGJ1ZyBpbiByZWFsaXR5IC0gYnV0IG1vc3QgaW1wbGVtZW50YXRpb25zIG9mIHRoZQorCSAqIERNQSBBUEkgZG9uJ3QgaGFuZGxlIHRoaXMgcHJvcGVybHksIHNvIGNoZWNrIGZvciBpdCBoZXJlCisJICovCisJaWYgKHJlZi0+ZGlyZWN0aW9uICE9IGVudHJ5LT5kaXJlY3Rpb24pIHsKKwkJZXJyX3ByaW50ayhyZWYtPmRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIGZyZWVzICIKKwkJCSAgICJETUEgbWVtb3J5IHdpdGggZGlmZmVyZW50IGRpcmVjdGlvbiAiCisJCQkgICAiW2RldmljZSBhZGRyZXNzPTB4JTAxNmxseF0gW3NpemU9JWxsdSBieXRlc10gIgorCQkJICAgIlttYXBwZWQgd2l0aCAlc10gW3VubWFwcGVkIHdpdGggJXNdXG4iLAorCQkJICAgcmVmLT5kZXZfYWRkciwgcmVmLT5zaXplLAorCQkJICAgZGlyMm5hbWVbZW50cnktPmRpcmVjdGlvbl0sCisJCQkgICBkaXIybmFtZVtyZWYtPmRpcmVjdGlvbl0pOworCX0KKworCS8qCisJICogRHJpdmVycyBzaG91bGQgdXNlIGRtYV9tYXBwaW5nX2Vycm9yKCkgdG8gY2hlY2sgdGhlIHJldHVybmVkCisJICogYWRkcmVzc2VzIG9mIGRtYV9tYXBfc2luZ2xlKCkgYW5kIGRtYV9tYXBfcGFnZSgpLgorCSAqIElmIG5vdCwgcHJpbnQgdGhpcyB3YXJuaW5nIG1lc3NhZ2UuIFNlZSBEb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0LgorCSAqLworCWlmIChlbnRyeS0+bWFwX2Vycl90eXBlID09IE1BUF9FUlJfTk9UX0NIRUNLRUQpIHsKKwkJZXJyX3ByaW50ayhyZWYtPmRldiwgZW50cnksCisJCQkgICAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBmYWlsZWQgdG8gY2hlY2sgbWFwIGVycm9yIgorCQkJICAgIltkZXZpY2UgYWRkcmVzcz0weCUwMTZsbHhdIFtzaXplPSVsbHUgYnl0ZXNdICIKKwkJCSAgICJbbWFwcGVkIGFzICVzXSIsCisJCQkgICByZWYtPmRldl9hZGRyLCByZWYtPnNpemUsCisJCQkgICB0eXBlMm5hbWVbZW50cnktPnR5cGVdKTsKKwl9CisKKwloYXNoX2J1Y2tldF9kZWwoZW50cnkpOworCWRtYV9lbnRyeV9mcmVlKGVudHJ5KTsKKworCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2Zvcl9zdGFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQpCit7CisJdm9pZCAqYWRkcjsKKwlzdHJ1Y3Qgdm1fc3RydWN0ICpzdGFja192bV9hcmVhID0gdGFza19zdGFja192bV9hcmVhKGN1cnJlbnQpOworCisJaWYgKCFzdGFja192bV9hcmVhKSB7CisJCS8qIFN0YWNrIGlzIGRpcmVjdC1tYXBwZWQuICovCisJCWlmIChQYWdlSGlnaE1lbShwYWdlKSkKKwkJCXJldHVybjsKKwkJYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldDsKKwkJaWYgKG9iamVjdF9pc19vbl9zdGFjayhhZGRyKSkKKwkJCWVycl9wcmludGsoZGV2LCBOVUxMLCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBtYXBzIG1lbW9yeSBmcm9tIHN0YWNrIFthZGRyPSVwXVxuIiwgYWRkcik7CisJfSBlbHNlIHsKKwkJLyogU3RhY2sgaXMgdm1hbGxvY2VkLiAqLworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc3RhY2tfdm1fYXJlYS0+bnJfcGFnZXM7IGkrKykgeworCQkJaWYgKHBhZ2UgIT0gc3RhY2tfdm1fYXJlYS0+cGFnZXNbaV0pCisJCQkJY29udGludWU7CisKKwkJCWFkZHIgPSAodTggKiljdXJyZW50LT5zdGFjayArIGkgKiBQQUdFX1NJWkUgKyBvZmZzZXQ7CisJCQllcnJfcHJpbnRrKGRldiwgTlVMTCwgIkRNQS1BUEk6IGRldmljZSBkcml2ZXIgbWFwcyBtZW1vcnkgZnJvbSBzdGFjayBbcHJvYmFibGUgYWRkcj0lcF1cbiIsIGFkZHIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvdmVybGFwKHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuLCB2b2lkICpzdGFydCwgdm9pZCAqZW5kKQoreworCXVuc2lnbmVkIGxvbmcgYTEgPSAodW5zaWduZWQgbG9uZylhZGRyOworCXVuc2lnbmVkIGxvbmcgYjEgPSBhMSArIGxlbjsKKwl1bnNpZ25lZCBsb25nIGEyID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBiMiA9ICh1bnNpZ25lZCBsb25nKWVuZDsKKworCXJldHVybiAhKGIxIDw9IGEyIHx8IGExID49IGIyKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbGVuKQoreworCWlmIChvdmVybGFwKGFkZHIsIGxlbiwgX3N0ZXh0LCBfZXRleHQpIHx8CisJICAgIG92ZXJsYXAoYWRkciwgbGVuLCBfX3N0YXJ0X3JvZGF0YSwgX19lbmRfcm9kYXRhKSkKKwkJZXJyX3ByaW50ayhkZXYsIE5VTEwsICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIG1hcHMgbWVtb3J5IGZyb20ga2VybmVsIHRleHQgb3Igcm9kYXRhIFthZGRyPSVwXSBbbGVuPSVsdV1cbiIsIGFkZHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgICAgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqcmVmLAorCQkgICAgICAgYm9vbCB0b19jcHUpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisJc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWJ1Y2tldCA9IGdldF9oYXNoX2J1Y2tldChyZWYsICZmbGFncyk7CisKKwllbnRyeSA9IGJ1Y2tldF9maW5kX2NvbnRhaW4oJmJ1Y2tldCwgcmVmLCAmZmxhZ3MpOworCisJaWYgKCFlbnRyeSkgeworCQllcnJfcHJpbnRrKGRldiwgTlVMTCwgIkRNQS1BUEk6IGRldmljZSBkcml2ZXIgdHJpZXMgIgorCQkJCSJ0byBzeW5jIERNQSBtZW1vcnkgaXQgaGFzIG5vdCBhbGxvY2F0ZWQgIgorCQkJCSJbZGV2aWNlIGFkZHJlc3M9MHglMDE2bGx4XSBbc2l6ZT0lbGx1IGJ5dGVzXVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlZi0+ZGV2X2FkZHIsIHJlZi0+c2l6ZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyZWYtPnNpemUgPiBlbnRyeS0+c2l6ZSkgeworCQllcnJfcHJpbnRrKGRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHN5bmNzIgorCQkJCSIgRE1BIG1lbW9yeSBvdXRzaWRlIGFsbG9jYXRlZCByYW5nZSAiCisJCQkJIltkZXZpY2UgYWRkcmVzcz0weCUwMTZsbHhdICIKKwkJCQkiW2FsbG9jYXRpb24gc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkJIltzeW5jIG9mZnNldCtzaXplPSVsbHVdXG4iLAorCQkJCWVudHJ5LT5kZXZfYWRkciwgZW50cnktPnNpemUsCisJCQkJcmVmLT5zaXplKTsKKwl9CisKKwlpZiAoZW50cnktPmRpcmVjdGlvbiA9PSBETUFfQklESVJFQ1RJT05BTCkKKwkJZ290byBvdXQ7CisKKwlpZiAocmVmLT5kaXJlY3Rpb24gIT0gZW50cnktPmRpcmVjdGlvbikgeworCQllcnJfcHJpbnRrKGRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHN5bmNzICIKKwkJCQkiRE1BIG1lbW9yeSB3aXRoIGRpZmZlcmVudCBkaXJlY3Rpb24gIgorCQkJCSJbZGV2aWNlIGFkZHJlc3M9MHglMDE2bGx4XSBbc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkJIlttYXBwZWQgd2l0aCAlc10gW3N5bmNlZCB3aXRoICVzXVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlZi0+ZGV2X2FkZHIsIGVudHJ5LT5zaXplLAorCQkJCWRpcjJuYW1lW2VudHJ5LT5kaXJlY3Rpb25dLAorCQkJCWRpcjJuYW1lW3JlZi0+ZGlyZWN0aW9uXSk7CisJfQorCisJaWYgKHRvX2NwdSAmJiAhKGVudHJ5LT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSAmJgorCQkgICAgICAhKHJlZi0+ZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpKQorCQllcnJfcHJpbnRrKGRldiwgZW50cnksICJETUEtQVBJOiBkZXZpY2UgZHJpdmVyIHN5bmNzICIKKwkJCQkiZGV2aWNlIHJlYWQtb25seSBETUEgbWVtb3J5IGZvciBjcHUgIgorCQkJCSJbZGV2aWNlIGFkZHJlc3M9MHglMDE2bGx4XSBbc2l6ZT0lbGx1IGJ5dGVzXSAiCisJCQkJIlttYXBwZWQgd2l0aCAlc10gW3N5bmNlZCB3aXRoICVzXVxuIiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlZi0+ZGV2X2FkZHIsIGVudHJ5LT5zaXplLAorCQkJCWRpcjJuYW1lW2VudHJ5LT5kaXJlY3Rpb25dLAorCQkJCWRpcjJuYW1lW3JlZi0+ZGlyZWN0aW9uXSk7CisKKwlpZiAoIXRvX2NwdSAmJiAhKGVudHJ5LT5kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgJiYKKwkJICAgICAgICEocmVmLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSkKKwkJZXJyX3ByaW50ayhkZXYsIGVudHJ5LCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBzeW5jcyAiCisJCQkJImRldmljZSB3cml0ZS1vbmx5IERNQSBtZW1vcnkgdG8gZGV2aWNlICIKKwkJCQkiW2RldmljZSBhZGRyZXNzPTB4JTAxNmxseF0gW3NpemU9JWxsdSBieXRlc10gIgorCQkJCSJbbWFwcGVkIHdpdGggJXNdIFtzeW5jZWQgd2l0aCAlc11cbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylyZWYtPmRldl9hZGRyLCBlbnRyeS0+c2l6ZSwKKwkJCQlkaXIybmFtZVtlbnRyeS0+ZGlyZWN0aW9uXSwKKwkJCQlkaXIybmFtZVtyZWYtPmRpcmVjdGlvbl0pOworCisJaWYgKHJlZi0+c2dfY2FsbF9lbnRzICYmIHJlZi0+dHlwZSA9PSBkbWFfZGVidWdfc2cgJiYKKwkgICAgcmVmLT5zZ19jYWxsX2VudHMgIT0gZW50cnktPnNnX2NhbGxfZW50cykgeworCQllcnJfcHJpbnRrKHJlZi0+ZGV2LCBlbnRyeSwgIkRNQS1BUEk6IGRldmljZSBkcml2ZXIgc3luY3MgIgorCQkJICAgIkRNQSBzZyBsaXN0IHdpdGggZGlmZmVyZW50IGVudHJ5IGNvdW50ICIKKwkJCSAgICJbbWFwIGNvdW50PSVkXSBbc3luYyBjb3VudD0lZF1cbiIsCisJCQkgICBlbnRyeS0+c2dfY2FsbF9lbnRzLCByZWYtPnNnX2NhbGxfZW50cyk7CisJfQorCitvdXQ6CisJcHV0X2hhc2hfYnVja2V0KGJ1Y2tldCwgJmZsYWdzKTsKK30KKwordm9pZCBkZWJ1Z19kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwKKwkJCXNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJYm9vbCBtYXBfc2luZ2xlKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCisJaWYgKHVubGlrZWx5KGRtYV9kZWJ1Z19kaXNhYmxlZCgpKSkKKwkJcmV0dXJuOworCisJaWYgKGRtYV9tYXBwaW5nX2Vycm9yKGRldiwgZG1hX2FkZHIpKQorCQlyZXR1cm47CisKKwllbnRyeSA9IGRtYV9lbnRyeV9hbGxvYygpOworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWVudHJ5LT5kZXYgICAgICAgPSBkZXY7CisJZW50cnktPnR5cGUgICAgICA9IGRtYV9kZWJ1Z19wYWdlOworCWVudHJ5LT5wZm4JID0gcGFnZV90b19wZm4ocGFnZSk7CisJZW50cnktPm9mZnNldAkgPSBvZmZzZXQsCisJZW50cnktPmRldl9hZGRyICA9IGRtYV9hZGRyOworCWVudHJ5LT5zaXplICAgICAgPSBzaXplOworCWVudHJ5LT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisJZW50cnktPm1hcF9lcnJfdHlwZSA9IE1BUF9FUlJfTk9UX0NIRUNLRUQ7CisKKwlpZiAobWFwX3NpbmdsZSkKKwkJZW50cnktPnR5cGUgPSBkbWFfZGVidWdfc2luZ2xlOworCisJY2hlY2tfZm9yX3N0YWNrKGRldiwgcGFnZSwgb2Zmc2V0KTsKKworCWlmICghUGFnZUhpZ2hNZW0ocGFnZSkpIHsKKwkJdm9pZCAqYWRkciA9IHBhZ2VfYWRkcmVzcyhwYWdlKSArIG9mZnNldDsKKworCQljaGVja19mb3JfaWxsZWdhbF9hcmVhKGRldiwgYWRkciwgc2l6ZSk7CisJfQorCisJYWRkX2RtYV9lbnRyeShlbnRyeSk7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9tYXBfcGFnZSk7CisKK3ZvaWQgZGVidWdfZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqZGV2LCBkbWFfYWRkcl90IGRtYV9hZGRyKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgcmVmOworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBoYXNoX2J1Y2tldCAqYnVja2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwlyZWYuZGV2ID0gZGV2OworCXJlZi5kZXZfYWRkciA9IGRtYV9hZGRyOworCWJ1Y2tldCA9IGdldF9oYXNoX2J1Y2tldCgmcmVmLCAmZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmJ1Y2tldC0+bGlzdCwgbGlzdCkgeworCQlpZiAoIWV4YWN0X21hdGNoKCZyZWYsIGVudHJ5KSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIFRoZSBzYW1lIHBoeXNpY2FsIGFkZHJlc3MgY2FuIGJlIG1hcHBlZCBtdWx0aXBsZQorCQkgKiB0aW1lcy4gV2l0aG91dCBhIGhhcmR3YXJlIElPTU1VIHRoaXMgcmVzdWx0cyBpbiB0aGUKKwkJICogc2FtZSBkZXZpY2UgYWRkcmVzc2VzIGJlaW5nIHB1dCBpbnRvIHRoZSBkbWEtZGVidWcKKwkJICogaGFzaCBtdWx0aXBsZSB0aW1lcyB0b28uIFRoaXMgY2FuIHJlc3VsdCBpbiBmYWxzZQorCQkgKiBwb3NpdGl2ZXMgYmVpbmcgcmVwb3J0ZWQuIFRoZXJlZm9yZSB3ZSBpbXBsZW1lbnQgYQorCQkgKiBiZXN0LWZpdCBhbGdvcml0aG0gaGVyZSB3aGljaCB1cGRhdGVzIHRoZSBmaXJzdCBlbnRyeQorCQkgKiBmcm9tIHRoZSBoYXNoIHdoaWNoIGZpdHMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBhbmQgaXMKKwkJICogbm90IGN1cnJlbnRseSBsaXN0ZWQgYXMgYmVpbmcgY2hlY2tlZC4KKwkJICovCisJCWlmIChlbnRyeS0+bWFwX2Vycl90eXBlID09IE1BUF9FUlJfTk9UX0NIRUNLRUQpIHsKKwkJCWVudHJ5LT5tYXBfZXJyX3R5cGUgPSBNQVBfRVJSX0NIRUNLRUQ7CisJCQlicmVhazsKKwkJfQorCX0KKworCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9tYXBwaW5nX2Vycm9yKTsKKwordm9pZCBkZWJ1Z19kbWFfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgYWRkciwKKwkJCSAgc2l6ZV90IHNpemUsIGludCBkaXJlY3Rpb24sIGJvb2wgbWFwX3NpbmdsZSkKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5IHJlZiA9IHsKKwkJLnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVnX3BhZ2UsCisJCS5kZXYgICAgICAgICAgICA9IGRldiwKKwkJLmRldl9hZGRyICAgICAgID0gYWRkciwKKwkJLnNpemUgICAgICAgICAgID0gc2l6ZSwKKwkJLmRpcmVjdGlvbiAgICAgID0gZGlyZWN0aW9uLAorCX07CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwlpZiAobWFwX3NpbmdsZSkKKwkJcmVmLnR5cGUgPSBkbWFfZGVidWdfc2luZ2xlOworCisJY2hlY2tfdW5tYXAoJnJlZik7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV91bm1hcF9wYWdlKTsKKwordm9pZCBkZWJ1Z19kbWFfbWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJICAgICAgaW50IG5lbnRzLCBpbnQgbWFwcGVkX2VudHMsIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBpOworCisJaWYgKHVubGlrZWx5KGRtYV9kZWJ1Z19kaXNhYmxlZCgpKSkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfc2coc2csIHMsIG1hcHBlZF9lbnRzLCBpKSB7CisJCWVudHJ5ID0gZG1hX2VudHJ5X2FsbG9jKCk7CisJCWlmICghZW50cnkpCisJCQlyZXR1cm47CisKKwkJZW50cnktPnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVnX3NnOworCQllbnRyeS0+ZGV2ICAgICAgICAgICAgPSBkZXY7CisJCWVudHJ5LT5wZm4JICAgICAgPSBwYWdlX3RvX3BmbihzZ19wYWdlKHMpKTsKKwkJZW50cnktPm9mZnNldAkgICAgICA9IHMtPm9mZnNldCwKKwkJZW50cnktPnNpemUgICAgICAgICAgID0gc2dfZG1hX2xlbihzKTsKKwkJZW50cnktPmRldl9hZGRyICAgICAgID0gc2dfZG1hX2FkZHJlc3Mocyk7CisJCWVudHJ5LT5kaXJlY3Rpb24gICAgICA9IGRpcmVjdGlvbjsKKwkJZW50cnktPnNnX2NhbGxfZW50cyAgID0gbmVudHM7CisJCWVudHJ5LT5zZ19tYXBwZWRfZW50cyA9IG1hcHBlZF9lbnRzOworCisJCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHNnX3BhZ2UocyksIHMtPm9mZnNldCk7CisKKwkJaWYgKCFQYWdlSGlnaE1lbShzZ19wYWdlKHMpKSkgeworCQkJY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShkZXYsIHNnX3ZpcnQocyksIHNnX2RtYV9sZW4ocykpOworCQl9CisKKwkJYWRkX2RtYV9lbnRyeShlbnRyeSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfbWFwX3NnKTsKKworc3RhdGljIGludCBnZXRfbnJfbWFwcGVkX2VudHJpZXMoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpyZWYpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisJc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgbWFwcGVkX2VudHM7CisKKwlidWNrZXQgICAgICAgPSBnZXRfaGFzaF9idWNrZXQocmVmLCAmZmxhZ3MpOworCWVudHJ5ICAgICAgICA9IGJ1Y2tldF9maW5kX2V4YWN0KGJ1Y2tldCwgcmVmKTsKKwltYXBwZWRfZW50cyAgPSAwOworCisJaWYgKGVudHJ5KQorCQltYXBwZWRfZW50cyA9IGVudHJ5LT5zZ19tYXBwZWRfZW50czsKKwlwdXRfaGFzaF9idWNrZXQoYnVja2V0LCAmZmxhZ3MpOworCisJcmV0dXJuIG1hcHBlZF9lbnRzOworfQorCit2b2lkIGRlYnVnX2RtYV91bm1hcF9zZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LAorCQkJaW50IG5lbGVtcywgaW50IGRpcikKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7CisJaW50IG1hcHBlZF9lbnRzID0gMCwgaTsKKworCWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3NnKHNnbGlzdCwgcywgbmVsZW1zLCBpKSB7CisKKwkJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSByZWYgPSB7CisJCQkudHlwZSAgICAgICAgICAgPSBkbWFfZGVidWdfc2csCisJCQkuZGV2ICAgICAgICAgICAgPSBkZXYsCisJCQkucGZuCQk9IHBhZ2VfdG9fcGZuKHNnX3BhZ2UocykpLAorCQkJLm9mZnNldAkJPSBzLT5vZmZzZXQsCisJCQkuZGV2X2FkZHIgICAgICAgPSBzZ19kbWFfYWRkcmVzcyhzKSwKKwkJCS5zaXplICAgICAgICAgICA9IHNnX2RtYV9sZW4ocyksCisJCQkuZGlyZWN0aW9uICAgICAgPSBkaXIsCisJCQkuc2dfY2FsbF9lbnRzICAgPSBuZWxlbXMsCisJCX07CisKKwkJaWYgKG1hcHBlZF9lbnRzICYmIGkgPj0gbWFwcGVkX2VudHMpCisJCQlicmVhazsKKworCQlpZiAoIWkpCisJCQltYXBwZWRfZW50cyA9IGdldF9ucl9tYXBwZWRfZW50cmllcyhkZXYsICZyZWYpOworCisJCWNoZWNrX3VubWFwKCZyZWYpOworCX0KK30KK0VYUE9SVF9TWU1CT0woZGVidWdfZG1hX3VubWFwX3NnKTsKKwordm9pZCBkZWJ1Z19kbWFfYWxsb2NfY29oZXJlbnQoc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2FkZHIsIHZvaWQgKnZpcnQpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkodmlydCA9PSBOVUxMKSkKKwkJcmV0dXJuOworCisJZW50cnkgPSBkbWFfZW50cnlfYWxsb2MoKTsKKwlpZiAoIWVudHJ5KQorCQlyZXR1cm47CisKKwllbnRyeS0+dHlwZSAgICAgID0gZG1hX2RlYnVnX2NvaGVyZW50OworCWVudHJ5LT5kZXYgICAgICAgPSBkZXY7CisJZW50cnktPnBmbgkgPSBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2UodmlydCkpOworCWVudHJ5LT5vZmZzZXQJID0gb2Zmc2V0X2luX3BhZ2UodmlydCk7CisJZW50cnktPnNpemUgICAgICA9IHNpemU7CisJZW50cnktPmRldl9hZGRyICA9IGRtYV9hZGRyOworCWVudHJ5LT5kaXJlY3Rpb24gPSBETUFfQklESVJFQ1RJT05BTDsKKworCWFkZF9kbWFfZW50cnkoZW50cnkpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfYWxsb2NfY29oZXJlbnQpOworCit2b2lkIGRlYnVnX2RtYV9mcmVlX2NvaGVyZW50KHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgdm9pZCAqdmlydCwgZG1hX2FkZHJfdCBhZGRyKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgcmVmID0geworCQkudHlwZSAgICAgICAgICAgPSBkbWFfZGVidWdfY29oZXJlbnQsCisJCS5kZXYgICAgICAgICAgICA9IGRldiwKKwkJLnBmbgkJPSBwYWdlX3RvX3Bmbih2aXJ0X3RvX3BhZ2UodmlydCkpLAorCQkub2Zmc2V0CQk9IG9mZnNldF9pbl9wYWdlKHZpcnQpLAorCQkuZGV2X2FkZHIgICAgICAgPSBhZGRyLAorCQkuc2l6ZSAgICAgICAgICAgPSBzaXplLAorCQkuZGlyZWN0aW9uICAgICAgPSBETUFfQklESVJFQ1RJT05BTCwKKwl9OworCisJaWYgKHVubGlrZWx5KGRtYV9kZWJ1Z19kaXNhYmxlZCgpKSkKKwkJcmV0dXJuOworCisJY2hlY2tfdW5tYXAoJnJlZik7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9mcmVlX2NvaGVyZW50KTsKKwordm9pZCBkZWJ1Z19kbWFfbWFwX3Jlc291cmNlKHN0cnVjdCBkZXZpY2UgKmRldiwgcGh5c19hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUsCisJCQkgICAgaW50IGRpcmVjdGlvbiwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKworCWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCWVudHJ5ID0gZG1hX2VudHJ5X2FsbG9jKCk7CisJaWYgKCFlbnRyeSkKKwkJcmV0dXJuOworCisJZW50cnktPnR5cGUJCT0gZG1hX2RlYnVnX3Jlc291cmNlOworCWVudHJ5LT5kZXYJCT0gZGV2OworCWVudHJ5LT5wZm4JCT0gUEhZU19QRk4oYWRkcik7CisJZW50cnktPm9mZnNldAkJPSBvZmZzZXRfaW5fcGFnZShhZGRyKTsKKwllbnRyeS0+c2l6ZQkJPSBzaXplOworCWVudHJ5LT5kZXZfYWRkcgkJPSBkbWFfYWRkcjsKKwllbnRyeS0+ZGlyZWN0aW9uCT0gZGlyZWN0aW9uOworCWVudHJ5LT5tYXBfZXJyX3R5cGUJPSBNQVBfRVJSX05PVF9DSEVDS0VEOworCisJYWRkX2RtYV9lbnRyeShlbnRyeSk7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9tYXBfcmVzb3VyY2UpOworCit2b2lkIGRlYnVnX2RtYV91bm1hcF9yZXNvdXJjZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIsCisJCQkgICAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5IHJlZiA9IHsKKwkJLnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVnX3Jlc291cmNlLAorCQkuZGV2ICAgICAgICAgICAgPSBkZXYsCisJCS5kZXZfYWRkciAgICAgICA9IGRtYV9hZGRyLAorCQkuc2l6ZSAgICAgICAgICAgPSBzaXplLAorCQkuZGlyZWN0aW9uICAgICAgPSBkaXJlY3Rpb24sCisJfTsKKworCWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCWNoZWNrX3VubWFwKCZyZWYpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfdW5tYXBfcmVzb3VyY2UpOworCit2b2lkIGRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCSAgIHNpemVfdCBzaXplLCBpbnQgZGlyZWN0aW9uKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgcmVmOworCisJaWYgKHVubGlrZWx5KGRtYV9kZWJ1Z19kaXNhYmxlZCgpKSkKKwkJcmV0dXJuOworCisJcmVmLnR5cGUgICAgICAgICA9IGRtYV9kZWJ1Z19zaW5nbGU7CisJcmVmLmRldiAgICAgICAgICA9IGRldjsKKwlyZWYuZGV2X2FkZHIgICAgID0gZG1hX2hhbmRsZTsKKwlyZWYuc2l6ZSAgICAgICAgID0gc2l6ZTsKKwlyZWYuZGlyZWN0aW9uICAgID0gZGlyZWN0aW9uOworCXJlZi5zZ19jYWxsX2VudHMgPSAwOworCisJY2hlY2tfc3luYyhkZXYsICZyZWYsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfc3luY19zaW5nbGVfZm9yX2NwdSk7CisKK3ZvaWQgZGVidWdfZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIGRtYV9hZGRyX3QgZG1hX2hhbmRsZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5IHJlZjsKKworCWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCXJlZi50eXBlICAgICAgICAgPSBkbWFfZGVidWdfc2luZ2xlOworCXJlZi5kZXYgICAgICAgICAgPSBkZXY7CisJcmVmLmRldl9hZGRyICAgICA9IGRtYV9oYW5kbGU7CisJcmVmLnNpemUgICAgICAgICA9IHNpemU7CisJcmVmLmRpcmVjdGlvbiAgICA9IGRpcmVjdGlvbjsKKwlyZWYuc2dfY2FsbF9lbnRzID0gMDsKKworCWNoZWNrX3N5bmMoZGV2LCAmcmVmLCBmYWxzZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKKwordm9pZCBkZWJ1Z19kbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSBkbWFfYWRkcl90IGRtYV9oYW5kbGUsCisJCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJCSBpbnQgZGlyZWN0aW9uKQoreworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgcmVmOworCisJaWYgKHVubGlrZWx5KGRtYV9kZWJ1Z19kaXNhYmxlZCgpKSkKKwkJcmV0dXJuOworCisJcmVmLnR5cGUgICAgICAgICA9IGRtYV9kZWJ1Z19zaW5nbGU7CisJcmVmLmRldiAgICAgICAgICA9IGRldjsKKwlyZWYuZGV2X2FkZHIgICAgID0gZG1hX2hhbmRsZTsKKwlyZWYuc2l6ZSAgICAgICAgID0gb2Zmc2V0ICsgc2l6ZTsKKwlyZWYuZGlyZWN0aW9uICAgID0gZGlyZWN0aW9uOworCXJlZi5zZ19jYWxsX2VudHMgPSAwOworCisJY2hlY2tfc3luYyhkZXYsICZyZWYsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfc3luY19zaW5nbGVfcmFuZ2VfZm9yX2NwdSk7CisKK3ZvaWQgZGVidWdfZG1hX3N5bmNfc2luZ2xlX3JhbmdlX2Zvcl9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgZG1hX2FkZHJfdCBkbWFfaGFuZGxlLAorCQkJCQkgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisJCQkJCSAgICBzaXplX3Qgc2l6ZSwgaW50IGRpcmVjdGlvbikKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5IHJlZjsKKworCWlmICh1bmxpa2VseShkbWFfZGVidWdfZGlzYWJsZWQoKSkpCisJCXJldHVybjsKKworCXJlZi50eXBlICAgICAgICAgPSBkbWFfZGVidWdfc2luZ2xlOworCXJlZi5kZXYgICAgICAgICAgPSBkZXY7CisJcmVmLmRldl9hZGRyICAgICA9IGRtYV9oYW5kbGU7CisJcmVmLnNpemUgICAgICAgICA9IG9mZnNldCArIHNpemU7CisJcmVmLmRpcmVjdGlvbiAgICA9IGRpcmVjdGlvbjsKKwlyZWYuc2dfY2FsbF9lbnRzID0gMDsKKworCWNoZWNrX3N5bmMoZGV2LCAmcmVmLCBmYWxzZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRlYnVnX2RtYV9zeW5jX3NpbmdsZV9yYW5nZV9mb3JfZGV2aWNlKTsKKwordm9pZCBkZWJ1Z19kbWFfc3luY19zZ19mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgICAgICBpbnQgbmVsZW1zLCBpbnQgZGlyZWN0aW9uKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKwlpbnQgbWFwcGVkX2VudHMgPSAwLCBpOworCisJaWYgKHVubGlrZWx5KGRtYV9kZWJ1Z19kaXNhYmxlZCgpKSkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfc2coc2csIHMsIG5lbGVtcywgaSkgeworCisJCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgcmVmID0geworCQkJLnR5cGUgICAgICAgICAgID0gZG1hX2RlYnVnX3NnLAorCQkJLmRldiAgICAgICAgICAgID0gZGV2LAorCQkJLnBmbgkJPSBwYWdlX3RvX3BmbihzZ19wYWdlKHMpKSwKKwkJCS5vZmZzZXQJCT0gcy0+b2Zmc2V0LAorCQkJLmRldl9hZGRyICAgICAgID0gc2dfZG1hX2FkZHJlc3MocyksCisJCQkuc2l6ZSAgICAgICAgICAgPSBzZ19kbWFfbGVuKHMpLAorCQkJLmRpcmVjdGlvbiAgICAgID0gZGlyZWN0aW9uLAorCQkJLnNnX2NhbGxfZW50cyAgID0gbmVsZW1zLAorCQl9OworCisJCWlmICghaSkKKwkJCW1hcHBlZF9lbnRzID0gZ2V0X25yX21hcHBlZF9lbnRyaWVzKGRldiwgJnJlZik7CisKKwkJaWYgKGkgPj0gbWFwcGVkX2VudHMpCisJCQlicmVhazsKKworCQljaGVja19zeW5jKGRldiwgJnJlZiwgdHJ1ZSk7CisJfQorfQorRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfc3luY19zZ19mb3JfY3B1KTsKKwordm9pZCBkZWJ1Z19kbWFfc3luY19zZ19mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCQkgIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOworCWludCBtYXBwZWRfZW50cyA9IDAsIGk7CisKKwlpZiAodW5saWtlbHkoZG1hX2RlYnVnX2Rpc2FibGVkKCkpKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9zZyhzZywgcywgbmVsZW1zLCBpKSB7CisKKwkJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSByZWYgPSB7CisJCQkudHlwZSAgICAgICAgICAgPSBkbWFfZGVidWdfc2csCisJCQkuZGV2ICAgICAgICAgICAgPSBkZXYsCisJCQkucGZuCQk9IHBhZ2VfdG9fcGZuKHNnX3BhZ2UocykpLAorCQkJLm9mZnNldAkJPSBzLT5vZmZzZXQsCisJCQkuZGV2X2FkZHIgICAgICAgPSBzZ19kbWFfYWRkcmVzcyhzKSwKKwkJCS5zaXplICAgICAgICAgICA9IHNnX2RtYV9sZW4ocyksCisJCQkuZGlyZWN0aW9uICAgICAgPSBkaXJlY3Rpb24sCisJCQkuc2dfY2FsbF9lbnRzICAgPSBuZWxlbXMsCisJCX07CisJCWlmICghaSkKKwkJCW1hcHBlZF9lbnRzID0gZ2V0X25yX21hcHBlZF9lbnRyaWVzKGRldiwgJnJlZik7CisKKwkJaWYgKGkgPj0gbWFwcGVkX2VudHMpCisJCQlicmVhazsKKworCQljaGVja19zeW5jKGRldiwgJnJlZiwgZmFsc2UpOworCX0KK30KK0VYUE9SVF9TWU1CT0woZGVidWdfZG1hX3N5bmNfc2dfZm9yX2RldmljZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IGRtYV9kZWJ1Z19kcml2ZXJfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5BTUVfTUFYX0xFTiAtIDE7ICsraSwgKytzdHIpIHsKKwkJY3VycmVudF9kcml2ZXJfbmFtZVtpXSA9ICpzdHI7CisJCWlmICgqc3RyID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoY3VycmVudF9kcml2ZXJfbmFtZVswXSkKKwkJcHJfaW5mbygiRE1BLUFQSTogZW5hYmxlIGRyaXZlciBmaWx0ZXIgZm9yIGRyaXZlciBbJXNdXG4iLAorCQkJY3VycmVudF9kcml2ZXJfbmFtZSk7CisKKworCXJldHVybiAxOworfQorX19zZXR1cCgiZG1hX2RlYnVnX2RyaXZlcj0iLCBkbWFfZGVidWdfZHJpdmVyX3NldHVwKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RtYS1ub29wLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kbWEtbm9vcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDE4NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kbWEtbm9vcC5jCkBAIC0wLDAgKzEsNjggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICoJbGliL2RtYS1ub29wLmMKKyAqCisgKiBETUEgb3BlcmF0aW9ucyB0aGF0IG1hcCB0byBwaHlzaWNhbCBhZGRyZXNzZXMgd2l0aG91dCBmbHVzaGluZyBtZW1vcnkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKworc3RhdGljIHZvaWQgKmRtYV9ub29wX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgICAgZG1hX2FkZHJfdCAqZG1hX2hhbmRsZSwgZ2ZwX3QgZ2ZwLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJdm9pZCAqcmV0OworCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGdmcCwgZ2V0X29yZGVyKHNpemUpKTsKKwlpZiAocmV0KQorCQkqZG1hX2hhbmRsZSA9IHZpcnRfdG9fcGh5cyhyZXQpIC0gUEZOX1BIWVMoZGV2LT5kbWFfcGZuX29mZnNldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkbWFfbm9vcF9mcmVlKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsCisJCQkgIHZvaWQgKmNwdV9hZGRyLCBkbWFfYWRkcl90IGRtYV9hZGRyLAorCQkJICB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpY3B1X2FkZHIsIGdldF9vcmRlcihzaXplKSk7Cit9CisKK3N0YXRpYyBkbWFfYWRkcl90IGRtYV9ub29wX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHNpemVfdCBzaXplLAorCQkJCSAgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCXJldHVybiBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQgLSBQRk5fUEhZUyhkZXYtPmRtYV9wZm5fb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBkbWFfbm9vcF9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbnRzLAorCQkJICAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJaW50IGk7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKSB7CisJCWRtYV9hZGRyX3Qgb2Zmc2V0ID0gUEZOX1BIWVMoZGV2LT5kbWFfcGZuX29mZnNldCk7CisJCXZvaWQgKnZhOworCisJCUJVR19PTighc2dfcGFnZShzZykpOworCQl2YSA9IHNnX3ZpcnQoc2cpOworCQlzZ19kbWFfYWRkcmVzcyhzZykgPSAoZG1hX2FkZHJfdCl2aXJ0X3RvX3BoeXModmEpIC0gb2Zmc2V0OworCQlzZ19kbWFfbGVuKHNnKSA9IHNnLT5sZW5ndGg7CisJfQorCisJcmV0dXJuIG5lbnRzOworfQorCitjb25zdCBzdHJ1Y3QgZG1hX21hcF9vcHMgZG1hX25vb3Bfb3BzID0geworCS5hbGxvYwkJCT0gZG1hX25vb3BfYWxsb2MsCisJLmZyZWUJCQk9IGRtYV9ub29wX2ZyZWUsCisJLm1hcF9wYWdlCQk9IGRtYV9ub29wX21hcF9wYWdlLAorCS5tYXBfc2cJCQk9IGRtYV9ub29wX21hcF9zZywKK307CisKK0VYUE9SVF9TWU1CT0woZG1hX25vb3Bfb3BzKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2RtYS12aXJ0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kbWEtdmlydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjFhMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9kbWEtdmlydC5jCkBAIC0wLDAgKzEsNjEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICoJbGliL2RtYS12aXJ0LmMKKyAqCisgKiBETUEgb3BlcmF0aW9ucyB0aGF0IG1hcCB0byB2aXJ0dWFsIGFkZHJlc3NlcyB3aXRob3V0IGZsdXNoaW5nIG1lbW9yeS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorCitzdGF0aWMgdm9pZCAqZG1hX3ZpcnRfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBnZnAsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoZ2ZwLCBnZXRfb3JkZXIoc2l6ZSkpOworCWlmIChyZXQpCisJCSpkbWFfaGFuZGxlID0gKHVpbnRwdHJfdClyZXQ7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZG1hX3ZpcnRfZnJlZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLAorCQkJICB2b2lkICpjcHVfYWRkciwgZG1hX2FkZHJfdCBkbWFfYWRkciwKKwkJCSAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNwdV9hZGRyLCBnZXRfb3JkZXIoc2l6ZSkpOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCBkbWFfdmlydF9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCisJCQkJICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlyZXR1cm4gKHVpbnRwdHJfdCkocGFnZV9hZGRyZXNzKHBhZ2UpICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGludCBkbWFfdmlydF9tYXBfc2coc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJCSAgIGludCBuZW50cywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJICAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVudHMsIGkpIHsKKwkJQlVHX09OKCFzZ19wYWdlKHNnKSk7CisJCXNnX2RtYV9hZGRyZXNzKHNnKSA9ICh1aW50cHRyX3Qpc2dfdmlydChzZyk7CisJCXNnX2RtYV9sZW4oc2cpID0gc2ctPmxlbmd0aDsKKwl9CisKKwlyZXR1cm4gbmVudHM7Cit9CisKK2NvbnN0IHN0cnVjdCBkbWFfbWFwX29wcyBkbWFfdmlydF9vcHMgPSB7CisJLmFsbG9jCQkJPSBkbWFfdmlydF9hbGxvYywKKwkuZnJlZQkJCT0gZG1hX3ZpcnRfZnJlZSwKKwkubWFwX3BhZ2UJCT0gZG1hX3ZpcnRfbWFwX3BhZ2UsCisJLm1hcF9zZwkJCT0gZG1hX3ZpcnRfbWFwX3NnLAorfTsKK0VYUE9SVF9TWU1CT0woZG1hX3ZpcnRfb3BzKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2R1bXBfc3RhY2suYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2R1bXBfc3RhY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdlYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZHVtcF9zdGFjay5jCkBAIC0wLDAgKzEsNzEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogUHJvdmlkZSBhIGRlZmF1bHQgZHVtcF9zdGFjaygpIGZ1bmN0aW9uIGZvciBhcmNoaXRlY3R1cmVzCisgKiB3aGljaCBkb24ndCBpbXBsZW1lbnQgdGhlaXIgb3duLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CisKK3N0YXRpYyB2b2lkIF9fZHVtcF9zdGFjayh2b2lkKQoreworCWR1bXBfc3RhY2tfcHJpbnRfaW5mbyhLRVJOX0RFRkFVTFQpOworCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7Cit9CisKKy8qKgorICogZHVtcF9zdGFjayAtIGR1bXAgdGhlIGN1cnJlbnQgdGFzayBpbmZvcm1hdGlvbiBhbmQgaXRzIHN0YWNrIHRyYWNlCisgKgorICogQXJjaGl0ZWN0dXJlcyBjYW4gb3ZlcnJpZGUgdGhpcyBpbXBsZW1lbnRhdGlvbiBieSBpbXBsZW1lbnRpbmcgaXRzIG93bi4KKyAqLworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyBhdG9taWNfdCBkdW1wX2xvY2sgPSBBVE9NSUNfSU5JVCgtMSk7CisKK2FzbWxpbmthZ2UgX192aXNpYmxlIHZvaWQgZHVtcF9zdGFjayh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdhc19sb2NrZWQ7CisJaW50IG9sZDsKKwlpbnQgY3B1OworCisJLyoKKwkgKiBQZXJtaXQgdGhpcyBjcHUgdG8gcGVyZm9ybSBuZXN0ZWQgc3RhY2sgZHVtcHMgd2hpbGUgc2VyaWFsaXNpbmcKKwkgKiBhZ2FpbnN0IG90aGVyIENQVXMKKwkgKi8KK3JldHJ5OgorCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJb2xkID0gYXRvbWljX2NtcHhjaGcoJmR1bXBfbG9jaywgLTEsIGNwdSk7CisJaWYgKG9sZCA9PSAtMSkgeworCQl3YXNfbG9ja2VkID0gMDsKKwl9IGVsc2UgaWYgKG9sZCA9PSBjcHUpIHsKKwkJd2FzX2xvY2tlZCA9IDE7CisJfSBlbHNlIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQkvKgorCQkgKiBXYWl0IGZvciB0aGUgbG9jayB0byByZWxlYXNlIGJlZm9yZSBqdW1waW5nIHRvCisJCSAqIGF0b21pY19jbXB4Y2hnKCkgaW4gb3JkZXIgdG8gbWl0aWdhdGUgdGhlIHRodW5kZXJpbmcgaGVyZAorCQkgKiBwcm9ibGVtLgorCQkgKi8KKwkJZG8geyBjcHVfcmVsYXgoKTsgfSB3aGlsZSAoYXRvbWljX3JlYWQoJmR1bXBfbG9jaykgIT0gLTEpOworCQlnb3RvIHJldHJ5OworCX0KKworCV9fZHVtcF9zdGFjaygpOworCisJaWYgKCF3YXNfbG9ja2VkKQorCQlhdG9taWNfc2V0KCZkdW1wX2xvY2ssIC0xKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKyNlbHNlCithc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIGR1bXBfc3RhY2sodm9pZCkKK3sKKwlfX2R1bXBfc3RhY2soKTsKK30KKyNlbmRpZgorRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2R5bmFtaWNfZGVidWcuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2R5bmFtaWNfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWM0NTFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZHluYW1pY19kZWJ1Zy5jCkBAIC0wLDAgKzEsMTA0OCBAQAorLyoKKyAqIGxpYi9keW5hbWljX2RlYnVnLmMKKyAqCisgKiBtYWtlIHByX2RlYnVnKCkvZGV2X2RiZygpIGNhbGxzIHJ1bnRpbWUgY29uZmlndXJhYmxlIGJhc2VkIHVwb24gdGhlaXIKKyAqIHNvdXJjZSBtb2R1bGUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEphc29uIEJhcm9uIDxqYmFyb25AcmVkaGF0LmNvbT4KKyAqIEJ5IEdyZWcgQmFua3MgPGduYkBtZWxib3VybmUuc2dpLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwOCBTaWxpY29uIEdyYXBoaWNzIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQmFydCBWYW4gQXNzY2hlLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMyBEdSwgQ2hhbmdiaW4gPGNoYW5nYmluLmR1QGdtYWlsLmNvbT4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6JXM6ICIgZm10LCBfX2Z1bmNfXworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9wYXJzZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9keW5hbWljX2RlYnVnLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CisjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKK2V4dGVybiBzdHJ1Y3QgX2RkZWJ1ZyBfX3N0YXJ0X19fdmVyYm9zZVtdOworZXh0ZXJuIHN0cnVjdCBfZGRlYnVnIF9fc3RvcF9fX3ZlcmJvc2VbXTsKKworc3RydWN0IGRkZWJ1Z190YWJsZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaW5rOworCWNvbnN0IGNoYXIgKm1vZF9uYW1lOworCXVuc2lnbmVkIGludCBudW1fZGRlYnVnczsKKwlzdHJ1Y3QgX2RkZWJ1ZyAqZGRlYnVnczsKK307CisKK3N0cnVjdCBkZGVidWdfcXVlcnkgeworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWNvbnN0IGNoYXIgKm1vZHVsZTsKKwljb25zdCBjaGFyICpmdW5jdGlvbjsKKwljb25zdCBjaGFyICpmb3JtYXQ7CisJdW5zaWduZWQgaW50IGZpcnN0X2xpbmVubywgbGFzdF9saW5lbm87Cit9OworCitzdHJ1Y3QgZGRlYnVnX2l0ZXIgeworCXN0cnVjdCBkZGVidWdfdGFibGUgKnRhYmxlOworCXVuc2lnbmVkIGludCBpZHg7Cit9OworCitzdGF0aWMgREVGSU5FX01VVEVYKGRkZWJ1Z19sb2NrKTsKK3N0YXRpYyBMSVNUX0hFQUQoZGRlYnVnX3RhYmxlcyk7CitzdGF0aWMgaW50IHZlcmJvc2U7Cittb2R1bGVfcGFyYW0odmVyYm9zZSwgaW50LCAwNjQ0KTsKKworLyogUmV0dXJuIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHNvdXJjZSByb290ICovCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnRyaW1fcHJlZml4KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHNraXAgPSBzdHJsZW4oX19GSUxFX18pIC0gc3RybGVuKCJsaWIvZHluYW1pY19kZWJ1Zy5jIik7CisKKwlpZiAoc3RybmNtcChwYXRoLCBfX0ZJTEVfXywgc2tpcCkpCisJCXNraXAgPSAwOyAvKiBwcmVmaXggbWlzbWF0Y2gsIGRvbid0IHNraXAgKi8KKworCXJldHVybiBwYXRoICsgc2tpcDsKK30KKworc3RhdGljIHN0cnVjdCB7IHVuc2lnbmVkIGZsYWc6ODsgY2hhciBvcHRfY2hhcjsgfSBvcHRfYXJyYXlbXSA9IHsKKwl7IF9EUFJJTlRLX0ZMQUdTX1BSSU5ULCAncCcgfSwKKwl7IF9EUFJJTlRLX0ZMQUdTX0lOQ0xfTU9ETkFNRSwgJ20nIH0sCisJeyBfRFBSSU5US19GTEFHU19JTkNMX0ZVTkNOQU1FLCAnZicgfSwKKwl7IF9EUFJJTlRLX0ZMQUdTX0lOQ0xfTElORU5PLCAnbCcgfSwKKwl7IF9EUFJJTlRLX0ZMQUdTX0lOQ0xfVElELCAndCcgfSwKKwl7IF9EUFJJTlRLX0ZMQUdTX05PTkUsICdfJyB9LAorfTsKKworc3RydWN0IGZsYWdzYnVmIHsgY2hhciBidWZbQVJSQVlfU0laRShvcHRfYXJyYXkpKzFdOyB9OworCisvKiBmb3JtYXQgYSBzdHJpbmcgaW50byBidWZbXSB3aGljaCBkZXNjcmliZXMgdGhlIF9kZGVidWcncyBmbGFncyAqLworc3RhdGljIGNoYXIgKmRkZWJ1Z19kZXNjcmliZV9mbGFncyh1bnNpZ25lZCBpbnQgZmxhZ3MsIHN0cnVjdCBmbGFnc2J1ZiAqZmIpCit7CisJY2hhciAqcCA9IGZiLT5idWY7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvcHRfYXJyYXkpOyArK2kpCisJCWlmIChmbGFncyAmIG9wdF9hcnJheVtpXS5mbGFnKQorCQkJKnArKyA9IG9wdF9hcnJheVtpXS5vcHRfY2hhcjsKKwlpZiAocCA9PSBmYi0+YnVmKQorCQkqcCsrID0gJ18nOworCSpwID0gJ1wwJzsKKworCXJldHVybiBmYi0+YnVmOworfQorCisjZGVmaW5lIHZwcl9pbmZvKGZtdCwgLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJXAorCWlmICh2ZXJib3NlKQkJCQkJCVwKKwkJcHJfaW5mbyhmbXQsICMjX19WQV9BUkdTX18pOwkJCVwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHZwcl9pbmZvX2RxKGNvbnN0IHN0cnVjdCBkZGVidWdfcXVlcnkgKnF1ZXJ5LCBjb25zdCBjaGFyICptc2cpCit7CisJLyogdHJpbSBhbnkgdHJhaWxpbmcgbmV3bGluZXMgKi8KKwlpbnQgZm10bGVuID0gMDsKKworCWlmIChxdWVyeS0+Zm9ybWF0KSB7CisJCWZtdGxlbiA9IHN0cmxlbihxdWVyeS0+Zm9ybWF0KTsKKwkJd2hpbGUgKGZtdGxlbiAmJiBxdWVyeS0+Zm9ybWF0W2ZtdGxlbiAtIDFdID09ICdcbicpCisJCQlmbXRsZW4tLTsKKwl9CisKKwl2cHJfaW5mbygiJXM6IGZ1bmM9XCIlc1wiIGZpbGU9XCIlc1wiIG1vZHVsZT1cIiVzXCIgZm9ybWF0PVwiJS4qc1wiIGxpbmVubz0ldS0ldVxuIiwKKwkJIG1zZywKKwkJIHF1ZXJ5LT5mdW5jdGlvbiA/IHF1ZXJ5LT5mdW5jdGlvbiA6ICIiLAorCQkgcXVlcnktPmZpbGVuYW1lID8gcXVlcnktPmZpbGVuYW1lIDogIiIsCisJCSBxdWVyeS0+bW9kdWxlID8gcXVlcnktPm1vZHVsZSA6ICIiLAorCQkgZm10bGVuLCBxdWVyeS0+Zm9ybWF0ID8gcXVlcnktPmZvcm1hdCA6ICIiLAorCQkgcXVlcnktPmZpcnN0X2xpbmVubywgcXVlcnktPmxhc3RfbGluZW5vKTsKK30KKworLyoKKyAqIFNlYXJjaCB0aGUgdGFibGVzIGZvciBfZGRlYnVnJ3Mgd2hpY2ggbWF0Y2ggdGhlIGdpdmVuIGBxdWVyeScgYW5kCisgKiBhcHBseSB0aGUgYGZsYWdzJyBhbmQgYG1hc2snIHRvIHRoZW0uICBSZXR1cm5zIG51bWJlciBvZiBtYXRjaGluZworICogY2FsbHNpdGVzLCBub3JtYWxseSB0aGUgc2FtZSBhcyBudW1iZXIgb2YgY2hhbmdlcy4gIElmIHZlcmJvc2UsCisgKiBsb2dzIHRoZSBjaGFuZ2VzLiAgVGFrZXMgZGRlYnVnX2xvY2suCisgKi8KK3N0YXRpYyBpbnQgZGRlYnVnX2NoYW5nZShjb25zdCBzdHJ1Y3QgZGRlYnVnX3F1ZXJ5ICpxdWVyeSwKKwkJCXVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IG1hc2spCit7CisJaW50IGk7CisJc3RydWN0IGRkZWJ1Z190YWJsZSAqZHQ7CisJdW5zaWduZWQgaW50IG5ld2ZsYWdzOworCXVuc2lnbmVkIGludCBuZm91bmQgPSAwOworCXN0cnVjdCBmbGFnc2J1ZiBmYnVmOworCisJLyogc2VhcmNoIGZvciBtYXRjaGluZyBkZGVidWdzICovCisJbXV0ZXhfbG9jaygmZGRlYnVnX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHQsICZkZGVidWdfdGFibGVzLCBsaW5rKSB7CisKKwkJLyogbWF0Y2ggYWdhaW5zdCB0aGUgbW9kdWxlIG5hbWUgKi8KKwkJaWYgKHF1ZXJ5LT5tb2R1bGUgJiYKKwkJICAgICFtYXRjaF93aWxkY2FyZChxdWVyeS0+bW9kdWxlLCBkdC0+bW9kX25hbWUpKQorCQkJY29udGludWU7CisKKwkJZm9yIChpID0gMDsgaSA8IGR0LT5udW1fZGRlYnVnczsgaSsrKSB7CisJCQlzdHJ1Y3QgX2RkZWJ1ZyAqZHAgPSAmZHQtPmRkZWJ1Z3NbaV07CisKKwkJCS8qIG1hdGNoIGFnYWluc3QgdGhlIHNvdXJjZSBmaWxlbmFtZSAqLworCQkJaWYgKHF1ZXJ5LT5maWxlbmFtZSAmJgorCQkJICAgICFtYXRjaF93aWxkY2FyZChxdWVyeS0+ZmlsZW5hbWUsIGRwLT5maWxlbmFtZSkgJiYKKwkJCSAgICAhbWF0Y2hfd2lsZGNhcmQocXVlcnktPmZpbGVuYW1lLAorCQkJCQkgICBrYmFzZW5hbWUoZHAtPmZpbGVuYW1lKSkgJiYKKwkJCSAgICAhbWF0Y2hfd2lsZGNhcmQocXVlcnktPmZpbGVuYW1lLAorCQkJCQkgICB0cmltX3ByZWZpeChkcC0+ZmlsZW5hbWUpKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogbWF0Y2ggYWdhaW5zdCB0aGUgZnVuY3Rpb24gKi8KKwkJCWlmIChxdWVyeS0+ZnVuY3Rpb24gJiYKKwkJCSAgICAhbWF0Y2hfd2lsZGNhcmQocXVlcnktPmZ1bmN0aW9uLCBkcC0+ZnVuY3Rpb24pKQorCQkJCWNvbnRpbnVlOworCisJCQkvKiBtYXRjaCBhZ2FpbnN0IHRoZSBmb3JtYXQgKi8KKwkJCWlmIChxdWVyeS0+Zm9ybWF0ICYmCisJCQkgICAgIXN0cnN0cihkcC0+Zm9ybWF0LCBxdWVyeS0+Zm9ybWF0KSkKKwkJCQljb250aW51ZTsKKworCQkJLyogbWF0Y2ggYWdhaW5zdCB0aGUgbGluZSBudW1iZXIgcmFuZ2UgKi8KKwkJCWlmIChxdWVyeS0+Zmlyc3RfbGluZW5vICYmCisJCQkgICAgZHAtPmxpbmVubyA8IHF1ZXJ5LT5maXJzdF9saW5lbm8pCisJCQkJY29udGludWU7CisJCQlpZiAocXVlcnktPmxhc3RfbGluZW5vICYmCisJCQkgICAgZHAtPmxpbmVubyA+IHF1ZXJ5LT5sYXN0X2xpbmVubykKKwkJCQljb250aW51ZTsKKworCQkJbmZvdW5kKys7CisKKwkJCW5ld2ZsYWdzID0gKGRwLT5mbGFncyAmIG1hc2spIHwgZmxhZ3M7CisJCQlpZiAobmV3ZmxhZ3MgPT0gZHAtPmZsYWdzKQorCQkJCWNvbnRpbnVlOworI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAorCQkJaWYgKGRwLT5mbGFncyAmIF9EUFJJTlRLX0ZMQUdTX1BSSU5UKSB7CisJCQkJaWYgKCEoZmxhZ3MgJiBfRFBSSU5US19GTEFHU19QUklOVCkpCisJCQkJCXN0YXRpY19icmFuY2hfZGlzYWJsZSgmZHAtPmtleS5kZF9rZXlfdHJ1ZSk7CisJCQl9IGVsc2UgaWYgKGZsYWdzICYgX0RQUklOVEtfRkxBR1NfUFJJTlQpCisJCQkJc3RhdGljX2JyYW5jaF9lbmFibGUoJmRwLT5rZXkuZGRfa2V5X3RydWUpOworI2VuZGlmCisJCQlkcC0+ZmxhZ3MgPSBuZXdmbGFnczsKKwkJCXZwcl9pbmZvKCJjaGFuZ2VkICVzOiVkIFslc10lcyA9JXNcbiIsCisJCQkJIHRyaW1fcHJlZml4KGRwLT5maWxlbmFtZSksIGRwLT5saW5lbm8sCisJCQkJIGR0LT5tb2RfbmFtZSwgZHAtPmZ1bmN0aW9uLAorCQkJCSBkZGVidWdfZGVzY3JpYmVfZmxhZ3MoZHAtPmZsYWdzLCAmZmJ1ZikpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmZGRlYnVnX2xvY2spOworCisJaWYgKCFuZm91bmQgJiYgdmVyYm9zZSkKKwkJcHJfaW5mbygibm8gbWF0Y2hlcyBmb3IgcXVlcnlcbiIpOworCisJcmV0dXJuIG5mb3VuZDsKK30KKworLyoKKyAqIFNwbGl0IHRoZSBidWZmZXIgYGJ1ZicgaW50byBzcGFjZS1zZXBhcmF0ZWQgd29yZHMuCisgKiBIYW5kbGVzIHNpbXBsZSAiIGFuZCAnIHF1b3RpbmcsIGkuZS4gd2l0aG91dCBuZXN0ZWQsCisgKiBlbWJlZGRlZCBvciBlc2NhcGVkIFwiLiAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygd29yZHMKKyAqIG9yIDwwIG9uIGVycm9yLgorICovCitzdGF0aWMgaW50IGRkZWJ1Z190b2tlbml6ZShjaGFyICpidWYsIGNoYXIgKndvcmRzW10sIGludCBtYXh3b3JkcykKK3sKKwlpbnQgbndvcmRzID0gMDsKKworCXdoaWxlICgqYnVmKSB7CisJCWNoYXIgKmVuZDsKKworCQkvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworCQlidWYgPSBza2lwX3NwYWNlcyhidWYpOworCQlpZiAoISpidWYpCisJCQlicmVhazsJLyogb2gsIGl0IHdhcyB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJCWlmICgqYnVmID09ICcjJykKKwkJCWJyZWFrOwkvKiB0b2tlbiBzdGFydHMgY29tbWVudCwgc2tpcCByZXN0IG9mIGxpbmUgKi8KKworCQkvKiBmaW5kIGBlbmQnIG9mIHdvcmQsIHdoaXRlc3BhY2Ugc2VwYXJhdGVkIG9yIHF1b3RlZCAqLworCQlpZiAoKmJ1ZiA9PSAnIicgfHwgKmJ1ZiA9PSAnXCcnKSB7CisJCQlpbnQgcXVvdGUgPSAqYnVmKys7CisJCQlmb3IgKGVuZCA9IGJ1ZjsgKmVuZCAmJiAqZW5kICE9IHF1b3RlOyBlbmQrKykKKwkJCQk7CisJCQlpZiAoISplbmQpIHsKKwkJCQlwcl9lcnIoInVuY2xvc2VkIHF1b3RlOiAlc1xuIiwgYnVmKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsJLyogdW5jbG9zZWQgcXVvdGUgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoZW5kID0gYnVmOyAqZW5kICYmICFpc3NwYWNlKCplbmQpOyBlbmQrKykKKwkJCQk7CisJCQlCVUdfT04oZW5kID09IGJ1Zik7CisJCX0KKworCQkvKiBgYnVmJyBpcyBzdGFydCBvZiB3b3JkLCBgZW5kJyBpcyBvbmUgcGFzdCBpdHMgZW5kICovCisJCWlmIChud29yZHMgPT0gbWF4d29yZHMpIHsKKwkJCXByX2VycigidG9vIG1hbnkgd29yZHMsIGxlZ2FsIG1heCA8PSVkXG4iLCBtYXh3b3Jkcyk7CisJCQlyZXR1cm4gLUVJTlZBTDsJLyogcmFuIG91dCBvZiB3b3Jkc1tdIGJlZm9yZSBieXRlcyAqLworCQl9CisJCWlmICgqZW5kKQorCQkJKmVuZCsrID0gJ1wwJzsJLyogdGVybWluYXRlIHRoZSB3b3JkICovCisJCXdvcmRzW253b3JkcysrXSA9IGJ1ZjsKKwkJYnVmID0gZW5kOworCX0KKworCWlmICh2ZXJib3NlKSB7CisJCWludCBpOworCQlwcl9pbmZvKCJzcGxpdCBpbnRvIHdvcmRzOiIpOworCQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCisJCQlwcl9jb250KCIgXCIlc1wiIiwgd29yZHNbaV0pOworCQlwcl9jb250KCJcbiIpOworCX0KKworCXJldHVybiBud29yZHM7Cit9CisKKy8qCisgKiBQYXJzZSBhIHNpbmdsZSBsaW5lIG51bWJlci4gIE5vdGUgdGhhdCB0aGUgZW1wdHkgc3RyaW5nICIiCisgKiBpcyB0cmVhdGVkIGFzIGEgc3BlY2lhbCBjYXNlIGFuZCBjb252ZXJ0ZWQgdG8gemVybywgd2hpY2gKKyAqIGlzIGxhdGVyIHRyZWF0ZWQgYXMgYSAiZG9uJ3QgY2FyZSIgdmFsdWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHBhcnNlX2xpbmVubyhjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIGludCAqdmFsKQoreworCUJVR19PTihzdHIgPT0gTlVMTCk7CisJaWYgKCpzdHIgPT0gJ1wwJykgeworCQkqdmFsID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChrc3RydG91aW50KHN0ciwgMTAsIHZhbCkgPCAwKSB7CisJCXByX2VycigiYmFkIGxpbmUtbnVtYmVyOiAlc1xuIiwgc3RyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX3NldChjb25zdCBjaGFyICoqZGVzdCwgY2hhciAqc3JjLCBjaGFyICpuYW1lKQoreworCWludCByYyA9IDA7CisKKwlpZiAoKmRlc3QpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlwcl9lcnIoIm1hdGNoLXNwZWM6JXMgdmFsOiVzIG92ZXJyaWRkZW4gYnkgJXNcbiIsCisJCSAgICAgICBuYW1lLCAqZGVzdCwgc3JjKTsKKwl9CisJKmRlc3QgPSBzcmM7CisJcmV0dXJuIHJjOworfQorCisvKgorICogUGFyc2Ugd29yZHNbXSBhcyBhIGRkZWJ1ZyBxdWVyeSBzcGVjaWZpY2F0aW9uLCB3aGljaCBpcyBhIHNlcmllcworICogb2YgKGtleXdvcmQsIHZhbHVlKSBwYWlycyBjaG9zZW4gZnJvbSB0aGVzZSBwb3NzaWJpbGl0aWVzOgorICoKKyAqIGZ1bmMgPGZ1bmN0aW9uLW5hbWU+CisgKiBmaWxlIDxmdWxsLXBhdGhuYW1lPgorICogZmlsZSA8YmFzZS1maWxlbmFtZT4KKyAqIG1vZHVsZSA8bW9kdWxlLW5hbWU+CisgKiBmb3JtYXQgPGVzY2FwZWQtc3RyaW5nLXRvLWZpbmQtaW4tZm9ybWF0PgorICogbGluZSA8bGluZW5vPgorICogbGluZSA8Zmlyc3QtbGluZW5vPi08bGFzdC1saW5lbm8+IC8vIHdoZXJlIGVpdGhlciBtYXkgYmUgZW1wdHkKKyAqCisgKiBPbmx5IDEgb2YgZWFjaCB0eXBlIGlzIGFsbG93ZWQuCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgPDAgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZGRlYnVnX3BhcnNlX3F1ZXJ5KGNoYXIgKndvcmRzW10sIGludCBud29yZHMsCisJCQlzdHJ1Y3QgZGRlYnVnX3F1ZXJ5ICpxdWVyeSwgY29uc3QgY2hhciAqbW9kbmFtZSkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmMgPSAwOworCisJLyogY2hlY2sgd2UgaGF2ZSBhbiBldmVuIG51bWJlciBvZiB3b3JkcyAqLworCWlmIChud29yZHMgJSAyICE9IDApIHsKKwkJcHJfZXJyKCJleHBlY3RpbmcgcGFpcnMgb2YgbWF0Y2gtc3BlYyA8dmFsdWU+XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1lbXNldChxdWVyeSwgMCwgc2l6ZW9mKCpxdWVyeSkpOworCisJaWYgKG1vZG5hbWUpCisJCS8qIHN1cHBvcnQgJG1vZG5hbWUuZHluZGJnPTxtdWx0aXBsZSBxdWVyaWVzPiAqLworCQlxdWVyeS0+bW9kdWxlID0gbW9kbmFtZTsKKworCWZvciAoaSA9IDA7IGkgPCBud29yZHM7IGkgKz0gMikgeworCQlpZiAoIXN0cmNtcCh3b3Jkc1tpXSwgImZ1bmMiKSkgeworCQkJcmMgPSBjaGVja19zZXQoJnF1ZXJ5LT5mdW5jdGlvbiwgd29yZHNbaSsxXSwgImZ1bmMiKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHdvcmRzW2ldLCAiZmlsZSIpKSB7CisJCQlyYyA9IGNoZWNrX3NldCgmcXVlcnktPmZpbGVuYW1lLCB3b3Jkc1tpKzFdLCAiZmlsZSIpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAod29yZHNbaV0sICJtb2R1bGUiKSkgeworCQkJcmMgPSBjaGVja19zZXQoJnF1ZXJ5LT5tb2R1bGUsIHdvcmRzW2krMV0sICJtb2R1bGUiKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHdvcmRzW2ldLCAiZm9ybWF0IikpIHsKKwkJCXN0cmluZ191bmVzY2FwZV9pbnBsYWNlKHdvcmRzW2krMV0sIFVORVNDQVBFX1NQQUNFIHwKKwkJCQkJCQkgICAgVU5FU0NBUEVfT0NUQUwgfAorCQkJCQkJCSAgICBVTkVTQ0FQRV9TUEVDSUFMKTsKKwkJCXJjID0gY2hlY2tfc2V0KCZxdWVyeS0+Zm9ybWF0LCB3b3Jkc1tpKzFdLCAiZm9ybWF0Iik7CisJCX0gZWxzZSBpZiAoIXN0cmNtcCh3b3Jkc1tpXSwgImxpbmUiKSkgeworCQkJY2hhciAqZmlyc3QgPSB3b3Jkc1tpKzFdOworCQkJY2hhciAqbGFzdCA9IHN0cmNocihmaXJzdCwgJy0nKTsKKwkJCWlmIChxdWVyeS0+Zmlyc3RfbGluZW5vIHx8IHF1ZXJ5LT5sYXN0X2xpbmVubykgeworCQkJCXByX2VycigibWF0Y2gtc3BlYzogbGluZSB1c2VkIDJ4XG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChsYXN0KQorCQkJCSpsYXN0KysgPSAnXDAnOworCQkJaWYgKHBhcnNlX2xpbmVubyhmaXJzdCwgJnF1ZXJ5LT5maXJzdF9saW5lbm8pIDwgMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChsYXN0KSB7CisJCQkJLyogcmFuZ2UgPGZpcnN0Pi08bGFzdD4gKi8KKwkJCQlpZiAocGFyc2VfbGluZW5vKGxhc3QsICZxdWVyeS0+bGFzdF9saW5lbm8pIDwgMCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCQkvKiBzcGVjaWFsIGNhc2UgZm9yIGxhc3QgbGluZW5vIG5vdCBzcGVjaWZpZWQgKi8KKwkJCQlpZiAocXVlcnktPmxhc3RfbGluZW5vID09IDApCisJCQkJCXF1ZXJ5LT5sYXN0X2xpbmVubyA9IFVJTlRfTUFYOworCisJCQkJaWYgKHF1ZXJ5LT5sYXN0X2xpbmVubyA8IHF1ZXJ5LT5maXJzdF9saW5lbm8pIHsKKwkJCQkJcHJfZXJyKCJsYXN0LWxpbmU6JWQgPCAxc3QtbGluZTolZFxuIiwKKwkJCQkJCXF1ZXJ5LT5sYXN0X2xpbmVubywKKwkJCQkJCXF1ZXJ5LT5maXJzdF9saW5lbm8pOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXF1ZXJ5LT5sYXN0X2xpbmVubyA9IHF1ZXJ5LT5maXJzdF9saW5lbm87CisJCQl9CisJCX0gZWxzZSB7CisJCQlwcl9lcnIoInVua25vd24ga2V5d29yZCBcIiVzXCJcbiIsIHdvcmRzW2ldKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChyYykKKwkJCXJldHVybiByYzsKKwl9CisJdnByX2luZm9fZHEocXVlcnksICJwYXJzZWQiKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIGBzdHInIGFzIGEgZmxhZ3Mgc3BlY2lmaWNhdGlvbiwgZm9ybWF0IFstKz1dW3BdKy4KKyAqIFNldHMgdXAgKm1hc2twIGFuZCAqZmxhZ3NwIHRvIGJlIHVzZWQgd2hlbiBjaGFuZ2luZyB0aGUKKyAqIGZsYWdzIGZpZWxkcyBvZiBtYXRjaGVkIF9kZGVidWcncy4gIFJldHVybnMgMCBvbiBzdWNjZXNzCisgKiBvciA8MCBvbiBlcnJvci4KKyAqLworc3RhdGljIGludCBkZGVidWdfcGFyc2VfZmxhZ3MoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBpbnQgKmZsYWdzcCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKm1hc2twKQoreworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwlpbnQgb3AgPSAnPScsIGk7CisKKwlzd2l0Y2ggKCpzdHIpIHsKKwljYXNlICcrJzoKKwljYXNlICctJzoKKwljYXNlICc9JzoKKwkJb3AgPSAqc3RyKys7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2VycigiYmFkIGZsYWctb3AgJWMsIGF0IHN0YXJ0IG9mICVzXG4iLCAqc3RyLCBzdHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdnByX2luZm8oIm9wPSclYydcbiIsIG9wKTsKKworCWZvciAoOyAqc3RyIDsgKytzdHIpIHsKKwkJZm9yIChpID0gQVJSQVlfU0laRShvcHRfYXJyYXkpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmICgqc3RyID09IG9wdF9hcnJheVtpXS5vcHRfY2hhcikgeworCQkJCWZsYWdzIHw9IG9wdF9hcnJheVtpXS5mbGFnOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChpIDwgMCkgeworCQkJcHJfZXJyKCJ1bmtub3duIGZsYWcgJyVjJyBpbiBcIiVzXCJcbiIsICpzdHIsIHN0cik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwl2cHJfaW5mbygiZmxhZ3M9MHgleFxuIiwgZmxhZ3MpOworCisJLyogY2FsY3VsYXRlIGZpbmFsICpmbGFnc3AsICptYXNrcCBhY2NvcmRpbmcgdG8gbWFzayBhbmQgb3AgKi8KKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSAnPSc6CisJCSptYXNrcCA9IDA7CisJCSpmbGFnc3AgPSBmbGFnczsKKwkJYnJlYWs7CisJY2FzZSAnKyc6CisJCSptYXNrcCA9IH4wVTsKKwkJKmZsYWdzcCA9IGZsYWdzOworCQlicmVhazsKKwljYXNlICctJzoKKwkJKm1hc2twID0gfmZsYWdzOworCQkqZmxhZ3NwID0gMDsKKwkJYnJlYWs7CisJfQorCXZwcl9pbmZvKCIqZmxhZ3NwPTB4JXggKm1hc2twPTB4JXhcbiIsICpmbGFnc3AsICptYXNrcCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGRlYnVnX2V4ZWNfcXVlcnkoY2hhciAqcXVlcnlfc3RyaW5nLCBjb25zdCBjaGFyICptb2RuYW1lKQoreworCXVuc2lnbmVkIGludCBmbGFncyA9IDAsIG1hc2sgPSAwOworCXN0cnVjdCBkZGVidWdfcXVlcnkgcXVlcnk7CisjZGVmaW5lIE1BWFdPUkRTIDkKKwlpbnQgbndvcmRzLCBuZm91bmQ7CisJY2hhciAqd29yZHNbTUFYV09SRFNdOworCisJbndvcmRzID0gZGRlYnVnX3Rva2VuaXplKHF1ZXJ5X3N0cmluZywgd29yZHMsIE1BWFdPUkRTKTsKKwlpZiAobndvcmRzIDw9IDApIHsKKwkJcHJfZXJyKCJ0b2tlbml6ZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogY2hlY2sgZmxhZ3MgMXN0IChsYXN0IGFyZykgc28gcXVlcnkgaXMgcGFpcnMgb2Ygc3BlYyx2YWwgKi8KKwlpZiAoZGRlYnVnX3BhcnNlX2ZsYWdzKHdvcmRzW253b3Jkcy0xXSwgJmZsYWdzLCAmbWFzaykpIHsKKwkJcHJfZXJyKCJmbGFncyBwYXJzZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGRkZWJ1Z19wYXJzZV9xdWVyeSh3b3JkcywgbndvcmRzLTEsICZxdWVyeSwgbW9kbmFtZSkpIHsKKwkJcHJfZXJyKCJxdWVyeSBwYXJzZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogYWN0dWFsbHkgZ28gYW5kIGltcGxlbWVudCB0aGUgY2hhbmdlICovCisJbmZvdW5kID0gZGRlYnVnX2NoYW5nZSgmcXVlcnksIGZsYWdzLCBtYXNrKTsKKwl2cHJfaW5mb19kcSgmcXVlcnksIG5mb3VuZCA/ICJhcHBsaWVkIiA6ICJuby1tYXRjaCIpOworCisJcmV0dXJuIG5mb3VuZDsKK30KKworLyogaGFuZGxlIG11bHRpcGxlIHF1ZXJpZXMgaW4gcXVlcnkgc3RyaW5nLCBjb250aW51ZSBvbiBlcnJvciwgcmV0dXJuCisgICBsYXN0IGVycm9yIG9yIG51bWJlciBvZiBtYXRjaGluZyBjYWxsc2l0ZXMuICBNb2R1bGUgbmFtZSBpcyBlaXRoZXIKKyAgIGluIHBhcmFtIChmb3IgYm9vdCBhcmcpIG9yIHBlcmhhcHMgaW4gcXVlcnkgc3RyaW5nLgorKi8KK3N0YXRpYyBpbnQgZGRlYnVnX2V4ZWNfcXVlcmllcyhjaGFyICpxdWVyeSwgY29uc3QgY2hhciAqbW9kbmFtZSkKK3sKKwljaGFyICpzcGxpdDsKKwlpbnQgaSwgZXJycyA9IDAsIGV4aXRjb2RlID0gMCwgcmMsIG5mb3VuZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBxdWVyeTsgcXVlcnkgPSBzcGxpdCkgeworCQlzcGxpdCA9IHN0cnBicmsocXVlcnksICI7XG4iKTsKKwkJaWYgKHNwbGl0KQorCQkJKnNwbGl0KysgPSAnXDAnOworCisJCXF1ZXJ5ID0gc2tpcF9zcGFjZXMocXVlcnkpOworCQlpZiAoIXF1ZXJ5IHx8ICEqcXVlcnkgfHwgKnF1ZXJ5ID09ICcjJykKKwkJCWNvbnRpbnVlOworCisJCXZwcl9pbmZvKCJxdWVyeSAlZDogXCIlc1wiXG4iLCBpLCBxdWVyeSk7CisKKwkJcmMgPSBkZGVidWdfZXhlY19xdWVyeShxdWVyeSwgbW9kbmFtZSk7CisJCWlmIChyYyA8IDApIHsKKwkJCWVycnMrKzsKKwkJCWV4aXRjb2RlID0gcmM7CisJCX0gZWxzZSB7CisJCQluZm91bmQgKz0gcmM7CisJCX0KKwkJaSsrOworCX0KKwl2cHJfaW5mbygicHJvY2Vzc2VkICVkIHF1ZXJpZXMsIHdpdGggJWQgbWF0Y2hlcywgJWQgZXJyc1xuIiwKKwkJIGksIG5mb3VuZCwgZXJycyk7CisKKwlpZiAoZXhpdGNvZGUpCisJCXJldHVybiBleGl0Y29kZTsKKwlyZXR1cm4gbmZvdW5kOworfQorCisjZGVmaW5lIFBSRUZJWF9TSVpFIDY0CisKK3N0YXRpYyBpbnQgcmVtYWluaW5nKGludCB3cm90ZSkKK3sKKwlpZiAoUFJFRklYX1NJWkUgLSB3cm90ZSA+IDApCisJCXJldHVybiBQUkVGSVhfU0laRSAtIHdyb3RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqZHluYW1pY19lbWl0X3ByZWZpeChjb25zdCBzdHJ1Y3QgX2RkZWJ1ZyAqZGVzYywgY2hhciAqYnVmKQoreworCWludCBwb3NfYWZ0ZXJfdGlkOworCWludCBwb3MgPSAwOworCisJKmJ1ZiA9ICdcMCc7CisKKwlpZiAoZGVzYy0+ZmxhZ3MgJiBfRFBSSU5US19GTEFHU19JTkNMX1RJRCkgeworCQlpZiAoaW5faW50ZXJydXB0KCkpCisJCQlwb3MgKz0gc25wcmludGYoYnVmICsgcG9zLCByZW1haW5pbmcocG9zKSwgIjxpbnRyPiAiKTsKKwkJZWxzZQorCQkJcG9zICs9IHNucHJpbnRmKGJ1ZiArIHBvcywgcmVtYWluaW5nKHBvcyksICJbJWRdICIsCisJCQkJCXRhc2tfcGlkX3ZucihjdXJyZW50KSk7CisJfQorCXBvc19hZnRlcl90aWQgPSBwb3M7CisJaWYgKGRlc2MtPmZsYWdzICYgX0RQUklOVEtfRkxBR1NfSU5DTF9NT0ROQU1FKQorCQlwb3MgKz0gc25wcmludGYoYnVmICsgcG9zLCByZW1haW5pbmcocG9zKSwgIiVzOiIsCisJCQkJZGVzYy0+bW9kbmFtZSk7CisJaWYgKGRlc2MtPmZsYWdzICYgX0RQUklOVEtfRkxBR1NfSU5DTF9GVU5DTkFNRSkKKwkJcG9zICs9IHNucHJpbnRmKGJ1ZiArIHBvcywgcmVtYWluaW5nKHBvcyksICIlczoiLAorCQkJCWRlc2MtPmZ1bmN0aW9uKTsKKwlpZiAoZGVzYy0+ZmxhZ3MgJiBfRFBSSU5US19GTEFHU19JTkNMX0xJTkVOTykKKwkJcG9zICs9IHNucHJpbnRmKGJ1ZiArIHBvcywgcmVtYWluaW5nKHBvcyksICIlZDoiLAorCQkJCWRlc2MtPmxpbmVubyk7CisJaWYgKHBvcyAtIHBvc19hZnRlcl90aWQpCisJCXBvcyArPSBzbnByaW50ZihidWYgKyBwb3MsIHJlbWFpbmluZyhwb3MpLCAiICIpOworCWlmIChwb3MgPj0gUFJFRklYX1NJWkUpCisJCWJ1ZltQUkVGSVhfU0laRSAtIDFdID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisKK3ZvaWQgX19keW5hbWljX3ByX2RlYnVnKHN0cnVjdCBfZGRlYnVnICpkZXNjcmlwdG9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJY2hhciBidWZbUFJFRklYX1NJWkVdOworCisJQlVHX09OKCFkZXNjcmlwdG9yKTsKKwlCVUdfT04oIWZtdCk7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCXByaW50ayhLRVJOX0RFQlVHICIlcyVwViIsIGR5bmFtaWNfZW1pdF9wcmVmaXgoZGVzY3JpcHRvciwgYnVmKSwgJnZhZik7CisKKwl2YV9lbmQoYXJncyk7Cit9CitFWFBPUlRfU1lNQk9MKF9fZHluYW1pY19wcl9kZWJ1Zyk7CisKK3ZvaWQgX19keW5hbWljX2Rldl9kYmcoc3RydWN0IF9kZGVidWcgKmRlc2NyaXB0b3IsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CisJdmFfbGlzdCBhcmdzOworCisJQlVHX09OKCFkZXNjcmlwdG9yKTsKKwlCVUdfT04oIWZtdCk7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCisJdmFmLmZtdCA9IGZtdDsKKwl2YWYudmEgPSAmYXJnczsKKworCWlmICghZGV2KSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIoTlVMTCBkZXZpY2UgKik6ICVwViIsICZ2YWYpOworCX0gZWxzZSB7CisJCWNoYXIgYnVmW1BSRUZJWF9TSVpFXTsKKworCQlkZXZfcHJpbnRrX2VtaXQoTE9HTEVWRUxfREVCVUcsIGRldiwgIiVzJXMgJXM6ICVwViIsCisJCQkJZHluYW1pY19lbWl0X3ByZWZpeChkZXNjcmlwdG9yLCBidWYpLAorCQkJCWRldl9kcml2ZXJfc3RyaW5nKGRldiksIGRldl9uYW1lKGRldiksCisJCQkJJnZhZik7CisJfQorCisJdmFfZW5kKGFyZ3MpOworfQorRVhQT1JUX1NZTUJPTChfX2R5bmFtaWNfZGV2X2RiZyk7CisKKyNpZmRlZiBDT05GSUdfTkVUCisKK3ZvaWQgX19keW5hbWljX25ldGRldl9kYmcoc3RydWN0IF9kZGVidWcgKmRlc2NyaXB0b3IsCisJCQkgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXN0cnVjdCB2YV9mb3JtYXQgdmFmOworCXZhX2xpc3QgYXJnczsKKworCUJVR19PTighZGVzY3JpcHRvcik7CisJQlVHX09OKCFmbXQpOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKworCXZhZi5mbXQgPSBmbXQ7CisJdmFmLnZhID0gJmFyZ3M7CisKKwlpZiAoZGV2ICYmIGRldi0+ZGV2LnBhcmVudCkgeworCQljaGFyIGJ1ZltQUkVGSVhfU0laRV07CisKKwkJZGV2X3ByaW50a19lbWl0KExPR0xFVkVMX0RFQlVHLCBkZXYtPmRldi5wYXJlbnQsCisJCQkJIiVzJXMgJXMgJXMlczogJXBWIiwKKwkJCQlkeW5hbWljX2VtaXRfcHJlZml4KGRlc2NyaXB0b3IsIGJ1ZiksCisJCQkJZGV2X2RyaXZlcl9zdHJpbmcoZGV2LT5kZXYucGFyZW50KSwKKwkJCQlkZXZfbmFtZShkZXYtPmRldi5wYXJlbnQpLAorCQkJCW5ldGRldl9uYW1lKGRldiksIG5ldGRldl9yZWdfc3RhdGUoZGV2KSwKKwkJCQkmdmFmKTsKKwl9IGVsc2UgaWYgKGRldikgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMlczogJXBWIiwgbmV0ZGV2X25hbWUoZGV2KSwKKwkJICAgICAgIG5ldGRldl9yZWdfc3RhdGUoZGV2KSwgJnZhZik7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIihOVUxMIG5ldF9kZXZpY2UpOiAlcFYiLCAmdmFmKTsKKwl9CisKKwl2YV9lbmQoYXJncyk7Cit9CitFWFBPUlRfU1lNQk9MKF9fZHluYW1pY19uZXRkZXZfZGJnKTsKKworI2VuZGlmCisKKyNkZWZpbmUgRERFQlVHX1NUUklOR19TSVpFIDEwMjQKK3N0YXRpYyBfX2luaXRkYXRhIGNoYXIgZGRlYnVnX3NldHVwX3N0cmluZ1tEREVCVUdfU1RSSU5HX1NJWkVdOworCitzdGF0aWMgX19pbml0IGludCBkZGVidWdfc2V0dXBfcXVlcnkoY2hhciAqc3RyKQoreworCWlmIChzdHJsZW4oc3RyKSA+PSBEREVCVUdfU1RSSU5HX1NJWkUpIHsKKwkJcHJfd2FybigiZGRlYnVnIGJvb3QgcGFyYW0gc3RyaW5nIHRvbyBsYXJnZVxuIik7CisJCXJldHVybiAwOworCX0KKwlzdHJsY3B5KGRkZWJ1Z19zZXR1cF9zdHJpbmcsIHN0ciwgRERFQlVHX1NUUklOR19TSVpFKTsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZGRlYnVnX3F1ZXJ5PSIsIGRkZWJ1Z19zZXR1cF9xdWVyeSk7CisKKy8qCisgKiBGaWxlX29wcy0+d3JpdGUgbWV0aG9kIGZvciA8ZGVidWdmcz4vZHluYW1pY19kZWJ1Zy9jb250cm9sLiAgR2F0aGVycyB0aGUKKyAqIGNvbW1hbmQgdGV4dCBmcm9tIHVzZXJzcGFjZSwgcGFyc2VzIGFuZCBleGVjdXRlcyBpdC4KKyAqLworI2RlZmluZSBVU0VSX0JVRl9QQUdFIDQwOTYKK3N0YXRpYyBzc2l6ZV90IGRkZWJ1Z19wcm9jX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1ZiwKKwkJCQkgIHNpemVfdCBsZW4sIGxvZmZfdCAqb2ZmcCkKK3sKKwljaGFyICp0bXBidWY7CisJaW50IHJldDsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGxlbiA+IFVTRVJfQlVGX1BBR0UgLSAxKSB7CisJCXByX3dhcm4oImV4cGVjdGVkIDwlZCBieXRlcyBpbnRvIGNvbnRyb2xcbiIsIFVTRVJfQlVGX1BBR0UpOworCQlyZXR1cm4gLUUyQklHOworCX0KKwl0bXBidWYgPSBtZW1kdXBfdXNlcl9udWwodWJ1ZiwgbGVuKTsKKwlpZiAoSVNfRVJSKHRtcGJ1ZikpCisJCXJldHVybiBQVFJfRVJSKHRtcGJ1Zik7CisJdnByX2luZm8oInJlYWQgJWQgYnl0ZXMgZnJvbSB1c2Vyc3BhY2VcbiIsIChpbnQpbGVuKTsKKworCXJldCA9IGRkZWJ1Z19leGVjX3F1ZXJpZXModG1wYnVmLCBOVUxMKTsKKwlrZnJlZSh0bXBidWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKm9mZnAgKz0gbGVuOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBTZXQgdGhlIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBfZGRlYnVnIG9iamVjdAorICogYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhhdCBmaXJzdCBvYmplY3QuICBSZXR1cm5zCisgKiBOVUxMIGlmIHRoZXJlIGFyZSBubyBfZGRlYnVncyBhdCBhbGwuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgX2RkZWJ1ZyAqZGRlYnVnX2l0ZXJfZmlyc3Qoc3RydWN0IGRkZWJ1Z19pdGVyICppdGVyKQoreworCWlmIChsaXN0X2VtcHR5KCZkZGVidWdfdGFibGVzKSkgeworCQlpdGVyLT50YWJsZSA9IE5VTEw7CisJCWl0ZXItPmlkeCA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKwlpdGVyLT50YWJsZSA9IGxpc3RfZW50cnkoZGRlYnVnX3RhYmxlcy5uZXh0LAorCQkJCSBzdHJ1Y3QgZGRlYnVnX3RhYmxlLCBsaW5rKTsKKwlpdGVyLT5pZHggPSAwOworCXJldHVybiAmaXRlci0+dGFibGUtPmRkZWJ1Z3NbaXRlci0+aWR4XTsKK30KKworLyoKKyAqIEFkdmFuY2UgdGhlIGl0ZXJhdG9yIHRvIHBvaW50IHRvIHRoZSBuZXh0IF9kZGVidWcKKyAqIG9iamVjdCBmcm9tIHRoZSBvbmUgdGhlIGl0ZXJhdG9yIGN1cnJlbnRseSBwb2ludHMgYXQsCisgKiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIG5ldyBfZGRlYnVnLiAgUmV0dXJucworICogTlVMTCBpZiB0aGUgaXRlcmF0b3IgaGFzIHNlZW4gYWxsIHRoZSBfZGRlYnVncy4KKyAqLworc3RhdGljIHN0cnVjdCBfZGRlYnVnICpkZGVidWdfaXRlcl9uZXh0KHN0cnVjdCBkZGVidWdfaXRlciAqaXRlcikKK3sKKwlpZiAoaXRlci0+dGFibGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCsraXRlci0+aWR4ID09IGl0ZXItPnRhYmxlLT5udW1fZGRlYnVncykgeworCQkvKiBpdGVyYXRlIHRvIG5leHQgdGFibGUgKi8KKwkJaXRlci0+aWR4ID0gMDsKKwkJaWYgKGxpc3RfaXNfbGFzdCgmaXRlci0+dGFibGUtPmxpbmssICZkZGVidWdfdGFibGVzKSkgeworCQkJaXRlci0+dGFibGUgPSBOVUxMOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJaXRlci0+dGFibGUgPSBsaXN0X2VudHJ5KGl0ZXItPnRhYmxlLT5saW5rLm5leHQsCisJCQkJCSBzdHJ1Y3QgZGRlYnVnX3RhYmxlLCBsaW5rKTsKKwl9CisJcmV0dXJuICZpdGVyLT50YWJsZS0+ZGRlYnVnc1tpdGVyLT5pZHhdOworfQorCisvKgorICogU2VxX29wcyBzdGFydCBtZXRob2QuICBDYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5CisgKiByZWFkKCkgY2FsbCBmcm9tIHVzZXJzcGFjZS4gIFRha2VzIHRoZSBkZGVidWdfbG9jayBhbmQKKyAqIHNlZWtzIHRoZSBzZXFfZmlsZSdzIGl0ZXJhdG9yIHRvIHRoZSBnaXZlbiBwb3NpdGlvbi4KKyAqLworc3RhdGljIHZvaWQgKmRkZWJ1Z19wcm9jX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGRkZWJ1Z19pdGVyICppdGVyID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgX2RkZWJ1ZyAqZHA7CisJaW50IG4gPSAqcG9zOworCisJdnByX2luZm8oImNhbGxlZCBtPSVwICpwb3M9JWxsZFxuIiwgbSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqcG9zKTsKKworCW11dGV4X2xvY2soJmRkZWJ1Z19sb2NrKTsKKworCWlmICghbikKKwkJcmV0dXJuIFNFUV9TVEFSVF9UT0tFTjsKKwlpZiAobiA8IDApCisJCXJldHVybiBOVUxMOworCWRwID0gZGRlYnVnX2l0ZXJfZmlyc3QoaXRlcik7CisJd2hpbGUgKGRwICE9IE5VTEwgJiYgLS1uID4gMCkKKwkJZHAgPSBkZGVidWdfaXRlcl9uZXh0KGl0ZXIpOworCXJldHVybiBkcDsKK30KKworLyoKKyAqIFNlcV9vcHMgbmV4dCBtZXRob2QuICBDYWxsZWQgc2V2ZXJhbCB0aW1lcyB3aXRoaW4gYSByZWFkKCkKKyAqIGNhbGwgZnJvbSB1c2Vyc3BhY2UsIHdpdGggZGRlYnVnX2xvY2sgaGVsZC4gIFdhbGtzIHRvIHRoZQorICogbmV4dCBfZGRlYnVnIG9iamVjdCB3aXRoIGEgc3BlY2lhbCBjYXNlIGZvciB0aGUgaGVhZGVyIGxpbmUuCisgKi8KK3N0YXRpYyB2b2lkICpkZGVidWdfcHJvY19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCwgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGRkZWJ1Z19pdGVyICppdGVyID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgX2RkZWJ1ZyAqZHA7CisKKwl2cHJfaW5mbygiY2FsbGVkIG09JXAgcD0lcCAqcG9zPSVsbGRcbiIsCisJCSBtLCBwLCAodW5zaWduZWQgbG9uZyBsb25nKSpwb3MpOworCisJaWYgKHAgPT0gU0VRX1NUQVJUX1RPS0VOKQorCQlkcCA9IGRkZWJ1Z19pdGVyX2ZpcnN0KGl0ZXIpOworCWVsc2UKKwkJZHAgPSBkZGVidWdfaXRlcl9uZXh0KGl0ZXIpOworCSsrKnBvczsKKwlyZXR1cm4gZHA7Cit9CisKKy8qCisgKiBTZXFfb3BzIHNob3cgbWV0aG9kLiAgQ2FsbGVkIHNldmVyYWwgdGltZXMgd2l0aGluIGEgcmVhZCgpCisgKiBjYWxsIGZyb20gdXNlcnNwYWNlLCB3aXRoIGRkZWJ1Z19sb2NrIGhlbGQuICBGb3JtYXRzIHRoZQorICogY3VycmVudCBfZGRlYnVnIGFzIGEgc2luZ2xlIGh1bWFuLXJlYWRhYmxlIGxpbmUsIHdpdGggYQorICogc3BlY2lhbCBjYXNlIGZvciB0aGUgaGVhZGVyIGxpbmUuCisgKi8KK3N0YXRpYyBpbnQgZGRlYnVnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCit7CisJc3RydWN0IGRkZWJ1Z19pdGVyICppdGVyID0gbS0+cHJpdmF0ZTsKKwlzdHJ1Y3QgX2RkZWJ1ZyAqZHAgPSBwOworCXN0cnVjdCBmbGFnc2J1ZiBmbGFnczsKKworCXZwcl9pbmZvKCJjYWxsZWQgbT0lcCBwPSVwXG4iLCBtLCBwKTsKKworCWlmIChwID09IFNFUV9TVEFSVF9UT0tFTikgeworCQlzZXFfcHV0cyhtLAorCQkJICIjIGZpbGVuYW1lOmxpbmVubyBbbW9kdWxlXWZ1bmN0aW9uIGZsYWdzIGZvcm1hdFxuIik7CisJCXJldHVybiAwOworCX0KKworCXNlcV9wcmludGYobSwgIiVzOiV1IFslc10lcyA9JXMgXCIiLAorCQkgICB0cmltX3ByZWZpeChkcC0+ZmlsZW5hbWUpLCBkcC0+bGluZW5vLAorCQkgICBpdGVyLT50YWJsZS0+bW9kX25hbWUsIGRwLT5mdW5jdGlvbiwKKwkJICAgZGRlYnVnX2Rlc2NyaWJlX2ZsYWdzKGRwLT5mbGFncywgJmZsYWdzKSk7CisJc2VxX2VzY2FwZShtLCBkcC0+Zm9ybWF0LCAiXHRcclxuXCIiKTsKKwlzZXFfcHV0cyhtLCAiXCJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXFfb3BzIHN0b3AgbWV0aG9kLiAgQ2FsbGVkIGF0IHRoZSBlbmQgb2YgZWFjaCByZWFkKCkKKyAqIGNhbGwgZnJvbSB1c2Vyc3BhY2UuICBEcm9wcyBkZGVidWdfbG9jay4KKyAqLworc3RhdGljIHZvaWQgZGRlYnVnX3Byb2Nfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCit7CisJdnByX2luZm8oImNhbGxlZCBtPSVwIHA9JXBcbiIsIG0sIHApOworCW11dGV4X3VubG9jaygmZGRlYnVnX2xvY2spOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zIGRkZWJ1Z19wcm9jX3NlcW9wcyA9IHsKKwkuc3RhcnQgPSBkZGVidWdfcHJvY19zdGFydCwKKwkubmV4dCA9IGRkZWJ1Z19wcm9jX25leHQsCisJLnNob3cgPSBkZGVidWdfcHJvY19zaG93LAorCS5zdG9wID0gZGRlYnVnX3Byb2Nfc3RvcAorfTsKKworLyoKKyAqIEZpbGVfb3BzLT5vcGVuIG1ldGhvZCBmb3IgPGRlYnVnZnM+L2R5bmFtaWNfZGVidWcvY29udHJvbC4gIERvZXMKKyAqIHRoZSBzZXFfZmlsZSBzZXR1cCBkYW5jZSwgYW5kIGFsc28gY3JlYXRlcyBhbiBpdGVyYXRvciB0byB3YWxrIHRoZQorICogX2RkZWJ1Z3MuICBOb3RlIHRoYXQgd2UgY3JlYXRlIGEgc2VxX2ZpbGUgYWx3YXlzLCBldmVuIGZvciBPX1dST05MWQorICogZmlsZXMgd2hlcmUgaXQncyBub3QgbmVlZGVkLCBhcyBkb2luZyBzbyBzaW1wbGlmaWVzIHRoZSAtPnJlbGVhc2UKKyAqIG1ldGhvZC4KKyAqLworc3RhdGljIGludCBkZGVidWdfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXZwcl9pbmZvKCJjYWxsZWRcbiIpOworCXJldHVybiBzZXFfb3Blbl9wcml2YXRlKGZpbGUsICZkZGVidWdfcHJvY19zZXFvcHMsCisJCQkJc2l6ZW9mKHN0cnVjdCBkZGVidWdfaXRlcikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZGVidWdfcHJvY19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gZGRlYnVnX3Byb2Nfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzZXFfcmVsZWFzZV9wcml2YXRlLAorCS53cml0ZSA9IGRkZWJ1Z19wcm9jX3dyaXRlCit9OworCisvKgorICogQWxsb2NhdGUgYSBuZXcgZGRlYnVnX3RhYmxlIGZvciB0aGUgZ2l2ZW4gbW9kdWxlCisgKiBhbmQgYWRkIGl0IHRvIHRoZSBnbG9iYWwgbGlzdC4KKyAqLworaW50IGRkZWJ1Z19hZGRfbW9kdWxlKHN0cnVjdCBfZGRlYnVnICp0YWIsIHVuc2lnbmVkIGludCBuLAorCQkJICAgICBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkZGVidWdfdGFibGUgKmR0OworCWNvbnN0IGNoYXIgKm5ld19uYW1lOworCisJZHQgPSBremFsbG9jKHNpemVvZigqZHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoZHQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJbmV3X25hbWUgPSBrc3RyZHVwX2NvbnN0KG5hbWUsIEdGUF9LRVJORUwpOworCWlmIChuZXdfbmFtZSA9PSBOVUxMKSB7CisJCWtmcmVlKGR0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWR0LT5tb2RfbmFtZSA9IG5ld19uYW1lOworCWR0LT5udW1fZGRlYnVncyA9IG47CisJZHQtPmRkZWJ1Z3MgPSB0YWI7CisKKwltdXRleF9sb2NrKCZkZGVidWdfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmZHQtPmxpbmssICZkZGVidWdfdGFibGVzKTsKKwltdXRleF91bmxvY2soJmRkZWJ1Z19sb2NrKTsKKworCXZwcl9pbmZvKCIldSBkZWJ1ZyBwcmludHMgaW4gbW9kdWxlICVzXG4iLCBuLCBkdC0+bW9kX25hbWUpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGRlYnVnX2FkZF9tb2R1bGUpOworCisvKiBoZWxwZXIgZm9yIGRkZWJ1Z19keW5kYmdfKGJvb3R8bW9kdWxlKV9wYXJhbV9jYiAqLworc3RhdGljIGludCBkZGVidWdfZHluZGJnX3BhcmFtX2NiKGNoYXIgKnBhcmFtLCBjaGFyICp2YWwsCisJCQkJY29uc3QgY2hhciAqbW9kbmFtZSwgaW50IG9uX2VycikKK3sKKwljaGFyICpzZXA7CisKKwlzZXAgPSBzdHJjaHIocGFyYW0sICcuJyk7CisJaWYgKHNlcCkgeworCQkvKiBuZWVkZWQgb25seSBmb3IgZGRlYnVnX2R5bmRiZ19ib290X3BhcmFtX2NiICovCisJCSpzZXAgPSAnXDAnOworCQltb2RuYW1lID0gcGFyYW07CisJCXBhcmFtID0gc2VwICsgMTsKKwl9CisJaWYgKHN0cmNtcChwYXJhbSwgImR5bmRiZyIpKQorCQlyZXR1cm4gb25fZXJyOyAvKiBkZXRlcm1pbmVkIGJ5IGNhbGxlciAqLworCisJZGRlYnVnX2V4ZWNfcXVlcmllcygodmFsID8gdmFsIDogIitwIiksIG1vZG5hbWUpOworCisJcmV0dXJuIDA7IC8qIHF1ZXJ5IGZhaWx1cmUgc2hvdWxkbnQgc3RvcCBtb2R1bGUgbG9hZCAqLworfQorCisvKiBoYW5kbGUgYm90aCBkeW5kYmcgYW5kICRtb2R1bGUuZHluZGJnIHBhcmFtcyBhdCBib290ICovCitzdGF0aWMgaW50IGRkZWJ1Z19keW5kYmdfYm9vdF9wYXJhbV9jYihjaGFyICpwYXJhbSwgY2hhciAqdmFsLAorCQkJCWNvbnN0IGNoYXIgKnVudXNlZCwgdm9pZCAqYXJnKQoreworCXZwcl9pbmZvKCIlcz1cIiVzXCJcbiIsIHBhcmFtLCB2YWwpOworCXJldHVybiBkZGVidWdfZHluZGJnX3BhcmFtX2NiKHBhcmFtLCB2YWwsIE5VTEwsIDApOworfQorCisvKgorICogbW9kcHJvYmUgZm9vIGZpbmRzIGZvby5wYXJhbXMgaW4gYm9vdC1hcmdzLCBzdHJpcHMgImZvby4iLCBhbmQKKyAqIHBhc3NlcyB0aGVtIHRvIGxvYWRfbW9kdWxlKCkuICBUaGlzIGNhbGxiYWNrIGdldHMgdW5rbm93biBwYXJhbXMsCisgKiBwcm9jZXNzZXMgZHluZGJnIHBhcmFtcywgcmVqZWN0cyBvdGhlcnMuCisgKi8KK2ludCBkZGVidWdfZHluZGJnX21vZHVsZV9wYXJhbV9jYihjaGFyICpwYXJhbSwgY2hhciAqdmFsLCBjb25zdCBjaGFyICptb2R1bGUpCit7CisJdnByX2luZm8oIm1vZHVsZTogJXMgJXM9XCIlc1wiXG4iLCBtb2R1bGUsIHBhcmFtLCB2YWwpOworCXJldHVybiBkZGVidWdfZHluZGJnX3BhcmFtX2NiKHBhcmFtLCB2YWwsIG1vZHVsZSwgLUVOT0VOVCk7Cit9CisKK3N0YXRpYyB2b2lkIGRkZWJ1Z190YWJsZV9mcmVlKHN0cnVjdCBkZGVidWdfdGFibGUgKmR0KQoreworCWxpc3RfZGVsX2luaXQoJmR0LT5saW5rKTsKKwlrZnJlZV9jb25zdChkdC0+bW9kX25hbWUpOworCWtmcmVlKGR0KTsKK30KKworLyoKKyAqIENhbGxlZCBpbiByZXNwb25zZSB0byBhIG1vZHVsZSBiZWluZyB1bmxvYWRlZC4gIFJlbW92ZXMKKyAqIGFueSBkZGVidWdfdGFibGUncyB3aGljaCBwb2ludCBhdCB0aGUgbW9kdWxlLgorICovCitpbnQgZGRlYnVnX3JlbW92ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kX25hbWUpCit7CisJc3RydWN0IGRkZWJ1Z190YWJsZSAqZHQsICpuZXh0ZHQ7CisJaW50IHJldCA9IC1FTk9FTlQ7CisKKwl2cHJfaW5mbygicmVtb3ZpbmcgbW9kdWxlIFwiJXNcIlxuIiwgbW9kX25hbWUpOworCisJbXV0ZXhfbG9jaygmZGRlYnVnX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkdCwgbmV4dGR0LCAmZGRlYnVnX3RhYmxlcywgbGluaykgeworCQlpZiAoIXN0cmNtcChkdC0+bW9kX25hbWUsIG1vZF9uYW1lKSkgeworCQkJZGRlYnVnX3RhYmxlX2ZyZWUoZHQpOworCQkJcmV0ID0gMDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmRkZWJ1Z19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGRlYnVnX3JlbW92ZV9tb2R1bGUpOworCitzdGF0aWMgdm9pZCBkZGVidWdfcmVtb3ZlX2FsbF90YWJsZXModm9pZCkKK3sKKwltdXRleF9sb2NrKCZkZGVidWdfbG9jayk7CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZkZGVidWdfdGFibGVzKSkgeworCQlzdHJ1Y3QgZGRlYnVnX3RhYmxlICpkdCA9IGxpc3RfZW50cnkoZGRlYnVnX3RhYmxlcy5uZXh0LAorCQkJCQkJICAgICAgc3RydWN0IGRkZWJ1Z190YWJsZSwKKwkJCQkJCSAgICAgIGxpbmspOworCQlkZGVidWdfdGFibGVfZnJlZShkdCk7CisJfQorCW11dGV4X3VubG9jaygmZGRlYnVnX2xvY2spOworfQorCitzdGF0aWMgX19pbml0ZGF0YSBpbnQgZGRlYnVnX2luaXRfc3VjY2VzczsKKworc3RhdGljIGludCBfX2luaXQgZHluYW1pY19kZWJ1Z19pbml0X2RlYnVnZnModm9pZCkKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkaXIsICpmaWxlOworCisJaWYgKCFkZGVidWdfaW5pdF9zdWNjZXNzKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZHluYW1pY19kZWJ1ZyIsIE5VTEwpOworCWlmICghZGlyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmaWxlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiY29udHJvbCIsIDA2NDQsIGRpciwgTlVMTCwKKwkJCQkJJmRkZWJ1Z19wcm9jX2ZvcHMpOworCWlmICghZmlsZSkgeworCQlkZWJ1Z2ZzX3JlbW92ZShkaXIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGR5bmFtaWNfZGVidWdfaW5pdCh2b2lkKQoreworCXN0cnVjdCBfZGRlYnVnICppdGVyLCAqaXRlcl9zdGFydDsKKwljb25zdCBjaGFyICptb2RuYW1lID0gTlVMTDsKKwljaGFyICpjbWRsaW5lOworCWludCByZXQgPSAwOworCWludCBuID0gMCwgZW50cmllcyA9IDAsIG1vZGN0ID0gMDsKKwlpbnQgdmVyYm9zZV9ieXRlcyA9IDA7CisKKwlpZiAoX19zdGFydF9fX3ZlcmJvc2UgPT0gX19zdG9wX19fdmVyYm9zZSkgeworCQlwcl93YXJuKCJfZGRlYnVnIHRhYmxlIGlzIGVtcHR5IGluIGEgQ09ORklHX0RZTkFNSUNfREVCVUcgYnVpbGRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJaXRlciA9IF9fc3RhcnRfX192ZXJib3NlOworCW1vZG5hbWUgPSBpdGVyLT5tb2RuYW1lOworCWl0ZXJfc3RhcnQgPSBpdGVyOworCWZvciAoOyBpdGVyIDwgX19zdG9wX19fdmVyYm9zZTsgaXRlcisrKSB7CisJCWVudHJpZXMrKzsKKwkJdmVyYm9zZV9ieXRlcyArPSBzdHJsZW4oaXRlci0+bW9kbmFtZSkgKyBzdHJsZW4oaXRlci0+ZnVuY3Rpb24pCisJCQkrIHN0cmxlbihpdGVyLT5maWxlbmFtZSkgKyBzdHJsZW4oaXRlci0+Zm9ybWF0KTsKKworCQlpZiAoc3RyY21wKG1vZG5hbWUsIGl0ZXItPm1vZG5hbWUpKSB7CisJCQltb2RjdCsrOworCQkJcmV0ID0gZGRlYnVnX2FkZF9tb2R1bGUoaXRlcl9zdGFydCwgbiwgbW9kbmFtZSk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0X2VycjsKKwkJCW4gPSAwOworCQkJbW9kbmFtZSA9IGl0ZXItPm1vZG5hbWU7CisJCQlpdGVyX3N0YXJ0ID0gaXRlcjsKKwkJfQorCQluKys7CisJfQorCXJldCA9IGRkZWJ1Z19hZGRfbW9kdWxlKGl0ZXJfc3RhcnQsIG4sIG1vZG5hbWUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2VycjsKKworCWRkZWJ1Z19pbml0X3N1Y2Nlc3MgPSAxOworCXZwcl9pbmZvKCIlZCBtb2R1bGVzLCAlZCBlbnRyaWVzIGFuZCAlZCBieXRlcyBpbiBkZGVidWcgdGFibGVzLCAlZCBieXRlcyBpbiAocmVhZG9ubHkpIHZlcmJvc2Ugc2VjdGlvblxuIiwKKwkJIG1vZGN0LCBlbnRyaWVzLCAoaW50KShtb2RjdCAqIHNpemVvZihzdHJ1Y3QgZGRlYnVnX3RhYmxlKSksCisJCSB2ZXJib3NlX2J5dGVzICsgKGludCkoX19zdG9wX19fdmVyYm9zZSAtIF9fc3RhcnRfX192ZXJib3NlKSk7CisKKwkvKiBhcHBseSBkZGVidWdfcXVlcnkgYm9vdCBwYXJhbSwgZG9udCB1bmxvYWQgdGFibGVzIG9uIGVyciAqLworCWlmIChkZGVidWdfc2V0dXBfc3RyaW5nWzBdICE9ICdcMCcpIHsKKwkJcHJfd2FybigiZGRlYnVnX3F1ZXJ5IHBhcmFtIG5hbWUgaXMgZGVwcmVjYXRlZCwgY2hhbmdlIGl0IHRvIGR5bmRiZ1xuIik7CisJCXJldCA9IGRkZWJ1Z19leGVjX3F1ZXJpZXMoZGRlYnVnX3NldHVwX3N0cmluZywgTlVMTCk7CisJCWlmIChyZXQgPCAwKQorCQkJcHJfd2FybigiSW52YWxpZCBkZGVidWcgYm9vdCBwYXJhbSAlc1xuIiwKKwkJCQlkZGVidWdfc2V0dXBfc3RyaW5nKTsKKwkJZWxzZQorCQkJcHJfaW5mbygiJWQgY2hhbmdlcyBieSBkZGVidWdfcXVlcnlcbiIsIHJldCk7CisJfQorCS8qIG5vdyB0aGF0IGRkZWJ1ZyB0YWJsZXMgYXJlIGxvYWRlZCwgcHJvY2VzcyBhbGwgYm9vdCBhcmdzCisJICogYWdhaW4gdG8gZmluZCBhbmQgYWN0aXZhdGUgcXVlcmllcyBnaXZlbiBpbiBkeW5kYmcgcGFyYW1zLgorCSAqIFdoaWxlIHRoaXMgaGFzIGFscmVhZHkgYmVlbiBkb25lIGZvciBrbm93biBib290IHBhcmFtcywgaXQKKwkgKiBpZ25vcmVkIHRoZSB1bmtub3duIG9uZXMgKGR5bmRiZyBpbiBwYXJ0aWN1bGFyKS4gIFJldXNpbmcKKwkgKiBwYXJzZV9hcmdzIGF2b2lkcyBhZC1ob2MgcGFyc2luZy4gIFRoaXMgd2lsbCBhbHNvIGF0dGVtcHQKKwkgKiB0byBhY3RpdmF0ZSBxdWVyaWVzIGZvciBub3QteWV0LWxvYWRlZCBtb2R1bGVzLCB3aGljaCBpcworCSAqIHNsaWdodGx5IG5vaXN5IGlmIHZlcmJvc2UsIGJ1dCBoYXJtbGVzcy4KKwkgKi8KKwljbWRsaW5lID0ga3N0cmR1cChzYXZlZF9jb21tYW5kX2xpbmUsIEdGUF9LRVJORUwpOworCXBhcnNlX2FyZ3MoImR5bmRiZyBwYXJhbXMiLCBjbWRsaW5lLCBOVUxMLAorCQkgICAwLCAwLCAwLCBOVUxMLCAmZGRlYnVnX2R5bmRiZ19ib290X3BhcmFtX2NiKTsKKwlrZnJlZShjbWRsaW5lKTsKKwlyZXR1cm4gMDsKKworb3V0X2VycjoKKwlkZGVidWdfcmVtb3ZlX2FsbF90YWJsZXMoKTsKKwlyZXR1cm4gMDsKK30KKy8qIEFsbG93IGVhcmx5IGluaXRpYWxpemF0aW9uIGZvciBib290IG1lc3NhZ2VzIHZpYSBib290IHBhcmFtICovCitlYXJseV9pbml0Y2FsbChkeW5hbWljX2RlYnVnX2luaXQpOworCisvKiBEZWJ1Z2ZzIHNldHVwIG11c3QgYmUgZG9uZSBsYXRlciAqLworZnNfaW5pdGNhbGwoZHluYW1pY19kZWJ1Z19pbml0X2RlYnVnZnMpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZHluYW1pY19xdWV1ZV9saW1pdHMuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2R5bmFtaWNfcXVldWVfbGltaXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE0MDZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2R5bmFtaWNfcXVldWVfbGltaXRzLmMKQEAgLTAsMCArMSwxMzkgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogRHluYW1pYyBieXRlIHF1ZXVlIGxpbWl0cy4gIFNlZSBpbmNsdWRlL2xpbnV4L2R5bmFtaWNfcXVldWVfbGltaXRzLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIFRvbSBIZXJiZXJ0IDx0aGVyYmVydEBnb29nbGUuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZHluYW1pY19xdWV1ZV9saW1pdHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisjZGVmaW5lIFBPU0RJRkYoQSwgQikgKChpbnQpKChBKSAtIChCKSkgPiAwID8gKEEpIC0gKEIpIDogMCkKKyNkZWZpbmUgQUZURVJfRVEoQSwgQikgKChpbnQpKChBKSAtIChCKSkgPj0gMCkKKworLyogUmVjb3JkcyBjb21wbGV0ZWQgY291bnQgYW5kIHJlY2FsY3VsYXRlcyB0aGUgcXVldWUgbGltaXQgKi8KK3ZvaWQgZHFsX2NvbXBsZXRlZChzdHJ1Y3QgZHFsICpkcWwsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpbnQgaW5wcm9ncmVzcywgcHJldl9pbnByb2dyZXNzLCBsaW1pdDsKKwl1bnNpZ25lZCBpbnQgb3ZsaW1pdCwgY29tcGxldGVkLCBudW1fcXVldWVkOworCWJvb2wgYWxsX3ByZXZfY29tcGxldGVkOworCisJbnVtX3F1ZXVlZCA9IEFDQ0VTU19PTkNFKGRxbC0+bnVtX3F1ZXVlZCk7CisKKwkvKiBDYW4ndCBjb21wbGV0ZSBtb3JlIHRoYW4gd2hhdCdzIGluIHF1ZXVlICovCisJQlVHX09OKGNvdW50ID4gbnVtX3F1ZXVlZCAtIGRxbC0+bnVtX2NvbXBsZXRlZCk7CisKKwljb21wbGV0ZWQgPSBkcWwtPm51bV9jb21wbGV0ZWQgKyBjb3VudDsKKwlsaW1pdCA9IGRxbC0+bGltaXQ7CisJb3ZsaW1pdCA9IFBPU0RJRkYobnVtX3F1ZXVlZCAtIGRxbC0+bnVtX2NvbXBsZXRlZCwgbGltaXQpOworCWlucHJvZ3Jlc3MgPSBudW1fcXVldWVkIC0gY29tcGxldGVkOworCXByZXZfaW5wcm9ncmVzcyA9IGRxbC0+cHJldl9udW1fcXVldWVkIC0gZHFsLT5udW1fY29tcGxldGVkOworCWFsbF9wcmV2X2NvbXBsZXRlZCA9IEFGVEVSX0VRKGNvbXBsZXRlZCwgZHFsLT5wcmV2X251bV9xdWV1ZWQpOworCisJaWYgKChvdmxpbWl0ICYmICFpbnByb2dyZXNzKSB8fAorCSAgICAoZHFsLT5wcmV2X292bGltaXQgJiYgYWxsX3ByZXZfY29tcGxldGVkKSkgeworCQkvKgorCQkgKiBRdWV1ZSBjb25zaWRlcmVkIHN0YXJ2ZWQgaWY6CisJCSAqICAgLSBUaGUgcXVldWUgd2FzIG92ZXItbGltaXQgaW4gdGhlIGxhc3QgaW50ZXJ2YWwsCisJCSAqICAgICBhbmQgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGluIHRoZSBxdWV1ZS4KKwkJICogIE9SCisJCSAqICAgLSBUaGUgcXVldWUgd2FzIG92ZXItbGltaXQgaW4gdGhlIHByZXZpb3VzIGludGVydmFsIGFuZAorCQkgKiAgICAgd2hlbiBlbnF1ZXVpbmcgaXQgd2FzIHBvc3NpYmxlIHRoYXQgYWxsIHF1ZXVlZCBkYXRhCisJCSAqICAgICBoYWQgYmVlbiBjb25zdW1lZC4gIFRoaXMgY292ZXJzIHRoZSBjYXNlIHdoZW4gcXVldWUKKwkJICogICAgIG1heSBoYXZlIGJlY29tZXMgc3RhcnZlZCBiZXR3ZWVuIGNvbXBsZXRpb24gcHJvY2Vzc2luZworCQkgKiAgICAgcnVubmluZyBhbmQgbmV4dCB0aW1lIGVucXVldWUgd2FzIHNjaGVkdWxlZC4KKwkJICoKKwkJICogICAgIFdoZW4gcXVldWUgaXMgc3RhcnZlZCBpbmNyZWFzZSB0aGUgbGltaXQgYnkgdGhlIGFtb3VudAorCQkgKiAgICAgb2YgYnl0ZXMgYm90aCBzZW50IGFuZCBjb21wbGV0ZWQgaW4gdGhlIGxhc3QgaW50ZXJ2YWwsCisJCSAqICAgICBwbHVzIGFueSBwcmV2aW91cyBvdmVyLWxpbWl0LgorCQkgKi8KKwkJbGltaXQgKz0gUE9TRElGRihjb21wbGV0ZWQsIGRxbC0+cHJldl9udW1fcXVldWVkKSArCisJCSAgICAgZHFsLT5wcmV2X292bGltaXQ7CisJCWRxbC0+c2xhY2tfc3RhcnRfdGltZSA9IGppZmZpZXM7CisJCWRxbC0+bG93ZXN0X3NsYWNrID0gVUlOVF9NQVg7CisJfSBlbHNlIGlmIChpbnByb2dyZXNzICYmIHByZXZfaW5wcm9ncmVzcyAmJiAhYWxsX3ByZXZfY29tcGxldGVkKSB7CisJCS8qCisJCSAqIFF1ZXVlIHdhcyBub3Qgc3RhcnZlZCwgY2hlY2sgaWYgdGhlIGxpbWl0IGNhbiBiZSBkZWNyZWFzZWQuCisJCSAqIEEgZGVjcmVhc2UgaXMgb25seSBjb25zaWRlcmVkIGlmIHRoZSBxdWV1ZSBoYXMgYmVlbiBidXN5IGluCisJCSAqIHRoZSB3aG9sZSBpbnRlcnZhbCAodGhlIGNoZWNrIGFib3ZlKS4KKwkJICoKKwkJICogSWYgdGhlcmUgaXMgc2xhY2ssIHRoZSBhbW91bnQgb2YgZXhlY2VzcyBkYXRhIHF1ZXVlZCBhYm92ZQorCQkgKiB0aGUgdGhlIGFtb3VudCBuZWVkZWQgdG8gcHJldmVudCBzdGFydmF0aW9uLCB0aGUgcXVldWUgbGltaXQKKwkJICogY2FuIGJlIGRlY3JlYXNlZC4gIFRvIGF2b2lkIGh5c3RlcmVzaXMgd2UgY29uc2lkZXIgdGhlCisJCSAqIG1pbmltdW0gYW1vdW50IG9mIHNsYWNrIGZvdW5kIG92ZXIgc2V2ZXJhbCBpdGVyYXRpb25zIG9mIHRoZQorCQkgKiBjb21wbGV0aW9uIHJvdXRpbmUuCisJCSAqLworCQl1bnNpZ25lZCBpbnQgc2xhY2ssIHNsYWNrX2xhc3Rfb2JqczsKKworCQkvKgorCQkgKiBTbGFjayBpcyB0aGUgbWF4aW11bSBvZgorCQkgKiAgIC0gVGhlIHF1ZXVlIGxpbWl0IHBsdXMgcHJldmlvdXMgb3Zlci1saW1pdCBtaW51cyB0d2ljZQorCQkgKiAgICAgdGhlIG51bWJlciBvZiBvYmplY3RzIGNvbXBsZXRlZC4gIE5vdGUgdGhhdCB0d28gdGltZXMKKwkJICogICAgIG51bWJlciBvZiBjb21wbGV0ZWQgYnl0ZXMgaXMgYSBiYXNpcyBmb3IgYW4gdXBwZXIgYm91bmQKKwkJICogICAgIG9mIHRoZSBsaW1pdC4KKwkJICogICAtIFBvcnRpb24gb2Ygb2JqZWN0cyBpbiB0aGUgbGFzdCBxdWV1aW5nIG9wZXJhdGlvbiB0aGF0CisJCSAqICAgICB3YXMgbm90IHBhcnQgb2Ygbm9uLXplcm8gcHJldmlvdXMgb3Zlci1saW1pdC4gIFRoYXQgaXMKKwkJICogICAgICJyb3VuZCBkb3duIiBieSBub24tb3ZlcmxpbWl0IHBvcnRpb24gb2YgdGhlIGxhc3QKKwkJICogICAgIHF1ZXVlaW5nIG9wZXJhdGlvbi4KKwkJICovCisJCXNsYWNrID0gUE9TRElGRihsaW1pdCArIGRxbC0+cHJldl9vdmxpbWl0LAorCQkgICAgMiAqIChjb21wbGV0ZWQgLSBkcWwtPm51bV9jb21wbGV0ZWQpKTsKKwkJc2xhY2tfbGFzdF9vYmpzID0gZHFsLT5wcmV2X292bGltaXQgPworCQkgICAgUE9TRElGRihkcWwtPnByZXZfbGFzdF9vYmpfY250LCBkcWwtPnByZXZfb3ZsaW1pdCkgOiAwOworCisJCXNsYWNrID0gbWF4KHNsYWNrLCBzbGFja19sYXN0X29ianMpOworCisJCWlmIChzbGFjayA8IGRxbC0+bG93ZXN0X3NsYWNrKQorCQkJZHFsLT5sb3dlc3Rfc2xhY2sgPSBzbGFjazsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkJICAgICAgIGRxbC0+c2xhY2tfc3RhcnRfdGltZSArIGRxbC0+c2xhY2tfaG9sZF90aW1lKSkgeworCQkJbGltaXQgPSBQT1NESUZGKGxpbWl0LCBkcWwtPmxvd2VzdF9zbGFjayk7CisJCQlkcWwtPnNsYWNrX3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCQkJZHFsLT5sb3dlc3Rfc2xhY2sgPSBVSU5UX01BWDsKKwkJfQorCX0KKworCS8qIEVuZm9yY2UgYm91bmRzIG9uIGxpbWl0ICovCisJbGltaXQgPSBjbGFtcChsaW1pdCwgZHFsLT5taW5fbGltaXQsIGRxbC0+bWF4X2xpbWl0KTsKKworCWlmIChsaW1pdCAhPSBkcWwtPmxpbWl0KSB7CisJCWRxbC0+bGltaXQgPSBsaW1pdDsKKwkJb3ZsaW1pdCA9IDA7CisJfQorCisJZHFsLT5hZGpfbGltaXQgPSBsaW1pdCArIGNvbXBsZXRlZDsKKwlkcWwtPnByZXZfb3ZsaW1pdCA9IG92bGltaXQ7CisJZHFsLT5wcmV2X2xhc3Rfb2JqX2NudCA9IGRxbC0+bGFzdF9vYmpfY250OworCWRxbC0+bnVtX2NvbXBsZXRlZCA9IGNvbXBsZXRlZDsKKwlkcWwtPnByZXZfbnVtX3F1ZXVlZCA9IG51bV9xdWV1ZWQ7Cit9CitFWFBPUlRfU1lNQk9MKGRxbF9jb21wbGV0ZWQpOworCit2b2lkIGRxbF9yZXNldChzdHJ1Y3QgZHFsICpkcWwpCit7CisJLyogUmVzZXQgYWxsIGR5bmFtaWMgdmFsdWVzICovCisJZHFsLT5saW1pdCA9IDA7CisJZHFsLT5udW1fcXVldWVkID0gMDsKKwlkcWwtPm51bV9jb21wbGV0ZWQgPSAwOworCWRxbC0+bGFzdF9vYmpfY250ID0gMDsKKwlkcWwtPnByZXZfbnVtX3F1ZXVlZCA9IDA7CisJZHFsLT5wcmV2X2xhc3Rfb2JqX2NudCA9IDA7CisJZHFsLT5wcmV2X292bGltaXQgPSAwOworCWRxbC0+bG93ZXN0X3NsYWNrID0gVUlOVF9NQVg7CisJZHFsLT5zbGFja19zdGFydF90aW1lID0gamlmZmllczsKK30KK0VYUE9SVF9TWU1CT0woZHFsX3Jlc2V0KTsKKworaW50IGRxbF9pbml0KHN0cnVjdCBkcWwgKmRxbCwgdW5zaWduZWQgaG9sZF90aW1lKQoreworCWRxbC0+bWF4X2xpbWl0ID0gRFFMX01BWF9MSU1JVDsKKwlkcWwtPm1pbl9saW1pdCA9IDA7CisJZHFsLT5zbGFja19ob2xkX3RpbWUgPSBob2xkX3RpbWU7CisJZHFsX3Jlc2V0KGRxbCk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRxbF9pbml0KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2Vhcmx5Y3Bpby5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZWFybHljcGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyODNiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2Vhcmx5Y3Bpby5jCkBAIC0wLDAgKzEsMTQ5IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUKKyAqICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIsIGFzCisgKiAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGVhcmx5Y3Bpby5jCisgKgorICogRmluZCBhIHNwZWNpZmljIGNwaW8gbWVtYmVyOyBtdXN0IHByZWNlZGUgYW55IGNvbXByZXNzZWQgY29udGVudC4KKyAqIFRoaXMgaXMgdXNlZCB0byBsb2NhdGUgZGF0YSBpdGVtcyBpbiB0aGUgaW5pdHJhbWZzIHVzZWQgYnkgdGhlCisgKiBrZXJuZWwgaXRzZWxmIGR1cmluZyBlYXJseSBib290IChiZWZvcmUgdGhlIG1haW4gaW5pdHJhbWZzIGlzCisgKiBkZWNvbXByZXNzZWQuKSAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBpbml0cmFtZnMgY3JlYXRvcgorICogdG8gZW5zdXJlIHRoYXQgdGhlc2UgaXRlbXMgYXJlIHVuY29tcHJlc3NlZCBhdCB0aGUgaGVhZCBvZiB0aGUKKyAqIGJsb2IuICBEZXBlbmRpbmcgb24gdGhlIGJvb3QgbG9hZGVyIG9yIHBhY2thZ2UgdG9vbCB0aGF0IG1heSBiZSBhCisgKiBzZXBhcmF0ZSBmaWxlIG9yIHBhcnQgb2YgdGhlIHNhbWUgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZWFybHljcGlvLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKK2VudW0gY3Bpb19maWVsZHMgeworCUNfTUFHSUMsCisJQ19JTk8sCisJQ19NT0RFLAorCUNfVUlELAorCUNfR0lELAorCUNfTkxJTkssCisJQ19NVElNRSwKKwlDX0ZJTEVTSVpFLAorCUNfTUFKLAorCUNfTUlOLAorCUNfUk1BSiwKKwlDX1JNSU4sCisJQ19OQU1FU0laRSwKKwlDX0NIS1NVTSwKKwlDX05GSUVMRFMKK307CisKKy8qKgorICogY3Bpb19kYXRhIGZpbmRfY3Bpb19kYXRhIC0gU2VhcmNoIGZvciBmaWxlcyBpbiBhbiB1bmNvbXByZXNzZWQgY3BpbworICogQHBhdGg6ICAgICAgIFRoZSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciwgaW5jbHVkaW5nIGEgc2xhc2ggYXQgdGhlIGVuZAorICogQGRhdGE6ICAgICAgIFBvaW50ZXIgdG8gdGhlIHRoZSBjcGlvIGFyY2hpdmUgb3IgYSBoZWFkZXIgaW5zaWRlCisgKiBAbGVuOiAgICAgICAgUmVtYWluaW5nIGxlbmd0aCBvZiB0aGUgY3BpbyBiYXNlZCBvbiBkYXRhIHBvaW50ZXIKKyAqIEBuZXh0b2ZmOiAgICBXaGVuIGEgbWF0Y2hpbmcgZmlsZSBpcyBmb3VuZCwgdGhpcyBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlCisgKiAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBjcGlvIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgZmlsZSwgbm90IHRoZQorICogICAgICAgICAgICAgIG1hdGNoaW5nIGZpbGUgaXRzZWxmLiBJdCBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGNwaW8KKyAqICAgICAgICAgICAgICB0byBmaW5kIGFsbCBmaWxlcyBpbnNpZGUgb2YgYSBkaXJlY3RvcnkgcGF0aC4KKyAqCisgKiBAcmV0dXJuOiAgICAgc3RydWN0IGNwaW9fZGF0YSBjb250YWluaW5nIHRoZSBhZGRyZXNzLCBsZW5ndGggYW5kCisgKiAgICAgICAgICAgICAgZmlsZW5hbWUgKHdpdGggdGhlIGRpcmVjdG9yeSBwYXRoIGN1dCBvZmYpIG9mIHRoZSBmb3VuZCBmaWxlLgorICogICAgICAgICAgICAgIElmIHlvdSBzZWFyY2ggZm9yIGEgZmlsZW5hbWUgYW5kIG5vdCBmb3IgZmlsZXMgaW4gYSBkaXJlY3RvcnksCisgKiAgICAgICAgICAgICAgcGFzcyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZW5hbWUgaW4gdGhlIGNwaW8gYW5kIG1ha2Ugc3VyZQorICogICAgICAgICAgICAgIHRoZSBtYXRjaCByZXR1cm5lZCBhbiBlbXB0eSBmaWxlbmFtZSBzdHJpbmcuCisgKi8KKworc3RydWN0IGNwaW9fZGF0YSBmaW5kX2NwaW9fZGF0YShjb25zdCBjaGFyICpwYXRoLCB2b2lkICpkYXRhLAorCQkJCXNpemVfdCBsZW4sICBsb25nICpuZXh0b2ZmKQoreworCWNvbnN0IHNpemVfdCBjcGlvX2hlYWRlcl9sZW4gPSA4KkNfTkZJRUxEUyAtIDI7CisJc3RydWN0IGNwaW9fZGF0YSBjZCA9IHsgTlVMTCwgMCwgIiIgfTsKKwljb25zdCBjaGFyICpwLCAqZHB0ciwgKm5wdHI7CisJdW5zaWduZWQgaW50IGNoW0NfTkZJRUxEU10sICpjaHAsIHY7CisJdW5zaWduZWQgY2hhciBjLCB4OworCXNpemVfdCBteXBhdGhzaXplID0gc3RybGVuKHBhdGgpOworCWludCBpLCBqOworCisJcCA9IGRhdGE7CisKKwl3aGlsZSAobGVuID4gY3Bpb19oZWFkZXJfbGVuKSB7CisJCWlmICghKnApIHsKKwkJCS8qIEFsbCBjcGlvIGhlYWRlcnMgbmVlZCB0byBiZSA0LWJ5dGUgYWxpZ25lZCAqLworCQkJcCArPSA0OworCQkJbGVuIC09IDQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCWogPSA2OwkJLyogVGhlIG1hZ2ljIGZpZWxkIGlzIG9ubHkgNiBjaGFyYWN0ZXJzICovCisJCWNocCA9IGNoOworCQlmb3IgKGkgPSBDX05GSUVMRFM7IGk7IGktLSkgeworCQkJdiA9IDA7CisJCQl3aGlsZSAoai0tKSB7CisJCQkJdiA8PD0gNDsKKwkJCQljID0gKnArKzsKKworCQkJCXggPSBjIC0gJzAnOworCQkJCWlmICh4IDwgMTApIHsKKwkJCQkJdiArPSB4OworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQl4ID0gKGMgfCAweDIwKSAtICdhJzsKKwkJCQlpZiAoeCA8IDYpIHsKKwkJCQkJdiArPSB4ICsgMTA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKworCQkJCWdvdG8gcXVpdDsgLyogSW52YWxpZCBoZXhhZGVjaW1hbCAqLworCQkJfQorCQkJKmNocCsrID0gdjsKKwkJCWogPSA4OwkvKiBBbGwgb3RoZXIgZmllbGRzIGFyZSA4IGNoYXJhY3RlcnMgKi8KKwkJfQorCisJCWlmICgoY2hbQ19NQUdJQ10gLSAweDA3MDcwMSkgPiAxKQorCQkJZ290byBxdWl0OyAvKiBJbnZhbGlkIG1hZ2ljICovCisKKwkJbGVuIC09IGNwaW9faGVhZGVyX2xlbjsKKworCQlkcHRyID0gUFRSX0FMSUdOKHAgKyBjaFtDX05BTUVTSVpFXSwgNCk7CisJCW5wdHIgPSBQVFJfQUxJR04oZHB0ciArIGNoW0NfRklMRVNJWkVdLCA0KTsKKworCQlpZiAobnB0ciA+IHAgKyBsZW4gfHwgZHB0ciA8IHAgfHwgbnB0ciA8IGRwdHIpCisJCQlnb3RvIHF1aXQ7IC8qIEJ1ZmZlciBvdmVycnVuICovCisKKwkJaWYgKChjaFtDX01PREVdICYgMDE3MDAwMCkgPT0gMDEwMDAwMCAmJgorCQkgICAgY2hbQ19OQU1FU0laRV0gPj0gbXlwYXRoc2l6ZSAmJgorCQkgICAgIW1lbWNtcChwLCBwYXRoLCBteXBhdGhzaXplKSkgeworCisJCQlpZiAobmV4dG9mZikKKwkJCQkqbmV4dG9mZiA9IChsb25nKW5wdHIgLSAobG9uZylkYXRhOworCisJCQlpZiAoY2hbQ19OQU1FU0laRV0gLSBteXBhdGhzaXplID49IE1BWF9DUElPX0ZJTEVfTkFNRSkgeworCQkJCXByX3dhcm4oCisJCQkJIkZpbGUgJXMgZXhjZWVkaW5nIE1BWF9DUElPX0ZJTEVfTkFNRSBbJWRdXG4iLAorCQkJCXAsIE1BWF9DUElPX0ZJTEVfTkFNRSk7CisJCQl9CisJCQlzdHJsY3B5KGNkLm5hbWUsIHAgKyBteXBhdGhzaXplLCBNQVhfQ1BJT19GSUxFX05BTUUpOworCisJCQljZC5kYXRhID0gKHZvaWQgKilkcHRyOworCQkJY2Quc2l6ZSA9IGNoW0NfRklMRVNJWkVdOworCQkJcmV0dXJuIGNkOyAvKiBGb3VuZCBpdCEgKi8KKwkJfQorCQlsZW4gLT0gKG5wdHIgLSBwKTsKKwkJcCA9IG5wdHI7CisJfQorCitxdWl0OgorCXJldHVybiBjZDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2VycnNlcS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZXJyc2VxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlZDgxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2VycnNlcS5jCkBAIC0wLDAgKzEsMjAzIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2VycnNlcS5oPgorCisvKgorICogQW4gZXJyc2VxX3QgaXMgYSB3YXkgb2YgcmVjb3JkaW5nIGVycm9ycyBpbiBvbmUgcGxhY2UsIGFuZCBhbGxvd2luZyBhbnkKKyAqIG51bWJlciBvZiAic3Vic2NyaWJlcnMiIHRvIHRlbGwgd2hldGhlciBpdCBoYXMgY2hhbmdlZCBzaW5jZSBhIHByZXZpb3VzCisgKiBwb2ludCB3aGVyZSBpdCB3YXMgc2FtcGxlZC4KKyAqCisgKiBJdCdzIGltcGxlbWVudGVkIGFzIGFuIHVuc2lnbmVkIDMyLWJpdCB2YWx1ZS4gVGhlIGxvdyBvcmRlciBiaXRzIGFyZQorICogZGVzaWduYXRlZCB0byBob2xkIGFuIGVycm9yIGNvZGUgKGJldHdlZW4gMCBhbmQgLU1BWF9FUlJOTykuIFRoZSB1cHBlciBiaXRzCisgKiBhcmUgdXNlZCBhcyBhIGNvdW50ZXIuIFRoaXMgaXMgZG9uZSB3aXRoIGF0b21pY3MgaW5zdGVhZCBvZiBsb2NraW5nIHNvIHRoYXQKKyAqIHRoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuCisgKgorICogVGhlIGdlbmVyYWwgaWRlYSBpcyBmb3IgY29uc3VtZXJzIHRvIHNhbXBsZSBhbiBlcnJzZXFfdCB2YWx1ZS4gVGhhdCB2YWx1ZQorICogY2FuIGxhdGVyIGJlIHVzZWQgdG8gdGVsbCB3aGV0aGVyIGFueSBuZXcgZXJyb3JzIGhhdmUgb2NjdXJyZWQgc2luY2UgdGhhdAorICogc2FtcGxpbmcgd2FzIGRvbmUuCisgKgorICogTm90ZSB0aGF0IHRoZXJlIGlzIGEgcmlzayBvZiBjb2xsaXNpb25zIGlmIG5ldyBlcnJvcnMgYXJlIGJlaW5nIHJlY29yZGVkCisgKiBmcmVxdWVudGx5LCBzaW5jZSB3ZSBoYXZlIHNvIGZldyBiaXRzIHRvIHVzZSBhcyBhIGNvdW50ZXIuCisgKgorICogVG8gbWl0aWdhdGUgdGhpcywgb25lIGJpdCBpcyB1c2VkIGFzIGEgZmxhZyB0byB0ZWxsIHdoZXRoZXIgdGhlIHZhbHVlIGhhcworICogYmVlbiBzYW1wbGVkIHNpbmNlIGEgbmV3IHZhbHVlIHdhcyByZWNvcmRlZC4gVGhhdCBhbGxvd3MgdXMgdG8gYXZvaWQgYnVtcGluZworICogdGhlIGNvdW50ZXIgaWYgbm8gb25lIGhhcyBzYW1wbGVkIGl0IHNpbmNlIHRoZSBsYXN0IHRpbWUgYW4gZXJyb3Igd2FzCisgKiByZWNvcmRlZC4KKyAqCisgKiBBIG5ldyBlcnJzZXFfdCBzaG91bGQgYWx3YXlzIGJlIHplcm9lZCBvdXQuICBBIGVycnNlcV90IHZhbHVlIG9mIGFsbCB6ZXJvZXMKKyAqIGlzIHRoZSBzcGVjaWFsIChidXQgY29tbW9uKSBjYXNlIHdoZXJlIHRoZXJlIGhhcyBuZXZlciBiZWVuIGFuIGVycm9yLiBBbiBhbGwKKyAqIHplcm8gdmFsdWUgdGh1cyBzZXJ2ZXMgYXMgdGhlICJlcG9jaCIgaWYgb25lIHdpc2hlcyB0byBrbm93IHdoZXRoZXIgdGhlcmUKKyAqIGhhcyBldmVyIGJlZW4gYW4gZXJyb3Igc2V0IHNpbmNlIGl0IHdhcyBmaXJzdCBpbml0aWFsaXplZC4KKyAqLworCisvKiBUaGUgbG93IGJpdHMgYXJlIGRlc2lnbmF0ZWQgZm9yIGVycm9yIGNvZGUgKG1heCBvZiBNQVhfRVJSTk8pICovCisjZGVmaW5lIEVSUlNFUV9TSElGVAkJaWxvZzIoTUFYX0VSUk5PICsgMSkKKworLyogVGhpcyBiaXQgaXMgdXNlZCBhcyBhIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdmFsdWUgaGFzIGJlZW4gc2VlbiAqLworI2RlZmluZSBFUlJTRVFfU0VFTgkJKDEgPDwgRVJSU0VRX1NISUZUKQorCisvKiBUaGUgbG93ZXN0IGJpdCBvZiB0aGUgY291bnRlciAqLworI2RlZmluZSBFUlJTRVFfQ1RSX0lOQwkJKDEgPDwgKEVSUlNFUV9TSElGVCArIDEpKQorCisvKioKKyAqIGVycnNlcV9zZXQgLSBzZXQgYSBlcnJzZXFfdCBmb3IgbGF0ZXIgcmVwb3J0aW5nCisgKiBAZXNlcTogZXJyc2VxX3QgZmllbGQgdGhhdCBzaG91bGQgYmUgc2V0CisgKiBAZXJyOiBlcnJvciB0byBzZXQgKG11c3QgYmUgYmV0d2VlbiAtMSBhbmQgLU1BWF9FUlJOTykKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGVycm9yIGluICplc2VxLCBhbmQgaW5jcmVtZW50cyB0aGUgc2VxdWVuY2UgY291bnRlcgorICogaWYgdGhlIGxhc3Qgc2VxdWVuY2Ugd2FzIHNhbXBsZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdC4KKyAqCisgKiBBbnkgZXJyb3Igc2V0IHdpbGwgYWx3YXlzIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBlcnJvci4KKyAqCisgKiBXZSBkbyByZXR1cm4gdGhlIGxhdGVzdCB2YWx1ZSBoZXJlLCBwcmltYXJpbHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gVGhlCisgKiByZXR1cm4gdmFsdWUgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGEgcHJldmlvdXNseSBzYW1wbGVkIHZhbHVlIGluIGxhdGVyIGNhbGxzCisgKiBhcyBpdCB3aWxsIG5vdCBoYXZlIHRoZSBTRUVOIGZsYWcgc2V0LgorICovCitlcnJzZXFfdCBlcnJzZXFfc2V0KGVycnNlcV90ICplc2VxLCBpbnQgZXJyKQoreworCWVycnNlcV90IGN1ciwgb2xkOworCisJLyogTUFYX0VSUk5PIG11c3QgYmUgYWJsZSB0byBzZXJ2ZSBhcyBhIG1hc2sgKi8KKwlCVUlMRF9CVUdfT05fTk9UX1BPV0VSX09GXzIoTUFYX0VSUk5PICsgMSk7CisKKwkvKgorCSAqIEVuc3VyZSB0aGUgZXJyb3IgY29kZSBhY3R1YWxseSBmaXRzIHdoZXJlIHdlIHdhbnQgaXQgdG8gZ28uIElmIGl0CisJICogZG9lc24ndCB0aGVuIGp1c3QgdGhyb3cgYSB3YXJuaW5nIGFuZCBkb24ndCByZWNvcmQgYW55dGhpbmcuIFdlCisJICogYWxzbyBkb24ndCBhY2NlcHQgemVybyBoZXJlIGFzIHRoYXQgd291bGQgZWZmZWN0aXZlbHkgY2xlYXIgYQorCSAqIHByZXZpb3VzIGVycm9yLgorCSAqLworCW9sZCA9IFJFQURfT05DRSgqZXNlcSk7CisKKwlpZiAoV0FSTih1bmxpa2VseShlcnIgPT0gMCB8fCAodW5zaWduZWQgaW50KS1lcnIgPiBNQVhfRVJSTk8pLAorCQkJCSJlcnIgPSAlZFxuIiwgZXJyKSkKKwkJcmV0dXJuIG9sZDsKKworCWZvciAoOzspIHsKKwkJZXJyc2VxX3QgbmV3OworCisJCS8qIENsZWFyIG91dCBlcnJvciBiaXRzIGFuZCBzZXQgbmV3IGVycm9yICovCisJCW5ldyA9IChvbGQgJiB+KE1BWF9FUlJOT3xFUlJTRVFfU0VFTikpIHwgLWVycjsKKworCQkvKiBPbmx5IGluY3JlbWVudCBpZiBzb21lb25lIGhhcyBsb29rZWQgYXQgaXQgKi8KKwkJaWYgKG9sZCAmIEVSUlNFUV9TRUVOKQorCQkJbmV3ICs9IEVSUlNFUV9DVFJfSU5DOworCisJCS8qIElmIHRoZXJlIHdvdWxkIGJlIG5vIGNoYW5nZSwgdGhlbiBjYWxsIGl0IGRvbmUgKi8KKwkJaWYgKG5ldyA9PSBvbGQpIHsKKwkJCWN1ciA9IG5ldzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogVHJ5IHRvIHN3YXAgdGhlIG5ldyB2YWx1ZSBpbnRvIHBsYWNlICovCisJCWN1ciA9IGNtcHhjaGcoZXNlcSwgb2xkLCBuZXcpOworCisJCS8qCisJCSAqIENhbGwgaXQgc3VjY2VzcyBpZiB3ZSBkaWQgdGhlIHN3YXAgb3Igc29tZW9uZSBlbHNlIGJlYXQgdXMKKwkJICogdG8gaXQgZm9yIHRoZSBzYW1lIHZhbHVlLgorCQkgKi8KKwkJaWYgKGxpa2VseShjdXIgPT0gb2xkIHx8IGN1ciA9PSBuZXcpKQorCQkJYnJlYWs7CisKKwkJLyogUmFjZWQgd2l0aCBhbiB1cGRhdGUsIHRyeSBhZ2FpbiAqLworCQlvbGQgPSBjdXI7CisJfQorCXJldHVybiBjdXI7Cit9CitFWFBPUlRfU1lNQk9MKGVycnNlcV9zZXQpOworCisvKioKKyAqIGVycnNlcV9zYW1wbGUgLSBncmFiIGN1cnJlbnQgZXJyc2VxX3QgdmFsdWUKKyAqIEBlc2VxOiBwb2ludGVyIHRvIGVycnNlcV90IHRvIGJlIHNhbXBsZWQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyBjYWxsZXJzIHRvIGluaXRpYWxpc2UgdGhlaXIgZXJyc2VxX3QgdmFyaWFibGUuCisgKiBJZiB0aGUgZXJyb3IgaGFzIGJlZW4gInNlZW4iLCBuZXcgY2FsbGVycyB3aWxsIG5vdCBzZWUgYW4gb2xkIGVycm9yLgorICogSWYgdGhlcmUgaXMgYW4gdW5zZWVuIGVycm9yIGluIEBlc2VxLCB0aGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gd2lsbAorICogc2VlIGl0IHRoZSBuZXh0IHRpbWUgaXQgY2hlY2tzIGZvciBhbiBlcnJvci4KKyAqCisgKiBDb250ZXh0OiBBbnkgY29udGV4dC4KKyAqIFJldHVybjogVGhlIGN1cnJlbnQgZXJyc2VxIHZhbHVlLgorICovCitlcnJzZXFfdCBlcnJzZXFfc2FtcGxlKGVycnNlcV90ICplc2VxKQoreworCWVycnNlcV90IG9sZCA9IFJFQURfT05DRSgqZXNlcSk7CisKKwkvKiBJZiBub2JvZHkgaGFzIHNlZW4gdGhpcyBlcnJvciB5ZXQsIHRoZW4gd2UgY2FuIGJlIHRoZSBmaXJzdC4gKi8KKwlpZiAoIShvbGQgJiBFUlJTRVFfU0VFTikpCisJCW9sZCA9IDA7CisJcmV0dXJuIG9sZDsKK30KK0VYUE9SVF9TWU1CT0woZXJyc2VxX3NhbXBsZSk7CisKKy8qKgorICogZXJyc2VxX2NoZWNrIC0gaGFzIGFuIGVycm9yIG9jY3VycmVkIHNpbmNlIGEgcGFydGljdWxhciBzYW1wbGUgcG9pbnQ/CisgKiBAZXNlcTogcG9pbnRlciB0byBlcnJzZXFfdCB2YWx1ZSB0byBiZSBjaGVja2VkCisgKiBAc2luY2U6IHByZXZpb3VzbHktc2FtcGxlZCBlcnJzZXFfdCBmcm9tIHdoaWNoIHRvIGNoZWNrCisgKgorICogR3JhYiB0aGUgdmFsdWUgdGhhdCBlc2VxIHBvaW50cyB0bywgYW5kIHNlZSBpZiBpdCBoYXMgY2hhbmdlZCAic2luY2UiCisgKiB0aGUgZ2l2ZW4gdmFsdWUgd2FzIHNhbXBsZWQuIFRoZSAic2luY2UiIHZhbHVlIGlzIG5vdCBhZHZhbmNlZCwgc28gdGhlcmUKKyAqIGlzIG5vIG5lZWQgdG8gbWFyayB0aGUgdmFsdWUgYXMgc2Vlbi4KKyAqCisgKiBSZXR1cm5zIHRoZSBsYXRlc3QgZXJyb3Igc2V0IGluIHRoZSBlcnJzZXFfdCBvciAwIGlmIGl0IGhhc24ndCBjaGFuZ2VkLgorICovCitpbnQgZXJyc2VxX2NoZWNrKGVycnNlcV90ICplc2VxLCBlcnJzZXFfdCBzaW5jZSkKK3sKKwllcnJzZXFfdCBjdXIgPSBSRUFEX09OQ0UoKmVzZXEpOworCisJaWYgKGxpa2VseShjdXIgPT0gc2luY2UpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gLShjdXIgJiBNQVhfRVJSTk8pOworfQorRVhQT1JUX1NZTUJPTChlcnJzZXFfY2hlY2spOworCisvKioKKyAqIGVycnNlcV9jaGVja19hbmRfYWR2YW5jZSAtIGNoZWNrIGFuIGVycnNlcV90IGFuZCBhZHZhbmNlIHRvIGN1cnJlbnQgdmFsdWUKKyAqIEBlc2VxOiBwb2ludGVyIHRvIHZhbHVlIGJlaW5nIGNoZWNrZWQgYW5kIHJlcG9ydGVkCisgKiBAc2luY2U6IHBvaW50ZXIgdG8gcHJldmlvdXNseS1zYW1wbGVkIGVycnNlcV90IHRvIGNoZWNrIGFnYWluc3QgYW5kIGFkdmFuY2UKKyAqCisgKiBHcmFiIHRoZSBlc2VxIHZhbHVlLCBhbmQgc2VlIHdoZXRoZXIgaXQgbWF0Y2hlcyB0aGUgdmFsdWUgdGhhdCAic2luY2UiCisgKiBwb2ludHMgdG8uIElmIGl0IGRvZXMsIHRoZW4ganVzdCByZXR1cm4gMC4KKyAqCisgKiBJZiBpdCBkb2Vzbid0LCB0aGVuIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZC4gU2V0IHRoZSAic2VlbiIgZmxhZywgYW5kIHRyeSB0bworICogc3dhcCBpdCBpbnRvIHBsYWNlIGFzIHRoZSBuZXcgZXNlcSB2YWx1ZS4gVGhlbiwgc2V0IHRoYXQgdmFsdWUgYXMgdGhlIG5ldworICogInNpbmNlIiB2YWx1ZSwgYW5kIHJldHVybiB3aGF0ZXZlciB0aGUgZXJyb3IgcG9ydGlvbiBpcyBzZXQgdG8uCisgKgorICogTm90ZSB0aGF0IG5vIGxvY2tpbmcgaXMgcHJvdmlkZWQgaGVyZSBmb3IgY29uY3VycmVudCB1cGRhdGVzIHRvIHRoZSAic2luY2UiCisgKiB2YWx1ZS4gVGhlIGNhbGxlciBtdXN0IHByb3ZpZGUgdGhhdCBpZiBuZWNlc3NhcnkuIEJlY2F1c2Ugb2YgdGhpcywgY2FsbGVycworICogbWF5IHdhbnQgdG8gZG8gYSBsb2NrbGVzcyBlcnJzZXFfY2hlY2sgYmVmb3JlIHRha2luZyB0aGUgbG9jayBhbmQgY2FsbGluZworICogdGhpcy4KKyAqLworaW50IGVycnNlcV9jaGVja19hbmRfYWR2YW5jZShlcnJzZXFfdCAqZXNlcSwgZXJyc2VxX3QgKnNpbmNlKQoreworCWludCBlcnIgPSAwOworCWVycnNlcV90IG9sZCwgbmV3OworCisJLyoKKwkgKiBNb3N0IGNhbGxlcnMgd2lsbCB3YW50IHRvIHVzZSB0aGUgaW5saW5lIHdyYXBwZXIgdG8gY2hlY2sgdGhpcywKKwkgKiBzbyB0aGF0IHRoZSBjb21tb24gY2FzZSBvZiBubyBlcnJvciBpcyBoYW5kbGVkIHdpdGhvdXQgbmVlZGluZworCSAqIHRvIHRha2UgdGhlIGxvY2sgdGhhdCBwcm90ZWN0cyB0aGUgInNpbmNlIiB2YWx1ZS4KKwkgKi8KKwlvbGQgPSBSRUFEX09OQ0UoKmVzZXEpOworCWlmIChvbGQgIT0gKnNpbmNlKSB7CisJCS8qCisJCSAqIFNldCB0aGUgZmxhZyBhbmQgdHJ5IHRvIHN3YXAgaXQgaW50byBwbGFjZSBpZiBpdCBoYXMKKwkJICogY2hhbmdlZC4KKwkJICoKKwkJICogV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgb3V0Y29tZSBvZiB0aGUgc3dhcCBoZXJlLiBJZiB0aGUKKwkJICogc3dhcCBkb2Vzbid0IG9jY3VyLCB0aGVuIGl0IGhhcyBlaXRoZXIgYmVlbiB1cGRhdGVkIGJ5IGEKKwkJICogd3JpdGVyIHdobyBpcyBhbHRlcmluZyB0aGUgdmFsdWUgaW4gc29tZSB3YXkgKHVwZGF0aW5nCisJCSAqIGNvdW50ZXIgb3IgcmVzZXR0aW5nIHRoZSBlcnJvciksIG9yIGFub3RoZXIgcmVhZGVyIHdobyBpcworCQkgKiBqdXN0IHNldHRpbmcgdGhlICJzZWVuIiBmbGFnLiBFaXRoZXIgb3V0Y29tZSBpcyBPSywgYW5kIHdlCisJCSAqIGNhbiBhZHZhbmNlICJzaW5jZSIgYW5kIHJldHVybiBhbiBlcnJvciBiYXNlZCBvbiB3aGF0IHdlCisJCSAqIGhhdmUuCisJCSAqLworCQluZXcgPSBvbGQgfCBFUlJTRVFfU0VFTjsKKwkJaWYgKG5ldyAhPSBvbGQpCisJCQljbXB4Y2hnKGVzZXEsIG9sZCwgbmV3KTsKKwkJKnNpbmNlID0gbmV3OworCQllcnIgPSAtKG5ldyAmIE1BWF9FUlJOTyk7CisJfQorCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGVycnNlcV9jaGVja19hbmRfYWR2YW5jZSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9leHRhYmxlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9leHRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU0OTk2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2V4dGFibGUuYwpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIERlcml2ZWQgZnJvbSBhcmNoL3BwYy9tbS9leHRhYmxlLmMgYW5kIGFyY2gvaTM4Ni9tbS9leHRhYmxlLmMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9ic2VhcmNoLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKyNpZm5kZWYgQVJDSF9IQVNfUkVMQVRJVkVfRVhUQUJMRQorI2RlZmluZSBleF90b19pbnNuKHgpCSgoeCktPmluc24pCisjZWxzZQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGV4X3RvX2luc24oY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqeCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpJngtPmluc24gKyB4LT5pbnNuOworfQorI2VuZGlmCisKKyNpZm5kZWYgQVJDSF9IQVNfU09SVF9FWFRBQkxFCisjaWZuZGVmIEFSQ0hfSEFTX1JFTEFUSVZFX0VYVEFCTEUKKyNkZWZpbmUgc3dhcF9leAkJTlVMTAorI2Vsc2UKK3N0YXRpYyB2b2lkIHN3YXBfZXgodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCit7CisJc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqeCA9IGEsICp5ID0gYiwgdG1wOworCWludCBkZWx0YSA9IGIgLSBhOworCisJdG1wID0gKng7CisJeC0+aW5zbiA9IHktPmluc24gKyBkZWx0YTsKKwl5LT5pbnNuID0gdG1wLmluc24gLSBkZWx0YTsKKworI2lmZGVmIHN3YXBfZXhfZW50cnlfZml4dXAKKwlzd2FwX2V4X2VudHJ5X2ZpeHVwKHgsIHksIHRtcCwgZGVsdGEpOworI2Vsc2UKKwl4LT5maXh1cCA9IHktPmZpeHVwICsgZGVsdGE7CisJeS0+Zml4dXAgPSB0bXAuZml4dXAgLSBkZWx0YTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIEFSQ0hfSEFTX1JFTEFUSVZFX0VYVEFCTEUgKi8KKworLyoKKyAqIFRoZSBleGNlcHRpb24gdGFibGUgbmVlZHMgdG8gYmUgc29ydGVkIHNvIHRoYXQgdGhlIGJpbmFyeQorICogc2VhcmNoIHRoYXQgd2UgdXNlIHRvIGZpbmQgZW50cmllcyBpbiBpdCB3b3JrcyBwcm9wZXJseS4KKyAqIFRoaXMgaXMgdXNlZCBib3RoIGZvciB0aGUga2VybmVsIGV4Y2VwdGlvbiB0YWJsZSBhbmQgZm9yCisgKiB0aGUgZXhjZXB0aW9uIHRhYmxlcyBvZiBtb2R1bGVzIHRoYXQgZ2V0IGxvYWRlZC4KKyAqLworc3RhdGljIGludCBjbXBfZXhfc29ydChjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnggPSBhLCAqeSA9IGI7CisKKwkvKiBhdm9pZCBvdmVyZmxvdyAqLworCWlmIChleF90b19pbnNuKHgpID4gZXhfdG9faW5zbih5KSkKKwkJcmV0dXJuIDE7CisJaWYgKGV4X3RvX2luc24oeCkgPCBleF90b19pbnNuKHkpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc29ydF9leHRhYmxlKHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKnN0YXJ0LAorCQkgIHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkgKmZpbmlzaCkKK3sKKwlzb3J0KHN0YXJ0LCBmaW5pc2ggLSBzdGFydCwgc2l6ZW9mKHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkpLAorCSAgICAgY21wX2V4X3NvcnQsIHN3YXBfZXgpOworfQorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKy8qCisgKiBJZiB0aGUgZXhjZXB0aW9uIHRhYmxlIGlzIHNvcnRlZCwgYW55IHJlZmVycmluZyB0byB0aGUgbW9kdWxlIGluaXQKKyAqIHdpbGwgYmUgYXQgdGhlIGJlZ2lubmluZyBvciB0aGUgZW5kLgorICovCit2b2lkIHRyaW1faW5pdF9leHRhYmxlKHN0cnVjdCBtb2R1bGUgKm0pCit7CisJLyp0cmltIHRoZSBiZWdpbm5pbmcqLworCXdoaWxlIChtLT5udW1fZXhlbnRyaWVzICYmCisJICAgICAgIHdpdGhpbl9tb2R1bGVfaW5pdChleF90b19pbnNuKCZtLT5leHRhYmxlWzBdKSwgbSkpIHsKKwkJbS0+ZXh0YWJsZSsrOworCQltLT5udW1fZXhlbnRyaWVzLS07CisJfQorCS8qdHJpbSB0aGUgZW5kKi8KKwl3aGlsZSAobS0+bnVtX2V4ZW50cmllcyAmJgorCSAgICAgICB3aXRoaW5fbW9kdWxlX2luaXQoZXhfdG9faW5zbigmbS0+ZXh0YWJsZVttLT5udW1fZXhlbnRyaWVzIC0gMV0pLAorCQkJCSAgbSkpCisJCW0tPm51bV9leGVudHJpZXMtLTsKK30KKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworI2VuZGlmIC8qICFBUkNIX0hBU19TT1JUX0VYVEFCTEUgKi8KKworI2lmbmRlZiBBUkNIX0hBU19TRUFSQ0hfRVhUQUJMRQorCitzdGF0aWMgaW50IGNtcF9leF9zZWFyY2goY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICplbHQpCit7CisJY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqX2VsdCA9IGVsdDsKKwl1bnNpZ25lZCBsb25nIF9rZXkgPSAqKHVuc2lnbmVkIGxvbmcgKilrZXk7CisKKwkvKiBhdm9pZCBvdmVyZmxvdyAqLworCWlmIChfa2V5ID4gZXhfdG9faW5zbihfZWx0KSkKKwkJcmV0dXJuIDE7CisJaWYgKF9rZXkgPCBleF90b19pbnNuKF9lbHQpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZWFyY2ggb25lIGV4Y2VwdGlvbiB0YWJsZSBmb3IgYW4gZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUKKyAqIGdpdmVuIGluc3RydWN0aW9uIGFkZHJlc3MsIGFuZCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIGVudHJ5LAorICogb3IgTlVMTCBpZiBub25lIGlzIGZvdW5kLgorICogV2UgdXNlIGEgYmluYXJ5IHNlYXJjaCwgYW5kIHRodXMgd2UgYXNzdW1lIHRoYXQgdGhlIHRhYmxlIGlzCisgKiBhbHJlYWR5IHNvcnRlZC4KKyAqLworY29uc3Qgc3RydWN0IGV4Y2VwdGlvbl90YWJsZV9lbnRyeSAqCitzZWFyY2hfZXh0YWJsZShjb25zdCBzdHJ1Y3QgZXhjZXB0aW9uX3RhYmxlX2VudHJ5ICpiYXNlLAorCSAgICAgICBjb25zdCBzaXplX3QgbnVtLAorCSAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQoreworCXJldHVybiBic2VhcmNoKCZ2YWx1ZSwgYmFzZSwgbnVtLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBleGNlcHRpb25fdGFibGVfZW50cnkpLCBjbXBfZXhfc2VhcmNoKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmF1bHQtaW5qZWN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mYXVsdC1pbmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjdiMTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmF1bHQtaW5qZWN0LmMKQEAgLTAsMCArMSwyNTggQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mYXVsdC1pbmplY3QuaD4KKworLyoKKyAqIHNldHVwX2ZhdWx0X2F0dHIoKSBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdmFyaW91cyBfX3NldHVwIGhhbmRsZXJzLCBzbyBpdAorICogcmV0dXJucyAwIG9uIGVycm9yLCBiZWNhdXNlIHRoYXQgaXMgd2hhdCBfX3NldHVwIGhhbmRsZXJzIGRvLgorICovCitpbnQgc2V0dXBfZmF1bHRfYXR0cihzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0ciwgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcgcHJvYmFiaWxpdHk7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKwlpbnQgdGltZXM7CisJaW50IHNwYWNlOworCisJLyogIjxpbnRlcnZhbD4sPHByb2JhYmlsaXR5Piw8c3BhY2U+LDx0aW1lcz4iICovCisJaWYgKHNzY2FuZihzdHIsICIlbHUsJWx1LCVkLCVkIiwKKwkJCSZpbnRlcnZhbCwgJnByb2JhYmlsaXR5LCAmc3BhY2UsICZ0aW1lcykgPCA0KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSJGQVVMVF9JTkpFQ1RJT046IGZhaWxlZCB0byBwYXJzZSBhcmd1bWVudHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhdHRyLT5wcm9iYWJpbGl0eSA9IHByb2JhYmlsaXR5OworCWF0dHItPmludGVydmFsID0gaW50ZXJ2YWw7CisJYXRvbWljX3NldCgmYXR0ci0+dGltZXMsIHRpbWVzKTsKKwlhdG9taWNfc2V0KCZhdHRyLT5zcGFjZSwgc3BhY2UpOworCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzZXR1cF9mYXVsdF9hdHRyKTsKKworc3RhdGljIHZvaWQgZmFpbF9kdW1wKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoreworCWlmIChhdHRyLT52ZXJib3NlID4gMCAmJiBfX3JhdGVsaW1pdCgmYXR0ci0+cmF0ZWxpbWl0X3N0YXRlKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgIkZBVUxUX0lOSkVDVElPTjogZm9yY2luZyBhIGZhaWx1cmUuXG4iCisJCSAgICAgICAibmFtZSAlcGQsIGludGVydmFsICVsdSwgcHJvYmFiaWxpdHkgJWx1LCAiCisJCSAgICAgICAic3BhY2UgJWQsIHRpbWVzICVkXG4iLCBhdHRyLT5kbmFtZSwKKwkJICAgICAgIGF0dHItPmludGVydmFsLCBhdHRyLT5wcm9iYWJpbGl0eSwKKwkJICAgICAgIGF0b21pY19yZWFkKCZhdHRyLT5zcGFjZSksCisJCSAgICAgICBhdG9taWNfcmVhZCgmYXR0ci0+dGltZXMpKTsKKwkJaWYgKGF0dHItPnZlcmJvc2UgPiAxKQorCQkJZHVtcF9zdGFjaygpOworCX0KK30KKworI2RlZmluZSBhdG9taWNfZGVjX25vdF96ZXJvKHYpCQlhdG9taWNfYWRkX3VubGVzcygodiksIC0xLCAwKQorCitzdGF0aWMgYm9vbCBmYWlsX3Rhc2soc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gaW5fdGFzaygpICYmIHRhc2stPm1ha2VfaXRfZmFpbDsKK30KKworI2RlZmluZSBNQVhfU1RBQ0tfVFJBQ0VfREVQVEggMzIKKworI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIKKworc3RhdGljIGJvb2wgZmFpbF9zdGFja3RyYWNlKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoreworCXN0cnVjdCBzdGFja190cmFjZSB0cmFjZTsKKwlpbnQgZGVwdGggPSBhdHRyLT5zdGFja3RyYWNlX2RlcHRoOworCXVuc2lnbmVkIGxvbmcgZW50cmllc1tNQVhfU1RBQ0tfVFJBQ0VfREVQVEhdOworCWludCBuOworCWJvb2wgZm91bmQgPSAoYXR0ci0+cmVxdWlyZV9zdGFydCA9PSAwICYmIGF0dHItPnJlcXVpcmVfZW5kID09IFVMT05HX01BWCk7CisKKwlpZiAoZGVwdGggPT0gMCkKKwkJcmV0dXJuIGZvdW5kOworCisJdHJhY2UubnJfZW50cmllcyA9IDA7CisJdHJhY2UuZW50cmllcyA9IGVudHJpZXM7CisJdHJhY2UubWF4X2VudHJpZXMgPSBkZXB0aDsKKwl0cmFjZS5za2lwID0gMTsKKworCXNhdmVfc3RhY2tfdHJhY2UoJnRyYWNlKTsKKwlmb3IgKG4gPSAwOyBuIDwgdHJhY2UubnJfZW50cmllczsgbisrKSB7CisJCWlmIChhdHRyLT5yZWplY3Rfc3RhcnQgPD0gZW50cmllc1tuXSAmJgorCQkJICAgICAgIGVudHJpZXNbbl0gPCBhdHRyLT5yZWplY3RfZW5kKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoYXR0ci0+cmVxdWlyZV9zdGFydCA8PSBlbnRyaWVzW25dICYmCisJCQkgICAgICAgZW50cmllc1tuXSA8IGF0dHItPnJlcXVpcmVfZW5kKQorCQkJZm91bmQgPSB0cnVlOworCX0KKwlyZXR1cm4gZm91bmQ7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBmYWlsX3N0YWNrdHJhY2Uoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCit7CisJcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSICovCisKKy8qCisgKiBUaGlzIGNvZGUgaXMgc3RvbGVuIGZyb20gZmFpbG1hbGxvYy0xLjAKKyAqIGh0dHA6Ly93d3cubm9uZ251Lm9yZy9mYWlsbWFsbG9jLworICovCisKK2Jvb2wgc2hvdWxkX2ZhaWwoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIHNzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoaW5fdGFzaygpKSB7CisJCXVuc2lnbmVkIGludCBmYWlsX250aCA9IFJFQURfT05DRShjdXJyZW50LT5mYWlsX250aCk7CisKKwkJaWYgKGZhaWxfbnRoKSB7CisJCQlpZiAoIVdSSVRFX09OQ0UoY3VycmVudC0+ZmFpbF9udGgsIGZhaWxfbnRoIC0gMSkpCisJCQkJZ290byBmYWlsOworCisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKiBObyBuZWVkIHRvIGNoZWNrIGFueSBvdGhlciBwcm9wZXJ0aWVzIGlmIHRoZSBwcm9iYWJpbGl0eSBpcyAwICovCisJaWYgKGF0dHItPnByb2JhYmlsaXR5ID09IDApCisJCXJldHVybiBmYWxzZTsKKworCWlmIChhdHRyLT50YXNrX2ZpbHRlciAmJiAhZmFpbF90YXNrKGF0dHIsIGN1cnJlbnQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYXRvbWljX3JlYWQoJmF0dHItPnRpbWVzKSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYXRvbWljX3JlYWQoJmF0dHItPnNwYWNlKSA+IHNpemUpIHsKKwkJYXRvbWljX3N1YihzaXplLCAmYXR0ci0+c3BhY2UpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKGF0dHItPmludGVydmFsID4gMSkgeworCQlhdHRyLT5jb3VudCsrOworCQlpZiAoYXR0ci0+Y291bnQgJSBhdHRyLT5pbnRlcnZhbCkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoYXR0ci0+cHJvYmFiaWxpdHkgPD0gcHJhbmRvbV91MzIoKSAlIDEwMCkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKCFmYWlsX3N0YWNrdHJhY2UoYXR0cikpCisJCXJldHVybiBmYWxzZTsKKworZmFpbDoKKwlmYWlsX2R1bXAoYXR0cik7CisKKwlpZiAoYXRvbWljX3JlYWQoJmF0dHItPnRpbWVzKSAhPSAtMSkKKwkJYXRvbWljX2RlY19ub3RfemVybygmYXR0ci0+dGltZXMpOworCisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzaG91bGRfZmFpbCk7CisKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCisKK3N0YXRpYyBpbnQgZGVidWdmc191bF9zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwkqKHVuc2lnbmVkIGxvbmcgKilkYXRhID0gdmFsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRlYnVnZnNfdWxfZ2V0KHZvaWQgKmRhdGEsIHU2NCAqdmFsKQoreworCSp2YWwgPSAqKHVuc2lnbmVkIGxvbmcgKilkYXRhOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3VsLCBkZWJ1Z2ZzX3VsX2dldCwgZGVidWdmc191bF9zZXQsICIlbGx1XG4iKTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNfY3JlYXRlX3VsKGNvbnN0IGNoYXIgKm5hbWUsIHVtb2RlX3QgbW9kZSwKKwkJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX3VsKTsKK30KKworI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIKKworc3RhdGljIGludCBkZWJ1Z2ZzX3N0YWNrdHJhY2VfZGVwdGhfc2V0KHZvaWQgKmRhdGEsIHU2NCB2YWwpCit7CisJKih1bnNpZ25lZCBsb25nICopZGF0YSA9CisJCW1pbl90KHVuc2lnbmVkIGxvbmcsIHZhbCwgTUFYX1NUQUNLX1RSQUNFX0RFUFRIKTsKKworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX3N0YWNrdHJhY2VfZGVwdGgsIGRlYnVnZnNfdWxfZ2V0LAorCQkJZGVidWdmc19zdGFja3RyYWNlX2RlcHRoX3NldCwgIiVsbHVcbiIpOworCitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGVidWdmc19jcmVhdGVfc3RhY2t0cmFjZV9kZXB0aCgKKwljb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsCisJc3RydWN0IGRlbnRyeSAqcGFyZW50LCB1bnNpZ25lZCBsb25nICp2YWx1ZSkKK3sKKwlyZXR1cm4gZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBtb2RlLCBwYXJlbnQsIHZhbHVlLAorCQkJCSAgICZmb3BzX3N0YWNrdHJhY2VfZGVwdGgpOworfQorCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9TVEFDS1RSQUNFX0ZJTFRFUiAqLworCitzdHJ1Y3QgZGVudHJ5ICpmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQoreworCXVtb2RlX3QgbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CisKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX3VsKCJwcm9iYWJpbGl0eSIsIG1vZGUsIGRpciwgJmF0dHItPnByb2JhYmlsaXR5KSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfdWwoImludGVydmFsIiwgbW9kZSwgZGlyLCAmYXR0ci0+aW50ZXJ2YWwpKQorCQlnb3RvIGZhaWw7CisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9hdG9taWNfdCgidGltZXMiLCBtb2RlLCBkaXIsICZhdHRyLT50aW1lcykpCisJCWdvdG8gZmFpbDsKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2F0b21pY190KCJzcGFjZSIsIG1vZGUsIGRpciwgJmF0dHItPnNwYWNlKSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfdWwoInZlcmJvc2UiLCBtb2RlLCBkaXIsICZhdHRyLT52ZXJib3NlKSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfdTMyKCJ2ZXJib3NlX3JhdGVsaW1pdF9pbnRlcnZhbF9tcyIsIG1vZGUsIGRpciwKKwkJCQkmYXR0ci0+cmF0ZWxpbWl0X3N0YXRlLmludGVydmFsKSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfdTMyKCJ2ZXJib3NlX3JhdGVsaW1pdF9idXJzdCIsIG1vZGUsIGRpciwKKwkJCQkmYXR0ci0+cmF0ZWxpbWl0X3N0YXRlLmJ1cnN0KSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgidGFzay1maWx0ZXIiLCBtb2RlLCBkaXIsICZhdHRyLT50YXNrX2ZpbHRlcikpCisJCWdvdG8gZmFpbDsKKworI2lmZGVmIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fU1RBQ0tUUkFDRV9GSUxURVIKKworCWlmICghZGVidWdmc19jcmVhdGVfc3RhY2t0cmFjZV9kZXB0aCgic3RhY2t0cmFjZS1kZXB0aCIsIG1vZGUsIGRpciwKKwkJCQkmYXR0ci0+c3RhY2t0cmFjZV9kZXB0aCkpCisJCWdvdG8gZmFpbDsKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX3VsKCJyZXF1aXJlLXN0YXJ0IiwgbW9kZSwgZGlyLAorCQkJCSZhdHRyLT5yZXF1aXJlX3N0YXJ0KSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfdWwoInJlcXVpcmUtZW5kIiwgbW9kZSwgZGlyLCAmYXR0ci0+cmVxdWlyZV9lbmQpKQorCQlnb3RvIGZhaWw7CisJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV91bCgicmVqZWN0LXN0YXJ0IiwgbW9kZSwgZGlyLCAmYXR0ci0+cmVqZWN0X3N0YXJ0KSkKKwkJZ290byBmYWlsOworCWlmICghZGVidWdmc19jcmVhdGVfdWwoInJlamVjdC1lbmQiLCBtb2RlLCBkaXIsICZhdHRyLT5yZWplY3RfZW5kKSkKKwkJZ290byBmYWlsOworCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9TVEFDS1RSQUNFX0ZJTFRFUiAqLworCisJYXR0ci0+ZG5hbWUgPSBkZ2V0KGRpcik7CisJcmV0dXJuIGRpcjsKK2ZhaWw6CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIpOworCisjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmR0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YyMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmR0LmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSA8bGludXgvbGliZmR0X2Vudi5oPgorI2luY2x1ZGUgIi4uL3NjcmlwdHMvZHRjL2xpYmZkdC9mZHQuYyIKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF9lbXB0eV90cmVlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfZW1wdHlfdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzBjNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfZW1wdHlfdHJlZS5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgPGxpbnV4L2xpYmZkdF9lbnYuaD4KKyNpbmNsdWRlICIuLi9zY3JpcHRzL2R0Yy9saWJmZHQvZmR0X2VtcHR5X3RyZWUuYyIKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF9yby5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmR0X3JvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczYzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF9yby5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgPGxpbnV4L2xpYmZkdF9lbnYuaD4KKyNpbmNsdWRlICIuLi9zY3JpcHRzL2R0Yy9saWJmZHQvZmR0X3JvLmMiCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfcncuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF9ydy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWYwZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfcncuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlIDxsaW51eC9saWJmZHRfZW52Lmg+CisjaW5jbHVkZSAiLi4vc2NyaXB0cy9kdGMvbGliZmR0L2ZkdF9ydy5jIgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmR0X3N0cmVycm9yLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfc3RyZXJyb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzEzZTNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmR0X3N0cmVycm9yLmMKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSA8bGludXgvbGliZmR0X2Vudi5oPgorI2luY2x1ZGUgIi4uL3NjcmlwdHMvZHRjL2xpYmZkdC9mZHRfc3RyZXJyb3IuYyIKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF9zdy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmR0X3N3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjN2U1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF9zdy5jCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgPGxpbnV4L2xpYmZkdF9lbnYuaD4KKyNpbmNsdWRlICIuLi9zY3JpcHRzL2R0Yy9saWJmZHQvZmR0X3N3LmMiCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfd2lwLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mZHRfd2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDViM2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZkdF93aXAuYwpAQCAtMCwwICsxLDIgQEAKKyNpbmNsdWRlIDxsaW51eC9saWJmZHRfZW52Lmg+CisjaW5jbHVkZSAiLi4vc2NyaXB0cy9kdGMvbGliZmR0L2ZkdF93aXAuYyIKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZpbmRfYml0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9maW5kX2JpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4M2VmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9maW5kX2JpdC5jCkBAIC0wLDAgKzEsMTgxIEBACisvKiBiaXQgc2VhcmNoIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFJlZCBIYXQsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqIFdyaXR0ZW4gYnkgRGF2aWQgSG93ZWxscyAoZGhvd2VsbHNAcmVkaGF0LmNvbSkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggSUJNIENvcnBvcmF0aW9uCisgKiAnZmluZF9sYXN0X2JpdCcgaXMgd3JpdHRlbiBieSBSdXN0eSBSdXNzZWxsIDxydXN0eUBydXN0Y29ycC5jb20uYXU+CisgKiAoSW5zcGlyZWQgYnkgRGF2aWQgSG93ZWxsJ3MgZmluZF9uZXh0X2JpdCBpbXBsZW1lbnRhdGlvbikKKyAqCisgKiBSZXdyaXR0ZW4gYnkgWXVyeSBOb3JvdiA8eXVyeS5ub3JvdkBnbWFpbC5jb20+IHRvIGRlY3JlYXNlCisgKiBzaXplIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLCAyMDE1LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaWYgIWRlZmluZWQoZmluZF9uZXh0X2JpdCkgfHwgIWRlZmluZWQoZmluZF9uZXh0X3plcm9fYml0KQorCisvKgorICogVGhpcyBpcyBhIGNvbW1vbiBoZWxwZXIgZnVuY3Rpb24gZm9yIGZpbmRfbmV4dF9iaXQgYW5kCisgKiBmaW5kX25leHRfemVyb19iaXQuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGUgImludmVydCIgYXJndW1lbnQsIHdoaWNoCisgKiBpcyBYT1JlZCB3aXRoIGVhY2ggZmV0Y2hlZCB3b3JkIGJlZm9yZSBzZWFyY2hpbmcgaXQgZm9yIG9uZSBiaXRzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfZmluZF9uZXh0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLAorCQl1bnNpZ25lZCBsb25nIG5iaXRzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGludmVydCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmICh1bmxpa2VseShzdGFydCA+PSBuYml0cykpCisJCXJldHVybiBuYml0czsKKworCXRtcCA9IGFkZHJbc3RhcnQgLyBCSVRTX1BFUl9MT05HXSBeIGludmVydDsKKworCS8qIEhhbmRsZSAxc3Qgd29yZC4gKi8KKwl0bXAgJj0gQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCk7CisJc3RhcnQgPSByb3VuZF9kb3duKHN0YXJ0LCBCSVRTX1BFUl9MT05HKTsKKworCXdoaWxlICghdG1wKSB7CisJCXN0YXJ0ICs9IEJJVFNfUEVSX0xPTkc7CisJCWlmIChzdGFydCA+PSBuYml0cykKKwkJCXJldHVybiBuYml0czsKKworCQl0bXAgPSBhZGRyW3N0YXJ0IC8gQklUU19QRVJfTE9OR10gXiBpbnZlcnQ7CisJfQorCisJcmV0dXJuIG1pbihzdGFydCArIF9fZmZzKHRtcCksIG5iaXRzKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIGZpbmRfbmV4dF9iaXQKKy8qCisgKiBGaW5kIHRoZSBuZXh0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uLgorICovCit1bnNpZ25lZCBsb25nIGZpbmRfbmV4dF9iaXQoY29uc3QgdW5zaWduZWQgbG9uZyAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBfZmluZF9uZXh0X2JpdChhZGRyLCBzaXplLCBvZmZzZXQsIDBVTCk7Cit9CitFWFBPUlRfU1lNQk9MKGZpbmRfbmV4dF9iaXQpOworI2VuZGlmCisKKyNpZm5kZWYgZmluZF9uZXh0X3plcm9fYml0Cit1bnNpZ25lZCBsb25nIGZpbmRfbmV4dF96ZXJvX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBfZmluZF9uZXh0X2JpdChhZGRyLCBzaXplLCBvZmZzZXQsIH4wVUwpOworfQorRVhQT1JUX1NZTUJPTChmaW5kX25leHRfemVyb19iaXQpOworI2VuZGlmCisKKyNpZm5kZWYgZmluZF9maXJzdF9iaXQKKy8qCisgKiBGaW5kIHRoZSBmaXJzdCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbi4KKyAqLwordW5zaWduZWQgbG9uZyBmaW5kX2ZpcnN0X2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBpZHg7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCAqIEJJVFNfUEVSX0xPTkcgPCBzaXplOyBpZHgrKykgeworCQlpZiAoYWRkcltpZHhdKQorCQkJcmV0dXJuIG1pbihpZHggKiBCSVRTX1BFUl9MT05HICsgX19mZnMoYWRkcltpZHhdKSwgc2l6ZSk7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CitFWFBPUlRfU1lNQk9MKGZpbmRfZmlyc3RfYml0KTsKKyNlbmRpZgorCisjaWZuZGVmIGZpbmRfZmlyc3RfemVyb19iaXQKKy8qCisgKiBGaW5kIHRoZSBmaXJzdCBjbGVhcmVkIGJpdCBpbiBhIG1lbW9yeSByZWdpb24uCisgKi8KK3Vuc2lnbmVkIGxvbmcgZmluZF9maXJzdF96ZXJvX2JpdChjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUpCit7CisJdW5zaWduZWQgbG9uZyBpZHg7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCAqIEJJVFNfUEVSX0xPTkcgPCBzaXplOyBpZHgrKykgeworCQlpZiAoYWRkcltpZHhdICE9IH4wVUwpCisJCQlyZXR1cm4gbWluKGlkeCAqIEJJVFNfUEVSX0xPTkcgKyBmZnooYWRkcltpZHhdKSwgc2l6ZSk7CisJfQorCisJcmV0dXJuIHNpemU7Cit9CitFWFBPUlRfU1lNQk9MKGZpbmRfZmlyc3RfemVyb19iaXQpOworI2VuZGlmCisKKyNpZm5kZWYgZmluZF9sYXN0X2JpdAordW5zaWduZWQgbG9uZyBmaW5kX2xhc3RfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpZiAoc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIHZhbCA9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKwkJdW5zaWduZWQgbG9uZyBpZHggPSAoc2l6ZS0xKSAvIEJJVFNfUEVSX0xPTkc7CisKKwkJZG8geworCQkJdmFsICY9IGFkZHJbaWR4XTsKKwkJCWlmICh2YWwpCisJCQkJcmV0dXJuIGlkeCAqIEJJVFNfUEVSX0xPTkcgKyBfX2Zscyh2YWwpOworCisJCQl2YWwgPSB+MHVsOworCQl9IHdoaWxlIChpZHgtLSk7CisJfQorCXJldHVybiBzaXplOworfQorRVhQT1JUX1NZTUJPTChmaW5kX2xhc3RfYml0KTsKKyNlbmRpZgorCisjaWZkZWYgX19CSUdfRU5ESUFOCisKKyNpZiAhZGVmaW5lZChmaW5kX25leHRfYml0X2xlKSB8fCAhZGVmaW5lZChmaW5kX25leHRfemVyb19iaXRfbGUpCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfZmluZF9uZXh0X2JpdF9sZShjb25zdCB1bnNpZ25lZCBsb25nICphZGRyLAorCQl1bnNpZ25lZCBsb25nIG5iaXRzLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGludmVydCkKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmICh1bmxpa2VseShzdGFydCA+PSBuYml0cykpCisJCXJldHVybiBuYml0czsKKworCXRtcCA9IGFkZHJbc3RhcnQgLyBCSVRTX1BFUl9MT05HXSBeIGludmVydDsKKworCS8qIEhhbmRsZSAxc3Qgd29yZC4gKi8KKwl0bXAgJj0gc3dhYihCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KSk7CisJc3RhcnQgPSByb3VuZF9kb3duKHN0YXJ0LCBCSVRTX1BFUl9MT05HKTsKKworCXdoaWxlICghdG1wKSB7CisJCXN0YXJ0ICs9IEJJVFNfUEVSX0xPTkc7CisJCWlmIChzdGFydCA+PSBuYml0cykKKwkJCXJldHVybiBuYml0czsKKworCQl0bXAgPSBhZGRyW3N0YXJ0IC8gQklUU19QRVJfTE9OR10gXiBpbnZlcnQ7CisJfQorCisJcmV0dXJuIG1pbihzdGFydCArIF9fZmZzKHN3YWIodG1wKSksIG5iaXRzKTsKK30KKyNlbmRpZgorCisjaWZuZGVmIGZpbmRfbmV4dF96ZXJvX2JpdF9sZQordW5zaWduZWQgbG9uZyBmaW5kX25leHRfemVyb19iaXRfbGUoY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQKKwkJbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIG9mZnNldCkKK3sKKwlyZXR1cm4gX2ZpbmRfbmV4dF9iaXRfbGUoYWRkciwgc2l6ZSwgb2Zmc2V0LCB+MFVMKTsKK30KK0VYUE9SVF9TWU1CT0woZmluZF9uZXh0X3plcm9fYml0X2xlKTsKKyNlbmRpZgorCisjaWZuZGVmIGZpbmRfbmV4dF9iaXRfbGUKK3Vuc2lnbmVkIGxvbmcgZmluZF9uZXh0X2JpdF9sZShjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZAorCQlsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBfZmluZF9uZXh0X2JpdF9sZShhZGRyLCBzaXplLCBvZmZzZXQsIDBVTCk7Cit9CitFWFBPUlRfU1lNQk9MKGZpbmRfbmV4dF9iaXRfbGUpOworI2VuZGlmCisKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZsZXhfYXJyYXkuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZsZXhfYXJyYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWVkMjJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZmxleF9hcnJheS5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogRmxleGlibGUgYXJyYXkgbWFuYWdlZCBpbiBQQUdFX1NJWkUgcGFydHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24sIDIwMDkKKyAqCisgKiBBdXRob3I6IERhdmUgSGFuc2VuIDxkYXZlQGxpbnV4LnZuZXQuaWJtLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZmxleF9hcnJheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWNpcHJvY2FsX2Rpdi5oPgorCitzdHJ1Y3QgZmxleF9hcnJheV9wYXJ0IHsKKwljaGFyIGVsZW1lbnRzW0ZMRVhfQVJSQVlfUEFSVF9TSVpFXTsKK307CisKKy8qCisgKiBJZiBhIHVzZXIgcmVxdWVzdHMgYW4gYWxsb2NhdGlvbiB3aGljaCBpcyBzbWFsbAorICogZW5vdWdoLCB3ZSBtYXkgc2ltcGx5IHVzZSB0aGUgc3BhY2UgaW4gdGhlCisgKiBmbGV4X2FycmF5LT5wYXJ0c1tdIGFycmF5IHRvIHN0b3JlIHRoZSB1c2VyCisgKiBkYXRhLgorICovCitzdGF0aWMgaW5saW5lIGludCBlbGVtZW50c19maXRfaW5fYmFzZShzdHJ1Y3QgZmxleF9hcnJheSAqZmEpCit7CisJaW50IGRhdGFfc2l6ZSA9IGZhLT5lbGVtZW50X3NpemUgKiBmYS0+dG90YWxfbnJfZWxlbWVudHM7CisJaWYgKGRhdGFfc2l6ZSA8PSBGTEVYX0FSUkFZX0JBU0VfQllURVNfTEVGVCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZmxleF9hcnJheV9hbGxvYyAtIGFsbG9jYXRlIGEgbmV3IGZsZXhpYmxlIGFycmF5CisgKiBAZWxlbWVudF9zaXplOgl0aGUgc2l6ZSBvZiBpbmRpdmlkdWFsIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICogQHRvdGFsOgkJdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgdGhpcyBzaG91bGQgaG9sZAorICogQGZsYWdzOgkJcGFnZSBhbGxvY2F0aW9uIGZsYWdzIHRvIHVzZSBmb3IgYmFzZSBhcnJheQorICoKKyAqIE5vdGU6IGFsbCBsb2NraW5nIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBAdG90YWwgaXMgdXNlZCB0byBzaXplIGludGVybmFsIHN0cnVjdHVyZXMuICBJZiB0aGUgdXNlciBldmVyCisgKiBhY2Nlc3NlcyBhbnkgYXJyYXkgaW5kZXhlcyA+PUB0b3RhbCwgaXQgd2lsbCBwcm9kdWNlIGVycm9ycy4KKyAqCisgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaXMgZGVmaW5lZCBhczogdGhlIG51bWJlciBvZgorICogZWxlbWVudHMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIGEgcGFnZSB0aW1lcyB0aGUgbnVtYmVyIG9mCisgKiBwYWdlIHBvaW50ZXJzIHRoYXQgd2UgY2FuIGZpdCBpbiB0aGUgYmFzZSBzdHJ1Y3R1cmUgb3IgKHVzaW5nCisgKiBpbnRlZ2VyIG1hdGgpOgorICoKKyAqIAkoUEFHRV9TSVpFL2VsZW1lbnRfc2l6ZSkgKiAoUEFHRV9TSVpFLTgpL3NpemVvZih2b2lkICopCisgKgorICogSGVyZSdzIGEgdGFibGUgc2hvd2luZyBleGFtcGxlIGNhcGFjaXRpZXMuICBOb3RlIHRoYXQgdGhlIG1heGltdW0KKyAqIGluZGV4IHRoYXQgdGhlIGdldC9wdXQoKSBmdW5jdGlvbnMgaXMganVzdCBucl9vYmplY3RzLTEuICAgVGhpcworICogYmFzaWNhbGx5IG1lYW5zIHRoYXQgeW91IGdldCA0TUIgb2Ygc3RvcmFnZSBvbiAzMi1iaXQgYW5kIDJNQiBvbgorICogNjQtYml0LgorICoKKyAqCisgKiBFbGVtZW50IHNpemUgfCBPYmplY3RzIHwgT2JqZWN0cyB8CisgKiBQQUdFX1NJWkU9NGsgfCAgMzItYml0IHwgIDY0LWJpdCB8CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisgKiAgICAgIDEgYnl0ZXMgfCA0MTc3OTIwIHwgMjA4ODk2MCB8CisgKiAgICAgIDIgYnl0ZXMgfCAyMDg4OTYwIHwgMTA0NDQ4MCB8CisgKiAgICAgIDMgYnl0ZXMgfCAxMzkyMzAwIHwgIDY5NjE1MCB8CisgKiAgICAgIDQgYnl0ZXMgfCAxMDQ0NDgwIHwgIDUyMjI0MCB8CisgKiAgICAgMzIgYnl0ZXMgfCAgMTMwNTYwIHwgICA2NTQwOCB8CisgKiAgICAgMzMgYnl0ZXMgfCAgMTI2NDgwIHwgICA2MzI0MCB8CisgKiAgIDIwNDggYnl0ZXMgfCAgICAyMDQwIHwgICAgMTAyMCB8CisgKiAgIDIwNDkgYnl0ZXMgfCAgICAxMDIwIHwgICAgIDUxMCB8CisgKiAgICAgICB2b2lkICogfCAxMDQ0NDgwIHwgIDI2MTEyMCB8CisgKgorICogU2luY2UgNjQtYml0IHBvaW50ZXJzIGFyZSB0d2ljZSB0aGUgc2l6ZSwgd2UgbG9zZSBoYWxmIHRoZQorICogY2FwYWNpdHkgaW4gdGhlIGJhc2Ugc3RydWN0dXJlLiAgQWxzbyBub3RlIHRoYXQgbm8gZWZmb3J0IGlzIG1hZGUKKyAqIHRvIGVmZmljaWVudGx5IHBhY2sgb2JqZWN0cyBhY3Jvc3MgcGFnZSBib3VuZGFyaWVzLgorICovCitzdHJ1Y3QgZmxleF9hcnJheSAqZmxleF9hcnJheV9hbGxvYyhpbnQgZWxlbWVudF9zaXplLCB1bnNpZ25lZCBpbnQgdG90YWwsCisJCQkJCWdmcF90IGZsYWdzKQoreworCXN0cnVjdCBmbGV4X2FycmF5ICpyZXQ7CisJaW50IGVsZW1zX3Blcl9wYXJ0ID0gMDsKKwlpbnQgbWF4X3NpemUgPSAwOworCXN0cnVjdCByZWNpcHJvY2FsX3ZhbHVlIHJlY2lwcm9jYWxfZWxlbXMgPSB7IDAgfTsKKworCWlmIChlbGVtZW50X3NpemUpIHsKKwkJZWxlbXNfcGVyX3BhcnQgPSBGTEVYX0FSUkFZX0VMRU1FTlRTX1BFUl9QQVJUKGVsZW1lbnRfc2l6ZSk7CisJCXJlY2lwcm9jYWxfZWxlbXMgPSByZWNpcHJvY2FsX3ZhbHVlKGVsZW1zX3Blcl9wYXJ0KTsKKwkJbWF4X3NpemUgPSBGTEVYX0FSUkFZX05SX0JBU0VfUFRSUyAqIGVsZW1zX3Blcl9wYXJ0OworCX0KKworCS8qIG1heF9zaXplIHdpbGwgZW5kIHVwIDAgaWYgZWxlbWVudF9zaXplID4gUEFHRV9TSVpFICovCisJaWYgKHRvdGFsID4gbWF4X3NpemUpCisJCXJldHVybiBOVUxMOworCXJldCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmbGV4X2FycmF5KSwgZmxhZ3MpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKwlyZXQtPmVsZW1lbnRfc2l6ZSA9IGVsZW1lbnRfc2l6ZTsKKwlyZXQtPnRvdGFsX25yX2VsZW1lbnRzID0gdG90YWw7CisJcmV0LT5lbGVtc19wZXJfcGFydCA9IGVsZW1zX3Blcl9wYXJ0OworCXJldC0+cmVjaXByb2NhbF9lbGVtcyA9IHJlY2lwcm9jYWxfZWxlbXM7CisJaWYgKGVsZW1lbnRzX2ZpdF9pbl9iYXNlKHJldCkgJiYgIShmbGFncyAmIF9fR0ZQX1pFUk8pKQorCQltZW1zZXQoJnJldC0+cGFydHNbMF0sIEZMRVhfQVJSQVlfRlJFRSwKKwkJCQkJCUZMRVhfQVJSQVlfQkFTRV9CWVRFU19MRUZUKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChmbGV4X2FycmF5X2FsbG9jKTsKKworc3RhdGljIGludCBmYV9lbGVtZW50X3RvX3BhcnRfbnIoc3RydWN0IGZsZXhfYXJyYXkgKmZhLAorCQkJCQl1bnNpZ25lZCBpbnQgZWxlbWVudF9ucikKK3sKKwkvKgorCSAqIGlmIGVsZW1lbnRfc2l6ZSA9PSAwIHdlIGRvbid0IGdldCBoZXJlLCBzbyB3ZSBuZXZlciB0b3VjaAorCSAqIHRoZSB6ZXJvZWQgZmEtPnJlY2lwcm9jYWxfZWxlbXMsIHdoaWNoIHdvdWxkIHlpZWxkIGludmFsaWQKKwkgKiByZXN1bHRzCisJICovCisJcmV0dXJuIHJlY2lwcm9jYWxfZGl2aWRlKGVsZW1lbnRfbnIsIGZhLT5yZWNpcHJvY2FsX2VsZW1zKTsKK30KKworLyoqCisgKiBmbGV4X2FycmF5X2ZyZWVfcGFydHMgLSBqdXN0IGZyZWUgdGhlIHNlY29uZC1sZXZlbCBwYWdlcworICogQGZhOgkJdGhlIGZsZXggYXJyYXkgZnJvbSB3aGljaCB0byBmcmVlIHBhcnRzCisgKgorICogVGhpcyBpcyB0byBiZSB1c2VkIGluIGNhc2VzIHdoZXJlIHRoZSBiYXNlICdzdHJ1Y3QgZmxleF9hcnJheScKKyAqIGhhcyBiZWVuIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFuZCBzaG91bGQgbm90IGJlIGZyZWUuCisgKi8KK3ZvaWQgZmxleF9hcnJheV9mcmVlX3BhcnRzKHN0cnVjdCBmbGV4X2FycmF5ICpmYSkKK3sKKwlpbnQgcGFydF9ucjsKKworCWlmIChlbGVtZW50c19maXRfaW5fYmFzZShmYSkpCisJCXJldHVybjsKKwlmb3IgKHBhcnRfbnIgPSAwOyBwYXJ0X25yIDwgRkxFWF9BUlJBWV9OUl9CQVNFX1BUUlM7IHBhcnRfbnIrKykKKwkJa2ZyZWUoZmEtPnBhcnRzW3BhcnRfbnJdKTsKK30KK0VYUE9SVF9TWU1CT0woZmxleF9hcnJheV9mcmVlX3BhcnRzKTsKKwordm9pZCBmbGV4X2FycmF5X2ZyZWUoc3RydWN0IGZsZXhfYXJyYXkgKmZhKQoreworCWZsZXhfYXJyYXlfZnJlZV9wYXJ0cyhmYSk7CisJa2ZyZWUoZmEpOworfQorRVhQT1JUX1NZTUJPTChmbGV4X2FycmF5X2ZyZWUpOworCitzdGF0aWMgdW5zaWduZWQgaW50IGluZGV4X2luc2lkZV9wYXJ0KHN0cnVjdCBmbGV4X2FycmF5ICpmYSwKKwkJCQkJdW5zaWduZWQgaW50IGVsZW1lbnRfbnIsCisJCQkJCXVuc2lnbmVkIGludCBwYXJ0X25yKQoreworCXVuc2lnbmVkIGludCBwYXJ0X29mZnNldDsKKworCXBhcnRfb2Zmc2V0ID0gZWxlbWVudF9uciAtIHBhcnRfbnIgKiBmYS0+ZWxlbXNfcGVyX3BhcnQ7CisJcmV0dXJuIHBhcnRfb2Zmc2V0ICogZmEtPmVsZW1lbnRfc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBmbGV4X2FycmF5X3BhcnQgKgorX19mYV9nZXRfcGFydChzdHJ1Y3QgZmxleF9hcnJheSAqZmEsIGludCBwYXJ0X25yLCBnZnBfdCBmbGFncykKK3sKKwlzdHJ1Y3QgZmxleF9hcnJheV9wYXJ0ICpwYXJ0ID0gZmEtPnBhcnRzW3BhcnRfbnJdOworCWlmICghcGFydCkgeworCQlwYXJ0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZsZXhfYXJyYXlfcGFydCksIGZsYWdzKTsKKwkJaWYgKCFwYXJ0KQorCQkJcmV0dXJuIE5VTEw7CisJCWlmICghKGZsYWdzICYgX19HRlBfWkVSTykpCisJCQltZW1zZXQocGFydCwgRkxFWF9BUlJBWV9GUkVFLAorCQkJCXNpemVvZihzdHJ1Y3QgZmxleF9hcnJheV9wYXJ0KSk7CisJCWZhLT5wYXJ0c1twYXJ0X25yXSA9IHBhcnQ7CisJfQorCXJldHVybiBwYXJ0OworfQorCisvKioKKyAqIGZsZXhfYXJyYXlfcHV0IC0gY29weSBkYXRhIGludG8gdGhlIGFycmF5IGF0IEBlbGVtZW50X25yCisgKiBAZmE6CQl0aGUgZmxleCBhcnJheSB0byBjb3B5IGRhdGEgaW50bworICogQGVsZW1lbnRfbnI6CWluZGV4IG9mIHRoZSBwb3NpdGlvbiBpbiB3aGljaCB0byBpbnNlcnQKKyAqIAkJdGhlIG5ldyBlbGVtZW50LgorICogQHNyYzoJYWRkcmVzcyBvZiBkYXRhIHRvIGNvcHkgaW50byB0aGUgYXJyYXkKKyAqIEBmbGFnczoJcGFnZSBhbGxvY2F0aW9uIGZsYWdzIHRvIHVzZSBmb3IgYXJyYXkgZXhwYW5zaW9uCisgKgorICoKKyAqIE5vdGUgdGhhdCB0aGlzICpjb3BpZXMqIHRoZSBjb250ZW50cyBvZiBAc3JjIGludG8KKyAqIHRoZSBhcnJheS4gIElmIHlvdSBhcmUgdHJ5aW5nIHRvIHN0b3JlIGFuIGFycmF5IG9mCisgKiBwb2ludGVycywgbWFrZSBzdXJlIHRvIHBhc3MgaW4gJnB0ciBpbnN0ZWFkIG9mIHB0ci4KKyAqIFlvdSBtYXkgaW5zdGVhZCB3aXNoIHRvIHVzZSB0aGUgZmxleF9hcnJheV9wdXRfcHRyKCkKKyAqIGhlbHBlciBmdW5jdGlvbi4KKyAqCisgKiBMb2NraW5nIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KKyAqLworaW50IGZsZXhfYXJyYXlfcHV0KHN0cnVjdCBmbGV4X2FycmF5ICpmYSwgdW5zaWduZWQgaW50IGVsZW1lbnRfbnIsIHZvaWQgKnNyYywKKwkJCWdmcF90IGZsYWdzKQoreworCWludCBwYXJ0X25yID0gMDsKKwlzdHJ1Y3QgZmxleF9hcnJheV9wYXJ0ICpwYXJ0OworCXZvaWQgKmRzdDsKKworCWlmIChlbGVtZW50X25yID49IGZhLT50b3RhbF9ucl9lbGVtZW50cykKKwkJcmV0dXJuIC1FTk9TUEM7CisJaWYgKCFmYS0+ZWxlbWVudF9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoZWxlbWVudHNfZml0X2luX2Jhc2UoZmEpKQorCQlwYXJ0ID0gKHN0cnVjdCBmbGV4X2FycmF5X3BhcnQgKikmZmEtPnBhcnRzWzBdOworCWVsc2UgeworCQlwYXJ0X25yID0gZmFfZWxlbWVudF90b19wYXJ0X25yKGZhLCBlbGVtZW50X25yKTsKKwkJcGFydCA9IF9fZmFfZ2V0X3BhcnQoZmEsIHBhcnRfbnIsIGZsYWdzKTsKKwkJaWYgKCFwYXJ0KQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRzdCA9ICZwYXJ0LT5lbGVtZW50c1tpbmRleF9pbnNpZGVfcGFydChmYSwgZWxlbWVudF9uciwgcGFydF9ucildOworCW1lbWNweShkc3QsIHNyYywgZmEtPmVsZW1lbnRfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhfYXJyYXlfcHV0KTsKKworLyoqCisgKiBmbGV4X2FycmF5X2NsZWFyIC0gY2xlYXIgZWxlbWVudCBpbiBhcnJheSBhdCBAZWxlbWVudF9ucgorICogQGZhOgkJdGhlIGZsZXggYXJyYXkgb2YgdGhlIGVsZW1lbnQuCisgKiBAZWxlbWVudF9ucjoJaW5kZXggb2YgdGhlIHBvc2l0aW9uIHRvIGNsZWFyLgorICoKKyAqIExvY2tpbmcgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgorICovCitpbnQgZmxleF9hcnJheV9jbGVhcihzdHJ1Y3QgZmxleF9hcnJheSAqZmEsIHVuc2lnbmVkIGludCBlbGVtZW50X25yKQoreworCWludCBwYXJ0X25yID0gMDsKKwlzdHJ1Y3QgZmxleF9hcnJheV9wYXJ0ICpwYXJ0OworCXZvaWQgKmRzdDsKKworCWlmIChlbGVtZW50X25yID49IGZhLT50b3RhbF9ucl9lbGVtZW50cykKKwkJcmV0dXJuIC1FTk9TUEM7CisJaWYgKCFmYS0+ZWxlbWVudF9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoZWxlbWVudHNfZml0X2luX2Jhc2UoZmEpKQorCQlwYXJ0ID0gKHN0cnVjdCBmbGV4X2FycmF5X3BhcnQgKikmZmEtPnBhcnRzWzBdOworCWVsc2UgeworCQlwYXJ0X25yID0gZmFfZWxlbWVudF90b19wYXJ0X25yKGZhLCBlbGVtZW50X25yKTsKKwkJcGFydCA9IGZhLT5wYXJ0c1twYXJ0X25yXTsKKwkJaWYgKCFwYXJ0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWRzdCA9ICZwYXJ0LT5lbGVtZW50c1tpbmRleF9pbnNpZGVfcGFydChmYSwgZWxlbWVudF9uciwgcGFydF9ucildOworCW1lbXNldChkc3QsIEZMRVhfQVJSQVlfRlJFRSwgZmEtPmVsZW1lbnRfc2l6ZSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhfYXJyYXlfY2xlYXIpOworCisvKioKKyAqIGZsZXhfYXJyYXlfcHJlYWxsb2MgLSBndWFyYW50ZWUgdGhhdCBhcnJheSBzcGFjZSBleGlzdHMKKyAqIEBmYToJCQl0aGUgZmxleCBhcnJheSBmb3Igd2hpY2ggdG8gcHJlYWxsb2NhdGUgcGFydHMKKyAqIEBzdGFydDoJCWluZGV4IG9mIGZpcnN0IGFycmF5IGVsZW1lbnQgZm9yIHdoaWNoIHNwYWNlIGlzIGFsbG9jYXRlZAorICogQG5yX2VsZW1lbnRzOgludW1iZXIgb2YgZWxlbWVudHMgZm9yIHdoaWNoIHNwYWNlIGlzIGFsbG9jYXRlZAorICogQGZsYWdzOgkJcGFnZSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogVGhpcyB3aWxsIGd1YXJhbnRlZSB0aGF0IG5vIGZ1dHVyZSBjYWxscyB0byBmbGV4X2FycmF5X3B1dCgpCisgKiB3aWxsIGFsbG9jYXRlIG1lbW9yeS4gIEl0IGNhbiBiZSB1c2VkIGlmIHlvdSBhcmUgZXhwZWN0aW5nIHRvCisgKiBiZSBob2xkaW5nIGEgbG9jayBvciBpbiBzb21lIGF0b21pYyBjb250ZXh0IHdoaWxlIHdyaXRpbmcKKyAqIGRhdGEgaW50byB0aGUgYXJyYXkuCisgKgorICogTG9ja2luZyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2ludCBmbGV4X2FycmF5X3ByZWFsbG9jKHN0cnVjdCBmbGV4X2FycmF5ICpmYSwgdW5zaWduZWQgaW50IHN0YXJ0LAorCQkJdW5zaWduZWQgaW50IG5yX2VsZW1lbnRzLCBnZnBfdCBmbGFncykKK3sKKwlpbnQgc3RhcnRfcGFydDsKKwlpbnQgZW5kX3BhcnQ7CisJaW50IHBhcnRfbnI7CisJdW5zaWduZWQgaW50IGVuZDsKKwlzdHJ1Y3QgZmxleF9hcnJheV9wYXJ0ICpwYXJ0OworCisJaWYgKCFzdGFydCAmJiAhbnJfZWxlbWVudHMpCisJCXJldHVybiAwOworCWlmIChzdGFydCA+PSBmYS0+dG90YWxfbnJfZWxlbWVudHMpCisJCXJldHVybiAtRU5PU1BDOworCWlmICghbnJfZWxlbWVudHMpCisJCXJldHVybiAwOworCisJZW5kID0gc3RhcnQgKyBucl9lbGVtZW50cyAtIDE7CisKKwlpZiAoZW5kID49IGZhLT50b3RhbF9ucl9lbGVtZW50cykKKwkJcmV0dXJuIC1FTk9TUEM7CisJaWYgKCFmYS0+ZWxlbWVudF9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoZWxlbWVudHNfZml0X2luX2Jhc2UoZmEpKQorCQlyZXR1cm4gMDsKKwlzdGFydF9wYXJ0ID0gZmFfZWxlbWVudF90b19wYXJ0X25yKGZhLCBzdGFydCk7CisJZW5kX3BhcnQgPSBmYV9lbGVtZW50X3RvX3BhcnRfbnIoZmEsIGVuZCk7CisJZm9yIChwYXJ0X25yID0gc3RhcnRfcGFydDsgcGFydF9uciA8PSBlbmRfcGFydDsgcGFydF9ucisrKSB7CisJCXBhcnQgPSBfX2ZhX2dldF9wYXJ0KGZhLCBwYXJ0X25yLCBmbGFncyk7CisJCWlmICghcGFydCkKKwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZmxleF9hcnJheV9wcmVhbGxvYyk7CisKKy8qKgorICogZmxleF9hcnJheV9nZXQgLSBwdWxsIGRhdGEgYmFjayBvdXQgb2YgdGhlIGFycmF5CisgKiBAZmE6CQl0aGUgZmxleCBhcnJheSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgZGF0YQorICogQGVsZW1lbnRfbnI6CWluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGZldGNoIGZyb20gdGhlIGFycmF5CisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYXQgaW5kZXggQGVsZW1lbnRfbnIuICBOb3RlCisgKiB0aGF0IHRoaXMgaXMgYSBjb3B5IG9mIHRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbi4gIElmIHlvdQorICogYXJlIHVzaW5nIHRoaXMgdG8gc3RvcmUgcG9pbnRlcnMsIHlvdSdsbCBnZXQgYmFjayAmcHRyLiAgWW91CisgKiBtYXkgaW5zdGVhZCB3aXNoIHRvIHVzZSB0aGUgZmxleF9hcnJheV9nZXRfcHRyIGhlbHBlci4KKyAqCisgKiBMb2NraW5nIG11c3QgYmUgcHJvdmlkZWQgYnkgdGhlIGNhbGxlci4KKyAqLwordm9pZCAqZmxleF9hcnJheV9nZXQoc3RydWN0IGZsZXhfYXJyYXkgKmZhLCB1bnNpZ25lZCBpbnQgZWxlbWVudF9ucikKK3sKKwlpbnQgcGFydF9uciA9IDA7CisJc3RydWN0IGZsZXhfYXJyYXlfcGFydCAqcGFydDsKKworCWlmICghZmEtPmVsZW1lbnRfc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGVsZW1lbnRfbnIgPj0gZmEtPnRvdGFsX25yX2VsZW1lbnRzKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZWxlbWVudHNfZml0X2luX2Jhc2UoZmEpKQorCQlwYXJ0ID0gKHN0cnVjdCBmbGV4X2FycmF5X3BhcnQgKikmZmEtPnBhcnRzWzBdOworCWVsc2UgeworCQlwYXJ0X25yID0gZmFfZWxlbWVudF90b19wYXJ0X25yKGZhLCBlbGVtZW50X25yKTsKKwkJcGFydCA9IGZhLT5wYXJ0c1twYXJ0X25yXTsKKwkJaWYgKCFwYXJ0KQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiAmcGFydC0+ZWxlbWVudHNbaW5kZXhfaW5zaWRlX3BhcnQoZmEsIGVsZW1lbnRfbnIsIHBhcnRfbnIpXTsKK30KK0VYUE9SVF9TWU1CT0woZmxleF9hcnJheV9nZXQpOworCisvKioKKyAqIGZsZXhfYXJyYXlfZ2V0X3B0ciAtIHB1bGwgYSBwdHIgYmFjayBvdXQgb2YgdGhlIGFycmF5CisgKiBAZmE6CQl0aGUgZmxleCBhcnJheSBmcm9tIHdoaWNoIHRvIGV4dHJhY3QgZGF0YQorICogQGVsZW1lbnRfbnI6CWluZGV4IG9mIHRoZSBlbGVtZW50IHRvIGZldGNoIGZyb20gdGhlIGFycmF5CisgKgorICogUmV0dXJucyB0aGUgcG9pbnRlciBwbGFjZWQgaW4gdGhlIGZsZXggYXJyYXkgYXQgZWxlbWVudF9uciB1c2luZworICogZmxleF9hcnJheV9wdXRfcHRyKCkuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGlmIHRoZQorICogZWxlbWVudCBpbiBxdWVzdGlvbiB3YXMgbm90IHNldCB1c2luZyB0aGUgX3B1dF9wdHIoKSBoZWxwZXIuCisgKi8KK3ZvaWQgKmZsZXhfYXJyYXlfZ2V0X3B0cihzdHJ1Y3QgZmxleF9hcnJheSAqZmEsIHVuc2lnbmVkIGludCBlbGVtZW50X25yKQoreworCXZvaWQgKip0bXA7CisKKwl0bXAgPSBmbGV4X2FycmF5X2dldChmYSwgZWxlbWVudF9ucik7CisJaWYgKCF0bXApCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICp0bXA7Cit9CitFWFBPUlRfU1lNQk9MKGZsZXhfYXJyYXlfZ2V0X3B0cik7CisKK3N0YXRpYyBpbnQgcGFydF9pc19mcmVlKHN0cnVjdCBmbGV4X2FycmF5X3BhcnQgKnBhcnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHN0cnVjdCBmbGV4X2FycmF5X3BhcnQpOyBpKyspCisJCWlmIChwYXJ0LT5lbGVtZW50c1tpXSAhPSBGTEVYX0FSUkFZX0ZSRUUpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBmbGV4X2FycmF5X3NocmluayAtIGZyZWUgdW51c2VkIHNlY29uZC1sZXZlbCBwYWdlcworICogQGZhOgkJdGhlIGZsZXggYXJyYXkgdG8gc2hyaW5rCisgKgorICogRnJlZXMgYWxsIHNlY29uZC1sZXZlbCBwYWdlcyB0aGF0IGNvbnNpc3Qgc29sZWx5IG9mIHVudXNlZAorICogZWxlbWVudHMuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGFnZXMgZnJlZWQuCisgKgorICogTG9ja2luZyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK2ludCBmbGV4X2FycmF5X3NocmluayhzdHJ1Y3QgZmxleF9hcnJheSAqZmEpCit7CisJc3RydWN0IGZsZXhfYXJyYXlfcGFydCAqcGFydDsKKwlpbnQgcGFydF9ucjsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghZmEtPnRvdGFsX25yX2VsZW1lbnRzIHx8ICFmYS0+ZWxlbWVudF9zaXplKQorCQlyZXR1cm4gMDsKKwlpZiAoZWxlbWVudHNfZml0X2luX2Jhc2UoZmEpKQorCQlyZXR1cm4gcmV0OworCWZvciAocGFydF9uciA9IDA7IHBhcnRfbnIgPCBGTEVYX0FSUkFZX05SX0JBU0VfUFRSUzsgcGFydF9ucisrKSB7CisJCXBhcnQgPSBmYS0+cGFydHNbcGFydF9ucl07CisJCWlmICghcGFydCkKKwkJCWNvbnRpbnVlOworCQlpZiAocGFydF9pc19mcmVlKHBhcnQpKSB7CisJCQlmYS0+cGFydHNbcGFydF9ucl0gPSBOVUxMOworCQkJa2ZyZWUocGFydCk7CisJCQlyZXQrKzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChmbGV4X2FycmF5X3Nocmluayk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mbGV4X3Byb3BvcnRpb25zLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mbGV4X3Byb3BvcnRpb25zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1MmJmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZsZXhfcHJvcG9ydGlvbnMuYwpAQCAtMCwwICsxLDI3MyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiAgRmxvYXRpbmcgcHJvcG9ydGlvbnMgd2l0aCBmbGV4aWJsZSBhZ2luZyBwZXJpb2QKKyAqCisgKiAgIENvcHlyaWdodCAoQykgMjAxMSwgU1VTRSwgSmFuIEthcmEgPGphY2tAc3VzZS5jej4KKyAqCisgKiBUaGUgZ29hbCBvZiB0aGlzIGNvZGUgaXM6IEdpdmVuIGRpZmZlcmVudCB0eXBlcyBvZiBldmVudCwgbWVhc3VyZSBwcm9wb3J0aW9uCisgKiBvZiBlYWNoIHR5cGUgb2YgZXZlbnQgb3ZlciB0aW1lLiBUaGUgcHJvcG9ydGlvbnMgYXJlIG1lYXN1cmVkIHdpdGgKKyAqIGV4cG9uZW50aWFsbHkgZGVjYXlpbmcgaGlzdG9yeSB0byBnaXZlIHNtb290aCB0cmFuc2l0aW9ucy4gQSBmb3JtdWxhCisgKiBleHByZXNzaW5nIHByb3BvcnRpb24gb2YgZXZlbnQgb2YgdHlwZSAnaicgaXM6CisgKgorICogICBwX3tqfSA9IChcU3VtX3tpPj0wfSB4X3tpLGp9LzJee2krMX0pLyhcU3VtX3tpPj0wfSB4X2kvMl57aSsxfSkKKyAqCisgKiBXaGVyZSB4X3tpLGp9IGlzIGoncyBudW1iZXIgb2YgZXZlbnRzIGluIGktdGggbGFzdCB0aW1lIHBlcmlvZCBhbmQgeF9pIGlzCisgKiB0b3RhbCBudW1iZXIgb2YgZXZlbnRzIGluIGktdGggbGFzdCB0aW1lIHBlcmlvZC4KKyAqCisgKiBOb3RlIHRoYXQgcF97an0ncyBhcmUgbm9ybWFsaXNlZCwgaS5lLgorICoKKyAqICAgXFN1bV97an0gcF97an0gPSAxLAorICoKKyAqIFRoaXMgZm9ybXVsYSBjYW4gYmUgc3RyYWlnaHRmb3J3YXJkbHkgY29tcHV0ZWQgYnkgbWFpbnRhaW5pbmcgZGVub21pbmF0b3IKKyAqIChsZXQncyBjYWxsIGl0ICdkJykgYW5kIGZvciBlYWNoIGV2ZW50IHR5cGUgaXRzIG51bWVyYXRvciAobGV0J3MgY2FsbCBpdAorICogJ25faicpLiBXaGVuIGFuIGV2ZW50IG9mIHR5cGUgJ2onIGhhcHBlbnMsIHdlIHNpbXBseSBuZWVkIHRvIGRvOgorICogICBuX2orKzsgZCsrOworICoKKyAqIFdoZW4gYSBuZXcgcGVyaW9kIGlzIGRlY2xhcmVkLCB3ZSBjb3VsZCBkbzoKKyAqICAgZCAvPSAyCisgKiAgIGZvciBlYWNoIGoKKyAqICAgICBuX2ogLz0gMgorICoKKyAqIFRvIGF2b2lkIGl0ZXJhdGlvbiBvdmVyIGFsbCBldmVudCB0eXBlcywgd2UgaW5zdGVhZCBzaGlmdCBudW1lcmF0b3Igb2YgZXZlbnQKKyAqIGogbGF6aWx5IHdoZW4gc29tZW9uZSBhc2tzIGZvciBhIHByb3BvcnRpb24gb2YgZXZlbnQgaiBvciB3aGVuIGV2ZW50IGoKKyAqIG9jY3Vycy4gVGhpcyBjYW4gYml0IHRyaXZpYWxseSBpbXBsZW1lbnRlZCBieSByZW1lbWJlcmluZyBsYXN0IHBlcmlvZCBpbgorICogd2hpY2ggc29tZXRoaW5nIGhhcHBlbmVkIHdpdGggcHJvcG9ydGlvbiBvZiB0eXBlIGouCisgKi8KKyNpbmNsdWRlIDxsaW51eC9mbGV4X3Byb3BvcnRpb25zLmg+CisKK2ludCBmcHJvcF9nbG9iYWxfaW5pdChzdHJ1Y3QgZnByb3BfZ2xvYmFsICpwLCBnZnBfdCBnZnApCit7CisJaW50IGVycjsKKworCXAtPnBlcmlvZCA9IDA7CisJLyogVXNlIDEgdG8gYXZvaWQgZGVhbGluZyB3aXRoIHBlcmlvZHMgd2l0aCAwIGV2ZW50cy4uLiAqLworCWVyciA9IHBlcmNwdV9jb3VudGVyX2luaXQoJnAtPmV2ZW50cywgMSwgZ2ZwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXNlcWNvdW50X2luaXQoJnAtPnNlcXVlbmNlKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmcHJvcF9nbG9iYWxfZGVzdHJveShzdHJ1Y3QgZnByb3BfZ2xvYmFsICpwKQoreworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnAtPmV2ZW50cyk7Cit9CisKKy8qCisgKiBEZWNsYXJlIEBwZXJpb2RzIG5ldyBwZXJpb2RzLiBJdCBpcyB1cHRvIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHBlcmlvZAorICogdHJhbnNpdGlvbnMgY2Fubm90IGhhcHBlbiBpbiBwYXJhbGxlbC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wb3J0aW9ucyBhcmUgc3RpbGwgZGVmaW5lZCBhbmQgZmFsc2UKKyAqIGlmIGFnaW5nIHplcm9lZCBvdXQgYWxsIGV2ZW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBkZXRlY3Qgd2hldGhlciBkZWNsYXJpbmcKKyAqIGZ1cnRoZXIgcGVyaW9kcyBoYXMgYW55IGVmZmVjdC4KKyAqLworYm9vbCBmcHJvcF9uZXdfcGVyaW9kKHN0cnVjdCBmcHJvcF9nbG9iYWwgKnAsIGludCBwZXJpb2RzKQoreworCXM2NCBldmVudHM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlldmVudHMgPSBwZXJjcHVfY291bnRlcl9zdW0oJnAtPmV2ZW50cyk7CisJLyoKKwkgKiBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8gZXZlbnRzLgorCSAqLworCWlmIChldmVudHMgPD0gMSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJd3JpdGVfc2VxY291bnRfYmVnaW4oJnAtPnNlcXVlbmNlKTsKKwlpZiAocGVyaW9kcyA8IDY0KQorCQlldmVudHMgLT0gZXZlbnRzID4+IHBlcmlvZHM7CisJLyogVXNlIGFkZGl0aW9uIHRvIGF2b2lkIGxvc2luZyBldmVudHMgaGFwcGVuaW5nIGJldHdlZW4gc3VtIGFuZCBzZXQgKi8KKwlwZXJjcHVfY291bnRlcl9hZGQoJnAtPmV2ZW50cywgLWV2ZW50cyk7CisJcC0+cGVyaW9kICs9IHBlcmlvZHM7CisJd3JpdGVfc2VxY291bnRfZW5kKCZwLT5zZXF1ZW5jZSk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiAtLS0tIFNJTkdMRSAtLS0tCisgKi8KKworaW50IGZwcm9wX2xvY2FsX2luaXRfc2luZ2xlKHN0cnVjdCBmcHJvcF9sb2NhbF9zaW5nbGUgKnBsKQoreworCXBsLT5ldmVudHMgPSAwOworCXBsLT5wZXJpb2QgPSAwOworCXJhd19zcGluX2xvY2tfaW5pdCgmcGwtPmxvY2spOworCXJldHVybiAwOworfQorCit2b2lkIGZwcm9wX2xvY2FsX2Rlc3Ryb3lfc2luZ2xlKHN0cnVjdCBmcHJvcF9sb2NhbF9zaW5nbGUgKnBsKQoreworfQorCitzdGF0aWMgdm9pZCBmcHJvcF9yZWZsZWN0X3BlcmlvZF9zaW5nbGUoc3RydWN0IGZwcm9wX2dsb2JhbCAqcCwKKwkJCQkJc3RydWN0IGZwcm9wX2xvY2FsX3NpbmdsZSAqcGwpCit7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHAtPnBlcmlvZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRmFzdCBwYXRoIC0gcGVyaW9kIGRpZG4ndCBjaGFuZ2UgKi8KKwlpZiAocGwtPnBlcmlvZCA9PSBwZXJpb2QpCisJCXJldHVybjsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBsLT5sb2NrLCBmbGFncyk7CisJLyogU29tZW9uZSB1cGRhdGVkIHBsLT5wZXJpb2Qgd2hpbGUgd2Ugd2VyZSBzcGlubmluZz8gKi8KKwlpZiAocGwtPnBlcmlvZCA+PSBwZXJpb2QpIHsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJLyogQWdpbmcgemVyb2VkIG91ciBmcmFjdGlvbj8gKi8KKwlpZiAocGVyaW9kIC0gcGwtPnBlcmlvZCA8IEJJVFNfUEVSX0xPTkcpCisJCXBsLT5ldmVudHMgPj49IHBlcmlvZCAtIHBsLT5wZXJpb2Q7CisJZWxzZQorCQlwbC0+ZXZlbnRzID0gMDsKKwlwbC0+cGVyaW9kID0gcGVyaW9kOworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwbC0+bG9jaywgZmxhZ3MpOworfQorCisvKiBFdmVudCBvZiB0eXBlIHBsIGhhcHBlbmVkICovCit2b2lkIF9fZnByb3BfaW5jX3NpbmdsZShzdHJ1Y3QgZnByb3BfZ2xvYmFsICpwLCBzdHJ1Y3QgZnByb3BfbG9jYWxfc2luZ2xlICpwbCkKK3sKKwlmcHJvcF9yZWZsZWN0X3BlcmlvZF9zaW5nbGUocCwgcGwpOworCXBsLT5ldmVudHMrKzsKKwlwZXJjcHVfY291bnRlcl9hZGQoJnAtPmV2ZW50cywgMSk7Cit9CisKKy8qIFJldHVybiBmcmFjdGlvbiBvZiBldmVudHMgb2YgdHlwZSBwbCAqLwordm9pZCBmcHJvcF9mcmFjdGlvbl9zaW5nbGUoc3RydWN0IGZwcm9wX2dsb2JhbCAqcCwKKwkJCSAgIHN0cnVjdCBmcHJvcF9sb2NhbF9zaW5nbGUgKnBsLAorCQkJICAgdW5zaWduZWQgbG9uZyAqbnVtZXJhdG9yLCB1bnNpZ25lZCBsb25nICpkZW5vbWluYXRvcikKK3sKKwl1bnNpZ25lZCBpbnQgc2VxOworCXM2NCBudW0sIGRlbjsKKworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmcC0+c2VxdWVuY2UpOworCQlmcHJvcF9yZWZsZWN0X3BlcmlvZF9zaW5nbGUocCwgcGwpOworCQludW0gPSBwbC0+ZXZlbnRzOworCQlkZW4gPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZwLT5ldmVudHMpOworCX0gd2hpbGUgKHJlYWRfc2VxY291bnRfcmV0cnkoJnAtPnNlcXVlbmNlLCBzZXEpKTsKKworCS8qCisJICogTWFrZSBmcmFjdGlvbiA8PSAxIGFuZCBkZW5vbWluYXRvciA+IDAgZXZlbiBpbiBwcmVzZW5jZSBvZiBwZXJjcHUKKwkgKiBjb3VudGVyIGVycm9ycworCSAqLworCWlmIChkZW4gPD0gbnVtKSB7CisJCWlmIChudW0pCisJCQlkZW4gPSBudW07CisJCWVsc2UKKwkJCWRlbiA9IDE7CisJfQorCSpkZW5vbWluYXRvciA9IGRlbjsKKwkqbnVtZXJhdG9yID0gbnVtOworfQorCisvKgorICogLS0tLSBQRVJDUFUgLS0tLQorICovCisjZGVmaW5lIFBST1BfQkFUQ0ggKDgqKDEraWxvZzIobnJfY3B1X2lkcykpKQorCitpbnQgZnByb3BfbG9jYWxfaW5pdF9wZXJjcHUoc3RydWN0IGZwcm9wX2xvY2FsX3BlcmNwdSAqcGwsIGdmcF90IGdmcCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcGVyY3B1X2NvdW50ZXJfaW5pdCgmcGwtPmV2ZW50cywgMCwgZ2ZwKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXBsLT5wZXJpb2QgPSAwOworCXJhd19zcGluX2xvY2tfaW5pdCgmcGwtPmxvY2spOworCXJldHVybiAwOworfQorCit2b2lkIGZwcm9wX2xvY2FsX2Rlc3Ryb3lfcGVyY3B1KHN0cnVjdCBmcHJvcF9sb2NhbF9wZXJjcHUgKnBsKQoreworCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJnBsLT5ldmVudHMpOworfQorCitzdGF0aWMgdm9pZCBmcHJvcF9yZWZsZWN0X3BlcmlvZF9wZXJjcHUoc3RydWN0IGZwcm9wX2dsb2JhbCAqcCwKKwkJCQkJc3RydWN0IGZwcm9wX2xvY2FsX3BlcmNwdSAqcGwpCit7CisJdW5zaWduZWQgaW50IHBlcmlvZCA9IHAtPnBlcmlvZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogRmFzdCBwYXRoIC0gcGVyaW9kIGRpZG4ndCBjaGFuZ2UgKi8KKwlpZiAocGwtPnBlcmlvZCA9PSBwZXJpb2QpCisJCXJldHVybjsKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnBsLT5sb2NrLCBmbGFncyk7CisJLyogU29tZW9uZSB1cGRhdGVkIHBsLT5wZXJpb2Qgd2hpbGUgd2Ugd2VyZSBzcGlubmluZz8gKi8KKwlpZiAocGwtPnBlcmlvZCA+PSBwZXJpb2QpIHsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJLyogQWdpbmcgemVyb2VkIG91ciBmcmFjdGlvbj8gKi8KKwlpZiAocGVyaW9kIC0gcGwtPnBlcmlvZCA8IEJJVFNfUEVSX0xPTkcpIHsKKwkJczY0IHZhbCA9IHBlcmNwdV9jb3VudGVyX3JlYWQoJnBsLT5ldmVudHMpOworCisJCWlmICh2YWwgPCAobnJfY3B1X2lkcyAqIFBST1BfQkFUQ0gpKQorCQkJdmFsID0gcGVyY3B1X2NvdW50ZXJfc3VtKCZwbC0+ZXZlbnRzKTsKKworCQlwZXJjcHVfY291bnRlcl9hZGRfYmF0Y2goJnBsLT5ldmVudHMsCisJCQktdmFsICsgKHZhbCA+PiAocGVyaW9kLXBsLT5wZXJpb2QpKSwgUFJPUF9CQVRDSCk7CisJfSBlbHNlCisJCXBlcmNwdV9jb3VudGVyX3NldCgmcGwtPmV2ZW50cywgMCk7CisJcGwtPnBlcmlvZCA9IHBlcmlvZDsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGwtPmxvY2ssIGZsYWdzKTsKK30KKworLyogRXZlbnQgb2YgdHlwZSBwbCBoYXBwZW5lZCAqLwordm9pZCBfX2Zwcm9wX2luY19wZXJjcHUoc3RydWN0IGZwcm9wX2dsb2JhbCAqcCwgc3RydWN0IGZwcm9wX2xvY2FsX3BlcmNwdSAqcGwpCit7CisJZnByb3BfcmVmbGVjdF9wZXJpb2RfcGVyY3B1KHAsIHBsKTsKKwlwZXJjcHVfY291bnRlcl9hZGRfYmF0Y2goJnBsLT5ldmVudHMsIDEsIFBST1BfQkFUQ0gpOworCXBlcmNwdV9jb3VudGVyX2FkZCgmcC0+ZXZlbnRzLCAxKTsKK30KKwordm9pZCBmcHJvcF9mcmFjdGlvbl9wZXJjcHUoc3RydWN0IGZwcm9wX2dsb2JhbCAqcCwKKwkJCSAgIHN0cnVjdCBmcHJvcF9sb2NhbF9wZXJjcHUgKnBsLAorCQkJICAgdW5zaWduZWQgbG9uZyAqbnVtZXJhdG9yLCB1bnNpZ25lZCBsb25nICpkZW5vbWluYXRvcikKK3sKKwl1bnNpZ25lZCBpbnQgc2VxOworCXM2NCBudW0sIGRlbjsKKworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFjb3VudF9iZWdpbigmcC0+c2VxdWVuY2UpOworCQlmcHJvcF9yZWZsZWN0X3BlcmlvZF9wZXJjcHUocCwgcGwpOworCQludW0gPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKCZwbC0+ZXZlbnRzKTsKKwkJZGVuID0gcGVyY3B1X2NvdW50ZXJfcmVhZF9wb3NpdGl2ZSgmcC0+ZXZlbnRzKTsKKwl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3JldHJ5KCZwLT5zZXF1ZW5jZSwgc2VxKSk7CisKKwkvKgorCSAqIE1ha2UgZnJhY3Rpb24gPD0gMSBhbmQgZGVub21pbmF0b3IgPiAwIGV2ZW4gaW4gcHJlc2VuY2Ugb2YgcGVyY3B1CisJICogY291bnRlciBlcnJvcnMKKwkgKi8KKwlpZiAoZGVuIDw9IG51bSkgeworCQlpZiAobnVtKQorCQkJZGVuID0gbnVtOworCQllbHNlCisJCQlkZW4gPSAxOworCX0KKwkqZGVub21pbmF0b3IgPSBkZW47CisJKm51bWVyYXRvciA9IG51bTsKK30KKworLyoKKyAqIExpa2UgX19mcHJvcF9pbmNfcGVyY3B1KCkgZXhjZXB0IHRoYXQgZXZlbnQgaXMgY291bnRlZCBvbmx5IGlmIHRoZSBnaXZlbgorICogdHlwZSBoYXMgZnJhY3Rpb24gc21hbGxlciB0aGFuIEBtYXhfZnJhYy9GUFJPUF9GUkFDX0JBU0UKKyAqLwordm9pZCBfX2Zwcm9wX2luY19wZXJjcHVfbWF4KHN0cnVjdCBmcHJvcF9nbG9iYWwgKnAsCisJCQkgICAgc3RydWN0IGZwcm9wX2xvY2FsX3BlcmNwdSAqcGwsIGludCBtYXhfZnJhYykKK3sKKwlpZiAodW5saWtlbHkobWF4X2ZyYWMgPCBGUFJPUF9GUkFDX0JBU0UpKSB7CisJCXVuc2lnbmVkIGxvbmcgbnVtZXJhdG9yLCBkZW5vbWluYXRvcjsKKworCQlmcHJvcF9mcmFjdGlvbl9wZXJjcHUocCwgcGwsICZudW1lcmF0b3IsICZkZW5vbWluYXRvcik7CisJCWlmIChudW1lcmF0b3IgPgorCQkgICAgKCgodTY0KWRlbm9taW5hdG9yKSAqIG1heF9mcmFjKSA+PiBGUFJPUF9GUkFDX1NISUZUKQorCQkJcmV0dXJuOworCX0gZWxzZQorCQlmcHJvcF9yZWZsZWN0X3BlcmlvZF9wZXJjcHUocCwgcGwpOworCXBlcmNwdV9jb3VudGVyX2FkZF9iYXRjaCgmcGwtPmV2ZW50cywgMSwgUFJPUF9CQVRDSCk7CisJcGVyY3B1X2NvdW50ZXJfYWRkKCZwLT5ldmVudHMsIDEpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvS2NvbmZpZyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZhMDc5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL0tjb25maWcKQEAgLTAsMCArMSwxMjYgQEAKKyMKKyMgRm9udCBjb25maWd1cmF0aW9uCisjCisKK2NvbmZpZyBGT05UX1NVUFBPUlQKKwl0cmlzdGF0ZQorCitpZiBGT05UX1NVUFBPUlQKKworY29uZmlnIEZPTlRTCisJYm9vbCAiU2VsZWN0IGNvbXBpbGVkLWluIGZvbnRzIgorCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRSB8fCBTVElfQ09OU09MRQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIGZvbnRzIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQKKwkgIHlvdXIgZnJhbWUgYnVmZmVyIGNvbnNvbGUgdXN1YWxseSB1c2UuCisKKwkgIE5vdGUgdGhhdCB0aGUgYW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24gd29uJ3QgZGlyZWN0bHkgYWZmZWN0IHRoZQorCSAga2VybmVsOiBzYXlpbmcgTiB3aWxsIGp1c3QgY2F1c2UgdGhlIGNvbmZpZ3VyYXRvciB0byBza2lwIGFsbAorCSAgdGhlIHF1ZXN0aW9ucyBhYm91dCBmb3JlaWduIGZvbnRzLgorCisJICBJZiB1bnN1cmUsIHNheSBOICh0aGUgZGVmYXVsdCBjaG9pY2VzIGFyZSBzYWZlKS4KKworY29uZmlnIEZPTlRfOHg4CisJYm9vbCAiVkdBIDh4OCBmb250IiBpZiBGT05UUworCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRSB8fCBTVElfQ09OU09MRQorCWRlZmF1bHQgeSBpZiAhU1BBUkMgJiYgIUZPTlRTCisJaGVscAorCSAgVGhpcyBpcyB0aGUgImhpZ2ggcmVzb2x1dGlvbiIgZm9udCBmb3IgdGhlIFZHQSBmcmFtZSBidWZmZXIgKHRoZSBvbmUKKwkgIHByb3ZpZGVkIGJ5IHRoZSB0ZXh0IGNvbnNvbGUgODB4NTAgKGFuZCBoaWdoZXIpIG1vZGVzKS4KKworCSAgTm90ZSB0aGF0IHRoaXMgaXMgYSBwb29yIHF1YWxpdHkgZm9udC4gVGhlIFZHQSA4eDE2IGZvbnQgaXMgcXVpdGUgYQorCSAgbG90IG1vcmUgcmVhZGFibGUuCisKKwkgIEdpdmVuIHRoZSByZXNvbHV0aW9uIHByb3ZpZGVkIGJ5IHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlLCBhbnN3ZXIgTgorCSAgaGVyZSBpcyBzYWZlLgorCitjb25maWcgRk9OVF84eDE2CisJYm9vbCAiVkdBIDh4MTYgZm9udCIgaWYgRk9OVFMKKwlkZWZhdWx0IHkgaWYgIVNQQVJDICYmICFGT05UUworCWhlbHAKKwkgIFRoaXMgaXMgdGhlICJoaWdoIHJlc29sdXRpb24iIGZvbnQgZm9yIHRoZSBWR0EgZnJhbWUgYnVmZmVyICh0aGUgb25lCisJICBwcm92aWRlZCBieSB0aGUgVkdBIHRleHQgY29uc29sZSA4MHgyNSBtb2RlLgorCisJICBJZiB1bnN1cmUsIHNheSBZLgorCitjb25maWcgRk9OVF82eDExCisJYm9vbCAiTWFjIGNvbnNvbGUgNngxMSBmb250IChub3Qgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzKSIgaWYgRk9OVFMKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUgfHwgU1RJX0NPTlNPTEUKKwlkZWZhdWx0IHkgaWYgIVNQQVJDICYmICFGT05UUyAmJiBNQUMKKwloZWxwCisJICBTbWFsbCBjb25zb2xlIGZvbnQgd2l0aCBNYWNpbnRvc2gtc3R5bGUgaGlnaC1oYWxmIGdseXBocy4gIFNvbWUgTWFjCisJICBmcmFtZWJ1ZmZlciBkcml2ZXJzIGRvbid0IHN1cHBvcnQgdGhpcyBvbmUgYXQgYWxsLgorCitjb25maWcgRk9OVF83eDE0CisJYm9vbCAiY29uc29sZSA3eDE0IGZvbnQgKG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGRyaXZlcnMpIiBpZiBGT05UUworCWRlcGVuZHMgb24gRlJBTUVCVUZGRVJfQ09OU09MRQorCWhlbHAKKwkgIENvbnNvbGUgZm9udCB3aXRoIGNoYXJhY3RlcnMganVzdCBhIGJpdCBzbWFsbGVyIHRoYW4gdGhlIGRlZmF1bHQuCisJICBJZiB0aGUgc3RhbmRhcmQgOHgxNiBmb250IGlzIGEgbGl0dGxlIHRvbyBiaWcgZm9yIHlvdSwgc2F5IFkuCisJICBPdGhlcndpc2UsIHNheSBOLgorCitjb25maWcgRk9OVF9QRUFSTF84eDgKKwlib29sICJQZWFybCAob2xkIG02OGspIGNvbnNvbGUgOHg4IGZvbnQiIGlmIEZPTlRTCisJZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFCisJZGVmYXVsdCB5IGlmICFTUEFSQyAmJiAhRk9OVFMgJiYgQU1JR0EKKwloZWxwCisJICBTbWFsbCBjb25zb2xlIGZvbnQgd2l0aCBQQy1zdHlsZSBjb250cm9sLWNoYXJhY3RlciBhbmQgaGlnaC1oYWxmCisJICBnbHlwaHMuCisKK2NvbmZpZyBGT05UX0FDT1JOXzh4OAorCWJvb2wgIkFjb3JuIGNvbnNvbGUgOHg4IGZvbnQiIGlmIEZPTlRTCisJZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFCisJZGVmYXVsdCB5IGlmICFTUEFSQyAmJiAhRk9OVFMgJiYgQVJNICYmIEFSQ0hfQUNPUk4KKwloZWxwCisJICBTbWFsbCBjb25zb2xlIGZvbnQgd2l0aCBQQy1zdHlsZSBjb250cm9sIGNoYXJhY3RlcnMgYW5kIGhpZ2gtaGFsZgorCSAgZ2x5cGhzLgorCitjb25maWcgRk9OVF9NSU5JXzR4NgorCWJvb2wgIk1pbmkgNHg2IGZvbnQiCisJZGVwZW5kcyBvbiAhU1BBUkMgJiYgRk9OVFMKKworY29uZmlnIEZPTlRfNngxMAorCWJvb2wgIk1lZGl1bS1zaXplIDZ4MTAgZm9udCIKKwlkZXBlbmRzIG9uICFTUEFSQyAmJiBGT05UUworCWhlbHAKKwkgIE1lZGl1bS1zaXplIGNvbnNvbGUgZm9udC4gU3VpdGFibGUgZm9yIGZyYW1lYnVmZmVyIGNvbnNvbGVzIG9uCisJICBlbWJlZGRlZCBkZXZpY2VzIHdpdGggYSAzMjB4MjQwIHNjcmVlbiwgdG8gZ2V0IGEgcmVhc29uYWJsZSBudW1iZXIKKwkgIG9mIGNoYXJhY3RlcnMgKDUzeDI0KSB0aGF0IGFyZSBzdGlsbCBhdCBhIHJlYWRhYmxlIHNpemUuCisKK2NvbmZpZyBGT05UXzEweDE4CisJYm9vbCAiY29uc29sZSAxMHgxOCBmb250IChub3Qgc3VwcG9ydGVkIGJ5IGFsbCBkcml2ZXJzKSIgaWYgRk9OVFMKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUKKwloZWxwCisJICBUaGlzIGlzIGEgaGlnaCByZXNvbHV0aW9uIGNvbnNvbGUgZm9udCBmb3IgbWFjaGluZXMgd2l0aCB2ZXJ5CisJICBiaWcgbGV0dGVycy4gSXQgZml0cyBiZXR3ZWVuIHRoZSBzdW4gMTJ4MjIgYW5kIHRoZSBub3JtYWwgOHgxNiBmb250LgorCSAgSWYgb3RoZXIgZm9udHMgYXJlIHRvbyBiaWcgb3IgdG9vIHNtYWxsIGZvciB5b3UsIHNheSBZLCBvdGhlcndpc2Ugc2F5IE4uCisKK2NvbmZpZyBGT05UX1NVTjh4MTYKKwlib29sICJTcGFyYyBjb25zb2xlIDh4MTYgZm9udCIKKwlkZXBlbmRzIG9uIEZSQU1FQlVGRkVSX0NPTlNPTEUgJiYgKCFTUEFSQyAmJiBGT05UUyB8fCBTUEFSQykKKwloZWxwCisJICBUaGlzIGlzIHRoZSBoaWdoIHJlc29sdXRpb24gY29uc29sZSBmb250IGZvciBTdW4gbWFjaGluZXMuIFNheSBZLgorCitjb25maWcgRk9OVF9TVU4xMngyMgorCWJvb2wgIlNwYXJjIGNvbnNvbGUgMTJ4MjIgZm9udCAobm90IHN1cHBvcnRlZCBieSBhbGwgZHJpdmVycykiCisJZGVwZW5kcyBvbiBGUkFNRUJVRkZFUl9DT05TT0xFICYmICghU1BBUkMgJiYgRk9OVFMgfHwgU1BBUkMpCisJaGVscAorCSAgVGhpcyBpcyB0aGUgaGlnaCByZXNvbHV0aW9uIGNvbnNvbGUgZm9udCBmb3IgU3VuIG1hY2hpbmVzIHdpdGggdmVyeQorCSAgYmlnIGxldHRlcnMgKGxpa2UgdGhlIGxldHRlcnMgdXNlZCBpbiB0aGUgU1BBUkMgUFJPTSkuIElmIHRoZQorCSAgc3RhbmRhcmQgZm9udCBpcyB1bnJlYWRhYmxlIGZvciB5b3UsIHNheSBZLCBvdGhlcndpc2Ugc2F5IE4uCisKK2NvbmZpZyBGT05UX0FVVE9TRUxFQ1QKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiAhRk9OVF84eDgKKwlkZXBlbmRzIG9uICFGT05UXzZ4MTEKKwlkZXBlbmRzIG9uICFGT05UXzd4MTQKKwlkZXBlbmRzIG9uICFGT05UX1BFQVJMXzh4OAorCWRlcGVuZHMgb24gIUZPTlRfQUNPUk5fOHg4CisJZGVwZW5kcyBvbiAhRk9OVF9NSU5JXzR4NgorCWRlcGVuZHMgb24gIUZPTlRfNngxMAorCWRlcGVuZHMgb24gIUZPTlRfU1VOOHgxNgorCWRlcGVuZHMgb24gIUZPTlRfU1VOMTJ4MjIKKwlkZXBlbmRzIG9uICFGT05UXzEweDE4CisJc2VsZWN0IEZPTlRfOHgxNgorCitlbmRpZiAjIEZPTlRfU1VQUE9SVApkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvTWFrZWZpbGUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTZmMDJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvTWFrZWZpbGUKQEAgLTAsMCArMSwyMCBAQAorIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorIyBGb250IGhhbmRsaW5nCisKK2ZvbnQtb2JqcyA6PSBmb250cy5vCisKK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UX1NVTjh4MTYpICAgKz0gZm9udF9zdW44eDE2Lm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UX1NVTjEyeDIyKSAgKz0gZm9udF9zdW4xMngyMi5vCitmb250LW9ianMtJChDT05GSUdfRk9OVF84eDgpICAgICAgICs9IGZvbnRfOHg4Lm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UXzh4MTYpICAgICAgKz0gZm9udF84eDE2Lm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UXzZ4MTEpICAgICAgKz0gZm9udF82eDExLm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UXzd4MTQpICAgICAgKz0gZm9udF83eDE0Lm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UXzEweDE4KSAgICAgKz0gZm9udF8xMHgxOC5vCitmb250LW9ianMtJChDT05GSUdfRk9OVF9QRUFSTF84eDgpICs9IGZvbnRfcGVhcmxfOHg4Lm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UX0FDT1JOXzh4OCkgKz0gZm9udF9hY29ybl84eDgubworZm9udC1vYmpzLSQoQ09ORklHX0ZPTlRfTUlOSV80eDYpICArPSBmb250X21pbmlfNHg2Lm8KK2ZvbnQtb2Jqcy0kKENPTkZJR19GT05UXzZ4MTApICAgICAgKz0gZm9udF82eDEwLm8KKworZm9udC1vYmpzICs9ICQoZm9udC1vYmpzLXkpCisKK29iai0kKENPTkZJR19GT05UX1NVUFBPUlQpICAgICAgICAgKz0gZm9udC5vCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250XzEweDE4LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250XzEweDE4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyZjBmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfMTB4MTguYwpAQCAtMCwwICsxLDUxNDcgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGFkYXB0ZWQgZnJvbSBmb250X3N1bjEyeDIyLmMgKgorICogYnkgSnVycmlhYW4gS2Fsa21hbiAwNi0yMDA1ICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9mb250Lmg+CisKKyNkZWZpbmUgRk9OVERBVEFNQVggOTIxNgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmb250ZGF0YV8xMHgxOFtGT05UREFUQU1BWF0gPSB7CisKKwkvKiAwIDB4MDAgJ15AJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMSAweDAxICdeQScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDQwLCAweDQwLCAvKiAwMTAwMDAwMDAxICovCisJMHg1YiwgMHg0MCwgLyogMDEwMTEwMTEwMSAqLworCTB4NDAsIDB4NDAsIC8qIDAxMDAwMDAwMDEgKi8KKwkweDQ0LCAweDQwLCAvKiAwMTAwMDEwMDAxICovCisJMHg0NCwgMHg0MCwgLyogMDEwMDAxMDAwMSAqLworCTB4NTEsIDB4NDAsIC8qIDAxMDEwMDAxMDEgKi8KKwkweDRlLCAweDQwLCAvKiAwMTAwMTExMDAxICovCisJMHg0MCwgMHg0MCwgLyogMDEwMDAwMDAwMSAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMSAqLworCTB4NjQsIDB4YzAsIC8qIDAxMTAwMTAwMTEgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExICovCisJMHg3YiwgMHhjMCwgLyogMDExMTEwMTExMSAqLworCTB4N2IsIDB4YzAsIC8qIDAxMTExMDExMTEgKi8KKwkweDZlLCAweGMwLCAvKiAwMTEwMTExMDExICovCisJMHg3MSwgMHhjMCwgLyogMDExMTAwMDExMSAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAzIDB4MDMgJ15DJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxMSwgMHgwMCwgLyogMDAwMTAwMDEwMCAqLworCTB4M2IsIDB4ODAsIC8qIDAwMTExMDExMTAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNCAweDA0ICdeRCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4N2IsIDB4YzAsIC8qIDAxMTExMDExMTEgKi8KKwkweDM1LCAweDgwLCAvKiAwMDExMDEwMTEwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA2IDB4MDYgJ15GJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExICovCisJMHgzNSwgMHg4MCwgLyogMDAxMTAxMDExMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNyAweDA3ICdeRycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGYzLCAweGMwLCAvKiAxMTExMDAxMTExICovCisJMHhlMSwgMHhjMCwgLyogMTExMDAwMDExMSAqLworCTB4ZTEsIDB4YzAsIC8qIDExMTAwMDAxMTEgKi8KKwkweGMwLCAweGMwLCAvKiAxMTAwMDAwMDExICovCisJMHhjMCwgMHhjMCwgLyogMTEwMDAwMDAxMSAqLworCTB4ZTEsIDB4YzAsIC8qIDExMTAwMDAxMTEgKi8KKwkweGUxLCAweGMwLCAvKiAxMTEwMDAwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisKKwkvKiA5IDB4MDkgJ15JJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTIsIDB4MDAsIC8qIDAwMDEwMDEwMDAgKi8KKwkweDEyLCAweDAwLCAvKiAwMDAxMDAxMDAwICovCisJMHgyMSwgMHgwMCwgLyogMDAxMDAwMDEwMCAqLworCTB4MjEsIDB4MDAsIC8qIDAwMTAwMDAxMDAgKi8KKwkweDEyLCAweDAwLCAvKiAwMDAxMDAxMDAwICovCisJMHgxMiwgMHgwMCwgLyogMDAwMTAwMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTAgMHgwYSAnXkonICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGYzLCAweGMwLCAvKiAxMTExMDAxMTExICovCisJMHhlZCwgMHhjMCwgLyogMTExMDExMDExMSAqLworCTB4ZWQsIDB4YzAsIC8qIDExMTAxMTAxMTEgKi8KKwkweGRlLCAweGMwLCAvKiAxMTAxMTExMDExICovCisJMHhkZSwgMHhjMCwgLyogMTEwMTExMTAxMSAqLworCTB4ZWQsIDB4YzAsIC8qIDExMTAxMTAxMTEgKi8KKwkweGVkLCAweGMwLCAvKiAxMTEwMTEwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisKKwkvKiAxMSAweDBiICdeSycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwMywgMHhjMCwgLyogMDAwMDAwMTExMSAqLworCTB4MDYsIDB4YzAsIC8qIDAwMDAwMTEwMTEgKi8KKwkweDBjLCAweGMwLCAvKiAwMDAwMTEwMDExICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAgKi8KKwkweGMzLCAweDAwLCAvKiAxMTAwMDAxMTAwICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4YzMsIDB4MDAsIC8qIDExMDAwMDExMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEyIDB4MGMgJ15MJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTMgMHgwZCAnXk0nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMCAqLworCTB4MDgsIDB4ODAsIC8qIDAwMDAxMDAwMTAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNCAweDBlICdeTicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwICovCisJMHgxMCwgMHg4MCwgLyogMDAwMTAwMDAxMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAgKi8KKwkweDEwLCAweDgwLCAvKiAwMDAxMDAwMDEwICovCisJMHgxMCwgMHg4MCwgLyogMDAwMTAwMDAxMCAqLworCTB4MTAsIDB4ODAsIC8qIDAwMDEwMDAwMTAgKi8KKwkweDEwLCAweDgwLCAvKiAwMDAxMDAwMDEwICovCisJMHgxMywgMHg4MCwgLyogMDAwMTAwMTExMCAqLworCTB4MTcsIDB4ODAsIC8qIDAwMDEwMTExMTAgKi8KKwkweDczLCAweDAwLCAvKiAwMTExMDAxMTAwICovCisJMHhmMCwgMHgwMCwgLyogMTExMTAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE1IDB4MGYgJ15PJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDI0LCAweDgwLCAvKiAwMDEwMDEwMDEwICovCisJMHgxNSwgMHgwMCwgLyogMDAwMTAxMDEwMCAqLworCTB4NTUsIDB4NDAsIC8qIDAxMDEwMTAxMDEgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4NTUsIDB4NDAsIC8qIDAxMDEwMTAxMDEgKi8KKwkweDE1LCAweDAwLCAvKiAwMDAxMDEwMTAwICovCisJMHgyNCwgMHg4MCwgLyogMDAxMDAxMDAxMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTYgMHgxMCAnXlAnICovCisJMHgwMCwgMHg4MCwgLyogMDAwMDAwMDAxMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweGZmLCAweDgwLCAvKiAxMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMCAqLworCTB4MDcsIDB4ODAsIC8qIDAwMDAwMTExMTAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDAsIDB4ODAsIC8qIDAwMDAwMDAwMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDQwLCAweDAwLCAvKiAwMTAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHg3YywgMHgwMCwgLyogMDExMTExMDAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAgKi8KKwkweDdmLCAweDAwLCAvKiAwMTExMTExMTAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHgwMCwgLyogMDExMTExMTEwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAgKi8KKwkweDdjLCAweDAwLCAvKiAwMTExMTEwMDAwICovCisJMHg3OCwgMHgwMCwgLyogMDExMTEwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg0MCwgMHgwMCwgLyogMDEwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE4IDB4MTIgJ15SJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTkgMHgxMyAnXlMnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZiwgMHhjMCwgLyogMDAwMTExMTExMSAqLworCTB4MzksIDB4ODAsIC8qIDAwMTExMDAxMTAgKi8KKwkweDc5LCAweDgwLCAvKiAwMTExMTAwMTEwICovCisJMHg3OSwgMHg4MCwgLyogMDExMTEwMDExMCAqLworCTB4NzksIDB4ODAsIC8qIDAxMTExMDAxMTAgKi8KKwkweDM5LCAweDgwLCAvKiAwMDExMTAwMTEwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgzOSwgMHhjMCwgLyogMDAxMTEwMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIxIDB4MTUgJ15VJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDNlLCAweDAwLCAvKiAwMDExMTExMDAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDNlLCAweDAwLCAvKiAwMDExMTExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjIgMHgxNiAnXlYnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI0IDB4MTggJ15YJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjUgMHgxOSAnXlknICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNiAweDFhICdeWicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI3IDB4MWIgJ15bJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjggMHgxYyAnXlwnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyOSAweDFkICdeXScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MTIsIDB4MDAsIC8qIDAwMDEwMDEwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHg3MywgMHg4MCwgLyogMDExMTAwMTExMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHg3MywgMHg4MCwgLyogMDExMTAwMTExMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDEyLCAweDAwLCAvKiAwMDAxMDAxMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDMwIDB4MWUgJ15eJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMzEgMHgxZiAnXl8nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMSAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMzMgMHgyMSAnIScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDM0IDB4MjIgJyInICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweGY3LCAweDgwLCAvKiAxMTExMDExMTEwICovCisJMHhmNywgMHg4MCwgLyogMTExMTAxMTExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NDIsIDB4MDAsIC8qIDAxMDAwMDEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMzYgMHgyNCAnJCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHg2ZiwgMHg4MCwgLyogMDExMDExMTExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDZjLCAweDgwLCAvKiAwMTEwMTEwMDEwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwICovCisJMHg0ZCwgMHg4MCwgLyogMDEwMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDdmLCAweDAwLCAvKiAwMTExMTExMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDM3IDB4MjUgJyUnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDdiLCAweDAwLCAvKiAwMTExMTAxMTAwICovCisJMHg3YiwgMHgwMCwgLyogMDExMTEwMTEwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MzcsIDB4ODAsIC8qIDAwMTEwMTExMTAgKi8KKwkweDM3LCAweDgwLCAvKiAwMDExMDExMTEwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDNlLCAweDAwLCAvKiAwMDExMTExMDAwICovCisJMHg3NiwgMHgwMCwgLyogMDExMTAxMTAwMCAqLworCTB4NjYsIDB4NDAsIC8qIDAxMTAwMTEwMDEgKi8KKwkweDYzLCAweGMwLCAvKiAwMTEwMDAxMTExICovCisJMHg2MywgMHg4MCwgLyogMDExMDAwMTExMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgxYywgMHhjMCwgLyogMDAwMTExMDAxMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMzkgMHgyNyAnJycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgyMCwgMHgwMCwgLyogMDAxMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDQwIDB4MjggJygnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNDIgMHgyYSAnKicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHg0YywgMHg4MCwgLyogMDEwMDExMDAxMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHg0YywgMHg4MCwgLyogMDEwMDExMDAxMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDQzIDB4MmIgJysnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA0NCAweDJjICcsJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHg3OCwgMHgwMCwgLyogMDExMTEwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg0MCwgMHgwMCwgLyogMDEwMDAwMDAwMCAqLworCisJLyogNDUgMHgyZCAnLScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDQ2IDB4MmUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA0NyAweDJmICcvJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNDggMHgzMCAnMCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDIzLCAweDAwLCAvKiAwMDEwMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjMsIDB4ODAsIC8qIDAxMTAwMDExMTAgKi8KKwkweDY1LCAweDgwLCAvKiAwMTEwMDEwMTEwICovCisJMHg2NSwgMHg4MCwgLyogMDExMDAxMDExMCAqLworCTB4NjksIDB4ODAsIC8qIDAxMTAxMDAxMTAgKi8KKwkweDY5LCAweDgwLCAvKiAwMTEwMTAwMTEwICovCisJMHg3MSwgMHg4MCwgLyogMDExMTAwMDExMCAqLworCTB4NjEsIDB4MDAsIC8qIDAxMTAwMDAxMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDQ5IDB4MzEgJzEnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxYywgMHgwMCwgLyogMDAwMTExMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDZjLCAweDAwLCAvKiAwMTEwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4NjMsIDB4ODAsIC8qIDAxMTAwMDExMTAgKi8KKwkweDQxLCAweDgwLCAvKiAwMTAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNTEgMHgzMyAnMycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxYywgMHgwMCwgLyogMDAwMTExMDAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAgKi8KKwkweDQ3LCAweDAwLCAvKiAwMTAwMDExMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4NDEsIDB4ODAsIC8qIDAxMDAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDUyIDB4MzQgJzQnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAgKi8KKwkweGM2LCAweDAwLCAvKiAxMTAwMDExMDAwICovCisJMHhjNiwgMHgwMCwgLyogMTEwMDAxMTAwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAgKi8KKwkweGZmLCAweDgwLCAvKiAxMTExMTExMTEwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAgKi8KKwkweDY3LCAweDAwLCAvKiAwMTEwMDExMTAwICovCisJMHgwMywgMHg4MCwgLyogMDAwMDAwMTExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4NDEsIDB4ODAsIC8qIDAxMDAwMDAxMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNTQgMHgzNiAnNicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2ZSwgMHgwMCwgLyogMDExMDExMTAwMCAqLworCTB4N2YsIDB4MDAsIC8qIDAxMTExMTExMDAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDcxLCAweDAwLCAvKiAwMTExMDAwMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDU1IDB4MzcgJzcnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgyMywgMHgwMCwgLyogMDAxMDAwMTEwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4MWEsIDB4MDAsIC8qIDAwMDExMDEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxNiwgMHgwMCwgLyogMDAwMTAxMTAwMCAqLworCTB4MjMsIDB4MDAsIC8qIDAwMTAwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNTcgMHgzOSAnOScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MTcsIDB4MDAsIC8qIDAwMDEwMTExMDAgKi8KKwkweDIzLCAweDgwLCAvKiAwMDEwMDAxMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3MywgMHg4MCwgLyogMDExMTAwMTExMCAqLworCTB4M2QsIDB4ODAsIC8qIDAwMTExMTAxMTAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDU4IDB4M2EgJzonICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA1OSAweDNiICc7JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgyMCwgMHgwMCwgLyogMDAxMDAwMDAwMCAqLworCisJLyogNjAgMHgzYyAnPCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDYxIDB4M2QgJz0nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA2MiAweDNlICc+JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNjMgMHgzZiAnPycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDNiLCAweDgwLCAvKiAwMDExMTAxMTEwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDY0IDB4NDAgJ0AnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDY1LCAweDgwLCAvKiAwMTEwMDEwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmYsIDB4ODAsIC8qIDAxMTAxMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExICovCisJMHhmMSwgMHhjMCwgLyogMTExMTAwMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNjYgMHg0MiAnQicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4NjIsIDB4MDAsIC8qIDAxMTAwMDEwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHg3ZSwgMHgwMCwgLyogMDExMTExMTAwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4ZmUsIDB4MDAsIC8qIDExMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDY3IDB4NDMgJ0MnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAgKi8KKwkweDExLCAweDgwLCAvKiAwMDAxMDAwMTEwICovCisJMHgyMCwgMHg4MCwgLyogMDAxMDAwMDAxMCAqLworCTB4MjAsIDB4MDAsIC8qIDAwMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4MTksIDB4MDAsIC8qIDAwMDExMDAxMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwICovCisJMHg2NywgMHgwMCwgLyogMDExMDAxMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4MDAsIC8qIDAxMTAwMDAxMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNjkgMHg0NSAnRScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MzEsIDB4MDAsIC8qIDAwMTEwMDAxMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDcwIDB4NDYgJ0YnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwICovCisJMHgxMSwgMHg4MCwgLyogMDAwMTAwMDExMCAqLworCTB4MjAsIDB4ODAsIC8qIDAwMTAwMDAwMTAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjcsIDB4YzAsIC8qIDAxMTAwMTExMTEgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNzIgMHg0OCAnSCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4ZjMsIDB4YzAsIC8qIDExMTEwMDExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDczIDB4NDkgJ0knICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA3NCAweDRhICdKJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNzUgMHg0YiAnSycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmMSwgMHg4MCwgLyogMTExMTAwMDExMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDcwLCAweDAwLCAvKiAwMTExMDAwMDAwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4ZjAsIDB4YzAsIC8qIDExMTEwMDAwMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDc2IDB4NGMgJ0wnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA3NyAweDRkICdNJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGUwLCAweGMwLCAvKiAxMTEwMDAwMDExICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzMsIDB4ODAsIC8qIDAxMTEwMDExMTAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogNzggMHg0ZSAnTicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3MSwgMHg4MCwgLyogMDExMTAwMDExMCAqLworCTB4NzksIDB4ODAsIC8qIDAxMTExMDAxMTAgKi8KKwkweDc5LCAweDgwLCAvKiAwMTExMTAwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDY3LCAweDgwLCAvKiAwMTEwMDExMTEwICovCisJMHg2NywgMHg4MCwgLyogMDExMDAxMTExMCAqLworCTB4NjMsIDB4ODAsIC8qIDAxMTAwMDExMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4ZjMsIDB4YzAsIC8qIDExMTEwMDExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDc5IDB4NGYgJ08nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE3LCAweDAwLCAvKiAwMDAxMDExMTAwICovCisJMHgyMywgMHgwMCwgLyogMDAxMDAwMTEwMCAqLworCTB4MjEsIDB4ODAsIC8qIDAwMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDIxLCAweDAwLCAvKiAwMDEwMDAwMTAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4MWEsIDB4MDAsIC8qIDAwMDExMDEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZlLCAweDAwLCAvKiAxMTExMTExMDAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDdlLCAweDAwLCAvKiAwMTExMTExMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHhmMCwgMHgwMCwgLyogMTExMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogODEgMHg1MSAnUScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MTMsIDB4MDAsIC8qIDAwMDEwMDExMDAgKi8KKwkweDIzLCAweDAwLCAvKiAwMDEwMDAxMTAwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4M2IsIDB4MDAsIC8qIDAwMTExMDExMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDI2LCAweDAwLCAvKiAwMDEwMDExMDAwICovCisJMHgwMywgMHg4MCwgLyogMDAwMDAwMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDgyIDB4NTIgJ1InICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmUsIDB4MDAsIC8qIDExMTExMTEwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHgwMCwgLyogMDExMDAwMDEwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMCAqLworCTB4NmUsIDB4MDAsIC8qIDAxMTAxMTEwMDAgKi8KKwkweDY3LCAweDAwLCAvKiAwMTEwMDExMTAwICovCisJMHg2MywgMHg4MCwgLyogMDExMDAwMTExMCAqLworCTB4NjEsIDB4YzAsIC8qIDAxMTAwMDAxMTEgKi8KKwkweGYwLCAweGMwLCAvKiAxMTExMDAwMDExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4NDEsIDB4ODAsIC8qIDAxMDAwMDAxMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogODQgMHg1NCAnVCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4NGMsIDB4ODAsIC8qIDAxMDAxMTAwMTAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDg1IDB4NTUgJ1UnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZjMsIDB4YzAsIC8qIDExMTEwMDExMTEgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3MywgMHgwMCwgLyogMDExMTAwMTEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGUxLCAweGMwLCAvKiAxMTEwMDAwMTExICovCisJMHhjMCwgMHhjMCwgLyogMTEwMDAwMDAxMSAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MTIsIDB4MDAsIC8qIDAwMDEwMDEwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogODcgMHg1NyAnVycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhlMSwgMHhjMCwgLyogMTExMDAwMDExMSAqLworCTB4YzAsIDB4YzAsIC8qIDExMDAwMDAwMTEgKi8KKwkweGMwLCAweGMwLCAvKiAxMTAwMDAwMDExICovCisJMHhjMCwgMHhjMCwgLyogMTEwMDAwMDAxMSAqLworCTB4ZTAsIDB4YzAsIC8qIDExMTAwMDAwMTEgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3NywgMHgwMCwgLyogMDExMTAxMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDg4IDB4NTggJ1gnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZjcsIDB4ODAsIC8qIDExMTEwMTExMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHgzNiwgMHgwMCwgLyogMDAxMTAxMTAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwICovCisJMHgzNiwgMHgwMCwgLyogMDAxMTAxMTAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweGY3LCAweDgwLCAvKiAxMTExMDExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGYzLCAweGMwLCAvKiAxMTExMDAxMTExICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogOTAgMHg1YSAnWicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4MjEsIDB4ODAsIC8qIDAwMTAwMDAxMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDkxIDB4NWIgJ1snICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA5MiAweDVjICdcJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGMwLCAweDAwLCAvKiAxMTAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweGMwLCAvKiAwMDAwMDAwMDExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogOTMgMHg1ZCAnXScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAgKi8KKwkweDNlLCAweDAwLCAvKiAwMDExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDk0IDB4NWUgJ14nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA5NSAweDVmICdfJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogOTYgMHg2MCAnYCcgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDk3IDB4NjEgJ2EnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MjEsIDB4ODAsIC8qIDAwMTAwMDAxMTAgKi8KKwkweDA3LCAweDgwLCAvKiAwMDAwMDExMTEwICovCisJMHgzOSwgMHg4MCwgLyogMDAxMTEwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzMsIDB4ODAsIC8qIDAxMTEwMDExMTAgKi8KKwkweDNkLCAweGMwLCAvKiAwMDExMTEwMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MjAsIDB4MDAsIC8qIDAwMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHhlMCwgMHgwMCwgLyogMTExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMCAqLworCTB4NmYsIDB4MDAsIC8qIDAxMTAxMTExMDAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzEsIDB4ODAsIC8qIDAxMTEwMDAxMTAgKi8KKwkweDdiLCAweDAwLCAvKiAwMTExMTAxMTAwICovCisJMHg0ZSwgMHgwMCwgLyogMDEwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogOTkgMHg2MyAnYycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDM3LCAweDAwLCAvKiAwMDExMDExMTAwICovCisJMHgyMywgMHgwMCwgLyogMDAxMDAwMTEwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDcxLCAweDAwLCAvKiAwMTExMDAwMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEwMCAweDY0ICdkJyAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMCAqLworCTB4MzcsIDB4ODAsIC8qIDAwMTEwMTExMTAgKi8KKwkweDIzLCAweDgwLCAvKiAwMDEwMDAxMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzMsIDB4ODAsIC8qIDAxMTEwMDExMTAgKi8KKwkweDM1LCAweDgwLCAvKiAwMDExMDEwMTEwICovCisJMHgxOSwgMHhjMCwgLyogMDAwMTEwMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMDIgMHg2NiAnZicgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwICovCisJMHgwOSwgMHg4MCwgLyogMDAwMDEwMDExMCAqLworCTB4MDksIDB4ODAsIC8qIDAwMDAxMDAxMTAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHg3ZiwgMHgwMCwgLyogMDExMTExMTEwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEwMyAweDY3ICdnJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxYywgMHg4MCwgLyogMDAwMTExMDAxMCAqLworCTB4MzcsIDB4ODAsIC8qIDAwMTEwMTExMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4N2YsIDB4MDAsIC8qIDAxMTExMTExMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMCAqLworCTB4NDAsIDB4ODAsIC8qIDAxMDAwMDAwMTAgKi8KKwkweDdmLCAweDAwLCAvKiAwMTExMTExMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDcwLCAweDAwLCAvKiAwMTExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDM3LCAweDAwLCAvKiAwMDExMDExMTAwICovCisJMHgzYiwgMHg4MCwgLyogMDAxMTEwMTExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDdiLCAweGMwLCAvKiAwMTExMTAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMDUgMHg2OSAnaScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEwNiAweDZhICdqJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDQxLCAweDgwLCAvKiAwMTAwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzEsIDB4ODAsIC8qIDAxMTEwMDAxMTAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgxYywgMHgwMCwgLyogMDAwMTExMDAwMCAqLworCisJLyogMTA3IDB4NmIgJ2snICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4ZTAsIDB4MDAsIC8qIDExMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYzLCAweDgwLCAvKiAwMTEwMDAxMTEwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMCAqLworCTB4NmMsIDB4MDAsIC8qIDAxMTAxMTAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDZjLCAweDAwLCAvKiAwMTEwMTEwMDAwICovCisJMHg2ZSwgMHgwMCwgLyogMDExMDExMTAwMCAqLworCTB4NjcsIDB4MDAsIC8qIDAxMTAwMTExMDAgKi8KKwkweGYzLCAweDgwLCAvKiAxMTExMDAxMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMDggMHg2YyAnbCcgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEwOSAweDZkICdtJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhkYiwgMHg4MCwgLyogMTEwMTEwMTExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHhlZCwgMHhjMCwgLyogMTExMDExMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTEwIDB4NmUgJ24nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDZmLCAweDAwLCAvKiAwMTEwMTExMTAwICovCisJMHg3YiwgMHg4MCwgLyogMDExMTEwMTExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDdiLCAweGMwLCAvKiAwMTExMTAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMTEgMHg2ZiAnbycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGUxLCAweDgwLCAvKiAxMTEwMDAwMTEwICovCisJMHg3MywgMHgwMCwgLyogMDExMTAwMTEwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDExMiAweDcwICdwJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhkZSwgMHgwMCwgLyogMTEwMTExMTAwMCAqLworCTB4NzYsIDB4MDAsIC8qIDAxMTEwMTEwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzEsIDB4ODAsIC8qIDAxMTEwMDAxMTAgKi8KKwkweDdiLCAweDAwLCAvKiAwMTExMTAxMTAwICovCisJMHg3ZSwgMHgwMCwgLyogMDExMTExMTAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHhmMCwgMHgwMCwgLyogMTExMTAwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBlLCAweGMwLCAvKiAwMDAwMTExMDExICovCisJMHgxYiwgMHg4MCwgLyogMDAwMTEwMTExMCAqLworCTB4MzMsIDB4ODAsIC8qIDAwMTEwMDExMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3MSwgMHg4MCwgLyogMDExMTAwMDExMCAqLworCTB4M2IsIDB4ODAsIC8qIDAwMTExMDExMTAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweGMwLCAvKiAwMDAwMDAxMTExICovCisKKwkvKiAxMTQgMHg3MiAncicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4NzMsIDB4MDAsIC8qIDAxMTEwMDExMDAgKi8KKwkweDM1LCAweDgwLCAvKiAwMDExMDEwMTEwICovCisJMHgzOSwgMHg4MCwgLyogMDAxMTEwMDExMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDExNSAweDczICdzJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYxLCAweDAwLCAvKiAwMTEwMDAwMTAwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMCAqLworCTB4MzgsIDB4MDAsIC8qIDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwNywgMHgwMCwgLyogMDAwMDAxMTEwMCAqLworCTB4NDMsIDB4MDAsIC8qIDAxMDAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg3ZSwgMHgwMCwgLyogMDExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MWMsIDB4ODAsIC8qIDAwMDExMTAwMTAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMTcgMHg3NSAndScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZjcsIDB4ODAsIC8qIDExMTEwMTExMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg3NywgMHgwMCwgLyogMDExMTAxMTEwMCAqLworCTB4M2QsIDB4ODAsIC8qIDAwMTExMTAxMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDExOCAweDc2ICd2JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmMSwgMHhjMCwgLyogMTExMTAwMDExMSAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGUzLCAweGMwLCAvKiAxMTEwMDAxMTExICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4NmIsIDB4MDAsIC8qIDAxMTAxMDExMDAgKi8KKwkweDZiLCAweDAwLCAvKiAwMTEwMTAxMTAwICovCisJMHg3ZSwgMHgwMCwgLyogMDExMTExMTAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMjAgMHg3OCAneCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZjcsIDB4ODAsIC8qIDExMTEwMTExMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHgzNiwgMHgwMCwgLyogMDAxMTAxMTAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwICovCisJMHgxYywgMHgwMCwgLyogMDAwMTExMDAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4ZjcsIDB4ODAsIC8qIDExMTEwMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEyMSAweDc5ICd5JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMCAqLworCisJLyogMTIyIDB4N2EgJ3onICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NDMsIDB4MDAsIC8qIDAxMDAwMDExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHg2MCwgMHg4MCwgLyogMDExMDAwMDAxMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMjMgMHg3YiAneycgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEyNCAweDdjICd8JyAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTI1IDB4N2QgJ30nICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMjYgMHg3ZSAnficgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMCAqLworCTB4M2QsIDB4ODAsIC8qIDAwMTExMTAxMTAgKi8KKwkweDZmLCAweDAwLCAvKiAwMTEwMTExMTAwICovCisJMHg0NiwgMHgwMCwgLyogMDEwMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEyNyAweDdmICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTIsIDB4MDAsIC8qIDAwMDEwMDEwMDAgKi8KKwkweDIxLCAweDAwLCAvKiAwMDEwMDAwMTAwICovCisJMHg0MCwgMHg4MCwgLyogMDEwMDAwMDAxMCAqLworCTB4NDAsIDB4ODAsIC8qIDAxMDAwMDAwMTAgKi8KKwkweDQwLCAweDgwLCAvKiAwMTAwMDAwMDEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTI4IDB4ODAgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDIxLCAweDgwLCAvKiAwMDEwMDAwMTEwICovCisJMHg0MCwgMHg4MCwgLyogMDEwMDAwMDAxMCAqLworCTB4NDAsIDB4MDAsIC8qIDAxMDAwMDAwMDAgKi8KKwkweDQwLCAweDAwLCAvKiAwMTAwMDAwMDAwICovCisJMHg0MCwgMHgwMCwgLyogMDEwMDAwMDAwMCAqLworCTB4NDAsIDB4MDAsIC8qIDAxMDAwMDAwMDAgKi8KKwkweDQwLCAweDAwLCAvKiAwMTAwMDAwMDAwICovCisJMHg0MCwgMHgwMCwgLyogMDEwMDAwMDAwMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwICovCisJMHgwMiwgMHgwMCwgLyogMDAwMDAwMTAwMCAqLworCTB4MDIsIDB4MDAsIC8qIDAwMDAwMDEwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwICovCisKKwkvKiAxMjkgMHg4MSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4N2IsIDB4ODAsIC8qIDAxMTExMDExMTAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4MzEsIDB4MDAsIC8qIDAwMTEwMDAxMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4MzEsIDB4MDAsIC8qIDAwMTEwMDAxMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzYiwgMHgwMCwgLyogMDAxMTEwMTEwMCAqLworCTB4MWMsIDB4ODAsIC8qIDAwMDExMTAwMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEzMCAweDgyICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDAwLCAvKiAwMDAwMDAwMTAwICovCisJMHgwMiwgMHgwMCwgLyogMDAwMDAwMTAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTMxIDB4ODMgJy4nICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MjEsIDB4ODAsIC8qIDAwMTAwMDAxMTAgKi8KKwkweDA3LCAweDgwLCAvKiAwMDAwMDExMTEwICovCisJMHgzOSwgMHg4MCwgLyogMDAxMTEwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzMsIDB4ODAsIC8qIDAxMTEwMDExMTAgKi8KKwkweDNkLCAweGMwLCAvKiAwMDExMTEwMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMzIgMHg4NCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMCAqLworCTB4MDcsIDB4ODAsIC8qIDAwMDAwMTExMTAgKi8KKwkweDM5LCAweDgwLCAvKiAwMDExMTAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3MywgMHg4MCwgLyogMDExMTAwMTExMCAqLworCTB4M2QsIDB4YzAsIC8qIDAwMTExMTAxMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEzMyAweDg1ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDIxLCAweDgwLCAvKiAwMDEwMDAwMTEwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMCAqLworCTB4MzksIDB4ODAsIC8qIDAwMTExMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHgzZCwgMHhjMCwgLyogMDAxMTExMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTM0IDB4ODYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MjEsIDB4ODAsIC8qIDAwMTAwMDAxMTAgKi8KKwkweDA3LCAweDgwLCAvKiAwMDAwMDExMTEwICovCisJMHgzOSwgMHg4MCwgLyogMDAxMTEwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NzMsIDB4ODAsIC8qIDAxMTEwMDExMTAgKi8KKwkweDNkLCAweGMwLCAvKiAwMDExMTEwMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMzUgMHg4NyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgyMCwgMHg4MCwgLyogMDAxMDAwMDAxMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NzAsIDB4ODAsIC8qIDAxMTEwMDAwMTAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwICovCisJMHgwMSwgMHgwMCwgLyogMDAwMDAwMDEwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKworCS8qIDEzNiAweDg4ICcuJyAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTM3IDB4ODkgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxMzggMHg4YSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDEzOSAweDhiICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHgzNiwgMHgwMCwgLyogMDAxMTAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTQwIDB4OGMgJy4nICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNDEgMHg4ZCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE0MiAweDhlICcuJyAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDE5LCAweDAwLCAvKiAwMDAxMTAwMTAwICovCisJMHgxOSwgMHgwMCwgLyogMDAwMTEwMDEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweDYwLCAweDgwLCAvKiAwMTEwMDAwMDEwICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTQzIDB4OGYgJy4nICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MGEsIDB4MDAsIC8qIDAwMDAxMDEwMDAgKi8KKwkweDBhLCAweDAwLCAvKiAwMDAwMTAxMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MTksIDB4MDAsIC8qIDAwMDExMDAxMDAgKi8KKwkweDE5LCAweDAwLCAvKiAwMDAxMTAwMTAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MzEsIDB4MDAsIC8qIDAwMTEwMDAxMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHg2MCwgMHg4MCwgLyogMDExMDAwMDAxMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweGYzLCAweGMwLCAvKiAxMTExMDAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNDQgMHg5MCAnLicgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE0NSAweDkxICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzYiwgMHg4MCwgLyogMDAxMTEwMTExMCAqLworCTB4NmMsIDB4YzAsIC8qIDAxMTAxMTAwMTEgKi8KKwkweDRjLCAweGMwLCAvKiAwMTAwMTEwMDExICovCisJMHgwYywgMHhjMCwgLyogMDAwMDExMDAxMSAqLworCTB4M2YsIDB4YzAsIC8qIDAwMTExMTExMTEgKi8KKwkweDZjLCAweDAwLCAvKiAwMTEwMTEwMDAwICovCisJMHhjYywgMHgwMCwgLyogMTEwMDExMDAwMCAqLworCTB4Y2MsIDB4MDAsIC8qIDExMDAxMTAwMDAgKi8KKwkweGVlLCAweGMwLCAvKiAxMTEwMTExMDExICovCisJMHg3YiwgMHg4MCwgLyogMDExMTEwMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTQ2IDB4OTIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKwkweDBlLCAweDQwLCAvKiAwMDAwMTExMDAxICovCisJMHgwZSwgMHg0MCwgLyogMDAwMDExMTAwMSAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDE2LCAweDAwLCAvKiAwMDAxMDExMDAwICovCisJMHgxNiwgMHg4MCwgLyogMDAwMTAxMTAxMCAqLworCTB4MTcsIDB4ODAsIC8qIDAwMDEwMTExMTAgKi8KKwkweDE2LCAweDgwLCAvKiAwMDAxMDExMDEwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MjYsIDB4MDAsIC8qIDAwMTAwMTEwMDAgKi8KKwkweDI2LCAweDAwLCAvKiAwMDEwMDExMDAwICovCisJMHg0NiwgMHg0MCwgLyogMDEwMDAxMTAwMSAqLworCTB4NDYsIDB4NDAsIC8qIDAxMDAwMTEwMDEgKi8KKwkweGVmLCAweGMwLCAvKiAxMTEwMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNDcgMHg5MyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGUxLCAweDgwLCAvKiAxMTEwMDAwMTEwICovCisJMHg3MywgMHgwMCwgLyogMDExMTAwMTEwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE0OCAweDk0ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAgKi8KKwkweGMzLCAweDAwLCAvKiAxMTAwMDAxMTAwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4ZTEsIDB4ODAsIC8qIDExMTAwMDAxMTAgKi8KKwkweDczLCAweDAwLCAvKiAwMTExMDAxMTAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTQ5IDB4OTUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMCAqLworCTB4YzMsIDB4MDAsIC8qIDExMDAwMDExMDAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhlMSwgMHg4MCwgLyogMTExMDAwMDExMCAqLworCTB4NzMsIDB4MDAsIC8qIDAxMTEwMDExMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNTAgMHg5NiAnLicgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgxYywgMHgwMCwgLyogMDAwMTExMDAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZjcsIDB4ODAsIC8qIDExMTEwMTExMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg3NywgMHgwMCwgLyogMDExMTAxMTEwMCAqLworCTB4M2QsIDB4ODAsIC8qIDAwMTExMTAxMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE1MSAweDk3ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmNywgMHg4MCwgLyogMTExMTAxMTExMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDc3LCAweDAwLCAvKiAwMTExMDExMTAwICovCisJMHgzZCwgMHg4MCwgLyogMDAxMTExMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTUyIDB4OTggJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGYzLCAweGMwLCAvKiAxMTExMDAxMTExICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAgKi8KKwkweDcwLCAweDAwLCAvKiAwMTExMDAwMDAwICovCisKKwkvKiAxNTMgMHg5OSAnLicgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE3LCAweDAwLCAvKiAwMDAxMDExMTAwICovCisJMHgyMywgMHgwMCwgLyogMDAxMDAwMTEwMCAqLworCTB4MjEsIDB4ODAsIC8qIDAwMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4MjEsIDB4MDAsIC8qIDAwMTAwMDAxMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgxYSwgMHgwMCwgLyogMDAwMTEwMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE1NCAweDlhICcuJyAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZjEsIDB4YzAsIC8qIDExMTEwMDAxMTEgKi8KKwkweDYwLCAweDgwLCAvKiAwMTEwMDAwMDEwICovCisJMHg2MCwgMHg4MCwgLyogMDExMDAwMDAxMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweDYwLCAweDgwLCAvKiAwMTEwMDAwMDEwICovCisJMHg2MCwgMHg4MCwgLyogMDExMDAwMDAxMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweDYwLCAweDgwLCAvKiAwMTEwMDAwMDEwICovCisJMHg2MCwgMHg4MCwgLyogMDExMDAwMDAxMCAqLworCTB4NzEsIDB4MDAsIC8qIDAxMTEwMDAxMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTU1IDB4OWIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwICovCisJMHgzNiwgMHg4MCwgLyogMDAxMTAxMTAxMCAqLworCTB4MjYsIDB4MDAsIC8qIDAwMTAwMTEwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHg3NiwgMHgwMCwgLyogMDExMTAxMTAwMCAqLworCTB4MzYsIDB4ODAsIC8qIDAwMTEwMTEwMTAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNTYgMHg5YyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4M2IsIDB4MDAsIC8qIDAwMTExMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHg3ZSwgMHgwMCwgLyogMDExMTExMTAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHg3YywgMHg4MCwgLyogMDExMTExMDAxMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDQzLCAweDAwLCAvKiAwMTAwMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE1NyAweDlkICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDQwLCAweDgwLCAvKiAwMTAwMDAwMDEwICovCisJMHg0MCwgMHg4MCwgLyogMDEwMDAwMDAxMCAqLworCTB4MjEsIDB4MDAsIC8qIDAwMTAwMDAxMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTU4IDB4OWUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4YmYsIDB4MDAsIC8qIDEwMTExMTExMDAgKi8KKwkweDQwLCAweDgwLCAvKiAwMTAwMDAwMDEwICovCisJMHg0MCwgMHg4MCwgLyogMDEwMDAwMDAxMCAqLworCTB4N2YsIDB4MDAsIC8qIDAxMTExMTExMDAgKi8KKwkweDQwLCAweDAwLCAvKiAwMTAwMDAwMDAwICovCisJMHg0OCwgMHgwMCwgLyogMDEwMDEwMDAwMCAqLworCTB4NDgsIDB4MDAsIC8qIDAxMDAxMDAwMDAgKi8KKwkweDVlLCAweDAwLCAvKiAwMTAxMTExMDAwICovCisJMHg0OCwgMHgwMCwgLyogMDEwMDEwMDAwMCAqLworCTB4NDgsIDB4MDAsIC8qIDAxMDAxMDAwMDAgKi8KKwkweDQ4LCAweDAwLCAvKiAwMTAwMTAwMDAwICovCisJMHg0OCwgMHg4MCwgLyogMDEwMDEwMDAxMCAqLworCTB4NDcsIDB4MDAsIC8qIDAxMDAwMTExMDAgKi8KKwkweGUwLCAweDAwLCAvKiAxMTEwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNTkgMHg5ZiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDQsIDB4ODAsIC8qIDAwMDAwMTAwMTAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgwOSwgMHgwMCwgLyogMDAwMDEwMDEwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAgKi8KKwkweDQ4LCAweDAwLCAvKiAwMTAwMTAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDkwLCAweDAwLCAvKiAxMDAxMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE2MCAweGEwICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDIxLCAweDgwLCAvKiAwMDEwMDAwMTEwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMCAqLworCTB4MzksIDB4ODAsIC8qIDAwMTExMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHgzZCwgMHhjMCwgLyogMDAxMTExMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTYxIDB4YTEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNjIgMHhhMiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGMxLCAweDgwLCAvKiAxMTAwMDAwMTEwICovCisJMHhjMSwgMHg4MCwgLyogMTEwMDAwMDExMCAqLworCTB4YzEsIDB4ODAsIC8qIDExMDAwMDAxMTAgKi8KKwkweGUxLCAweDgwLCAvKiAxMTEwMDAwMTEwICovCisJMHg3MywgMHgwMCwgLyogMDExMTAwMTEwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE2MyAweGEzICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmNywgMHg4MCwgLyogMTExMTAxMTExMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDc3LCAweDAwLCAvKiAwMTExMDExMTAwICovCisJMHgzZCwgMHg4MCwgLyogMDAxMTExMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTY0IDB4YTQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzgsIDB4ODAsIC8qIDAwMTExMDAwMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg0NywgMHgwMCwgLyogMDEwMDAxMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDZmLCAweDAwLCAvKiAwMTEwMTExMTAwICovCisJMHg3YiwgMHg4MCwgLyogMDExMTEwMTExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAgKi8KKwkweDdiLCAweGMwLCAvKiAwMTExMTAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNjUgMHhhNSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzOCwgMHg4MCwgLyogMDAxMTEwMDAxMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDQ3LCAweDAwLCAvKiAwMTAwMDExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZTMsIDB4YzAsIC8qIDExMTAwMDExMTEgKi8KKwkweDcxLCAweDgwLCAvKiAwMTExMDAwMTEwICovCisJMHg3OSwgMHg4MCwgLyogMDExMTEwMDExMCAqLworCTB4NzksIDB4ODAsIC8qIDAxMTExMDAxMTAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NjcsIDB4ODAsIC8qIDAxMTAwMTExMTAgKi8KKwkweDYzLCAweDgwLCAvKiAwMTEwMDAxMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4ZjAsIDB4YzAsIC8qIDExMTEwMDAwMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE2NiAweGE2ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDNlLCAweDAwLCAvKiAwMDExMTExMDAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2NywgMHgwMCwgLyogMDExMDAxMTEwMCAqLworCTB4M2IsIDB4ODAsIC8qIDAwMTExMDExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTY3IDB4YTcgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4MDAsIC8qIDAxMTAwMDAxMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgxYywgMHgwMCwgLyogMDAwMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNjggMHhhOCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE2OSAweGE5ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTcwIDB4YWEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNzEgMHhhYiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgyMCwgMHgwMCwgLyogMDAxMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwICovCisJMHgyMCwgMHg4MCwgLyogMDAxMDAwMDAxMCAqLworCTB4MjEsIDB4MDAsIC8qIDAwMTAwMDAxMDAgKi8KKwkweDIyLCAweDAwLCAvKiAwMDEwMDAxMDAwICovCisJMHg3NCwgMHgwMCwgLyogMDExMTAxMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAgKi8KKwkweDE3LCAweDAwLCAvKiAwMDAxMDExMTAwICovCisJMHgyOCwgMHg4MCwgLyogMDAxMDEwMDAxMCAqLworCTB4NDMsIDB4MDAsIC8qIDAxMDAwMDExMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE3MiAweGFjICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MjAsIDB4MDAsIC8qIDAwMTAwMDAwMDAgKi8KKwkweDIwLCAweDgwLCAvKiAwMDEwMDAwMDEwICovCisJMHgyMSwgMHgwMCwgLyogMDAxMDAwMDEwMCAqLworCTB4MjIsIDB4MDAsIC8qIDAwMTAwMDEwMDAgKi8KKwkweDc0LCAweDAwLCAvKiAwMTExMDEwMDAwICovCisJMHgwOSwgMHgwMCwgLyogMDAwMDEwMDEwMCAqLworCTB4MTMsIDB4MDAsIC8qIDAwMDEwMDExMDAgKi8KKwkweDI1LCAweDAwLCAvKiAwMDEwMDEwMTAwICovCisJMHg0OSwgMHgwMCwgLyogMDEwMDEwMDEwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAgKi8KKwkweDAxLCAweDAwLCAvKiAwMDAwMDAwMTAwICovCisJMHgwMSwgMHgwMCwgLyogMDAwMDAwMDEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTczIDB4YWQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxNzQgMHhhZSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgzNiwgMHgwMCwgLyogMDAxMTAxMTAwMCAqLworCTB4NmMsIDB4MDAsIC8qIDAxMTAxMTAwMDAgKi8KKwkweGQ4LCAweDAwLCAvKiAxMTAxMTAwMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE3NSAweGFmICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMCAqLworCTB4MDYsIDB4YzAsIC8qIDAwMDAwMTEwMTEgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MzYsIDB4MDAsIC8qIDAwMTEwMTEwMDAgKi8KKwkweDZjLCAweDAwLCAvKiAwMTEwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTc2IDB4YjAgJy4nICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4NDEsIDB4MDAsIC8qIDAxMDAwMDAxMDAgKi8KKwkweDE4LCAweDQwLCAvKiAwMDAxMTAwMDAxICovCisJMHgxMCwgMHg0MCwgLyogMDAwMTAwMDAwMSAqLworCTB4YzMsIDB4MDAsIC8qIDExMDAwMDExMDAgKi8KKwkweDQxLCAweDAwLCAvKiAwMTAwMDAwMTAwICovCisJMHgxOCwgMHg0MCwgLyogMDAwMTEwMDAwMSAqLworCTB4MTAsIDB4NDAsIC8qIDAwMDEwMDAwMDEgKi8KKwkweGMzLCAweDAwLCAvKiAxMTAwMDAxMTAwICovCisJMHg0MSwgMHgwMCwgLyogMDEwMDAwMDEwMCAqLworCTB4MTgsIDB4NDAsIC8qIDAwMDExMDAwMDEgKi8KKwkweDEwLCAweDQwLCAvKiAwMDAxMDAwMDAxICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4NDEsIDB4MDAsIC8qIDAxMDAwMDAxMDAgKi8KKwkweDE4LCAweDQwLCAvKiAwMDAxMTAwMDAxICovCisJMHgxMCwgMHg0MCwgLyogMDAwMTAwMDAwMSAqLworCTB4YzMsIDB4MDAsIC8qIDExMDAwMDExMDAgKi8KKwkweDQxLCAweDAwLCAvKiAwMTAwMDAwMTAwICovCisKKwkvKiAxNzcgMHhiMSAnLicgKi8KKwkweDExLCAweDAwLCAvKiAwMDAxMDAwMTAwICovCisJMHhiYiwgMHg4MCwgLyogMTAxMTEwMTExMCAqLworCTB4MTEsIDB4MDAsIC8qIDAwMDEwMDAxMDAgKi8KKwkweDQ0LCAweDQwLCAvKiAwMTAwMDEwMDAxICovCisJMHhlZSwgMHhjMCwgLyogMTExMDExMTAxMSAqLworCTB4NDQsIDB4NDAsIC8qIDAxMDAwMTAwMDEgKi8KKwkweDExLCAweDAwLCAvKiAwMDAxMDAwMTAwICovCisJMHhiYiwgMHg4MCwgLyogMTAxMTEwMTExMCAqLworCTB4MTEsIDB4MDAsIC8qIDAwMDEwMDAxMDAgKi8KKwkweDQ0LCAweDQwLCAvKiAwMTAwMDEwMDAxICovCisJMHhlZSwgMHhjMCwgLyogMTExMDExMTAxMSAqLworCTB4NDQsIDB4NDAsIC8qIDAxMDAwMTAwMDEgKi8KKwkweDExLCAweDAwLCAvKiAwMDAxMDAwMTAwICovCisJMHhiYiwgMHg4MCwgLyogMTAxMTEwMTExMCAqLworCTB4MTEsIDB4MDAsIC8qIDAwMDEwMDAxMDAgKi8KKwkweDQ0LCAweDQwLCAvKiAwMTAwMDEwMDAxICovCisJMHhlZSwgMHhjMCwgLyogMTExMDExMTAxMSAqLworCTB4NDQsIDB4NDAsIC8qIDAxMDAwMTAwMDEgKi8KKworCS8qIDE3OCAweGIyICcuJyAqLworCTB4M2MsIDB4YzAsIC8qIDAwMTExMTAwMTEgKi8KKwkweGJlLCAweGMwLCAvKiAxMDExMTExMDExICovCisJMHhlNywgMHg4MCwgLyogMTExMDAxMTExMCAqLworCTB4ZWYsIDB4ODAsIC8qIDExMTAxMTExMTAgKi8KKwkweDNjLCAweGMwLCAvKiAwMDExMTEwMDExICovCisJMHhiZSwgMHhjMCwgLyogMTAxMTExMTAxMSAqLworCTB4ZTcsIDB4ODAsIC8qIDExMTAwMTExMTAgKi8KKwkweGVmLCAweDgwLCAvKiAxMTEwMTExMTEwICovCisJMHgzYywgMHhjMCwgLyogMDAxMTExMDAxMSAqLworCTB4YmUsIDB4YzAsIC8qIDEwMTExMTEwMTEgKi8KKwkweGU3LCAweDgwLCAvKiAxMTEwMDExMTEwICovCisJMHhlZiwgMHg4MCwgLyogMTExMDExMTExMCAqLworCTB4M2MsIDB4YzAsIC8qIDAwMTExMTAwMTEgKi8KKwkweGJlLCAweGMwLCAvKiAxMDExMTExMDExICovCisJMHhlNywgMHg4MCwgLyogMTExMDAxMTExMCAqLworCTB4ZWYsIDB4ODAsIC8qIDExMTAxMTExMTAgKi8KKwkweDNjLCAweGMwLCAvKiAwMDExMTEwMDExICovCisJMHhiZSwgMHhjMCwgLyogMTAxMTExMTAxMSAqLworCisJLyogMTc5IDB4YjMgJy4nICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisKKwkvKiAxODAgMHhiNCAnLicgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKworCS8qIDE4MSAweGI1ICcuJyAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCisJLyogMTgyIDB4YjYgJy4nICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweGZiLCAweDAwLCAvKiAxMTExMTAxMTAwICovCisJMHhmYiwgMHgwMCwgLyogMTExMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisKKwkvKiAxODMgMHhiNyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4MDAsIC8qIDExMTExMTExMDAgKi8KKwkweGZmLCAweDAwLCAvKiAxMTExMTExMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKworCS8qIDE4NCAweGI4ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCisJLyogMTg1IDB4YjkgJy4nICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweGZiLCAweDAwLCAvKiAxMTExMTAxMTAwICovCisJMHhmYiwgMHgwMCwgLyogMTExMTEwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweGZiLCAweDAwLCAvKiAxMTExMTAxMTAwICovCisJMHhmYiwgMHgwMCwgLyogMTExMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisKKwkvKiAxODYgMHhiYSAnLicgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKworCS8qIDE4NyAweGJiICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHgwMCwgLyogMTExMTExMTEwMCAqLworCTB4ZmYsIDB4MDAsIC8qIDExMTExMTExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHhmYiwgMHgwMCwgLyogMTExMTEwMTEwMCAqLworCTB4ZmIsIDB4MDAsIC8qIDExMTExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCisJLyogMTg4IDB4YmMgJy4nICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweGZiLCAweDAwLCAvKiAxMTExMTAxMTAwICovCisJMHhmYiwgMHgwMCwgLyogMTExMTEwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweGZmLCAweDAwLCAvKiAxMTExMTExMTAwICovCisJMHhmZiwgMHgwMCwgLyogMTExMTExMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAxODkgMHhiZCAnLicgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4ZmYsIDB4MDAsIC8qIDExMTExMTExMDAgKi8KKwkweGZmLCAweDAwLCAvKiAxMTExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE5MCAweGJlICcuJyAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTkxIDB4YmYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisKKwkvKiAxOTIgMHhjMCAnLicgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDE5MyAweGMxICcuJyAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTk0IDB4YzIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisKKwkvKiAxOTUgMHhjMyAnLicgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKworCS8qIDE5NiAweGM0ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMTk3IDB4YzUgJy4nICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisKKwkvKiAxOTggMHhjNiAnLicgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKworCS8qIDE5OSAweGM3ICcuJyAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHhjMCwgLyogMDAwMTEwMTExMSAqLworCTB4MWIsIDB4YzAsIC8qIDAwMDExMDExMTEgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCisJLyogMjAwIDB4YzggJy4nICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweGMwLCAvKiAwMDAxMTAxMTExICovCisJMHgxYiwgMHhjMCwgLyogMDAwMTEwMTExMSAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDFmLCAweGMwLCAvKiAwMDAxMTExMTExICovCisJMHgxZiwgMHhjMCwgLyogMDAwMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMDEgMHhjOSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEgKi8KKwkweDFmLCAweGMwLCAvKiAwMDAxMTExMTExICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MWIsIDB4YzAsIC8qIDAwMDExMDExMTEgKi8KKwkweDFiLCAweGMwLCAvKiAwMDAxMTAxMTExICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKworCS8qIDIwMiAweGNhICcuJyAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHhmYiwgMHhjMCwgLyogMTExMTEwMTExMSAqLworCTB4ZmIsIDB4YzAsIC8qIDExMTExMDExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjAzIDB4Y2IgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZiLCAweGMwLCAvKiAxMTExMTAxMTExICovCisJMHhmYiwgMHhjMCwgLyogMTExMTEwMTExMSAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisKKwkvKiAyMDQgMHhjYyAnLicgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4YzAsIC8qIDAwMDExMDExMTEgKi8KKwkweDFiLCAweGMwLCAvKiAwMDAxMTAxMTExICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MWIsIDB4YzAsIC8qIDAwMDExMDExMTEgKi8KKwkweDFiLCAweGMwLCAvKiAwMDAxMTAxMTExICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKworCS8qIDIwNSAweGNkICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjA2IDB4Y2UgJy4nICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweGZiLCAweGMwLCAvKiAxMTExMTAxMTExICovCisJMHhmYiwgMHhjMCwgLyogMTExMTEwMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZiLCAweGMwLCAvKiAxMTExMTAxMTExICovCisJMHhmYiwgMHhjMCwgLyogMTExMTEwMTExMSAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisKKwkvKiAyMDcgMHhjZiAnLicgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIwOCAweGQwICcuJyAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjA5IDB4ZDEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisKKwkvKiAyMTAgMHhkMiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKworCS8qIDIxMSAweGQzICcuJyAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxZiwgMHhjMCwgLyogMDAwMTExMTExMSAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjEyIDB4ZDQgJy4nICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMTMgMHhkNSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKworCS8qIDIxNCAweGQ2ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZiwgMHhjMCwgLyogMDAwMTExMTExMSAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCisJLyogMjE1IDB4ZDcgJy4nICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisJMHgxYiwgMHgwMCwgLyogMDAwMTEwMTEwMCAqLworCTB4MWIsIDB4MDAsIC8qIDAwMDExMDExMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwICovCisKKwkvKiAyMTYgMHhkOCAnLicgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKworCS8qIDIxNyAweGQ5ICcuJyAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHhmYywgMHgwMCwgLyogMTExMTExMDAwMCAqLworCTB4ZmMsIDB4MDAsIC8qIDExMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjE4IDB4ZGEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisKKwkvKiAyMTkgMHhkYiAnLicgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKworCS8qIDIyMCAweGRjICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCisJLyogMjIxIDB4ZGQgJy4nICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAgKi8KKwkweGY4LCAweDAwLCAvKiAxMTExMTAwMDAwICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAgKi8KKwkweGY4LCAweDAwLCAvKiAxMTExMTAwMDAwICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAgKi8KKwkweGY4LCAweDAwLCAvKiAxMTExMTAwMDAwICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAgKi8KKwkweGY4LCAweDAwLCAvKiAxMTExMTAwMDAwICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAgKi8KKwkweGY4LCAweDAwLCAvKiAxMTExMTAwMDAwICovCisJMHhmOCwgMHgwMCwgLyogMTExMTEwMDAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAgKi8KKwkweGY4LCAweDAwLCAvKiAxMTExMTAwMDAwICovCisKKwkvKiAyMjIgMHhkZSAnLicgKi8KKwkweDA3LCAweGMwLCAvKiAwMDAwMDExMTExICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMSAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKwkweDA3LCAweGMwLCAvKiAwMDAwMDExMTExICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMSAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKwkweDA3LCAweGMwLCAvKiAwMDAwMDExMTExICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMSAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKwkweDA3LCAweGMwLCAvKiAwMDAwMDExMTExICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMSAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKwkweDA3LCAweGMwLCAvKiAwMDAwMDExMTExICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMSAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKwkweDA3LCAweGMwLCAvKiAwMDAwMDExMTExICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMSAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEgKi8KKworCS8qIDIyMyAweGRmICcuJyAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHhmZiwgMHhjMCwgLyogMTExMTExMTExMSAqLworCTB4ZmYsIDB4YzAsIC8qIDExMTExMTExMTEgKi8KKwkweGZmLCAweGMwLCAvKiAxMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjI0IDB4ZTAgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFjLCAweDgwLCAvKiAwMDAxMTEwMDEwICovCisJMHgzNSwgMHg4MCwgLyogMDAxMTAxMDExMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4MzcsIDB4ODAsIC8qIDAwMTEwMTExMTAgKi8KKwkweDFjLCAweDgwLCAvKiAwMDAxMTEwMDEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMjUgMHhlMSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwICovCisJMHg2ZiwgMHgwMCwgLyogMDExMDExMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MywgMHgwMCwgLyogMDExMDAwMTEwMCAqLworCTB4NmUsIDB4MDAsIC8qIDAxMTAxMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIyNiAweGUyICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjI3IDB4ZTMgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMjggMHhlNCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIyOSAweGU1ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweGMwLCAvKiAwMDAxMTExMTExICovCisJMHgzNiwgMHgwMCwgLyogMDAxMTAxMTAwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjMwIDB4ZTYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDczLCAweDgwLCAvKiAwMTExMDAxMTEwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAgKi8KKwkweGMwLCAweDAwLCAvKiAxMTAwMDAwMDAwICovCisKKwkvKiAyMzEgMHhlNyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwICovCisJMHgzNiwgMHg0MCwgLyogMDAxMTAxMTAwMSAqLworCTB4NWUsIDB4MDAsIC8qIDAxMDExMTEwMDAgKi8KKwkweDhjLCAweDAwLCAvKiAxMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIzMiAweGU4ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjMzIDB4ZTkgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMSAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMzQgMHhlYSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHhjMCwgMHhjMCwgLyogMTEwMDAwMDAxMSAqLworCTB4YzAsIDB4YzAsIC8qIDExMDAwMDAwMTEgKi8KKwkweGMwLCAweGMwLCAvKiAxMTAwMDAwMDExICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweGYzLCAweGMwLCAvKiAxMTExMDAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIzNSAweGViICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAgKi8KKwkweGMzLCAweDAwLCAvKiAxMTAwMDAxMTAwICovCisJMHhjMywgMHgwMCwgLyogMTEwMDAwMTEwMCAqLworCTB4YzMsIDB4MDAsIC8qIDExMDAwMDExMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjM2IDB4ZWMgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHg2ZCwgMHg4MCwgLyogMDExMDExMDExMCAqLworCTB4Y2MsIDB4YzAsIC8qIDExMDAxMTAwMTEgKi8KKwkweGNjLCAweGMwLCAvKiAxMTAwMTEwMDExICovCisJMHhjYywgMHhjMCwgLyogMTEwMDExMDAxMSAqLworCTB4Y2MsIDB4YzAsIC8qIDExMDAxMTAwMTEgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyMzcgMHhlZCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MzcsIDB4MDAsIC8qIDAwMTEwMTExMDAgKi8KKwkweDZkLCAweDgwLCAvKiAwMTEwMTEwMTEwICovCisJMHhjYywgMHhjMCwgLyogMTEwMDExMDAxMSAqLworCTB4Y2MsIDB4YzAsIC8qIDExMDAxMTAwMTEgKi8KKwkweGNjLCAweGMwLCAvKiAxMTAwMTEwMDExICovCisJMHhjYywgMHhjMCwgLyogMTEwMDExMDAxMSAqLworCTB4NmQsIDB4ODAsIC8qIDAxMTAxMTAxMTAgKi8KKwkweDNiLCAweDAwLCAvKiAwMDExMTAxMTAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDIzOCAweGVlICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgwMywgMHg4MCwgLyogMDAwMDAwMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjM5IDB4ZWYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNDAgMHhmMCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI0MSAweGYxICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjQyIDB4ZjIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweGUwLCAweDAwLCAvKiAxMTEwMDAwMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MzgsIDB4MDAsIC8qIDAwMTExMDAwMDAgKi8KKwkweGUwLCAweDAwLCAvKiAxMTEwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4MDAsIC8qIDExMTExMTExMDAgKi8KKwkweGZmLCAweDAwLCAvKiAxMTExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNDMgMHhmMyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMCAqLworCTB4ZTAsIDB4MDAsIC8qIDExMTAwMDAwMDAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMCAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHhmZiwgMHg4MCwgLyogMTExMTExMTExMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI0NCAweGY0ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjQ1IDB4ZjUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNDYgMHhmNiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI0NyAweGY3ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MzgsIDB4MDAsIC8qIDAwMTExMDAwMDAgKi8KKwkweDZjLCAweDAwLCAvKiAwMTEwMTEwMDAwICovCisJMHgwNiwgMHhjMCwgLyogMDAwMDAxMTAxMSAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMCAqLworCTB4MDYsIDB4YzAsIC8qIDAwMDAwMTEwMTEgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjQ4IDB4ZjggJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNDkgMHhmOSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI1MCAweGZhICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjUxIDB4ZmIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMCAqLworCTB4Y2MsIDB4MDAsIC8qIDExMDAxMTAwMDAgKi8KKwkweDZjLCAweDAwLCAvKiAwMTEwMTEwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNTIgMHhmYyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgyNywgMHgwMCwgLyogMDAxMDAxMTEwMCAqLworCTB4N2IsIDB4MDAsIC8qIDAxMTExMDExMDAgKi8KKwkweDMxLCAweDAwLCAvKiAwMDExMDAwMTAwICovCisJMHgzMSwgMHgwMCwgLyogMDAxMTAwMDEwMCAqLworCTB4MzEsIDB4MDAsIC8qIDAwMTEwMDAxMDAgKi8KKwkweDdiLCAweDgwLCAvKiAwMTExMTAxMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworCS8qIDI1MyAweGZkICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAgKi8KKwkweDQzLCAweDAwLCAvKiAwMTAwMDAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAgKi8KKwkweDE4LCAweDAwLCAvKiAwMDAxMTAwMDAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCisJLyogMjU0IDB4ZmUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMCAqLworCTB4M2YsIDB4MDAsIC8qIDAwMTExMTExMDAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisKKwkvKiAyNTUgMHhmZiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAgKi8KKworfTsKKworCitjb25zdCBzdHJ1Y3QgZm9udF9kZXNjIGZvbnRfMTB4MTggPSB7CisJLmlkeAk9IEZPTlQxMHgxOF9JRFgsCisJLm5hbWUJPSAiMTB4MTgiLAorCS53aWR0aAk9IDEwLAorCS5oZWlnaHQJPSAxOCwKKwkuZGF0YQk9IGZvbnRkYXRhXzEweDE4LAorI2lmZGVmIF9fc3BhcmNfXworCS5wcmVmCT0gNSwKKyNlbHNlCisJLnByZWYJPSAtMSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfNngxMC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF82eDEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliMmNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfNngxMC5jCkBAIC0wLDAgKzEsMzA4NyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyNpbmNsdWRlIDxsaW51eC9mb250Lmg+CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZvbnRkYXRhXzZ4MTBbXSA9IHsKKworCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEgMHgwMSAnXkEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4ODQsIC8qIDEwMDAwMTAwICovCisJMHhDQywgLyogMTEwMDExMDAgKi8KKwkweDg0LCAvKiAxMDAwMDEwMCAqLworCTB4Q0MsIC8qIDExMDAxMTAwICovCisJMHhCNCwgLyogMTAxMTAxMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhCNCwgLyogMTAxMTAxMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4QjQsIC8qIDEwMTEwMTAwICovCisJMHhDQywgLyogMTEwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQgMHgwNCAnXkQnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZDLCAvKiAwMTEwMTEwMCAqLworCTB4NkMsIC8qIDAxMTAxMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDcgMHgwNyAnXkcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhDQywgLyogMTEwMDExMDAgKi8KKwkweDg0LCAvKiAxMDAwMDEwMCAqLworCTB4Q0MsIC8qIDExMDAxMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDg0LCAvKiAxMDAwMDEwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwIDB4MEEgJ15KJyAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweENDLCAvKiAxMTAwMTEwMCAqLworCTB4QjQsIC8qIDEwMTEwMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweEI0LCAvKiAxMDExMDEwMCAqLworCTB4Q0MsIC8qIDExMDAxMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisKKwkvKiAxMSAweDBCICdeSycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgxNCwgLyogMDAwMTAxMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIgMHgwQyAnXkwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzIDB4MEQgJ15NJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE0LCAvKiAwMDAxMDEwMCAqLworCTB4MTQsIC8qIDAwMDEwMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNCAweDBFICdeTicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDZDLCAvKiAwMTEwMTEwMCAqLworCTB4NkMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUgMHgwRiAnXk8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZDLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2IDB4MTAgJ15QJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwQywgLyogMDAwMDExMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDBDLCAvKiAwMDAwMTEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5IDB4MTMgJ15TJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgxNCwgLyogMDAwMTAxMDAgKi8KKwkweDE0LCAvKiAwMDAxMDEwMCAqLworCTB4MTQsIC8qIDAwMDEwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHg1MCwgLyogMDEwMTAwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgxNCwgLyogMDAwMTAxMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKworCS8qIDIyIDB4MTYgJ15WJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEY4LCAvKiAxMTExMTAwMCAqLworCTB4RjgsIC8qIDExMTExMDAwICovCisJMHhGOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1IDB4MTkgJ15ZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNiAweDFBICdeWicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjcgMHgxQiAnXlsnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI4IDB4MUMgJ15cJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyOSAweDFEICdeXScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDg0LCAvKiAxMDAwMDEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHg4NCwgLyogMTAwMDAxMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzAgMHgxRSAnXl4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMxIDB4MUYgJ15fJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNCAweDIyICciJyAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDE0LCAvKiAwMDAxMDEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNyAweDI1ICclJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NCwgLyogMDExMDAxMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHg0QywgLyogMDEwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MCAweDI4ICcoJyAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MiAweDJBICcqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MyAweDJCICcrJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NCAweDJDICcsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisKKwkvKiA0NSAweDJEICctJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NiAweDJFICcuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NyAweDJGICcvJyAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OSAweDMxICcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MiAweDM0ICc0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NSAweDM3ICc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OCAweDNBICc6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OSAweDNCICc7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisKKwkvKiA2MCAweDNDICc8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MSAweDNEICc9JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MiAweDNFICc+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MyAweDNGICc/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NCAweDQwICdAJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NUMsIC8qIDAxMDExMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDVDLCAvKiAwMTAxMTEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NyAweDQzICdDJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MCAweDQ2ICdGJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg1QywgLyogMDEwMTExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MyAweDQ5ICdJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NCAweDRBICdKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NSAweDRCICdLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDUwLCAvKiAwMTAxMDAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NiAweDRDICdMJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NyAweDREICdNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDZDLCAvKiAwMTEwMTEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OCAweDRFICdOJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg0QywgLyogMDEwMDExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OSAweDRGICdPJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MiAweDUyICdSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDUwLCAvKiAwMTAxMDAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NSAweDU1ICdVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NkMsIC8qIDAxMTAxMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OCAweDU4ICdYJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MCAweDVBICdaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MSAweDVCICdbJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MiAweDVDICdcJyAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisKKwkvKiA5MyAweDVEICddJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NCAweDVFICdeJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NSAweDVGICdfJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NyAweDYxICdhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NTgsIC8qIDAxMDExMDAwICovCisJMHg2NCwgLyogMDExMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NjQsIC8qIDAxMTAwMTAwICovCisJMHg1OCwgLyogMDEwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDAgMHg2NCAnZCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDM0LCAvKiAwMDExMDEwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDRDLCAvKiAwMTAwMTEwMCAqLworCTB4MzQsIC8qIDAwMTEwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwQywgLyogMDAwMDExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDMgMHg2NyAnZycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM0LCAvKiAwMDExMDEwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDRDLCAvKiAwMTAwMTEwMCAqLworCTB4MzQsIC8qIDAwMTEwMTAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDYgMHg2QSAnaicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCisJLyogMTA3IDB4NkIgJ2snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDUwLCAvKiAwMTAxMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZDICdsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDkgMHg2RCAnbScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEwIDB4NkUgJ24nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1OCwgLyogMDEwMTEwMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZGICdvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTIgMHg3MCAncCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDU4LCAvKiAwMTAxMTAwMCAqLworCTB4NjQsIC8qIDAxMTAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4NTgsIC8qIDAxMDExMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDRDLCAvKiAwMTAwMTEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0QywgLyogMDEwMDExMDAgKi8KKwkweDM0LCAvKiAwMDExMDEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NTgsIC8qIDAxMDExMDAwICovCisJMHg2NCwgLyogMDExMDAxMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTUgMHg3MyAncycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDBDLCAvKiAwMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTggMHg3NiAndicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjEgMHg3OSAneScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCisJLyogMTIyIDB4N0EgJ3onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdCICd7JyAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjQgMHg3QyAnfCcgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI1IDB4N0QgJ30nICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdFICd+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjcgMHg3RiAnfycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI4IDB4ODAgJ1wyMDAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKworCS8qIDEyOSAweDgxICdcMjAxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzAgMHg4MiAnXDIwMicgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTMxIDB4ODMgJ1wyMDMnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICdcMjA0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzMgMHg4NSAnXDIwNScgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM0IDB4ODYgJ1wyMDYnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICdcMjA3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisKKwkvKiAxMzYgMHg4OCAnXDIxMCcgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM3IDB4ODkgJ1wyMTEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhBICdcMjEyJyAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzkgMHg4QiAnXDIxMycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQwIDB4OEMgJ1wyMTQnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhEICdcMjE1JyAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDIgMHg4RSAnXDIxNicgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQzIDB4OEYgJ1wyMTcnICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICdcMjIwJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDUgMHg5MSAnXDIyMScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MTQsIC8qIDAwMDEwMTAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDUwLCAvKiAwMTAxMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ2IDB4OTIgJ1wyMjInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHg1MCwgLyogMDEwMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHg1MCwgLyogMDEwMTAwMDAgKi8KKwkweDVDLCAvKiAwMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICdcMjIzJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDggMHg5NCAnXDIyNCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ5IDB4OTUgJ1wyMjUnICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICdcMjI2JyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NEMsIC8qIDAxMDAxMTAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTEgMHg5NyAnXDIyNycgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDRDLCAvKiAwMTAwMTEwMCAqLworCTB4MzQsIC8qIDAwMTEwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUyIDB4OTggJ1wyMzAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKworCS8qIDE1MyAweDk5ICdcMjMxJyAqLworCTB4ODQsIC8qIDEwMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTQgMHg5QSAnXDIzMicgKi8KKwkweDg4LCAvKiAxMDAwMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU1IDB4OUIgJ1wyMzMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NiAweDlDICdcMjM0JyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTcgMHg5RCAnXDIzNScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU4IDB4OUUgJ1wyMzYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NUMsIC8qIDAxMDExMTAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1OSAweDlGICdcMjM3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwQywgLyogMDAwMDExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjAgMHhBMCAnXDI0MCcgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTYxIDB4QTEgJ1wyNDEnICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MiAweEEyICdcMjQyJyAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjMgMHhBMyAnXDI0MycgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDRDLCAvKiAwMTAwMTEwMCAqLworCTB4MzQsIC8qIDAwMTEwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY0IDB4QTQgJ1wyNDQnICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDU4LCAvKiAwMTAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1OCwgLyogMDEwMTEwMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NSAweEE1ICdcMjQ1JyAqLworCTB4NTgsIC8qIDAxMDExMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg0QywgLyogMDEwMDExMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjYgMHhBNiAnXDI0NicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzQywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY3IDB4QTcgJ1wyNDcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OCAweEE4ICdcMjUwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjkgMHhBOSAnXDI1MScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTcwIDB4QUEgJ1wyNTInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MDQsIC8qIDAwMDAwMTAwICovCisJMHgwNCwgLyogMDAwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MSAweEFCICdcMjUzJyAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzIgMHhBQyAnXDI1NCcgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDU4LCAvKiAwMTAxMTAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTczIDB4QUQgJ1wyNTUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NCAweEFFICdcMjU2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDkwLCAvKiAxMDAxMDAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzUgMHhBRiAnXDI1NycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDkwLCAvKiAxMDAxMDAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4OTAsIC8qIDEwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTc2IDB4QjAgJ1wyNjAnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKworCS8qIDE3NyAweEIxICdcMjYxJyAqLworCTB4QTgsIC8qIDEwMTAxMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweEE4LCAvKiAxMDEwMTAwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHhBOCwgLyogMTAxMDEwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4QTgsIC8qIDEwMTAxMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweEE4LCAvKiAxMDEwMTAwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisKKwkvKiAxNzggMHhCMiAnXDI2MicgKi8KKwkweERDLCAvKiAxMTAxMTEwMCAqLworCTB4NzQsIC8qIDAxMTEwMTAwICovCisJMHhEQywgLyogMTEwMTExMDAgKi8KKwkweDc0LCAvKiAwMTExMDEwMCAqLworCTB4REMsIC8qIDExMDExMTAwICovCisJMHg3NCwgLyogMDExMTAxMDAgKi8KKwkweERDLCAvKiAxMTAxMTEwMCAqLworCTB4NzQsIC8qIDAxMTEwMTAwICovCisJMHhEQywgLyogMTEwMTExMDAgKi8KKwkweDc0LCAvKiAwMTExMDEwMCAqLworCisJLyogMTc5IDB4QjMgJ1wyNjMnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKworCS8qIDE4MCAweEI0ICdcMjY0JyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHhGMCwgLyogMTExMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisKKwkvKiAxODEgMHhCNSAnXDI2NScgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweEYwLCAvKiAxMTExMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHhGMCwgLyogMTExMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCisJLyogMTgyIDB4QjYgJ1wyNjYnICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweEU4LCAvKiAxMTEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKworCS8qIDE4MyAweEI3ICdcMjY3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGOCwgLyogMTExMTEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisKKwkvKiAxODQgMHhCOCAnXDI3MCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEYwLCAvKiAxMTExMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHhGMCwgLyogMTExMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCisJLyogMTg1IDB4QjkgJ1wyNzEnICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHhFOCwgLyogMTExMDEwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4RTgsIC8qIDExMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKworCS8qIDE4NiAweEJBICdcMjcyJyAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisKKwkvKiAxODcgMHhCQiAnXDI3MycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEY4LCAvKiAxMTExMTAwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHhFOCwgLyogMTExMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCisJLyogMTg4IDB4QkMgJ1wyNzQnICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHhFOCwgLyogMTExMDEwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4RjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE4OSAweEJEICdcMjc1JyAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHhGOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOTAgMHhCRSAnXDI3NicgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweEYwLCAvKiAxMTExMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHhGMCwgLyogMTExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTkxIDB4QkYgJ1wyNzcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEYwLCAvKiAxMTExMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKworCS8qIDE5MiAweEMwICdcMzAwJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOTMgMHhDMSAnXDMwMScgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk0IDB4QzIgJ1wzMDInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKworCS8qIDE5NSAweEMzICdcMzAzJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisKKwkvKiAxOTYgMHhDNCAnXDMwNCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk3IDB4QzUgJ1wzMDUnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKworCS8qIDE5OCAweEM2ICdcMzA2JyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisKKwkvKiAxOTkgMHhDNyAnXDMwNycgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MkMsIC8qIDAwMTAxMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCisJLyogMjAwIDB4QzggJ1wzMTAnICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyQywgLyogMDAxMDExMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMSAweEM5ICdcMzExJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDJDLCAvKiAwMDEwMTEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisKKwkvKiAyMDIgMHhDQSAnXDMxMicgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweEVDLCAvKiAxMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjAzIDB4Q0IgJ1wzMTMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4RUMsIC8qIDExMTAxMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKworCS8qIDIwNCAweENDICdcMzE0JyAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MkMsIC8qIDAwMTAxMTAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDJDLCAvKiAwMDEwMTEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisKKwkvKiAyMDUgMHhDRCAnXDMxNScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA2IDB4Q0UgJ1wzMTYnICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHhFQywgLyogMTExMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4RUMsIC8qIDExMTAxMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKworCS8qIDIwNyAweENGICdcMzE3JyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMDggMHhEMCAnXDMyMCcgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA5IDB4RDEgJ1wzMjEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKworCS8qIDIxMCAweEQyICdcMzIyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisKKwkvKiAyMTEgMHhEMyAnXDMyMycgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEyIDB4RDQgJ1wzMjQnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMyAweEQ1ICdcMzI1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisKKwkvKiAyMTQgMHhENiAnXDMyNicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCisJLyogMjE1IDB4RDcgJ1wzMjcnICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKworCS8qIDIxNiAweEQ4ICdcMzMwJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisKKwkvKiAyMTcgMHhEOSAnXDMzMScgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4RjAsIC8qIDExMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjE4IDB4REEgJ1wzMzInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKworCS8qIDIxOSAweERCICdcMzMzJyAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisKKwkvKiAyMjAgMHhEQyAnXDMzNCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCisJLyogMjIxIDB4REQgJ1wzMzUnICovCisJMHhFMCwgLyogMTExMDAwMDAgKi8KKwkweEUwLCAvKiAxMTEwMDAwMCAqLworCTB4RTAsIC8qIDExMTAwMDAwICovCisJMHhFMCwgLyogMTExMDAwMDAgKi8KKwkweEUwLCAvKiAxMTEwMDAwMCAqLworCTB4RTAsIC8qIDExMTAwMDAwICovCisJMHhFMCwgLyogMTExMDAwMDAgKi8KKwkweEUwLCAvKiAxMTEwMDAwMCAqLworCTB4RTAsIC8qIDExMTAwMDAwICovCisJMHhFMCwgLyogMTExMDAwMDAgKi8KKworCS8qIDIyMiAweERFICdcMzM2JyAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisJMHgxQywgLyogMDAwMTExMDAgKi8KKwkweDFDLCAvKiAwMDAxMTEwMCAqLworCTB4MUMsIC8qIDAwMDExMTAwICovCisKKwkvKiAyMjMgMHhERiAnXDMzNycgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI0IDB4RTAgJ1wzNDAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzNCwgLyogMDAxMTAxMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDM0LCAvKiAwMDExMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNSAweEUxICdcMzQxJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg1OCwgLyogMDEwMTEwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjYgMHhFMiAnXDM0MicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI3IDB4RTMgJ1wzNDMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOCAweEU0ICdcMzQ0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjkgMHhFNSAnXDM0NScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNDLCAvKiAwMDExMTEwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMwIDB4RTYgJ1wzNDYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHg0OCwgLyogMDEwMDEwMDAgKi8KKwkweDc0LCAvKiAwMTExMDEwMCAqLworCTB4NDAsIC8qIDAxMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKworCS8qIDIzMSAweEU3ICdcMzQ3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwQywgLyogMDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzIgMHhFOCAnXDM1MCcgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMzIDB4RTkgJ1wzNTEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNCAweEVBICdcMzUyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MjgsIC8qIDAwMTAxMDAwICovCisJMHg2QywgLyogMDExMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzUgMHhFQiAnXDM1MycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM2IDB4RUMgJ1wzNTQnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4NTQsIC8qIDAxMDEwMTAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNyAweEVEICdcMzU1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg1NCwgLyogMDEwMTAxMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzggMHhFRSAnXDM1NicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg0MCwgLyogMDEwMDAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwMCAqLworCTB4M0MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM5IDB4RUYgJ1wzNTcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MCAweEYwICdcMzYwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweEZDLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhGQywgLyogMTExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4RkMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDEgMHhGMSAnXDM2MScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDdDLCAvKiAwMTExMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N0MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQyIDB4RjIgJ1wzNjInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MyAweEYzICdcMzYzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MjAsIC8qIDAwMTAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDA4LCAvKiAwMDAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDQgMHhGNCAnXDM2NCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MEMsIC8qIDAwMDAxMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCisJLyogMjQ1IDB4RjUgJ1wzNjUnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NiAweEY2ICdcMzY2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3QywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDcgMHhGNyAnXDM2NycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDU0LCAvKiAwMTAxMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQ4IDB4RjggJ1wzNzAnICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OSAweEY5ICdcMzcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTAgMHhGQSAnXDM3MicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjUxIDB4RkIgJ1wzNzMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwMCAqLworCTB4MDgsIC8qIDAwMDAxMDAwICovCisJMHgwOCwgLyogMDAwMDEwMDAgKi8KKwkweDUwLCAvKiAwMTAxMDAwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDIwLCAvKiAwMDEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MiAweEZDICdcMzc0JyAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg1MCwgLyogMDEwMTAwMDAgKi8KKwkweDUwLCAvKiAwMTAxMDAwMCAqLworCTB4NTAsIC8qIDAxMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTMgMHhGRCAnXDM3NScgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgyMCwgLyogMDAxMDAwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjU0IDB4RkUgJ1wzNzYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NSAweEZGICdcMzc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKK307CisKK2NvbnN0IHN0cnVjdCBmb250X2Rlc2MgZm9udF82eDEwID0geworCS5pZHgJPSBGT05UNngxMF9JRFgsCisJLm5hbWUJPSAiNngxMCIsCisJLndpZHRoCT0gNiwKKwkuaGVpZ2h0CT0gMTAsCisJLmRhdGEJPSBmb250ZGF0YV82eDEwLAorCS5wcmVmCT0gMCwKK307CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250XzZ4MTEuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfNngxMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MTM2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250XzZ4MTEuYwpAQCAtMCwwICsxLDMzNTMgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgRm9udCBmaWxlIGdlbmVyYXRlZCBieSBydGhlbGVuICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorCisjZGVmaW5lIEZPTlREQVRBTUFYICgxMSoyNTYpCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZvbnRkYXRhXzZ4MTFbRk9OVERBVEFNQVhdID0geworCisJLyogMCAweDAwICdeQCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxIDB4MDEgJ15BJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDg0LCAvKiAgMDAwMCAwMCAqLworCTB4Y2MsIC8qICAgMDAgIDAwICovCisJMHg4NCwgLyogIDAwMDAgMDAgKi8KKwkweGI0LCAvKiAgMCAgMCAwMCAqLworCTB4ODQsIC8qICAwMDAwIDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhiNCwgLyogIDAgIDAgMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4Y2MsIC8qICAgMDAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMyAweDAzICdeQycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0IDB4MDQgJ15EJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDZjLCAvKiAwICAwICAwMCAqLworCTB4NmMsIC8qIDAgIDAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNiAweDA2ICdeRicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3IDB4MDcgJ15HJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwICAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDMwLCAvKiAwMCAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhmZiwgLyogICAgICAgICAgKi8KKwkweGZmLCAvKiAgICAgICAgICAqLworCTB4ZmYsIC8qICAgICAgICAgICovCisJMHhjZiwgLyogICAwMCAgICAgKi8KKwkweDg3LCAvKiAgMDAwMCAgICAqLworCTB4Y2YsIC8qICAgMDAgICAgICovCisJMHhmZiwgLyogICAgICAgICAgKi8KKwkweGZmLCAvKiAgICAgICAgICAqLworCTB4ZmYsIC8qICAgICAgICAgICovCisJMHhmZiwgLyogICAgICAgICAgKi8KKwkweGZmLCAvKiAgICAgICAgICAqLworCisJLyogOSAweDA5ICdeSScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4ODQsIC8qICAwMDAwIDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDMwLCAvKiAwMCAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMCAweDBhICdeSicgKi8KKwkweGZmLCAvKiAgICAgICAgICAqLworCTB4ZmYsIC8qICAgICAgICAgICovCisJMHhjZiwgLyogICAwMCAgICAgKi8KKwkweGI3LCAvKiAgMCAgMCAgICAqLworCTB4N2IsIC8qIDAgICAgMCAgICovCisJMHhiNywgLyogIDAgIDAgICAgKi8KKwkweGNmLCAvKiAgIDAwICAgICAqLworCTB4ZmYsIC8qICAgICAgICAgICovCisJMHhmZiwgLyogICAgICAgICAgKi8KKwkweGZmLCAvKiAgICAgICAgICAqLworCTB4ZmYsIC8qICAgICAgICAgICovCisKKwkvKiAxMSAweDBiICdeSycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgxNCwgLyogMDAwIDAgMDAgKi8KKwkweDIwLCAvKiAwMCAwMDAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMiAweDBjICdeTCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMyAweDBkICdeTScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweGUwLCAvKiAgICAwMDAwMCAqLworCTB4YzAsIC8qICAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNCAweDBlICdeTicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweGNjLCAvKiAgIDAwICAwMCAqLworCTB4Y2MsIC8qICAgMDAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNSAweDBmICdeTycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NmMsIC8qIDAgIDAgIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNiAweDEwICdeUCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg2MCwgLyogMCAgMDAwMDAgKi8KKwkweDcwLCAvKiAwICAgMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHg3MCwgLyogMCAgIDAwMDAgKi8KKwkweDYwLCAvKiAwICAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwYywgLyogMDAwMCAgMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDBjLCAvKiAwMDAwICAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOCAweDEyICdeUicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOSAweDEzICdeUycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgxNCwgLyogMDAwIDAgMDAgKi8KKwkweDE0LCAvKiAwMDAgMCAwMCAqLworCTB4MTQsIC8qIDAwMCAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMSAweDE1ICdeVScgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDE0LCAvKiAwMDAgMCAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMiAweDE2ICdeVicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogICAgICAwMDAgKi8KKwkweGY4LCAvKiAgICAgIDAwMCAqLworCTB4ZjgsIC8qICAgICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNCAweDE4ICdeWCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNSAweDE5ICdeWScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNiAweDFhICdeWicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNyAweDFiICdeWycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDIwLCAvKiAwMCAwMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyOCAweDFjICdeXCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyOSAweDFkICdeXScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDg0LCAvKiAgMDAwMCAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHg4NCwgLyogIDAwMDAgMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMCAweDFlICdeXicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMSAweDFmICdeYCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMzIDB4MjEgJyEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzQgMHgyMiAnIicgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDM2IDB4MjQgJyQnICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg1MCwgLyogMCAwIDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTQsIC8qIDAwMCAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzcgMHgyNSAnJScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjQsIC8qIDAgIDAwIDAwICovCisJMHg2NCwgLyogMCAgMDAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDRjLCAvKiAwIDAwICAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4NTAsIC8qIDAgMCAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDM5IDB4MjcgJycnICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDAgMHgyOCAnKCcgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDIwLCAvKiAwMCAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQyIDB4MmEgJyonICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDMgMHgyYiAnKycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NCAweDJjICcsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwICAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQ1IDB4MmQgJy0nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDYgMHgyZSAnLicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAgIDAwMCAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NyAweDJmICcvJyAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQ4IDB4MzAgJzAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0YywgLyogMCAwMCAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NjQsIC8qIDAgIDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDkgMHgzMSAnMScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxOCwgLyogMDAwICAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUxIDB4MzMgJzMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDE4LCAvKiAwMDAgIDAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTIgMHgzNCAnNCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxOCwgLyogMDAwICAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDU0IDB4MzYgJzYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTUgMHgzNyAnNycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDU3IDB4MzkgJzknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTggMHgzYSAnOicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAgIDAwMCAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAgIDAwMCAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OSAweDNiICc7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwICAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwICAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYwIDB4M2MgJzwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDIwLCAvKiAwMCAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNjEgMHgzZCAnPScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MiAweDNlICc+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYzIDB4M2YgJz8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNjQgMHg0MCAnQCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDc0LCAvKiAwICAgMCAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDY2IDB4NDIgJ0InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNjcgMHg0MyAnQycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDY5IDB4NDUgJ0UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzAgMHg0NiAnRicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0YywgLyogMCAwMCAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDcyIDB4NDggJ0gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzMgMHg0OSAnSScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NCAweDRhICdKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDc1IDB4NGIgJ0snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg1MCwgLyogMCAwIDAwMDAgKi8KKwkweDYwLCAvKiAwICAwMDAwMCAqLworCTB4NTAsIC8qIDAgMCAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzYgMHg0YyAnTCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NyAweDRkICdNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDZjLCAvKiAwICAwICAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDc4IDB4NGUgJ04nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NjQsIC8qIDAgIDAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDRjLCAvKiAwIDAwICAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzkgMHg0ZiAnTycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDgxIDB4NTEgJ1EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODIgMHg1MiAnUicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDg0IDB4NTQgJ1QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODUgMHg1NSAnVScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDg3IDB4NTcgJ1cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg2YywgLyogMCAgMCAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODggMHg1OCAnWCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDkwIDB4NWEgJ1onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogOTEgMHg1YiAnWycgKi8KKwkweDBjLCAvKiAwMDAwICAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwYywgLyogMDAwMCAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MiAweDVjICdcJyAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDIwLCAvKiAwMCAwMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDkzIDB4NWQgJ10nICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzAsIC8qIDAwICAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogOTQgMHg1ZSAnXicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NSAweDVmICdfJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDk2IDB4NjAgJ2AnICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogOTcgMHg2MSAnYScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDRjLCAvKiAwIDAwICAwMCAqLworCTB4MzQsIC8qIDAwICAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NzgsIC8qIDAgICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDk5IDB4NjMgJ2MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAwIDB4NjQgJ2QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAyIDB4NjYgJ2YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAzIDB4NjcgJ2cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA1IDB4NjkgJ2knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA2IDB4NmEgJ2onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg2MCwgLyogMCAgMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA3IDB4NmIgJ2snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4NzAsIC8qIDAgICAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA4IDB4NmMgJ2wnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMCAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA5IDB4NmQgJ20nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEwIDB4NmUgJ24nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1OCwgLyogMCAwICAwMDAgKi8KKwkweDY0LCAvKiAwICAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTExIDB4NmYgJ28nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEyIDB4NzAgJ3AnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE0IDB4NzIgJ3InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1OCwgLyogMCAwICAwMDAgKi8KKwkweDY0LCAvKiAwICAwMCAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE1IDB4NzMgJ3MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDc4LCAvKiAwICAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE3IDB4NzUgJ3UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0YywgLyogMCAwMCAgMDAgKi8KKwkweDM0LCAvKiAwMCAgMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE4IDB4NzYgJ3YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIwIDB4NzggJ3gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIxIDB4NzkgJ3knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIyIDB4N2EgJ3onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIzIDB4N2IgJ3snICovCisJMHgwNCwgLyogMDAwMDAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCisJLyogMTI0IDB4N2MgJ3wnICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI1IDB4N2QgJ30nICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDIwLCAvKiAwMCAwMDAwMCAqLworCisJLyogMTI2IDB4N2UgJ34nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM0LCAvKiAwMCAgMCAwMCAqLworCTB4NTgsIC8qIDAgMCAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI3IDB4N2YgJ14/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyOCAweDgwICdcMjAwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyOSAweDgxICdcMjAxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMCAweDgyICdcMjAyJyAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMSAweDgzICdcMjAzJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICdcMjA0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMyAweDg1ICdcMjA1JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNCAweDg2ICdcMjA2JyAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDE4LCAvKiAwMDAgIDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICdcMjA3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNiAweDg4ICdcMjEwJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNyAweDg5ICdcMjExJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhhICdcMjEyJyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOSAweDhiICdcMjEzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MCAweDhjICdcMjE0JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhkICdcMjE1JyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MiAweDhlICdcMjE2JyAqLworCTB4ODQsIC8qICAwMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MyAweDhmICdcMjE3JyAqLworCTB4NTgsIC8qIDAgMCAgMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICdcMjIwJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NSAweDkxICdcMjIxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDVjLCAvKiAwIDAgICAwMCAqLworCTB4NTAsIC8qIDAgMCAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NiAweDkyICdcMjIyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4NTAsIC8qIDAgMCAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4NTAsIC8qIDAgMCAwMDAwICovCisJMHg1YywgLyogMCAwICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICdcMjIzJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0OCAweDk0ICdcMjI0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0OSAweDk1ICdcMjI1JyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICdcMjI2JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MSAweDk3ICdcMjI3JyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MiAweDk4ICdcMjMwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MyAweDk5ICdcMjMxJyAqLworCTB4ODQsIC8qICAwMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NCAweDlhICdcMjMyJyAqLworCTB4ODgsIC8qICAwMDAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NSAweDliICdcMjMzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NiAweDljICdcMjM0JyAqLworCTB4MzAsIC8qIDAwICAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NzAsIC8qIDAgICAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NyAweDlkICdcMjM1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDdjLCAvKiAwICAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1OCAweDllICdcMjM2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3MCwgLyogMCAgIDAwMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4NzAsIC8qIDAgICAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDVjLCAvKiAwIDAgICAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1OSAweDlmICdcMjM3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwYywgLyogMDAwMCAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg2MCwgLyogMCAgMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MCAweGEwICdcMjQwJyAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MSAweGExICdcMjQxJyAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MiAweGEyICdcMjQyJyAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MyAweGEzICdcMjQzJyAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NGMsIC8qIDAgMDAgIDAwICovCisJMHgzNCwgLyogMDAgIDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NCAweGE0ICdcMjQ0JyAqLworCTB4MzQsIC8qIDAwICAwIDAwICovCisJMHg1OCwgLyogMCAwICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NTgsIC8qIDAgMCAgMDAwICovCisJMHg2NCwgLyogMCAgMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NSAweGE1ICdcMjQ1JyAqLworCTB4NTgsIC8qIDAgMCAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDY0LCAvKiAwICAwMCAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHg0YywgLyogMCAwMCAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NiAweGE2ICdcMjQ2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MjQsIC8qIDAwIDAwIDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NyAweGE3ICdcMjQ3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwICAwMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MjQsIC8qIDAwIDAwIDAwICovCisJMHgxOCwgLyogMDAwICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OCAweGE4ICdcMjUwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OSAweGE5ICdcMjUxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MCAweGFhICdcMjUyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MSAweGFiICdcMjUzJyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHg2MCwgLyogMCAgMDAwMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MiAweGFjICdcMjU0JyAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHg2MCwgLyogMCAgMDAwMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4NTgsIC8qIDAgMCAgMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MyAweGFkICdcMjU1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NCAweGFlICdcMjU2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NSAweGFmICdcMjU3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MjQsIC8qIDAwIDAwIDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NiAweGIwICdcMjYwJyAqLworCTB4MTEsIC8qIDAwMCAwMDAgICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDExLCAvKiAwMDAgMDAwICAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgxMSwgLyogMDAwIDAwMCAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MTEsIC8qIDAwMCAwMDAgICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDExLCAvKiAwMDAgMDAwICAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHgxMSwgLyogMDAwIDAwMCAgKi8KKworCS8qIDE3NyAweGIxICdcMjYxJyAqLworCTB4NTUsIC8qIDAgMCAwIDAgICovCisJMHhhYSwgLyogIDAgMCAwIDAgKi8KKwkweDU1LCAvKiAwIDAgMCAwICAqLworCTB4YWEsIC8qICAwIDAgMCAwICovCisJMHg1NSwgLyogMCAwIDAgMCAgKi8KKwkweGFhLCAvKiAgMCAwIDAgMCAqLworCTB4NTUsIC8qIDAgMCAwIDAgICovCisJMHhhYSwgLyogIDAgMCAwIDAgKi8KKwkweDU1LCAvKiAwIDAgMCAwICAqLworCTB4YWEsIC8qICAwIDAgMCAwICovCisJMHg1NSwgLyogMCAwIDAgMCAgKi8KKworCS8qIDE3OCAweGIyICdcMjYyJyAqLworCTB4ZGQsIC8qICAgMCAgIDAgICovCisJMHg3NywgLyogMCAgIDAgICAgKi8KKwkweGRkLCAvKiAgIDAgICAwICAqLworCTB4NzcsIC8qIDAgICAwICAgICovCisJMHhkZCwgLyogICAwICAgMCAgKi8KKwkweDc3LCAvKiAwICAgMCAgICAqLworCTB4ZGQsIC8qICAgMCAgIDAgICovCisJMHg3NywgLyogMCAgIDAgICAgKi8KKwkweGRkLCAvKiAgIDAgICAwICAqLworCTB4NzcsIC8qIDAgICAwICAgICovCisJMHhkZCwgLyogICAwICAgMCAgKi8KKworCS8qIDE3OSAweGIzICdcMjYzJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE4MCAweGI0ICdcMjY0JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHhmMCwgLyogICAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE4MSAweGI1ICdcMjY1JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4ZjAsIC8qICAgICAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweGYwLCAvKiAgICAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE4MiAweGI2ICdcMjY2JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHhlOCwgLyogICAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDE4MyAweGI3ICdcMjY3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogICAgICAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDE4NCAweGI4ICdcMjcwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZjAsIC8qICAgICAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweGYwLCAvKiAgICAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE4NSAweGI5ICdcMjcxJyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4ZTgsIC8qICAgIDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweGU4LCAvKiAgICAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDE4NiAweGJhICdcMjcyJyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDE4NyAweGJiICdcMjczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZjgsIC8qICAgICAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweGU4LCAvKiAgICAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDE4OCAweGJjICdcMjc0JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4ZTgsIC8qICAgIDAgMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweGY4LCAvKiAgICAgIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE4OSAweGJkICdcMjc1JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHhmOCwgLyogICAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MCAweGJlICdcMjc2JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4ZjAsIC8qICAgICAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweGYwLCAvKiAgICAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MSAweGJmICdcMjc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmMCwgLyogICAgIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE5MiAweGMwICdcMzAwJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MyAweGMxICdcMzAxJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5NCAweGMyICdcMzAyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE5NSAweGMzICdcMzAzJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE5NiAweGM0ICdcMzA0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5NyAweGM1ICdcMzA1JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE5OCAweGM2ICdcMzA2JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDE5OSAweGM3ICdcMzA3JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyYywgLyogMDAgMCAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIwMCAweGM4ICdcMzEwJyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MmMsIC8qIDAwIDAgIDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDNjLCAvKiAwMCAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMSAweGM5ICdcMzExJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDJjLCAvKiAwMCAwICAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIwMiAweGNhICdcMzEyJyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4ZWMsIC8qICAgIDAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMyAweGNiICdcMzEzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGVjLCAvKiAgICAwICAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIwNCAweGNjICdcMzE0JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MmMsIC8qIDAwIDAgIDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDJjLCAvKiAwMCAwICAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIwNSAweGNkICdcMzE1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwNiAweGNlICdcMzE2JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4ZWMsIC8qICAgIDAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGVjLCAvKiAgICAwICAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIwNyAweGNmICdcMzE3JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwOCAweGQwICdcMzIwJyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwOSAweGQxICdcMzIxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDIxMCAweGQyICdcMzIyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIxMSAweGQzICdcMzIzJyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMiAweGQ0ICdcMzI0JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMyAweGQ1ICdcMzI1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDIxNCAweGQ2ICdcMzI2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIxNSAweGQ3ICdcMzI3JyAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKworCS8qIDIxNiAweGQ4ICdcMzMwJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDIxNyAweGQ5ICdcMzMxJyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHhmMCwgLyogICAgIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxOCAweGRhICdcMzMyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZiwgLyogMDAwICAgICAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDIxOSAweGRiICdcMzMzJyAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKworCS8qIDIyMCAweGRjICdcMzM0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKworCS8qIDIyMSAweGRkICdcMzM1JyAqLworCTB4ZTAsIC8qICAgIDAwMDAwICovCisJMHhlMCwgLyogICAgMDAwMDAgKi8KKwkweGUwLCAvKiAgICAwMDAwMCAqLworCTB4ZTAsIC8qICAgIDAwMDAwICovCisJMHhlMCwgLyogICAgMDAwMDAgKi8KKwkweGUwLCAvKiAgICAwMDAwMCAqLworCTB4ZTAsIC8qICAgIDAwMDAwICovCisJMHhlMCwgLyogICAgMDAwMDAgKi8KKwkweGUwLCAvKiAgICAwMDAwMCAqLworCTB4ZTAsIC8qICAgIDAwMDAwICovCisJMHhlMCwgLyogICAgMDAwMDAgKi8KKworCS8qIDIyMiAweGRlICdcMzM2JyAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDFjLCAvKiAwMDAgICAwMCAqLworCTB4MWMsIC8qIDAwMCAgIDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKworCS8qIDIyMyAweGRmICdcMzM3JyAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNCAweGUwICdcMzQwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MjQsIC8qIDAwIDAwIDAwICovCisJMHg1OCwgLyogMCAwICAwMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHgyYywgLyogMDAgMCAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNSAweGUxICdcMzQxJyAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg1OCwgLyogMCAwICAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNiAweGUyICdcMzQyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg0MCwgLyogMCAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNyAweGUzICdcMzQzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAgICAgIDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgyOCwgLyogMDAgMCAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOCAweGU0ICdcMzQ0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjQsIC8qIDAwIDAwIDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOSAweGU1ICdcMzQ1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwICAgIDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgzMCwgLyogMDAgIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMCAweGU2ICdcMzQ2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg0OCwgLyogMCAwMCAwMDAgKi8KKwkweDQ4LCAvKiAwIDAwIDAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHg3NCwgLyogMCAgIDAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMSAweGU3ICdcMzQ3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NmMsIC8qIDAgIDAgIDAwICovCisJMHg5OCwgLyogIDAwICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMiAweGU4ICdcMzUwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMyAweGU5ICdcMzUxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0YywgLyogMCAwMCAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NjQsIC8qIDAgIDAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNCAweGVhICdcMzUyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHg2YywgLyogMCAgMCAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNSAweGViICdcMzUzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MGMsIC8qIDAwMDAgIDAwICovCisJMHgxNCwgLyogMDAwIDAgMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MjQsIC8qIDAwIDAwIDAwICovCisJMHgxOCwgLyogMDAwICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNiAweGVjICdcMzU0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg1NCwgLyogMCAwIDAgMDAgKi8KKwkweDU0LCAvKiAwIDAgMCAwMCAqLworCTB4NTQsIC8qIDAgMCAwIDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNyAweGVkICdcMzU1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMCAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzOCAweGVlICdcMzU2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDQwLCAvKiAwIDAwMDAwMCAqLworCTB4NDAsIC8qIDAgMDAwMDAwICovCisJMHgzYywgLyogMDAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzOSAweGVmICdcMzU3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDQ0LCAvKiAwIDAwMCAwMCAqLworCTB4NDQsIC8qIDAgMDAwIDAwICovCisJMHg0NCwgLyogMCAwMDAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MCAweGYwICdcMzYwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAgICAgICAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmYywgLyogICAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmMsIC8qICAgICAgIDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MSAweGYxICdcMzYxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MiAweGYyICdcMzYyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDQsIC8qIDAwMDAwIDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MyAweGYzICdcMzYzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwOCwgLyogMDAwMCAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NCAweGY0ICdcMzY0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwYywgLyogMDAwMCAgMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKworCS8qIDI0NSAweGY1ICdcMzY1JyAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4NjAsIC8qIDAgIDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NiAweGY2ICdcMzY2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMCAgICAgMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NyAweGY3ICdcMzY3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM0LCAvKiAwMCAgMCAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM0LCAvKiAwMCAgMCAwMCAqLworCTB4NDgsIC8qIDAgMDAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OCAweGY4ICdcMzcwJyAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgyNCwgLyogMDAgMDAgMDAgKi8KKwkweDI0LCAvKiAwMCAwMCAwMCAqLworCTB4MTgsIC8qIDAwMCAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OSAweGY5ICdcMzcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMCAwMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDEwLCAvKiAwMDAgMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MCAweGZhICdcMzcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MSAweGZiICdcMzczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwICAwMCAqLworCTB4MDgsIC8qIDAwMDAgMDAwICovCisJMHgxMCwgLyogMDAwIDAwMDAgKi8KKwkweDUwLCAvKiAwIDAgMDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHgyMCwgLyogMDAgMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MiAweGZjICdcMzc0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg1MCwgLyogMCAwIDAwMDAgKi8KKwkweDI4LCAvKiAwMCAwIDAwMCAqLworCTB4MjgsIC8qIDAwIDAgMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MyAweGZkICdcMzc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3MCwgLyogMCAgIDAwMDAgKi8KKwkweDA4LCAvKiAwMDAwIDAwMCAqLworCTB4MjAsIC8qIDAwIDAwMDAwICovCisJMHg3OCwgLyogMCAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NCAweGZlICdcMzc2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDM4LCAvKiAwMCAgIDAwMCAqLworCTB4MzgsIC8qIDAwICAgMDAwICovCisJMHgzOCwgLyogMDAgICAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NSAweGZmICdcMzc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworfTsKKworCitjb25zdCBzdHJ1Y3QgZm9udF9kZXNjIGZvbnRfdmdhXzZ4MTEgPSB7CisJLmlkeAk9IFZHQTZ4MTFfSURYLAorCS5uYW1lCT0gIlByb0ZvbnQ2eDExIiwKKwkud2lkdGgJPSA2LAorCS5oZWlnaHQJPSAxMSwKKwkuZGF0YQk9IGZvbnRkYXRhXzZ4MTEsCisJLyogVHJ5IGF2b2lkaW5nIHRoaXMgZm9udCBpZiBwb3NzaWJsZSB1bmxlc3Mgb24gTUFDICovCisJLnByZWYJPSAtMjAwMCwKK307CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250Xzd4MTQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfN3gxNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZTViNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250Xzd4MTQuYwpAQCAtMCwwICsxLDQxMTkgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiB0aGlzIGZpbGUgYWRhcHRlZCBmcm9tIGZvbnRfOHgxNi5jICovCisvKiBieSBKdXJyaWFhbiBLYWxrbWFuIDA1LTIwMDUgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9mb250Lmg+CisKKyNkZWZpbmUgRk9OVERBVEFNQVggMzU4NAorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmb250ZGF0YV83eDE0W0ZPTlREQVRBTUFYXSA9IHsKKworCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEgMHgwMSAnXkEnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDgyLCAvKiAxMDAwMDAxICovCisJMHhhYSwgLyogMTAxMDEwMSAqLworCTB4ODIsIC8qIDEwMDAwMDEgKi8KKwkweDgyLCAvKiAxMDAwMDAxICovCisJMHhiYSwgLyogMTAxMTEwMSAqLworCTB4OTIsIC8qIDEwMDEwMDEgKi8KKwkweDgyLCAvKiAxMDAwMDAxICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4ZWUsIC8qIDExMTAxMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDQgMHgwNCAnXkQnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweGVlLCAvKiAxMTEwMTExICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4ZWUsIC8qIDExMTAxMTEgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDcgMHgwNyAnXkcnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGU2LCAvKiAxMTEwMDExICovCisJMHhjMiwgLyogMTEwMDAwMSAqLworCTB4YzIsIC8qIDExMDAwMDEgKi8KKwkweGU2LCAvKiAxMTEwMDExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NDQsIC8qIDAxMDAwMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEwIDB4MGEgJ15KJyAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4OTIsIC8qIDEwMDEwMDEgKi8KKwkweGJhLCAvKiAxMDExMTAxICovCisJMHg5MiwgLyogMTAwMTAwMSAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisKKwkvKiAxMSAweDBiICdeSycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMSAqLworCTB4MGUsIC8qIDAwMDAxMTEgKi8KKwkweDFhLCAvKiAwMDAxMTAxICovCisJMHgxYSwgLyogMDAwMTEwMSAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTIgMHgwYyAnXkwnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExICovCisJMHg2NiwgLyogMDExMDAxMSAqLworCTB4NjYsIC8qIDAxMTAwMTEgKi8KKwkweDY2LCAvKiAwMTEwMDExICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEzIDB4MGQgJ15NJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDNlLCAvKiAwMDExMTExICovCisJMHgzNiwgLyogMDAxMTAxMSAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNCAweDBlICdeTicgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4NjYsIC8qIDAxMTAwMTEgKi8KKwkweDdlLCAvKiAwMTExMTExICovCisJMHg2NiwgLyogMDExMDAxMSAqLworCTB4NjYsIC8qIDAxMTAwMTEgKi8KKwkweDY2LCAvKiAwMTEwMDExICovCisJMHg2NiwgLyogMDExMDAxMSAqLworCTB4NmUsIC8qIDAxMTAxMTEgKi8KKwkweGVlLCAvKiAxMTEwMTExICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTUgMHgwZiAnXk8nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4ZDYsIC8qIDExMDEwMTEgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweGQ2LCAvKiAxMTAxMDExICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE2IDB4MTAgJ15QJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4ZjAsIC8qIDExMTEwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4ODAsIC8qIDEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwNCwgLyogMDAwMDAxMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDFjLCAvKiAwMDAxMTEwICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDA0LCAvKiAwMDAwMDEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE5IDB4MTMgJ15TJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4ZDQsIC8qIDExMDEwMTAgKi8KKwkweGQ0LCAvKiAxMTAxMDEwICovCisJMHhkNCwgLyogMTEwMTAxMCAqLworCTB4NzQsIC8qIDAxMTEwMTAgKi8KKwkweDE0LCAvKiAwMDAxMDEwICovCisJMHgxNCwgLyogMDAwMTAxMCAqLworCTB4MTQsIC8qIDAwMDEwMTAgKi8KKwkweDE0LCAvKiAwMDAxMDEwICovCisJMHgxNiwgLyogMDAwMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIyIDB4MTYgJ15WJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI1IDB4MTkgJ15ZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyNiAweDFhICdeWicgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjcgMHgxYiAnXlsnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI4IDB4MWMgJ15cJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyOSAweDFkICdeXScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MjgsIC8qIDAwMTAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMzAgMHgxZSAnXl4nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDMxIDB4MWYgJ15fJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzNCAweDIyICciJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDI4LCAvKiAwMDEwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGM0LCAvKiAxMTAwMDEwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHg4YywgLyogMTAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzNyAweDI1ICclJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGM0LCAvKiAxMTAwMDEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDhjLCAvKiAxMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4ZGUsIC8qIDExMDExMTEgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweDc2LCAvKiAwMTExMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0MCAweDI4ICcoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0MiAweDJhICcqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0MyAweDJiICcrJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0NCAweDJjICcsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0NSAweDJkICctJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0NiAweDJlICcuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0NyAweDJmICcvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDA0LCAvKiAwMDAwMDEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhkYywgLyogMTEwMTExMCAqLworCTB4ZWMsIC8qIDExMTAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA0OSAweDMxICcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1MiAweDM0ICc0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4M2MsIC8qIDAwMTExMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1NSAweDM3ICc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1OCAweDNhICc6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA1OSAweDNiICc7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2MCAweDNjICc8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwNCwgLyogMDAwMDAxMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDA0LCAvKiAwMDAwMDEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2MSAweDNkICc9JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2MiAweDNlICc+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg0MCwgLyogMDEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDQwLCAvKiAwMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2MyAweDNmICc/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2NCAweDQwICdAJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGY4LCAvKiAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2NyAweDQzICdDJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4YzQsIC8qIDExMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjNCwgLyogMTEwMDAxMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NjQsIC8qIDAxMTAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4NjgsIC8qIDAxMTAxMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2NCwgLyogMDExMDAxMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3MCAweDQ2ICdGJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHg2NCwgLyogMDExMDAxMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDY4LCAvKiAwMTEwMTAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4NjgsIC8qIDAxMTAxMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4YzQsIC8qIDExMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDM0LCAvKiAwMDExMDEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3MyAweDQ5ICdJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3NCAweDRhICdKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3NSAweDRiICdLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3NiAweDRjICdMJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjNCwgLyogMTEwMDAxMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3NyAweDRkICdNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3OCAweDRlICdOJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4ZWMsIC8qIDExMTAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhkYywgLyogMTEwMTExMCAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA3OSAweDRmICdPJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MWMsIC8qIDAwMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4MiAweDUyICdSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhjNCwgLyogMTEwMDAxMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4OGMsIC8qIDEwMDAxMTAgKi8KKwkweGY4LCAvKiAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4YjQsIC8qIDEwMTEwMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4NSAweDU1ICdVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4OCAweDU4ICdYJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5MCAweDVhICdaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4OGMsIC8qIDEwMDAxMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhjNCwgLyogMTEwMDAxMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5MSAweDViICdbJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5MiAweDVjICdcJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ODAsIC8qIDEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDA0LCAvKiAwMDAwMDEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5MyAweDVkICddJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5NCAweDVlICdeJyAqLworCTB4MTAsIC8qIDAwMDEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5NSAweDVmICdfJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5NyAweDYxICdhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc2LCAvKiAwMTExMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGY4LCAvKiAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMDAgMHg2NCAnZCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NjQsIC8qIDAxMTAwMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMDMgMHg2NyAnZycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGVjLCAvKiAxMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMDYgMHg2YSAnaicgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCisJLyogMTA3IDB4NmIgJ2snICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZjICdsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMDkgMHg2ZCAnbScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGQ2LCAvKiAxMTAxMDExICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4ZDYsIC8qIDExMDEwMTEgKi8KKwkweGQ2LCAvKiAxMTAxMDExICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTEwIDB4NmUgJ24nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4YjgsIC8qIDEwMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZmICdvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMTIgMHg3MCAncCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhiOCwgLyogMTAxMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzQsIC8qIDAxMTEwMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGI4LCAvKiAxMDExMTAwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMTUgMHg3MyAncycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzNiwgLyogMDAxMTAxMSAqLworCTB4MWMsIC8qIDAwMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc2LCAvKiAwMTExMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMTggMHg3NiAndicgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4ZDYsIC8qIDExMDEwMTEgKi8KKwkweGQ2LCAvKiAxMTAxMDExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMjEgMHg3OSAneScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCisJLyogMTIyIDB4N2EgJ3onICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdiICd7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMjQgMHg3YyAnfCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTI1IDB4N2QgJ30nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdlICd+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGVjLCAvKiAxMTEwMTEwICovCisJMHhiOCwgLyogMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMjcgMHg3ZiAnfycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTI4IDB4ODAgJ4AnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhjNCwgLyogMTEwMDAxMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGM0LCAvKiAxMTAwMDEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHg3MCwgLyogMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEyOSAweDgxICeBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc2LCAvKiAwMTExMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMzAgMHg4MiAngicgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTMxIDB4ODMgJ4MnICovCisJMHgxMCwgLyogMDAwMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICeEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc2LCAvKiAwMTExMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMzMgMHg4NSAnhScgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTM0IDB4ODYgJ4YnICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICeHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisKKwkvKiAxMzYgMHg4OCAniCcgKi8KKwkweDEwLCAvKiAwMDAxMDAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTM3IDB4ODkgJ4knICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhhICeKJyAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxMzkgMHg4YiAniycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTQwIDB4OGMgJ4wnICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhkICeNJyAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNDIgMHg4ZSAnjicgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTQzIDB4OGYgJ48nICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NDgsIC8qIDAxMDAxMDAgKi8KKwkweDQ4LCAvKiAwMTAwMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICeQJyAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGM0LCAvKiAxMTAwMDEwICovCisJMHhkMCwgLyogMTEwMTAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAgKi8KKwkweGQwLCAvKiAxMTAxMDAwICovCisJMHhjNCwgLyogMTEwMDAxMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNDUgMHg5MSAnkScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEgKi8KKwkweDM2LCAvKiAwMDExMDExICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHg2ZSwgLyogMDExMDExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTQ2IDB4OTIgJ5InICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2UsIC8qIDExMDAxMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICeTJyAqLworCTB4MTAsIC8qIDAwMDEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNDggMHg5NCAnlCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTQ5IDB4OTUgJ5UnICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICeWJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc2LCAvKiAwMTExMDExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNTEgMHg5NyAnlycgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTUyIDB4OTggJ5gnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKworCS8qIDE1MyAweDk5ICeZJyAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNTQgMHg5YSAnmicgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTU1IDB4OWIgJ5snICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE1NiAweDljICecJyAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2NCwgLyogMDExMDAxMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4ZTYsIC8qIDExMTAwMTEgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNTcgMHg5ZCAnnScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTU4IDB4OWUgJ54nICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4YzQsIC8qIDExMDAwMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhkZSwgLyogMTEwMTExMSAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE1OSAweDlmICefJyAqLworCTB4MWMsIC8qIDAwMDExMTAgKi8KKwkweDM2LCAvKiAwMDExMDExICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4YjAsIC8qIDEwMTEwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNjAgMHhhMCAnoCcgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTYxIDB4YTEgJ6EnICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE2MiAweGEyICeiJyAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNjMgMHhhMyAnoycgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTY0IDB4YTQgJ6QnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweGRjLCAvKiAxMTAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4YjgsIC8qIDEwMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE2NSAweGE1ICelJyAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweGRjLCAvKiAxMTAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGVjLCAvKiAxMTEwMTEwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNjYgMHhhNiAnpicgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTY3IDB4YTcgJ6cnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE2OCAweGE4ICeoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNjkgMHhhOSAnqScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTcwIDB4YWEgJ6onICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE3MSAweGFiICerJyAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHg2MiwgLyogMDExMDAwMSAqLworCTB4NjYsIC8qIDAxMTAwMTEgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YjgsIC8qIDEwMTExMDAgKi8KKwkweDRjLCAvKiAwMTAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisKKwkvKiAxNzIgMHhhYyAnrCcgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEgKi8KKwkweDY2LCAvKiAwMTEwMDExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweGI0LCAvKiAxMDExMDEwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTczIDB4YWQgJ60nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE3NCAweGFlICeuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxNzUgMHhhZiAnrycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTc2IDB4YjAgJ7AnICovCisJMHg4OCwgLyogMTAwMDEwMCAqLworCTB4MjIsIC8qIDAwMTAwMDEgKi8KKwkweDg4LCAvKiAxMDAwMTAwICovCisJMHgyMiwgLyogMDAxMDAwMSAqLworCTB4ODgsIC8qIDEwMDAxMDAgKi8KKwkweDIyLCAvKiAwMDEwMDAxICovCisJMHg4OCwgLyogMTAwMDEwMCAqLworCTB4MjIsIC8qIDAwMTAwMDEgKi8KKwkweDg4LCAvKiAxMDAwMTAwICovCisJMHgyMiwgLyogMDAxMDAwMSAqLworCTB4ODgsIC8qIDEwMDAxMDAgKi8KKwkweDIyLCAvKiAwMDEwMDAxICovCisJMHg4OCwgLyogMTAwMDEwMCAqLworCTB4MjIsIC8qIDAwMTAwMDEgKi8KKworCS8qIDE3NyAweGIxICexJyAqLworCTB4NTQsIC8qIDAxMDEwMTAgKi8KKwkweGFhLCAvKiAxMDEwMTAxICovCisJMHg1NCwgLyogMDEwMTAxMCAqLworCTB4YWEsIC8qIDEwMTAxMDEgKi8KKwkweDU0LCAvKiAwMTAxMDEwICovCisJMHhhYSwgLyogMTAxMDEwMSAqLworCTB4NTQsIC8qIDAxMDEwMTAgKi8KKwkweGFhLCAvKiAxMDEwMTAxICovCisJMHg1NCwgLyogMDEwMTAxMCAqLworCTB4YWEsIC8qIDEwMTAxMDEgKi8KKwkweDU0LCAvKiAwMTAxMDEwICovCisJMHhhYSwgLyogMTAxMDEwMSAqLworCTB4NTQsIC8qIDAxMDEwMTAgKi8KKwkweGFhLCAvKiAxMDEwMTAxICovCisKKwkvKiAxNzggMHhiMiAnsicgKi8KKwkweGVlLCAvKiAxMTEwMTExICovCisJMHhiYSwgLyogMTAxMTEwMSAqLworCTB4ZWUsIC8qIDExMTAxMTEgKi8KKwkweGJhLCAvKiAxMDExMTAxICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4YmEsIC8qIDEwMTExMDEgKi8KKwkweGVlLCAvKiAxMTEwMTExICovCisJMHhiYSwgLyogMTAxMTEwMSAqLworCTB4ZWUsIC8qIDExMTAxMTEgKi8KKwkweGJhLCAvKiAxMDExMTAxICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4YmEsIC8qIDEwMTExMDEgKi8KKwkweGVlLCAvKiAxMTEwMTExICovCisJMHhiYSwgLyogMTAxMTEwMSAqLworCisJLyogMTc5IDB4YjMgJ7MnICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKworCS8qIDE4MCAweGI0ICe0JyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisKKwkvKiAxODEgMHhiNSAntScgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCisJLyogMTgyIDB4YjYgJ7YnICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKworCS8qIDE4MyAweGI3ICe3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisKKwkvKiAxODQgMHhiOCAnuCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCisJLyogMTg1IDB4YjkgJ7knICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZWMsIC8qIDExMTAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHhlYywgLyogMTExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKworCS8qIDE4NiAweGJhICe6JyAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisKKwkvKiAxODcgMHhiYiAnuycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweGVjLCAvKiAxMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCisJLyogMTg4IDB4YmMgJ7wnICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZWMsIC8qIDExMTAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDE4OSAweGJkICe9JyAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxOTAgMHhiZSAnvicgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTkxIDB4YmYgJ78nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKworCS8qIDE5MiAweGMwICfAJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAxOTMgMHhjMSAnwScgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTk0IDB4YzIgJ8InICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKworCS8qIDE5NSAweGMzICfDJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisKKwkvKiAxOTYgMHhjNCAnxCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMTk3IDB4YzUgJ8UnICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKworCS8qIDE5OCAweGM2ICfGJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDNlLCAvKiAwMDExMTExICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisKKwkvKiAxOTkgMHhjNyAnxycgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZlLCAvKiAwMTEwMTExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCisJLyogMjAwIDB4YzggJ8gnICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmUsIC8qIDAxMTAxMTEgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIwMSAweGM5ICfJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NmUsIC8qIDAxMTAxMTEgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisKKwkvKiAyMDIgMHhjYSAnyicgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjAzIDB4Y2IgJ8snICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKworCS8qIDIwNCAweGNjICfMJyAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZlLCAvKiAwMTEwMTExICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NmUsIC8qIDAxMTAxMTEgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisKKwkvKiAyMDUgMHhjZCAnzScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjA2IDB4Y2UgJ84nICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4ZWUsIC8qIDExMTAxMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhlZSwgLyogMTExMDExMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKworCS8qIDIwNyAweGNmICfPJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMDggMHhkMCAn0CcgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjA5IDB4ZDEgJ9EnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKworCS8qIDIxMCAweGQyICfSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisKKwkvKiAyMTEgMHhkMyAn0ycgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDdlLCAvKiAwMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjEyIDB4ZDQgJ9QnICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzZSwgLyogMDAxMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIxMyAweGQ1ICfVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDNlLCAvKiAwMDExMTExICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisKKwkvKiAyMTQgMHhkNiAn1icgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCisJLyogMjE1IDB4ZDcgJ9cnICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKworCS8qIDIxNiAweGQ4ICfYJyAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisKKwkvKiAyMTcgMHhkOSAn2ScgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjE4IDB4ZGEgJ9onICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgzZSwgLyogMDAxMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKworCS8qIDIxOSAweGRiICfbJyAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisKKwkvKiAyMjAgMHhkYyAn3CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCisJLyogMjIxIDB4ZGQgJ90nICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwICovCisJMHhlMCwgLyogMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAgKi8KKworCS8qIDIyMiAweGRlICfeJyAqLworCTB4MWUsIC8qIDAwMDExMTEgKi8KKwkweDFlLCAvKiAwMDAxMTExICovCisJMHgxZSwgLyogMDAwMTExMSAqLworCTB4MWUsIC8qIDAwMDExMTEgKi8KKwkweDFlLCAvKiAwMDAxMTExICovCisJMHgxZSwgLyogMDAwMTExMSAqLworCTB4MWUsIC8qIDAwMDExMTEgKi8KKwkweDFlLCAvKiAwMDAxMTExICovCisJMHgxZSwgLyogMDAwMTExMSAqLworCTB4MWUsIC8qIDAwMDExMTEgKi8KKwkweDFlLCAvKiAwMDAxMTExICovCisJMHgxZSwgLyogMDAwMTExMSAqLworCTB4MWUsIC8qIDAwMDExMTEgKi8KKwkweDFlLCAvKiAwMDAxMTExICovCisKKwkvKiAyMjMgMHhkZiAn3ycgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4ZmUsIC8qIDExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjI0IDB4ZTAgJ+AnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweGRjLCAvKiAxMTAxMTEwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhkYywgLyogMTEwMTExMCAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIyNSAweGUxICfhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMjYgMHhlMiAn4icgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjI3IDB4ZTMgJ+MnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExICovCisJMHhmZSwgLyogMTExMTExMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIyOCAweGU0ICfkJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMjkgMHhlNSAn5ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMSAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHg3MCwgLyogMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjMwIDB4ZTYgJ+YnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4ZjgsIC8qIDExMTExMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4ODAsIC8qIDEwMDAwMDAgKi8KKworCS8qIDIzMSAweGU3ICfnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEgKi8KKwkweGRjLCAvKiAxMTAxMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMzIgMHhlOCAn6CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4NzgsIC8qIDAxMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjMzIDB4ZTkgJ+knICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIzNCAweGVhICfqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEgKi8KKwkweGM2LCAvKiAxMTAwMDExICovCisJMHhjNiwgLyogMTEwMDAxMSAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweGVlLCAvKiAxMTEwMTExICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMzUgMHhlYiAn6ycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgzYywgLyogMDAxMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjM2IDB4ZWMgJ+wnICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4ZDYsIC8qIDExMDEwMTEgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDIzNyAweGVkICftJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwNiwgLyogMDAwMDAxMSAqLworCTB4MGMsIC8qIDAwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHhkNiwgLyogMTEwMTAxMSAqLworCTB4ZDYsIC8qIDExMDEwMTEgKi8KKwkweGU2LCAvKiAxMTEwMDExICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyMzggMHhlZSAn7icgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjM5IDB4ZWYgJ+8nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI0MCAweGYwICfwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyNDEgMHhmMSAn8ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHhmYywgLyogMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjQyIDB4ZjIgJ/InICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI0MyAweGYzICfzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyNDQgMHhmNCAn9CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEgKi8KKwkweDM2LCAvKiAwMDExMDExICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCisJLyogMjQ1IDB4ZjUgJ/UnICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI0NiAweGY2ICf2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyNDcgMHhmNyAn9ycgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMSAqLworCTB4ZGMsIC8qIDExMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjQ4IDB4ZjggJ/gnICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHgzOCwgLyogMDAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI0OSAweGY5ICf5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyNTAgMHhmYSAn+icgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjUxIDB4ZmIgJ/snICovCisJMHgxZSwgLyogMDAwMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI1MiAweGZjICf8JyAqLworCTB4ZDgsIC8qIDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKKwkvKiAyNTMgMHhmZCAn/ScgKi8KKwkweDc4LCAvKiAwMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMCAqLworCTB4MTgsIC8qIDAwMDExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwICovCisJMHg2NCwgLyogMDExMDAxMCAqLworCTB4ZmMsIC8qIDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCisJLyogMjU0IDB4ZmUgJ/4nICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwICovCisJMHg3YywgLyogMDExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKworCS8qIDI1NSAweGZmICf/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwICovCisKK307CisKKworY29uc3Qgc3RydWN0IGZvbnRfZGVzYyBmb250Xzd4MTQgPSB7CisJLmlkeAk9IEZPTlQ3eDE0X0lEWCwKKwkubmFtZQk9ICI3eDE0IiwKKwkud2lkdGgJPSA3LAorCS5oZWlnaHQJPSAxNCwKKwkuZGF0YQk9IGZvbnRkYXRhXzd4MTQsCisJLnByZWYJPSAwLAorfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfOHgxNi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF84eDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyOTJjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfOHgxNi5jCkBAIC0wLDAgKzEsNDYzNCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBGb250IGZpbGUgZ2VuZXJhdGVkIGJ5IGNwaTJmbnQgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9mb250Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNkZWZpbmUgRk9OVERBVEFNQVggNDA5NgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmb250ZGF0YV84eDE2W0ZPTlREQVRBTUFYXSA9IHsKKworCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEgMHgwMSAnXkEnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweGE1LCAvKiAxMDEwMDEwMSAqLworCTB4ODEsIC8qIDEwMDAwMDAxICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHg4MSwgLyogMTAwMDAwMDEgKi8KKwkweDgxLCAvKiAxMDAwMDAwMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIgMHgwMiAnXkInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQgMHgwNCAnXkQnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUgMHgwNSAnXkUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDcgMHgwNyAnXkcnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDggMHgwOCAnXkgnICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4YzMsIC8qIDExMDAwMDExICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDQyLCAvKiAwMTAwMDAxMCAqLworCTB4NDIsIC8qIDAxMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwIDB4MGEgJ15KJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhiZCwgLyogMTAxMTExMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhjMywgLyogMTEwMDAwMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisKKwkvKiAxMSAweDBiICdeSycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWEsIC8qIDAwMDExMDEwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIgMHgwYyAnXkwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzIDB4MGQgJ15NJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MzMsIC8qIDAwMTEwMDExICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNCAweDBlICdeTicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4N2YsIC8qIDAxMTExMTExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4NjMsIC8qIDAxMTAwMDExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDY3LCAvKiAwMTEwMDExMSAqLworCTB4ZTcsIC8qIDExMTAwMTExICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUgMHgwZiAnXk8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2IDB4MTAgJ15QJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg4MCwgLyogMTAwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNyAweDExICdeUScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDIsIC8qIDAwMDAwMDEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5IDB4MTMgJ15TJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMCAweDE0ICdeVCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDdiLCAvKiAwMTExMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyIDB4MTYgJ15WJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMyAweDE3ICdeVycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1IDB4MTkgJ15ZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNiAweDFhICdeWicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjcgMHgxYiAnXlsnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI4IDB4MWMgJ15cJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyOSAweDFkICdeXScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgyOCwgLyogMDAxMDEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDI4LCAvKiAwMDEwMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzAgMHgxZSAnXl4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDMxIDB4MWYgJ15fJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMiAweDIwICcgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNCAweDIyICciJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgyNCwgLyogMDAxMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNSAweDIzICcjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ODYsIC8qIDEwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNyAweDI1ICclJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDg2LCAvKiAxMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOCAweDI2ICcmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MCAweDI4ICcoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MSAweDI5ICcpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MiAweDJhICcqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MyAweDJiICcrJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NCAweDJjICcsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NSAweDJkICctJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NiAweDJlICcuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0NyAweDJmICcvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OSAweDMxICcxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MCAweDMyICcyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MiAweDM0ICc0JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MyAweDM1ICc1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NSAweDM3ICc3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NiAweDM4ICc4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OCAweDNhICc6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1OSAweDNiICc7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MCAweDNjICc8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MSAweDNkICc9JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MiAweDNlICc+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MyAweDNmICc/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NCAweDQwICdAJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NSAweDQxICdBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NyAweDQzICdDJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OCAweDQ0ICdEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MCAweDQ2ICdGJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MSAweDQ3ICdHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNhLCAvKiAwMDExMTAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MyAweDQ5ICdJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NCAweDRhICdKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NSAweDRiICdLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NiAweDRjICdMJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NyAweDRkICdNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZWUsIC8qIDExMTAxMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OCAweDRlICdOJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhjZSwgLyogMTEwMDExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OSAweDRmICdPJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MCAweDUwICdQJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MiAweDUyICdSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGU2LCAvKiAxMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MyAweDUzICdTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg1YSwgLyogMDEwMTEwMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NSAweDU1ICdVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NiAweDU2ICdWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhlZSwgLyogMTExMDExMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OCAweDU4ICdYJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4OSAweDU5ICdZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MCAweDVhICdaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg4NiwgLyogMTAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzIsIC8qIDExMDAwMDEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MSAweDViICdbJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MiAweDVjICdcJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ODAsIC8qIDEwMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDAyLCAvKiAwMDAwMDAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MyAweDVkICddJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NCAweDVlICdeJyAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NSAweDVmICdfJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5NyAweDYxICdhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OCAweDYyICdiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDAgMHg2NCAnZCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAxIDB4NjUgJ2UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDMgMHg2NyAnZycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA0IDB4NjggJ2gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDYgMHg2YSAnaicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTA3IDB4NmIgJ2snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZjICdsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMDkgMHg2ZCAnbScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEwIDB4NmUgJ24nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZmICdvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTIgMHg3MCAncCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTEzIDB4NzEgJ3EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTUgMHg3MyAncycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE2IDB4NzQgJ3QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMTggMHg3NiAndicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTE5IDB4NzcgJ3cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjEgMHg3OSAneScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTIyIDB4N2EgJ3onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdiICd7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjQgMHg3YyAnfCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI1IDB4N2QgJ30nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdlICd+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMjcgMHg3ZiAnfycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTI4IDB4ODAgJ4AnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGMyLCAvKiAxMTAwMDAxMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMiwgLyogMTEwMDAwMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyOSAweDgxICeBJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzAgMHg4MiAngicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTMxIDB4ODMgJ4MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICeEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzMgMHg4NSAnhScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM0IDB4ODYgJ4YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICeHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzYgMHg4OCAniCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTM3IDB4ODkgJ4knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhhICeKJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxMzkgMHg4YiAniycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQwIDB4OGMgJ4wnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhkICeNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDIgMHg4ZSAnjicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQzIDB4OGYgJ48nICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICeQJyAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjgsIC8qIDAxMTAxMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDUgMHg5MSAnkScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg2ZSwgLyogMDExMDExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ2IDB4OTIgJ5InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2UsIC8qIDExMDAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICeTJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNDggMHg5NCAnlCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTQ5IDB4OTUgJ5UnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICeWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTEgMHg5NyAnlycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTUyIDB4OTggJ5gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MyAweDk5ICeZJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTQgMHg5YSAnmicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU1IDB4OWIgJ5snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NiAweDljICecJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NjQsIC8qIDAxMTAwMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNTcgMHg5ZCAnnScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTU4IDB4OWUgJ54nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4YzQsIC8qIDExMDAwMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1OSAweDlmICefJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDcwLCAvKiAwMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjAgMHhhMCAnoCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTYxIDB4YTEgJ6EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MiAweGEyICeiJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjMgMHhhMyAnoycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY0IDB4YTQgJ6QnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NSAweGE1ICelJyAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjYgMHhhNiAnpicgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTY3IDB4YTcgJ6cnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OCAweGE4ICeoJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNjkgMHhhOSAnqScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTcwIDB4YWEgJ6onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MSAweGFiICerJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NjIsIC8qIDAxMTAwMDEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg4NiwgLyogMTAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzIgMHhhYyAnrCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhlMCwgLyogMTExMDAwMDAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4OWEsIC8qIDEwMDExMDEwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTczIDB4YWQgJ60nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NCAweGFlICeuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxNzUgMHhhZiAnrycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTc2IDB4YjAgJ7AnICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKwkweDExLCAvKiAwMDAxMDAwMSAqLworCTB4NDQsIC8qIDAxMDAwMTAwICovCisJMHgxMSwgLyogMDAwMTAwMDEgKi8KKwkweDQ0LCAvKiAwMTAwMDEwMCAqLworCTB4MTEsIC8qIDAwMDEwMDAxICovCisJMHg0NCwgLyogMDEwMDAxMDAgKi8KKworCS8qIDE3NyAweGIxICexJyAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisKKwkvKiAxNzggMHhiMiAnsicgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCisJLyogMTc5IDB4YjMgJ7MnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4MCAweGI0ICe0JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxODEgMHhiNSAntScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTgyIDB4YjYgJ7YnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4MyAweGI3ICe3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAxODQgMHhiOCAnuCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTg1IDB4YjkgJ7knICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NiAweGJhICe6JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAxODcgMHhiYiAnuycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMTg4IDB4YmMgJ7wnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZjYsIC8qIDExMTEwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE4OSAweGJkICe9JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOTAgMHhiZSAnvicgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTkxIDB4YmYgJ78nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5MiAweGMwICfAJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAxOTMgMHhjMSAnwScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk0IDB4YzIgJ8InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5NSAweGMzICfDJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTYgMHhjNCAnxCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTk3IDB4YzUgJ8UnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5OCAweGM2ICfGJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAxOTkgMHhjNyAnxycgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzcsIC8qIDAwMTEwMTExICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMjAwIDB4YzggJ8gnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzcsIC8qIDAwMTEwMTExICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMSAweGM5ICfJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMDIgMHhjYSAnyicgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjAzIDB4Y2IgJ8snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNCAweGNjICfMJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMDUgMHhjZCAnzScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA2IDB4Y2UgJ84nICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZjcsIC8qIDExMTEwMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNyAweGNmICfPJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMDggMHhkMCAn0CcgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjA5IDB4ZDEgJ9EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxMCAweGQyICfSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisKKwkvKiAyMTEgMHhkMyAn0ycgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEyIDB4ZDQgJ9QnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MWYsIC8qIDAwMDExMTExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMyAweGQ1ICfVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAyMTQgMHhkNiAn1icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCisJLyogMjE1IDB4ZDcgJ9cnICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIxNiAweGQ4ICfYJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisKKwkvKiAyMTcgMHhkOSAn2ScgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjE4IDB4ZGEgJ9onICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxOSAweGRiICfbJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisKKwkvKiAyMjAgMHhkYyAn3CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCisJLyogMjIxIDB4ZGQgJ90nICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKworCS8qIDIyMiAweGRlICfeJyAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisKKwkvKiAyMjMgMHhkZiAn3ycgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI0IDB4ZTAgJ+AnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNSAweGUxICfhJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjYgMHhlMiAn4icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjI3IDB4ZTMgJ+MnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOCAweGU0ICfkJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMjkgMHhlNSAn5ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMwIDB4ZTYgJ+YnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMSAweGU3ICfnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzIgMHhlOCAn6CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMzIDB4ZTkgJ+knICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNCAweGVhICfqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGVlLCAvKiAxMTEwMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzUgMHhlYiAn6ycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDNlLCAvKiAwMDExMTExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM2IDB4ZWMgJ+wnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNyAweGVkICftJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDMsIC8qIDAwMDAwMDExICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweGYzLCAvKiAxMTExMDAxMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyMzggMHhlZSAn7icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjM5IDB4ZWYgJ+8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MCAweGYwICfwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDEgMHhmMSAn8ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQyIDB4ZjIgJ/InICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MyAweGYzICfzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDQgMHhmNCAn9CcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMjQ1IDB4ZjUgJ/UnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NiAweGY2ICf2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNDcgMHhmNyAn9ycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjQ4IDB4ZjggJ/gnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OSAweGY5ICf5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTAgMHhmYSAn+icgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjUxIDB4ZmIgJ/snICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweGVjLCAvKiAxMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MiAweGZjICf8JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAyNTMgMHhmZCAn/ScgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjU0IDB4ZmUgJ/4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NSAweGZmICf/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKK307CisKKworY29uc3Qgc3RydWN0IGZvbnRfZGVzYyBmb250X3ZnYV84eDE2ID0geworCS5pZHgJPSBWR0E4eDE2X0lEWCwKKwkubmFtZQk9ICJWR0E4eDE2IiwKKwkud2lkdGgJPSA4LAorCS5oZWlnaHQJPSAxNiwKKwkuZGF0YQk9IGZvbnRkYXRhXzh4MTYsCisJLnByZWYJPSAwLAorfTsKK0VYUE9SVF9TWU1CT0woZm9udF92Z2FfOHgxNik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250Xzh4OC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF84eDguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTFiZWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF84eDguYwpAQCAtMCwwICsxLDI1ODQgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgRm9udCBmaWxlIGdlbmVyYXRlZCBieSBjcGkyZm50ICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorCisjZGVmaW5lIEZPTlREQVRBTUFYIDIwNDgKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZm9udGRhdGFfOHg4W0ZPTlREQVRBTUFYXSA9IHsKKworCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMSAweDAxICdeQScgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ODEsIC8qIDEwMDAwMDAxICovCisJMHhhNSwgLyogMTAxMDAxMDEgKi8KKwkweDgxLCAvKiAxMDAwMDAwMSAqLworCTB4YmQsIC8qIDEwMTExMTAxICovCisJMHg5OSwgLyogMTAwMTEwMDEgKi8KKwkweDgxLCAvKiAxMDAwMDAwMSAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisKKwkvKiAyIDB4MDIgJ15CJyAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhjMywgLyogMTEwMDAwMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNCAweDA0ICdeRCcgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDEwLCAvKiAwMDAxMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1IDB4MDUgJ15FJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4MTAsIC8qIDAwMDEwMDAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCisJLyogNyAweDA3ICdeRycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4IDB4MDggJ15IJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4YzMsIC8qIDExMDAwMDExICovCisJMHhjMywgLyogMTEwMDAwMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg0MiwgLyogMDEwMDAwMTAgKi8KKwkweDQyLCAvKiAwMTAwMDAxMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTAgMHgwYSAnXkonICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGMzLCAvKiAxMTAwMDAxMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhiZCwgLyogMTAxMTExMDEgKi8KKwkweGJkLCAvKiAxMDExMTEwMSAqLworCTB4OTksIC8qIDEwMDExMDAxICovCisJMHhjMywgLyogMTEwMDAwMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCisJLyogMTEgMHgwYiAnXksnICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDA3LCAvKiAwMDAwMDExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHg3ZCwgLyogMDExMTExMDEgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCisJLyogMTIgMHgwYyAnXkwnICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTMgMHgwZCAnXk0nICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDMzLCAvKiAwMDExMDAxMSAqLworCTB4M2YsIC8qIDAwMTExMTExICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCisJLyogMTQgMHgwZSAnXk4nICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4N2YsIC8qIDAxMTExMTExICovCisJMHg2MywgLyogMDExMDAwMTEgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4NjcsIC8qIDAxMTAwMTExICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCisJLyogMTUgMHgwZiAnXk8nICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhlNywgLyogMTExMDAxMTEgKi8KKwkweGU3LCAvKiAxMTEwMDExMSAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTYgMHgxMCAnXlAnICovCisJMHg4MCwgLyogMTAwMDAwMDAgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg4MCwgLyogMTAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTcgMHgxMSAnXlEnICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDBlLCAvKiAwMDAwMTExMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDNlLCAvKiAwMDExMTExMCAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgwMiwgLyogMDAwMDAwMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCisJLyogMTkgMHgxMyAnXlMnICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjAgMHgxNCAnXlQnICovCisJMHg3ZiwgLyogMDExMTExMTEgKi8KKwkweGRiLCAvKiAxMTAxMTAxMSAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHg3YiwgLyogMDExMTEwMTEgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MWIsIC8qIDAwMDExMDExICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDYxLCAvKiAwMTEwMDAwMSAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg4NiwgLyogMTAwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCisJLyogMjIgMHgxNiAnXlYnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjMgMHgxNyAnXlcnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjUgMHgxOSAnXlknICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjYgMHgxYSAnXlonICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjcgMHgxYiAnXlsnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjggMHgxYyAnXlwnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMjkgMHgxZCAnXl0nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDI0LCAvKiAwMDEwMDEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzAgMHgxZSAnXl4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzEgMHgxZiAnXl8nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzIgMHgyMCAnICcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDM0IDB4MjIgJyInICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MjQsIC8qIDAwMTAwMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzUgMHgyMyAnIycgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzZSwgLyogMDAxMTExMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDM3IDB4MjUgJyUnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogMzggMHgyNiAnJicgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQwIDB4MjggJygnICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDEgMHgyOSAnKScgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0MiAweDJhICcqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQzIDB4MmIgJysnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDQgMHgyYyAnLCcgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisKKwkvKiA0NSAweDJkICctJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQ2IDB4MmUgJy4nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNDcgMHgyZiAnLycgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDgwLCAvKiAxMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDQ5IDB4MzEgJzEnICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTAgMHgzMiAnMicgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDFjLCAvKiAwMDAxMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDUyIDB4MzQgJzQnICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTMgMHgzNSAnNScgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDU1IDB4MzcgJzcnICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTYgMHgzOCAnOCcgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDU4IDB4M2EgJzonICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNTkgMHgzYiAnOycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisKKwkvKiA2MCAweDNjICc8JyAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDYxIDB4M2QgJz0nICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNjIgMHgzZSAnPicgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2MyAweDNmICc/JyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDY0IDB4NDAgJ0AnICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhkZSwgLyogMTEwMTExMTAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNjUgMHg0MSAnQScgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDY3IDB4NDMgJ0MnICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNjggMHg0NCAnRCcgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHg2MiwgLyogMDExMDAwMTAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2OCwgLyogMDExMDEwMDAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDcwIDB4NDYgJ0YnICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjgsIC8qIDAxMTAxMDAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDY4LCAvKiAwMTEwMTAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzEgMHg0NyAnRycgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4Y2UsIC8qIDExMDAxMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNhLCAvKiAwMDExMTAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDczIDB4NDkgJ0knICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzQgMHg0YSAnSicgKi8KKwkweDFlLCAvKiAwMDAxMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3NSAweDRiICdLJyAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDc2IDB4NGMgJ0wnICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYyLCAvKiAwMTEwMDAxMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogNzcgMHg0ZCAnTScgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZWUsIC8qIDExMTAxMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA3OCAweDRlICdOJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4ZGUsIC8qIDExMDExMTEwICovCisJMHhjZSwgLyogMTEwMDExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDc5IDB4NGYgJ08nICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODAgMHg1MCAnUCcgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGNlLCAvKiAxMTAwMTExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwZSwgLyogMDAwMDExMTAgKi8KKworCS8qIDgyIDB4NTIgJ1InICovCisJMHhmYywgLyogMTExMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODMgMHg1MyAnUycgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweDVhLCAvKiAwMTAxMTAxMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDg1IDB4NTUgJ1UnICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODYgMHg1NiAnVicgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDg4IDB4NTggJ1gnICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogODkgMHg1OSAnWScgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MCAweDVhICdaJyAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDhjLCAvKiAxMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMiwgLyogMDAxMTAwMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDkxIDB4NWIgJ1snICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogOTIgMHg1YyAnXCcgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDAyLCAvKiAwMDAwMDAxMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5MyAweDVkICddJyAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDk0IDB4NWUgJ14nICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogOTUgMHg1ZiAnXycgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDk3IDB4NjEgJ2EnICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCisJLyogOTggMHg2MiAnYicgKi8KKwkweGUwLCAvKiAxMTEwMDAwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMCAweDY0ICdkJyAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMSAweDY1ICdlJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwMyAweDY3ICdnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKworCS8qIDEwNCAweDY4ICdoJyAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwNiAweDZhICdqJyAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKworCS8qIDEwNyAweDZiICdrJyAqLworCTB4ZTAsIC8qIDExMTAwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZjICdsJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEwOSAweDZkICdtJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGVjLCAvKiAxMTEwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGQ2LCAvKiAxMTAxMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMCAweDZlICduJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZmICdvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExMiAweDcwICdwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKworCS8qIDExMyAweDcxICdxJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxZSwgLyogMDAwMTExMTAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNSAweDczICdzJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNiAweDc0ICd0JyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweGZjLCAvKiAxMTExMTEwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MWMsIC8qIDAwMDExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExOCAweDc2ICd2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDExOSAweDc3ICd3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZDYsIC8qIDExMDEwMTEwICovCisJMHhkNiwgLyogMTEwMTAxMTAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMSAweDc5ICd5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmYywgLyogMTExMTExMDAgKi8KKworCS8qIDEyMiAweDdhICd6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4NGMsIC8qIDAxMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMyLCAvKiAwMDExMDAxMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdiICd7JyAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNCAweDdjICd8JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNSAweDdkICd9JyAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdlICd+JyAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyNyAweDdmICd/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxMCwgLyogMDAwMTAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEyOCAweDgwICeAJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3OCwgLyogMDExMTEwMDAgKi8KKworCS8qIDEyOSAweDgxICeBJyAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMCAweDgyICeCJyAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMSAweDgzICeDJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg4MiwgLyogMTAwMDAwMTAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICeEJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzMyAweDg1ICeFJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNCAweDg2ICeGJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICeHJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKworCS8qIDEzNiAweDg4ICeIJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg4MiwgLyogMTAwMDAwMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzNyAweDg5ICeJJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhhICeKJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDEzOSAweDhiICeLJyAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MCAweDhjICeMJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg4MiwgLyogMTAwMDAwMTAgKi8KKwkweDM4LCAvKiAwMDExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhkICeNJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MiAweDhlICeOJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0MyAweDhmICePJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICeQJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NSAweDkxICeRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NiAweDkyICeSJyAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2UsIC8qIDExMDAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICeTJyAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHg4MiwgLyogMTAwMDAwMTAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0OCAweDk0ICeUJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE0OSAweDk1ICeVJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICeWJyAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHg4NCwgLyogMTAwMDAxMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MSAweDk3ICeXJyAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1MiAweDk4ICeYJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmYywgLyogMTExMTExMDAgKi8KKworCS8qIDE1MyAweDk5ICeZJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgzOCwgLyogMDAxMTEwMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NCAweDlhICeaJyAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NSAweDliICebJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE1NiAweDljICecJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDY0LCAvKiAwMTEwMDEwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4ZmMsIC8qIDExMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE1NyAweDlkICedJyAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE1OCAweDllICeeJyAqLworCTB4ZjgsIC8qIDExMTExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4ZmEsIC8qIDExMTExMDEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGNmLCAvKiAxMTAwMTExMSAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNywgLyogMTEwMDAxMTEgKi8KKworCS8qIDE1OSAweDlmICefJyAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MCAweGEwICegJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDc4LCAvKiAwMTExMTAwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MSAweGExICehJyAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MiAweGEyICeiJyAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2MyAweGEzICejJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NCAweGE0ICekJyAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NSAweGE1ICelJyAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHhkYywgLyogMTEwMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZTYsIC8qIDExMTAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweGRlLCAvKiAxMTAxMTExMCAqLworCTB4Y2UsIC8qIDExMDAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NiAweGE2ICemJyAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2NyAweGE3ICenJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdjLCAvKiAwMTExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OCAweGE4ICeoJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYzLCAvKiAwMTEwMDAxMSAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE2OSAweGE5ICepJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MCAweGFhICeqJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKwkweDA2LCAvKiAwMDAwMDExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3MSAweGFiICerJyAqLworCTB4NjMsIC8qIDAxMTAwMDExICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgzMywgLyogMDAxMTAwMTEgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKworCS8qIDE3MiAweGFjICesJyAqLworCTB4NjMsIC8qIDAxMTAwMDExICovCisJMHhlNiwgLyogMTExMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4N2EsIC8qIDAxMTExMDEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDZhLCAvKiAwMTEwMTAxMCAqLworCTB4ZGYsIC8qIDExMDExMTExICovCisJMHgwNiwgLyogMDAwMDAxMTAgKi8KKworCS8qIDE3MyAweGFkICetJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NCAweGFlICeuJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzMywgLyogMDAxMTAwMTEgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDMzLCAvKiAwMDExMDAxMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NSAweGFmICevJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4MzMsIC8qIDAwMTEwMDExICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE3NiAweGIwICewJyAqLworCTB4MjIsIC8qIDAwMTAwMDEwICovCisJMHg4OCwgLyogMTAwMDEwMDAgKi8KKwkweDIyLCAvKiAwMDEwMDAxMCAqLworCTB4ODgsIC8qIDEwMDAxMDAwICovCisJMHgyMiwgLyogMDAxMDAwMTAgKi8KKwkweDg4LCAvKiAxMDAwMTAwMCAqLworCTB4MjIsIC8qIDAwMTAwMDEwICovCisJMHg4OCwgLyogMTAwMDEwMDAgKi8KKworCS8qIDE3NyAweGIxICexJyAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKwkweDU1LCAvKiAwMTAxMDEwMSAqLworCTB4YWEsIC8qIDEwMTAxMDEwICovCisJMHg1NSwgLyogMDEwMTAxMDEgKi8KKwkweGFhLCAvKiAxMDEwMTAxMCAqLworCTB4NTUsIC8qIDAxMDEwMTAxICovCisJMHhhYSwgLyogMTAxMDEwMTAgKi8KKworCS8qIDE3OCAweGIyICeyJyAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKwkweDc3LCAvKiAwMTExMDExMSAqLworCTB4ZGQsIC8qIDExMDExMTAxICovCisJMHg3NywgLyogMDExMTAxMTEgKi8KKwkweGRkLCAvKiAxMTAxMTEwMSAqLworCTB4NzcsIC8qIDAxMTEwMTExICovCisJMHhkZCwgLyogMTEwMTExMDEgKi8KKworCS8qIDE3OSAweGIzICezJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4MCAweGI0ICe0JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4MSAweGI1ICe1JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4MiAweGI2ICe2JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4MyAweGI3ICe3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NCAweGI4ICe4JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE4NSAweGI5ICe5JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NiAweGJhICe6JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4NyAweGJiICe7JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmNiwgLyogMTExMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDE4OCAweGJjICe8JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY2LCAvKiAxMTExMDExMCAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE4OSAweGJkICe9JyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MCAweGJlICe+JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGY4LCAvKiAxMTExMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MSAweGJmICe/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5MiAweGMwICfAJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5MyAweGMxICfBJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5NCAweGMyICfCJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5NSAweGMzICfDJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5NiAweGM0ICfEJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDE5NyAweGM1ICfFJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5OCAweGM2ICfGJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDE5OSAweGM3ICfHJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwMCAweGM4ICfIJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMSAweGM5ICfJJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNmLCAvKiAwMDExMTExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwMiAweGNhICfKJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwMyAweGNiICfLJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNCAweGNjICfMJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM3LCAvKiAwMDExMDExMSAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgzNywgLyogMDAxMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNSAweGNkICfNJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwNiAweGNlICfOJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweGY3LCAvKiAxMTExMDExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmNywgLyogMTExMTAxMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIwNyAweGNmICfPJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwOCAweGQwICfQJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIwOSAweGQxICfRJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxMCAweGQyICfSJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIxMSAweGQzICfTJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMiAweGQ0ICfUJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxMyAweGQ1ICfVJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDFmLCAvKiAwMDAxMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxNCAweGQ2ICfWJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgzZiwgLyogMDAxMTExMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIxNSAweGQ3ICfXJyAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKworCS8qIDIxNiAweGQ4ICfYJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxNyAweGQ5ICfZJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHhmOCwgLyogMTExMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIxOCAweGRhICfaJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxZiwgLyogMDAwMTExMTEgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDIxOSAweGRiICfbJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDIyMCAweGRjICfcJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKworCS8qIDIyMSAweGRkICfdJyAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKwkweGYwLCAvKiAxMTExMDAwMCAqLworCTB4ZjAsIC8qIDExMTEwMDAwICovCisJMHhmMCwgLyogMTExMTAwMDAgKi8KKworCS8qIDIyMiAweGRlICfeJyAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKwkweDBmLCAvKiAwMDAwMTExMSAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwZiwgLyogMDAwMDExMTEgKi8KKworCS8qIDIyMyAweGRmICffJyAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHhmZiwgLyogMTExMTExMTEgKi8KKwkweGZmLCAvKiAxMTExMTExMSAqLworCTB4ZmYsIC8qIDExMTExMTExICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNCAweGUwICfgJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDc2LCAvKiAwMTExMDExMCAqLworCTB4ZGMsIC8qIDExMDExMTAwICovCisJMHhjOCwgLyogMTEwMDEwMDAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4NzYsIC8qIDAxMTEwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNSAweGUxICfhJyAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGNjLCAvKiAxMTAwMTEwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhjYywgLyogMTEwMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4Y2MsIC8qIDExMDAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNiAweGUyICfiJyAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKwkweGMwLCAvKiAxMTAwMDAwMCAqLworCTB4YzAsIC8qIDExMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyNyAweGUzICfjJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOCAweGU0ICfkJyAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIyOSAweGU1ICflJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHhkOCwgLyogMTEwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4NzAsIC8qIDAxMTEwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMCAweGU2ICfmJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4N2MsIC8qIDAxMTExMTAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKworCS8qIDIzMSAweGU3ICfnJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzMiAweGU4ICfoJyAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4NjYsIC8qIDAxMTAwMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHg3ZSwgLyogMDExMTExMTAgKi8KKworCS8qIDIzMyAweGU5ICfpJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNCAweGVhICfqJyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4ZWUsIC8qIDExMTAxMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNSAweGViICfrJyAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4M2UsIC8qIDAwMTExMTEwICovCisJMHg2NiwgLyogMDExMDAxMTAgKi8KKwkweDY2LCAvKiAwMTEwMDExMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNiAweGVjICfsJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzNyAweGVkICftJyAqLworCTB4MDYsIC8qIDAwMDAwMTEwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4ZGIsIC8qIDExMDExMDExICovCisJMHhkYiwgLyogMTEwMTEwMTEgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4NjAsIC8qIDAxMTAwMDAwICovCisJMHhjMCwgLyogMTEwMDAwMDAgKi8KKworCS8qIDIzOCAweGVlICfuJyAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDYwLCAvKiAwMTEwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHg2MCwgLyogMDExMDAwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MWUsIC8qIDAwMDExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDIzOSAweGVmICfvJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHhjNiwgLyogMTEwMDAxMTAgKi8KKwkweGM2LCAvKiAxMTAwMDExMCAqLworCTB4YzYsIC8qIDExMDAwMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MCAweGYwICfwJyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHhmZSwgLyogMTExMTExMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4ZmUsIC8qIDExMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweGZlLCAvKiAxMTExMTExMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MSAweGYxICfxJyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDdlLCAvKiAwMTExMTExMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MiAweGYyICfyJyAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgzMCwgLyogMDAxMTAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0MyAweGYzICfzJyAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDMwLCAvKiAwMDExMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NCAweGY0ICf0JyAqLworCTB4MGUsIC8qIDAwMDAxMTEwICovCisJMHgxYiwgLyogMDAwMTEwMTEgKi8KKwkweDFiLCAvKiAwMDAxMTAxMSAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKworCS8qIDI0NSAweGY1ICf1JyAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweGQ4LCAvKiAxMTAxMTAwMCAqLworCTB4ZDgsIC8qIDExMDExMDAwICovCisJMHg3MCwgLyogMDExMTAwMDAgKi8KKworCS8qIDI0NiAweGY2ICf2JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4N2UsIC8qIDAxMTExMTEwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0NyAweGY3ICf3JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHg3NiwgLyogMDExMTAxMTAgKi8KKwkweGRjLCAvKiAxMTAxMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OCAweGY4ICf4JyAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHg2YywgLyogMDExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4MzgsIC8qIDAwMTExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI0OSAweGY5ICf5JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgxOCwgLyogMDAwMTEwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MCAweGZhICf6JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MTgsIC8qIDAwMDExMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MSAweGZiICf7JyAqLworCTB4MGYsIC8qIDAwMDAxMTExICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDBjLCAvKiAwMDAwMTEwMCAqLworCTB4MGMsIC8qIDAwMDAxMTAwICovCisJMHhlYywgLyogMTExMDExMDAgKi8KKwkweDZjLCAvKiAwMTEwMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgxYywgLyogMDAwMTExMDAgKi8KKworCS8qIDI1MiAweGZjICf8JyAqLworCTB4NmMsIC8qIDAxMTAxMTAwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDM2LCAvKiAwMDExMDExMCAqLworCTB4MzYsIC8qIDAwMTEwMTEwICovCisJMHgzNiwgLyogMDAxMTAxMTAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1MyAweGZkICf9JyAqLworCTB4NzgsIC8qIDAxMTExMDAwICovCisJMHgwYywgLyogMDAwMDExMDAgKi8KKwkweDE4LCAvKiAwMDAxMTAwMCAqLworCTB4MzAsIC8qIDAwMTEwMDAwICovCisJMHg3YywgLyogMDExMTExMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NCAweGZlICf+JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4M2MsIC8qIDAwMTExMTAwICovCisJMHgzYywgLyogMDAxMTExMDAgKi8KKwkweDNjLCAvKiAwMDExMTEwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworCS8qIDI1NSAweGZmICf/JyAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKwkweDAwLCAvKiAwMDAwMDAwMCAqLworCTB4MDAsIC8qIDAwMDAwMDAwICovCisJMHgwMCwgLyogMDAwMDAwMDAgKi8KKworfTsKKworCitjb25zdCBzdHJ1Y3QgZm9udF9kZXNjIGZvbnRfdmdhXzh4OCA9IHsKKwkuaWR4CT0gVkdBOHg4X0lEWCwKKwkubmFtZQk9ICJWR0E4eDgiLAorCS53aWR0aAk9IDgsCisJLmhlaWdodAk9IDgsCisJLmRhdGEJPSBmb250ZGF0YV84eDgsCisJLnByZWYJPSAwLAorfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfYWNvcm5fOHg4LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X2Fjb3JuXzh4OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZjBlODUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X2Fjb3JuXzh4OC5jCkBAIC0wLDAgKzEsMjc2IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyogQWNvcm4tbGlrZSBmb250IGRlZmluaXRpb24sIHdpdGggUEMgZ3JhcGhpY3MgY2hhcmFjdGVycyAqLworCisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhY29ybmRhdGFfOHg4W10gPSB7CisvKiAwMCAqLyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogXkAgKi8KKy8qIDAxICovICAweDdlLCAweDgxLCAweGE1LCAweDgxLCAweGJkLCAweDk5LCAweDgxLCAweDdlLCAvKiBeQSAqLworLyogMDIgKi8gIDB4N2UsIDB4ZmYsIDB4YmQsIDB4ZmYsIDB4YzMsIDB4ZTcsIDB4ZmYsIDB4N2UsIC8qIF5CICovCisvKiAwMyAqLyAgMHg2YywgMHhmZSwgMHhmZSwgMHhmZSwgMHg3YywgMHgzOCwgMHgxMCwgMHgwMCwgLyogXkMgKi8KKy8qIDA0ICovICAweDEwLCAweDM4LCAweDdjLCAweGZlLCAweDdjLCAweDM4LCAweDEwLCAweDAwLCAvKiBeRCAqLworLyogMDUgKi8gIDB4MDAsIDB4MTgsIDB4M2MsIDB4ZTcsIDB4ZTcsIDB4M2MsIDB4MTgsIDB4MDAsIC8qIF5FICovCisvKiAwNiAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDA3ICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMDggKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAwOSAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDBBICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMEIgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAwQyAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDBEICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMEUgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAwRiAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDEwICovICAweDAwLCAweDYwLCAweDc4LCAweDdlLCAweDdlLCAweDc4LCAweDYwLCAweDAwLCAvKiB8PiAqLworLyogMTEgKi8gIDB4MDAsIDB4MDYsIDB4MWUsIDB4N2UsIDB4N2UsIDB4MWUsIDB4MDYsIDB4MDAsIC8qIDx8ICovCisvKiAxMiAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDEzICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMTQgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAxNSAqLyAgMHgzYywgMHg2MCwgMHgzYywgMHg2NiwgMHgzYywgMHgwNiwgMHgzYywgMHgwMCwKKy8qIDE2ICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMTcgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAxOCAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDE5ICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMUEgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAxQiAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIDFDICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogMUQgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiAxRSAqLyAgMHgwMCwgMHgxOCwgMHgxOCwgMHgzYywgMHgzYywgMHg3ZSwgMHg3ZSwgMHgwMCwgLyogL1wgKi8KKy8qIDFGICovICAweDAwLCAweDdlLCAweDdlLCAweDNjLCAweDNjLCAweDE4LCAweDE4LCAweDAwLCAvKiBcLyAqLworLyogMjAgKi8gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qICAgKi8KKy8qIDIxICovICAweDE4LCAweDNjLCAweDNjLCAweDE4LCAweDE4LCAweDAwLCAweDE4LCAweDAwLCAvKiAhICovCisvKiAyMiAqLyAgMHg2QywgMHg2QywgMHg2QywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogIiAqLworLyogMjMgKi8gIDB4MzYsIDB4MzYsIDB4N0YsIDB4MzYsIDB4N0YsIDB4MzYsIDB4MzYsIDB4MDAsIC8qICMgKi8KKy8qIDI0ICovICAweDBDLCAweDNGLCAweDY4LCAweDNFLCAweDBCLCAweDdFLCAweDE4LCAweDAwLCAvKiAkICovCisvKiAyNSAqLyAgMHg2MCwgMHg2NiwgMHgwQywgMHgxOCwgMHgzMCwgMHg2NiwgMHgwNiwgMHgwMCwgLyogJSAqLworLyogMjYgKi8gIDB4MzgsIDB4NkMsIDB4NkMsIDB4MzgsIDB4NkQsIDB4NjYsIDB4M0IsIDB4MDAsIC8qICYgKi8KKy8qIDI3ICovICAweDE4LCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAnICovCisvKiAyOCAqLyAgMHgwQywgMHgxOCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgxOCwgMHgwQywgMHgwMCwgLyogKCAqLworLyogMjkgKi8gIDB4MzAsIDB4MTgsIDB4MEMsIDB4MEMsIDB4MEMsIDB4MTgsIDB4MzAsIDB4MDAsIC8qICkgKi8KKy8qIDJBICovICAweDAwLCAweDE4LCAweDdFLCAweDNDLCAweDdFLCAweDE4LCAweDAwLCAweDAwLCAvKiAqICovCisvKiAyQiAqLyAgMHgwMCwgMHgxOCwgMHgxOCwgMHg3RSwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgLyogKyAqLworLyogMkMgKi8gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsIC8qICwgKi8KKy8qIDJEICovICAweDAwLCAweDAwLCAweDAwLCAweDdFLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAtICovCisvKiAyRSAqLyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgLyogLiAqLworLyogMkYgKi8gIDB4MDAsIDB4MDYsIDB4MEMsIDB4MTgsIDB4MzAsIDB4NjAsIDB4MDAsIDB4MDAsIC8qIC8gKi8KKy8qIDMwICovICAweDNDLCAweDY2LCAweDZFLCAweDdFLCAweDc2LCAweDY2LCAweDNDLCAweDAwLCAvKiAwICovCisvKiAzMSAqLyAgMHgxOCwgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHg3RSwgMHgwMCwgLyogMSAqLworLyogMzIgKi8gIDB4M0MsIDB4NjYsIDB4MDYsIDB4MEMsIDB4MTgsIDB4MzAsIDB4N0UsIDB4MDAsIC8qIDIgKi8KKy8qIDMzICovICAweDNDLCAweDY2LCAweDA2LCAweDFDLCAweDA2LCAweDY2LCAweDNDLCAweDAwLCAvKiAzICovCisvKiAzNCAqLyAgMHgwQywgMHgxQywgMHgzQywgMHg2QywgMHg3RSwgMHgwQywgMHgwQywgMHgwMCwgLyogNCAqLworLyogMzUgKi8gIDB4N0UsIDB4NjAsIDB4N0MsIDB4MDYsIDB4MDYsIDB4NjYsIDB4M0MsIDB4MDAsIC8qIDUgKi8KKy8qIDM2ICovICAweDFDLCAweDMwLCAweDYwLCAweDdDLCAweDY2LCAweDY2LCAweDNDLCAweDAwLCAvKiA2ICovCisvKiAzNyAqLyAgMHg3RSwgMHgwNiwgMHgwQywgMHgxOCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgwMCwgLyogNyAqLworLyogMzggKi8gIDB4M0MsIDB4NjYsIDB4NjYsIDB4M0MsIDB4NjYsIDB4NjYsIDB4M0MsIDB4MDAsIC8qIDggKi8KKy8qIDM5ICovICAweDNDLCAweDY2LCAweDY2LCAweDNFLCAweDA2LCAweDBDLCAweDM4LCAweDAwLCAvKiA5ICovCisvKiAzQSAqLyAgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgLyogOiAqLworLyogM0IgKi8gIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsIC8qIDsgKi8KKy8qIDNDICovICAweDBDLCAweDE4LCAweDMwLCAweDYwLCAweDMwLCAweDE4LCAweDBDLCAweDAwLCAvKiA8ICovCisvKiAzRCAqLyAgMHgwMCwgMHgwMCwgMHg3RSwgMHgwMCwgMHg3RSwgMHgwMCwgMHgwMCwgMHgwMCwgLyogPSAqLyAKKy8qIDNFICovICAweDMwLCAweDE4LCAweDBDLCAweDA2LCAweDBDLCAweDE4LCAweDMwLCAweDAwLCAvKiA+ICovCisvKiAzRiAqLyAgMHgzQywgMHg2NiwgMHgwQywgMHgxOCwgMHgxOCwgMHgwMCwgMHgxOCwgMHgwMCwgLyogPyAqLworLyogNDAgKi8gIDB4M0MsIDB4NjYsIDB4NkUsIDB4NkEsIDB4NkUsIDB4NjAsIDB4M0MsIDB4MDAsIC8qIEAgKi8KKy8qIDQxICovICAweDNDLCAweDY2LCAweDY2LCAweDdFLCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAvKiBBICovCisvKiA0MiAqLyAgMHg3QywgMHg2NiwgMHg2NiwgMHg3QywgMHg2NiwgMHg2NiwgMHg3QywgMHgwMCwgLyogQiAqLworLyogNDMgKi8gIDB4M0MsIDB4NjYsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjYsIDB4M0MsIDB4MDAsIC8qIEMgKi8KKy8qIDQ0ICovICAweDc4LCAweDZDLCAweDY2LCAweDY2LCAweDY2LCAweDZDLCAweDc4LCAweDAwLCAvKiBEICovCisvKiA0NSAqLyAgMHg3RSwgMHg2MCwgMHg2MCwgMHg3QywgMHg2MCwgMHg2MCwgMHg3RSwgMHgwMCwgLyogRSAqLworLyogNDYgKi8gIDB4N0UsIDB4NjAsIDB4NjAsIDB4N0MsIDB4NjAsIDB4NjAsIDB4NjAsIDB4MDAsIC8qIEYgKi8KKy8qIDQ3ICovICAweDNDLCAweDY2LCAweDYwLCAweDZFLCAweDY2LCAweDY2LCAweDNDLCAweDAwLCAvKiBHICovCisvKiA0OCAqLyAgMHg2NiwgMHg2NiwgMHg2NiwgMHg3RSwgMHg2NiwgMHg2NiwgMHg2NiwgMHgwMCwgLyogSCAqLworLyogNDkgKi8gIDB4N0UsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4N0UsIDB4MDAsIC8qIEkgKi8KKy8qIDRBICovICAweDNFLCAweDBDLCAweDBDLCAweDBDLCAweDBDLCAweDZDLCAweDM4LCAweDAwLCAvKiBKICovCisvKiA0QiAqLyAgMHg2NiwgMHg2QywgMHg3OCwgMHg3MCwgMHg3OCwgMHg2QywgMHg2NiwgMHgwMCwgLyogSyAqLworLyogNEMgKi8gIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4N0UsIDB4MDAsIC8qIEwgKi8KKy8qIDREICovICAweDYzLCAweDc3LCAweDdGLCAweDZCLCAweDZCLCAweDYzLCAweDYzLCAweDAwLCAvKiBNICovCisvKiA0RSAqLyAgMHg2NiwgMHg2NiwgMHg3NiwgMHg3RSwgMHg2RSwgMHg2NiwgMHg2NiwgMHgwMCwgLyogTiAqLworLyogNEYgKi8gIDB4M0MsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M0MsIDB4MDAsIC8qIE8gKi8KKy8qIDUwICovICAweDdDLCAweDY2LCAweDY2LCAweDdDLCAweDYwLCAweDYwLCAweDYwLCAweDAwLCAvKiBQICovCisvKiA1MSAqLyAgMHgzQywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2QSwgMHg2QywgMHgzNiwgMHgwMCwgLyogUSAqLworLyogNTIgKi8gIDB4N0MsIDB4NjYsIDB4NjYsIDB4N0MsIDB4NkMsIDB4NjYsIDB4NjYsIDB4MDAsIC8qIFIgKi8KKy8qIDUzICovICAweDNDLCAweDY2LCAweDYwLCAweDNDLCAweDA2LCAweDY2LCAweDNDLCAweDAwLCAvKiBTICovCisvKiA1NCAqLyAgMHg3RSwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwMCwgLyogVCAqLworLyogNTUgKi8gIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M0MsIDB4MDAsIC8qIFUgKi8KKy8qIDU2ICovICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDNDLCAweDE4LCAweDAwLCAvKiBWICovCisvKiA1NyAqLyAgMHg2MywgMHg2MywgMHg2QiwgMHg2QiwgMHg3RiwgMHg3NywgMHg2MywgMHgwMCwgLyogVyAqLworLyogNTggKi8gIDB4NjYsIDB4NjYsIDB4M0MsIDB4MTgsIDB4M0MsIDB4NjYsIDB4NjYsIDB4MDAsIC8qIFggKi8KKy8qIDU5ICovICAweDY2LCAweDY2LCAweDY2LCAweDNDLCAweDE4LCAweDE4LCAweDE4LCAweDAwLCAvKiBZICovCisvKiA1QSAqLyAgMHg3RSwgMHgwNiwgMHgwQywgMHgxOCwgMHgzMCwgMHg2MCwgMHg3RSwgMHgwMCwgLyogWiAqLworLyogNUIgKi8gIDB4N0MsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4NjAsIDB4N0MsIDB4MDAsIC8qIFsgKi8KKy8qIDVDICovICAweDAwLCAweDYwLCAweDMwLCAweDE4LCAweDBDLCAweDA2LCAweDAwLCAweDAwLCAvKiBcICovCisvKiA1RCAqLyAgMHgzRSwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgzRSwgMHgwMCwgLyogXSAqLworLyogNUUgKi8gIDB4M0MsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIF4gKi8KKy8qIDVGICovICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAvKiBfICovCisvKiA2MCAqLyAgMHgzMCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogYCAqLworLyogNjEgKi8gIDB4MDAsIDB4MDAsIDB4M0MsIDB4MDYsIDB4M0UsIDB4NjYsIDB4M0UsIDB4MDAsIC8qIGEgKi8KKy8qIDYyICovICAweDYwLCAweDYwLCAweDdDLCAweDY2LCAweDY2LCAweDY2LCAweDdDLCAweDAwLCAvKiBiICovCisvKiA2MyAqLyAgMHgwMCwgMHgwMCwgMHgzQywgMHg2NiwgMHg2MCwgMHg2NiwgMHgzQywgMHgwMCwgLyogYyAqLworLyogNjQgKi8gIDB4MDYsIDB4MDYsIDB4M0UsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M0UsIDB4MDAsIC8qIGQgKi8KKy8qIDY1ICovICAweDAwLCAweDAwLCAweDNDLCAweDY2LCAweDdFLCAweDYwLCAweDNDLCAweDAwLCAvKiBlICovCisvKiA2NiAqLyAgMHgxQywgMHgzMCwgMHgzMCwgMHg3QywgMHgzMCwgMHgzMCwgMHgzMCwgMHgwMCwgLyogZiAqLworLyogNjcgKi8gIDB4MDAsIDB4MDAsIDB4M0UsIDB4NjYsIDB4NjYsIDB4M0UsIDB4MDYsIDB4M0MsIC8qIGcgKi8KKy8qIDY4ICovICAweDYwLCAweDYwLCAweDdDLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAvKiBoICovCisvKiA2OSAqLyAgMHgxOCwgMHgwMCwgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzQywgMHgwMCwgLyogaSAqLworLyogNkEgKi8gIDB4MTgsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4NzAsIC8qIGogKi8KKy8qIDZCICovICAweDYwLCAweDYwLCAweDY2LCAweDZDLCAweDc4LCAweDZDLCAweDY2LCAweDAwLCAvKiBrICovCisvKiA2QyAqLyAgMHgzOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgzQywgMHgwMCwgLyogbCAqLworLyogNkQgKi8gIDB4MDAsIDB4MDAsIDB4MzYsIDB4N0YsIDB4NkIsIDB4NkIsIDB4NjMsIDB4MDAsIC8qIG0gKi8KKy8qIDZFICovICAweDAwLCAweDAwLCAweDdDLCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAvKiBuICovCisvKiA2RiAqLyAgMHgwMCwgMHgwMCwgMHgzQywgMHg2NiwgMHg2NiwgMHg2NiwgMHgzQywgMHgwMCwgLyogbyAqLworLyogNzAgKi8gIDB4MDAsIDB4MDAsIDB4N0MsIDB4NjYsIDB4NjYsIDB4N0MsIDB4NjAsIDB4NjAsIC8qIHAgKi8KKy8qIDcxICovICAweDAwLCAweDAwLCAweDNFLCAweDY2LCAweDY2LCAweDNFLCAweDA2LCAweDA3LCAvKiBxICovCisvKiA3MiAqLyAgMHgwMCwgMHgwMCwgMHg2QywgMHg3NiwgMHg2MCwgMHg2MCwgMHg2MCwgMHgwMCwgLyogciAqLworLyogNzMgKi8gIDB4MDAsIDB4MDAsIDB4M0UsIDB4NjAsIDB4M0MsIDB4MDYsIDB4N0MsIDB4MDAsIC8qIHMgKi8KKy8qIDc0ICovICAweDMwLCAweDMwLCAweDdDLCAweDMwLCAweDMwLCAweDMwLCAweDFDLCAweDAwLCAvKiB0ICovCisvKiA3NSAqLyAgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgzRSwgMHgwMCwgLyogdSAqLworLyogNzYgKi8gIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M0MsIDB4MTgsIDB4MDAsIC8qIHYgKi8KKy8qIDc3ICovICAweDAwLCAweDAwLCAweDYzLCAweDZCLCAweDZCLCAweDdGLCAweDM2LCAweDAwLCAvKiB3ICovCisvKiA3OCAqLyAgMHgwMCwgMHgwMCwgMHg2NiwgMHgzQywgMHgxOCwgMHgzQywgMHg2NiwgMHgwMCwgLyogeCAqLworLyogNzkgKi8gIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M0UsIDB4MDYsIDB4M0MsIC8qIHkgKi8KKy8qIDdBICovICAweDAwLCAweDAwLCAweDdFLCAweDBDLCAweDE4LCAweDMwLCAweDdFLCAweDAwLCAvKiB6ICovCisvKiA3QiAqLyAgMHgwQywgMHgxOCwgMHgxOCwgMHg3MCwgMHgxOCwgMHgxOCwgMHgwQywgMHgwMCwgLyogeyAqLworLyogN0MgKi8gIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MDAsIC8qIHwgKi8KKy8qIDdEICovICAweDMwLCAweDE4LCAweDE4LCAweDBFLCAweDE4LCAweDE4LCAweDMwLCAweDAwLCAvKiB9ICovCisvKiA3RSAqLyAgMHgzMSwgMHg2QiwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogfiAqLworLyogN0YgKi8gIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIC8qIH8gKi8KKy8qIDgwICovICAweDNjLCAweDY2LCAweDYwLCAweDYwLCAweDY2LCAweDNjLCAweDMwLCAweDYwLAorLyogODEgKi8gIDB4NjYsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2UsIDB4MDAsCisvKiA4MiAqLyAgMHgwYywgMHgxOCwgMHgzYywgMHg2NiwgMHg3ZSwgMHg2MCwgMHgzYywgMHgwMCwKKy8qIDgzICovICAweDE4LCAweDY2LCAweDNjLCAweDA2LCAweDNlLCAweDY2LCAweDNlLCAweDAwLAorLyogODQgKi8gIDB4NjYsIDB4MDAsIDB4M2MsIDB4MDYsIDB4M2UsIDB4NjYsIDB4M2UsIDB4MDAsCisvKiA4NSAqLyAgMHgzMCwgMHgxOCwgMHgzYywgMHgwNiwgMHgzZSwgMHg2NiwgMHgzZSwgMHgwMCwKKy8qIDg2ICovICAweDNjLCAweDY2LCAweDNjLCAweDA2LCAweDNlLCAweDY2LCAweDNlLCAweDAwLAorLyogODcgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4NjYsIDB4NjAsIDB4NjYsIDB4M2MsIDB4NjAsCisvKiA4OCAqLyAgMHgzYywgMHg2NiwgMHgzYywgMHg2NiwgMHg3ZSwgMHg2MCwgMHgzYywgMHgwMCwKKy8qIDg5ICovICAweDY2LCAweDAwLCAweDNjLCAweDY2LCAweDdlLCAweDYwLCAweDNjLCAweDAwLAorLyogOEEgKi8gIDB4MzAsIDB4MTgsIDB4M2MsIDB4NjYsIDB4N2UsIDB4NjAsIDB4M2MsIDB4MDAsCisvKiA4QiAqLyAgMHg2NiwgMHgwMCwgMHgwMCwgMHgzOCwgMHgxOCwgMHgxOCwgMHgzYywgMHgwMCwKKy8qIDhDICovICAweDNjLCAweDY2LCAweDAwLCAweDM4LCAweDE4LCAweDE4LCAweDNjLCAweDAwLAorLyogOEQgKi8gIDB4MzAsIDB4MTgsIDB4MDAsIDB4MzgsIDB4MTgsIDB4MTgsIDB4M2MsIDB4MDAsCisvKiA4RSAqLyAgMHg2NiwgMHg2NiwgMHgwMCwgMHgzYywgMHg2NiwgMHg3ZSwgMHg2NiwgMHgwMCwKKy8qIDhGICovICAweDE4LCAweDY2LCAweDAwLCAweDNjLCAweDY2LCAweDdlLCAweDY2LCAweDAwLAorLyogOTAgKi8gIDB4MGMsIDB4MTgsIDB4N2UsIDB4NjAsIDB4N2MsIDB4NjAsIDB4N2UsIDB4MDAsCisvKiA5MSAqLyAgMHgwMCwgMHgwMCwgMHgzZiwgMHgwZCwgMHgzZiwgMHg2YywgMHgzZiwgMHgwMCwKKy8qIDkyICovICAweDNmLCAweDY2LCAweDY2LCAweDdmLCAweDY2LCAweDY2LCAweDY3LCAweDAwLAorLyogOTMgKi8gIDB4M2MsIDB4NjYsIDB4MDAsIDB4M2MsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MDAsCisvKiA5NCAqLyAgMHg2NiwgMHgwMCwgMHgwMCwgMHgzYywgMHg2NiwgMHg2NiwgMHgzYywgMHgwMCwKKy8qIDk1ICovICAweDMwLCAweDE4LCAweDAwLCAweDNjLCAweDY2LCAweDY2LCAweDNjLCAweDAwLAorLyogOTYgKi8gIDB4M2MsIDB4NjYsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2UsIDB4MDAsCisvKiA5NyAqLyAgMHgzMCwgMHgxOCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHgzZSwgMHgwMCwKKy8qIDk4ICovICAweDY2LCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDNlLCAweDA2LCAweDNjLAorLyogOTkgKi8gIDB4NjYsIDB4MDAsIDB4M2MsIDB4NjYsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MDAsCisvKiA5QSAqLyAgMHg2NiwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgzYywgMHgwMCwKKy8qIDlCICovICAweDA4LCAweDNlLCAweDZiLCAweDY4LCAweDZiLCAweDNlLCAweDA4LCAweDAwLAorLyogOUMgKi8gIDB4MWMsIDB4MzYsIDB4MzAsIDB4N2MsIDB4MzAsIDB4MzAsIDB4N2UsIDB4MDAsCisvKiA5RCAqLyAgMHg2NiwgMHgzYywgMHgxOCwgMHgxOCwgMHg3ZSwgMHgxOCwgMHgxOCwgMHgwMCwKKy8qIDlFICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogOUYgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBBMCAqLyAgMHgwYywgMHgxOCwgMHgzYywgMHgwNiwgMHgzZSwgMHg2NiwgMHgzZSwgMHgwMCwKKy8qIEExICovICAweDBjLCAweDE4LCAweDAwLCAweDM4LCAweDE4LCAweDE4LCAweDNjLCAweDAwLAorLyogQTIgKi8gIDB4MGMsIDB4MTgsIDB4MDAsIDB4M2MsIDB4NjYsIDB4NjYsIDB4M2MsIDB4MDAsCisvKiBBMyAqLyAgMHgwYywgMHgxOCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHgzZSwgMHgwMCwKKy8qIEE0ICovICAweDM2LCAweDZjLCAweDAwLCAweDdjLCAweDY2LCAweDY2LCAweDY2LCAweDAwLAorLyogQTUgKi8gIDB4MzYsIDB4NmMsIDB4MDAsIDB4NjYsIDB4NzYsIDB4NmUsIDB4NjYsIDB4MDAsCisvKiBBNiAqLyAgMHgxYywgMHgwNiwgMHgxZSwgMHgzNiwgMHgxZSwgMHgwMCwgMHgzZSwgMHgwMCwKKy8qIEE3ICovICAweDFjLCAweDM2LCAweDM2LCAweDM2LCAweDFjLCAweDAwLCAweDNlLCAweDAwLAorLyogQTggKi8gIDB4MTgsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MzAsIDB4NjYsIDB4M2MsIDB4MDAsCisvKiBBOSAqLyAgMHg3ZSwgMHgwNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEFBICovICAweDdlLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyogQUIgKi8gIDB4NDAsIDB4YzAsIDB4NDAsIDB4NGYsIDB4NDEsIDB4MGYsIDB4MDgsIDB4MGYsCisvKiBBQyAqLyAgMHg0MCwgMHhjMCwgMHg0MCwgMHg0OCwgMHg0OCwgMHgwYSwgMHgwZiwgMHgwMiwKKy8qIEFEICovICAweDE4LCAweDAwLCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDAwLAorLyogQUUgKi8gIDB4MDAsIDB4MzMsIDB4NjYsIDB4Y2MsIDB4Y2MsIDB4NjYsIDB4MzMsIDB4MDAsCisvKiBBRiAqLyAgMHgwMCwgMHhjYywgMHg2NiwgMHgzMywgMHgzMywgMHg2NiwgMHhjYywgMHgwMCwKKy8qIEIwICovICAweDIyLCAweDg4LCAweDIyLCAweDg4LCAweDIyLCAweDg4LCAweDIyLCAweDg4LAorLyogQjEgKi8gIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsIDB4NTUsIDB4YWEsCisvKiBCMiAqLyAgMHhkZCwgMHg3NywgMHhkZCwgMHg3NywgMHhkZCwgMHg3NywgMHhkZCwgMHg3NywKKy8qIEIzICovICAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorLyogQjQgKi8gIDB4MTgsIDB4MTgsIDB4MTgsIDB4ZjgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisvKiBCNSAqLyAgMHgxOCwgMHgxOCwgMHhmOCwgMHgxOCwgMHhmOCwgMHgxOCwgMHgxOCwgMHgxOCwKKy8qIEI2ICovICAweDY2LCAweDY2LCAweDY2LCAweGU2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LAorLyogQjcgKi8gIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmUsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisvKiBCOCAqLyAgMHgwMCwgMHgwMCwgMHhmOCwgMHgxOCwgMHhmOCwgMHgxOCwgMHgxOCwgMHgxOCwKKy8qIEI5ICovICAweDY2LCAweDY2LCAweGU2LCAweDA2LCAweGU2LCAweDY2LCAweDY2LCAweDY2LAorLyogQkEgKi8gIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisvKiBCQiAqLyAgMHgwMCwgMHgwMCwgMHhmZSwgMHgwNiwgMHhlNiwgMHg2NiwgMHg2NiwgMHg2NiwKKy8qIEJDICovICAweDY2LCAweDY2LCAweGU2LCAweDA2LCAweGZlLCAweDAwLCAweDAwLCAweDAwLAorLyogQkQgKi8gIDB4NjYsIDB4NjYsIDB4NjYsIDB4ZmUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKiBCRSAqLyAgMHgxOCwgMHgxOCwgMHhmOCwgMHgxOCwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEJGICovICAweDAwLCAweDAwLCAweDAwLCAweGY4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorLyogQzAgKi8gIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisvKiBDMSAqLyAgMHgxOCwgMHgxOCwgMHgxOCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEMyICovICAweDAwLCAweDAwLCAweDAwLCAweGZmLCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorLyogQzMgKi8gIDB4MTgsIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisvKiBDNCAqLyAgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEM1ICovICAweDE4LCAweDE4LCAweDE4LCAweGZmLCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorLyogQzYgKi8gIDB4MTgsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsCisvKiBDNyAqLyAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NywgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKy8qIEM4ICovICAweDY2LCAweDY2LCAweDY3LCAweDYwLCAweDdmLCAweDAwLCAweDAwLCAweDAwLAorLyogQzkgKi8gIDB4MDAsIDB4MDAsIDB4N2YsIDB4NjAsIDB4NjcsIDB4NjYsIDB4NjYsIDB4NjYsCisvKiBDQSAqLyAgMHg2NiwgMHg2NiwgMHhlNywgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIENCICovICAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGU3LCAweDY2LCAweDY2LCAweDY2LAorLyogQ0MgKi8gIDB4NjYsIDB4NjYsIDB4NjcsIDB4NjAsIDB4NjcsIDB4NjYsIDB4NjYsIDB4NjYsCisvKiBDRCAqLyAgMHgwMCwgMHgwMCwgMHhmZiwgMHgwMCwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIENFICovICAweDY2LCAweDY2LCAweGU3LCAweDAwLCAweGU3LCAweDY2LCAweDY2LCAweDY2LAorLyogQ0YgKi8gIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsCisvKiBEMCAqLyAgMHg2NiwgMHg2NiwgMHg2NiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEQxICovICAweDAwLCAweDAwLCAweGZmLCAweDAwLCAweGZmLCAweDE4LCAweDE4LCAweDE4LAorLyogRDIgKi8gIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisvKiBEMyAqLyAgMHg2NiwgMHg2NiwgMHg2NiwgMHg3ZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEQ0ICovICAweDE4LCAweDE4LCAweDFmLCAweDE4LCAweDFmLCAweDAwLCAweDAwLCAweDAwLAorLyogRDUgKi8gIDB4MDAsIDB4MDAsIDB4MWYsIDB4MTgsIDB4MWYsIDB4MTgsIDB4MTgsIDB4MTgsCisvKiBENiAqLyAgMHgwMCwgMHgwMCwgMHgwMCwgMHg3ZiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKy8qIEQ3ICovICAweDY2LCAweDY2LCAweDY2LCAweGZmLCAweDY2LCAweDY2LCAweDY2LCAweDY2LAorLyogRDggKi8gIDB4MTgsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4ZmYsIDB4MTgsIDB4MTgsIDB4MTgsCisvKiBEOSAqLyAgMHgxOCwgMHgxOCwgMHgxOCwgMHhmOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIERBICovICAweDAwLCAweDAwLCAweDAwLCAweDFmLCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorLyogREIgKi8gIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsCisvKiBEQyAqLyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKy8qIEREICovICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorLyogREUgKi8gIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsCisvKiBERiAqLyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEUwICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRTEgKi8gIDB4M2MsIDB4NjYsIDB4NjYsIDB4NmMsIDB4NjYsIDB4NjYsIDB4NmMsIDB4YzAsCisvKiBFMiAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEUzICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRTQgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBFNSAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEU2ICovICAweDAwLCAweDAwLCAweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDNlLCAweDYwLAorLyogRTcgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBFOCAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEU5ICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRUEgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBFQiAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEVDICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRUQgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBFRSAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEVGICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRjAgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBGMSAqLyAgMHgxOCwgMHgxOCwgMHg3ZSwgMHgxOCwgMHgxOCwgMHgwMCwgMHg3ZSwgMHgwMCwKKy8qIEYyICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRjMgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBGNCAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEY1ICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRjYgKi8gIDB4MDAsIDB4MTgsIDB4MDAsIDB4ZmYsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MDAsCisvKiBGNyAqLyAgMHgwMCwgMHgwMCwgMHgzYywgMHgzYywgMHgzYywgMHgzYywgMHgwMCwgMHgwMCwKKy8qIEY4ICovICAweDNjLCAweDY2LCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorLyogRjkgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBGQSAqLyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEZCICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRkMgKi8gIDB4MDAsIDB4MDAsIDB4M2MsIDB4M2MsIDB4M2MsIDB4M2MsIDB4MDAsIDB4MDAsCisvKiBGRCAqLyAgMHgzOCwgMHgwNCwgMHgxOCwgMHgyMCwgMHgzYywgMHgwMCwgMHgwMCwgMHgwMCwKKy8qIEZFICovICAweDAwLCAweDAwLCAweDNjLCAweDNjLCAweDNjLCAweDNjLCAweDAwLCAweDAwLAorLyogRkYgKi8gIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK2NvbnN0IHN0cnVjdCBmb250X2Rlc2MgZm9udF9hY29ybl84eDggPSB7CisJLmlkeAk9IEFDT1JOOHg4X0lEWCwKKwkubmFtZQk9ICJBY29ybjh4OCIsCisJLndpZHRoCT0gOCwKKwkuaGVpZ2h0CT0gOCwKKwkuZGF0YQk9IGFjb3JuZGF0YV84eDgsCisjaWZkZWYgQ09ORklHX0FSQ0hfQUNPUk4KKwkucHJlZgk9IDIwLAorI2Vsc2UKKwkucHJlZgk9IDAsCisjZW5kaWYKK307CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X21pbmlfNHg2LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X21pbmlfNHg2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4Y2FhMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfbWluaV80eDYuYwpAQCAtMCwwICsxLDIxNTggQEAKKworLyogSGFuZCBjb21wb3NlZCAiTWludXNjdWxlIiA0eDYgZm9udCwgd2l0aCBiaW5hcnkgZGF0YSBnZW5lcmF0ZWQgdXNpbmcKKyAqIFBlcmwgc3R1Yi4KKyAqCisgKiBVc2UgJ3BlcmwgLXggbWluaV80eDYuYyA8IG1pbmlfNHg2LmMgPiBuZXdfdmVyc2lvbi5jJyB0byByZWdlbmVyYXRlCisgKiBiaW5hcnkgZGF0YS4KKyAqCisgKiBDcmVhdGVkIGJ5IEtlbm5ldGggQWxiYW5vd3NraS4KKyAqIE5vIHJpZ2h0cyByZXNlcnZlZCwgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4uCisgKgorICogVmVyc2lvbiAxLjAKKyAqLworCisvKgorCisjIS91c3IvYmluL3BlcmwgLXBuCisKK3N7KCgweCk/WzAtOWEtZkEtRl0rKSguKlxbKFtcKlwgXXs0fSlcXSl9eworCisJKCRudW0sJHBhdCwkYml0cykgPSAoJDEsJDMsJDQpOworCQorCSRiaXRzID1+IHMvKFteXHMwXSl8KC4pLyBkZWZpbmVkKCQxKSArIDAgL2dlOworCQorCSRudW0gPSBvcmQocGFjaygiQjgiLCAkYml0cykpOworCSRudW0gfD0gJG51bSA+PiA0OworCSRudW0gPSBzcHJpbnRmKCIweCUuMngiLCAkbnVtKTsKKwkKKwkjcHJpbnQgIiRudW0sJHBhdCwkYml0c1xuIjsKKwkKKwkkbnVtIC4gJHBhdDsKK31nZTsKKworX19FTkRfXzsKKyovCisKKy8qIE5vdGU6IGJpbmFyeSBkYXRhIGNvbnNpc3RzIG9mIG9uZSBieXRlIGZvciBlYWNoIHJvdyBvZiBlYWNoIGNoYXJhY3RlciB0b3AKKyAgIHRvIGJvdHRvbSwgY2hhcmFjdGVyIDAgdG8gY2hhcmFjdGVyIDI1NSwgc2l4IGJ5dGVzIHBlciBjaGFyYWN0ZXIuIEVhY2gKKyAgIGJ5dGUgY29udGFpbnMgdGhlIHNhbWUgZm91ciBjaGFyYWN0ZXIgYml0cyBpbiBib3RoIG55YmJsZXMuCisgICBNU0JpdCB0byBMU0JpdCA9IGxlZnQgdG8gcmlnaHQuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2ZvbnQuaD4KKworI2RlZmluZSBGT05UREFUQU1BWCAxNTM2CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZvbnRkYXRhX21pbmlfNHg2W0ZPTlREQVRBTUFYXSA9IHsKKworCS8qeyovCisJICAJLyogICBDaGFyIDA6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDE6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDI6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDM6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDQ6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDU6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDY6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDc6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDg6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDk6ICcgJyAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDEwOiAnJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTE6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTI6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTM6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTQ6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTU6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTY6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTc6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTg6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMTk6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjA6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjE6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjI6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjM6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjQ6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjU6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjY6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjc6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjg6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMjk6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzA6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzE6ICcgJyAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzI6ICcgJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzM6ICchJyAqLworCTB4NDQsCS8qPSAgWyAqICBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDQ0LAkvKj0gIFsgKiAgXSAgICAgICAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzQ6ICciJyAqLworCTB4YWEsCS8qPSAgWyogKiBdICAgICAgICovCisJMHhhYSwJLyo9ICBbKiAqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzU6ICcjJyAqLworCTB4YWEsCS8qPSAgWyogKiBdICAgICAgICovCisJMHhmZiwJLyo9ICBbKioqKl0gICAgICAgKi8KKwkweGZmLAkvKj0gIFsqKioqXSAgICAgICAqLworCTB4YWEsCS8qPSAgWyogKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzY6ICckJyAqLworCTB4NDQsCS8qPSAgWyAqICBdICAgICAgICovCisJMHg2NiwJLyo9ICBbICoqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4Y2MsCS8qPSAgWyoqICBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzc6ICclJyAqLworCTB4YWEsCS8qPSAgWyogKiBdICAgICAgICovCisJMHgyMiwJLyo9ICBbICAqIF0gICAgICAgKi8KKwkweDQ0LAkvKj0gIFsgKiAgXSAgICAgICAqLworCTB4ODgsCS8qPSAgWyogICBdICAgICAgICovCisJMHhhYSwJLyo9ICBbKiAqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzg6ICcmJyAqLworCTB4NjYsCS8qPSAgWyAqKiBdICAgICAgICovCisJMHg5OSwJLyo9ICBbKiAgKl0gICAgICAgKi8KKwkweDY2LAkvKj0gIFsgKiogXSAgICAgICAqLworCTB4YWEsCS8qPSAgWyogKiBdICAgICAgICovCisJMHhkZCwJLyo9ICBbKiogKl0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgMzk6ICcnJyAqLworCTB4MjIsCS8qPSAgWyAgKiBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDA6ICcoJyAqLworCTB4MjIsCS8qPSAgWyAgKiBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDQ0LAkvKj0gIFsgKiAgXSAgICAgICAqLworCTB4NDQsCS8qPSAgWyAqICBdICAgICAgICovCisJMHgyMiwJLyo9ICBbICAqIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDE6ICcpJyAqLworCTB4NDQsCS8qPSAgWyAqICBdICAgICAgICovCisJMHgyMiwJLyo9ICBbICAqIF0gICAgICAgKi8KKwkweDIyLAkvKj0gIFsgICogXSAgICAgICAqLworCTB4MjIsCS8qPSAgWyAgKiBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDI6ICcqJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHhlZSwJLyo9ICBbKioqIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4ZWUsCS8qPSAgWyoqKiBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDM6ICcrJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4NDQsCS8qPSAgWyAqICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDQ6ICcsJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCTB4NDQsCS8qPSAgWyAqICBdICAgICAgICovCisJMHg4OCwJLyo9ICBbKiAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDU6ICctJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweGVlLAkvKj0gIFsqKiogXSAgICAgICAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDY6ICcuJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHg0NCwJLyo9ICBbICogIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDc6ICcvJyAqLworCTB4MDAsCS8qPSAgWyAgICBdICAgICAgICovCisJMHgyMiwJLyo9ICBbICAqIF0gICAgICAgKi8KKwkweDQ0LAkvKj0gIFsgKiAgXSAgICAgICAqLworCTB4ODgsCS8qPSAgWyogICBdICAgICAgICovCisJMHgwMCwJLyo9ICBbICAgIF0gICAgICAgKi8KKwkweDAwLAkvKj0gIFsgICAgXSAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNDg6ICcwJyAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLworCSAgCS8qICAgQ2hhciA0OTogJzEnICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovCisJICAJLyogICBDaGFyIDUwOiAnMicgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8KKwkgIAkvKiAgIENoYXIgNTE6ICczJyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDUyOiAnNCcgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA1MzogJzUnICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNTQ6ICc2JyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDU1OiAnNycgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA1NjogJzgnICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNTc6ICc5JyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDU4OiAnOicgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA1OTogJzsnICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNjA6ICc8JyAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDYxOiAnPScgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA2MjogJz4nICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNjM6ICc/JyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDY0OiAnQCcgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA2NTogJ0EnICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNjY6ICdCJyAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDY3OiAnQycgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA2ODogJ0QnICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNjk6ICdFJyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDcwOiAnRicgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA3MTogJ0cnICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNzI6ICdIJyAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDczOiAnSScgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA3NDogJ0onICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNzU6ICdLJyAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDc2OiAnTCcgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA3NzogJ00nICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgNzg6ICdOJyAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDc5OiAnTycgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA4MDogJ1AnICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgODE6ICdRJyAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDgyOiAnUicgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA4MzogJ1MnICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgODQ6ICdUJyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDg1OiAnVScgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA4NjogJ1YnICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgODc6ICdXJyAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDg4OiAnWCcgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA4OTogJ1knICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgOTA6ICdaJyAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDkxOiAnWycgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA5MjogJ1wnICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgOTM6ICddJyAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDk0OiAnXicgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA5NTogJ18nICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgOTY6ICdgJyAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDk3OiAnYScgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciA5ODogJ2InICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgOTk6ICdjJyAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDEwMDogJ2QnICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTAxOiAnZScgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMDI6ICdmJyAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDEwMzogJ2cnICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTA0OiAnaCcgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMDU6ICdpJyAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDEwNjogJ2onICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTA3OiAnaycgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMDg6ICdsJyAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDEwOTogJ20nICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTEwOiAnbicgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMTE6ICdvJyAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDExMjogJ3AnICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTEzOiAncScgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMTQ6ICdyJyAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDExNTogJ3MnICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTE2OiAndCcgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMTc6ICd1JyAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDExODogJ3YnICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTE5OiAndycgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCS8qfSovCisJLyp7Ki8gCS8qICAgQ2hhciAxMjA6ICd4JyAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJLyp9Ki8KKwkvKnsqLyAJLyogICBDaGFyIDEyMTogJ3knICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTIyOiAneicgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTIzOiAneycgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTI0OiAnfCcgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTI1OiAnfScgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTI2OiAnficgKi8KKwkweDU1LAkvKj0gICBbICogKl0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTI3OiAnfycgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTI4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTI5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTMwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTMxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTMyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTMzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTM0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTM1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTM2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTM3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTM4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTM5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQ0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQ1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQ2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQ3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQ4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTQ5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTUwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTUxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTUyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTUzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTU0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTU1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTU2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTU3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTU4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTU5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTYwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTYxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTYyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTYzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTY0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTY1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTY2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTY3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTY4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTY5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTcwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTcxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTcyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTczOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTc0OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTc1OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTc2OiAgKi8KKwkweDg4LAkvKj0gICBbKiAgIF0gICAgICAgICovCisJMHgyMiwJLyo9ICAgWyAgKiBdICAgICAgICAqLworCTB4ODgsCS8qPSAgIFsqICAgXSAgICAgICAgKi8KKwkweDIyLAkvKj0gICBbICAqIF0gICAgICAgICovCisJMHg4OCwJLyo9ICAgWyogICBdICAgICAgICAqLworCTB4MjIsCS8qPSAgIFsgICogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTc3OiAgKi8KKwkweGFhLAkvKj0gICBbKiAqIF0gICAgICAgICovCisJMHg1NSwJLyo9ICAgWyAqICpdICAgICAgICAqLworCTB4YWEsCS8qPSAgIFsqICogXSAgICAgICAgKi8KKwkweDU1LAkvKj0gICBbICogKl0gICAgICAgICovCisJMHhhYSwJLyo9ICAgWyogKiBdICAgICAgICAqLworCTB4NTUsCS8qPSAgIFsgKiAqXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTc4OiAgKi8KKwkweGRkLAkvKj0gICBbKiogKl0gICAgICAgICovCisJMHhiYiwJLyo9ICAgWyogKipdICAgICAgICAqLworCTB4ZGQsCS8qPSAgIFsqKiAqXSAgICAgICAgKi8KKwkweGJiLAkvKj0gICBbKiAqKl0gICAgICAgICovCisJMHhkZCwJLyo9ICAgWyoqICpdICAgICAgICAqLworCTB4YmIsCS8qPSAgIFsqICoqXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTc5OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTgwOiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTgxOiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTgyOiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTgzOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTg0OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTg1OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTg2OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTg3OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTg4OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTg5OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTkwOiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTkxOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTkyOiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTkzOiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTk0OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTk1OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTk2OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTk3OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTk4OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDc3LAkvKj0gICBbICoqKl0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMTk5OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjAwOiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDc3LAkvKj0gICBbICoqKl0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjAxOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDc3LAkvKj0gICBbICoqKl0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjAyOiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjAzOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjA0OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDc3LAkvKj0gICBbICoqKl0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjA1OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjA2OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjA3OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjA4OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjA5OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjEwOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjExOiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjEyOiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDc3LAkvKj0gICBbICoqKl0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjEzOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDc3LAkvKj0gICBbICoqKl0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjE0OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjE1OiAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHg2NiwJLyo9ICAgWyAqKiBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjE2OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjE3OiAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjE4OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NzcsCS8qPSAgIFsgKioqXSAgICAgICAgKi8KKwkweDQ0LAkvKj0gICBbICogIF0gICAgICAgICovCisJMHg0NCwJLyo9ICAgWyAqICBdICAgICAgICAqLworCTB4NDQsCS8qPSAgIFsgKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjE5OiAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHhmZiwJLyo9ICAgWyoqKipdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHhmZiwJLyo9ICAgWyoqKipdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjIwOiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHhmZiwJLyo9ICAgWyoqKipdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjIxOiAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkweGNjLAkvKj0gICBbKiogIF0gICAgICAgICovCisJMHhjYywJLyo9ICAgWyoqICBdICAgICAgICAqLworCTB4Y2MsCS8qPSAgIFsqKiAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjIyOiAgKi8KKwkweDMzLAkvKj0gICBbICAqKl0gICAgICAgICovCisJMHgzMywJLyo9ICAgWyAgKipdICAgICAgICAqLworCTB4MzMsCS8qPSAgIFsgICoqXSAgICAgICAgKi8KKwkweDMzLAkvKj0gICBbICAqKl0gICAgICAgICovCisJMHgzMywJLyo9ICAgWyAgKipdICAgICAgICAqLworCTB4MzMsCS8qPSAgIFsgICoqXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjIzOiAgKi8KKwkweGZmLAkvKj0gICBbKioqKl0gICAgICAgICovCisJMHhmZiwJLyo9ICAgWyoqKipdICAgICAgICAqLworCTB4ZmYsCS8qPSAgIFsqKioqXSAgICAgICAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjI0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjI1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjI2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjI3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjI4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjI5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjMwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjMxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjMyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjMzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjM0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjM1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjM2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjM3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjM4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjM5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQ0OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQ1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQ2OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQ3OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQ4OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjQ5OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjUwOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjUxOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjUyOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjUzOiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjU0OiAgKi8KKwkweDAwLAkvKj0gICBbICAgIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4NjYsCS8qPSAgIFsgKiogXSAgICAgICAgKi8KKwkweDY2LAkvKj0gICBbICoqIF0gICAgICAgICovCisJMHgwMCwJLyo9ICAgWyAgICBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworCS8qeyovIAkvKiAgIENoYXIgMjU1OiAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4ZWUsCS8qPSAgIFsqKiogXSAgICAgICAgKi8KKwkweGVlLAkvKj0gICBbKioqIF0gICAgICAgICovCisJMHhlZSwJLyo9ICAgWyoqKiBdICAgICAgICAqLworCTB4MDAsCS8qPSAgIFsgICAgXSAgICAgICAgKi8KKwkvKn0qLworfTsKKworY29uc3Qgc3RydWN0IGZvbnRfZGVzYyBmb250X21pbmlfNHg2ID0geworCS5pZHgJPSBNSU5JNHg2X0lEWCwKKwkubmFtZQk9ICJNSU5JNHg2IiwKKwkud2lkdGgJPSA0LAorCS5oZWlnaHQJPSA2LAorCS5kYXRhCT0gZm9udGRhdGFfbWluaV80eDYsCisJLnByZWYJPSAzLAorfTsKKwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF9wZWFybF84eDguYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfcGVhcmxfOHg4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1MTRjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfcGVhcmxfOHg4LmMKQEAgLTAsMCArMSwyNTg4IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEZvbnQgZmlsZSBnZW5lcmF0ZWQgYnkgY3BpMmZudCAgICAgICAqLworLyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICovCisvKiAgICAgICBDb21iaW5lZCB3aXRoIHRoZSBhbHBoYS1udW1lcmljICAgICAgKi8KKy8qICAgICAgIHBvcnRpb24gb2YgR3JlZyBIYXJwJ3Mgb2xkIFBFQVJMICAgICAqLworLyogICAgICAgZm9udCAoZnJvbSBlYXJsaWVyIHZlcnNpb25zIG9mICAgICAgICovCisvKiAgICAgICBsaW51eC1tODZrKSBieSBKb2huIFNoaWZmbGV0dCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9mb250Lmg+CisKKyNkZWZpbmUgRk9OVERBVEFNQVggMjA0OAorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmb250ZGF0YV9wZWFybDh4OFtGT05UREFUQU1BWF0gPSB7CisKKyAgIC8qIDAgMHgwMCAnXkAnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMSAweDAxICdeQScgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDgxLCAvKiAxMDAwMDAwMSAqLworICAgMHhhNSwgLyogMTAxMDAxMDEgKi8KKyAgIDB4ODEsIC8qIDEwMDAwMDAxICovCisgICAweGJkLCAvKiAxMDExMTEwMSAqLworICAgMHg5OSwgLyogMTAwMTEwMDEgKi8KKyAgIDB4ODEsIC8qIDEwMDAwMDAxICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworCisgICAvKiAyIDB4MDIgJ15CJyAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweGRiLCAvKiAxMTAxMTAxMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4YzMsIC8qIDExMDAwMDExICovCisgICAweGU3LCAvKiAxMTEwMDExMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisKKyAgIC8qIDMgMHgwMyAnXkMnICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDEwLCAvKiAwMDAxMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNCAweDA0ICdeRCcgKi8KKyAgIDB4MTAsIC8qIDAwMDEwMDAwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MTAsIC8qIDAwMDEwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA1IDB4MDUgJ15FJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGQ2LCAvKiAxMTAxMDExMCAqLworICAgMHgxMCwgLyogMDAwMTAwMDAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisKKyAgIC8qIDYgMHgwNiAnXkYnICovCisgICAweDEwLCAvKiAwMDAxMDAwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDEwLCAvKiAwMDAxMDAwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKworICAgLyogNyAweDA3ICdeRycgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA4IDB4MDggJ15IJyAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweGU3LCAvKiAxMTEwMDExMSAqLworICAgMHhjMywgLyogMTEwMDAwMTEgKi8KKyAgIDB4YzMsIC8qIDExMDAwMDExICovCisgICAweGU3LCAvKiAxMTEwMDExMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisKKyAgIC8qIDkgMHgwOSAnXkknICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDQyLCAvKiAwMTAwMDAxMCAqLworICAgMHg0MiwgLyogMDEwMDAwMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMTAgMHgwYSAnXkonICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHhjMywgLyogMTEwMDAwMTEgKi8KKyAgIDB4OTksIC8qIDEwMDExMDAxICovCisgICAweGJkLCAvKiAxMDExMTEwMSAqLworICAgMHhiZCwgLyogMTAxMTExMDEgKi8KKyAgIDB4OTksIC8qIDEwMDExMDAxICovCisgICAweGMzLCAvKiAxMTAwMDAxMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKworICAgLyogMTEgMHgwYiAnXksnICovCisgICAweDBmLCAvKiAwMDAwMTExMSAqLworICAgMHgwNywgLyogMDAwMDAxMTEgKi8KKyAgIDB4MGYsIC8qIDAwMDAxMTExICovCisgICAweDdkLCAvKiAwMTExMTEwMSAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3OCwgLyogMDExMTEwMDAgKi8KKworICAgLyogMTIgMHgwYyAnXkwnICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKworICAgLyogMTMgMHgwZCAnXk0nICovCisgICAweDNmLCAvKiAwMDExMTExMSAqLworICAgMHgzMywgLyogMDAxMTAwMTEgKi8KKyAgIDB4M2YsIC8qIDAwMTExMTExICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4NzAsIC8qIDAxMTEwMDAwICovCisgICAweGYwLCAvKiAxMTExMDAwMCAqLworICAgMHhlMCwgLyogMTExMDAwMDAgKi8KKworICAgLyogMTQgMHgwZSAnXk4nICovCisgICAweDdmLCAvKiAwMTExMTExMSAqLworICAgMHg2MywgLyogMDExMDAwMTEgKi8KKyAgIDB4N2YsIC8qIDAxMTExMTExICovCisgICAweDYzLCAvKiAwMTEwMDAxMSAqLworICAgMHg2MywgLyogMDExMDAwMTEgKi8KKyAgIDB4NjcsIC8qIDAxMTAwMTExICovCisgICAweGU2LCAvKiAxMTEwMDExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKworICAgLyogMTUgMHgwZiAnXk8nICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHhkYiwgLyogMTEwMTEwMTEgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweGU3LCAvKiAxMTEwMDExMSAqLworICAgMHhlNywgLyogMTExMDAxMTEgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweGRiLCAvKiAxMTAxMTAxMSAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKworICAgLyogMTYgMHgxMCAnXlAnICovCisgICAweDgwLCAvKiAxMDAwMDAwMCAqLworICAgMHhlMCwgLyogMTExMDAwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHhmOCwgLyogMTExMTEwMDAgKi8KKyAgIDB4ZTAsIC8qIDExMTAwMDAwICovCisgICAweDgwLCAvKiAxMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMTcgMHgxMSAnXlEnICovCisgICAweDAyLCAvKiAwMDAwMDAxMCAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4M2UsIC8qIDAwMTExMTEwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgzZSwgLyogMDAxMTExMTAgKi8KKyAgIDB4MGUsIC8qIDAwMDAxMTEwICovCisgICAweDAyLCAvKiAwMDAwMDAxMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMTggMHgxMiAnXlInICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKworICAgLyogMTkgMHgxMyAnXlMnICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjAgMHgxNCAnXlQnICovCisgICAweDdmLCAvKiAwMTExMTExMSAqLworICAgMHhkYiwgLyogMTEwMTEwMTEgKi8KKyAgIDB4ZGIsIC8qIDExMDExMDExICovCisgICAweDdiLCAvKiAwMTExMTAxMSAqLworICAgMHgxYiwgLyogMDAwMTEwMTEgKi8KKyAgIDB4MWIsIC8qIDAwMDExMDExICovCisgICAweDFiLCAvKiAwMDAxMTAxMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjEgMHgxNSAnXlUnICovCisgICAweDNlLCAvKiAwMDExMTExMCAqLworICAgMHg2MSwgLyogMDExMDAwMDEgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDg2LCAvKiAxMDAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKworICAgLyogMjIgMHgxNiAnXlYnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjMgMHgxNyAnXlcnICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKworICAgLyogMjQgMHgxOCAnXlgnICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjUgMHgxOSAnXlknICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjYgMHgxYSAnXlonICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjcgMHgxYiAnXlsnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjggMHgxYyAnXlwnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMjkgMHgxZCAnXl0nICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgyNCwgLyogMDAxMDAxMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4MjQsIC8qIDAwMTAwMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMzAgMHgxZSAnXl4nICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMzEgMHgxZiAnXl8nICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMzIgMHgyMCAnICcgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiAzMyAweDIxICchJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDM0IDB4MjIgJyInICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMzUgMHgyMyAnIycgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiAzNiAweDI0ICckJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4M2UsIC8qIDAwMTExMTEwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDM3IDB4MjUgJyUnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogMzggMHgyNiAnJicgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHg2OCwgLyogMDExMDEwMDAgKi8KKyAgIDB4NzYsIC8qIDAxMTEwMTEwICovCisgICAweGRjLCAvKiAxMTAxMTEwMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4NzYsIC8qIDAxMTEwMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiAzOSAweDI3ICcnJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDQwIDB4MjggJygnICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNDEgMHgyOSAnKScgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA0MiAweDJhICcqJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDQzIDB4MmIgJysnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNDQgMHgyYyAnLCcgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworCisgICAvKiA0NSAweDJkICctJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDQ2IDB4MmUgJy4nICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNDcgMHgyZiAnLycgKi8KKyAgIDB4MDMsIC8qIDAwMDAwMDExICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA0OCAweDMwICcwJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGRlLCAvKiAxMTAxMTExMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4ZjYsIC8qIDExMTEwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDQ5IDB4MzEgJzEnICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHg3OCwgLyogMDExMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNTAgMHgzMiAnMicgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA1MSAweDMzICczJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHgxYywgLyogMDAwMTExMDAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDUyIDB4MzQgJzQnICovCisgICAweDFjLCAvKiAwMDAxMTEwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNTMgMHgzNSAnNScgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA1NCAweDM2ICc2JyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDU1IDB4MzcgJzcnICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNTYgMHgzOCAnOCcgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA1NyAweDM5ICc5JyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDU4IDB4M2EgJzonICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNTkgMHgzYiAnOycgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworCisgICAvKiA2MCAweDNjICc8JyAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDYxIDB4M2QgJz0nICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNjIgMHgzZSAnPicgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA2MyAweDNmICc/JyAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDY0IDB4NDAgJ0AnICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZGUsIC8qIDExMDExMTEwICovCisgICAweGRlLCAvKiAxMTAxMTExMCAqLworICAgMHhkZSwgLyogMTEwMTExMTAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNjUgMHg0MSAnQScgKi8KKyAgIDB4MTAsIC8qIDAwMDEwMDAwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA2NiAweDQyICdCJyAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDY3IDB4NDMgJ0MnICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNjggMHg0NCAnRCcgKi8KKyAgIDB4ZmMsIC8qIDExMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmMsIC8qIDExMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA2OSAweDQ1ICdFJyAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhmOCwgLyogMTExMTEwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDcwIDB4NDYgJ0YnICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGY4LCAvKiAxMTExMTAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNzEgMHg0NyAnRycgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4Y2UsIC8qIDExMDAxMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA3MiAweDQ4ICdIJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDczIDB4NDkgJ0knICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNzQgMHg0YSAnSicgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA3NSAweDRiICdLJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGQ4LCAvKiAxMTAxMTAwMCAqLworICAgMHhmMCwgLyogMTExMTAwMDAgKi8KKyAgIDB4ZDgsIC8qIDExMDExMDAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDc2IDB4NGMgJ0wnICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogNzcgMHg0ZCAnTScgKi8KKyAgIDB4ODIsIC8qIDEwMDAwMDEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhlZSwgLyogMTExMDExMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGQ2LCAvKiAxMTAxMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA3OCAweDRlICdOJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZTYsIC8qIDExMTAwMTEwICovCisgICAweGY2LCAvKiAxMTExMDExMCAqLworICAgMHhkZSwgLyogMTEwMTExMTAgKi8KKyAgIDB4Y2UsIC8qIDExMDAxMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDc5IDB4NGYgJ08nICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogODAgMHg1MCAnUCcgKi8KKyAgIDB4ZmMsIC8qIDExMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmMsIC8qIDExMTExMTAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA4MSAweDUxICdRJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZjYsIC8qIDExMTEwMTEwICovCisgICAweGRlLCAvKiAxMTAxMTExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisKKyAgIC8qIDgyIDB4NTIgJ1InICovCisgICAweGZjLCAvKiAxMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGZjLCAvKiAxMTExMTEwMCAqLworICAgMHhkOCwgLyogMTEwMTEwMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogODMgMHg1MyAnUycgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA4NCAweDU0ICdUJyAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDg1IDB4NTUgJ1UnICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogODYgMHg1NiAnVicgKi8KKyAgIDB4YzMsIC8qIDExMDAwMDExICovCisgICAweGMzLCAvKiAxMTAwMDAxMSAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA4NyAweDU3ICdXJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhkNiwgLyogMTEwMTAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGVlLCAvKiAxMTEwMTExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDg4IDB4NTggJ1gnICovCisgICAweGMzLCAvKiAxMTAwMDAxMSAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweGMzLCAvKiAxMTAwMDAxMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogODkgMHg1OSAnWScgKi8KKyAgIDB4YzMsIC8qIDExMDAwMDExICovCisgICAweGMzLCAvKiAxMTAwMDAxMSAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA5MCAweDVhICdaJyAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDkxIDB4NWIgJ1snICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogOTIgMHg1YyAnXCcgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MDMsIC8qIDAwMDAwMDExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA5MyAweDVkICddJyAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDk0IDB4NWUgJ14nICovCisgICAweDEwLCAvKiAwMDAxMDAwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogOTUgMHg1ZiAnXycgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworCisgICAvKiA5NiAweDYwICdgJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDk3IDB4NjEgJ2EnICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKworICAgLyogOTggMHg2MiAnYicgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmMsIC8qIDExMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworCisgICAvKiA5OSAweDYzICdjJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwMCAweDY0ICdkJyAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwMSAweDY1ICdlJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwMiAweDY2ICdmJyAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHhmMCwgLyogMTExMTAwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwMyAweDY3ICdnJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisKKyAgIC8qIDEwNCAweDY4ICdoJyAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGZjLCAvKiAxMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwNSAweDY5ICdpJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwNiAweDZhICdqJyAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisKKyAgIC8qIDEwNyAweDZiICdrJyAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhkOCwgLyogMTEwMTEwMDAgKi8KKyAgIDB4ZjAsIC8qIDExMTEwMDAwICovCisgICAweGQ4LCAvKiAxMTAxMTAwMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwOCAweDZjICdsJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEwOSAweDZkICdtJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGVjLCAvKiAxMTEwMTEwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4ZDYsIC8qIDExMDEwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExMCAweDZlICduJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZjLCAvKiAxMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExMSAweDZmICdvJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExMiAweDcwICdwJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZjLCAvKiAxMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGZjLCAvKiAxMTExMTEwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisKKyAgIC8qIDExMyAweDcxICdxJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisKKyAgIC8qIDExNCAweDcyICdyJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGRjLCAvKiAxMTAxMTEwMCAqLworICAgMHhlNiwgLyogMTExMDAxMTAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExNSAweDczICdzJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExNiAweDc0ICd0JyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgxYywgLyogMDAwMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExNyAweDc1ICd1JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExOCAweDc2ICd2JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDExOSAweDc3ICd3JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZDYsIC8qIDExMDEwMTEwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyMCAweDc4ICd4JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyMSAweDc5ICd5JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGMzLCAvKiAxMTAwMDAxMSAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisKKyAgIC8qIDEyMiAweDdhICd6JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyMyAweDdiICd7JyAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHg3MCwgLyogMDExMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyNCAweDdjICd8JyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyNSAweDdkICd9JyAqLworICAgMHg3MCwgLyogMDExMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHg3MCwgLyogMDExMTAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyNiAweDdlICd+JyAqLworICAgMHg3MiwgLyogMDExMTAwMTAgKi8KKyAgIDB4OWMsIC8qIDEwMDExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyNyAweDdmICd/JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MTAsIC8qIDAwMDEwMDAwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEyOCAweDgwICeAJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4NzgsIC8qIDAxMTExMDAwICovCisKKyAgIC8qIDEyOSAweDgxICeBJyAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzMCAweDgyICeCJyAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzMSAweDgzICeDJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4ODIsIC8qIDEwMDAwMDEwICovCisgICAweDc4LCAvKiAwMTExMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzMiAweDg0ICeEJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDc4LCAvKiAwMTExMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzMyAweDg1ICeFJyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDc4LCAvKiAwMTExMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzNCAweDg2ICeGJyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDc4LCAvKiAwMTExMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzNSAweDg3ICeHJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisKKyAgIC8qIDEzNiAweDg4ICeIJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4ODIsIC8qIDEwMDAwMDEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzNyAweDg5ICeJJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzOCAweDhhICeKJyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDEzOSAweDhiICeLJyAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0MCAweDhjICeMJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4ODIsIC8qIDEwMDAwMDEwICovCisgICAweDM4LCAvKiAwMDExMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0MSAweDhkICeNJyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0MiAweDhlICeOJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0MyAweDhmICePJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0NCAweDkwICeQJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0NSAweDkxICeRJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisgICAweGQ4LCAvKiAxMTAxMTAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0NiAweDkyICeSJyAqLworICAgMHgzZSwgLyogMDAxMTExMTAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhjZSwgLyogMTEwMDExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0NyAweDkzICeTJyAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4ODIsIC8qIDEwMDAwMDEwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0OCAweDk0ICeUJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE0OSAweDk1ICeVJyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE1MCAweDk2ICeWJyAqLworICAgMHg3OCwgLyogMDExMTEwMDAgKi8KKyAgIDB4ODQsIC8qIDEwMDAwMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE1MSAweDk3ICeXJyAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE1MiAweDk4ICeYJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4ZmMsIC8qIDExMTExMTAwICovCisKKyAgIC8qIDE1MyAweDk5ICeZJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MzgsIC8qIDAwMTExMDAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE1NCAweDlhICeaJyAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE1NSAweDliICebJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE1NiAweDljICecJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDY0LCAvKiAwMTEwMDEwMCAqLworICAgMHhmMCwgLyogMTExMTAwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHhmYywgLyogMTExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE1NyAweDlkICedJyAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE1OCAweDllICeeJyAqLworICAgMHhmOCwgLyogMTExMTEwMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhmYSwgLyogMTExMTEwMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGNmLCAvKiAxMTAwMTExMSAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzcsIC8qIDExMDAwMTExICovCisKKyAgIC8qIDE1OSAweDlmICefJyAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4MWIsIC8qIDAwMDExMDExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweGQ4LCAvKiAxMTAxMTAwMCAqLworICAgMHg3MCwgLyogMDExMTAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2MCAweGEwICegJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDc4LCAvKiAwMTExMTAwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2MSAweGExICehJyAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2MiAweGEyICeiJyAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2MyAweGEzICejJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2NCAweGE0ICekJyAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4ZGMsIC8qIDExMDExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhkYywgLyogMTEwMTExMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2NSAweGE1ICelJyAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4ZGMsIC8qIDExMDExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhlNiwgLyogMTExMDAxMTAgKi8KKyAgIDB4ZjYsIC8qIDExMTEwMTEwICovCisgICAweGRlLCAvKiAxMTAxMTExMCAqLworICAgMHhjZSwgLyogMTEwMDExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2NiAweGE2ICemJyAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzZSwgLyogMDAxMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2NyAweGE3ICenJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdjLCAvKiAwMTExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2OCAweGE4ICeoJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDYzLCAvKiAwMTEwMDAxMSAqLworICAgMHgzZSwgLyogMDAxMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE2OSAweGE5ICepJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE3MCAweGFhICeqJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisgICAweDA2LCAvKiAwMDAwMDExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE3MSAweGFiICerJyAqLworICAgMHg2MywgLyogMDExMDAwMTEgKi8KKyAgIDB4ZTYsIC8qIDExMTAwMTEwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MzMsIC8qIDAwMTEwMDExICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4MGYsIC8qIDAwMDAxMTExICovCisKKyAgIC8qIDE3MiAweGFjICesJyAqLworICAgMHg2MywgLyogMDExMDAwMTEgKi8KKyAgIDB4ZTYsIC8qIDExMTAwMTEwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHg3YSwgLyogMDExMTEwMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDZhLCAvKiAwMTEwMTAxMCAqLworICAgMHhkZiwgLyogMTEwMTExMTEgKi8KKyAgIDB4MDYsIC8qIDAwMDAwMTEwICovCisKKyAgIC8qIDE3MyAweGFkICetJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE3NCAweGFlICeuJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MzMsIC8qIDAwMTEwMDExICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDMzLCAvKiAwMDExMDAxMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE3NSAweGFmICevJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHgzMywgLyogMDAxMTAwMTEgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE3NiAweGIwICewJyAqLworICAgMHgyMiwgLyogMDAxMDAwMTAgKi8KKyAgIDB4ODgsIC8qIDEwMDAxMDAwICovCisgICAweDIyLCAvKiAwMDEwMDAxMCAqLworICAgMHg4OCwgLyogMTAwMDEwMDAgKi8KKyAgIDB4MjIsIC8qIDAwMTAwMDEwICovCisgICAweDg4LCAvKiAxMDAwMTAwMCAqLworICAgMHgyMiwgLyogMDAxMDAwMTAgKi8KKyAgIDB4ODgsIC8qIDEwMDAxMDAwICovCisKKyAgIC8qIDE3NyAweGIxICexJyAqLworICAgMHg1NSwgLyogMDEwMTAxMDEgKi8KKyAgIDB4YWEsIC8qIDEwMTAxMDEwICovCisgICAweDU1LCAvKiAwMTAxMDEwMSAqLworICAgMHhhYSwgLyogMTAxMDEwMTAgKi8KKyAgIDB4NTUsIC8qIDAxMDEwMTAxICovCisgICAweGFhLCAvKiAxMDEwMTAxMCAqLworICAgMHg1NSwgLyogMDEwMTAxMDEgKi8KKyAgIDB4YWEsIC8qIDEwMTAxMDEwICovCisKKyAgIC8qIDE3OCAweGIyICeyJyAqLworICAgMHg3NywgLyogMDExMTAxMTEgKi8KKyAgIDB4ZGQsIC8qIDExMDExMTAxICovCisgICAweDc3LCAvKiAwMTExMDExMSAqLworICAgMHhkZCwgLyogMTEwMTExMDEgKi8KKyAgIDB4NzcsIC8qIDAxMTEwMTExICovCisgICAweGRkLCAvKiAxMTAxMTEwMSAqLworICAgMHg3NywgLyogMDExMTAxMTEgKi8KKyAgIDB4ZGQsIC8qIDExMDExMTAxICovCisKKyAgIC8qIDE3OSAweGIzICezJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE4MCAweGI0ICe0JyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE4MSAweGI1ICe1JyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweGY4LCAvKiAxMTExMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE4MiAweGI2ICe2JyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4ZjYsIC8qIDExMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDE4MyAweGI3ICe3JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDE4NCAweGI4ICe4JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGY4LCAvKiAxMTExMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE4NSAweGI5ICe5JyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweGY2LCAvKiAxMTExMDExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4ZjYsIC8qIDExMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDE4NiAweGJhICe6JyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDE4NyAweGJiICe7JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4ZjYsIC8qIDExMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDE4OCAweGJjICe8JyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweGY2LCAvKiAxMTExMDExMCAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE4OSAweGJkICe9JyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE5MCAweGJlICe+JyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweGY4LCAvKiAxMTExMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE5MSAweGJmICe/JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE5MiAweGMwICfAJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MWYsIC8qIDAwMDExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE5MyAweGMxICfBJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE5NCAweGMyICfCJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE5NSAweGMzICfDJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MWYsIC8qIDAwMDExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE5NiAweGM0ICfEJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDE5NyAweGM1ICfFJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE5OCAweGM2ICfGJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDFmLCAvKiAwMDAxMTExMSAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MWYsIC8qIDAwMDExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDE5OSAweGM3ICfHJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzcsIC8qIDAwMTEwMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIwMCAweGM4ICfIJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM3LCAvKiAwMDExMDExMSAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4M2YsIC8qIDAwMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIwMSAweGM5ICfJJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDNmLCAvKiAwMDExMTExMSAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzcsIC8qIDAwMTEwMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIwMiAweGNhICfKJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweGY3LCAvKiAxMTExMDExMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIwMyAweGNiICfLJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZjcsIC8qIDExMTEwMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIwNCAweGNjICfMJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM3LCAvKiAwMDExMDExMSAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MzcsIC8qIDAwMTEwMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIwNSAweGNkICfNJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIwNiAweGNlICfOJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweGY3LCAvKiAxMTExMDExMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZjcsIC8qIDExMTEwMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIwNyAweGNmICfPJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIwOCAweGQwICfQJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIwOSAweGQxICfRJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDIxMCAweGQyICfSJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIxMSAweGQzICfTJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4M2YsIC8qIDAwMTExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIxMiAweGQ0ICfUJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDFmLCAvKiAwMDAxMTExMSAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MWYsIC8qIDAwMDExMTExICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIxMyAweGQ1ICfVJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDFmLCAvKiAwMDAxMTExMSAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MWYsIC8qIDAwMDExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDIxNCAweGQ2ICfWJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4M2YsIC8qIDAwMTExMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIxNSAweGQ3ICfXJyAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisKKyAgIC8qIDIxNiAweGQ4ICfYJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDIxNyAweGQ5ICfZJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4ZjgsIC8qIDExMTExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIxOCAweGRhICfaJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MWYsIC8qIDAwMDExMTExICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDIxOSAweGRiICfbJyAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisKKyAgIC8qIDIyMCAweGRjICfcJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisKKyAgIC8qIDIyMSAweGRkICfdJyAqLworICAgMHhmMCwgLyogMTExMTAwMDAgKi8KKyAgIDB4ZjAsIC8qIDExMTEwMDAwICovCisgICAweGYwLCAvKiAxMTExMDAwMCAqLworICAgMHhmMCwgLyogMTExMTAwMDAgKi8KKyAgIDB4ZjAsIC8qIDExMTEwMDAwICovCisgICAweGYwLCAvKiAxMTExMDAwMCAqLworICAgMHhmMCwgLyogMTExMTAwMDAgKi8KKyAgIDB4ZjAsIC8qIDExMTEwMDAwICovCisKKyAgIC8qIDIyMiAweGRlICfeJyAqLworICAgMHgwZiwgLyogMDAwMDExMTEgKi8KKyAgIDB4MGYsIC8qIDAwMDAxMTExICovCisgICAweDBmLCAvKiAwMDAwMTExMSAqLworICAgMHgwZiwgLyogMDAwMDExMTEgKi8KKyAgIDB4MGYsIC8qIDAwMDAxMTExICovCisgICAweDBmLCAvKiAwMDAwMTExMSAqLworICAgMHgwZiwgLyogMDAwMDExMTEgKi8KKyAgIDB4MGYsIC8qIDAwMDAxMTExICovCisKKyAgIC8qIDIyMyAweGRmICffJyAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4ZmYsIC8qIDExMTExMTExICovCisgICAweGZmLCAvKiAxMTExMTExMSAqLworICAgMHhmZiwgLyogMTExMTExMTEgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIyNCAweGUwICfgJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDc2LCAvKiAwMTExMDExMCAqLworICAgMHhkYywgLyogMTEwMTExMDAgKi8KKyAgIDB4YzgsIC8qIDExMDAxMDAwICovCisgICAweGRjLCAvKiAxMTAxMTEwMCAqLworICAgMHg3NiwgLyogMDExMTAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIyNSAweGUxICfhJyAqLworICAgMHg3OCwgLyogMDExMTEwMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGNjLCAvKiAxMTAwMTEwMCAqLworICAgMHhkOCwgLyogMTEwMTEwMDAgKi8KKyAgIDB4Y2MsIC8qIDExMDAxMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjYywgLyogMTEwMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIyNiAweGUyICfiJyAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisgICAweGMwLCAvKiAxMTAwMDAwMCAqLworICAgMHhjMCwgLyogMTEwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIyNyAweGUzICfjJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIyOCAweGU0ICfkJyAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIyOSAweGU1ICflJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhkOCwgLyogMTEwMTEwMDAgKi8KKyAgIDB4ZDgsIC8qIDExMDExMDAwICovCisgICAweGQ4LCAvKiAxMTAxMTAwMCAqLworICAgMHg3MCwgLyogMDExMTAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzMCAweGU2ICfmJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHg3YywgLyogMDExMTExMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisKKyAgIC8qIDIzMSAweGU3ICfnJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4NzYsIC8qIDAxMTEwMTEwICovCisgICAweGRjLCAvKiAxMTAxMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzMiAweGU4ICfoJyAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHg2NiwgLyogMDExMDAxMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4N2UsIC8qIDAxMTExMTEwICovCisKKyAgIC8qIDIzMyAweGU5ICfpJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzNCAweGVhICfqJyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHhlZSwgLyogMTExMDExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzNSAweGViICfrJyAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgzZSwgLyogMDAxMTExMTAgKi8KKyAgIDB4NjYsIC8qIDAxMTAwMTEwICovCisgICAweDY2LCAvKiAwMTEwMDExMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzNiAweGVjICfsJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhkYiwgLyogMTEwMTEwMTEgKi8KKyAgIDB4ZGIsIC8qIDExMDExMDExICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzNyAweGVkICftJyAqLworICAgMHgwNiwgLyogMDAwMDAxMTAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHhkYiwgLyogMTEwMTEwMTEgKi8KKyAgIDB4ZGIsIC8qIDExMDExMDExICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHg2MCwgLyogMDExMDAwMDAgKi8KKyAgIDB4YzAsIC8qIDExMDAwMDAwICovCisKKyAgIC8qIDIzOCAweGVlICfuJyAqLworICAgMHgxZSwgLyogMDAwMTExMTAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDYwLCAvKiAwMTEwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4NjAsIC8qIDAxMTAwMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHgxZSwgLyogMDAwMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDIzOSAweGVmICfvJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4YzYsIC8qIDExMDAwMTEwICovCisgICAweGM2LCAvKiAxMTAwMDExMCAqLworICAgMHhjNiwgLyogMTEwMDAxMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0MCAweGYwICfwJyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4ZmUsIC8qIDExMTExMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHhmZSwgLyogMTExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweGZlLCAvKiAxMTExMTExMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0MSAweGYxICfxJyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDdlLCAvKiAwMTExMTExMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0MiAweGYyICfyJyAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MzAsIC8qIDAwMTEwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0MyAweGYzICfzJyAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDMwLCAvKiAwMDExMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0NCAweGY0ICf0JyAqLworICAgMHgwZSwgLyogMDAwMDExMTAgKi8KKyAgIDB4MWIsIC8qIDAwMDExMDExICovCisgICAweDFiLCAvKiAwMDAxMTAxMSAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisKKyAgIC8qIDI0NSAweGY1ICf1JyAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweGQ4LCAvKiAxMTAxMTAwMCAqLworICAgMHhkOCwgLyogMTEwMTEwMDAgKi8KKyAgIDB4NzAsIC8qIDAxMTEwMDAwICovCisKKyAgIC8qIDI0NiAweGY2ICf2JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHg3ZSwgLyogMDExMTExMTAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0NyAweGY3ICf3JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4NzYsIC8qIDAxMTEwMTEwICovCisgICAweGRjLCAvKiAxMTAxMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4NzYsIC8qIDAxMTEwMTEwICovCisgICAweGRjLCAvKiAxMTAxMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0OCAweGY4ICf4JyAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4NmMsIC8qIDAxMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzOCwgLyogMDAxMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI0OSAweGY5ICf5JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MTgsIC8qIDAwMDExMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI1MCAweGZhICf6JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgxOCwgLyogMDAwMTEwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI1MSAweGZiICf7JyAqLworICAgMHgwZiwgLyogMDAwMDExMTEgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDBjLCAvKiAwMDAwMTEwMCAqLworICAgMHgwYywgLyogMDAwMDExMDAgKi8KKyAgIDB4ZWMsIC8qIDExMTAxMTAwICovCisgICAweDZjLCAvKiAwMTEwMTEwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4MWMsIC8qIDAwMDExMTAwICovCisKKyAgIC8qIDI1MiAweGZjICf8JyAqLworICAgMHg2YywgLyogMDExMDExMDAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDM2LCAvKiAwMDExMDExMCAqLworICAgMHgzNiwgLyogMDAxMTAxMTAgKi8KKyAgIDB4MzYsIC8qIDAwMTEwMTEwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI1MyAweGZkICf9JyAqLworICAgMHg3OCwgLyogMDExMTEwMDAgKi8KKyAgIDB4MGMsIC8qIDAwMDAxMTAwICovCisgICAweDE4LCAvKiAwMDAxMTAwMCAqLworICAgMHgzMCwgLyogMDAxMTAwMDAgKi8KKyAgIDB4N2MsIC8qIDAxMTExMTAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI1NCAweGZlICf+JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgzYywgLyogMDAxMTExMDAgKi8KKyAgIDB4M2MsIC8qIDAwMTExMTAwICovCisgICAweDNjLCAvKiAwMDExMTEwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKKyAgIC8qIDI1NSAweGZmICf/JyAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisgICAweDAwLCAvKiAwMDAwMDAwMCAqLworICAgMHgwMCwgLyogMDAwMDAwMDAgKi8KKyAgIDB4MDAsIC8qIDAwMDAwMDAwICovCisKK307CisKK2NvbnN0IHN0cnVjdCBmb250X2Rlc2MgZm9udF9wZWFybF84eDggPSB7CisJLmlkeAk9IFBFQVJMOHg4X0lEWCwKKwkubmFtZQk9ICJQRUFSTDh4OCIsCisJLndpZHRoCT0gOCwKKwkuaGVpZ2h0CT0gOCwKKwkuZGF0YQk9IGZvbnRkYXRhX3BlYXJsOHg4LAorCS5wcmVmCT0gMiwKK307CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X3N1bjEyeDIyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X3N1bjEyeDIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1ZDZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRfc3VuMTJ4MjIuYwpAQCAtMCwwICsxLDYxNjYgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorCisjZGVmaW5lIEZPTlREQVRBTUFYIDExMjY0CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZvbnRkYXRhX3N1bjEyeDIyW0ZPTlREQVRBTUFYXSA9IHsKKworCS8qIDAgMHgwMCAnXkAnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxIDB4MDEgJ15BJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4MzAsIDB4NjAsIC8qIDAwMTEwMDAwMDExMCAqLworCTB4NjUsIDB4MzAsIC8qIDAxMTAwMTAxMDAxMSAqLworCTB4NmQsIDB4YjAsIC8qIDAxMTAxMTAxMTAxMSAqLworCTB4NjAsIDB4MzAsIC8qIDAxMTAwMDAwMDAxMSAqLworCTB4NjIsIDB4MzAsIC8qIDAxMTAwMDEwMDAxMSAqLworCTB4NjIsIDB4MzAsIC8qIDAxMTAwMDEwMDAxMSAqLworCTB4NjAsIDB4MzAsIC8qIDAxMTAwMDAwMDAxMSAqLworCTB4NmYsIDB4YjAsIC8qIDAxMTAxMTExMTAxMSAqLworCTB4NjcsIDB4MzAsIC8qIDAxMTAwMTExMDAxMSAqLworCTB4MzAsIDB4NjAsIC8qIDAwMTEwMDAwMDExMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMiAweDAyICdeQicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweGMwLCAvKiAwMDAxMTExMTExMDAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDdhLCAweGYwLCAvKiAwMTExMTAxMDExMTEgKi8KKwkweDcyLCAweDcwLCAvKiAwMTExMDAxMDAxMTEgKi8KKwkweDdmLCAweGYwLCAvKiAwMTExMTExMTExMTEgKi8KKwkweDdkLCAweGYwLCAvKiAwMTExMTEwMTExMTEgKi8KKwkweDdkLCAweGYwLCAvKiAwMTExMTEwMTExMTEgKi8KKwkweDdmLCAweGYwLCAvKiAwMTExMTExMTExMTEgKi8KKwkweDcwLCAweDcwLCAvKiAwMTExMDAwMDAxMTEgKi8KKwkweDc4LCAweGYwLCAvKiAwMTExMTAwMDExMTEgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDFmLCAweGMwLCAvKiAwMDAxMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDMgMHgwMyAnXkMnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA0IDB4MDQgJ15EJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDIsIDB4MDAsIC8qIDAwMDAwMDEwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4M2YsIDB4ZTAsIC8qIDAwMTExMTExMTExMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MDIsIDB4MDAsIC8qIDAwMDAwMDEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNSAweDA1ICdeRScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDE4LCAweGMwLCAvKiAwMDAxMTAwMDExMDAgKi8KKwkweDNkLCAweGUwLCAvKiAwMDExMTEwMTExMTAgKi8KKwkweDNkLCAweGUwLCAvKiAwMDExMTEwMTExMTAgKi8KKwkweDFhLCAweGMwLCAvKiAwMDAxMTAxMDExMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDFmLCAweGMwLCAvKiAwMDAxMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDYgMHgwNiAnXkYnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgzNiwgMHhjMCwgLyogMDAxMTAxMTAxMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA3IDB4MDcgJ15HJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4M2YsIDB4YzAsIC8qIDAwMTExMTExMTEwMCAqLworCTB4M2YsIDB4YzAsIC8qIDAwMTExMTExMTEwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogOCAweDA4ICdeSCcgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGY5LCAweGYwLCAvKiAxMTExMTAwMTExMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGUwLCAweDcwLCAvKiAxMTEwMDAwMDAxMTEgKi8KKwkweGUwLCAweDcwLCAvKiAxMTEwMDAwMDAxMTEgKi8KKwkweGMwLCAweDMwLCAvKiAxMTAwMDAwMDAwMTEgKi8KKwkweGMwLCAweDMwLCAvKiAxMTAwMDAwMDAwMTEgKi8KKwkweGUwLCAweDcwLCAvKiAxMTEwMDAwMDAxMTEgKi8KKwkweGUwLCAweDcwLCAvKiAxMTEwMDAwMDAxMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGY5LCAweGYwLCAvKiAxMTExMTAwMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKworCS8qIDkgMHgwOSAnXkknICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMCAweDBhICdeSicgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGY5LCAweGYwLCAvKiAxMTExMTAwMTExMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGU2LCAweDcwLCAvKiAxMTEwMDExMDAxMTEgKi8KKwkweGU2LCAweDcwLCAvKiAxMTEwMDExMDAxMTEgKi8KKwkweGNmLCAweDMwLCAvKiAxMTAwMTExMTAwMTEgKi8KKwkweGNmLCAweDMwLCAvKiAxMTAwMTExMTAwMTEgKi8KKwkweGU2LCAweDcwLCAvKiAxMTEwMDExMDAxMTEgKi8KKwkweGU2LCAweDcwLCAvKiAxMTEwMDExMDAxMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweGY5LCAweGYwLCAvKiAxMTExMTAwMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKworCS8qIDExIDB4MGIgJ15LJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ZTAsIC8qIDAwMDAxMTExMTExMCAqLworCTB4MGYsIDB4ZTAsIC8qIDAwMDAxMTExMTExMCAqLworCTB4MDEsIDB4ZTAsIC8qIDAwMDAwMDAxMTExMCAqLworCTB4MDMsIDB4NjAsIC8qIDAwMDAwMDExMDExMCAqLworCTB4MDYsIDB4NjAsIC8qIDAwMDAwMTEwMDExMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTIgMHgwYyAnXkwnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMyAweDBkICdeTScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweGUwLCAvKiAwMDAwMTExMTExMTAgKi8KKwkweDBjLCAweDYwLCAvKiAwMDAwMTEwMDAxMTAgKi8KKwkweDBjLCAweDYwLCAvKiAwMDAwMTEwMDAxMTAgKi8KKwkweDBmLCAweGUwLCAvKiAwMDAwMTExMTExMTAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDNjLCAweDAwLCAvKiAwMDExMTEwMDAwMDAgKi8KKwkweDdjLCAweDAwLCAvKiAwMTExMTEwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE0IDB4MGUgJ15OJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4ZTAsIC8qIDAwMDExMTExMTExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MWYsIDB4ZTAsIC8qIDAwMDExMTExMTExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MTksIDB4ZTAsIC8qIDAwMDExMDAxMTExMCAqLworCTB4MWIsIDB4ZTAsIC8qIDAwMDExMDExMTExMCAqLworCTB4MWIsIDB4YzAsIC8qIDAwMDExMDExMTEwMCAqLworCTB4NzksIDB4ODAsIC8qIDAxMTExMDAxMTAwMCAqLworCTB4ZjgsIDB4MDAsIC8qIDExMTExMDAwMDAwMCAqLworCTB4ZjAsIDB4MDAsIC8qIDExMTEwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTUgMHgwZiAnXk8nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHg2ZCwgMHhiMCwgLyogMDExMDExMDExMDExICovCisJMHgzZCwgMHhlMCwgLyogMDAxMTExMDExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgzZCwgMHhlMCwgLyogMDAxMTExMDExMTEwICovCisJMHg2ZCwgMHhiMCwgLyogMDExMDExMDExMDExICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNiAweDEwICdeUCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDIwLCAvKiAwMDAwMDAwMDAwMTAgKi8KKwkweDAwLCAweDYwLCAvKiAwMDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweGUwLCAvKiAwMDAwMDAwMDExMTAgKi8KKwkweDAxLCAweGUwLCAvKiAwMDAwMDAwMTExMTAgKi8KKwkweDAzLCAweGUwLCAvKiAwMDAwMDAxMTExMTAgKi8KKwkweDA3LCAweGUwLCAvKiAwMDAwMDExMTExMTAgKi8KKwkweDBmLCAweGUwLCAvKiAwMDAwMTExMTExMTAgKi8KKwkweDFmLCAweGUwLCAvKiAwMDAxMTExMTExMTAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDFmLCAweGUwLCAvKiAwMDAxMTExMTExMTAgKi8KKwkweDBmLCAweGUwLCAvKiAwMDAwMTExMTExMTAgKi8KKwkweDA3LCAweGUwLCAvKiAwMDAwMDExMTExMTAgKi8KKwkweDAzLCAweGUwLCAvKiAwMDAwMDAxMTExMTAgKi8KKwkweDAxLCAweGUwLCAvKiAwMDAwMDAwMTExMTAgKi8KKwkweDAwLCAweGUwLCAvKiAwMDAwMDAwMDExMTAgKi8KKwkweDAwLCAweDYwLCAvKiAwMDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweDIwLCAvKiAwMDAwMDAwMDAwMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE3IDB4MTEgJ15RJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4NDAsIDB4MDAsIC8qIDAxMDAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAwMCAqLworCTB4N2MsIDB4MDAsIC8qIDAxMTExMTAwMDAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAwMCAqLworCTB4N2YsIDB4MDAsIC8qIDAxMTExMTExMDAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAwMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAwMCAqLworCTB4N2YsIDB4MDAsIC8qIDAxMTExMTExMDAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAwMCAqLworCTB4N2MsIDB4MDAsIC8qIDAxMTExMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NDAsIDB4MDAsIC8qIDAxMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTggMHgxMiAnXlInICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxOSAweDEzICdeUycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIwIDB4MTQgJ15UJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4ZjAsIC8qIDAwMDExMTExMTExMSAqLworCTB4M2MsIDB4YzAsIC8qIDAwMTExMTAwMTEwMCAqLworCTB4N2MsIDB4YzAsIC8qIDAxMTExMTAwMTEwMCAqLworCTB4N2MsIDB4YzAsIC8qIDAxMTExMTAwMTEwMCAqLworCTB4N2MsIDB4YzAsIC8qIDAxMTExMTAwMTEwMCAqLworCTB4M2MsIDB4YzAsIC8qIDAwMTExMTAwMTEwMCAqLworCTB4MWMsIDB4YzAsIC8qIDAwMDExMTAwMTEwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MWMsIDB4ZTAsIC8qIDAwMDExMTAwMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjEgMHgxNSAnXlUnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMiAweDE2ICdeVicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIzIDB4MTcgJ15XJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4MDQsIDB4MDAsIC8qIDAwMDAwMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjQgMHgxOCAnXlgnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyNSAweDE5ICdeWScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI2IDB4MWEgJ15aJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MzgsIDB4MDAsIC8qIDAwMTExMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4ZmYsIDB4ZTAsIC8qIDExMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MzgsIDB4MDAsIC8qIDAwMTExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjcgMHgxYiAnXlsnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMSwgMHgwMCwgLyogMDAwMDAwMDEwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhmMCwgLyogMDExMTExMTExMTExICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMSwgMHgwMCwgLyogMDAwMDAwMDEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyOCAweDFjICdeXCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI5IDB4MWQgJ15dJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDksIDB4MDAsIC8qIDAwMDAxMDAxMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MDksIDB4MDAsIC8qIDAwMDAxMDAxMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMzAgMHgxZSAnXl4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAzMSAweDFmICdeXycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExMDAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDMyIDB4MjAgJyAnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAzMyAweDIxICchJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMzQgMHgyMiAnIicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDM1IDB4MjMgJyMnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMywgMHgzMCwgLyogMDAwMDAwMTEwMDExICovCisJMHgwMywgMHgzMCwgLyogMDAwMDAwMTEwMDExICovCisJMHgwMywgMHgzMCwgLyogMDAwMDAwMTEwMDExICovCisJMHgwNiwgMHg2MCwgLyogMDAwMDAxMTAwMTEwICovCisJMHgxZiwgMHhmMCwgLyogMDAwMTExMTExMTExICovCisJMHgxZiwgMHhmMCwgLyogMDAwMTExMTExMTExICovCisJMHgwYywgMHhjMCwgLyogMDAwMDExMDAxMTAwICovCisJMHgwYywgMHhjMCwgLyogMDAwMDExMDAxMTAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAzNiAweDI0ICckJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4M2YsIDB4YzAsIC8qIDAwMTExMTExMTEwMCAqLworCTB4NjYsIDB4ZTAsIC8qIDAxMTAwMTEwMTExMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEwMCAqLworCTB4MDYsIDB4NjAsIC8qIDAwMDAwMTEwMDExMCAqLworCTB4MDYsIDB4NjAsIC8qIDAwMDAwMTEwMDExMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMzcgMHgyNSAnJScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDM4LCAweGMwLCAvKiAwMDExMTAwMDExMDAgKi8KKwkweDRjLCAweGMwLCAvKiAwMTAwMTEwMDExMDAgKi8KKwkweDQ1LCAweDgwLCAvKiAwMTAwMDEwMTEwMDAgKi8KKwkweDY1LCAweDgwLCAvKiAwMTEwMDEwMTEwMDAgKi8KKwkweDNiLCAweDAwLCAvKiAwMDExMTAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBkLCAweGMwLCAvKiAwMDAwMTEwMTExMDAgKi8KKwkweDFhLCAweDYwLCAvKiAwMDAxMTAxMDAxMTAgKi8KKwkweDFhLCAweDIwLCAvKiAwMDAxMTAxMDAwMTAgKi8KKwkweDMzLCAweDIwLCAvKiAwMDExMDAxMTAwMTAgKi8KKwkweDMxLCAweGMwLCAvKiAwMDExMDAwMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDM4IDB4MjYgJyYnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNywgMHgwMCwgLyogMDAwMDAxMTEwMDAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgzZSwgMHgwMCwgLyogMDAxMTExMTAwMDAwICovCisJMHg3NywgMHgwMCwgLyogMDExMTAxMTEwMDAwICovCisJMHg2MywgMHg2MCwgLyogMDExMDAwMTEwMTEwICovCisJMHg2MSwgMHhlMCwgLyogMDExMDAwMDExMTEwICovCisJMHg2MSwgMHhjMCwgLyogMDExMDAwMDExMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMDAwICovCisJMHgzZiwgMHhlMCwgLyogMDAxMTExMTExMTEwICovCisJMHgxZSwgMHg2MCwgLyogMDAwMTExMTAwMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAzOSAweDI3ICcnJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTAsIDB4MDAsIC8qIDAwMDEwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNDAgMHgyOCAnKCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDQxIDB4MjkgJyknICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA0MiAweDJhICcqJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4NzYsIDB4ZTAsIC8qIDAxMTEwMTEwMTExMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4NzYsIDB4ZTAsIC8qIDAxMTEwMTEwMTExMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNDMgMHgyYiAnKycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDQ0IDB4MmMgJywnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA0NSAweDJkICctJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNDYgMHgyZSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDQ3IDB4MmYgJy8nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA0OCAweDMwICcwJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTEsIDB4ODAsIC8qIDAwMDEwMDAxMTAwMCAqLworCTB4MTAsIDB4YzAsIC8qIDAwMDEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAwMCAqLworCTB4MTgsIDB4ODAsIC8qIDAwMDExMDAwMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNDkgMHgzMSAnMScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDUwIDB4MzIgJzInICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHg2MSwgMHhjMCwgLyogMDExMDAwMDExMTAwICovCisJMHg0MCwgMHhjMCwgLyogMDEwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgzMCwgMHgyMCwgLyogMDAxMTAwMDAwMDEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA1MSAweDMzICczJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MWYsIDB4YzAsIC8qIDAwMDExMTExMTEwMCAqLworCTB4MjAsIDB4ZTAsIC8qIDAwMTAwMDAwMTExMCAqLworCTB4NDAsIDB4NjAsIC8qIDAxMDAwMDAwMDExMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDAsIDB4ZTAsIC8qIDAwMDAwMDAwMTExMCAqLworCTB4MDcsIDB4YzAsIC8qIDAwMDAwMTExMTEwMCAqLworCTB4MGYsIDB4YzAsIC8qIDAwMDAxMTExMTEwMCAqLworCTB4MDAsIDB4ZTAsIC8qIDAwMDAwMDAwMTExMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4NDAsIDB4NjAsIC8qIDAxMDAwMDAwMDExMCAqLworCTB4NjAsIDB4NDAsIC8qIDAxMTAwMDAwMDEwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNTIgMHgzNCAnNCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwMDAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwMDAgKi8KKwkweDA1LCAweDgwLCAvKiAwMDAwMDEwMTEwMDAgKi8KKwkweDA1LCAweDgwLCAvKiAwMDAwMDEwMTEwMDAgKi8KKwkweDA5LCAweDgwLCAvKiAwMDAwMTAwMTEwMDAgKi8KKwkweDA5LCAweDgwLCAvKiAwMDAwMTAwMTEwMDAgKi8KKwkweDExLCAweDgwLCAvKiAwMDAxMDAwMTEwMDAgKi8KKwkweDExLCAweDgwLCAvKiAwMDAxMDAwMTEwMDAgKi8KKwkweDIxLCAweDgwLCAvKiAwMDEwMDAwMTEwMDAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDUzIDB4MzUgJzUnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMTAwICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMTAwICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMDAwICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMDAwICovCisJMHgyMCwgMHgwMCwgLyogMDAxMDAwMDAwMDAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHgzMSwgMHhjMCwgLyogMDAxMTAwMDExMTAwICovCisJMHgwMCwgMHhlMCwgLyogMDAwMDAwMDAxMTEwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHg0MCwgMHg2MCwgLyogMDEwMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA1NCAweDM2ICc2JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjcsIDB4ODAsIC8qIDAxMTAwMTExMTAwMCAqLworCTB4NmYsIDB4YzAsIC8qIDAxMTAxMTExMTEwMCAqLworCTB4NzAsIDB4ZTAsIC8qIDAxMTEwMDAwMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNTUgMHgzNyAnNycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweGUwLCAvKiAwMDAxMTExMTExMTAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDYwLCAweDQwLCAvKiAwMTEwMDAwMDAxMDAgKi8KKwkweDAwLCAweDQwLCAvKiAwMDAwMDAwMDAxMDAgKi8KKwkweDAwLCAweGMwLCAvKiAwMDAwMDAwMDExMDAgKi8KKwkweDAwLCAweDgwLCAvKiAwMDAwMDAwMDEwMDAgKi8KKwkweDAwLCAweDgwLCAvKiAwMDAwMDAwMDEwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAxLCAweDAwLCAvKiAwMDAwMDAwMTAwMDAgKi8KKwkweDAxLCAweDAwLCAvKiAwMDAwMDAwMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDU2IDB4MzggJzgnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxMSwgMHg4MCwgLyogMDAwMTAwMDExMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgwZCwgMHgwMCwgLyogMDAwMDExMDEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYiwgMHgwMCwgLyogMDAwMDEwMTEwMDAwICovCisJMHgxMSwgMHg4MCwgLyogMDAwMTAwMDExMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA1NyAweDM5ICc5JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4ZTAsIC8qIDAwMTAwMDAwMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NzAsIDB4ZTAsIC8qIDAxMTEwMDAwMTExMCAqLworCTB4M2YsIDB4NjAsIC8qIDAwMTExMTExMDExMCAqLworCTB4MWUsIDB4NjAsIC8qIDAwMDExMTEwMDExMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4M2MsIDB4MDAsIC8qIDAwMTExMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNTggMHgzYSAnOicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDU5IDB4M2IgJzsnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA2MCAweDNjICc8JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDEsIDB4YzAsIC8qIDAwMDAwMDAxMTEwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MDEsIDB4YzAsIC8qIDAwMDAwMDAxMTEwMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNjEgMHgzZCAnPScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDYyIDB4M2UgJz4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwMywgMHg4MCwgLyogMDAwMDAwMTExMDAwICovCisJMHgwMCwgMHhlMCwgLyogMDAwMDAwMDAxMTEwICovCisJMHgwMCwgMHhlMCwgLyogMDAwMDAwMDAxMTEwICovCisJMHgwMywgMHg4MCwgLyogMDAwMDAwMTExMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA2MyAweDNmICc/JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNjQgMHg0MCAnQCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDMwLCAweDYwLCAvKiAwMDExMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDY3LCAweDIwLCAvKiAwMTEwMDExMTAwMTAgKi8KKwkweDZmLCAweGEwLCAvKiAwMTEwMTExMTEwMTAgKi8KKwkweDZjLCAweGEwLCAvKiAwMTEwMTEwMDEwMTAgKi8KKwkweDZjLCAweGEwLCAvKiAwMTEwMTEwMDEwMTAgKi8KKwkweDY3LCAweGUwLCAvKiAwMTEwMDExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDNmLCAweGUwLCAvKiAwMDExMTExMTExMTAgKi8KKwkweDBmLCAweGUwLCAvKiAwMDAwMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDY1IDB4NDEgJ0EnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYiwgMHgwMCwgLyogMDAwMDEwMTEwMDAwICovCisJMHgwYiwgMHgwMCwgLyogMDAwMDEwMTEwMDAwICovCisJMHgwOSwgMHgwMCwgLyogMDAwMDEwMDEwMDAwICovCisJMHgxMSwgMHg4MCwgLyogMDAwMTAwMDExMDAwICovCisJMHgxMSwgMHg4MCwgLyogMDAwMTAwMDExMDAwICovCisJMHgxMCwgMHg4MCwgLyogMDAwMTAwMDAxMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgyMCwgMHhjMCwgLyogMDAxMDAwMDAxMTAwICovCisJMHgyMCwgMHg0MCwgLyogMDAxMDAwMDAwMTAwICovCisJMHg0MCwgMHg2MCwgLyogMDEwMDAwMDAwMTEwICovCisJMHg0MCwgMHg2MCwgLyogMDEwMDAwMDAwMTEwICovCisJMHhlMCwgMHhmMCwgLyogMTExMDAwMDAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA2NiAweDQyICdCJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4MDAsIC8qIDExMTExMTExMDAwMCAqLworCTB4NjAsIDB4ODAsIC8qIDAxMTAwMDAwMTAwMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEwMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEwMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEwMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAwMCAqLworCTB4N2YsIDB4ODAsIC8qIDAxMTExMTExMTAwMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEwMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4YzAsIC8qIDAxMTAwMDAwMTEwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNjcgMHg0MyAnQycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExMDAgKi8KKwkweDEwLCAweDYwLCAvKiAwMDAxMDAwMDAxMTAgKi8KKwkweDIwLCAweDIwLCAvKiAwMDEwMDAwMDAwMTAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwMDAgKi8KKwkweDMwLCAweDIwLCAvKiAwMDExMDAwMDAwMTAgKi8KKwkweDE4LCAweDQwLCAvKiAwMDAxMTAwMDAxMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDY4IDB4NDQgJ0QnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHgwMCwgLyogMTExMTExMTEwMDAwICovCisJMHg2MSwgMHhjMCwgLyogMDExMDAwMDExMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg0MCwgLyogMDExMDAwMDAwMTAwICovCisJMHg2MSwgMHg4MCwgLyogMDExMDAwMDExMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA2OSAweDQ1ICdFJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4MzAsIDB4NDAsIC8qIDAwMTEwMDAwMDEwMCAqLworCTB4MzAsIDB4NDAsIC8qIDAwMTEwMDAwMDEwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MjAsIC8qIDAwMTEwMDAwMDAxMCAqLworCTB4MzAsIDB4MjAsIC8qIDAwMTEwMDAwMDAxMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNzAgMHg0NiAnRicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExMDAgKi8KKwkweDMwLCAweDQwLCAvKiAwMDExMDAwMDAxMDAgKi8KKwkweDMwLCAweDQwLCAvKiAwMDExMDAwMDAxMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwMDAgKi8KKwkweDNmLCAweDgwLCAvKiAwMDExMTExMTEwMDAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDcxIDB4NDcgJ0cnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHhjMCwgLyogMDAwMDExMTExMTAwICovCisJMHgxMCwgMHg2MCwgLyogMDAwMTAwMDAwMTEwICovCisJMHgyMCwgMHgyMCwgLyogMDAxMDAwMDAwMDEwICovCisJMHgyMCwgMHgwMCwgLyogMDAxMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MSwgMHhmMCwgLyogMDExMDAwMDExMTExICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHgyMCwgMHg2MCwgLyogMDAxMDAwMDAwMTEwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHgxOCwgMHg2MCwgLyogMDAwMTEwMDAwMTEwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA3MiAweDQ4ICdIJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZjAsIDB4ZjAsIC8qIDExMTEwMDAwMTExMSAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4ZjAsIDB4ZjAsIC8qIDExMTEwMDAwMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNzMgMHg0OSAnSScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDc0IDB4NGEgJ0onICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA3NSAweDRiICdLJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZjAsIDB4ZTAsIC8qIDExMTEwMDAwMTExMCAqLworCTB4NjEsIDB4ODAsIC8qIDAxMTAwMDAxMTAwMCAqLworCTB4NjMsIDB4MDAsIC8qIDAxMTAwMDExMDAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAwMCAqLworCTB4NmMsIDB4MDAsIC8qIDAxMTAxMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAwMCAqLworCTB4N2MsIDB4MDAsIC8qIDAxMTExMTAwMDAwMCAqLworCTB4NmUsIDB4MDAsIC8qIDAxMTAxMTEwMDAwMCAqLworCTB4NjcsIDB4MDAsIC8qIDAxMTAwMTExMDAwMCAqLworCTB4NjMsIDB4ODAsIC8qIDAxMTAwMDExMTAwMCAqLworCTB4NjEsIDB4YzAsIC8qIDAxMTAwMDAxMTEwMCAqLworCTB4NjAsIDB4ZTAsIC8qIDAxMTAwMDAwMTExMCAqLworCTB4ZjAsIDB4NzAsIC8qIDExMTEwMDAwMDExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNzYgMHg0YyAnTCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDIwLCAvKiAwMDExMDAwMDAwMTAgKi8KKwkweDMwLCAweDIwLCAvKiAwMDExMDAwMDAwMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDc3IDB4NGQgJ00nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhlMCwgMHg3MCwgLyogMTExMDAwMDAwMTExICovCisJMHg2MCwgMHhlMCwgLyogMDExMDAwMDAxMTEwICovCisJMHg3MCwgMHhlMCwgLyogMDExMTAwMDAxMTEwICovCisJMHg3MCwgMHhlMCwgLyogMDExMTAwMDAxMTEwICovCisJMHg3MCwgMHhlMCwgLyogMDExMTAwMDAxMTEwICovCisJMHg1OSwgMHg2MCwgLyogMDEwMTEwMDEwMTEwICovCisJMHg1OSwgMHg2MCwgLyogMDEwMTEwMDEwMTEwICovCisJMHg1OSwgMHg2MCwgLyogMDEwMTEwMDEwMTEwICovCisJMHg0ZCwgMHg2MCwgLyogMDEwMDExMDEwMTEwICovCisJMHg0ZSwgMHg2MCwgLyogMDEwMDExMTAwMTEwICovCisJMHg0ZSwgMHg2MCwgLyogMDEwMDExMTAwMTEwICovCisJMHg0NCwgMHg2MCwgLyogMDEwMDAxMDAwMTEwICovCisJMHg0NCwgMHg2MCwgLyogMDEwMDAxMDAwMTEwICovCisJMHhlNCwgMHhmMCwgLyogMTExMDAxMDAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA3OCAweDRlICdOJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4YzAsIDB4NzAsIC8qIDExMDAwMDAwMDExMSAqLworCTB4NjAsIDB4MjAsIC8qIDAxMTAwMDAwMDAxMCAqLworCTB4NzAsIDB4MjAsIC8qIDAxMTEwMDAwMDAxMCAqLworCTB4NzgsIDB4MjAsIC8qIDAxMTExMDAwMDAxMCAqLworCTB4NTgsIDB4MjAsIC8qIDAxMDExMDAwMDAxMCAqLworCTB4NGMsIDB4MjAsIC8qIDAxMDAxMTAwMDAxMCAqLworCTB4NDYsIDB4MjAsIC8qIDAxMDAwMTEwMDAxMCAqLworCTB4NDcsIDB4MjAsIC8qIDAxMDAwMTExMDAxMCAqLworCTB4NDMsIDB4MjAsIC8qIDAxMDAwMDExMDAxMCAqLworCTB4NDEsIDB4YTAsIC8qIDAxMDAwMDAxMTAxMCAqLworCTB4NDAsIDB4ZTAsIC8qIDAxMDAwMDAwMTExMCAqLworCTB4NDAsIDB4ZTAsIC8qIDAxMDAwMDAwMTExMCAqLworCTB4NDAsIDB4NjAsIC8qIDAxMDAwMDAwMDExMCAqLworCTB4ZTAsIDB4MzAsIC8qIDExMTAwMDAwMDAxMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogNzkgMHg0ZiAnTycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDExLCAweGMwLCAvKiAwMDAxMDAwMTExMDAgKi8KKwkweDIwLCAweGMwLCAvKiAwMDEwMDAwMDExMDAgKi8KKwkweDIwLCAweDYwLCAvKiAwMDEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDIwLCAweDQwLCAvKiAwMDEwMDAwMDAxMDAgKi8KKwkweDMwLCAweDQwLCAvKiAwMDExMDAwMDAxMDAgKi8KKwkweDE4LCAweDgwLCAvKiAwMDAxMTAwMDEwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDgwIDB4NTAgJ1AnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzNywgMHg4MCwgLyogMDAxMTAxMTExMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHg3OCwgMHgwMCwgLyogMDExMTEwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA4MSAweDUxICdRJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4MjAsIDB4NjAsIC8qIDAwMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4MzAsIDB4NDAsIC8qIDAwMTEwMDAwMDEwMCAqLworCTB4MzgsIDB4NDAsIC8qIDAwMTExMDAwMDEwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MjMsIDB4OTAsIC8qIDAwMTAwMDExMTAwMSAqLworCTB4MDEsIDB4ZTAsIC8qIDAwMDAwMDAxMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogODIgMHg1MiAnUicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweDAwLCAvKiAxMTExMTExMTAwMDAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDYwLCAweDgwLCAvKiAwMTEwMDAwMDEwMDAgKi8KKwkweDdmLCAweDAwLCAvKiAwMTExMTExMTAwMDAgKi8KKwkweDdjLCAweDAwLCAvKiAwMTExMTEwMDAwMDAgKi8KKwkweDZlLCAweDAwLCAvKiAwMTEwMTExMDAwMDAgKi8KKwkweDY3LCAweDAwLCAvKiAwMTEwMDExMTAwMDAgKi8KKwkweDYzLCAweDgwLCAvKiAwMTEwMDAxMTEwMDAgKi8KKwkweDYxLCAweGMwLCAvKiAwMTEwMDAwMTExMDAgKi8KKwkweDYwLCAweGUwLCAvKiAwMTEwMDAwMDExMTAgKi8KKwkweGYwLCAweDcwLCAvKiAxMTExMDAwMDAxMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDgzIDB4NTMgJ1MnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHhlMCwgLyogMDAwMTExMTExMTEwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMDAwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHgwMCwgMHhlMCwgLyogMDAwMDAwMDAxMTEwICovCisJMHg0MCwgMHg2MCwgLyogMDEwMDAwMDAwMTEwICovCisJMHg0MCwgMHg2MCwgLyogMDEwMDAwMDAwMTEwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg3ZiwgMHg4MCwgLyogMDExMTExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA4NCAweDU0ICdUJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4NDYsIDB4MjAsIC8qIDAxMDAwMTEwMDAxMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogODUgMHg1NSAnVScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGYwLCAweDcwLCAvKiAxMTExMDAwMDAxMTEgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDcwLCAweDQwLCAvKiAwMTExMDAwMDAxMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDg2IDB4NTYgJ1YnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhlMCwgMHhlMCwgLyogMTExMDAwMDAxMTEwICovCisJMHg2MCwgMHg0MCwgLyogMDExMDAwMDAwMTAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMDAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMDAwICovCisJMHgzMCwgMHg4MCwgLyogMDAxMTAwMDAxMDAwICovCisJMHgxOSwgMHgwMCwgLyogMDAwMTEwMDEwMDAwICovCisJMHgxOSwgMHgwMCwgLyogMDAwMTEwMDEwMDAwICovCisJMHgxOSwgMHgwMCwgLyogMDAwMTEwMDEwMDAwICovCisJMHgwYSwgMHgwMCwgLyogMDAwMDEwMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA4NyAweDU3ICdXJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZmUsIDB4ZjAsIC8qIDExMTExMTEwMTExMSAqLworCTB4NjYsIDB4MjAsIC8qIDAxMTAwMTEwMDAxMCAqLworCTB4NjYsIDB4MjAsIC8qIDAxMTAwMTEwMDAxMCAqLworCTB4NjYsIDB4MjAsIC8qIDAxMTAwMTEwMDAxMCAqLworCTB4NzYsIDB4MjAsIC8qIDAxMTEwMTEwMDAxMCAqLworCTB4NzcsIDB4NDAsIC8qIDAxMTEwMTExMDEwMCAqLworCTB4MzMsIDB4NDAsIC8qIDAwMTEwMDExMDEwMCAqLworCTB4MzcsIDB4NDAsIC8qIDAwMTEwMTExMDEwMCAqLworCTB4M2IsIDB4YzAsIC8qIDAwMTExMDExMTEwMCAqLworCTB4M2IsIDB4ODAsIC8qIDAwMTExMDExMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogODggMHg1OCAnWCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGYwLCAweDcwLCAvKiAxMTExMDAwMDAxMTEgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDMwLCAweDQwLCAvKiAwMDExMDAwMDAxMDAgKi8KKwkweDM4LCAweDgwLCAvKiAwMDExMTAwMDEwMDAgKi8KKwkweDE4LCAweDgwLCAvKiAwMDAxMTAwMDEwMDAgKi8KKwkweDBkLCAweDAwLCAvKiAwMDAwMTEwMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDBiLCAweDAwLCAvKiAwMDAwMTAxMTAwMDAgKi8KKwkweDExLCAweDgwLCAvKiAwMDAxMDAwMTEwMDAgKi8KKwkweDExLCAweGMwLCAvKiAwMDAxMDAwMTExMDAgKi8KKwkweDIwLCAweGMwLCAvKiAwMDEwMDAwMDExMDAgKi8KKwkweDQwLCAweDYwLCAvKiAwMTAwMDAwMDAxMTAgKi8KKwkweGUwLCAweGYwLCAvKiAxMTEwMDAwMDExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDg5IDB4NTkgJ1knICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmMCwgMHg3MCwgLyogMTExMTAwMDAwMTExICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHgzMCwgMHg0MCwgLyogMDAxMTAwMDAwMTAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgwZCwgMHgwMCwgLyogMDAwMDExMDEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA5MCAweDVhICdaJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4M2YsIDB4ZTAsIC8qIDAwMTExMTExMTExMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MjAsIC8qIDAwMDExMDAwMDAxMCAqLworCTB4M2YsIDB4ZTAsIC8qIDAwMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogOTEgMHg1YiAnWycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDkyIDB4NWMgJ1wnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA5MyAweDVkICddJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogOTQgMHg1ZSAnXicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDk1IDB4NWYgJ18nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA5NiAweDYwICdgJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDEsIDB4MDAsIC8qIDAwMDAwMDAxMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDcsIDB4ODAsIC8qIDAwMDAwMTExMTAwMCAqLworCTB4MDcsIDB4ODAsIC8qIDAwMDAwMTExMTAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogOTcgMHg2MSAnYScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDE4LCAweGMwLCAvKiAwMDAxMTAwMDExMDAgKi8KKwkweDEwLCAweGMwLCAvKiAwMDAxMDAwMDExMDAgKi8KKwkweDAzLCAweGMwLCAvKiAwMDAwMDAxMTExMDAgKi8KKwkweDFjLCAweGMwLCAvKiAwMDAxMTEwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDFlLCAweGUwLCAvKiAwMDAxMTExMDExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDk4IDB4NjIgJ2InICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgyMCwgMHgwMCwgLyogMDAxMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHhlMCwgMHgwMCwgLyogMTExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2NywgMHg4MCwgLyogMDExMDAxMTExMDAwICovCisJMHg2ZiwgMHhjMCwgLyogMDExMDExMTExMTAwICovCisJMHg3MCwgMHhlMCwgLyogMDExMTAwMDAxMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg3MCwgMHg2MCwgLyogMDExMTAwMDAwMTEwICovCisJMHg3OCwgMHhjMCwgLyogMDExMTEwMDAxMTAwICovCisJMHg0ZiwgMHg4MCwgLyogMDEwMDExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiA5OSAweDYzICdjJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MzEsIDB4YzAsIC8qIDAwMTEwMDAxMTEwMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTAwIDB4NjQgJ2QnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHhlMCwgLyogMDAwMDAwMDAxMTEwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwMCwgMHg2MCwgLyogMDAwMDAwMDAwMTEwICovCisJMHgwZiwgMHg2MCwgLyogMDAwMDExMTEwMTEwICovCisJMHgzMSwgMHhlMCwgLyogMDAxMTAwMDExMTEwICovCisJMHgyMCwgMHhlMCwgLyogMDAxMDAwMDAxMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg3MCwgMHhlMCwgLyogMDExMTAwMDAxMTEwICovCisJMHgzOSwgMHg2MCwgLyogMDAxMTEwMDEwMTEwICovCisJMHgxZSwgMHg3MCwgLyogMDAwMTExMTAwMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMDEgMHg2NSAnZScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDE4LCAweDYwLCAvKiAwMDAxMTAwMDAxMTAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEwMiAweDY2ICdmJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAwMCAqLworCTB4MDQsIDB4YzAsIC8qIDAwMDAwMTAwMTEwMCAqLworCTB4MDQsIDB4YzAsIC8qIDAwMDAwMTAwMTEwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTAzIDB4NjcgJ2cnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHgyMCwgLyogMDAwMTExMTEwMDEwICovCisJMHgzMSwgMHhlMCwgLyogMDAxMTAwMDExMTEwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzZiwgMHgwMCwgLyogMDAxMTExMTEwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgzZiwgMHhlMCwgLyogMDAxMTExMTExMTEwICovCisJMHgyMCwgMHg2MCwgLyogMDAxMDAwMDAwMTEwICovCisJMHg0MCwgMHgyMCwgLyogMDEwMDAwMDAwMDEwICovCisJMHg0MCwgMHgyMCwgLyogMDEwMDAwMDAwMDEwICovCisJMHg3ZiwgMHhjMCwgLyogMDExMTExMTExMTAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMDQgMHg2OCAnaCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDEwLCAweDAwLCAvKiAwMDAxMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDcwLCAweDAwLCAvKiAwMTExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDM3LCAweDgwLCAvKiAwMDExMDExMTEwMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDc5LCAweGUwLCAvKiAwMTExMTAwMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEwNSAweDY5ICdpJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTA2IDB4NmEgJ2onICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMywgMHhjMCwgLyogMDAwMDAwMTExMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgwMCwgMHhjMCwgLyogMDAwMDAwMDAxMTAwICovCisJMHgyMCwgMHhjMCwgLyogMDAxMDAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzOCwgMHg4MCwgLyogMDAxMTEwMDAxMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgwZSwgMHgwMCwgLyogMDAwMDExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMDcgMHg2YiAnaycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweGUwLCAweDAwLCAvKiAxMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYxLCAweGMwLCAvKiAwMTEwMDAwMTExMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwMDAgKi8KKwkweDdjLCAweDAwLCAvKiAwMTExMTEwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwMDAgKi8KKwkweDdjLCAweDAwLCAvKiAwMTExMTEwMDAwMDAgKi8KKwkweDZlLCAweDAwLCAvKiAwMTEwMTExMDAwMDAgKi8KKwkweDY3LCAweDAwLCAvKiAwMTEwMDExMTAwMDAgKi8KKwkweDYzLCAweDgwLCAvKiAwMTEwMDAxMTEwMDAgKi8KKwkweGYxLCAweGUwLCAvKiAxMTExMDAwMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEwOCAweDZjICdsJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTA5IDB4NmQgJ20nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhkZCwgMHhjMCwgLyogMTEwMTExMDExMTAwICovCisJMHg2ZSwgMHhlMCwgLyogMDExMDExMTAxMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHg2NiwgMHg2MCwgLyogMDExMDAxMTAwMTEwICovCisJMHhlZiwgMHg3MCwgLyogMTExMDExMTEwMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMTAgMHg2ZSAnbicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDI3LCAweDgwLCAvKiAwMDEwMDExMTEwMDAgKi8KKwkweDc5LCAweGMwLCAvKiAwMTExMTAwMTExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDc5LCAweGUwLCAvKiAwMTExMTAwMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDExMSAweDZmICdvJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4ZTAsIC8qIDAwMTAwMDAwMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4MzgsIDB4ODAsIC8qIDAwMTExMDAwMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTEyIDB4NzAgJ3AnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhlZiwgMHg4MCwgLyogMTExMDExMTExMDAwICovCisJMHg3MSwgMHhjMCwgLyogMDExMTAwMDExMTAwICovCisJMHg2MCwgMHhlMCwgLyogMDExMDAwMDAxMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg0MCwgLyogMDExMDAwMDAwMTAwICovCisJMHg3MCwgMHg4MCwgLyogMDExMTAwMDAxMDAwICovCisJMHg3ZiwgMHgwMCwgLyogMDExMTExMTEwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHhmMCwgMHgwMCwgLyogMTExMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMTMgMHg3MSAncScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDIwLCAvKiAwMDAwMTExMTAwMTAgKi8KKwkweDExLCAweGUwLCAvKiAwMDAxMDAwMTExMTAgKi8KKwkweDIwLCAweGUwLCAvKiAwMDEwMDAwMDExMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDcwLCAweDYwLCAvKiAwMTExMDAwMDAxMTAgKi8KKwkweDM4LCAweGUwLCAvKiAwMDExMTAwMDExMTAgKi8KKwkweDFmLCAweGUwLCAvKiAwMDAxMTExMTExMTAgKi8KKwkweDAwLCAweDYwLCAvKiAwMDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweDYwLCAvKiAwMDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweDYwLCAvKiAwMDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweDYwLCAvKiAwMDAwMDAwMDAxMTAgKi8KKwkweDAwLCAweGYwLCAvKiAwMDAwMDAwMDExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDExNCAweDcyICdyJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4NzMsIDB4ODAsIC8qIDAxMTEwMDExMTAwMCAqLworCTB4MzQsIDB4YzAsIC8qIDAwMTEwMTAwMTEwMCAqLworCTB4MzgsIDB4YzAsIC8qIDAwMTExMDAwMTEwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTE1IDB4NzMgJ3MnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHhjMCwgLyogMDAwMTExMTExMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHg0MCwgLyogMDAxMTAwMDAwMTAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMDAwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHgyMCwgMHhjMCwgLyogMDAxMDAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzZiwgMHg4MCwgLyogMDAxMTExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMTYgMHg3NCAndCcgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDdmLCAweGMwLCAvKiAwMTExMTExMTExMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBjLCAweDIwLCAvKiAwMDAwMTEwMDAwMTAgKi8KKwkweDBlLCAweDQwLCAvKiAwMDAwMTExMDAxMDAgKi8KKwkweDA3LCAweDgwLCAvKiAwMDAwMDExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDExNyAweDc1ICd1JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4NzksIDB4ZTAsIC8qIDAxMTExMDAxMTExMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MWUsIDB4NjAsIC8qIDAwMDExMTEwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTE4IDB4NzYgJ3YnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmMCwgMHg3MCwgLyogMTExMTAwMDAwMTExICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHgzMCwgMHg0MCwgLyogMDAxMTAwMDAwMTAwICovCisJMHgzMCwgMHg0MCwgLyogMDAxMTAwMDAwMTAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgwZCwgMHgwMCwgLyogMDAwMDExMDEwMDAwICovCisJMHgwZCwgMHgwMCwgLyogMDAwMDExMDEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMTkgMHg3NyAndycgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweDcwLCAvKiAxMTExMTExMTAxMTEgKi8KKwkweDY2LCAweDIwLCAvKiAwMTEwMDExMDAwMTAgKi8KKwkweDY2LCAweDIwLCAvKiAwMTEwMDExMDAwMTAgKi8KKwkweDY2LCAweDIwLCAvKiAwMTEwMDExMDAwMTAgKi8KKwkweDM3LCAweDQwLCAvKiAwMDExMDExMTAxMDAgKi8KKwkweDNiLCAweDQwLCAvKiAwMDExMTAxMTAxMDAgKi8KKwkweDNiLCAweDQwLCAvKiAwMDExMTAxMTAxMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEyMCAweDc4ICd4JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZjgsIDB4ZjAsIC8qIDExMTExMDAwMTExMSAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4MzgsIDB4ODAsIC8qIDAwMTExMDAwMTAwMCAqLworCTB4MWQsIDB4MDAsIC8qIDAwMDExMTAxMDAwMCAqLworCTB4MGUsIDB4MDAsIC8qIDAwMDAxMTEwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MGIsIDB4ODAsIC8qIDAwMDAxMDExMTAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4ZTAsIC8qIDAwMTAwMDAwMTExMCAqLworCTB4ZjEsIDB4ZjAsIC8qIDExMTEwMDAxMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTIxIDB4NzkgJ3knICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmMCwgMHhmMCwgLyogMTExMTAwMDAxMTExICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHgzMCwgMHg0MCwgLyogMDAxMTAwMDAwMTAwICovCisJMHgzMCwgMHg0MCwgLyogMDAxMTAwMDAwMTAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgxOCwgMHg4MCwgLyogMDAwMTEwMDAxMDAwICovCisJMHgwZCwgMHgwMCwgLyogMDAwMDExMDEwMDAwICovCisJMHgwZCwgMHgwMCwgLyogMDAwMDExMDEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwOCwgMHgwMCwgLyogMDAwMDEwMDAwMDAwICovCisJMHg3OCwgMHgwMCwgLyogMDExMTEwMDAwMDAwICovCisJMHg3MCwgMHgwMCwgLyogMDExMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMjIgMHg3YSAneicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDYwLCAweGUwLCAvKiAwMTEwMDAwMDExMTAgKi8KKwkweDQxLCAweGMwLCAvKiAwMTAwMDAwMTExMDAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwMDAgKi8KKwkweDM4LCAweDIwLCAvKiAwMDExMTAwMDAwMTAgKi8KKwkweDcwLCAweDYwLCAvKiAwMTExMDAwMDAxMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEyMyAweDdiICd7JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MzgsIDB4MDAsIC8qIDAwMTExMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDMsIDB4ODAsIC8qIDAwMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTI0IDB4N2MgJ3wnICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMjUgMHg3ZCAnfScgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAxLCAweGMwLCAvKiAwMDAwMDAwMTExMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEyNiAweDdlICd+JyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWMsIDB4MjAsIC8qIDAwMDExMTAwMDAxMCAqLworCTB4M2UsIDB4NjAsIC8qIDAwMTExMTEwMDExMCAqLworCTB4NjcsIDB4YzAsIC8qIDAxMTAwMTExMTEwMCAqLworCTB4NDMsIDB4ODAsIC8qIDAxMDAwMDExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTI3IDB4N2YgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMjggMHg4MCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweGMwLCAvKiAwMDAwMTExMTExMDAgKi8KKwkweDEwLCAweDYwLCAvKiAwMDAxMDAwMDAxMTAgKi8KKwkweDIwLCAweDIwLCAvKiAwMDEwMDAwMDAwMTAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDIwLCAweDAwLCAvKiAwMDEwMDAwMDAwMDAgKi8KKwkweDMwLCAweDIwLCAvKiAwMDExMDAwMDAwMTAgKi8KKwkweDE4LCAweDQwLCAvKiAwMDAxMTAwMDAxMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEyOSAweDgxICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4NzksIDB4ZTAsIC8qIDAxMTExMDAxMTExMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MWUsIDB4NjAsIC8qIDAwMDExMTEwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTMwIDB4ODIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgxOCwgMHg2MCwgLyogMDAwMTEwMDAwMTEwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMzEgMHg4MyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDE4LCAweGMwLCAvKiAwMDAxMTAwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDE4LCAweGMwLCAvKiAwMDAxMTAwMDExMDAgKi8KKwkweDEwLCAweGMwLCAvKiAwMDAxMDAwMDExMDAgKi8KKwkweDAzLCAweGMwLCAvKiAwMDAwMDAxMTExMDAgKi8KKwkweDFjLCAweGMwLCAvKiAwMDAxMTEwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDFlLCAweGUwLCAvKiAwMDAxMTExMDExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEzMiAweDg0ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MTAsIDB4YzAsIC8qIDAwMDEwMDAwMTEwMCAqLworCTB4MDMsIDB4YzAsIC8qIDAwMDAwMDExMTEwMCAqLworCTB4MWMsIDB4YzAsIC8qIDAwMDExMTAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MWUsIDB4ZTAsIC8qIDAwMDExMTEwMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTMzIDB4ODUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgxMCwgMHhjMCwgLyogMDAwMTAwMDAxMTAwICovCisJMHgwMywgMHhjMCwgLyogMDAwMDAwMTExMTAwICovCisJMHgxYywgMHhjMCwgLyogMDAwMTExMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzOSwgMHhjMCwgLyogMDAxMTEwMDExMTAwICovCisJMHgxZSwgMHhlMCwgLyogMDAwMTExMTAxMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMzQgMHg4NiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDE4LCAweGMwLCAvKiAwMDAxMTAwMDExMDAgKi8KKwkweDEwLCAweGMwLCAvKiAwMDAxMDAwMDExMDAgKi8KKwkweDAzLCAweGMwLCAvKiAwMDAwMDAxMTExMDAgKi8KKwkweDFjLCAweGMwLCAvKiAwMDAxMTEwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDFlLCAweGUwLCAvKiAwMDAxMTExMDExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEzNSAweDg3ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MzEsIDB4YzAsIC8qIDAwMTEwMDAxMTEwMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTM2IDB4ODggJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMiwgMHgwMCwgLyogMDAwMDAwMTAwMDAwICovCisJMHgwNywgMHgwMCwgLyogMDAwMDAxMTEwMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHg2MCwgMHgwMCwgLyogMDExMDAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgxOCwgMHg2MCwgLyogMDAwMTEwMDAwMTEwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxMzcgMHg4OSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDE4LCAweDYwLCAvKiAwMDAxMTAwMDAxMTAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDEzOCAweDhhICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4NjAsIDB4MDAsIC8qIDAxMTAwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MTgsIDB4NjAsIC8qIDAwMDExMDAwMDExMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTM5IDB4OGIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNDAgMHg4YyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDFiLCAweDAwLCAvKiAwMDAxMTAxMTAwMDAgKi8KKwkweDMxLCAweDgwLCAvKiAwMDExMDAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE0MSAweDhkICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWUsIDB4MDAsIC8qIDAwMDExMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTQyIDB4OGUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNCwgMHgwMCwgLyogMDAwMDAxMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYiwgMHgwMCwgLyogMDAwMDEwMTEwMDAwICovCisJMHgwYiwgMHgwMCwgLyogMDAwMDEwMTEwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxMSwgMHg4MCwgLyogMDAwMTAwMDExMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgyMCwgMHhjMCwgLyogMDAxMDAwMDAxMTAwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg0MCwgMHg2MCwgLyogMDEwMDAwMDAwMTEwICovCisJMHhlMCwgMHhmMCwgLyogMTExMDAwMDAxMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNDMgMHg4ZiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDBiLCAweDAwLCAvKiAwMDAwMTAxMTAwMDAgKi8KKwkweDBiLCAweDAwLCAvKiAwMDAwMTAxMTAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDExLCAweDgwLCAvKiAwMDAxMDAwMTEwMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDIwLCAweGMwLCAvKiAwMDEwMDAwMDExMDAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDQwLCAweDYwLCAvKiAwMTAwMDAwMDAxMTAgKi8KKwkweGUwLCAweGYwLCAvKiAxMTEwMDAwMDExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE0NCAweDkwICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDgsIDB4MDAsIC8qIDAwMDAxMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MzAsIDB4MjAsIC8qIDAwMTEwMDAwMDAxMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAwMCAqLworCTB4M2YsIDB4ODAsIC8qIDAwMTExMTExMTAwMCAqLworCTB4MzAsIDB4ODAsIC8qIDAwMTEwMDAwMTAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MjAsIC8qIDAwMTEwMDAwMDAxMCAqLworCTB4MzAsIDB4MjAsIC8qIDAwMTEwMDAwMDAxMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTQ1IDB4OTEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgzZCwgMHhlMCwgLyogMDAxMTExMDExMTEwICovCisJMHg2NiwgMHgzMCwgLyogMDExMDAxMTAwMDExICovCisJMHg0NiwgMHgzMCwgLyogMDEwMDAxMTAwMDExICovCisJMHgwNiwgMHgzMCwgLyogMDAwMDAxMTAwMDExICovCisJMHgzZiwgMHhmMCwgLyogMDAxMTExMTExMTExICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMDAwICovCisJMHhjNiwgMHgwMCwgLyogMTEwMDAxMTAwMDAwICovCisJMHhjNiwgMHgwMCwgLyogMTEwMDAxMTAwMDAwICovCisJMHhlNywgMHgzMCwgLyogMTExMDAxMTEwMDExICovCisJMHg3ZCwgMHhlMCwgLyogMDExMTExMDExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNDYgMHg5MiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAzLCAweGYwLCAvKiAwMDAwMDAxMTExMTEgKi8KKwkweDA3LCAweDEwLCAvKiAwMDAwMDExMTAwMDEgKi8KKwkweDA3LCAweDEwLCAvKiAwMDAwMDExMTAwMDEgKi8KKwkweDBiLCAweDAwLCAvKiAwMDAwMTAxMTAwMDAgKi8KKwkweDBiLCAweDAwLCAvKiAwMDAwMTAxMTAwMDAgKi8KKwkweDBiLCAweDIwLCAvKiAwMDAwMTAxMTAwMTAgKi8KKwkweDEzLCAweGUwLCAvKiAwMDAxMDAxMTExMTAgKi8KKwkweDEzLCAweDIwLCAvKiAwMDAxMDAxMTAwMTAgKi8KKwkweDNmLCAweDAwLCAvKiAwMDExMTExMTAwMDAgKi8KKwkweDIzLCAweDAwLCAvKiAwMDEwMDAxMTAwMDAgKi8KKwkweDIzLCAweDAwLCAvKiAwMDEwMDAxMTAwMDAgKi8KKwkweDQzLCAweDEwLCAvKiAwMTAwMDAxMTAwMDEgKi8KKwkweDQzLCAweDEwLCAvKiAwMTAwMDAxMTAwMDEgKi8KKwkweGU3LCAweGYwLCAvKiAxMTEwMDExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE0NyAweDkzICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDIsIDB4MDAsIC8qIDAwMDAwMDEwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4ZTAsIC8qIDAwMTAwMDAwMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4MzgsIDB4ODAsIC8qIDAwMTExMDAwMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTQ4IDB4OTQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgxMSwgMHhjMCwgLyogMDAwMTAwMDExMTAwICovCisJMHgyMCwgMHhlMCwgLyogMDAxMDAwMDAxMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg3MCwgMHg0MCwgLyogMDExMTAwMDAwMTAwICovCisJMHgzOCwgMHg4MCwgLyogMDAxMTEwMDAxMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNDkgMHg5NSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDgwLCAvKiAwMDAwMTExMTEwMDAgKi8KKwkweDExLCAweGMwLCAvKiAwMDAxMDAwMTExMDAgKi8KKwkweDIwLCAweGUwLCAvKiAwMDEwMDAwMDExMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDcwLCAweDQwLCAvKiAwMTExMDAwMDAxMDAgKi8KKwkweDM4LCAweDgwLCAvKiAwMDExMTAwMDEwMDAgKi8KKwkweDFmLCAweDAwLCAvKiAwMDAxMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE1MCAweDk2ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDIsIDB4MDAsIC8qIDAwMDAwMDEwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4NzksIDB4ZTAsIC8qIDAxMTExMDAxMTExMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MWUsIDB4NjAsIC8qIDAwMDExMTEwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTUxIDB4OTcgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg3OSwgMHhlMCwgLyogMDExMTEwMDExMTEwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzOSwgMHhjMCwgLyogMDAxMTEwMDExMTAwICovCisJMHgxZSwgMHg2MCwgLyogMDAwMTExMTAwMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNTIgMHg5OCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGYwLCAweGYwLCAvKiAxMTExMDAwMDExMTEgKi8KKwkweDYwLCAweDIwLCAvKiAwMTEwMDAwMDAwMTAgKi8KKwkweDMwLCAweDQwLCAvKiAwMDExMDAwMDAxMDAgKi8KKwkweDMwLCAweDQwLCAvKiAwMDExMDAwMDAxMDAgKi8KKwkweDE4LCAweDgwLCAvKiAwMDAxMTAwMDEwMDAgKi8KKwkweDE4LCAweDgwLCAvKiAwMDAxMTAwMDEwMDAgKi8KKwkweDBkLCAweDAwLCAvKiAwMDAwMTEwMTAwMDAgKi8KKwkweDBkLCAweDAwLCAvKiAwMDAwMTEwMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA0LCAweDAwLCAvKiAwMDAwMDEwMDAwMDAgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDA4LCAweDAwLCAvKiAwMDAwMTAwMDAwMDAgKi8KKwkweDc4LCAweDAwLCAvKiAwMTExMTAwMDAwMDAgKi8KKwkweDcwLCAweDAwLCAvKiAwMTExMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE1MyAweDk5ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4MjAsIDB4NjAsIC8qIDAwMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4MjAsIDB4NDAsIC8qIDAwMTAwMDAwMDEwMCAqLworCTB4MzAsIDB4NDAsIC8qIDAwMTEwMDAwMDEwMCAqLworCTB4MTgsIDB4ODAsIC8qIDAwMDExMDAwMTAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTU0IDB4OWEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHhlMCwgMHgzMCwgLyogMTExMDAwMDAwMDExICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg2MCwgMHgyMCwgLyogMDExMDAwMDAwMDEwICovCisJMHg3MCwgMHg0MCwgLyogMDExMTAwMDAwMTAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNTUgMHg5YiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDM2LCAweGMwLCAvKiAwMDExMDExMDExMDAgKi8KKwkweDI2LCAweGMwLCAvKiAwMDEwMDExMDExMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwMDAgKi8KKwkweDc2LCAweDQwLCAvKiAwMTExMDExMDAxMDAgKi8KKwkweDM2LCAweGMwLCAvKiAwMDExMDExMDExMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE1NiAweDljICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MWMsIDB4YzAsIC8qIDAwMDExMTAwMTEwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAwMCAqLworCTB4N2UsIDB4MDAsIC8qIDAxMTExMTEwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4M2UsIDB4MjAsIC8qIDAwMTExMTEwMDAxMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4NjEsIDB4YzAsIC8qIDAxMTAwMDAxMTEwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTU3IDB4OWQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNTggMHg5ZSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweDgwLCAvKiAwMTExMTExMTEwMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweDYwLCAvKiAwMDExMDAwMDAxMTAgKi8KKwkweDMwLCAweDYwLCAvKiAwMDExMDAwMDAxMTAgKi8KKwkweDMwLCAweDYwLCAvKiAwMDExMDAwMDAxMTAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDM3LCAweDgwLCAvKiAwMDExMDExMTEwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwMDAgKi8KKwkweDM3LCAweDgwLCAvKiAwMDExMDExMTEwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwMDAgKi8KKwkweDMzLCAweDAwLCAvKiAwMDExMDAxMTAwMDAgKi8KKwkweDMzLCAweDMwLCAvKiAwMDExMDAxMTAwMTEgKi8KKwkweDMxLCAweGUwLCAvKiAwMDExMDAwMTExMTAgKi8KKwkweDc4LCAweGMwLCAvKiAwMTExMTAwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE1OSAweDlmICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDEsIDB4ZTAsIC8qIDAwMDAwMDAxMTExMCAqLworCTB4MDMsIDB4MzAsIC8qIDAwMDAwMDExMDAxMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4M2YsIDB4ZTAsIC8qIDAwMTExMTExMTExMCAqLworCTB4N2YsIDB4YzAsIC8qIDAxMTExMTExMTEwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4Y2MsIDB4MDAsIC8qIDExMDAxMTAwMDAwMCAqLworCTB4NzgsIDB4MDAsIC8qIDAxMTExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTYwIDB4YTAgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgxOCwgMHhjMCwgLyogMDAwMTEwMDAxMTAwICovCisJMHgxMCwgMHhjMCwgLyogMDAwMTAwMDAxMTAwICovCisJMHgwMywgMHhjMCwgLyogMDAwMDAwMTExMTAwICovCisJMHgxYywgMHhjMCwgLyogMDAwMTExMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzOSwgMHhjMCwgLyogMDAxMTEwMDExMTAwICovCisJMHgxZSwgMHhlMCwgLyogMDAwMTExMTAxMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNjEgMHhhMSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE2MiAweGEyICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ODAsIC8qIDAwMDAxMTExMTAwMCAqLworCTB4MTEsIDB4YzAsIC8qIDAwMDEwMDAxMTEwMCAqLworCTB4MjAsIDB4ZTAsIC8qIDAwMTAwMDAwMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NzAsIDB4NDAsIC8qIDAxMTEwMDAwMDEwMCAqLworCTB4MzgsIDB4ODAsIC8qIDAwMTExMDAwMTAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTYzIDB4YTMgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg3OSwgMHhlMCwgLyogMDExMTEwMDExMTEwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzOSwgMHhjMCwgLyogMDAxMTEwMDExMTAwICovCisJMHgxZSwgMHg2MCwgLyogMDAwMTExMTAwMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNjQgMHhhNCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFjLCAweDQwLCAvKiAwMDAxMTEwMDAxMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDIzLCAweDgwLCAvKiAwMDEwMDAxMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDI3LCAweDgwLCAvKiAwMDEwMDExMTEwMDAgKi8KKwkweDc5LCAweGMwLCAvKiAwMTExMTAwMTExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDc5LCAweGUwLCAvKiAwMTExMTAwMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE2NSAweGE1ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWMsIDB4NDAsIC8qIDAwMDExMTAwMDEwMCAqLworCTB4M2YsIDB4YzAsIC8qIDAwMTExMTExMTEwMCAqLworCTB4MjMsIDB4ODAsIC8qIDAwMTAwMDExMTAwMCAqLworCTB4YzAsIDB4NzAsIC8qIDExMDAwMDAwMDExMSAqLworCTB4NjAsIDB4MjAsIC8qIDAxMTAwMDAwMDAxMCAqLworCTB4NzAsIDB4MjAsIC8qIDAxMTEwMDAwMDAxMCAqLworCTB4NzgsIDB4MjAsIC8qIDAxMTExMDAwMDAxMCAqLworCTB4NWMsIDB4MjAsIC8qIDAxMDExMTAwMDAxMCAqLworCTB4NGUsIDB4MjAsIC8qIDAxMDAxMTEwMDAxMCAqLworCTB4NDcsIDB4MjAsIC8qIDAxMDAwMTExMDAxMCAqLworCTB4NDMsIDB4YTAsIC8qIDAxMDAwMDExMTAxMCAqLworCTB4NDEsIDB4ZTAsIC8qIDAxMDAwMDAxMTExMCAqLworCTB4NDAsIDB4ZTAsIC8qIDAxMDAwMDAwMTExMCAqLworCTB4NDAsIDB4NjAsIC8qIDAxMDAwMDAwMDExMCAqLworCTB4ZTAsIDB4MzAsIC8qIDExMTAwMDAwMDAxMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTY2IDB4YTYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgzMywgMHg4MCwgLyogMDAxMTAwMTExMDAwICovCisJMHgxZCwgMHhjMCwgLyogMDAwMTExMDExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNjcgMHhhNyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA3LCAweDAwLCAvKiAwMDAwMDExMTAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDEwLCAweGMwLCAvKiAwMDAxMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweDgwLCAvKiAwMDExMDAwMDEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE2OCAweGE4ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDMsIDB4MDAsIC8qIDAwMDAwMDExMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4NDAsIC8qIDAwMTEwMDAwMDEwMCAqLworCTB4MzksIDB4YzAsIC8qIDAwMTExMDAxMTEwMCAqLworCTB4MWYsIDB4ODAsIC8qIDAwMDExMTExMTAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTY5IDB4YTkgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNzAgMHhhYSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDAwLCAweGMwLCAvKiAwMDAwMDAwMDExMDAgKi8KKwkweDAwLCAweGMwLCAvKiAwMDAwMDAwMDExMDAgKi8KKwkweDAwLCAweGMwLCAvKiAwMDAwMDAwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE3MSAweGFiICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTAsIDB4MDAsIC8qIDAwMDEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MTAsIDB4MDAsIC8qIDAwMDEwMDAwMDAwMCAqLworCTB4MTAsIDB4NDAsIC8qIDAwMDEwMDAwMDEwMCAqLworCTB4MTAsIDB4ODAsIC8qIDAwMDEwMDAwMTAwMCAqLworCTB4MTEsIDB4MDAsIC8qIDAwMDEwMDAxMDAwMCAqLworCTB4M2EsIDB4MDAsIC8qIDAwMTExMDEwMDAwMCAqLworCTB4MDUsIDB4YzAsIC8qIDAwMDAwMTAxMTEwMCAqLworCTB4MGEsIDB4MjAsIC8qIDAwMDAxMDEwMDAxMCAqLworCTB4MTAsIDB4MjAsIC8qIDAwMDEwMDAwMDAxMCAqLworCTB4MjAsIDB4YzAsIC8qIDAwMTAwMDAwMTEwMCAqLworCTB4NDEsIDB4MDAsIC8qIDAxMDAwMDAxMDAwMCAqLworCTB4MDIsIDB4MDAsIC8qIDAwMDAwMDEwMDAwMCAqLworCTB4MDMsIDB4ZTAsIC8qIDAwMDAwMDExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTcyIDB4YWMgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgxMCwgMHgwMCwgLyogMDAwMTAwMDAwMDAwICovCisJMHgxMCwgMHg0MCwgLyogMDAwMTAwMDAwMTAwICovCisJMHgxMCwgMHg4MCwgLyogMDAwMTAwMDAxMDAwICovCisJMHgxMSwgMHgwMCwgLyogMDAwMTAwMDEwMDAwICovCisJMHgzYSwgMHg0MCwgLyogMDAxMTEwMTAwMTAwICovCisJMHgwNCwgMHhjMCwgLyogMDAwMDAxMDAxMTAwICovCisJMHgwOSwgMHg0MCwgLyogMDAwMDEwMDEwMTAwICovCisJMHgxMiwgMHg0MCwgLyogMDAwMTAwMTAwMTAwICovCisJMHgyNCwgMHg0MCwgLyogMDAxMDAxMDAwMTAwICovCisJMHg0NywgMHhlMCwgLyogMDEwMDAxMTExMTEwICovCisJMHgwMCwgMHg0MCwgLyogMDAwMDAwMDAwMTAwICovCisJMHgwMCwgMHg0MCwgLyogMDAwMDAwMDAwMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNzMgMHhhZCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE3NCAweGFlICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4NjAsIC8qIDAwMDAwMTEwMDExMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAwMCAqLworCTB4NjYsIDB4MDAsIC8qIDAxMTAwMTEwMDAwMCAqLworCTB4MzMsIDB4MDAsIC8qIDAwMTEwMDExMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MGMsIDB4YzAsIC8qIDAwMDAxMTAwMTEwMCAqLworCTB4MDYsIDB4NjAsIC8qIDAwMDAwMTEwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTc1IDB4YWYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwYywgMHhjMCwgLyogMDAwMDExMDAxMTAwICovCisJMHgwNiwgMHg2MCwgLyogMDAwMDAxMTAwMTEwICovCisJMHgwYywgMHhjMCwgLyogMDAwMDExMDAxMTAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgzMywgMHgwMCwgLyogMDAxMTAwMTEwMDAwICovCisJMHg2NiwgMHgwMCwgLyogMDExMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxNzYgMHhiMCAnLicgKi8KKwkweDBjLCAweDMwLCAvKiAwMDAwMTEwMDAwMTEgKi8KKwkweDA4LCAweDIwLCAvKiAwMDAwMTAwMDAwMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwMDAgKi8KKwkweDIwLCAweDgwLCAvKiAwMDEwMDAwMDEwMDAgKi8KKwkweDBjLCAweDMwLCAvKiAwMDAwMTEwMDAwMTEgKi8KKwkweDA4LCAweDIwLCAvKiAwMDAwMTAwMDAwMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwMDAgKi8KKwkweDIwLCAweDgwLCAvKiAwMDEwMDAwMDEwMDAgKi8KKwkweDBjLCAweDMwLCAvKiAwMDAwMTEwMDAwMTEgKi8KKwkweDA4LCAweDIwLCAvKiAwMDAwMTAwMDAwMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwMDAgKi8KKwkweDIwLCAweDgwLCAvKiAwMDEwMDAwMDEwMDAgKi8KKwkweDBjLCAweDMwLCAvKiAwMDAwMTEwMDAwMTEgKi8KKwkweDA4LCAweDIwLCAvKiAwMDAwMTAwMDAwMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwMDAgKi8KKwkweDIwLCAweDgwLCAvKiAwMDEwMDAwMDEwMDAgKi8KKwkweDBjLCAweDMwLCAvKiAwMDAwMTEwMDAwMTEgKi8KKwkweDA4LCAweDIwLCAvKiAwMDAwMTAwMDAwMTAgKi8KKwkweDYxLCAweDgwLCAvKiAwMTEwMDAwMTEwMDAgKi8KKwkweDIwLCAweDgwLCAvKiAwMDEwMDAwMDEwMDAgKi8KKwkweDBjLCAweDMwLCAvKiAwMDAwMTEwMDAwMTEgKi8KKwkweDA4LCAweDIwLCAvKiAwMDAwMTAwMDAwMTAgKi8KKworCS8qIDE3NyAweGIxICcuJyAqLworCTB4NzcsIDB4NzAsIC8qIDAxMTEwMTExMDExMSAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4ZGQsIDB4ZDAsIC8qIDExMDExMTAxMTEwMSAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4NzcsIDB4NzAsIC8qIDAxMTEwMTExMDExMSAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4ZGQsIDB4ZDAsIC8qIDExMDExMTAxMTEwMSAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4NzcsIDB4NzAsIC8qIDAxMTEwMTExMDExMSAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4ZGQsIDB4ZDAsIC8qIDExMDExMTAxMTEwMSAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4NzcsIDB4NzAsIC8qIDAxMTEwMTExMDExMSAqLworCTB4MjIsIDB4MjAsIC8qIDAwMTAwMDEwMDAxMCAqLworCTB4ODgsIDB4ODAsIC8qIDEwMDAxMDAwMTAwMCAqLworCTB4ZGQsIDB4ZDAsIC8qIDExMDExMTAxMTEwMSAqLworCisJLyogMTc4IDB4YjIgJy4nICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMTAwICovCisJMHhmNywgMHhkMCwgLyogMTExMTAxMTExMTAxICovCisJMHg5ZSwgMHg3MCwgLyogMTAwMTExMTAwMTExICovCisJMHhkZiwgMHg3MCwgLyogMTEwMTExMTEwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMTAwICovCisJMHhmNywgMHhkMCwgLyogMTExMTAxMTExMTAxICovCisJMHg5ZSwgMHg3MCwgLyogMTAwMTExMTAwMTExICovCisJMHhkZiwgMHg3MCwgLyogMTEwMTExMTEwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMTAwICovCisJMHhmNywgMHhkMCwgLyogMTExMTAxMTExMTAxICovCisJMHg5ZSwgMHg3MCwgLyogMTAwMTExMTAwMTExICovCisJMHhkZiwgMHg3MCwgLyogMTEwMTExMTEwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMTAwICovCisJMHhmNywgMHhkMCwgLyogMTExMTAxMTExMTAxICovCisJMHg5ZSwgMHg3MCwgLyogMTAwMTExMTAwMTExICovCisJMHhkZiwgMHg3MCwgLyogMTEwMTExMTEwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMTAwICovCisJMHhmNywgMHhkMCwgLyogMTExMTAxMTExMTAxICovCisJMHg5ZSwgMHg3MCwgLyogMTAwMTExMTAwMTExICovCisJMHhkZiwgMHg3MCwgLyogMTEwMTExMTEwMTExICovCisJMHhmMywgMHhjMCwgLyogMTExMTAwMTExMTAwICovCisJMHhmNywgMHhkMCwgLyogMTExMTAxMTExMTAxICovCisKKwkvKiAxNzkgMHhiMyAnLicgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKworCS8qIDE4MCAweGI0ICcuJyAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4ZmUsIDB4MDAsIC8qIDExMTExMTEwMDAwMCAqLworCTB4ZmUsIDB4MDAsIC8qIDExMTExMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCisJLyogMTgxIDB4YjUgJy4nICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisKKwkvKiAxODIgMHhiNiAnLicgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKworCS8qIDE4MyAweGI3ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCisJLyogMTg0IDB4YjggJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisKKwkvKiAxODUgMHhiOSAnLicgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKworCS8qIDE4NiAweGJhICcuJyAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCisJLyogMTg3IDB4YmIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHg4MCwgLyogMTExMTExMTExMDAwICovCisJMHhmZiwgMHg4MCwgLyogMTExMTExMTExMDAwICovCisJMHgwMSwgMHg4MCwgLyogMDAwMDAwMDExMDAwICovCisJMHhmZCwgMHg4MCwgLyogMTExMTExMDExMDAwICovCisJMHhmZCwgMHg4MCwgLyogMTExMTExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisKKwkvKiAxODggMHhiYyAnLicgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweGZkLCAweDgwLCAvKiAxMTExMTEwMTEwMDAgKi8KKwkweDAxLCAweDgwLCAvKiAwMDAwMDAwMTEwMDAgKi8KKwkweGZmLCAweDgwLCAvKiAxMTExMTExMTEwMDAgKi8KKwkweGZmLCAweDgwLCAvKiAxMTExMTExMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDE4OSAweGJkICcuJyAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAwMCAqLworCTB4ZmYsIDB4ODAsIC8qIDExMTExMTExMTAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTkwIDB4YmUgJy4nICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxOTEgMHhiZiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZlLCAweDAwLCAvKiAxMTExMTExMDAwMDAgKi8KKwkweGZlLCAweDAwLCAvKiAxMTExMTExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKworCS8qIDE5MiAweGMwICcuJyAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMTkzIDB4YzEgJy4nICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxOTQgMHhjMiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKworCS8qIDE5NSAweGMzICcuJyAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCisJLyogMTk2IDB4YzQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAxOTcgMHhjNSAnLicgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKworCS8qIDE5OCAweGM2ICcuJyAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCisJLyogMTk5IDB4YzcgJy4nICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHhmMCwgLyogMDAwMDExMDExMTExICovCisJMHgwZCwgMHhmMCwgLyogMDAwMDExMDExMTExICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisKKwkvKiAyMDAgMHhjOCAnLicgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweGYwLCAvKiAwMDAwMTEwMTExMTEgKi8KKwkweDBkLCAweGYwLCAvKiAwMDAwMTEwMTExMTEgKi8KKwkweDBjLCAweDAwLCAvKiAwMDAwMTEwMDAwMDAgKi8KKwkweDBmLCAweGYwLCAvKiAwMDAwMTExMTExMTEgKi8KKwkweDBmLCAweGYwLCAvKiAwMDAwMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIwMSAweGM5ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4ZjAsIC8qIDAwMDAxMTExMTExMSAqLworCTB4MGYsIDB4ZjAsIC8qIDAwMDAxMTExMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGQsIDB4ZjAsIC8qIDAwMDAxMTAxMTExMSAqLworCTB4MGQsIDB4ZjAsIC8qIDAwMDAxMTAxMTExMSAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCisJLyogMjAyIDB4Y2EgJy4nICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHhmZCwgMHhmMCwgLyogMTExMTExMDExMTExICovCisJMHhmZCwgMHhmMCwgLyogMTExMTExMDExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMDMgMHhjYiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZkLCAweGYwLCAvKiAxMTExMTEwMTExMTEgKi8KKwkweGZkLCAweGYwLCAvKiAxMTExMTEwMTExMTEgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKworCS8qIDIwNCAweGNjICcuJyAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ZjAsIC8qIDAwMDAxMTAxMTExMSAqLworCTB4MGQsIDB4ZjAsIC8qIDAwMDAxMTAxMTExMSAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MGQsIDB4ZjAsIC8qIDAwMDAxMTAxMTExMSAqLworCTB4MGQsIDB4ZjAsIC8qIDAwMDAxMTAxMTExMSAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCisJLyogMjA1IDB4Y2QgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMDYgMHhjZSAnLicgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweGZkLCAweGYwLCAvKiAxMTExMTEwMTExMTEgKi8KKwkweGZkLCAweGYwLCAvKiAxMTExMTEwMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZkLCAweGYwLCAvKiAxMTExMTEwMTExMTEgKi8KKwkweGZkLCAweGYwLCAvKiAxMTExMTEwMTExMTEgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKworCS8qIDIwNyAweGNmICcuJyAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjA4IDB4ZDAgJy4nICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMDkgMHhkMSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKworCS8qIDIxMCAweGQyICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCTB4MGQsIDB4ODAsIC8qIDAwMDAxMTAxMTAwMCAqLworCisJLyogMjExIDB4ZDMgJy4nICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZiwgMHhmMCwgLyogMDAwMDExMTExMTExICovCisJMHgwZiwgMHhmMCwgLyogMDAwMDExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMTIgMHhkNCAnLicgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA3LCAweGYwLCAvKiAwMDAwMDExMTExMTEgKi8KKwkweDA3LCAweGYwLCAvKiAwMDAwMDExMTExMTEgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA3LCAweGYwLCAvKiAwMDAwMDExMTExMTEgKi8KKwkweDA3LCAweGYwLCAvKiAwMDAwMDExMTExMTEgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIxMyAweGQ1ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDcsIDB4ZjAsIC8qIDAwMDAwMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCisJLyogMjE0IDB4ZDYgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHhmMCwgLyogMDAwMDExMTExMTExICovCisJMHgwZiwgMHhmMCwgLyogMDAwMDExMTExMTExICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisJMHgwZCwgMHg4MCwgLyogMDAwMDExMDExMDAwICovCisKKwkvKiAyMTUgMHhkNyAnLicgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweGZmLCAweGYwLCAvKiAxMTExMTExMTExMTEgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKwkweDBkLCAweDgwLCAvKiAwMDAwMTEwMTEwMDAgKi8KKworCS8qIDIxNiAweGQ4ICcuJyAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCisJLyogMjE3IDB4ZDkgJy4nICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHhmZSwgMHgwMCwgLyogMTExMTExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMTggMHhkYSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA3LCAweGYwLCAvKiAwMDAwMDExMTExMTEgKi8KKwkweDA3LCAweGYwLCAvKiAwMDAwMDExMTExMTEgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKworCS8qIDIxOSAweGRiICcuJyAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCTB4ZmYsIDB4ZjAsIC8qIDExMTExMTExMTExMSAqLworCisJLyogMjIwIDB4ZGMgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisKKwkvKiAyMjEgMHhkZCAnLicgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKwkweGZjLCAweDAwLCAvKiAxMTExMTEwMDAwMDAgKi8KKworCS8qIDIyMiAweGRlICcuJyAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCTB4MDMsIDB4ZjAsIC8qIDAwMDAwMDExMTExMSAqLworCisJLyogMjIzIDB4ZGYgJy4nICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHhmZiwgMHhmMCwgLyogMTExMTExMTExMTExICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMjQgMHhlMCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDYwLCAvKiAwMDAwMTExMTAxMTAgKi8KKwkweDEzLCAweGUwLCAvKiAwMDAxMDAxMTExMTAgKi8KKwkweDIxLCAweGMwLCAvKiAwMDEwMDAwMTExMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDYwLCAweGMwLCAvKiAwMTEwMDAwMDExMDAgKi8KKwkweDcwLCAweDgwLCAvKiAwMTExMDAwMDEwMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDFmLCAweDYwLCAvKiAwMDAxMTExMTAxMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIyNSAweGUxICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MGYsIDB4MDAsIC8qIDAwMDAxMTExMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAwMCAqLworCTB4MzcsIDB4ODAsIC8qIDAwMTEwMTExMTAwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAwMCAqLworCTB4NzcsIDB4MDAsIC8qIDAxMTEwMTExMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjI2IDB4ZTIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgzZiwgMHhlMCwgLyogMDAxMTExMTExMTEwICovCisJMHgzZiwgMHhlMCwgLyogMDAxMTExMTExMTEwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHgzMCwgMHg2MCwgLyogMDAxMTAwMDAwMTEwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgzMCwgMHgwMCwgLyogMDAxMTAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMjcgMHhlMyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIyOCAweGU0ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4MzAsIDB4NjAsIC8qIDAwMTEwMDAwMDExMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MGMsIDB4MDAsIC8qIDAwMDAxMTAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4NjAsIC8qIDAwMTEwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjI5IDB4ZTUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNywgMHhlMCwgLyogMDAwMDAxMTExMTEwICovCisJMHgwZiwgMHhlMCwgLyogMDAwMDExMTExMTEwICovCisJMHgxMywgMHg4MCwgLyogMDAwMTAwMTExMDAwICovCisJMHgyMSwgMHhjMCwgLyogMDAxMDAwMDExMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg2MCwgMHhjMCwgLyogMDExMDAwMDAxMTAwICovCisJMHg3MCwgMHg4MCwgLyogMDExMTAwMDAxMDAwICovCisJMHgzOSwgMHgwMCwgLyogMDAxMTEwMDEwMDAwICovCisJMHgxZSwgMHgwMCwgLyogMDAwMTExMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMzAgMHhlNiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDM2LCAweGUwLCAvKiAwMDExMDExMDExMTAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDMwLCAweDAwLCAvKiAwMDExMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIzMSAweGU3ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4M2YsIDB4YzAsIC8qIDAwMTExMTExMTEwMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjMyIDB4ZTggJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgzMCwgMHhjMCwgLyogMDAxMTAwMDAxMTAwICovCisJMHgxOSwgMHg4MCwgLyogMDAwMTEwMDExMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMzMgMHhlOSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDYwLCAweDYwLCAvKiAwMTEwMDAwMDAxMTAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIzNCAweGVhICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWYsIDB4MDAsIC8qIDAwMDExMTExMDAwMCAqLworCTB4MzEsIDB4ODAsIC8qIDAwMTEwMDAxMTAwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4NjAsIDB4NjAsIC8qIDAxMTAwMDAwMDExMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MzAsIDB4YzAsIC8qIDAwMTEwMDAwMTEwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4MTksIDB4ODAsIC8qIDAwMDExMDAxMTAwMCAqLworCTB4ZDksIDB4YjAsIC8qIDExMDExMDAxMTAxMSAqLworCTB4NzksIDB4ZTAsIC8qIDAxMTExMDAxMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjM1IDB4ZWIgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNywgMHg4MCwgLyogMDAwMDAxMTExMDAwICovCisJMHgwYywgMHhjMCwgLyogMDAwMDExMDAxMTAwICovCisJMHgxOCwgMHg2MCwgLyogMDAwMTEwMDAwMTEwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwZiwgMHg4MCwgLyogMDAwMDExMTExMDAwICovCisJMHgxMSwgMHhjMCwgLyogMDAwMTAwMDExMTAwICovCisJMHgyMCwgMHhlMCwgLyogMDAxMDAwMDAxMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg2MCwgMHg2MCwgLyogMDExMDAwMDAwMTEwICovCisJMHg3MCwgMHg0MCwgLyogMDExMTAwMDAwMTAwICovCisJMHgzOCwgMHg4MCwgLyogMDAxMTEwMDAxMDAwICovCisJMHgxZiwgMHgwMCwgLyogMDAwMTExMTEwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMzYgMHhlYyAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDZmLCAweDYwLCAvKiAwMTEwMTExMTAxMTAgKi8KKwkweDY2LCAweDYwLCAvKiAwMTEwMDExMDAxMTAgKi8KKwkweGM2LCAweDMwLCAvKiAxMTAwMDExMDAwMTEgKi8KKwkweGM2LCAweDMwLCAvKiAxMTAwMDExMDAwMTEgKi8KKwkweDY2LCAweDYwLCAvKiAwMTEwMDExMDAxMTAgKi8KKwkweDZmLCAweDYwLCAvKiAwMTEwMTExMTAxMTAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDIzNyAweGVkICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDAsIDB4YzAsIC8qIDAwMDAwMDAwMTEwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4MDEsIDB4ODAsIC8qIDAwMDAwMDAxMTAwMCAqLworCTB4M2IsIDB4YzAsIC8qIDAwMTExMDExMTEwMCAqLworCTB4NmYsIDB4NjAsIC8qIDAxMTAxMTExMDExMCAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4YzYsIDB4MzAsIC8qIDExMDAwMTEwMDAxMSAqLworCTB4YzYsIDB4MzAsIC8qIDExMDAwMTEwMDAxMSAqLworCTB4NjYsIDB4NjAsIC8qIDAxMTAwMTEwMDExMCAqLworCTB4NmYsIDB4NjAsIC8qIDAxMTAxMTExMDExMCAqLworCTB4M2QsIDB4YzAsIC8qIDAwMTExMTAxMTEwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MTgsIDB4MDAsIC8qIDAwMDExMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MzAsIDB4MDAsIC8qIDAwMTEwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjM4IDB4ZWUgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgxZiwgMHhjMCwgLyogMDAwMTExMTExMTAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyMzkgMHhlZiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDFmLCAweDgwLCAvKiAwMDAxMTExMTEwMDAgKi8KKwkweDM5LCAweGMwLCAvKiAwMDExMTAwMTExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDMwLCAweGMwLCAvKiAwMDExMDAwMDExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI0MCAweGYwICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjQxIDB4ZjEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHg3ZiwgMHhlMCwgLyogMDExMTExMTExMTEwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyNDIgMHhmMiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwMDAgKi8KKwkweDAwLCAweGUwLCAvKiAwMDAwMDAwMDExMTAgKi8KKwkweDAwLCAweGUwLCAvKiAwMDAwMDAwMDExMTAgKi8KKwkweDAzLCAweDgwLCAvKiAwMDAwMDAxMTEwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDM4LCAweDAwLCAvKiAwMDExMTAwMDAwMDAgKi8KKwkweDYwLCAweDAwLCAvKiAwMTEwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDdmLCAweGUwLCAvKiAwMTExMTExMTExMTAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI0MyAweGYzICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDEsIDB4YzAsIC8qIDAwMDAwMDAxMTEwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAwMCAqLworCTB4NzAsIDB4MDAsIC8qIDAxMTEwMDAwMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAwMCAqLworCTB4MDcsIDB4MDAsIC8qIDAwMDAwMTExMDAwMCAqLworCTB4MDEsIDB4YzAsIC8qIDAwMDAwMDAxMTEwMCAqLworCTB4MDAsIDB4NjAsIC8qIDAwMDAwMDAwMDExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjQ0IDB4ZjQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMywgMHg4MCwgLyogMDAwMDAwMTExMDAwICovCisJMHgwNywgMHhjMCwgLyogMDAwMDAxMTExMTAwICovCisJMHgwYywgMHg2MCwgLyogMDAwMDExMDAwMTEwICovCisJMHgwYywgMHg2MCwgLyogMDAwMDExMDAwMTEwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisKKwkvKiAyNDUgMHhmNSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDFjLCAweDAwLCAvKiAwMDAxMTEwMDAwMDAgKi8KKwkweDNlLCAweDAwLCAvKiAwMDExMTExMDAwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwMDAgKi8KKwkweDYzLCAweDAwLCAvKiAwMTEwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKwkweDAzLCAweDAwLCAvKiAwMDAwMDAxMTAwMDAgKi8KKworCS8qIDI0NiAweGY2ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4N2YsIDB4ZTAsIC8qIDAxMTExMTExMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDYsIDB4MDAsIC8qIDAwMDAwMTEwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjQ3IDB4ZjcgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgzOCwgMHgwMCwgLyogMDAxMTEwMDAwMDAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMDAwICovCisJMHgwNiwgMHgzMCwgLyogMDAwMDAxMTAwMDExICovCisJMHgwMywgMHg2MCwgLyogMDAwMDAwMTEwMTEwICovCisJMHgzOSwgMHhjMCwgLyogMDAxMTEwMDExMTAwICovCisJMHg2YywgMHgwMCwgLyogMDExMDExMDAwMDAwICovCisJMHgwNiwgMHgzMCwgLyogMDAwMDAxMTAwMDExICovCisJMHgwMywgMHg2MCwgLyogMDAwMDAwMTEwMTEwICovCisJMHgwMSwgMHhjMCwgLyogMDAwMDAwMDExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyNDggMHhmOCAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDE5LCAweDgwLCAvKiAwMDAxMTAwMTEwMDAgKi8KKwkweDBmLCAweDAwLCAvKiAwMDAwMTExMTAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI0OSAweGY5ICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAwMCAqLworCTB4M2UsIDB4MDAsIC8qIDAwMTExMTEwMDAwMCAqLworCTB4MWMsIDB4MDAsIC8qIDAwMDExMTAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjUwIDB4ZmEgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMDAwICovCisJMHgzYywgMHgwMCwgLyogMDAxMTExMDAwMDAwICovCisJMHgxOCwgMHgwMCwgLyogMDAwMTEwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyNTEgMHhmYiAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDA3LCAweGUwLCAvKiAwMDAwMDExMTExMTAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweGM2LCAweDAwLCAvKiAxMTAwMDExMDAwMDAgKi8KKwkweDY2LCAweDAwLCAvKiAwMTEwMDExMDAwMDAgKi8KKwkweDM2LCAweDAwLCAvKiAwMDExMDExMDAwMDAgKi8KKwkweDFlLCAweDAwLCAvKiAwMDAxMTExMDAwMDAgKi8KKwkweDBlLCAweDAwLCAvKiAwMDAwMTExMDAwMDAgKi8KKwkweDA2LCAweDAwLCAvKiAwMDAwMDExMDAwMDAgKi8KKwkweDAyLCAweDAwLCAvKiAwMDAwMDAxMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI1MiAweGZjICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MTMsIDB4ODAsIC8qIDAwMDEwMDExMTAwMCAqLworCTB4M2QsIDB4YzAsIC8qIDAwMTExMTAxMTEwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4MTgsIDB4YzAsIC8qIDAwMDExMDAwMTEwMCAqLworCTB4M2QsIDB4ZTAsIC8qIDAwMTExMTAxMTExMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCisJLyogMjUzIDB4ZmQgJy4nICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwZiwgMHgwMCwgLyogMDAwMDExMTEwMDAwICovCisJMHgxZiwgMHg4MCwgLyogMDAwMTExMTExMDAwICovCisJMHgzMSwgMHg4MCwgLyogMDAxMTAwMDExMDAwICovCisJMHgyMSwgMHg4MCwgLyogMDAxMDAwMDExMDAwICovCisJMHgwMywgMHgwMCwgLyogMDAwMDAwMTEwMDAwICovCisJMHgwNiwgMHgwMCwgLyogMDAwMDAxMTAwMDAwICovCisJMHgwYywgMHgwMCwgLyogMDAwMDExMDAwMDAwICovCisJMHgxOCwgMHg0MCwgLyogMDAwMTEwMDAwMTAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgzZiwgMHhjMCwgLyogMDAxMTExMTExMTAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisJMHgwMCwgMHgwMCwgLyogMDAwMDAwMDAwMDAwICovCisKKwkvKiAyNTQgMHhmZSAnLicgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDNmLCAweGMwLCAvKiAwMDExMTExMTExMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKwkweDAwLCAweDAwLCAvKiAwMDAwMDAwMDAwMDAgKi8KKworCS8qIDI1NSAweGZmICcuJyAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCTB4MDAsIDB4MDAsIC8qIDAwMDAwMDAwMDAwMCAqLworCit9OworCisKK2NvbnN0IHN0cnVjdCBmb250X2Rlc2MgZm9udF9zdW5fMTJ4MjIgPSB7CisJLmlkeAk9IFNVTjEyeDIyX0lEWCwKKwkubmFtZQk9ICJTVU4xMngyMiIsCisJLndpZHRoCT0gMTIsCisJLmhlaWdodAk9IDIyLAorCS5kYXRhCT0gZm9udGRhdGFfc3VuMTJ4MjIsCisjaWZkZWYgX19zcGFyY19fCisJLnByZWYJPSA1LAorI2Vsc2UKKwkucHJlZgk9IC0xLAorI2VuZGlmCit9OwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF9zdW44eDE2LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250X3N1bjh4MTYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2Q3MWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZm9udHMvZm9udF9zdW44eDE2LmMKQEAgLTAsMCArMSwyNzYgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvZm9udC5oPgorCisjZGVmaW5lIEZPTlREQVRBTUFYIDQwOTYKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZm9udGRhdGFfc3VuOHgxNltGT05UREFUQU1BWF0gPSB7CisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4N2UsMHg4MSwweGE1LDB4ODEsMHg4MSwweGJkLDB4OTksMHg4MSwweDgxLDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDdlLDB4ZmYsMHhkYiwweGZmLDB4ZmYsMHhjMywweGU3LDB4ZmYsMHhmZiwweDdlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4NmMsMHhmZSwweGZlLDB4ZmUsMHhmZSwweDdjLDB4MzgsMHgxMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MzgsMHg3YywweGZlLDB4N2MsMHgzOCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MTgsMHgzYywweDNjLDB4ZTcsMHhlNywweGU3LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDE4LDB4M2MsMHg3ZSwweGZmLDB4ZmYsMHg3ZSwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDNjLDB4M2MsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZTcsMHhjMywweGMzLDB4ZTcsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzYywweDY2LDB4NDIsMHg0MiwweDY2LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4YzMsMHg5OSwweGJkLDB4YmQsMHg5OSwweGMzLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKy8qICovIDB4MDAsMHgwMCwweDFlLDB4MGUsMHgxYSwweDMyLDB4NzgsMHhjYywweGNjLDB4Y2MsMHhjYywweDc4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgzYywweDY2LDB4NjYsMHg2NiwweDY2LDB4M2MsMHgxOCwweDdlLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4M2YsMHgzMywweDNmLDB4MzAsMHgzMCwweDMwLDB4MzAsMHg3MCwweGYwLDB4ZTAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDdmLDB4NjMsMHg3ZiwweDYzLDB4NjMsMHg2MywweDYzLDB4NjcsMHhlNywweGU2LDB4YzAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDE4LDB4MTgsMHhkYiwweDNjLDB4ZTcsMHgzYywweGRiLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDgwLDB4YzAsMHhlMCwweGYwLDB4ZjgsMHhmZSwweGY4LDB4ZjAsMHhlMCwweGMwLDB4ODAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMiwweDA2LDB4MGUsMHgxZSwweDNlLDB4ZmUsMHgzZSwweDFlLDB4MGUsMHgwNiwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgxOCwweDNjLDB4N2UsMHgxOCwweDE4LDB4MTgsMHg3ZSwweDNjLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHgwMCwweDY2LDB4NjYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDdmLDB4ZGIsMHhkYiwweGRiLDB4N2IsMHgxYiwweDFiLDB4MWIsMHgxYiwweDFiLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4N2MsMHhjNiwweDYwLDB4MzgsMHg2YywweGM2LDB4YzYsMHg2YywweDM4LDB4MGMsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHhmZSwweGZlLDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDE4LDB4M2MsMHg3ZSwweDE4LDB4MTgsMHgxOCwweDdlLDB4M2MsMHgxOCwweDdlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgxOCwweDNjLDB4N2UsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHg3ZSwweDNjLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MGMsMHhmZSwweDBjLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzMCwweDYwLDB4ZmUsMHg2MCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjMCwweGMwLDB4YzAsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDI0LDB4NjYsMHhmZiwweDY2LDB4MjQsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MTAsMHgzOCwweDM4LDB4N2MsMHg3YywweGZlLDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweGZlLDB4ZmUsMHg3YywweDdjLDB4MzgsMHgzOCwweDEwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiEqLyAweDAwLDB4MDAsMHgxOCwweDNjLDB4M2MsMHgzYywweDE4LDB4MTgsMHgxOCwweDAwLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyoiKi8gMHgwMCwweDY2LDB4NjYsMHg2NiwweDI0LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qIyovIDB4MDAsMHgwMCwweDAwLDB4NmMsMHg2YywweGZlLDB4NmMsMHg2YywweDZjLDB4ZmUsMHg2YywweDZjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiQqLyAweDE4LDB4MTgsMHg3YywweGM2LDB4YzIsMHhjMCwweDdjLDB4MDYsMHgwNiwweDg2LDB4YzYsMHg3YywweDE4LDB4MTgsMHgwMCwweDAwLAorLyolKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweGMyLDB4YzYsMHgwYywweDE4LDB4MzAsMHg2MCwweGM2LDB4ODYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qJiovIDB4MDAsMHgwMCwweDM4LDB4NmMsMHg2YywweDM4LDB4NzYsMHhkYywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKicqLyAweDAwLDB4MzAsMHgzMCwweDMwLDB4NjAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyooKi8gMHgwMCwweDAwLDB4MGMsMHgxOCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDE4LDB4MGMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qKSovIDB4MDAsMHgwMCwweDMwLDB4MTgsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgxOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKioqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NiwweDNjLDB4ZmYsMHgzYywweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyorKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDdlLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qLCovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDE4LDB4MzAsMHgwMCwweDAwLDB4MDAsCisvKi0qLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyouKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMiwweDA2LDB4MGMsMHgxOCwweDMwLDB4NjAsMHhjMCwweDgwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjAqLyAweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjZSwweGRlLDB4ZjYsMHhlNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyoxKi8gMHgwMCwweDAwLDB4MTgsMHgzOCwweDc4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qMiovIDB4MDAsMHgwMCwweDdjLDB4YzYsMHgwNiwweDBjLDB4MTgsMHgzMCwweDYwLDB4YzAsMHhjNiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjMqLyAweDAwLDB4MDAsMHg3YywweGM2LDB4MDYsMHgwNiwweDNjLDB4MDYsMHgwNiwweDA2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyo0Ki8gMHgwMCwweDAwLDB4MGMsMHgxYywweDNjLDB4NmMsMHhjYywweGZlLDB4MGMsMHgwYywweDBjLDB4MWUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qNSovIDB4MDAsMHgwMCwweGZlLDB4YzAsMHhjMCwweGMwLDB4ZmMsMHgwNiwweDA2LDB4MDYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjYqLyAweDAwLDB4MDAsMHgzOCwweDYwLDB4YzAsMHhjMCwweGZjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyo3Ki8gMHgwMCwweDAwLDB4ZmUsMHhjNiwweDA2LDB4MDYsMHgwYywweDE4LDB4MzAsMHgzMCwweDMwLDB4MzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qOCovIDB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjkqLyAweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweDdlLDB4MDYsMHgwNiwweDA2LDB4MGMsMHg3OCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyo6Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qOyovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDMwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKjwqLyAweDAwLDB4MDAsMHgwMCwweDA2LDB4MGMsMHgxOCwweDMwLDB4NjAsMHgzMCwweDE4LDB4MGMsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLAorLyo9Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2UsMHgwMCwweDAwLDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qPiovIDB4MDAsMHgwMCwweDAwLDB4NjAsMHgzMCwweDE4LDB4MGMsMHgwNiwweDBjLDB4MTgsMHgzMCwweDYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKj8qLyAweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHgwYywweDE4LDB4MTgsMHgxOCwweDAwLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypAKi8gMHgwMCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhkZSwweGRlLDB4ZGUsMHhkYywweGMwLDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qQSovIDB4MDAsMHgwMCwweDEwLDB4MzgsMHg2YywweGM2LDB4YzYsMHhmZSwweGM2LDB4YzYsMHhjNiwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkIqLyAweDAwLDB4MDAsMHhmYywweDY2LDB4NjYsMHg2NiwweDdjLDB4NjYsMHg2NiwweDY2LDB4NjYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLAorLypDKi8gMHgwMCwweDAwLDB4M2MsMHg2NiwweGMyLDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMiwweDY2LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qRCovIDB4MDAsMHgwMCwweGY4LDB4NmMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2YywweGY4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkUqLyAweDAwLDB4MDAsMHhmZSwweDY2LDB4NjIsMHg2OCwweDc4LDB4NjgsMHg2MCwweDYyLDB4NjYsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLAorLypGKi8gMHgwMCwweDAwLDB4ZmUsMHg2NiwweDYyLDB4NjgsMHg3OCwweDY4LDB4NjAsMHg2MCwweDYwLDB4ZjAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qRyovIDB4MDAsMHgwMCwweDNjLDB4NjYsMHhjMiwweGMwLDB4YzAsMHhkZSwweGM2LDB4YzYsMHg2NiwweDNhLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKkgqLyAweDAwLDB4MDAsMHhjNiwweGM2LDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLAorLypJKi8gMHgwMCwweDAwLDB4M2MsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qSiovIDB4MDAsMHgwMCwweDFlLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweGNjLDB4Y2MsMHhjYywweDc4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKksqLyAweDAwLDB4MDAsMHhlNiwweDY2LDB4NjYsMHg2YywweDc4LDB4NzgsMHg2YywweDY2LDB4NjYsMHhlNiwweDAwLDB4MDAsMHgwMCwweDAwLAorLypMKi8gMHgwMCwweDAwLDB4ZjAsMHg2MCwweDYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHg2MiwweDY2LDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qTSovIDB4MDAsMHgwMCwweGMzLDB4ZTcsMHhmZiwweGZmLDB4ZGIsMHhjMywweGMzLDB4YzMsMHhjMywweGMzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKk4qLyAweDAwLDB4MDAsMHhjNiwweGU2LDB4ZjYsMHhmZSwweGRlLDB4Y2UsMHhjNiwweGM2LDB4YzYsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLAorLypPKi8gMHgwMCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qUCovIDB4MDAsMHgwMCwweGZjLDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2MCwweDYwLDB4NjAsMHg2MCwweGYwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKlEqLyAweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGQ2LDB4ZGUsMHg3YywweDBjLDB4MGUsMHgwMCwweDAwLAorLypSKi8gMHgwMCwweDAwLDB4ZmMsMHg2NiwweDY2LDB4NjYsMHg3YywweDZjLDB4NjYsMHg2NiwweDY2LDB4ZTYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qUyovIDB4MDAsMHgwMCwweDdjLDB4YzYsMHhjNiwweDYwLDB4MzgsMHgwYywweDA2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKlQqLyAweDAwLDB4MDAsMHhmZiwweGRiLDB4OTksMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorLypVKi8gMHgwMCwweDAwLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qViovIDB4MDAsMHgwMCwweGMzLDB4YzMsMHhjMywweGMzLDB4YzMsMHhjMywweGMzLDB4NjYsMHgzYywweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKlcqLyAweDAwLDB4MDAsMHhjMywweGMzLDB4YzMsMHhjMywweGMzLDB4ZGIsMHhkYiwweGZmLDB4NjYsMHg2NiwweDAwLDB4MDAsMHgwMCwweDAwLAorLypYKi8gMHgwMCwweDAwLDB4YzMsMHhjMywweDY2LDB4M2MsMHgxOCwweDE4LDB4M2MsMHg2NiwweGMzLDB4YzMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qWSovIDB4MDAsMHgwMCwweGMzLDB4YzMsMHhjMywweDY2LDB4M2MsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKloqLyAweDAwLDB4MDAsMHhmZiwweGMzLDB4ODYsMHgwYywweDE4LDB4MzAsMHg2MCwweGMxLDB4YzMsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLAorLypbKi8gMHgwMCwweDAwLDB4M2MsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzMCwweDMwLDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qXCovIDB4MDAsMHgwMCwweDAwLDB4ODAsMHhjMCwweGUwLDB4NzAsMHgzOCwweDFjLDB4MGUsMHgwNiwweDAyLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKl0qLyAweDAwLDB4MDAsMHgzYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorLypeKi8gMHgxMCwweDM4LDB4NmMsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qXyovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZiwweDAwLDB4MDAsCisvKmAqLyAweDMwLDB4MzAsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyphKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qYiovIDB4MDAsMHgwMCwweGUwLDB4NjAsMHg2MCwweDc4LDB4NmMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKmMqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3YywweGM2LDB4YzAsMHhjMCwweGMwLDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLypkKi8gMHgwMCwweDAwLDB4MWMsMHgwYywweDBjLDB4M2MsMHg2YywweGNjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qZSovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDdjLDB4YzYsMHhmZSwweGMwLDB4YzAsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKmYqLyAweDAwLDB4MDAsMHgzOCwweDZjLDB4NjQsMHg2MCwweGYwLDB4NjAsMHg2MCwweDYwLDB4NjAsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypnKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzYsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4N2MsMHgwYywweGNjLDB4NzgsMHgwMCwKKy8qaCovIDB4MDAsMHgwMCwweGUwLDB4NjAsMHg2MCwweDZjLDB4NzYsMHg2NiwweDY2LDB4NjYsMHg2NiwweGU2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKmkqLyAweDAwLDB4MDAsMHgxOCwweDE4LDB4MDAsMHgzOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorLypqKi8gMHgwMCwweDAwLDB4MDYsMHgwNiwweDAwLDB4MGUsMHgwNiwweDA2LDB4MDYsMHgwNiwweDA2LDB4MDYsMHg2NiwweDY2LDB4M2MsMHgwMCwKKy8qayovIDB4MDAsMHgwMCwweGUwLDB4NjAsMHg2MCwweDY2LDB4NmMsMHg3OCwweDc4LDB4NmMsMHg2NiwweGU2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKmwqLyAweDAwLDB4MDAsMHgzOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorLyptKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZTYsMHhmZiwweGRiLDB4ZGIsMHhkYiwweGRiLDB4ZGIsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qbiovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGRjLDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKm8qLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLypwKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZGMsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2MCwweDYwLDB4ZjAsMHgwMCwKKy8qcSovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDc2LDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweDdjLDB4MGMsMHgwYywweDFlLDB4MDAsCisvKnIqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhkYywweDc2LDB4NjYsMHg2MCwweDYwLDB4NjAsMHhmMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLypzKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2MsMHhjNiwweDYwLDB4MzgsMHgwYywweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qdCovIDB4MDAsMHgwMCwweDEwLDB4MzAsMHgzMCwweGZjLDB4MzAsMHgzMCwweDMwLDB4MzAsMHgzNiwweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKnUqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAorLyp2Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YzMsMHhjMywweGMzLDB4YzMsMHg2NiwweDNjLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qdyovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGMzLDB4YzMsMHhjMywweGRiLDB4ZGIsMHhmZiwweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKngqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhjMywweDY2LDB4M2MsMHgxOCwweDNjLDB4NjYsMHhjMywweDAwLDB4MDAsMHgwMCwweDAwLAorLyp5Ki8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2UsMHgwNiwweDBjLDB4ZjgsMHgwMCwKKy8qeiovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZlLDB4Y2MsMHgxOCwweDMwLDB4NjAsMHhjNiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKnsqLyAweDAwLDB4MDAsMHgwZSwweDE4LDB4MTgsMHgxOCwweDcwLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgwZSwweDAwLDB4MDAsMHgwMCwweDAwLAorLyp8Ki8gMHgwMCwweDAwLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qfSovIDB4MDAsMHgwMCwweDcwLDB4MTgsMHgxOCwweDE4LDB4MGUsMHgxOCwweDE4LDB4MTgsMHgxOCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKn4qLyAweDAwLDB4MDAsMHg3NiwweGRjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDEwLDB4MzgsMHg2YywweGM2LDB4YzYsMHhjNiwweGZlLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDNjLDB4NjYsMHhjMiwweGMwLDB4YzAsMHhjMCwweGMyLDB4NjYsMHgzYywweDBjLDB4MDYsMHg3YywweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHhjYywweDAwLDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDBjLDB4MTgsMHgzMCwweDAwLDB4N2MsMHhjNiwweGZlLDB4YzAsMHhjMCwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgxMCwweDM4LDB4NmMsMHgwMCwweDc4LDB4MGMsMHg3YywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHhjYywweDAwLDB4MDAsMHg3OCwweDBjLDB4N2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDYwLDB4MzAsMHgxOCwweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgzOCwweDZjLDB4MzgsMHgwMCwweDc4LDB4MGMsMHg3YywweGNjLDB4Y2MsMHhjYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4M2MsMHg2NiwweDYwLDB4NjAsMHg2NiwweDNjLDB4MGMsMHgwNiwweDNjLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDEwLDB4MzgsMHg2YywweDAwLDB4N2MsMHhjNiwweGZlLDB4YzAsMHhjMCwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweGM2LDB4MDAsMHgwMCwweDdjLDB4YzYsMHhmZSwweGMwLDB4YzAsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4NjAsMHgzMCwweDE4LDB4MDAsMHg3YywweGM2LDB4ZmUsMHhjMCwweGMwLDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4NjYsMHgwMCwweDAwLDB4MzgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgxOCwweDNjLDB4NjYsMHgwMCwweDM4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4NjAsMHgzMCwweDE4LDB4MDAsMHgzOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgzYywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweGM2LDB4MDAsMHgxMCwweDM4LDB4NmMsMHhjNiwweGM2LDB4ZmUsMHhjNiwweGM2LDB4YzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MzgsMHg2YywweDM4LDB4MDAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGZlLDB4YzYsMHhjNiwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDE4LDB4MzAsMHg2MCwweDAwLDB4ZmUsMHg2NiwweDYwLDB4N2MsMHg2MCwweDYwLDB4NjYsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NmUsMHgzYiwweDFiLDB4N2UsMHhkOCwweGRjLDB4NzcsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDNlLDB4NmMsMHhjYywweGNjLDB4ZmUsMHhjYywweGNjLDB4Y2MsMHhjYywweGNlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MTAsMHgzOCwweDZjLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4YzYsMHgwMCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHg2MCwweDMwLDB4MTgsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MzAsMHg3OCwweGNjLDB4MDAsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHg3NiwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDYwLDB4MzAsMHgxOCwweDAwLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweGM2LDB4MDAsMHgwMCwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweDdlLDB4MDYsMHgwYywweDc4LDB4MDAsCisvKiAqLyAweDAwLDB4YzYsMHgwMCwweDdjLDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweGM2LDB4MDAsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgxOCwweDE4LDB4N2UsMHhjMywweGMwLDB4YzAsMHhjMCwweGMzLDB4N2UsMHgxOCwweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MzgsMHg2YywweDY0LDB4NjAsMHhmMCwweDYwLDB4NjAsMHg2MCwweDYwLDB4ZTYsMHhmYywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4YzMsMHg2NiwweDNjLDB4MTgsMHhmZiwweDE4LDB4ZmYsMHgxOCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHhmYywweDY2LDB4NjYsMHg3YywweDYyLDB4NjYsMHg2ZiwweDY2LDB4NjYsMHg2NiwweGYzLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MGUsMHgxYiwweDE4LDB4MTgsMHgxOCwweDdlLDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGQ4LDB4NzAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDE4LDB4MzAsMHg2MCwweDAwLDB4NzgsMHgwYywweDdjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwYywweDE4LDB4MzAsMHgwMCwweDM4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDNjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MTgsMHgzMCwweDYwLDB4MDAsMHg3YywweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDE4LDB4MzAsMHg2MCwweDAwLDB4Y2MsMHhjYywweGNjLDB4Y2MsMHhjYywweGNjLDB4NzYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDc2LDB4ZGMsMHgwMCwweGRjLDB4NjYsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDc2LDB4ZGMsMHgwMCwweGM2LDB4ZTYsMHhmNiwweGZlLDB4ZGUsMHhjZSwweGM2LDB4YzYsMHhjNiwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDNjLDB4NmMsMHg2YywweDNlLDB4MDAsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgzOCwweDZjLDB4NmMsMHgzOCwweDAwLDB4N2MsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgzMCwweDMwLDB4MDAsMHgzMCwweDMwLDB4NjAsMHhjMCwweGM2LDB4YzYsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweGMwLDB4YzAsMHhjMCwweGMwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHgwNiwweDA2LDB4MDYsMHgwNiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4YzAsMHhjMCwweGMyLDB4YzYsMHhjYywweDE4LDB4MzAsMHg2MCwweGNlLDB4OWIsMHgwNiwweDBjLDB4MWYsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweGMwLDB4YzAsMHhjMiwweGM2LDB4Y2MsMHgxOCwweDMwLDB4NjYsMHhjZSwweDk2LDB4M2UsMHgwNiwweDA2LDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDE4LDB4MTgsMHgwMCwweDE4LDB4MTgsMHgxOCwweDNjLDB4M2MsMHgzYywweDE4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzNiwweDZjLDB4ZDgsMHg2YywweDM2LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZDgsMHg2YywweDM2LDB4NmMsMHhkOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MTEsMHg0NCwweDExLDB4NDQsMHgxMSwweDQ0LDB4MTEsMHg0NCwweDExLDB4NDQsMHgxMSwweDQ0LDB4MTEsMHg0NCwweDExLDB4NDQsCisvKiAqLyAweDU1LDB4YWEsMHg1NSwweGFhLDB4NTUsMHhhYSwweDU1LDB4YWEsMHg1NSwweGFhLDB4NTUsMHhhYSwweDU1LDB4YWEsMHg1NSwweGFhLAorLyogKi8gMHhkZCwweDc3LDB4ZGQsMHg3NywweGRkLDB4NzcsMHhkZCwweDc3LDB4ZGQsMHg3NywweGRkLDB4NzcsMHhkZCwweDc3LDB4ZGQsMHg3NywKKy8qICovIDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCisvKiAqLyAweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZjgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAorLyogKi8gMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZjgsMHgxOCwweGY4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKKy8qICovIDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZjgsMHgxOCwweGY4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKKy8qICovIDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGY2LDB4MDYsMHhmNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisvKiAqLyAweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHgwNiwweGY2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKKy8qICovIDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGY2LDB4MDYsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4ZjgsMHgxOCwweGY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCisvKiAqLyAweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MWYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCisvKiAqLyAweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MWYsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCisvKiAqLyAweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxZiwweDE4LDB4MWYsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAorLyogKi8gMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM3LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKKy8qICovIDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM3LDB4MzAsMHgzZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgzZiwweDMwLDB4MzcsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorLyogKi8gMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4ZjcsMHgwMCwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4MDAsMHhmNywweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisvKiAqLyAweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNywweDMwLDB4MzcsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmYsMHgwMCwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGY3LDB4MDAsMHhmNywweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisvKiAqLyAweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmZiwweDAwLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweGZmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4MDAsMHhmZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LAorLyogKi8gMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDNmLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDFmLDB4MTgsMHgxZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxZiwweDE4LDB4MWYsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDNmLDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwKKy8qICovIDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHhmZiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsMHgzNiwweDM2LDB4MzYsCisvKiAqLyAweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHhmZiwweDE4LDB4ZmYsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LAorLyogKi8gMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGY4LDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgxZiwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsCisvKiAqLyAweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwKKy8qICovIDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsMHhmMCwweGYwLDB4ZjAsCisvKiAqLyAweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLDB4MGYsMHgwZiwweDBmLAorLyogKi8gMHhmZiwweGZmLDB4ZmYsMHhmZiwweGZmLDB4ZmYsMHhmZiwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDc2LDB4ZGMsMHhkOCwweGQ4LDB4ZDgsMHhkYywweDc2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHg3OCwweGNjLDB4Y2MsMHhjYywweGQ4LDB4Y2MsMHhjNiwweGM2LDB4YzYsMHhjYywweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4ZmUsMHhjNiwweGM2LDB4YzAsMHhjMCwweGMwLDB4YzAsMHhjMCwweGMwLDB4YzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHhmZSwweDZjLDB4NmMsMHg2YywweDZjLDB4NmMsMHg2YywweDZjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweGZlLDB4YzYsMHg2MCwweDMwLDB4MTgsMHgzMCwweDYwLDB4YzYsMHhmZSwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4N2UsMHhkOCwweGQ4LDB4ZDgsMHhkOCwweGQ4LDB4NzAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg2NiwweDY2LDB4NjYsMHg2NiwweDY2LDB4N2MsMHg2MCwweDYwLDB4YzAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4NzYsMHhkYywweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHg3ZSwweDE4LDB4M2MsMHg2NiwweDY2LDB4NjYsMHgzYywweDE4LDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MzgsMHg2YywweGM2LDB4YzYsMHhmZSwweGM2LDB4YzYsMHg2YywweDM4LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgzOCwweDZjLDB4YzYsMHhjNiwweGM2LDB4NmMsMHg2YywweDZjLDB4NmMsMHhlZSwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MWUsMHgzMCwweDE4LDB4MGMsMHgzZSwweDY2LDB4NjYsMHg2NiwweDY2LDB4M2MsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDdlLDB4ZGIsMHhkYiwweGRiLDB4N2UsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAzLDB4MDYsMHg3ZSwweGRiLDB4ZGIsMHhmMywweDdlLDB4NjAsMHhjMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MWMsMHgzMCwweDYwLDB4NjAsMHg3YywweDYwLDB4NjAsMHg2MCwweDMwLDB4MWMsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4N2MsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4YzYsMHhjNiwweGM2LDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4ZmUsMHgwMCwweDAwLDB4ZmUsMHgwMCwweDAwLDB4ZmUsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDE4LDB4MTgsMHg3ZSwweDE4LDB4MTgsMHgwMCwweDAwLDB4ZmYsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MzAsMHgxOCwweDBjLDB4MDYsMHgwYywweDE4LDB4MzAsMHgwMCwweDdlLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDBjLDB4MTgsMHgzMCwweDYwLDB4MzAsMHgxOCwweDBjLDB4MDAsMHg3ZSwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MGUsMHgxYiwweDFiLDB4MWIsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwKKy8qICovIDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweDE4LDB4MTgsMHgxOCwweGQ4LDB4ZDgsMHhkOCwweDcwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDAwLDB4N2UsMHgwMCwweDE4LDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4NzYsMHhkYywweDAwLDB4NzYsMHhkYywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgzOCwweDZjLDB4NmMsMHgzOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgxOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MTgsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwZiwweDBjLDB4MGMsMHgwYywweDBjLDB4MGMsMHhlYywweDZjLDB4NmMsMHgzYywweDFjLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4ZDgsMHg2YywweDZjLDB4NmMsMHg2YywweDZjLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorLyogKi8gMHgwMCwweDcwLDB4ZDgsMHgzMCwweDYwLDB4YzgsMHhmOCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwKKy8qICovIDB4MDAsMHgwMCwweDAwLDB4MDAsMHg3YywweDdjLDB4N2MsMHg3YywweDdjLDB4N2MsMHg3YywweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsCisvKiAqLyAweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLDB4MDAsMHgwMCwweDAwLAorfTsKKworY29uc3Qgc3RydWN0IGZvbnRfZGVzYyBmb250X3N1bl84eDE2ID0geworCS5pZHgJPSBTVU44eDE2X0lEWCwKKwkubmFtZQk9ICJTVU44eDE2IiwKKwkud2lkdGgJPSA4LAorCS5oZWlnaHQJPSAxNiwKKwkuZGF0YQk9IGZvbnRkYXRhX3N1bjh4MTYsCisjaWZkZWYgX19zcGFyY19fCisJLnByZWYJPSAxMCwKKyNlbHNlCisJLnByZWYJPSAtMSwKKyNlbmRpZgorfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ZvbnRzL2ZvbnRzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzM3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9mb250cy9mb250cy5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogYFNvZnQnIGZvbnQgZGVmaW5pdGlvbnMKKyAqCisgKiAgICBDcmVhdGVkIDE5OTUgYnkgR2VlcnQgVXl0dGVyaG9ldmVuCisgKiAgICBSZXdyaXR0ZW4gMTk5OCBieSBNYXJ0aW4gTWFyZXMgPG1qQHVjdy5jej4KKyAqCisgKgkyMDAxIC0gRG9jdW1lbnRlZCB3aXRoIERvY0Jvb2sKKyAqCS0gQnJhZCBEb3VnbGFzIDxicmFkQG5lcnVvLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaWYgZGVmaW5lZChfX21jNjgwMDBfXykKKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L2ZvbnQuaD4KKworI2RlZmluZSBOT19GT05UUworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZvbnRfZGVzYyAqZm9udHNbXSA9IHsKKyNpZmRlZiBDT05GSUdfRk9OVF84eDgKKyN1bmRlZiBOT19GT05UUworICAgICZmb250X3ZnYV84eDgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRk9OVF84eDE2CisjdW5kZWYgTk9fRk9OVFMKKyAgICAmZm9udF92Z2FfOHgxNiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GT05UXzZ4MTEKKyN1bmRlZiBOT19GT05UUworICAgICZmb250X3ZnYV82eDExLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZPTlRfN3gxNAorI3VuZGVmIE5PX0ZPTlRTCisgICAgJmZvbnRfN3gxNCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GT05UX1NVTjh4MTYKKyN1bmRlZiBOT19GT05UUworICAgICZmb250X3N1bl84eDE2LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZPTlRfU1VOMTJ4MjIKKyN1bmRlZiBOT19GT05UUworICAgICZmb250X3N1bl8xMngyMiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GT05UXzEweDE4CisjdW5kZWYgTk9fRk9OVFMKKyAgICAmZm9udF8xMHgxOCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GT05UX0FDT1JOXzh4OAorI3VuZGVmIE5PX0ZPTlRTCisgICAgJmZvbnRfYWNvcm5fOHg4LAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZPTlRfUEVBUkxfOHg4CisjdW5kZWYgTk9fRk9OVFMKKyAgICAmZm9udF9wZWFybF84eDgsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRk9OVF9NSU5JXzR4NgorI3VuZGVmIE5PX0ZPTlRTCisgICAgJmZvbnRfbWluaV80eDYsCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRk9OVF82eDEwCisjdW5kZWYgTk9fRk9OVFMKKyAgICAmZm9udF82eDEwLAorI2VuZGlmCit9OworCisjZGVmaW5lIG51bV9mb250cyBBUlJBWV9TSVpFKGZvbnRzKQorCisjaWZkZWYgTk9fRk9OVFMKKyNlcnJvciBObyBmb250cyBjb25maWd1cmVkLgorI2VuZGlmCisKKworLyoqCisgKglmaW5kX2ZvbnQgLSBmaW5kIGEgZm9udAorICoJQG5hbWU6IHN0cmluZyBuYW1lIG9mIGEgZm9udAorICoKKyAqCUZpbmQgYSBzcGVjaWZpZWQgZm9udCB3aXRoIHN0cmluZyBuYW1lIEBuYW1lLgorICoKKyAqCVJldHVybnMgJU5VTEwgaWYgbm8gZm9udCBmb3VuZCwgb3IgYSBwb2ludGVyIHRvIHRoZQorICoJc3BlY2lmaWVkIGZvbnQuCisgKgorICovCisKK2NvbnN0IHN0cnVjdCBmb250X2Rlc2MgKmZpbmRfZm9udChjb25zdCBjaGFyICpuYW1lKQoreworICAgdW5zaWduZWQgaW50IGk7CisKKyAgIGZvciAoaSA9IDA7IGkgPCBudW1fZm9udHM7IGkrKykKKyAgICAgIGlmICghc3RyY21wKGZvbnRzW2ldLT5uYW1lLCBuYW1lKSkKKwkgIHJldHVybiBmb250c1tpXTsKKyAgIHJldHVybiBOVUxMOworfQorCisKKy8qKgorICoJZ2V0X2RlZmF1bHRfZm9udCAtIGdldCBkZWZhdWx0IGZvbnQKKyAqCUB4cmVzOiBzY3JlZW4gc2l6ZSBvZiBYCisgKglAeXJlczogc2NyZWVuIHNpemUgb2YgWQorICogICAgICBAZm9udF93OiBiaXQgYXJyYXkgb2Ygc3VwcG9ydGVkIHdpZHRocyAoMSAtIDMyKQorICogICAgICBAZm9udF9oOiBiaXQgYXJyYXkgb2Ygc3VwcG9ydGVkIGhlaWdodHMgKDEgLSAzMikKKyAqCisgKglHZXQgdGhlIGRlZmF1bHQgZm9udCBmb3IgYSBzcGVjaWZpZWQgc2NyZWVuIHNpemUuCisgKglEaW1lbnNpb25zIGFyZSBpbiBwaXhlbHMuCisgKgorICoJUmV0dXJucyAlTlVMTCBpZiBubyBmb250IGlzIGZvdW5kLCBvciBhIHBvaW50ZXIgdG8gdGhlCisgKgljaG9zZW4gZm9udC4KKyAqCisgKi8KKworY29uc3Qgc3RydWN0IGZvbnRfZGVzYyAqZ2V0X2RlZmF1bHRfZm9udChpbnQgeHJlcywgaW50IHlyZXMsIHUzMiBmb250X3csCisJCQkJCSB1MzIgZm9udF9oKQoreworICAgIGludCBpLCBjLCBjYzsKKyAgICBjb25zdCBzdHJ1Y3QgZm9udF9kZXNjICpmLCAqZzsKKworICAgIGcgPSBOVUxMOworICAgIGNjID0gLTEwMDAwOworICAgIGZvcihpPTA7IGk8bnVtX2ZvbnRzOyBpKyspIHsKKwlmID0gZm9udHNbaV07CisJYyA9IGYtPnByZWY7CisjaWYgZGVmaW5lZChfX21jNjgwMDBfXykKKyNpZmRlZiBDT05GSUdfRk9OVF9QRUFSTF84eDgKKwlpZiAoTUFDSF9JU19BTUlHQSAmJiBmLT5pZHggPT0gUEVBUkw4eDhfSURYKQorCSAgICBjID0gMTAwOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZPTlRfNngxMQorCWlmIChNQUNIX0lTX01BQyAmJiB4cmVzIDwgNjQwICYmIGYtPmlkeCA9PSBWR0E2eDExX0lEWCkKKwkgICAgYyA9IDEwMDsKKyNlbmRpZgorI2VuZGlmCisJaWYgKCh5cmVzIDwgNDAwKSA9PSAoZi0+aGVpZ2h0IDw9IDgpKQorCSAgICBjICs9IDEwMDA7CisKKwlpZiAoKGZvbnRfdyAmICgxIDw8IChmLT53aWR0aCAtIDEpKSkgJiYKKwkgICAgKGZvbnRfaCAmICgxIDw8IChmLT5oZWlnaHQgLSAxKSkpKQorCSAgICBjICs9IDEwMDA7CisKKwlpZiAoYyA+IGNjKSB7CisJICAgIGNjID0gYzsKKwkgICAgZyA9IGY7CisJfQorICAgIH0KKyAgICByZXR1cm4gZzsKK30KKworRVhQT1JUX1NZTUJPTChmaW5kX2ZvbnQpOworRVhQT1JUX1NZTUJPTChnZXRfZGVmYXVsdF9mb250KTsKKworTU9EVUxFX0FVVEhPUigiSmFtZXMgU2ltbW9ucyA8anNpbW1vbnNAdXNlcnMuc2YubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDb25zb2xlIEZvbnRzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9nY2QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2djZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWVlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9nY2QuYwpAQCAtMCwwICsxLDc4IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZ2NkLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKy8qCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIGJpbmFyeSBHQ0QgYWxnb3JpdGhtLiAoT2Z0ZW4gYXR0cmlidXRlZCB0byBTdGVpbiwKKyAqIGJ1dCBhcyBLbnV0aCBoYXMgbm90ZWQsIGFwcGVhcnMgaW4gYSBmaXJzdC1jZW50dXJ5IENoaW5lc2UgbWF0aCB0ZXh0LikKKyAqCisgKiBUaGlzIGlzIGZhc3RlciB0aGFuIHRoZSBkaXZpc2lvbi1iYXNlZCBhbGdvcml0aG0gZXZlbiBvbiB4ODYsIHdoaWNoCisgKiBoYXMgZGVjZW50IGhhcmR3YXJlIGRpdmlzaW9uLgorICovCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQ1BVX05PX0VGRklDSUVOVF9GRlMpICYmICFkZWZpbmVkKENQVV9OT19FRkZJQ0lFTlRfRkZTKQorCisvKiBJZiBfX2ZmcyBpcyBhdmFpbGFibGUsIHRoZSBldmVuL29kZCBhbGdvcml0aG0gYmVuY2htYXJrcyBzbG93ZXIuICovCit1bnNpZ25lZCBsb25nIGdjZCh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwl1bnNpZ25lZCBsb25nIHIgPSBhIHwgYjsKKworCWlmICghYSB8fCAhYikKKwkJcmV0dXJuIHI7CisKKwliID4+PSBfX2ZmcyhiKTsKKwlpZiAoYiA9PSAxKQorCQlyZXR1cm4gciAmIC1yOworCisJZm9yICg7OykgeworCQlhID4+PSBfX2ZmcyhhKTsKKwkJaWYgKGEgPT0gMSkKKwkJCXJldHVybiByICYgLXI7CisJCWlmIChhID09IGIpCisJCQlyZXR1cm4gYSA8PCBfX2ZmcyhyKTsKKworCQlpZiAoYSA8IGIpCisJCQlzd2FwKGEsIGIpOworCQlhIC09IGI7CisJfQorfQorCisjZWxzZQorCisvKiBJZiBub3JtYWxpemF0aW9uIGlzIGRvbmUgYnkgbG9vcHMsIHRoZSBldmVuL29kZCBhbGdvcml0aG0gaXMgYSB3aW4uICovCit1bnNpZ25lZCBsb25nIGdjZCh1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYikKK3sKKwl1bnNpZ25lZCBsb25nIHIgPSBhIHwgYjsKKworCWlmICghYSB8fCAhYikKKwkJcmV0dXJuIHI7CisKKwkvKiBJc29sYXRlIGxzYml0IG9mIHIgKi8KKwlyICY9IC1yOworCisJd2hpbGUgKCEoYiAmIHIpKQorCQliID4+PSAxOworCWlmIChiID09IHIpCisJCXJldHVybiByOworCisJZm9yICg7OykgeworCQl3aGlsZSAoIShhICYgcikpCisJCQlhID4+PSAxOworCQlpZiAoYSA9PSByKQorCQkJcmV0dXJuIHI7CisJCWlmIChhID09IGIpCisJCQlyZXR1cm4gYTsKKworCQlpZiAoYSA8IGIpCisJCQlzd2FwKGEsIGIpOworCQlhIC09IGI7CisJCWEgPj49IDE7CisJCWlmIChhICYgcikKKwkJCWEgKz0gYjsKKwkJYSA+Pj0gMTsKKwl9Cit9CisKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MX0dQTChnY2QpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZ2VuX2NyYzMydGFibGUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2dlbl9jcmMzMnRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNjY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2dlbl9jcmMzMnRhYmxlLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2dlbmVyYXRlZC9hdXRvY29uZi5oIgorI2luY2x1ZGUgImNyYzMyZGVmcy5oIgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNkZWZpbmUgRU5UUklFU19QRVJfTElORSA0CisKKyNpZiBDUkNfTEVfQklUUyA+IDgKKyMgZGVmaW5lIExFX1RBQkxFX1JPV1MgKENSQ19MRV9CSVRTLzgpCisjIGRlZmluZSBMRV9UQUJMRV9TSVpFIDI1NgorI2Vsc2UKKyMgZGVmaW5lIExFX1RBQkxFX1JPV1MgMQorIyBkZWZpbmUgTEVfVEFCTEVfU0laRSAoMSA8PCBDUkNfTEVfQklUUykKKyNlbmRpZgorCisjaWYgQ1JDX0JFX0JJVFMgPiA4CisjIGRlZmluZSBCRV9UQUJMRV9ST1dTIChDUkNfQkVfQklUUy84KQorIyBkZWZpbmUgQkVfVEFCTEVfU0laRSAyNTYKKyNlbHNlCisjIGRlZmluZSBCRV9UQUJMRV9ST1dTIDEKKyMgZGVmaW5lIEJFX1RBQkxFX1NJWkUgKDEgPDwgQ1JDX0JFX0JJVFMpCisjZW5kaWYKKworc3RhdGljIHVpbnQzMl90IGNyYzMydGFibGVfbGVbTEVfVEFCTEVfUk9XU11bMjU2XTsKK3N0YXRpYyB1aW50MzJfdCBjcmMzMnRhYmxlX2JlW0JFX1RBQkxFX1JPV1NdWzI1Nl07CitzdGF0aWMgdWludDMyX3QgY3JjMzJjdGFibGVfbGVbTEVfVEFCTEVfUk9XU11bMjU2XTsKKworLyoqCisgKiBjcmMzMmluaXRfbGUoKSAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIExFIHRhYmxlIGRhdGEKKyAqCisgKiBjcmMgaXMgdGhlIGNyYyBvZiB0aGUgYnl0ZSBpOyBvdGhlciBlbnRyaWVzIGFyZSBmaWxsZWQgaW4gYmFzZWQgb24gdGhlCisgKiBmYWN0IHRoYXQgY3JjdGFibGVbaV5qXSA9IGNyY3RhYmxlW2ldIF4gY3JjdGFibGVbal0uCisgKgorICovCitzdGF0aWMgdm9pZCBjcmMzMmluaXRfbGVfZ2VuZXJpYyhjb25zdCB1aW50MzJfdCBwb2x5bm9taWFsLAorCQkJCSB1aW50MzJfdCAoKnRhYilbMjU2XSkKK3sKKwl1bnNpZ25lZCBpLCBqOworCXVpbnQzMl90IGNyYyA9IDE7CisKKwl0YWJbMF1bMF0gPSAwOworCisJZm9yIChpID0gTEVfVEFCTEVfU0laRSA+PiAxOyBpOyBpID4+PSAxKSB7CisJCWNyYyA9IChjcmMgPj4gMSkgXiAoKGNyYyAmIDEpID8gcG9seW5vbWlhbCA6IDApOworCQlmb3IgKGogPSAwOyBqIDwgTEVfVEFCTEVfU0laRTsgaiArPSAyICogaSkKKwkJCXRhYlswXVtpICsgal0gPSBjcmMgXiB0YWJbMF1bal07CisJfQorCWZvciAoaSA9IDA7IGkgPCBMRV9UQUJMRV9TSVpFOyBpKyspIHsKKwkJY3JjID0gdGFiWzBdW2ldOworCQlmb3IgKGogPSAxOyBqIDwgTEVfVEFCTEVfUk9XUzsgaisrKSB7CisJCQljcmMgPSB0YWJbMF1bY3JjICYgMHhmZl0gXiAoY3JjID4+IDgpOworCQkJdGFiW2pdW2ldID0gY3JjOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjcmMzMmluaXRfbGUodm9pZCkKK3sKKwljcmMzMmluaXRfbGVfZ2VuZXJpYyhDUkNQT0xZX0xFLCBjcmMzMnRhYmxlX2xlKTsKK30KKworc3RhdGljIHZvaWQgY3JjMzJjaW5pdF9sZSh2b2lkKQoreworCWNyYzMyaW5pdF9sZV9nZW5lcmljKENSQzMyQ19QT0xZX0xFLCBjcmMzMmN0YWJsZV9sZSk7Cit9CisKKy8qKgorICogY3JjMzJpbml0X2JlKCkgLSBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBCRSB0YWJsZSBkYXRhCisgKi8KK3N0YXRpYyB2b2lkIGNyYzMyaW5pdF9iZSh2b2lkKQoreworCXVuc2lnbmVkIGksIGo7CisJdWludDMyX3QgY3JjID0gMHg4MDAwMDAwMDsKKworCWNyYzMydGFibGVfYmVbMF1bMF0gPSAwOworCisJZm9yIChpID0gMTsgaSA8IEJFX1RBQkxFX1NJWkU7IGkgPDw9IDEpIHsKKwkJY3JjID0gKGNyYyA8PCAxKSBeICgoY3JjICYgMHg4MDAwMDAwMCkgPyBDUkNQT0xZX0JFIDogMCk7CisJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQljcmMzMnRhYmxlX2JlWzBdW2kgKyBqXSA9IGNyYyBeIGNyYzMydGFibGVfYmVbMF1bal07CisJfQorCWZvciAoaSA9IDA7IGkgPCBCRV9UQUJMRV9TSVpFOyBpKyspIHsKKwkJY3JjID0gY3JjMzJ0YWJsZV9iZVswXVtpXTsKKwkJZm9yIChqID0gMTsgaiA8IEJFX1RBQkxFX1JPV1M7IGorKykgeworCQkJY3JjID0gY3JjMzJ0YWJsZV9iZVswXVsoY3JjID4+IDI0KSAmIDB4ZmZdIF4gKGNyYyA8PCA4KTsKKwkJCWNyYzMydGFibGVfYmVbal1baV0gPSBjcmM7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF90YWJsZSh1aW50MzJfdCAoKnRhYmxlKVsyNTZdLCBpbnQgcm93cywgaW50IGxlbiwgY2hhciAqdHJhbnMpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwIDsgaiA8IHJvd3M7IGorKykgeworCQlwcmludGYoInsiKTsKKwkJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykgeworCQkJaWYgKGkgJSBFTlRSSUVTX1BFUl9MSU5FID09IDApCisJCQkJcHJpbnRmKCJcbiIpOworCQkJcHJpbnRmKCIlcygweCU4Ljh4TCksICIsIHRyYW5zLCB0YWJsZVtqXVtpXSk7CisJCX0KKwkJcHJpbnRmKCIlcygweCU4Ljh4TCl9LFxuIiwgdHJhbnMsIHRhYmxlW2pdW2xlbiAtIDFdKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlwcmludGYoIi8qIHRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgLSBkbyBub3QgZWRpdCAqL1xuXG4iKTsKKworCWlmIChDUkNfTEVfQklUUyA+IDEpIHsKKwkJY3JjMzJpbml0X2xlKCk7CisJCXByaW50Zigic3RhdGljIGNvbnN0IHUzMiBfX19fY2FjaGVsaW5lX2FsaWduZWQgIgorCQkgICAgICAgImNyYzMydGFibGVfbGVbJWRdWyVkXSA9IHsiLAorCQkgICAgICAgTEVfVEFCTEVfUk9XUywgTEVfVEFCTEVfU0laRSk7CisJCW91dHB1dF90YWJsZShjcmMzMnRhYmxlX2xlLCBMRV9UQUJMRV9ST1dTLAorCQkJICAgICBMRV9UQUJMRV9TSVpFLCAidG9sZSIpOworCQlwcmludGYoIn07XG4iKTsKKwl9CisKKwlpZiAoQ1JDX0JFX0JJVFMgPiAxKSB7CisJCWNyYzMyaW5pdF9iZSgpOworCQlwcmludGYoInN0YXRpYyBjb25zdCB1MzIgX19fX2NhY2hlbGluZV9hbGlnbmVkICIKKwkJICAgICAgICJjcmMzMnRhYmxlX2JlWyVkXVslZF0gPSB7IiwKKwkJICAgICAgIEJFX1RBQkxFX1JPV1MsIEJFX1RBQkxFX1NJWkUpOworCQlvdXRwdXRfdGFibGUoY3JjMzJ0YWJsZV9iZSwgTEVfVEFCTEVfUk9XUywKKwkJCSAgICAgQkVfVEFCTEVfU0laRSwgInRvYmUiKTsKKwkJcHJpbnRmKCJ9O1xuIik7CisJfQorCWlmIChDUkNfTEVfQklUUyA+IDEpIHsKKwkJY3JjMzJjaW5pdF9sZSgpOworCQlwcmludGYoInN0YXRpYyBjb25zdCB1MzIgX19fX2NhY2hlbGluZV9hbGlnbmVkICIKKwkJICAgICAgICJjcmMzMmN0YWJsZV9sZVslZF1bJWRdID0geyIsCisJCSAgICAgICBMRV9UQUJMRV9ST1dTLCBMRV9UQUJMRV9TSVpFKTsKKwkJb3V0cHV0X3RhYmxlKGNyYzMyY3RhYmxlX2xlLCBMRV9UQUJMRV9ST1dTLAorCQkJICAgICBMRV9UQUJMRV9TSVpFLCAidG9sZSIpOworCQlwcmludGYoIn07XG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2dlbmFsbG9jLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9nZW5hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODVkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9nZW5hbGxvYy5jCkBAIC0wLDAgKzEsNzg1IEBACisvKgorICogQmFzaWMgZ2VuZXJhbCBwdXJwb3NlIGFsbG9jYXRvciBmb3IgbWFuYWdpbmcgc3BlY2lhbCBwdXJwb3NlCisgKiBtZW1vcnksIGZvciBleGFtcGxlLCBtZW1vcnkgdGhhdCBpcyBub3QgbWFuYWdlZCBieSB0aGUgcmVndWxhcgorICoga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuICBVc2VzIGZvciB0aGlzIGluY2x1ZGVzIG9uLWRldmljZSBzcGVjaWFsCisgKiBtZW1vcnksIHVuY2FjaGVkIG1lbW9yeSBldGMuCisgKgorICogSXQgaXMgc2FmZSB0byB1c2UgdGhlIGFsbG9jYXRvciBpbiBOTUkgaGFuZGxlcnMgYW5kIG90aGVyIHNwZWNpYWwKKyAqIHVuYmxvY2thYmxlIGNvbnRleHRzIHRoYXQgY291bGQgb3RoZXJ3aXNlIGRlYWRsb2NrIG9uIGxvY2tzLiAgVGhpcworICogaXMgaW1wbGVtZW50ZWQgYnkgdXNpbmcgYXRvbWljIG9wZXJhdGlvbnMgYW5kIHJldHJpZXMgb24gYW55CisgKiBjb25mbGljdHMuICBUaGUgZGlzYWR2YW50YWdlIGlzIHRoYXQgdGhlcmUgbWF5IGJlIGxpdmVsb2NrcyBpbgorICogZXh0cmVtZSBjYXNlcy4gIEZvciBiZXR0ZXIgc2NhbGFiaWxpdHksIG9uZSBhbGxvY2F0b3IgY2FuIGJlIHVzZWQKKyAqIGZvciBlYWNoIENQVS4KKyAqCisgKiBUaGUgbG9ja2xlc3Mgb3BlcmF0aW9uIG9ubHkgd29ya3MgaWYgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeQorICogYXZhaWxhYmxlLiAgSWYgbmV3IG1lbW9yeSBpcyBhZGRlZCB0byB0aGUgcG9vbCBhIGxvY2sgaGFzIHRvIGJlCisgKiBzdGlsbCB0YWtlbi4gIFNvIGFueSB1c2VyIHJlbHlpbmcgb24gbG9ja2xlc3NuZXNzIGhhcyB0byBlbnN1cmUKKyAqIHRoYXQgc3VmZmljaWVudCBtZW1vcnkgaXMgcHJlYWxsb2NhdGVkLgorICoKKyAqIFRoZSBiYXNpYyBhdG9taWMgb3BlcmF0aW9uIG9mIHRoaXMgYWxsb2NhdG9yIGlzIGNtcHhjaGcgb24gbG9uZy4KKyAqIE9uIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYXZlIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24sCisgKiB0aGUgYWxsb2NhdG9yIGNhbiBOT1QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlci4gIFNvIGNvZGUgdXNlcyB0aGUKKyAqIGFsbG9jYXRvciBpbiBOTUkgaGFuZGxlciBzaG91bGQgZGVwZW5kIG9uCisgKiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcuCisgKgorICogQ29weXJpZ2h0IDIwMDUgKEMpIEplcyBTb3JlbnNlbiA8amVzQHRyYWluZWQtbW9ua2V5Lm9yZz4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IGNodW5rX3NpemUoY29uc3Qgc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuaykKK3sKKwlyZXR1cm4gY2h1bmstPmVuZF9hZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIgKyAxOworfQorCitzdGF0aWMgaW50IHNldF9iaXRzX2xsKHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbWFza190b19zZXQpCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIG52YWw7CisKKwludmFsID0gKmFkZHI7CisJZG8geworCQl2YWwgPSBudmFsOworCQlpZiAodmFsICYgbWFza190b19zZXQpCisJCQlyZXR1cm4gLUVCVVNZOworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgobnZhbCA9IGNtcHhjaGcoYWRkciwgdmFsLCB2YWwgfCBtYXNrX3RvX3NldCkpICE9IHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbGVhcl9iaXRzX2xsKHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgbWFza190b19jbGVhcikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCwgbnZhbDsKKworCW52YWwgPSAqYWRkcjsKKwlkbyB7CisJCXZhbCA9IG52YWw7CisJCWlmICgodmFsICYgbWFza190b19jbGVhcikgIT0gbWFza190b19jbGVhcikKKwkJCXJldHVybiAtRUJVU1k7CisJCWNwdV9yZWxheCgpOworCX0gd2hpbGUgKChudmFsID0gY21weGNoZyhhZGRyLCB2YWwsIHZhbCAmIH5tYXNrX3RvX2NsZWFyKSkgIT0gdmFsKTsKKworCXJldHVybiAwOworfQorCisvKgorICogYml0bWFwX3NldF9sbCAtIHNldCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAqIEBtYXA6IHBvaW50ZXIgdG8gYSBiaXRtYXAKKyAqIEBzdGFydDogYSBiaXQgcG9zaXRpb24gaW4gQG1hcAorICogQG5yOiBudW1iZXIgb2YgYml0cyB0byBzZXQKKyAqCisgKiBTZXQgQG5yIGJpdHMgc3RhcnQgZnJvbSBAc3RhcnQgaW4gQG1hcCBsb2NrLWxlc3NseS4gU2V2ZXJhbCB1c2VycworICogY2FuIHNldC9jbGVhciB0aGUgc2FtZSBiaXRtYXAgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBsb2NrLiBJZiB0d28KKyAqIHVzZXJzIHNldCB0aGUgc2FtZSBiaXQsIG9uZSB1c2VyIHdpbGwgcmV0dXJuIHJlbWFpbiBiaXRzLCBvdGhlcndpc2UKKyAqIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGJpdG1hcF9zZXRfbGwodW5zaWduZWQgbG9uZyAqbWFwLCBpbnQgc3RhcnQsIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nICpwID0gbWFwICsgQklUX1dPUkQoc3RhcnQpOworCWNvbnN0IGludCBzaXplID0gc3RhcnQgKyBucjsKKwlpbnQgYml0c190b19zZXQgPSBCSVRTX1BFUl9MT05HIC0gKHN0YXJ0ICUgQklUU19QRVJfTE9ORyk7CisJdW5zaWduZWQgbG9uZyBtYXNrX3RvX3NldCA9IEJJVE1BUF9GSVJTVF9XT1JEX01BU0soc3RhcnQpOworCisJd2hpbGUgKG5yIC0gYml0c190b19zZXQgPj0gMCkgeworCQlpZiAoc2V0X2JpdHNfbGwocCwgbWFza190b19zZXQpKQorCQkJcmV0dXJuIG5yOworCQluciAtPSBiaXRzX3RvX3NldDsKKwkJYml0c190b19zZXQgPSBCSVRTX1BFUl9MT05HOworCQltYXNrX3RvX3NldCA9IH4wVUw7CisJCXArKzsKKwl9CisJaWYgKG5yKSB7CisJCW1hc2tfdG9fc2V0ICY9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKwkJaWYgKHNldF9iaXRzX2xsKHAsIG1hc2tfdG9fc2V0KSkKKwkJCXJldHVybiBucjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGJpdG1hcF9jbGVhcl9sbCAtIGNsZWFyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgorICogQG1hcDogcG9pbnRlciB0byBhIGJpdG1hcAorICogQHN0YXJ0OiBhIGJpdCBwb3NpdGlvbiBpbiBAbWFwCisgKiBAbnI6IG51bWJlciBvZiBiaXRzIHRvIHNldAorICoKKyAqIENsZWFyIEBuciBiaXRzIHN0YXJ0IGZyb20gQHN0YXJ0IGluIEBtYXAgbG9jay1sZXNzbHkuIFNldmVyYWwgdXNlcnMKKyAqIGNhbiBzZXQvY2xlYXIgdGhlIHNhbWUgYml0bWFwIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQgbG9jay4gSWYgdHdvCisgKiB1c2VycyBjbGVhciB0aGUgc2FtZSBiaXQsIG9uZSB1c2VyIHdpbGwgcmV0dXJuIHJlbWFpbiBiaXRzLAorICogb3RoZXJ3aXNlIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGJpdG1hcF9jbGVhcl9sbCh1bnNpZ25lZCBsb25nICptYXAsIGludCBzdGFydCwgaW50IG5yKQoreworCXVuc2lnbmVkIGxvbmcgKnAgPSBtYXAgKyBCSVRfV09SRChzdGFydCk7CisJY29uc3QgaW50IHNpemUgPSBzdGFydCArIG5yOworCWludCBiaXRzX3RvX2NsZWFyID0gQklUU19QRVJfTE9ORyAtIChzdGFydCAlIEJJVFNfUEVSX0xPTkcpOworCXVuc2lnbmVkIGxvbmcgbWFza190b19jbGVhciA9IEJJVE1BUF9GSVJTVF9XT1JEX01BU0soc3RhcnQpOworCisJd2hpbGUgKG5yIC0gYml0c190b19jbGVhciA+PSAwKSB7CisJCWlmIChjbGVhcl9iaXRzX2xsKHAsIG1hc2tfdG9fY2xlYXIpKQorCQkJcmV0dXJuIG5yOworCQluciAtPSBiaXRzX3RvX2NsZWFyOworCQliaXRzX3RvX2NsZWFyID0gQklUU19QRVJfTE9ORzsKKwkJbWFza190b19jbGVhciA9IH4wVUw7CisJCXArKzsKKwl9CisJaWYgKG5yKSB7CisJCW1hc2tfdG9fY2xlYXIgJj0gQklUTUFQX0xBU1RfV09SRF9NQVNLKHNpemUpOworCQlpZiAoY2xlYXJfYml0c19sbChwLCBtYXNrX3RvX2NsZWFyKSkKKwkJCXJldHVybiBucjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBnZW5fcG9vbF9jcmVhdGUgLSBjcmVhdGUgYSBuZXcgc3BlY2lhbCBtZW1vcnkgcG9vbAorICogQG1pbl9hbGxvY19vcmRlcjogbG9nIGJhc2UgMiBvZiBudW1iZXIgb2YgYnl0ZXMgZWFjaCBiaXRtYXAgYml0IHJlcHJlc2VudHMKKyAqIEBuaWQ6IG5vZGUgaWQgb2YgdGhlIG5vZGUgdGhlIHBvb2wgc3RydWN0dXJlIHNob3VsZCBiZSBhbGxvY2F0ZWQgb24sIG9yIC0xCisgKgorICogQ3JlYXRlIGEgbmV3IHNwZWNpYWwgbWVtb3J5IHBvb2wgdGhhdCBjYW4gYmUgdXNlZCB0byBtYW5hZ2Ugc3BlY2lhbCBwdXJwb3NlCisgKiBtZW1vcnkgbm90IG1hbmFnZWQgYnkgdGhlIHJlZ3VsYXIga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuCisgKi8KK3N0cnVjdCBnZW5fcG9vbCAqZ2VuX3Bvb2xfY3JlYXRlKGludCBtaW5fYWxsb2Nfb3JkZXIsIGludCBuaWQpCit7CisJc3RydWN0IGdlbl9wb29sICpwb29sOworCisJcG9vbCA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGdlbl9wb29sKSwgR0ZQX0tFUk5FTCwgbmlkKTsKKwlpZiAocG9vbCAhPSBOVUxMKSB7CisJCXNwaW5fbG9ja19pbml0KCZwb29sLT5sb2NrKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnBvb2wtPmNodW5rcyk7CisJCXBvb2wtPm1pbl9hbGxvY19vcmRlciA9IG1pbl9hbGxvY19vcmRlcjsKKwkJcG9vbC0+YWxnbyA9IGdlbl9wb29sX2ZpcnN0X2ZpdDsKKwkJcG9vbC0+ZGF0YSA9IE5VTEw7CisJCXBvb2wtPm5hbWUgPSBOVUxMOworCX0KKwlyZXR1cm4gcG9vbDsKK30KK0VYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfY3JlYXRlKTsKKworLyoqCisgKiBnZW5fcG9vbF9hZGRfdmlydCAtIGFkZCBhIG5ldyBjaHVuayBvZiBzcGVjaWFsIG1lbW9yeSB0byB0aGUgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gYWRkIG5ldyBtZW1vcnkgY2h1bmsgdG8KKyAqIEB2aXJ0OiB2aXJ0dWFsIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgbWVtb3J5IGNodW5rIHRvIGFkZCB0byBwb29sCisgKiBAcGh5czogcGh5c2ljYWwgc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgY2h1bmsgdG8gYWRkIHRvIHBvb2wKKyAqIEBzaXplOiBzaXplIGluIGJ5dGVzIG9mIHRoZSBtZW1vcnkgY2h1bmsgdG8gYWRkIHRvIHBvb2wKKyAqIEBuaWQ6IG5vZGUgaWQgb2YgdGhlIG5vZGUgdGhlIGNodW5rIHN0cnVjdHVyZSBhbmQgYml0bWFwIHNob3VsZCBiZQorICogICAgICAgYWxsb2NhdGVkIG9uLCBvciAtMQorICoKKyAqIEFkZCBhIG5ldyBjaHVuayBvZiBzcGVjaWFsIG1lbW9yeSB0byB0aGUgc3BlY2lmaWVkIHBvb2wuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSAtdmUgZXJybm8gb24gZmFpbHVyZS4KKyAqLworaW50IGdlbl9wb29sX2FkZF92aXJ0KHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgdW5zaWduZWQgbG9uZyB2aXJ0LCBwaHlzX2FkZHJfdCBwaHlzLAorCQkgc2l6ZV90IHNpemUsIGludCBuaWQpCit7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlpbnQgbmJpdHMgPSBzaXplID4+IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKKwlpbnQgbmJ5dGVzID0gc2l6ZW9mKHN0cnVjdCBnZW5fcG9vbF9jaHVuaykgKworCQkJCUJJVFNfVE9fTE9OR1MobmJpdHMpICogc2l6ZW9mKGxvbmcpOworCisJY2h1bmsgPSB2emFsbG9jX25vZGUobmJ5dGVzLCBuaWQpOworCWlmICh1bmxpa2VseShjaHVuayA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljaHVuay0+cGh5c19hZGRyID0gcGh5czsKKwljaHVuay0+c3RhcnRfYWRkciA9IHZpcnQ7CisJY2h1bmstPmVuZF9hZGRyID0gdmlydCArIHNpemUgLSAxOworCWF0b21pY19sb25nX3NldCgmY2h1bmstPmF2YWlsLCBzaXplKTsKKworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisJbGlzdF9hZGRfcmN1KCZjaHVuay0+bmV4dF9jaHVuaywgJnBvb2wtPmNodW5rcyk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2FkZF92aXJ0KTsKKworLyoqCisgKiBnZW5fcG9vbF92aXJ0X3RvX3BoeXMgLSByZXR1cm4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgbWVtb3J5CisgKiBAcG9vbDogcG9vbCB0byBhbGxvY2F0ZSBmcm9tCisgKiBAYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkKKyAqCisgKiBSZXR1cm5zIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9uIHN1Y2Nlc3MsIG9yIC0xIG9uIGVycm9yLgorICovCitwaHlzX2FkZHJfdCBnZW5fcG9vbF92aXJ0X3RvX3BoeXMoc3RydWN0IGdlbl9wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlwaHlzX2FkZHJfdCBwYWRkciA9IC0xOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CisJCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPD0gY2h1bmstPmVuZF9hZGRyKSB7CisJCQlwYWRkciA9IGNodW5rLT5waHlzX2FkZHIgKyAoYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHBhZGRyOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF92aXJ0X3RvX3BoeXMpOworCisvKioKKyAqIGdlbl9wb29sX2Rlc3Ryb3kgLSBkZXN0cm95IGEgc3BlY2lhbCBtZW1vcnkgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gZGVzdHJveQorICoKKyAqIERlc3Ryb3kgdGhlIHNwZWNpZmllZCBzcGVjaWFsIG1lbW9yeSBwb29sLiBWZXJpZmllcyB0aGF0IHRoZXJlIGFyZSBubworICogb3V0c3RhbmRpbmcgYWxsb2NhdGlvbnMuCisgKi8KK3ZvaWQgZ2VuX3Bvb2xfZGVzdHJveShzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqX2NodW5rLCAqX25leHRfY2h1bms7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7CisJaW50IGJpdCwgZW5kX2JpdDsKKworCWxpc3RfZm9yX2VhY2hfc2FmZShfY2h1bmssIF9uZXh0X2NodW5rLCAmcG9vbC0+Y2h1bmtzKSB7CisJCWNodW5rID0gbGlzdF9lbnRyeShfY2h1bmssIHN0cnVjdCBnZW5fcG9vbF9jaHVuaywgbmV4dF9jaHVuayk7CisJCWxpc3RfZGVsKCZjaHVuay0+bmV4dF9jaHVuayk7CisKKwkJZW5kX2JpdCA9IGNodW5rX3NpemUoY2h1bmspID4+IG9yZGVyOworCQliaXQgPSBmaW5kX25leHRfYml0KGNodW5rLT5iaXRzLCBlbmRfYml0LCAwKTsKKwkJQlVHX09OKGJpdCA8IGVuZF9iaXQpOworCisJCXZmcmVlKGNodW5rKTsKKwl9CisJa2ZyZWVfY29uc3QocG9vbC0+bmFtZSk7CisJa2ZyZWUocG9vbCk7Cit9CitFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2Rlc3Ryb3kpOworCisvKioKKyAqIGdlbl9wb29sX2FsbG9jIC0gYWxsb2NhdGUgc3BlY2lhbCBtZW1vcnkgZnJvbSB0aGUgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gYWxsb2NhdGUgZnJvbQorICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZSBmcm9tIHRoZSBwb29sCisgKgorICogQWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHBvb2wuCisgKiBVc2VzIHRoZSBwb29sIGFsbG9jYXRpb24gZnVuY3Rpb24gKHdpdGggZmlyc3QtZml0IGFsZ29yaXRobSBieSBkZWZhdWx0KS4KKyAqIENhbiBub3QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlciBvbiBhcmNoaXRlY3R1cmVzIHdpdGhvdXQKKyAqIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24uCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2VuX3Bvb2xfYWxsb2Moc3RydWN0IGdlbl9wb29sICpwb29sLCBzaXplX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gZ2VuX3Bvb2xfYWxsb2NfYWxnbyhwb29sLCBzaXplLCBwb29sLT5hbGdvLCBwb29sLT5kYXRhKTsKK30KK0VYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfYWxsb2MpOworCisvKioKKyAqIGdlbl9wb29sX2FsbG9jX2FsZ28gLSBhbGxvY2F0ZSBzcGVjaWFsIG1lbW9yeSBmcm9tIHRoZSBwb29sCisgKiBAcG9vbDogcG9vbCB0byBhbGxvY2F0ZSBmcm9tCisgKiBAc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZyb20gdGhlIHBvb2wKKyAqIEBhbGdvOiBhbGdvcml0aG0gcGFzc2VkIGZyb20gY2FsbGVyCisgKiBAZGF0YTogZGF0YSBwYXNzZWQgdG8gYWxnb3JpdGhtCisgKgorICogQWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgc3BlY2lmaWVkIHBvb2wuCisgKiBVc2VzIHRoZSBwb29sIGFsbG9jYXRpb24gZnVuY3Rpb24gKHdpdGggZmlyc3QtZml0IGFsZ29yaXRobSBieSBkZWZhdWx0KS4KKyAqIENhbiBub3QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlciBvbiBhcmNoaXRlY3R1cmVzIHdpdGhvdXQKKyAqIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24uCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2VuX3Bvb2xfYWxsb2NfYWxnbyhzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHNpemVfdCBzaXplLAorCQlnZW5wb29sX2FsZ29fdCBhbGdvLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gMDsKKwlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7CisJaW50IG5iaXRzLCBzdGFydF9iaXQsIGVuZF9iaXQsIHJlbWFpbjsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCW5iaXRzID0gKHNpemUgKyAoMVVMIDw8IG9yZGVyKSAtIDEpID4+IG9yZGVyOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaHVuaywgJnBvb2wtPmNodW5rcywgbmV4dF9jaHVuaykgeworCQlpZiAoc2l6ZSA+IGF0b21pY19sb25nX3JlYWQoJmNodW5rLT5hdmFpbCkpCisJCQljb250aW51ZTsKKworCQlzdGFydF9iaXQgPSAwOworCQllbmRfYml0ID0gY2h1bmtfc2l6ZShjaHVuaykgPj4gb3JkZXI7CityZXRyeToKKwkJc3RhcnRfYml0ID0gYWxnbyhjaHVuay0+Yml0cywgZW5kX2JpdCwgc3RhcnRfYml0LAorCQkJCSBuYml0cywgZGF0YSwgcG9vbCwgY2h1bmstPnN0YXJ0X2FkZHIpOworCQlpZiAoc3RhcnRfYml0ID49IGVuZF9iaXQpCisJCQljb250aW51ZTsKKwkJcmVtYWluID0gYml0bWFwX3NldF9sbChjaHVuay0+Yml0cywgc3RhcnRfYml0LCBuYml0cyk7CisJCWlmIChyZW1haW4pIHsKKwkJCXJlbWFpbiA9IGJpdG1hcF9jbGVhcl9sbChjaHVuay0+Yml0cywgc3RhcnRfYml0LAorCQkJCQkJIG5iaXRzIC0gcmVtYWluKTsKKwkJCUJVR19PTihyZW1haW4pOworCQkJZ290byByZXRyeTsKKwkJfQorCisJCWFkZHIgPSBjaHVuay0+c3RhcnRfYWRkciArICgodW5zaWduZWQgbG9uZylzdGFydF9iaXQgPDwgb3JkZXIpOworCQlzaXplID0gbmJpdHMgPDwgb3JkZXI7CisJCWF0b21pY19sb25nX3N1YihzaXplLCAmY2h1bmstPmF2YWlsKTsKKwkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhZGRyOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9hbGxvY19hbGdvKTsKKworLyoqCisgKiBnZW5fcG9vbF9kbWFfYWxsb2MgLSBhbGxvY2F0ZSBzcGVjaWFsIG1lbW9yeSBmcm9tIHRoZSBwb29sIGZvciBETUEgdXNhZ2UKKyAqIEBwb29sOiBwb29sIHRvIGFsbG9jYXRlIGZyb20KKyAqIEBzaXplOiBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgcG9vbAorICogQGRtYTogZG1hLXZpZXcgcGh5c2ljYWwgYWRkcmVzcyByZXR1cm4gdmFsdWUuICBVc2UgTlVMTCBpZiB1bm5lZWRlZC4KKyAqCisgKiBBbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqIFVzZXMgdGhlIHBvb2wgYWxsb2NhdGlvbiBmdW5jdGlvbiAod2l0aCBmaXJzdC1maXQgYWxnb3JpdGhtIGJ5IGRlZmF1bHQpLgorICogQ2FuIG5vdCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyIG9uIGFyY2hpdGVjdHVyZXMgd2l0aG91dAorICogTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbi4KKyAqLwordm9pZCAqZ2VuX3Bvb2xfZG1hX2FsbG9jKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgc2l6ZV90IHNpemUsIGRtYV9hZGRyX3QgKmRtYSkKK3sKKwl1bnNpZ25lZCBsb25nIHZhZGRyOworCisJaWYgKCFwb29sKQorCQlyZXR1cm4gTlVMTDsKKworCXZhZGRyID0gZ2VuX3Bvb2xfYWxsb2MocG9vbCwgc2l6ZSk7CisJaWYgKCF2YWRkcikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoZG1hKQorCQkqZG1hID0gZ2VuX3Bvb2xfdmlydF90b19waHlzKHBvb2wsIHZhZGRyKTsKKworCXJldHVybiAodm9pZCAqKXZhZGRyOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9kbWFfYWxsb2MpOworCisvKioKKyAqIGdlbl9wb29sX2ZyZWUgLSBmcmVlIGFsbG9jYXRlZCBzcGVjaWFsIG1lbW9yeSBiYWNrIHRvIHRoZSBwb29sCisgKiBAcG9vbDogcG9vbCB0byBmcmVlIHRvCisgKiBAYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgdG8gZnJlZSBiYWNrIHRvIHBvb2wKKyAqIEBzaXplOiBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSB0byBmcmVlCisgKgorICogRnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGVjaWFsIG1lbW9yeSBiYWNrIHRvIHRoZSBzcGVjaWZpZWQKKyAqIHBvb2wuICBDYW4gbm90IGJlIHVzZWQgaW4gTk1JIGhhbmRsZXIgb24gYXJjaGl0ZWN0dXJlcyB3aXRob3V0CisgKiBOTUktc2FmZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLgorICovCit2b2lkIGdlbl9wb29sX2ZyZWUoc3RydWN0IGdlbl9wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIGFkZHIsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisJaW50IG9yZGVyID0gcG9vbC0+bWluX2FsbG9jX29yZGVyOworCWludCBzdGFydF9iaXQsIG5iaXRzLCByZW1haW47CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJQlVHX09OKGluX25taSgpKTsKKyNlbmRpZgorCisJbmJpdHMgPSAoc2l6ZSArICgxVUwgPDwgb3JkZXIpIC0gMSkgPj4gb3JkZXI7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CisJCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPD0gY2h1bmstPmVuZF9hZGRyKSB7CisJCQlCVUdfT04oYWRkciArIHNpemUgLSAxID4gY2h1bmstPmVuZF9hZGRyKTsKKwkJCXN0YXJ0X2JpdCA9IChhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIpID4+IG9yZGVyOworCQkJcmVtYWluID0gYml0bWFwX2NsZWFyX2xsKGNodW5rLT5iaXRzLCBzdGFydF9iaXQsIG5iaXRzKTsKKwkJCUJVR19PTihyZW1haW4pOworCQkJc2l6ZSA9IG5iaXRzIDw8IG9yZGVyOworCQkJYXRvbWljX2xvbmdfYWRkKHNpemUsICZjaHVuay0+YXZhaWwpOworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2ZyZWUpOworCisvKioKKyAqIGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rIC0gY2FsbCBmdW5jIGZvciBldmVyeSBjaHVuayBvZiBnZW5lcmljIG1lbW9yeSBwb29sCisgKiBAcG9vbDoJdGhlIGdlbmVyaWMgbWVtb3J5IHBvb2wKKyAqIEBmdW5jOglmdW5jIHRvIGNhbGwKKyAqIEBkYXRhOglhZGRpdGlvbmFsIGRhdGEgdXNlZCBieSBAZnVuYworICoKKyAqIENhbGwgQGZ1bmMgZm9yIGV2ZXJ5IGNodW5rIG9mIGdlbmVyaWMgbWVtb3J5IHBvb2wuICBUaGUgQGZ1bmMgaXMKKyAqIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgaGVsZC4KKyAqLwordm9pZCBnZW5fcG9vbF9mb3JfZWFjaF9jaHVuayhzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsCisJdm9pZCAoKmZ1bmMpKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuaywgdm9pZCAqZGF0YSksCisJdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmKHBvb2wpLT5jaHVua3MsIG5leHRfY2h1bmspCisJCWZ1bmMocG9vbCwgY2h1bmssIGRhdGEpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9mb3JfZWFjaF9jaHVuayk7CisKKy8qKgorICogYWRkcl9pbl9nZW5fcG9vbCAtIGNoZWNrcyBpZiBhbiBhZGRyZXNzIGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgYSBwb29sCisgKiBAcG9vbDoJdGhlIGdlbmVyaWMgbWVtb3J5IHBvb2wKKyAqIEBzdGFydDoJc3RhcnQgYWRkcmVzcworICogQHNpemU6CXNpemUgb2YgdGhlIHJlZ2lvbgorICoKKyAqIENoZWNrIGlmIHRoZSByYW5nZSBvZiBhZGRyZXNzZXMgZmFsbHMgd2l0aGluIHRoZSBzcGVjaWZpZWQgcG9vbC4gUmV0dXJucworICogdHJ1ZSBpZiB0aGUgZW50aXJlIHJhbmdlIGlzIGNvbnRhaW5lZCBpbiB0aGUgcG9vbCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIGFkZHJfaW5fZ2VuX3Bvb2woc3RydWN0IGdlbl9wb29sICpwb29sLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJc2l6ZV90IHNpemUpCit7CisJYm9vbCBmb3VuZCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBzaXplIC0gMTsKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmKHBvb2wpLT5jaHVua3MsIG5leHRfY2h1bmspIHsKKwkJaWYgKHN0YXJ0ID49IGNodW5rLT5zdGFydF9hZGRyICYmIHN0YXJ0IDw9IGNodW5rLT5lbmRfYWRkcikgeworCQkJaWYgKGVuZCA8PSBjaHVuay0+ZW5kX2FkZHIpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGZvdW5kOworfQorCisvKioKKyAqIGdlbl9wb29sX2F2YWlsIC0gZ2V0IGF2YWlsYWJsZSBmcmVlIHNwYWNlIG9mIHRoZSBwb29sCisgKiBAcG9vbDogcG9vbCB0byBnZXQgYXZhaWxhYmxlIGZyZWUgc3BhY2UKKyAqCisgKiBSZXR1cm4gYXZhaWxhYmxlIGZyZWUgc3BhY2Ugb2YgdGhlIHNwZWNpZmllZCBwb29sLgorICovCitzaXplX3QgZ2VuX3Bvb2xfYXZhaWwoc3RydWN0IGdlbl9wb29sICpwb29sKQoreworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisJc2l6ZV90IGF2YWlsID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaHVuaywgJnBvb2wtPmNodW5rcywgbmV4dF9jaHVuaykKKwkJYXZhaWwgKz0gYXRvbWljX2xvbmdfcmVhZCgmY2h1bmstPmF2YWlsKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gYXZhaWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnZW5fcG9vbF9hdmFpbCk7CisKKy8qKgorICogZ2VuX3Bvb2xfc2l6ZSAtIGdldCBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSBtYW5hZ2VkIGJ5IHRoZSBwb29sCisgKiBAcG9vbDogcG9vbCB0byBnZXQgc2l6ZQorICoKKyAqIFJldHVybiBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSBtYW5hZ2VkIGJ5IHRoZSBwb29sLgorICovCitzaXplX3QgZ2VuX3Bvb2xfc2l6ZShzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wpCit7CisJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlzaXplX3Qgc2l6ZSA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICZwb29sLT5jaHVua3MsIG5leHRfY2h1bmspCisJCXNpemUgKz0gY2h1bmtfc2l6ZShjaHVuayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHNpemU7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnZW5fcG9vbF9zaXplKTsKKworLyoqCisgKiBnZW5fcG9vbF9zZXRfYWxnbyAtIHNldCB0aGUgYWxsb2NhdGlvbiBhbGdvcml0aG0KKyAqIEBwb29sOiBwb29sIHRvIGNoYW5nZSBhbGxvY2F0aW9uIGFsZ29yaXRobQorICogQGFsZ286IGN1c3RvbSBhbGdvcml0aG0gZnVuY3Rpb24KKyAqIEBkYXRhOiBhZGRpdGlvbmFsIGRhdGEgdXNlZCBieSBAYWxnbworICoKKyAqIENhbGwgQGFsZ28gZm9yIGVhY2ggbWVtb3J5IGFsbG9jYXRpb24gaW4gdGhlIHBvb2wuCisgKiBJZiBAYWxnbyBpcyBOVUxMIHVzZSBnZW5fcG9vbF9maXJzdF9maXQgYXMgZGVmYXVsdAorICogbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uCisgKi8KK3ZvaWQgZ2VuX3Bvb2xfc2V0X2FsZ28oc3RydWN0IGdlbl9wb29sICpwb29sLCBnZW5wb29sX2FsZ29fdCBhbGdvLCB2b2lkICpkYXRhKQoreworCXJjdV9yZWFkX2xvY2soKTsKKworCXBvb2wtPmFsZ28gPSBhbGdvOworCWlmICghcG9vbC0+YWxnbykKKwkJcG9vbC0+YWxnbyA9IGdlbl9wb29sX2ZpcnN0X2ZpdDsKKworCXBvb2wtPmRhdGEgPSBkYXRhOworCisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MKGdlbl9wb29sX3NldF9hbGdvKTsKKworLyoqCisgKiBnZW5fcG9vbF9maXJzdF9maXQgLSBmaW5kIHRoZSBmaXJzdCBhdmFpbGFibGUgcmVnaW9uCisgKiBvZiBtZW1vcnkgbWF0Y2hpbmcgdGhlIHNpemUgcmVxdWlyZW1lbnQgKG5vIGFsaWdubWVudCBjb25zdHJhaW50KQorICogQG1hcDogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAc2l6ZTogVGhlIGJpdG1hcCBzaXplIGluIGJpdHMKKyAqIEBzdGFydDogVGhlIGJpdG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgYXQKKyAqIEBucjogVGhlIG51bWJlciBvZiB6ZXJvZWQgYml0cyB3ZSdyZSBsb29raW5nIGZvcgorICogQGRhdGE6IGFkZGl0aW9uYWwgZGF0YSAtIHVudXNlZAorICogQHBvb2w6IHBvb2wgdG8gZmluZCB0aGUgZml0IHJlZ2lvbiBtZW1vcnkgZnJvbQorICovCit1bnNpZ25lZCBsb25nIGdlbl9wb29sX2ZpcnN0X2ZpdCh1bnNpZ25lZCBsb25nICptYXAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgaW50IG5yLCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcikKK3sKKwlyZXR1cm4gYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWEobWFwLCBzaXplLCBzdGFydCwgbnIsIDApOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9maXJzdF9maXQpOworCisvKioKKyAqIGdlbl9wb29sX2ZpcnN0X2ZpdF9hbGlnbiAtIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSByZWdpb24KKyAqIG9mIG1lbW9yeSBtYXRjaGluZyB0aGUgc2l6ZSByZXF1aXJlbWVudCAoYWxpZ25tZW50IGNvbnN0cmFpbnQpCisgKiBAbWFwOiBUaGUgYWRkcmVzcyB0byBiYXNlIHRoZSBzZWFyY2ggb24KKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICogQHN0YXJ0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQG5yOiBUaGUgbnVtYmVyIG9mIHplcm9lZCBiaXRzIHdlJ3JlIGxvb2tpbmcgZm9yCisgKiBAZGF0YTogZGF0YSBmb3IgYWxpZ25tZW50CisgKiBAcG9vbDogcG9vbCB0byBnZXQgb3JkZXIgZnJvbQorICovCit1bnNpZ25lZCBsb25nIGdlbl9wb29sX2ZpcnN0X2ZpdF9hbGlnbih1bnNpZ25lZCBsb25nICptYXAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgaW50IG5yLCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcikKK3sKKwlzdHJ1Y3QgZ2VucG9vbF9kYXRhX2FsaWduICphbGlnbm1lbnQ7CisJdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrLCBhbGlnbl9vZmY7CisJaW50IG9yZGVyOworCisJYWxpZ25tZW50ID0gZGF0YTsKKwlvcmRlciA9IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKKwlhbGlnbl9tYXNrID0gKChhbGlnbm1lbnQtPmFsaWduICsgKDFVTCA8PCBvcmRlcikgLSAxKSA+PiBvcmRlcikgLSAxOworCWFsaWduX29mZiA9IChzdGFydF9hZGRyICYgKGFsaWdubWVudC0+YWxpZ24gLSAxKSkgPj4gb3JkZXI7CisKKwlyZXR1cm4gYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWFfb2ZmKG1hcCwgc2l6ZSwgc3RhcnQsIG5yLAorCQkJCQkgICAgICBhbGlnbl9tYXNrLCBhbGlnbl9vZmYpOworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9maXJzdF9maXRfYWxpZ24pOworCisvKioKKyAqIGdlbl9wb29sX2ZpeGVkX2FsbG9jIC0gcmVzZXJ2ZSBhIHNwZWNpZmljIHJlZ2lvbgorICogQG1hcDogVGhlIGFkZHJlc3MgdG8gYmFzZSB0aGUgc2VhcmNoIG9uCisgKiBAc2l6ZTogVGhlIGJpdG1hcCBzaXplIGluIGJpdHMKKyAqIEBzdGFydDogVGhlIGJpdG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgYXQKKyAqIEBucjogVGhlIG51bWJlciBvZiB6ZXJvZWQgYml0cyB3ZSdyZSBsb29raW5nIGZvcgorICogQGRhdGE6IGRhdGEgZm9yIGFsaWdubWVudAorICogQHBvb2w6IHBvb2wgdG8gZ2V0IG9yZGVyIGZyb20KKyAqLwordW5zaWduZWQgbG9uZyBnZW5fcG9vbF9maXhlZF9hbGxvYyh1bnNpZ25lZCBsb25nICptYXAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgaW50IG5yLCB2b2lkICpkYXRhLAorCQlzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkcikKK3sKKwlzdHJ1Y3QgZ2VucG9vbF9kYXRhX2ZpeGVkICpmaXhlZF9kYXRhOworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBsb25nIG9mZnNldF9iaXQ7CisJdW5zaWduZWQgbG9uZyBzdGFydF9iaXQ7CisKKwlmaXhlZF9kYXRhID0gZGF0YTsKKwlvcmRlciA9IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKKwlvZmZzZXRfYml0ID0gZml4ZWRfZGF0YS0+b2Zmc2V0ID4+IG9yZGVyOworCWlmIChXQVJOX09OKGZpeGVkX2RhdGEtPm9mZnNldCAmICgoMVVMIDw8IG9yZGVyKSAtIDEpKSkKKwkJcmV0dXJuIHNpemU7CisKKwlzdGFydF9iaXQgPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYShtYXAsIHNpemUsCisJCQlzdGFydCArIG9mZnNldF9iaXQsIG5yLCAwKTsKKwlpZiAoc3RhcnRfYml0ICE9IG9mZnNldF9iaXQpCisJCXN0YXJ0X2JpdCA9IHNpemU7CisJcmV0dXJuIHN0YXJ0X2JpdDsKK30KK0VYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfZml4ZWRfYWxsb2MpOworCisvKioKKyAqIGdlbl9wb29sX2ZpcnN0X2ZpdF9vcmRlcl9hbGlnbiAtIGZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSByZWdpb24KKyAqIG9mIG1lbW9yeSBtYXRjaGluZyB0aGUgc2l6ZSByZXF1aXJlbWVudC4gVGhlIHJlZ2lvbiB3aWxsIGJlIGFsaWduZWQKKyAqIHRvIHRoZSBvcmRlciBvZiB0aGUgc2l6ZSBzcGVjaWZpZWQuCisgKiBAbWFwOiBUaGUgYWRkcmVzcyB0byBiYXNlIHRoZSBzZWFyY2ggb24KKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICogQHN0YXJ0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQG5yOiBUaGUgbnVtYmVyIG9mIHplcm9lZCBiaXRzIHdlJ3JlIGxvb2tpbmcgZm9yCisgKiBAZGF0YTogYWRkaXRpb25hbCBkYXRhIC0gdW51c2VkCisgKiBAcG9vbDogcG9vbCB0byBmaW5kIHRoZSBmaXQgcmVnaW9uIG1lbW9yeSBmcm9tCisgKi8KK3Vuc2lnbmVkIGxvbmcgZ2VuX3Bvb2xfZmlyc3RfZml0X29yZGVyX2FsaWduKHVuc2lnbmVkIGxvbmcgKm1hcCwKKwkJdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQl1bnNpZ25lZCBpbnQgbnIsIHZvaWQgKmRhdGEsIHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzayA9IHJvdW5kdXBfcG93X29mX3R3byhucikgLSAxOworCisJcmV0dXJuIGJpdG1hcF9maW5kX25leHRfemVyb19hcmVhKG1hcCwgc2l6ZSwgc3RhcnQsIG5yLCBhbGlnbl9tYXNrKTsKK30KK0VYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfZmlyc3RfZml0X29yZGVyX2FsaWduKTsKKworLyoqCisgKiBnZW5fcG9vbF9iZXN0X2ZpdCAtIGZpbmQgdGhlIGJlc3QgZml0dGluZyByZWdpb24gb2YgbWVtb3J5CisgKiBtYWN0aGluZyB0aGUgc2l6ZSByZXF1aXJlbWVudCAobm8gYWxpZ25tZW50IGNvbnN0cmFpbnQpCisgKiBAbWFwOiBUaGUgYWRkcmVzcyB0byBiYXNlIHRoZSBzZWFyY2ggb24KKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICogQHN0YXJ0OiBUaGUgYml0bnVtYmVyIHRvIHN0YXJ0IHNlYXJjaGluZyBhdAorICogQG5yOiBUaGUgbnVtYmVyIG9mIHplcm9lZCBiaXRzIHdlJ3JlIGxvb2tpbmcgZm9yCisgKiBAZGF0YTogYWRkaXRpb25hbCBkYXRhIC0gdW51c2VkCisgKiBAcG9vbDogcG9vbCB0byBmaW5kIHRoZSBmaXQgcmVnaW9uIG1lbW9yeSBmcm9tCisgKgorICogSXRlcmF0ZSBvdmVyIHRoZSBiaXRtYXAgdG8gZmluZCB0aGUgc21hbGxlc3QgZnJlZSByZWdpb24KKyAqIHdoaWNoIHdlIGNhbiBhbGxvY2F0ZSB0aGUgbWVtb3J5LgorICovCit1bnNpZ25lZCBsb25nIGdlbl9wb29sX2Jlc3RfZml0KHVuc2lnbmVkIGxvbmcgKm1hcCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgKmRhdGEsCisJCXN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyKQoreworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYml0ID0gc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGxlbiA9IHNpemUgKyAxOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisKKwlpbmRleCA9IGJpdG1hcF9maW5kX25leHRfemVyb19hcmVhKG1hcCwgc2l6ZSwgc3RhcnQsIG5yLCAwKTsKKworCXdoaWxlIChpbmRleCA8IHNpemUpIHsKKwkJaW50IG5leHRfYml0ID0gZmluZF9uZXh0X2JpdChtYXAsIHNpemUsIGluZGV4ICsgbnIpOworCQlpZiAoKG5leHRfYml0IC0gaW5kZXgpIDwgbGVuKSB7CisJCQlsZW4gPSBuZXh0X2JpdCAtIGluZGV4OworCQkJc3RhcnRfYml0ID0gaW5kZXg7CisJCQlpZiAobGVuID09IG5yKQorCQkJCXJldHVybiBzdGFydF9iaXQ7CisJCX0KKwkJaW5kZXggPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYShtYXAsIHNpemUsCisJCQkJCQkgICBuZXh0X2JpdCArIDEsIG5yLCAwKTsKKwl9CisKKwlyZXR1cm4gc3RhcnRfYml0OworfQorRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9iZXN0X2ZpdCk7CisKK3N0YXRpYyB2b2lkIGRldm1fZ2VuX3Bvb2xfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcykKK3sKKwlnZW5fcG9vbF9kZXN0cm95KCooc3RydWN0IGdlbl9wb29sICoqKXJlcyk7Cit9CisKK3N0YXRpYyBpbnQgZGV2bV9nZW5fcG9vbF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJlcywgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2wgKipwID0gcmVzOworCisJLyogTlVMTCBkYXRhIG1hdGNoZXMgb25seSBhIHBvb2wgd2l0aG91dCBhbiBhc3NpZ25lZCBuYW1lICovCisJaWYgKCFkYXRhICYmICEoKnApLT5uYW1lKQorCQlyZXR1cm4gMTsKKworCWlmICghZGF0YSB8fCAhKCpwKS0+bmFtZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gIXN0cmNtcCgoKnApLT5uYW1lLCBkYXRhKTsKK30KKworLyoqCisgKiBnZW5fcG9vbF9nZXQgLSBPYnRhaW4gdGhlIGdlbl9wb29sIChpZiBhbnkpIGZvciBhIGRldmljZQorICogQGRldjogZGV2aWNlIHRvIHJldHJpZXZlIHRoZSBnZW5fcG9vbCBmcm9tCisgKiBAbmFtZTogbmFtZSBvZiBhIGdlbl9wb29sIG9yIE5VTEwsIGlkZW50aWZpZXMgYSBwYXJ0aWN1bGFyIGdlbl9wb29sIG9uIGRldmljZQorICoKKyAqIFJldHVybnMgdGhlIGdlbl9wb29sIGZvciB0aGUgZGV2aWNlIGlmIG9uZSBpcyBwcmVzZW50LCBvciBOVUxMLgorICovCitzdHJ1Y3QgZ2VuX3Bvb2wgKmdlbl9wb29sX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGdlbl9wb29sICoqcDsKKworCXAgPSBkZXZyZXNfZmluZChkZXYsIGRldm1fZ2VuX3Bvb2xfcmVsZWFzZSwgZGV2bV9nZW5fcG9vbF9tYXRjaCwKKwkJCSh2b2lkICopbmFtZSk7CisJaWYgKCFwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKnA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChnZW5fcG9vbF9nZXQpOworCisvKioKKyAqIGRldm1fZ2VuX3Bvb2xfY3JlYXRlIC0gbWFuYWdlZCBnZW5fcG9vbF9jcmVhdGUKKyAqIEBkZXY6IGRldmljZSB0aGF0IHByb3ZpZGVzIHRoZSBnZW5fcG9vbAorICogQG1pbl9hbGxvY19vcmRlcjogbG9nIGJhc2UgMiBvZiBudW1iZXIgb2YgYnl0ZXMgZWFjaCBiaXRtYXAgYml0IHJlcHJlc2VudHMKKyAqIEBuaWQ6IG5vZGUgc2VsZWN0b3IgZm9yIGFsbG9jYXRlZCBnZW5fcG9vbCwgJU5VTUFfTk9fTk9ERSBmb3IgYWxsIG5vZGVzCisgKiBAbmFtZTogbmFtZSBvZiBhIGdlbl9wb29sIG9yIE5VTEwsIGlkZW50aWZpZXMgYSBwYXJ0aWN1bGFyIGdlbl9wb29sIG9uIGRldmljZQorICoKKyAqIENyZWF0ZSBhIG5ldyBzcGVjaWFsIG1lbW9yeSBwb29sIHRoYXQgY2FuIGJlIHVzZWQgdG8gbWFuYWdlIHNwZWNpYWwgcHVycG9zZQorICogbWVtb3J5IG5vdCBtYW5hZ2VkIGJ5IHRoZSByZWd1bGFyIGttYWxsb2Mva2ZyZWUgaW50ZXJmYWNlLiBUaGUgcG9vbCB3aWxsIGJlCisgKiBhdXRvbWF0aWNhbGx5IGRlc3Ryb3llZCBieSB0aGUgZGV2aWNlIG1hbmFnZW1lbnQgY29kZS4KKyAqLworc3RydWN0IGdlbl9wb29sICpkZXZtX2dlbl9wb29sX2NyZWF0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBtaW5fYWxsb2Nfb3JkZXIsCisJCQkJICAgICAgaW50IG5pZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2wgKipwdHIsICpwb29sOworCWNvbnN0IGNoYXIgKnBvb2xfbmFtZSA9IE5VTEw7CisKKwkvKiBDaGVjayB0aGF0IGdlbnBvb2wgdG8gYmUgY3JlYXRlZCBpcyB1bmlxdWVseSBhZGRyZXNzZWQgb24gZGV2aWNlICovCisJaWYgKGdlbl9wb29sX2dldChkZXYsIG5hbWUpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWlmIChuYW1lKSB7CisJCXBvb2xfbmFtZSA9IGtzdHJkdXBfY29uc3QobmFtZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9vbF9uYW1lKQorCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCisJcHRyID0gZGV2cmVzX2FsbG9jKGRldm1fZ2VuX3Bvb2xfcmVsZWFzZSwgc2l6ZW9mKCpwdHIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikKKwkJZ290byBmcmVlX3Bvb2xfbmFtZTsKKworCXBvb2wgPSBnZW5fcG9vbF9jcmVhdGUobWluX2FsbG9jX29yZGVyLCBuaWQpOworCWlmICghcG9vbCkKKwkJZ290byBmcmVlX2RldnJlczsKKworCSpwdHIgPSBwb29sOworCXBvb2wtPm5hbWUgPSBwb29sX25hbWU7CisJZGV2cmVzX2FkZChkZXYsIHB0cik7CisKKwlyZXR1cm4gcG9vbDsKKworZnJlZV9kZXZyZXM6CisJZGV2cmVzX2ZyZWUocHRyKTsKK2ZyZWVfcG9vbF9uYW1lOgorCWtmcmVlX2NvbnN0KHBvb2xfbmFtZSk7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KK0VYUE9SVF9TWU1CT0woZGV2bV9nZW5fcG9vbF9jcmVhdGUpOworCisjaWZkZWYgQ09ORklHX09GCisvKioKKyAqIG9mX2dlbl9wb29sX2dldCAtIGZpbmQgYSBwb29sIGJ5IHBoYW5kbGUgcHJvcGVydHkKKyAqIEBucDogZGV2aWNlIG5vZGUKKyAqIEBwcm9wbmFtZTogcHJvcGVydHkgbmFtZSBjb250YWluaW5nIHBoYW5kbGUocykKKyAqIEBpbmRleDogaW5kZXggaW50byB0aGUgcGhhbmRsZSBhcnJheQorICoKKyAqIFJldHVybnMgdGhlIHBvb2wgdGhhdCBjb250YWlucyB0aGUgY2h1bmsgc3RhcnRpbmcgYXQgdGhlIHBoeXNpY2FsCisgKiBhZGRyZXNzIG9mIHRoZSBkZXZpY2UgdHJlZSBub2RlIHBvaW50ZWQgYXQgYnkgdGhlIHBoYW5kbGUgcHJvcGVydHksCisgKiBvciBOVUxMIGlmIG5vdCBmb3VuZC4KKyAqLworc3RydWN0IGdlbl9wb29sICpvZl9nZW5fcG9vbF9nZXQoc3RydWN0IGRldmljZV9ub2RlICpucCwKKwljb25zdCBjaGFyICpwcm9wbmFtZSwgaW50IGluZGV4KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IGRldmljZV9ub2RlICpucF9wb29sLCAqcGFyZW50OworCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOworCXN0cnVjdCBnZW5fcG9vbCAqcG9vbCA9IE5VTEw7CisKKwlucF9wb29sID0gb2ZfcGFyc2VfcGhhbmRsZShucCwgcHJvcG5hbWUsIGluZGV4KTsKKwlpZiAoIW5wX3Bvb2wpCisJCXJldHVybiBOVUxMOworCisJcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUobnBfcG9vbCk7CisJaWYgKCFwZGV2KSB7CisJCS8qIENoZWNrIGlmIG5hbWVkIGdlbl9wb29sIGlzIGNyZWF0ZWQgYnkgcGFyZW50IG5vZGUgZGV2aWNlICovCisJCXBhcmVudCA9IG9mX2dldF9wYXJlbnQobnBfcG9vbCk7CisJCXBkZXYgPSBvZl9maW5kX2RldmljZV9ieV9ub2RlKHBhcmVudCk7CisJCW9mX25vZGVfcHV0KHBhcmVudCk7CisKKwkJb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcobnBfcG9vbCwgImxhYmVsIiwgJm5hbWUpOworCQlpZiAoIW5hbWUpCisJCQluYW1lID0gbnBfcG9vbC0+bmFtZTsKKwl9CisJaWYgKHBkZXYpCisJCXBvb2wgPSBnZW5fcG9vbF9nZXQoJnBkZXYtPmRldiwgbmFtZSk7CisJb2Zfbm9kZV9wdXQobnBfcG9vbCk7CisKKwlyZXR1cm4gcG9vbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG9mX2dlbl9wb29sX2dldCk7CisjZW5kaWYgLyogQ09ORklHX09GICovCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9nbG9iLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9nbG9iLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhM2VhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2dsb2IuYwpAQCAtMCwwICsxLDEyMyBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2dsb2IuaD4KKworLyoKKyAqIFRoZSBvbmx5IHJlYXNvbiB0aGlzIGNvZGUgY2FuIGJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlIGlzIGJlY2F1c2UgdGhlCisgKiBBVEEgY29kZSB0aGF0IGRlcGVuZHMgb24gaXQgY2FuIGJlIGFzIHdlbGwuICBJbiBwcmFjdGljZSwgdGhleSdyZQorICogYm90aCB1c3VhbGx5IGNvbXBpbGVkIGluIGFuZCB0aGUgbW9kdWxlIG92ZXJoZWFkIGdvZXMgYXdheS4KKyAqLworTU9EVUxFX0RFU0NSSVBUSU9OKCJnbG9iKDcpIG1hdGNoaW5nIik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBNSVQvR1BMIik7CisKKy8qKgorICogZ2xvYl9tYXRjaCAtIFNoZWxsLXN0eWxlIHBhdHRlcm4gbWF0Y2hpbmcsIGxpa2UgIWZubWF0Y2gocGF0LCBzdHIsIDApCisgKiBAcGF0OiBTaGVsbC1zdHlsZSBwYXR0ZXJuIHRvIG1hdGNoLCBlLmcuICIqLltjaF0iLgorICogQHN0cjogU3RyaW5nIHRvIG1hdGNoLiAgVGhlIHBhdHRlcm4gbXVzdCBtYXRjaCB0aGUgZW50aXJlIHN0cmluZy4KKyAqCisgKiBQZXJmb3JtIHNoZWxsLXN0eWxlIGdsb2IgbWF0Y2hpbmcsIHJldHVybmluZyB0cnVlICgxKSBpZiB0aGUgbWF0Y2gKKyAqIHN1Y2NlZWRzLCBvciBmYWxzZSAoMCkgaWYgaXQgZmFpbHMuICBFcXVpdmFsZW50IHRvICFmbm1hdGNoKEBwYXQsIEBzdHIsIDApLgorICoKKyAqIFBhdHRlcm4gbWV0YWNoYXJhY3RlcnMgYXJlID8sICosIFsgYW5kIFwuCisgKiAoQW5kLCBpbnNpZGUgY2hhcmFjdGVyIGNsYXNzZXMsICEsIC0gYW5kIF0uKQorICoKKyAqIFRoaXMgaXMgc21hbGwgYW5kIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBpbnRlbmRlZCBmb3IgZGV2aWNlIGJsYWNrbGlzdHMKKyAqIHdoZXJlIGEgc3RyaW5nIGlzIG1hdGNoZWQgYWdhaW5zdCBhIG51bWJlciBvZiBwYXR0ZXJucy4gIFRodXMsIGl0CisgKiBkb2VzIG5vdCBwcmVwcm9jZXNzIHRoZSBwYXR0ZXJucy4gIEl0IGlzIG5vbi1yZWN1cnNpdmUsIGFuZCBydW4tdGltZQorICogaXMgYXQgbW9zdCBxdWFkcmF0aWM6IHN0cmxlbihAc3RyKSpzdHJsZW4oQHBhdCkuCisgKgorICogQW4gZXhhbXBsZSBvZiB0aGUgd29yc3QgY2FzZSBpcyBnbG9iX21hdGNoKCIqYWFhYWEiLCAiYWFhYWFhYWFhYSIpOworICogaXQgdGFrZXMgNiBwYXNzZXMgb3ZlciB0aGUgcGF0dGVybiBiZWZvcmUgbWF0Y2hpbmcgdGhlIHN0cmluZy4KKyAqCisgKiBMaWtlICFmbm1hdGNoKEBwYXQsIEBzdHIsIDApIGFuZCB1bmxpa2UgdGhlIHNoZWxsLCB0aGlzIGRvZXMgTk9UCisgKiB0cmVhdCAvIG9yIGxlYWRpbmcgLiBzcGVjaWFsbHk7IGl0IGlzbid0IGFjdHVhbGx5IHVzZWQgZm9yIHBhdGhuYW1lcy4KKyAqCisgKiBOb3RlIHRoYXQgYWNjb3JkaW5nIHRvIGdsb2IoNykgKGFuZCB1bmxpa2UgYmFzaCksIGNoYXJhY3RlciBjbGFzc2VzCisgKiBhcmUgY29tcGxlbWVudGVkIGJ5IGEgbGVhZGluZyAhOyB0aGlzIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlZ2V4LXN0eWxlCisgKiBbXmEtel0gc3ludGF4LgorICoKKyAqIEFuIG9wZW5pbmcgYnJhY2tldCB3aXRob3V0IGEgbWF0Y2hpbmcgY2xvc2UgaXMgbWF0Y2hlZCBsaXRlcmFsbHkuCisgKi8KK2Jvb2wgX19wdXJlIGdsb2JfbWF0Y2goY2hhciBjb25zdCAqcGF0LCBjaGFyIGNvbnN0ICpzdHIpCit7CisJLyoKKwkgKiBCYWNrdHJhY2sgdG8gcHJldmlvdXMgKiBvbiBtaXNtYXRjaCBhbmQgcmV0cnkgc3RhcnRpbmcgb25lCisJICogY2hhcmFjdGVyIGxhdGVyIGluIHRoZSBzdHJpbmcuICBCZWNhdXNlICogbWF0Y2hlcyBhbGwgY2hhcmFjdGVycworCSAqIChubyBleGNlcHRpb24gZm9yIC8pLCBpdCBjYW4gYmUgZWFzaWx5IHByb3ZlZCB0aGF0IHRoZXJlJ3MKKwkgKiBuZXZlciBhIG5lZWQgdG8gYmFja3RyYWNrIG11bHRpcGxlIGxldmVscy4KKwkgKi8KKwljaGFyIGNvbnN0ICpiYWNrX3BhdCA9IE5VTEwsICpiYWNrX3N0ciA9IGJhY2tfc3RyOworCisJLyoKKwkgKiBMb29wIG92ZXIgZWFjaCB0b2tlbiAoY2hhcmFjdGVyIG9yIGNsYXNzKSBpbiBwYXQsIG1hdGNoaW5nCisJICogaXQgYWdhaW5zdCB0aGUgcmVtYWluaW5nIHVubWF0Y2hlZCB0YWlsIG9mIHN0ci4gIFJldHVybiBmYWxzZQorCSAqIG9uIG1pc21hdGNoLCBvciB0cnVlIGFmdGVyIG1hdGNoaW5nIHRoZSB0cmFpbGluZyBudWwgYnl0ZXMuCisJICovCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqc3RyKys7CisJCXVuc2lnbmVkIGNoYXIgZCA9ICpwYXQrKzsKKworCQlzd2l0Y2ggKGQpIHsKKwkJY2FzZSAnPyc6CS8qIFdpbGRjYXJkOiBhbnl0aGluZyBidXQgbnVsICovCisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCXJldHVybiBmYWxzZTsKKwkJCWJyZWFrOworCQljYXNlICcqJzoJLyogQW55LWxlbmd0aCB3aWxkY2FyZCAqLworCQkJaWYgKCpwYXQgPT0gJ1wwJykJLyogT3B0aW1pemUgdHJhaWxpbmcgKiBjYXNlICovCisJCQkJcmV0dXJuIHRydWU7CisJCQliYWNrX3BhdCA9IHBhdDsKKwkJCWJhY2tfc3RyID0gLS1zdHI7CS8qIEFsbG93IHplcm8tbGVuZ3RoIG1hdGNoICovCisJCQlicmVhazsKKwkJY2FzZSAnWyc6IHsJLyogQ2hhcmFjdGVyIGNsYXNzICovCisJCQlib29sIG1hdGNoID0gZmFsc2UsIGludmVydGVkID0gKCpwYXQgPT0gJyEnKTsKKwkJCWNoYXIgY29uc3QgKmNsYXNzID0gcGF0ICsgaW52ZXJ0ZWQ7CisJCQl1bnNpZ25lZCBjaGFyIGEgPSAqY2xhc3MrKzsKKworCQkJLyoKKwkJCSAqIEl0ZXJhdGUgb3ZlciBlYWNoIHNwYW4gaW4gdGhlIGNoYXJhY3RlciBjbGFzcy4KKwkJCSAqIEEgc3BhbiBpcyBlaXRoZXIgYSBzaW5nbGUgY2hhcmFjdGVyIGEsIG9yIGEKKwkJCSAqIHJhbmdlIGEtYi4gIFRoZSBmaXJzdCBzcGFuIG1heSBiZWdpbiB3aXRoICddJy4KKwkJCSAqLworCQkJZG8geworCQkJCXVuc2lnbmVkIGNoYXIgYiA9IGE7CisKKwkJCQlpZiAoYSA9PSAnXDAnKQkvKiBNYWxmb3JtZWQgKi8KKwkJCQkJZ290byBsaXRlcmFsOworCisJCQkJaWYgKGNsYXNzWzBdID09ICctJyAmJiBjbGFzc1sxXSAhPSAnXScpIHsKKwkJCQkJYiA9IGNsYXNzWzFdOworCisJCQkJCWlmIChiID09ICdcMCcpCisJCQkJCQlnb3RvIGxpdGVyYWw7CisKKwkJCQkJY2xhc3MgKz0gMjsKKwkJCQkJLyogQW55IHNwZWNpYWwgYWN0aW9uIGlmIGEgPiBiPyAqLworCQkJCX0KKwkJCQltYXRjaCB8PSAoYSA8PSBjICYmIGMgPD0gYik7CisJCQl9IHdoaWxlICgoYSA9ICpjbGFzcysrKSAhPSAnXScpOworCisJCQlpZiAobWF0Y2ggPT0gaW52ZXJ0ZWQpCisJCQkJZ290byBiYWNrdHJhY2s7CisJCQlwYXQgPSBjbGFzczsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcXCc6CisJCQlkID0gKnBhdCsrOworCQkJLypGQUxMVEhST1VHSCovCisJCWRlZmF1bHQ6CS8qIExpdGVyYWwgY2hhcmFjdGVyICovCitsaXRlcmFsOgorCQkJaWYgKGMgPT0gZCkgeworCQkJCWlmIChkID09ICdcMCcpCisJCQkJCXJldHVybiB0cnVlOworCQkJCWJyZWFrOworCQkJfQorYmFja3RyYWNrOgorCQkJaWYgKGMgPT0gJ1wwJyB8fCAhYmFja19wYXQpCisJCQkJcmV0dXJuIGZhbHNlOwkvKiBObyBwb2ludCBjb250aW51aW5nICovCisJCQkvKiBUcnkgYWdhaW4gZnJvbSBsYXN0ICosIG9uZSBjaGFyYWN0ZXIgbGF0ZXIgaW4gc3RyLiAqLworCQkJcGF0ID0gYmFja19wYXQ7CisJCQlzdHIgPSArK2JhY2tfc3RyOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGdsb2JfbWF0Y2gpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvZ2xvYnRlc3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2dsb2J0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlOTdkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2dsb2J0ZXN0LmMKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBFeHRyYWN0ZWQgZnJvbm0gZ2xvYi5jCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvZ2xvYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ByaW50ay5oPgorCisvKiBCb290IHdpdGggImdsb2IudmVyYm9zZT0xIiB0byBzaG93IHN1Y2Nlc3NmdWwgdGVzdHMsIHRvbyAqLworc3RhdGljIGJvb2wgdmVyYm9zZSA9IGZhbHNlOworbW9kdWxlX3BhcmFtKHZlcmJvc2UsIGJvb2wsIDApOworCitzdHJ1Y3QgZ2xvYl90ZXN0IHsKKwljaGFyIGNvbnN0ICpwYXQsICpzdHI7CisJYm9vbCBleHBlY3RlZDsKK307CisKK3N0YXRpYyBib29sIF9fcHVyZSBfX2luaXQgdGVzdChjaGFyIGNvbnN0ICpwYXQsIGNoYXIgY29uc3QgKnN0ciwgYm9vbCBleHBlY3RlZCkKK3sKKwlib29sIG1hdGNoID0gZ2xvYl9tYXRjaChwYXQsIHN0cik7CisJYm9vbCBzdWNjZXNzID0gbWF0Y2ggPT0gZXhwZWN0ZWQ7CisKKwkvKiBDYW4ndCBnZXQgc3RyaW5nIGxpdGVyYWxzIGludG8gYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIHNvLi4uICovCisJc3RhdGljIGNoYXIgY29uc3QgbXNnX2Vycm9yW10gX19pbml0Y29uc3QgPQorCQlLRVJOX0VSUiAiZ2xvYjogXCIlc1wiIHZzLiBcIiVzXCI6ICVzICoqKiBFUlJPUiAqKipcbiI7CisJc3RhdGljIGNoYXIgY29uc3QgbXNnX29rW10gX19pbml0Y29uc3QgPQorCQlLRVJOX0RFQlVHICJnbG9iOiBcIiVzXCIgdnMuIFwiJXNcIjogJXMgT0tcbiI7CisJc3RhdGljIGNoYXIgY29uc3QgbWlzbWF0Y2hbXSBfX2luaXRjb25zdCA9ICJtaXNtYXRjaCI7CisJY2hhciBjb25zdCAqbWVzc2FnZTsKKworCWlmICghc3VjY2VzcykKKwkJbWVzc2FnZSA9IG1zZ19lcnJvcjsKKwllbHNlIGlmICh2ZXJib3NlKQorCQltZXNzYWdlID0gbXNnX29rOworCWVsc2UKKwkJcmV0dXJuIHN1Y2Nlc3M7CisKKwlwcmludGsobWVzc2FnZSwgcGF0LCBzdHIsIG1pc21hdGNoICsgMyptYXRjaCk7CisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qCisgKiBUaGUgdGVzdHMgYXJlIGFsbCBqYW1tZWQgdG9nZXRoZXIgaW4gb25lIGFycmF5IHRvIG1ha2UgaXQgc2ltcGxlcgorICogdG8gcGxhY2UgdGhhdCBhcnJheSBpbiB0aGUgLmluaXQucm9kYXRhIHNlY3Rpb24uICBUaGUgb2J2aW91cworICogImFycmF5IG9mIHN0cnVjdHVyZXMgY29udGFpbmluZyBjaGFyICoiIGhhcyBubyB3YXkgdG8gZm9yY2UgdGhlCisgKiBwb2ludGVkLXRvIHN0cmluZ3MgdG8gYmUgaW4gYSBwYXJ0aWN1bGFyIHNlY3Rpb24uCisgKgorICogQW55d2F5LCBhIHRlc3QgY29uc2lzdHMgb2Y6CisgKiAxLiBFeHBlY3RlZCBnbG9iX21hdGNoIHJlc3VsdDogJzEnIG9yICcwJy4KKyAqIDIuIFBhdHRlcm4gdG8gbWF0Y2g6IG51bGwtdGVybWluYXRlZCBzdHJpbmcKKyAqIDMuIFN0cmluZyB0byBtYXRjaCBhZ2FpbnN0OiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nCisgKgorICogVGhlIGxpc3Qgb2YgdGVzdHMgaXMgdGVybWluYXRlZCB3aXRoIGEgZmluYWwgJ1wwJyBpbnN0ZWFkIG9mCisgKiBhIGdsb2JfbWF0Y2ggcmVzdWx0IGNoYXJhY3Rlci4KKyAqLworc3RhdGljIGNoYXIgY29uc3QgZ2xvYl90ZXN0c1tdIF9faW5pdGNvbnN0ID0KKwkvKiBTb21lIGJhc2ljIHRlc3RzICovCisJIjEiICJhXDAiICJhXDAiCisJIjAiICJhXDAiICJiXDAiCisJIjAiICJhXDAiICJhYVwwIgorCSIwIiAiYVwwIiAiXDAiCisJIjEiICJcMCIgIlwwIgorCSIwIiAiXDAiICJhXDAiCisJLyogU2ltcGxlIGNoYXJhY3RlciBjbGFzcyB0ZXN0cyAqLworCSIxIiAiW2FdXDAiICJhXDAiCisJIjAiICJbYV1cMCIgImJcMCIKKwkiMCIgIlshYV1cMCIgImFcMCIKKwkiMSIgIlshYV1cMCIgImJcMCIKKwkiMSIgIlthYl1cMCIgImFcMCIKKwkiMSIgIlthYl1cMCIgImJcMCIKKwkiMCIgIlthYl1cMCIgImNcMCIKKwkiMSIgIlshYWJdXDAiICJjXDAiCisJIjEiICJbYS1jXVwwIiAiYlwwIgorCSIwIiAiW2EtY11cMCIgImRcMCIKKwkvKiBDb3JuZXIgY2FzZXMgaW4gY2hhcmFjdGVyIGNsYXNzIHBhcnNpbmcgKi8KKwkiMSIgIlthLWMtZS1nXVwwIiAiLVwwIgorCSIwIiAiW2EtYy1lLWddXDAiICJkXDAiCisJIjEiICJbYS1jLWUtZ11cMCIgImZcMCIKKwkiMSIgIltdYS1jZWctaWtbXVwwIiAiYVwwIgorCSIxIiAiW11hLWNlZy1pa1tdXDAiICJdXDAiCisJIjEiICJbXWEtY2VnLWlrW11cMCIgIltcMCIKKwkiMSIgIltdYS1jZWctaWtbXVwwIiAiaFwwIgorCSIwIiAiW11hLWNlZy1pa1tdXDAiICJmXDAiCisJIjAiICJbIV1hLWNlZy1pa1tdXDAiICJoXDAiCisJIjAiICJbIV1hLWNlZy1pa1tdXDAiICJdXDAiCisJIjEiICJbIV1hLWNlZy1pa1tdXDAiICJmXDAiCisJLyogU2ltcGxlIHdpbGQgY2FyZHMgKi8KKwkiMSIgIj9cMCIgImFcMCIKKwkiMCIgIj9cMCIgImFhXDAiCisJIjAiICI/P1wwIiAiYVwwIgorCSIxIiAiP3g/XDAiICJheGJcMCIKKwkiMCIgIj94P1wwIiAiYWJ4XDAiCisJIjAiICI/eD9cMCIgInhhYlwwIgorCS8qIEFzdGVyaXNrIHdpbGQgY2FyZHMgKGJhY2t0cmFja2luZykgKi8KKwkiMCIgIio/P1wwIiAiYVwwIgorCSIxIiAiKj8/XDAiICJhYlwwIgorCSIxIiAiKj8/XDAiICJhYmNcMCIKKwkiMSIgIio/P1wwIiAiYWJjZFwwIgorCSIwIiAiPz8qXDAiICJhXDAiCisJIjEiICI/PypcMCIgImFiXDAiCisJIjEiICI/PypcMCIgImFiY1wwIgorCSIxIiAiPz8qXDAiICJhYmNkXDAiCisJIjAiICI/Kj9cMCIgImFcMCIKKwkiMSIgIj8qP1wwIiAiYWJcMCIKKwkiMSIgIj8qP1wwIiAiYWJjXDAiCisJIjEiICI/Kj9cMCIgImFiY2RcMCIKKwkiMSIgIipiXDAiICJiXDAiCisJIjEiICIqYlwwIiAiYWJcMCIKKwkiMCIgIipiXDAiICJiYVwwIgorCSIxIiAiKmJcMCIgImJiXDAiCisJIjEiICIqYlwwIiAiYWJiXDAiCisJIjEiICIqYlwwIiAiYmFiXDAiCisJIjEiICIqYmNcMCIgImFiYmNcMCIKKwkiMSIgIipiY1wwIiAiYmNcMCIKKwkiMSIgIipiY1wwIiAiYmJjXDAiCisJIjEiICIqYmNcMCIgImJjYmNcMCIKKwkvKiBNdWx0aXBsZSBhc3Rlcmlza3MgKGNvbXBsZXggYmFja3RyYWNraW5nKSAqLworCSIxIiAiKmFjKlwwIiAiYWJhY2FkYWVhZmFnXDAiCisJIjEiICIqYWMqYWUqYWcqXDAiICJhYmFjYWRhZWFmYWdcMCIKKwkiMSIgIiphKmIqW2JjXSpbZWZdKmcqXDAiICJhYmFjYWRhZWFmYWdcMCIKKwkiMCIgIiphKmIqW2VmXSpbY2RdKmcqXDAiICJhYmFjYWRhZWFmYWdcMCIKKwkiMSIgIiphYmNkKlwwIiAiYWJjYWJjYWJjYWJjZGVmZ1wwIgorCSIxIiAiKmFiKmNkKlwwIiAiYWJjYWJjYWJjYWJjZGVmZ1wwIgorCSIxIiAiKmFiY2QqYWJjZGVmKlwwIiAiYWJjYWJjZGFiY2RlYWJjZGVmZ1wwIgorCSIwIiAiKmFiY2QqXDAiICJhYmNhYmNhYmNhYmNlZmdcMCIKKwkiMCIgIiphYipjZCpcMCIgImFiY2FiY2FiY2FiY2VmZ1wwIjsKKworc3RhdGljIGludCBfX2luaXQgZ2xvYl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgc3VjY2Vzc2VzID0gMDsKKwl1bnNpZ25lZCBuID0gMDsKKwljaGFyIGNvbnN0ICpwID0gZ2xvYl90ZXN0czsKKwlzdGF0aWMgY2hhciBjb25zdCBtZXNzYWdlW10gX19pbml0Y29uc3QgPQorCQlLRVJOX0lORk8gImdsb2I6ICV1IHNlbGYtdGVzdHMgcGFzc2VkLCAldSBmYWlsZWRcbiI7CisKKwkvKgorCSAqIFRlc3RzIGFyZSBqYW1tZWQgdG9nZXRoZXIgaW4gYSBzdHJpbmcuICBUaGUgZmlyc3QgYnl0ZSBpcyAnMScKKwkgKiBvciAnMCcgdG8gaW5kaWNhdGUgdGhlIGV4cGVjdGVkIG91dGNvbWUsIG9yICdcMCcgdG8gaW5kaWNhdGUgdGhlCisJICogZW5kIG9mIHRoZSB0ZXN0cy4gIFRoZW4gY29tZSB0d28gbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3M6IHRoZQorCSAqIHBhdHRlcm4gYW5kIHRoZSBzdHJpbmcgdG8gbWF0Y2ggaXQgYWdhaW5zdC4KKwkgKi8KKwl3aGlsZSAoKnApIHsKKwkJYm9vbCBleHBlY3RlZCA9ICpwKysgJiAxOworCQljaGFyIGNvbnN0ICpwYXQgPSBwOworCisJCXAgKz0gc3RybGVuKHApICsgMTsKKwkJc3VjY2Vzc2VzICs9IHRlc3QocGF0LCBwLCBleHBlY3RlZCk7CisJCXAgKz0gc3RybGVuKHApICsgMTsKKwkJbisrOworCX0KKworCW4gLT0gc3VjY2Vzc2VzOworCXByaW50ayhtZXNzYWdlLCBzdWNjZXNzZXMsIG4pOworCisJLyogV2hhdCdzIHRoZSBlcnJubyBmb3IgImtlcm5lbCBidWcgZGV0ZWN0ZWQiPyAgR3Vlc3MuLi4gKi8KKwlyZXR1cm4gbiA/IC1FQ0FOQ0VMRUQgOiAwOworfQorCisvKiBXZSBuZWVkIGEgZHVtbXkgZXhpdCBmdW5jdGlvbiB0byBhbGxvdyB1bmxvYWQgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBnbG9iX2Zpbmkodm9pZCkgeyB9CisKK21vZHVsZV9pbml0KGdsb2JfaW5pdCk7Cittb2R1bGVfZXhpdChnbG9iX2ZpbmkpOworCitNT0RVTEVfREVTQ1JJUFRJT04oImdsb2IoNykgbWF0Y2hpbmcgdGVzdHMiKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIE1JVC9HUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2hleGR1bXAuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2hleGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWI3MGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaGV4ZHVtcC5jCkBAIC0wLDAgKzEsMjk4IEBACisvKgorICogbGliL2hleGR1bXAuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFNlZSBSRUFETUUgYW5kIENPUFlJTkcgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworY29uc3QgY2hhciBoZXhfYXNjW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CitFWFBPUlRfU1lNQk9MKGhleF9hc2MpOworY29uc3QgY2hhciBoZXhfYXNjX3VwcGVyW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CitFWFBPUlRfU1lNQk9MKGhleF9hc2NfdXBwZXIpOworCisvKioKKyAqIGhleF90b19iaW4gLSBjb252ZXJ0IGEgaGV4IGRpZ2l0IHRvIGl0cyByZWFsIHZhbHVlCisgKiBAY2g6IGFzY2lpIGNoYXJhY3RlciByZXByZXNlbnRzIGhleCBkaWdpdAorICoKKyAqIGhleF90b19iaW4oKSBjb252ZXJ0cyBvbmUgaGV4IGRpZ2l0IHRvIGl0cyBhY3R1YWwgdmFsdWUgb3IgLTEgaW4gY2FzZSBvZiBiYWQKKyAqIGlucHV0LgorICovCitpbnQgaGV4X3RvX2JpbihjaGFyIGNoKQoreworCWlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJcmV0dXJuIGNoIC0gJzAnOworCWNoID0gdG9sb3dlcihjaCk7CisJaWYgKChjaCA+PSAnYScpICYmIChjaCA8PSAnZicpKQorCQlyZXR1cm4gY2ggLSAnYScgKyAxMDsKKwlyZXR1cm4gLTE7Cit9CitFWFBPUlRfU1lNQk9MKGhleF90b19iaW4pOworCisvKioKKyAqIGhleDJiaW4gLSBjb252ZXJ0IGFuIGFzY2lpIGhleGFkZWNpbWFsIHN0cmluZyB0byBpdHMgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgKiBAZHN0OiBiaW5hcnkgcmVzdWx0CisgKiBAc3JjOiBhc2NpaSBoZXhhZGVjaW1hbCBzdHJpbmcKKyAqIEBjb3VudDogcmVzdWx0IGxlbmd0aAorICoKKyAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgaW4gY2FzZSBvZiBiYWQgaW5wdXQuCisgKi8KK2ludCBoZXgyYmluKHU4ICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGNvdW50KQoreworCXdoaWxlIChjb3VudC0tKSB7CisJCWludCBoaSA9IGhleF90b19iaW4oKnNyYysrKTsKKwkJaW50IGxvID0gaGV4X3RvX2Jpbigqc3JjKyspOworCisJCWlmICgoaGkgPCAwKSB8fCAobG8gPCAwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCSpkc3QrKyA9IChoaSA8PCA0KSB8IGxvOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaGV4MmJpbik7CisKKy8qKgorICogYmluMmhleCAtIGNvbnZlcnQgYmluYXJ5IGRhdGEgdG8gYW4gYXNjaWkgaGV4YWRlY2ltYWwgc3RyaW5nCisgKiBAZHN0OiBhc2NpaSBoZXhhZGVjaW1hbCByZXN1bHQKKyAqIEBzcmM6IGJpbmFyeSBkYXRhCisgKiBAY291bnQ6IGJpbmFyeSBkYXRhIGxlbmd0aAorICovCitjaGFyICpiaW4yaGV4KGNoYXIgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqX3NyYyA9IHNyYzsKKworCXdoaWxlIChjb3VudC0tKQorCQlkc3QgPSBoZXhfYnl0ZV9wYWNrKGRzdCwgKl9zcmMrKyk7CisJcmV0dXJuIGRzdDsKK30KK0VYUE9SVF9TWU1CT0woYmluMmhleCk7CisKKy8qKgorICogaGV4X2R1bXBfdG9fYnVmZmVyIC0gY29udmVydCBhIGJsb2Igb2YgZGF0YSB0byAiaGV4IEFTQ0lJIiBpbiBtZW1vcnkKKyAqIEBidWY6IGRhdGEgYmxvYiB0byBkdW1wCisgKiBAbGVuOiBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIEBidWYKKyAqIEByb3dzaXplOiBudW1iZXIgb2YgYnl0ZXMgdG8gcHJpbnQgcGVyIGxpbmU7IG11c3QgYmUgMTYgb3IgMzIKKyAqIEBncm91cHNpemU6IG51bWJlciBvZiBieXRlcyB0byBwcmludCBhdCBhIHRpbWUgKDEsIDIsIDQsIDg7IGRlZmF1bHQgPSAxKQorICogQGxpbmVidWY6IHdoZXJlIHRvIHB1dCB0aGUgY29udmVydGVkIGRhdGEKKyAqIEBsaW5lYnVmbGVuOiB0b3RhbCBzaXplIG9mIEBsaW5lYnVmLCBpbmNsdWRpbmcgc3BhY2UgZm9yIHRlcm1pbmF0aW5nIE5VTAorICogQGFzY2lpOiBpbmNsdWRlIEFTQ0lJIGFmdGVyIHRoZSBoZXggb3V0cHV0CisgKgorICogaGV4X2R1bXBfdG9fYnVmZmVyKCkgd29ya3Mgb24gb25lICJsaW5lIiBvZiBvdXRwdXQgYXQgYSB0aW1lLCBpLmUuLAorICogMTYgb3IgMzIgYnl0ZXMgb2YgaW5wdXQgZGF0YSBjb252ZXJ0ZWQgdG8gaGV4ICsgQVNDSUkgb3V0cHV0LgorICoKKyAqIEdpdmVuIGEgYnVmZmVyIG9mIHU4IGRhdGEsIGhleF9kdW1wX3RvX2J1ZmZlcigpIGNvbnZlcnRzIHRoZSBpbnB1dCBkYXRhCisgKiB0byBhIGhleCArIEFTQ0lJIGR1bXAgYXQgdGhlIHN1cHBsaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAqIFRoZSBjb252ZXJ0ZWQgb3V0cHV0IGlzIGFsd2F5cyBOVUwtdGVybWluYXRlZC4KKyAqCisgKiBFLmcuOgorICogICBoZXhfZHVtcF90b19idWZmZXIoZnJhbWUtPmRhdGEsIGZyYW1lLT5sZW4sIDE2LCAxLAorICoJCQlsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIHRydWUpOworICoKKyAqIGV4YW1wbGUgb3V0cHV0IGJ1ZmZlcjoKKyAqIDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDRhIDRiIDRjIDRkIDRlIDRmICBAQUJDREVGR0hJSktMTU5PCisgKgorICogUmV0dXJuOgorICogVGhlIGFtb3VudCBvZiBieXRlcyBwbGFjZWQgaW4gdGhlIGJ1ZmZlciB3aXRob3V0IHRlcm1pbmF0aW5nIE5VTC4gSWYgdGhlCisgKiBvdXRwdXQgd2FzIHRydW5jYXRlZCwgdGhlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIChleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTCkgd2hpY2ggd291bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8gdGhlIGZpbmFsCisgKiBzdHJpbmcgaWYgZW5vdWdoIHNwYWNlIGhhZCBiZWVuIGF2YWlsYWJsZS4KKyAqLworaW50IGhleF9kdW1wX3RvX2J1ZmZlcihjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCByb3dzaXplLCBpbnQgZ3JvdXBzaXplLAorCQkgICAgICAgY2hhciAqbGluZWJ1Ziwgc2l6ZV90IGxpbmVidWZsZW4sIGJvb2wgYXNjaWkpCit7CisJY29uc3QgdTggKnB0ciA9IGJ1ZjsKKwlpbnQgbmdyb3VwczsKKwl1OCBjaDsKKwlpbnQgaiwgbHggPSAwOworCWludCBhc2NpaV9jb2x1bW47CisJaW50IHJldDsKKworCWlmIChyb3dzaXplICE9IDE2ICYmIHJvd3NpemUgIT0gMzIpCisJCXJvd3NpemUgPSAxNjsKKworCWlmIChsZW4gPiByb3dzaXplKQkJLyogbGltaXQgdG8gb25lIGxpbmUgYXQgYSB0aW1lICovCisJCWxlbiA9IHJvd3NpemU7CisJaWYgKCFpc19wb3dlcl9vZl8yKGdyb3Vwc2l6ZSkgfHwgZ3JvdXBzaXplID4gOCkKKwkJZ3JvdXBzaXplID0gMTsKKwlpZiAoKGxlbiAlIGdyb3Vwc2l6ZSkgIT0gMCkJLyogbm8gbWl4ZWQgc2l6ZSBvdXRwdXQgKi8KKwkJZ3JvdXBzaXplID0gMTsKKworCW5ncm91cHMgPSBsZW4gLyBncm91cHNpemU7CisJYXNjaWlfY29sdW1uID0gcm93c2l6ZSAqIDIgKyByb3dzaXplIC8gZ3JvdXBzaXplICsgMTsKKworCWlmICghbGluZWJ1ZmxlbikKKwkJZ290byBvdmVyZmxvdzE7CisKKwlpZiAoIWxlbikKKwkJZ290byBuaWw7CisKKwlpZiAoZ3JvdXBzaXplID09IDgpIHsKKwkJY29uc3QgdTY0ICpwdHI4ID0gYnVmOworCisJCWZvciAoaiA9IDA7IGogPCBuZ3JvdXBzOyBqKyspIHsKKwkJCXJldCA9IHNucHJpbnRmKGxpbmVidWYgKyBseCwgbGluZWJ1ZmxlbiAtIGx4LAorCQkJCSAgICAgICAiJXMlMTYuMTZsbHgiLCBqID8gIiAiIDogIiIsCisJCQkJICAgICAgIGdldF91bmFsaWduZWQocHRyOCArIGopKTsKKwkJCWlmIChyZXQgPj0gbGluZWJ1ZmxlbiAtIGx4KQorCQkJCWdvdG8gb3ZlcmZsb3cxOworCQkJbHggKz0gcmV0OworCQl9CisJfSBlbHNlIGlmIChncm91cHNpemUgPT0gNCkgeworCQljb25zdCB1MzIgKnB0cjQgPSBidWY7CisKKwkJZm9yIChqID0gMDsgaiA8IG5ncm91cHM7IGorKykgeworCQkJcmV0ID0gc25wcmludGYobGluZWJ1ZiArIGx4LCBsaW5lYnVmbGVuIC0gbHgsCisJCQkJICAgICAgICIlcyU4Ljh4IiwgaiA/ICIgIiA6ICIiLAorCQkJCSAgICAgICBnZXRfdW5hbGlnbmVkKHB0cjQgKyBqKSk7CisJCQlpZiAocmV0ID49IGxpbmVidWZsZW4gLSBseCkKKwkJCQlnb3RvIG92ZXJmbG93MTsKKwkJCWx4ICs9IHJldDsKKwkJfQorCX0gZWxzZSBpZiAoZ3JvdXBzaXplID09IDIpIHsKKwkJY29uc3QgdTE2ICpwdHIyID0gYnVmOworCisJCWZvciAoaiA9IDA7IGogPCBuZ3JvdXBzOyBqKyspIHsKKwkJCXJldCA9IHNucHJpbnRmKGxpbmVidWYgKyBseCwgbGluZWJ1ZmxlbiAtIGx4LAorCQkJCSAgICAgICAiJXMlNC40eCIsIGogPyAiICIgOiAiIiwKKwkJCQkgICAgICAgZ2V0X3VuYWxpZ25lZChwdHIyICsgaikpOworCQkJaWYgKHJldCA+PSBsaW5lYnVmbGVuIC0gbHgpCisJCQkJZ290byBvdmVyZmxvdzE7CisJCQlseCArPSByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKwkJCWlmIChsaW5lYnVmbGVuIDwgbHggKyAyKQorCQkJCWdvdG8gb3ZlcmZsb3cyOworCQkJY2ggPSBwdHJbal07CisJCQlsaW5lYnVmW2x4KytdID0gaGV4X2FzY19oaShjaCk7CisJCQlpZiAobGluZWJ1ZmxlbiA8IGx4ICsgMikKKwkJCQlnb3RvIG92ZXJmbG93MjsKKwkJCWxpbmVidWZbbHgrK10gPSBoZXhfYXNjX2xvKGNoKTsKKwkJCWlmIChsaW5lYnVmbGVuIDwgbHggKyAyKQorCQkJCWdvdG8gb3ZlcmZsb3cyOworCQkJbGluZWJ1ZltseCsrXSA9ICcgJzsKKwkJfQorCQlpZiAoaikKKwkJCWx4LS07CisJfQorCWlmICghYXNjaWkpCisJCWdvdG8gbmlsOworCisJd2hpbGUgKGx4IDwgYXNjaWlfY29sdW1uKSB7CisJCWlmIChsaW5lYnVmbGVuIDwgbHggKyAyKQorCQkJZ290byBvdmVyZmxvdzI7CisJCWxpbmVidWZbbHgrK10gPSAnICc7CisJfQorCWZvciAoaiA9IDA7IGogPCBsZW47IGorKykgeworCQlpZiAobGluZWJ1ZmxlbiA8IGx4ICsgMikKKwkJCWdvdG8gb3ZlcmZsb3cyOworCQljaCA9IHB0cltqXTsKKwkJbGluZWJ1ZltseCsrXSA9IChpc2FzY2lpKGNoKSAmJiBpc3ByaW50KGNoKSkgPyBjaCA6ICcuJzsKKwl9CituaWw6CisJbGluZWJ1ZltseF0gPSAnXDAnOworCXJldHVybiBseDsKK292ZXJmbG93MjoKKwlsaW5lYnVmW2x4KytdID0gJ1wwJzsKK292ZXJmbG93MToKKwlyZXR1cm4gYXNjaWkgPyBhc2NpaV9jb2x1bW4gKyBsZW4gOiAoZ3JvdXBzaXplICogMiArIDEpICogbmdyb3VwcyAtIDE7Cit9CitFWFBPUlRfU1lNQk9MKGhleF9kdW1wX3RvX2J1ZmZlcik7CisKKyNpZmRlZiBDT05GSUdfUFJJTlRLCisvKioKKyAqIHByaW50X2hleF9kdW1wIC0gcHJpbnQgYSB0ZXh0IGhleCBkdW1wIHRvIHN5c2xvZyBmb3IgYSBiaW5hcnkgYmxvYiBvZiBkYXRhCisgKiBAbGV2ZWw6IGtlcm5lbCBsb2cgbGV2ZWwgKGUuZy4gS0VSTl9ERUJVRykKKyAqIEBwcmVmaXhfc3RyOiBzdHJpbmcgdG8gcHJlZml4IGVhY2ggbGluZSB3aXRoOworICogIGNhbGxlciBzdXBwbGllcyB0cmFpbGluZyBzcGFjZXMgZm9yIGFsaWdubWVudCBpZiBkZXNpcmVkCisgKiBAcHJlZml4X3R5cGU6IGNvbnRyb2xzIHdoZXRoZXIgcHJlZml4IG9mIGFuIG9mZnNldCwgYWRkcmVzcywgb3Igbm9uZQorICogIGlzIHByaW50ZWQgKCVEVU1QX1BSRUZJWF9PRkZTRVQsICVEVU1QX1BSRUZJWF9BRERSRVNTLCAlRFVNUF9QUkVGSVhfTk9ORSkKKyAqIEByb3dzaXplOiBudW1iZXIgb2YgYnl0ZXMgdG8gcHJpbnQgcGVyIGxpbmU7IG11c3QgYmUgMTYgb3IgMzIKKyAqIEBncm91cHNpemU6IG51bWJlciBvZiBieXRlcyB0byBwcmludCBhdCBhIHRpbWUgKDEsIDIsIDQsIDg7IGRlZmF1bHQgPSAxKQorICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgorICogQGFzY2lpOiBpbmNsdWRlIEFTQ0lJIGFmdGVyIHRoZSBoZXggb3V0cHV0CisgKgorICogR2l2ZW4gYSBidWZmZXIgb2YgdTggZGF0YSwgcHJpbnRfaGV4X2R1bXAoKSBwcmludHMgYSBoZXggKyBBU0NJSSBkdW1wCisgKiB0byB0aGUga2VybmVsIGxvZyBhdCB0aGUgc3BlY2lmaWVkIGtlcm5lbCBsb2cgbGV2ZWwsIHdpdGggYW4gb3B0aW9uYWwKKyAqIGxlYWRpbmcgcHJlZml4LgorICoKKyAqIHByaW50X2hleF9kdW1wKCkgd29ya3Mgb24gb25lICJsaW5lIiBvZiBvdXRwdXQgYXQgYSB0aW1lLCBpLmUuLAorICogMTYgb3IgMzIgYnl0ZXMgb2YgaW5wdXQgZGF0YSBjb252ZXJ0ZWQgdG8gaGV4ICsgQVNDSUkgb3V0cHV0LgorICogcHJpbnRfaGV4X2R1bXAoKSBpdGVyYXRlcyBvdmVyIHRoZSBlbnRpcmUgaW5wdXQgQGJ1ZiwgYnJlYWtpbmcgaXQgaW50bworICogImxpbmUgc2l6ZSIgY2h1bmtzIHRvIGZvcm1hdCBhbmQgcHJpbnQuCisgKgorICogRS5nLjoKKyAqICAgcHJpbnRfaGV4X2R1bXAoS0VSTl9ERUJVRywgInJhdyBkYXRhOiAiLCBEVU1QX1BSRUZJWF9BRERSRVNTLAorICoJCSAgICAxNiwgMSwgZnJhbWUtPmRhdGEsIGZyYW1lLT5sZW4sIHRydWUpOworICoKKyAqIEV4YW1wbGUgb3V0cHV0IHVzaW5nICVEVU1QX1BSRUZJWF9PRkZTRVQgYW5kIDEtYnl0ZSBtb2RlOgorICogMDAwOWFiNDI6IDQwIDQxIDQyIDQzIDQ0IDQ1IDQ2IDQ3IDQ4IDQ5IDRhIDRiIDRjIDRkIDRlIDRmICBAQUJDREVGR0hJSktMTU5PCisgKiBFeGFtcGxlIG91dHB1dCB1c2luZyAlRFVNUF9QUkVGSVhfQUREUkVTUyBhbmQgNC1ieXRlIG1vZGU6CisgKiBmZmZmZmZmZjg4MDg5YWYwOiA3MzcyNzE3MCA3Nzc2NzU3NCA3YjdhNzk3OCA3ZjdlN2Q3YyAgcHFyc3R1dnd4eXp7fH1+LgorICovCit2b2lkIHByaW50X2hleF9kdW1wKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpwcmVmaXhfc3RyLCBpbnQgcHJlZml4X3R5cGUsCisJCSAgICBpbnQgcm93c2l6ZSwgaW50IGdyb3Vwc2l6ZSwKKwkJICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBhc2NpaSkKK3sKKwljb25zdCB1OCAqcHRyID0gYnVmOworCWludCBpLCBsaW5lbGVuLCByZW1haW5pbmcgPSBsZW47CisJdW5zaWduZWQgY2hhciBsaW5lYnVmWzMyICogMyArIDIgKyAzMiArIDFdOworCisJaWYgKHJvd3NpemUgIT0gMTYgJiYgcm93c2l6ZSAhPSAzMikKKwkJcm93c2l6ZSA9IDE2OworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSByb3dzaXplKSB7CisJCWxpbmVsZW4gPSBtaW4ocmVtYWluaW5nLCByb3dzaXplKTsKKwkJcmVtYWluaW5nIC09IHJvd3NpemU7CisKKwkJaGV4X2R1bXBfdG9fYnVmZmVyKHB0ciArIGksIGxpbmVsZW4sIHJvd3NpemUsIGdyb3Vwc2l6ZSwKKwkJCQkgICBsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIGFzY2lpKTsKKworCQlzd2l0Y2ggKHByZWZpeF90eXBlKSB7CisJCWNhc2UgRFVNUF9QUkVGSVhfQUREUkVTUzoKKwkJCXByaW50aygiJXMlcyVwOiAlc1xuIiwKKwkJCSAgICAgICBsZXZlbCwgcHJlZml4X3N0ciwgcHRyICsgaSwgbGluZWJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSBEVU1QX1BSRUZJWF9PRkZTRVQ6CisJCQlwcmludGsoIiVzJXMlLjh4OiAlc1xuIiwgbGV2ZWwsIHByZWZpeF9zdHIsIGksIGxpbmVidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoIiVzJXMlc1xuIiwgbGV2ZWwsIHByZWZpeF9zdHIsIGxpbmVidWYpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MKHByaW50X2hleF9kdW1wKTsKKworI2lmICFkZWZpbmVkKENPTkZJR19EWU5BTUlDX0RFQlVHKQorLyoqCisgKiBwcmludF9oZXhfZHVtcF9ieXRlcyAtIHNob3J0aGFuZCBmb3JtIG9mIHByaW50X2hleF9kdW1wKCkgd2l0aCBkZWZhdWx0IHBhcmFtcworICogQHByZWZpeF9zdHI6IHN0cmluZyB0byBwcmVmaXggZWFjaCBsaW5lIHdpdGg7CisgKiAgY2FsbGVyIHN1cHBsaWVzIHRyYWlsaW5nIHNwYWNlcyBmb3IgYWxpZ25tZW50IGlmIGRlc2lyZWQKKyAqIEBwcmVmaXhfdHlwZTogY29udHJvbHMgd2hldGhlciBwcmVmaXggb2YgYW4gb2Zmc2V0LCBhZGRyZXNzLCBvciBub25lCisgKiAgaXMgcHJpbnRlZCAoJURVTVBfUFJFRklYX09GRlNFVCwgJURVTVBfUFJFRklYX0FERFJFU1MsICVEVU1QX1BSRUZJWF9OT05FKQorICogQGJ1ZjogZGF0YSBibG9iIHRvIGR1bXAKKyAqIEBsZW46IG51bWJlciBvZiBieXRlcyBpbiB0aGUgQGJ1ZgorICoKKyAqIENhbGxzIHByaW50X2hleF9kdW1wKCksIHdpdGggbG9nIGxldmVsIG9mIEtFUk5fREVCVUcsCisgKiByb3dzaXplIG9mIDE2LCBncm91cHNpemUgb2YgMSwgYW5kIEFTQ0lJIG91dHB1dCBpbmNsdWRlZC4KKyAqLwordm9pZCBwcmludF9oZXhfZHVtcF9ieXRlcyhjb25zdCBjaGFyICpwcmVmaXhfc3RyLCBpbnQgcHJlZml4X3R5cGUsCisJCQkgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBwcmVmaXhfc3RyLCBwcmVmaXhfdHlwZSwgMTYsIDEsCisJCSAgICAgICBidWYsIGxlbiwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHByaW50X2hleF9kdW1wX2J5dGVzKTsKKyNlbmRpZiAvKiAhZGVmaW5lZChDT05GSUdfRFlOQU1JQ19ERUJVRykgKi8KKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUklOVEspICovCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9od2VpZ2h0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9od2VpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2MGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2h3ZWlnaHQuYwpAQCAtMCwwICsxLDcyIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorCisvKioKKyAqIGh3ZWlnaHROIC0gcmV0dXJucyB0aGUgaGFtbWluZyB3ZWlnaHQgb2YgYSBOLWJpdCB3b3JkCisgKiBAeDogdGhlIHdvcmQgdG8gd2VpZ2gKKyAqCisgKiBUaGUgSGFtbWluZyBXZWlnaHQgb2YgYSBudW1iZXIgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIHNldCBpbiBpdC4KKyAqLworCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NXX0hXRUlHSFQKK3Vuc2lnbmVkIGludCBfX3N3X2h3ZWlnaHQzMih1bnNpZ25lZCBpbnQgdykKK3sKKyNpZmRlZiBDT05GSUdfQVJDSF9IQVNfRkFTVF9NVUxUSVBMSUVSCisJdyAtPSAodyA+PiAxKSAmIDB4NTU1NTU1NTU7CisJdyA9ICAodyAmIDB4MzMzMzMzMzMpICsgKCh3ID4+IDIpICYgMHgzMzMzMzMzMyk7CisJdyA9ICAodyArICh3ID4+IDQpKSAmIDB4MGYwZjBmMGY7CisJcmV0dXJuICh3ICogMHgwMTAxMDEwMSkgPj4gMjQ7CisjZWxzZQorCXVuc2lnbmVkIGludCByZXMgPSB3IC0gKCh3ID4+IDEpICYgMHg1NTU1NTU1NSk7CisJcmVzID0gKHJlcyAmIDB4MzMzMzMzMzMpICsgKChyZXMgPj4gMikgJiAweDMzMzMzMzMzKTsKKwlyZXMgPSAocmVzICsgKHJlcyA+PiA0KSkgJiAweDBGMEYwRjBGOworCXJlcyA9IHJlcyArIChyZXMgPj4gOCk7CisJcmV0dXJuIChyZXMgKyAocmVzID4+IDE2KSkgJiAweDAwMDAwMEZGOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKF9fc3dfaHdlaWdodDMyKTsKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgX19zd19od2VpZ2h0MTYodW5zaWduZWQgaW50IHcpCit7CisJdW5zaWduZWQgaW50IHJlcyA9IHcgLSAoKHcgPj4gMSkgJiAweDU1NTUpOworCXJlcyA9IChyZXMgJiAweDMzMzMpICsgKChyZXMgPj4gMikgJiAweDMzMzMpOworCXJlcyA9IChyZXMgKyAocmVzID4+IDQpKSAmIDB4MEYwRjsKKwlyZXR1cm4gKHJlcyArIChyZXMgPj4gOCkpICYgMHgwMEZGOworfQorRVhQT1JUX1NZTUJPTChfX3N3X2h3ZWlnaHQxNik7CisKK3Vuc2lnbmVkIGludCBfX3N3X2h3ZWlnaHQ4KHVuc2lnbmVkIGludCB3KQoreworCXVuc2lnbmVkIGludCByZXMgPSB3IC0gKCh3ID4+IDEpICYgMHg1NSk7CisJcmVzID0gKHJlcyAmIDB4MzMpICsgKChyZXMgPj4gMikgJiAweDMzKTsKKwlyZXR1cm4gKHJlcyArIChyZXMgPj4gNCkpICYgMHgwRjsKK30KK0VYUE9SVF9TWU1CT0woX19zd19od2VpZ2h0OCk7CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1dfSFdFSUdIVAordW5zaWduZWQgbG9uZyBfX3N3X2h3ZWlnaHQ2NChfX3U2NCB3KQoreworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwlyZXR1cm4gX19zd19od2VpZ2h0MzIoKHVuc2lnbmVkIGludCkodyA+PiAzMikpICsKKwkgICAgICAgX19zd19od2VpZ2h0MzIoKHVuc2lnbmVkIGludCl3KTsKKyNlbGlmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyNpZmRlZiBDT05GSUdfQVJDSF9IQVNfRkFTVF9NVUxUSVBMSUVSCisJdyAtPSAodyA+PiAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NXVsOworCXcgPSAgKHcgJiAweDMzMzMzMzMzMzMzMzMzMzN1bCkgKyAoKHcgPj4gMikgJiAweDMzMzMzMzMzMzMzMzMzMzN1bCk7CisJdyA9ICAodyArICh3ID4+IDQpKSAmIDB4MGYwZjBmMGYwZjBmMGYwZnVsOworCXJldHVybiAodyAqIDB4MDEwMTAxMDEwMTAxMDEwMXVsKSA+PiA1NjsKKyNlbHNlCisJX191NjQgcmVzID0gdyAtICgodyA+PiAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NXVsKTsKKwlyZXMgPSAocmVzICYgMHgzMzMzMzMzMzMzMzMzMzMzdWwpICsgKChyZXMgPj4gMikgJiAweDMzMzMzMzMzMzMzMzMzMzN1bCk7CisJcmVzID0gKHJlcyArIChyZXMgPj4gNCkpICYgMHgwRjBGMEYwRjBGMEYwRjBGdWw7CisJcmVzID0gcmVzICsgKHJlcyA+PiA4KTsKKwlyZXMgPSByZXMgKyAocmVzID4+IDE2KTsKKwlyZXR1cm4gKHJlcyArIChyZXMgPj4gMzIpKSAmIDB4MDAwMDAwMDAwMDAwMDBGRnVsOworI2VuZGlmCisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0woX19zd19od2VpZ2h0NjQpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pZHIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lkci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMWE5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pZHIuYwpAQCAtMCwwICsxLDUwNiBAQAorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3QgaWRhX2JpdG1hcCAqLCBpZGFfYml0bWFwKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2ltcGxlX2lkYV9sb2NrKTsKKworaW50IGlkcl9hbGxvY19jbW4oc3RydWN0IGlkciAqaWRyLCB2b2lkICpwdHIsIHVuc2lnbmVkIGxvbmcgKmluZGV4LAorCQkgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kLCBnZnBfdCBnZnAsCisJCSAgYm9vbCBleHQpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXZvaWQgX19yY3UgKipzbG90OworCisJaWYgKFdBUk5fT05fT05DRShyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUocHRyKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmFkaXhfdHJlZV9pdGVyX2luaXQoJml0ZXIsIHN0YXJ0KTsKKwlpZiAoZXh0KQorCQlzbG90ID0gaWRyX2dldF9mcmVlX2V4dCgmaWRyLT5pZHJfcnQsICZpdGVyLCBnZnAsIGVuZCk7CisJZWxzZQorCQlzbG90ID0gaWRyX2dldF9mcmVlKCZpZHItPmlkcl9ydCwgJml0ZXIsIGdmcCwgZW5kKTsKKwlpZiAoSVNfRVJSKHNsb3QpKQorCQlyZXR1cm4gUFRSX0VSUihzbG90KTsKKworCXJhZGl4X3RyZWVfaXRlcl9yZXBsYWNlKCZpZHItPmlkcl9ydCwgJml0ZXIsIHNsb3QsIHB0cik7CisJcmFkaXhfdHJlZV9pdGVyX3RhZ19jbGVhcigmaWRyLT5pZHJfcnQsICZpdGVyLCBJRFJfRlJFRSk7CisKKwlpZiAoaW5kZXgpCisJCSppbmRleCA9IGl0ZXIuaW5kZXg7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpZHJfYWxsb2NfY21uKTsKKworLyoqCisgKiBpZHJfYWxsb2NfY3ljbGljIC0gYWxsb2NhdGUgbmV3IGlkciBlbnRyeSBpbiBhIGN5Y2xpY2FsIGZhc2hpb24KKyAqIEBpZHI6IGlkciBoYW5kbGUKKyAqIEBwdHI6IHBvaW50ZXIgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXcgaWQKKyAqIEBzdGFydDogdGhlIG1pbmltdW0gaWQgKGluY2x1c2l2ZSkKKyAqIEBlbmQ6IHRoZSBtYXhpbXVtIGlkIChleGNsdXNpdmUpCisgKiBAZ2ZwOiBtZW1vcnkgYWxsb2NhdGlvbiBmbGFncworICoKKyAqIEFsbG9jYXRlcyBhbiBJRCBsYXJnZXIgdGhhbiB0aGUgbGFzdCBJRCBhbGxvY2F0ZWQgaWYgb25lIGlzIGF2YWlsYWJsZS4KKyAqIElmIG5vdCwgaXQgd2lsbCBhdHRlbXB0IHRvIGFsbG9jYXRlIHRoZSBzbWFsbGVzdCBJRCB0aGF0IGlzIGxhcmdlciBvcgorICogZXF1YWwgdG8gQHN0YXJ0LgorICovCitpbnQgaWRyX2FsbG9jX2N5Y2xpYyhzdHJ1Y3QgaWRyICppZHIsIHZvaWQgKnB0ciwgaW50IHN0YXJ0LCBpbnQgZW5kLCBnZnBfdCBnZnApCit7CisJaW50IGlkLCBjdXJyID0gaWRyLT5pZHJfbmV4dDsKKworCWlmIChjdXJyIDwgc3RhcnQpCisJCWN1cnIgPSBzdGFydDsKKworCWlkID0gaWRyX2FsbG9jKGlkciwgcHRyLCBjdXJyLCBlbmQsIGdmcCk7CisJaWYgKChpZCA9PSAtRU5PU1BDKSAmJiAoY3VyciA+IHN0YXJ0KSkKKwkJaWQgPSBpZHJfYWxsb2MoaWRyLCBwdHIsIHN0YXJ0LCBjdXJyLCBnZnApOworCisJaWYgKGlkID49IDApCisJCWlkci0+aWRyX25leHQgPSBpZCArIDFVOworCisJcmV0dXJuIGlkOworfQorRVhQT1JUX1NZTUJPTChpZHJfYWxsb2NfY3ljbGljKTsKKworLyoqCisgKiBpZHJfZm9yX2VhY2ggLSBpdGVyYXRlIHRocm91Z2ggYWxsIHN0b3JlZCBwb2ludGVycworICogQGlkcjogaWRyIGhhbmRsZQorICogQGZuOiBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZm9yIGVhY2ggcG9pbnRlcgorICogQGRhdGE6IGRhdGEgcGFzc2VkIHRvIGNhbGxiYWNrIGZ1bmN0aW9uCisgKgorICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGVudHJ5IGluIEBpZHIsIHBhc3NpbmcKKyAqIHRoZSBpZCwgdGhlIHBvaW50ZXIgYW5kIHRoZSBkYXRhIHBvaW50ZXIgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24uCisgKgorICogSWYgQGZuIHJldHVybnMgYW55dGhpbmcgb3RoZXIgdGhhbiAlMCwgdGhlIGl0ZXJhdGlvbiBzdG9wcyBhbmQgdGhhdAorICogdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIGlkcl9mb3JfZWFjaCgpIGNhbiBiZSBjYWxsZWQgY29uY3VycmVudGx5IHdpdGggaWRyX2FsbG9jKCkgYW5kCisgKiBpZHJfcmVtb3ZlKCkgaWYgcHJvdGVjdGVkIGJ5IFJDVS4gIE5ld2x5IGFkZGVkIGVudHJpZXMgbWF5IG5vdCBiZQorICogc2VlbiBhbmQgZGVsZXRlZCBlbnRyaWVzIG1heSBiZSBzZWVuLCBidXQgYWRkaW5nIGFuZCByZW1vdmluZyBlbnRyaWVzCisgKiB3aWxsIG5vdCBjYXVzZSBvdGhlciBlbnRyaWVzIHRvIGJlIHNraXBwZWQsIG5vciBzcHVyaW91cyBvbmVzIHRvIGJlIHNlZW4uCisgKi8KK2ludCBpZHJfZm9yX2VhY2goY29uc3Qgc3RydWN0IGlkciAqaWRyLAorCQlpbnQgKCpmbikoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9pdGVyIGl0ZXI7CisJdm9pZCBfX3JjdSAqKnNsb3Q7CisKKwlyYWRpeF90cmVlX2Zvcl9lYWNoX3Nsb3Qoc2xvdCwgJmlkci0+aWRyX3J0LCAmaXRlciwgMCkgeworCQlpbnQgcmV0ID0gZm4oaXRlci5pbmRleCwgcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2xvdCksIGRhdGEpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWRyX2Zvcl9lYWNoKTsKKworLyoqCisgKiBpZHJfZ2V0X25leHQgLSBGaW5kIG5leHQgcG9wdWxhdGVkIGVudHJ5CisgKiBAaWRyOiBpZHIgaGFuZGxlCisgKiBAbmV4dGlkOiBQb2ludGVyIHRvIGxvd2VzdCBwb3NzaWJsZSBJRCB0byByZXR1cm4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXh0IHBvcHVsYXRlZCBlbnRyeSBpbiB0aGUgdHJlZSB3aXRoIGFuIElEIGdyZWF0ZXIgdGhhbgorICogb3IgZXF1YWwgdG8gdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgQG5leHRpZC4gIE9uIGV4aXQsIEBuZXh0aWQgaXMgdXBkYXRlZAorICogdG8gdGhlIElEIG9mIHRoZSBmb3VuZCB2YWx1ZS4gIFRvIHVzZSBpbiBhIGxvb3AsIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5CisgKiBuZXh0aWQgbXVzdCBiZSBpbmNyZW1lbnRlZCBieSB0aGUgdXNlci4KKyAqLwordm9pZCAqaWRyX2dldF9uZXh0KHN0cnVjdCBpZHIgKmlkciwgaW50ICpuZXh0aWQpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXZvaWQgX19yY3UgKipzbG90OworCXZvaWQgKmVudHJ5ID0gTlVMTDsKKworCXJhZGl4X3RyZWVfZm9yX2VhY2hfc2xvdChzbG90LCAmaWRyLT5pZHJfcnQsICZpdGVyLCAqbmV4dGlkKSB7CisJCWVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2xvdCk7CisJCWlmICghZW50cnkpCisJCQljb250aW51ZTsKKwkJaWYgKCFyYWRpeF90cmVlX2RlcmVmX3JldHJ5KGVudHJ5KSkKKwkJCWJyZWFrOworCQlpZiAoc2xvdCAhPSAodm9pZCAqKSZpZHItPmlkcl9ydC5ybm9kZSAmJgorCQkJCWVudHJ5ICE9ICh2b2lkICopUkFESVhfVFJFRV9JTlRFUk5BTF9OT0RFKQorCQkJYnJlYWs7CisJCXNsb3QgPSByYWRpeF90cmVlX2l0ZXJfcmV0cnkoJml0ZXIpOworCX0KKwlpZiAoIXNsb3QpCisJCXJldHVybiBOVUxMOworCisJaWYgKFdBUk5fT05fT05DRShpdGVyLmluZGV4ID4gSU5UX01BWCkpCisJCXJldHVybiBOVUxMOworCisJKm5leHRpZCA9IGl0ZXIuaW5kZXg7CisJcmV0dXJuIGVudHJ5OworfQorRVhQT1JUX1NZTUJPTChpZHJfZ2V0X25leHQpOworCit2b2lkICppZHJfZ2V0X25leHRfZXh0KHN0cnVjdCBpZHIgKmlkciwgdW5zaWduZWQgbG9uZyAqbmV4dGlkKQoreworCXN0cnVjdCByYWRpeF90cmVlX2l0ZXIgaXRlcjsKKwl2b2lkIF9fcmN1ICoqc2xvdDsKKworCXNsb3QgPSByYWRpeF90cmVlX2l0ZXJfZmluZCgmaWRyLT5pZHJfcnQsICZpdGVyLCAqbmV4dGlkKTsKKwlpZiAoIXNsb3QpCisJCXJldHVybiBOVUxMOworCisJKm5leHRpZCA9IGl0ZXIuaW5kZXg7CisJcmV0dXJuIHJjdV9kZXJlZmVyZW5jZV9yYXcoKnNsb3QpOworfQorRVhQT1JUX1NZTUJPTChpZHJfZ2V0X25leHRfZXh0KTsKKworLyoqCisgKiBpZHJfcmVwbGFjZSAtIHJlcGxhY2UgcG9pbnRlciBmb3IgZ2l2ZW4gaWQKKyAqIEBpZHI6IGlkciBoYW5kbGUKKyAqIEBwdHI6IE5ldyBwb2ludGVyIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBJRAorICogQGlkOiBMb29rdXAga2V5CisgKgorICogUmVwbGFjZSB0aGUgcG9pbnRlciByZWdpc3RlcmVkIHdpdGggYW4gSUQgYW5kIHJldHVybiB0aGUgb2xkIHZhbHVlLgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHVuZGVyIHRoZSBSQ1UgcmVhZCBsb2NrIGNvbmN1cnJlbnRseSB3aXRoCisgKiBpZHJfYWxsb2MoKSBhbmQgaWRyX3JlbW92ZSgpIChhcyBsb25nIGFzIHRoZSBJRCBiZWluZyByZW1vdmVkIGlzIG5vdAorICogdGhlIG9uZSBiZWluZyByZXBsYWNlZCEpLgorICoKKyAqIFJldHVybnM6IHRoZSBvbGQgdmFsdWUgb24gc3VjY2Vzcy4gICUtRU5PRU5UIGluZGljYXRlcyB0aGF0IEBpZCB3YXMgbm90CisgKiBmb3VuZC4gICUtRUlOVkFMIGluZGljYXRlcyB0aGF0IEBpZCBvciBAcHRyIHdlcmUgbm90IHZhbGlkLgorICovCit2b2lkICppZHJfcmVwbGFjZShzdHJ1Y3QgaWRyICppZHIsIHZvaWQgKnB0ciwgaW50IGlkKQoreworCWlmIChpZCA8IDApCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJcmV0dXJuIGlkcl9yZXBsYWNlX2V4dChpZHIsIHB0ciwgaWQpOworfQorRVhQT1JUX1NZTUJPTChpZHJfcmVwbGFjZSk7CisKK3ZvaWQgKmlkcl9yZXBsYWNlX2V4dChzdHJ1Y3QgaWRyICppZHIsIHZvaWQgKnB0ciwgdW5zaWduZWQgbG9uZyBpZCkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOworCXZvaWQgX19yY3UgKipzbG90ID0gTlVMTDsKKwl2b2lkICplbnRyeTsKKworCWlmIChXQVJOX09OX09OQ0UocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKHB0cikpKQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCWVudHJ5ID0gX19yYWRpeF90cmVlX2xvb2t1cCgmaWRyLT5pZHJfcnQsIGlkLCAmbm9kZSwgJnNsb3QpOworCWlmICghc2xvdCB8fCByYWRpeF90cmVlX3RhZ19nZXQoJmlkci0+aWRyX3J0LCBpZCwgSURSX0ZSRUUpKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKworCV9fcmFkaXhfdHJlZV9yZXBsYWNlKCZpZHItPmlkcl9ydCwgbm9kZSwgc2xvdCwgcHRyLCBOVUxMLCBOVUxMKTsKKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0woaWRyX3JlcGxhY2VfZXh0KTsKKworLyoqCisgKiBET0M6IElEQSBkZXNjcmlwdGlvbgorICoKKyAqIFRoZSBJREEgaXMgYW4gSUQgYWxsb2NhdG9yIHdoaWNoIGRvZXMgbm90IHByb3ZpZGUgdGhlIGFiaWxpdHkgdG8KKyAqIGFzc29jaWF0ZSBhbiBJRCB3aXRoIGEgcG9pbnRlci4gIEFzIHN1Y2gsIGl0IG9ubHkgbmVlZHMgdG8gc3RvcmUgb25lCisgKiBiaXQgcGVyIElELCBhbmQgc28gaXMgbW9yZSBzcGFjZSBlZmZpY2llbnQgdGhhbiBhbiBJRFIuICBUbyB1c2UgYW4gSURBLAorICogZGVmaW5lIGl0IHVzaW5nIERFRklORV9JREEoKSAob3IgZW1iZWQgYSAmc3RydWN0IGlkYSBpbiBhIGRhdGEgc3RydWN0dXJlLAorICogdGhlbiBpbml0aWFsaXNlIGl0IHVzaW5nIGlkYV9pbml0KCkpLiAgVG8gYWxsb2NhdGUgYSBuZXcgSUQsIGNhbGwKKyAqIGlkYV9zaW1wbGVfZ2V0KCkuICBUbyBmcmVlIGFuIElELCBjYWxsIGlkYV9zaW1wbGVfcmVtb3ZlKCkuCisgKgorICogSWYgeW91IGhhdmUgbW9yZSBjb21wbGV4IGxvY2tpbmcgcmVxdWlyZW1lbnRzLCB1c2UgYSBsb29wIGFyb3VuZAorICogaWRhX3ByZV9nZXQoKSBhbmQgaWRhX2dldF9uZXcoKSB0byBhbGxvY2F0ZSBhIG5ldyBJRC4gIFRoZW4gdXNlCisgKiBpZGFfcmVtb3ZlKCkgdG8gZnJlZSBhbiBJRC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IGlkYV9nZXRfbmV3KCkgYW5kCisgKiBpZGFfcmVtb3ZlKCkgY2Fubm90IGJlIGNhbGxlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIGVhY2ggb3RoZXIgZm9yIHRoZQorICogc2FtZSBJREEuCisgKgorICogWW91IGNhbiBhbHNvIHVzZSBpZGFfZ2V0X25ld19hYm92ZSgpIGlmIHlvdSBuZWVkIGFuIElEIHRvIGJlIGFsbG9jYXRlZAorICogYWJvdmUgYSBwYXJ0aWN1bGFyIG51bWJlci4gIGlkYV9kZXN0cm95KCkgY2FuIGJlIHVzZWQgdG8gZGlzcG9zZSBvZiBhbgorICogSURBIHdpdGhvdXQgbmVlZGluZyB0byBmcmVlIHRoZSBpbmRpdmlkdWFsIElEcyBpbiBpdC4gIFlvdSBjYW4gdXNlCisgKiBpZGFfaXNfZW1wdHkoKSB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBJREEgaGFzIGFueSBJRHMgY3VycmVudGx5IGFsbG9jYXRlZC4KKyAqCisgKiBJRHMgYXJlIGN1cnJlbnRseSBsaW1pdGVkIHRvIHRoZSByYW5nZSBbMC1JTlRfTUFYXS4gIElmIHRoaXMgaXMgYW4gYXdrd2FyZAorICogbGltaXRhdGlvbiwgaXQgc2hvdWxkIGJlIHF1aXRlIHN0cmFpZ2h0Zm9yd2FyZCB0byByYWlzZSB0aGUgbWF4aW11bS4KKyAqLworCisvKgorICogRGV2ZWxvcGVyJ3Mgbm90ZXM6CisgKgorICogVGhlIElEQSB1c2VzIHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZSBJRFIgJiByYWRpeCB0cmVlIHRvIHN0b3JlCisgKiBiaXRtYXBzIGluIGVhY2ggZW50cnkuICBUaGUgSURSX0ZSRUUgdGFnIG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBiaXQKKyAqIGZyZWUsIHVubGlrZSB0aGUgSURSIHdoZXJlIGl0IG1lYW5zIGF0IGxlYXN0IG9uZSBlbnRyeSBpcyBmcmVlLgorICoKKyAqIEkgY29uc2lkZXJlZCB0ZWxsaW5nIHRoZSByYWRpeCB0cmVlIHRoYXQgZWFjaCBzbG90IGlzIGFuIG9yZGVyLTEwIG5vZGUKKyAqIGFuZCBzdG9yaW5nIHRoZSBiaXQgbnVtYmVycyBpbiB0aGUgcmFkaXggdHJlZSwgYnV0IHRoZSByYWRpeCB0cmVlIGNhbid0CisgKiBhbGxvdyBhIHNpbmdsZSBtdWx0aW9yZGVyIGVudHJ5IGF0IGluZGV4IDAsIHdoaWNoIHdvdWxkIHNpZ25pZmljYW50bHkKKyAqIGluY3JlYXNlIG1lbW9yeSBjb25zdW1wdGlvbiBmb3IgdGhlIElEQS4gIFNvIGluc3RlYWQgd2UgZGl2aWRlIHRoZSBpbmRleAorICogYnkgdGhlIG51bWJlciBvZiBiaXRzIGluIHRoZSBsZWFmIGJpdG1hcCBiZWZvcmUgZG9pbmcgYSByYWRpeCB0cmVlIGxvb2t1cC4KKyAqCisgKiBBcyBhbiBvcHRpbWlzYXRpb24sIGlmIHRoZXJlIGFyZSBvbmx5IGEgZmV3IGxvdyBiaXRzIHNldCBpbiBhbnkgZ2l2ZW4KKyAqIGxlYWYsIGluc3RlYWQgb2YgYWxsb2NhdGluZyBhIDEyOC1ieXRlIGJpdG1hcCwgd2UgdXNlIHRoZSAnZXhjZXB0aW9uYWwKKyAqIGVudHJ5JyBmdW5jdGlvbmFsaXR5IG9mIHRoZSByYWRpeCB0cmVlIHRvIHN0b3JlIEJJVFNfUEVSX0xPTkcgLSAyIGJpdHMKKyAqIGRpcmVjdGx5IGluIHRoZSBlbnRyeS4gIEJ5IGJlaW5nIHJlYWxseSB0cmlja3N5LCB3ZSBjb3VsZCBzdG9yZQorICogQklUU19QRVJfTE9ORyAtIDEgYml0cywgYnV0IHRoZXJlJ3JlIGRpbWluaXNoaW5nIHJldHVybnMgYWZ0ZXIgb3B0aW1pc2luZworICogZm9yIDAtMyBhbGxvY2F0ZWQgSURzLgorICoKKyAqIFdlIGFsbG93IHRoZSByYWRpeCB0cmVlICdleGNlcHRpb25hbCcgY291bnQgdG8gZ2V0IG91dCBvZiBkYXRlLiAgTm90aGluZworICogaW4gdGhlIElEQSBub3IgdGhlIHJhZGl4IHRyZWUgY29kZSBjaGVja3MgaXQuICBJZiBpdCBiZWNvbWVzIGltcG9ydGFudAorICogdG8gbWFpbnRhaW4gYW4gYWNjdXJhdGUgZXhjZXB0aW9uYWwgY291bnQsIHN3aXRjaCB0aGUgcmN1X2Fzc2lnbl9wb2ludGVyKCkKKyAqIGNhbGxzIHRvIHJhZGl4X3RyZWVfaXRlcl9yZXBsYWNlKCkgd2hpY2ggd2lsbCBjb3JyZWN0IHRoZSBleGNlcHRpb25hbAorICogY291bnQuCisgKgorICogVGhlIElEQSBhbHdheXMgcmVxdWlyZXMgYSBsb2NrIHRvIGFsbG9jL2ZyZWUuICBJZiB3ZSBhZGQgYSAndGVzdF9iaXQnCisgKiBlcXVpdmFsZW50LCBpdCB3aWxsIHN0aWxsIG5lZWQgbG9ja2luZy4gIEdvaW5nIHRvIFJDVSBsb29rdXAgd291bGQgcmVxdWlyZQorICogdXNpbmcgUkNVIHRvIGZyZWUgYml0bWFwcywgYW5kIHRoYXQncyBub3QgdHJpdmlhbCB3aXRob3V0IGVtYmVkZGluZyBhbgorICogUkNVIGhlYWQgaW4gdGhlIGJpdG1hcCwgd2hpY2ggYWRkcyBhIDItcG9pbnRlciBvdmVyaGVhZCB0byBlYWNoIDEyOC1ieXRlCisgKiBiaXRtYXAsIHdoaWNoIGlzIGV4Y2Vzc2l2ZS4KKyAqLworCisjZGVmaW5lIElEQV9NQVggKDB4ODAwMDAwMDBVIC8gSURBX0JJVE1BUF9CSVRTKQorCisvKioKKyAqIGlkYV9nZXRfbmV3X2Fib3ZlIC0gYWxsb2NhdGUgbmV3IElEIGFib3ZlIG9yIGVxdWFsIHRvIGEgc3RhcnQgaWQKKyAqIEBpZGE6IGlkYSBoYW5kbGUKKyAqIEBzdGFydDogaWQgdG8gc3RhcnQgc2VhcmNoIGF0CisgKiBAaWQ6IHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBoYW5kbGUKKyAqCisgKiBBbGxvY2F0ZSBuZXcgSUQgYWJvdmUgb3IgZXF1YWwgdG8gQHN0YXJ0LiAgSXQgc2hvdWxkIGJlIGNhbGxlZAorICogd2l0aCBhbnkgcmVxdWlyZWQgbG9ja3MgdG8gZW5zdXJlIHRoYXQgY29uY3VycmVudCBjYWxscyB0bworICogaWRhX2dldF9uZXdfYWJvdmUoKSAvIGlkYV9nZXRfbmV3KCkgLyBpZGFfcmVtb3ZlKCkgYXJlIG5vdCBhbGxvd2VkLgorICogQ29uc2lkZXIgdXNpbmcgaWRhX3NpbXBsZV9nZXQoKSBpZiB5b3UgZG8gbm90IGhhdmUgY29tcGxleCBsb2NraW5nCisgKiByZXF1aXJlbWVudHMuCisgKgorICogSWYgbWVtb3J5IGlzIHJlcXVpcmVkLCBpdCB3aWxsIHJldHVybiAlLUVBR0FJTiwgeW91IHNob3VsZCB1bmxvY2sKKyAqIGFuZCBnbyBiYWNrIHRvIHRoZSBpZGFfcHJlX2dldCgpIGNhbGwuICBJZiB0aGUgaWRhIGlzIGZ1bGwsIGl0IHdpbGwKKyAqIHJldHVybiAlLUVOT1NQQy4gIE9uIHN1Y2Nlc3MsIGl0IHdpbGwgcmV0dXJuIDAuCisgKgorICogQGlkIHJldHVybnMgYSB2YWx1ZSBpbiB0aGUgcmFuZ2UgQHN0YXJ0IC4uLiAlMHg3ZmZmZmZmZi4KKyAqLworaW50IGlkYV9nZXRfbmV3X2Fib3ZlKHN0cnVjdCBpZGEgKmlkYSwgaW50IHN0YXJ0LCBpbnQgKmlkKQoreworCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QgPSAmaWRhLT5pZGFfcnQ7CisJdm9pZCBfX3JjdSAqKnNsb3Q7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXN0cnVjdCBpZGFfYml0bWFwICpiaXRtYXA7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKKwl1bnNpZ25lZCBiaXQsIGViaXQ7CisJaW50IG5ldzsKKworCWluZGV4ID0gc3RhcnQgLyBJREFfQklUTUFQX0JJVFM7CisJYml0ID0gc3RhcnQgJSBJREFfQklUTUFQX0JJVFM7CisJZWJpdCA9IGJpdCArIFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQ7CisKKwlzbG90ID0gcmFkaXhfdHJlZV9pdGVyX2luaXQoJml0ZXIsIGluZGV4KTsKKwlmb3IgKDs7KSB7CisJCWlmIChzbG90KQorCQkJc2xvdCA9IHJhZGl4X3RyZWVfbmV4dF9zbG90KHNsb3QsICZpdGVyLAorCQkJCQkJUkFESVhfVFJFRV9JVEVSX1RBR0dFRCk7CisJCWlmICghc2xvdCkgeworCQkJc2xvdCA9IGlkcl9nZXRfZnJlZShyb290LCAmaXRlciwgR0ZQX05PV0FJVCwgSURBX01BWCk7CisJCQlpZiAoSVNfRVJSKHNsb3QpKSB7CisJCQkJaWYgKHNsb3QgPT0gRVJSX1BUUigtRU5PTUVNKSkKKwkJCQkJcmV0dXJuIC1FQUdBSU47CisJCQkJcmV0dXJuIFBUUl9FUlIoc2xvdCk7CisJCQl9CisJCX0KKwkJaWYgKGl0ZXIuaW5kZXggPiBpbmRleCkgeworCQkJYml0ID0gMDsKKwkJCWViaXQgPSBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZUOworCQl9CisJCW5ldyA9IGl0ZXIuaW5kZXggKiBJREFfQklUTUFQX0JJVFM7CisJCWJpdG1hcCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoKnNsb3QpOworCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb24oYml0bWFwKSkgeworCQkJdW5zaWduZWQgbG9uZyB0bXAgPSAodW5zaWduZWQgbG9uZyliaXRtYXA7CisJCQllYml0ID0gZmluZF9uZXh0X3plcm9fYml0KCZ0bXAsIEJJVFNfUEVSX0xPTkcsIGViaXQpOworCQkJaWYgKGViaXQgPCBCSVRTX1BFUl9MT05HKSB7CisJCQkJdG1wIHw9IDFVTCA8PCBlYml0OworCQkJCXJjdV9hc3NpZ25fcG9pbnRlcigqc2xvdCwgKHZvaWQgKil0bXApOworCQkJCSppZCA9IG5ldyArIGViaXQgLSBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZUOworCQkJCXJldHVybiAwOworCQkJfQorCQkJYml0bWFwID0gdGhpc19jcHVfeGNoZyhpZGFfYml0bWFwLCBOVUxMKTsKKwkJCWlmICghYml0bWFwKQorCQkJCXJldHVybiAtRUFHQUlOOworCQkJbWVtc2V0KGJpdG1hcCwgMCwgc2l6ZW9mKCpiaXRtYXApKTsKKwkJCWJpdG1hcC0+Yml0bWFwWzBdID0gdG1wID4+IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQ7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoKnNsb3QsIGJpdG1hcCk7CisJCX0KKworCQlpZiAoYml0bWFwKSB7CisJCQliaXQgPSBmaW5kX25leHRfemVyb19iaXQoYml0bWFwLT5iaXRtYXAsCisJCQkJCQkJSURBX0JJVE1BUF9CSVRTLCBiaXQpOworCQkJbmV3ICs9IGJpdDsKKwkJCWlmIChuZXcgPCAwKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJaWYgKGJpdCA9PSBJREFfQklUTUFQX0JJVFMpCisJCQkJY29udGludWU7CisKKwkJCV9fc2V0X2JpdChiaXQsIGJpdG1hcC0+Yml0bWFwKTsKKwkJCWlmIChiaXRtYXBfZnVsbChiaXRtYXAtPmJpdG1hcCwgSURBX0JJVE1BUF9CSVRTKSkKKwkJCQlyYWRpeF90cmVlX2l0ZXJfdGFnX2NsZWFyKHJvb3QsICZpdGVyLAorCQkJCQkJCQlJRFJfRlJFRSk7CisJCX0gZWxzZSB7CisJCQluZXcgKz0gYml0OworCQkJaWYgKG5ldyA8IDApCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlpZiAoZWJpdCA8IEJJVFNfUEVSX0xPTkcpIHsKKwkJCQliaXRtYXAgPSAodm9pZCAqKSgoMVVMIDw8IGViaXQpIHwKKwkJCQkJCVJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkpOworCQkJCXJhZGl4X3RyZWVfaXRlcl9yZXBsYWNlKHJvb3QsICZpdGVyLCBzbG90LAorCQkJCQkJYml0bWFwKTsKKwkJCQkqaWQgPSBuZXc7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQliaXRtYXAgPSB0aGlzX2NwdV94Y2hnKGlkYV9iaXRtYXAsIE5VTEwpOworCQkJaWYgKCFiaXRtYXApCisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQltZW1zZXQoYml0bWFwLCAwLCBzaXplb2YoKmJpdG1hcCkpOworCQkJX19zZXRfYml0KGJpdCwgYml0bWFwLT5iaXRtYXApOworCQkJcmFkaXhfdHJlZV9pdGVyX3JlcGxhY2Uocm9vdCwgJml0ZXIsIHNsb3QsIGJpdG1hcCk7CisJCX0KKworCQkqaWQgPSBuZXc7CisJCXJldHVybiAwOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWRhX2dldF9uZXdfYWJvdmUpOworCisvKioKKyAqIGlkYV9yZW1vdmUgLSBGcmVlIHRoZSBnaXZlbiBJRAorICogQGlkYTogaWRhIGhhbmRsZQorICogQGlkOiBJRCB0byBmcmVlCisgKgorICogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIGlkYV9nZXRfbmV3X2Fib3ZlKCkuCisgKi8KK3ZvaWQgaWRhX3JlbW92ZShzdHJ1Y3QgaWRhICppZGEsIGludCBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4ID0gaWQgLyBJREFfQklUTUFQX0JJVFM7CisJdW5zaWduZWQgb2Zmc2V0ID0gaWQgJSBJREFfQklUTUFQX0JJVFM7CisJc3RydWN0IGlkYV9iaXRtYXAgKmJpdG1hcDsKKwl1bnNpZ25lZCBsb25nICpidG1wOworCXN0cnVjdCByYWRpeF90cmVlX2l0ZXIgaXRlcjsKKwl2b2lkIF9fcmN1ICoqc2xvdDsKKworCXNsb3QgPSByYWRpeF90cmVlX2l0ZXJfbG9va3VwKCZpZGEtPmlkYV9ydCwgJml0ZXIsIGluZGV4KTsKKwlpZiAoIXNsb3QpCisJCWdvdG8gZXJyOworCisJYml0bWFwID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2xvdCk7CisJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uKGJpdG1hcCkpIHsKKwkJYnRtcCA9ICh1bnNpZ25lZCBsb25nICopc2xvdDsKKwkJb2Zmc2V0ICs9IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQ7CisJCWlmIChvZmZzZXQgPj0gQklUU19QRVJfTE9ORykKKwkJCWdvdG8gZXJyOworCX0gZWxzZSB7CisJCWJ0bXAgPSBiaXRtYXAtPmJpdG1hcDsKKwl9CisJaWYgKCF0ZXN0X2JpdChvZmZzZXQsIGJ0bXApKQorCQlnb3RvIGVycjsKKworCV9fY2xlYXJfYml0KG9mZnNldCwgYnRtcCk7CisJcmFkaXhfdHJlZV9pdGVyX3RhZ19zZXQoJmlkYS0+aWRhX3J0LCAmaXRlciwgSURSX0ZSRUUpOworCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihiaXRtYXApKSB7CisJCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KCpzbG90KSA9PQorCQkJCQkodm9pZCAqKVJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkpCisJCQlyYWRpeF90cmVlX2l0ZXJfZGVsZXRlKCZpZGEtPmlkYV9ydCwgJml0ZXIsIHNsb3QpOworCX0gZWxzZSBpZiAoYml0bWFwX2VtcHR5KGJ0bXAsIElEQV9CSVRNQVBfQklUUykpIHsKKwkJa2ZyZWUoYml0bWFwKTsKKwkJcmFkaXhfdHJlZV9pdGVyX2RlbGV0ZSgmaWRhLT5pZGFfcnQsICZpdGVyLCBzbG90KTsKKwl9CisJcmV0dXJuOworIGVycjoKKwlXQVJOKDEsICJpZGFfcmVtb3ZlIGNhbGxlZCBmb3IgaWQ9JWQgd2hpY2ggaXMgbm90IGFsbG9jYXRlZC5cbiIsIGlkKTsKK30KK0VYUE9SVF9TWU1CT0woaWRhX3JlbW92ZSk7CisKKy8qKgorICogaWRhX2Rlc3Ryb3kgLSBGcmVlIHRoZSBjb250ZW50cyBvZiBhbiBpZGEKKyAqIEBpZGE6IGlkYSBoYW5kbGUKKyAqCisgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gcmVsZWFzZXMgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYW4gSURBLiAgV2hlbgorICogdGhpcyBjYWxsIHJldHVybnMsIHRoZSBJREEgaXMgZW1wdHkgYW5kIGNhbiBiZSByZXVzZWQgb3IgZnJlZWQuICBUaGUgY2FsbGVyCisgKiBzaG91bGQgbm90IGFsbG93IGlkYV9yZW1vdmUoKSBvciBpZGFfZ2V0X25ld19hYm92ZSgpIHRvIGJlIGNhbGxlZCBhdCB0aGUKKyAqIHNhbWUgdGltZS4KKyAqLwordm9pZCBpZGFfZGVzdHJveShzdHJ1Y3QgaWRhICppZGEpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXZvaWQgX19yY3UgKipzbG90OworCisJcmFkaXhfdHJlZV9mb3JfZWFjaF9zbG90KHNsb3QsICZpZGEtPmlkYV9ydCwgJml0ZXIsIDApIHsKKwkJc3RydWN0IGlkYV9iaXRtYXAgKmJpdG1hcCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoKnNsb3QpOworCQlpZiAoIXJhZGl4X3RyZWVfZXhjZXB0aW9uKGJpdG1hcCkpCisJCQlrZnJlZShiaXRtYXApOworCQlyYWRpeF90cmVlX2l0ZXJfZGVsZXRlKCZpZGEtPmlkYV9ydCwgJml0ZXIsIHNsb3QpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWRhX2Rlc3Ryb3kpOworCisvKioKKyAqIGlkYV9zaW1wbGVfZ2V0IC0gZ2V0IGEgbmV3IGlkLgorICogQGlkYTogdGhlIChpbml0aWFsaXplZCkgaWRhLgorICogQHN0YXJ0OiB0aGUgbWluaW11bSBpZCAoaW5jbHVzaXZlLCA8IDB4ODAwMDAwMCkKKyAqIEBlbmQ6IHRoZSBtYXhpbXVtIGlkIChleGNsdXNpdmUsIDwgMHg4MDAwMDAwIG9yIDApCisgKiBAZ2ZwX21hc2s6IG1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKgorICogQWxsb2NhdGVzIGFuIGlkIGluIHRoZSByYW5nZSBzdGFydCA8PSBpZCA8IGVuZCwgb3IgcmV0dXJucyAtRU5PU1BDLgorICogT24gbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSwgcmV0dXJucyAtRU5PTUVNLgorICoKKyAqIENvbXBhcmVkIHRvIGlkYV9nZXRfbmV3X2Fib3ZlKCkgdGhpcyBmdW5jdGlvbiBkb2VzIGl0cyBvd24gbG9ja2luZywgYW5kCisgKiBzaG91bGQgYmUgdXNlZCB1bmxlc3MgdGhlcmUgYXJlIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgorICoKKyAqIFVzZSBpZGFfc2ltcGxlX3JlbW92ZSgpIHRvIGdldCByaWQgb2YgYW4gaWQuCisgKi8KK2ludCBpZGFfc2ltcGxlX2dldChzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCwKKwkJICAgZ2ZwX3QgZ2ZwX21hc2spCit7CisJaW50IHJldCwgaWQ7CisJdW5zaWduZWQgaW50IG1heDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQlVHX09OKChpbnQpc3RhcnQgPCAwKTsKKwlCVUdfT04oKGludCllbmQgPCAwKTsKKworCWlmIChlbmQgPT0gMCkKKwkJbWF4ID0gMHg4MDAwMDAwMDsKKwllbHNlIHsKKwkJQlVHX09OKGVuZCA8IHN0YXJ0KTsKKwkJbWF4ID0gZW5kIC0gMTsKKwl9CisKK2FnYWluOgorCWlmICghaWRhX3ByZV9nZXQoaWRhLCBnZnBfbWFzaykpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNpbXBsZV9pZGFfbG9jaywgZmxhZ3MpOworCXJldCA9IGlkYV9nZXRfbmV3X2Fib3ZlKGlkYSwgc3RhcnQsICZpZCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKGlkID4gbWF4KSB7CisJCQlpZGFfcmVtb3ZlKGlkYSwgaWQpOworCQkJcmV0ID0gLUVOT1NQQzsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGlkOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNpbXBsZV9pZGFfbG9jaywgZmxhZ3MpOworCisJaWYgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlkYV9zaW1wbGVfZ2V0KTsKKworLyoqCisgKiBpZGFfc2ltcGxlX3JlbW92ZSAtIHJlbW92ZSBhbiBhbGxvY2F0ZWQgaWQuCisgKiBAaWRhOiB0aGUgKGluaXRpYWxpemVkKSBpZGEuCisgKiBAaWQ6IHRoZSBpZCByZXR1cm5lZCBieSBpZGFfc2ltcGxlX2dldC4KKyAqCisgKiBVc2UgdG8gcmVsZWFzZSBhbiBpZCBhbGxvY2F0ZWQgd2l0aCBpZGFfc2ltcGxlX2dldCgpLgorICoKKyAqIENvbXBhcmVkIHRvIGlkYV9yZW1vdmUoKSB0aGlzIGZ1bmN0aW9uIGRvZXMgaXRzIG93biBsb2NraW5nLCBhbmQgc2hvdWxkIGJlCisgKiB1c2VkIHVubGVzcyB0aGVyZSBhcmUgc3BlY2lhbCByZXF1aXJlbWVudHMuCisgKi8KK3ZvaWQgaWRhX3NpbXBsZV9yZW1vdmUoc3RydWN0IGlkYSAqaWRhLCB1bnNpZ25lZCBpbnQgaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUJVR19PTigoaW50KWlkIDwgMCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnNpbXBsZV9pZGFfbG9jaywgZmxhZ3MpOworCWlkYV9yZW1vdmUoaWRhLCBpZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ltcGxlX2lkYV9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlkYV9zaW1wbGVfcmVtb3ZlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2luZmxhdGUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2luZmxhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmFmMDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW5mbGF0ZS5jCkBAIC0wLDAgKzEsMTMxMCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyNkZWZpbmUgREVCRyh4KQorI2RlZmluZSBERUJHMSh4KQorLyogaW5mbGF0ZS5jIC0tIE5vdCBjb3B5cmlnaHRlZCAxOTkyIGJ5IE1hcmsgQWRsZXIKKyAgIHZlcnNpb24gYzEwcDEsIDEwIEphbnVhcnkgMTk5MyAqLworCisvKiAKKyAqIEFkYXB0ZWQgZm9yIGJvb3RpbmcgTGludXggYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzCisgKiBiYXNlZCBvbiBnemlwLTEuMC4zIAorICoKKyAqIE5pY29sYXMgUGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+LCAxOTk5LzA0LzE0IDoKKyAqICAgTGl0dGxlIG1vZHMgZm9yIGFsbCB2YXJpYWJsZSB0byByZXNpZGUgZWl0aGVyIGludG8gcm9kYXRhIG9yIGJzcyBzZWdtZW50cworICogICBieSBtYXJraW5nIGNvbnN0YW50IHZhcmlhYmxlcyB3aXRoICdjb25zdCcgYW5kIGluaXRpYWxpemluZyBhbGwgdGhlIG90aGVycworICogICBhdCBydW4tdGltZSBvbmx5LiAgVGhpcyBhbGxvd3MgZm9yIHRoZSBrZXJuZWwgdW5jb21wcmVzc29yIHRvIHJ1bgorICogICBkaXJlY3RseSBmcm9tIEZsYXNoIG9yIFJPTSBtZW1vcnkgb24gZW1iZWRkZWQgc3lzdGVtcy4KKyAqLworCisvKgorICAgSW5mbGF0ZSBkZWZsYXRlZCAoUEtaSVAncyBtZXRob2QgOCBjb21wcmVzc2VkKSBkYXRhLiAgVGhlIGNvbXByZXNzaW9uCisgICBtZXRob2Qgc2VhcmNoZXMgZm9yIGFzIG11Y2ggb2YgdGhlIGN1cnJlbnQgc3RyaW5nIG9mIGJ5dGVzICh1cCB0byBhCisgICBsZW5ndGggb2YgMjU4KSBpbiB0aGUgcHJldmlvdXMgMzIgSyBieXRlcy4gIElmIGl0IGRvZXNuJ3QgZmluZCBhbnkKKyAgIG1hdGNoZXMgKG9mIGF0IGxlYXN0IGxlbmd0aCAzKSwgaXQgY29kZXMgdGhlIG5leHQgYnl0ZS4gIE90aGVyd2lzZSwgaXQKKyAgIGNvZGVzIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgc3RyaW5nIGFuZCBpdHMgZGlzdGFuY2UgYmFja3dhcmRzIGZyb20KKyAgIHRoZSBjdXJyZW50IHBvc2l0aW9uLiAgVGhlcmUgaXMgYSBzaW5nbGUgSHVmZm1hbiBjb2RlIHRoYXQgY29kZXMgYm90aAorICAgc2luZ2xlIGJ5dGVzIChjYWxsZWQgImxpdGVyYWxzIikgYW5kIG1hdGNoIGxlbmd0aHMuICBBIHNlY29uZCBIdWZmbWFuCisgICBjb2RlIGNvZGVzIHRoZSBkaXN0YW5jZSBpbmZvcm1hdGlvbiwgd2hpY2ggZm9sbG93cyBhIGxlbmd0aCBjb2RlLiAgRWFjaAorICAgbGVuZ3RoIG9yIGRpc3RhbmNlIGNvZGUgYWN0dWFsbHkgcmVwcmVzZW50cyBhIGJhc2UgdmFsdWUgYW5kIGEgbnVtYmVyCisgICBvZiAiZXh0cmEiIChzb21ldGltZXMgemVybykgYml0cyB0byBnZXQgdG8gYWRkIHRvIHRoZSBiYXNlIHZhbHVlLiAgQXQKKyAgIHRoZSBlbmQgb2YgZWFjaCBkZWZsYXRlZCBibG9jayBpcyBhIHNwZWNpYWwgZW5kLW9mLWJsb2NrIChFT0IpIGxpdGVyYWwvCisgICBsZW5ndGggY29kZS4gIFRoZSBkZWNvZGluZyBwcm9jZXNzIGlzIGJhc2ljYWxseTogZ2V0IGEgbGl0ZXJhbC9sZW5ndGgKKyAgIGNvZGU7IGlmIEVPQiB0aGVuIGRvbmU7IGlmIGEgbGl0ZXJhbCwgZW1pdCB0aGUgZGVjb2RlZCBieXRlOyBpZiBhCisgICBsZW5ndGggdGhlbiBnZXQgdGhlIGRpc3RhbmNlIGFuZCBlbWl0IHRoZSByZWZlcnJlZC10byBieXRlcyBmcm9tIHRoZQorICAgc2xpZGluZyB3aW5kb3cgb2YgcHJldmlvdXNseSBlbWl0dGVkIGRhdGEuCisKKyAgIFRoZXJlIGFyZSAoY3VycmVudGx5KSB0aHJlZSBraW5kcyBvZiBpbmZsYXRlIGJsb2Nrczogc3RvcmVkLCBmaXhlZCwgYW5kCisgICBkeW5hbWljLiAgVGhlIGNvbXByZXNzb3IgZGVhbHMgd2l0aCBzb21lIGNodW5rIG9mIGRhdGEgYXQgYSB0aW1lLCBhbmQKKyAgIGRlY2lkZXMgd2hpY2ggbWV0aG9kIHRvIHVzZSBvbiBhIGNodW5rLWJ5LWNodW5rIGJhc2lzLiAgQSBjaHVuayBtaWdodAorICAgdHlwaWNhbGx5IGJlIDMyIEsgb3IgNjQgSy4gIElmIHRoZSBjaHVuayBpcyBpbmNvbXByZXNzaWJsZSwgdGhlbiB0aGUKKyAgICJzdG9yZWQiIG1ldGhvZCBpcyB1c2VkLiAgSW4gdGhpcyBjYXNlLCB0aGUgYnl0ZXMgYXJlIHNpbXBseSBzdG9yZWQgYXMKKyAgIGlzLCBlaWdodCBiaXRzIHBlciBieXRlLCB3aXRoIG5vbmUgb2YgdGhlIGFib3ZlIGNvZGluZy4gIFRoZSBieXRlcyBhcmUKKyAgIHByZWNlZGVkIGJ5IGEgY291bnQsIHNpbmNlIHRoZXJlIGlzIG5vIGxvbmdlciBhbiBFT0IgY29kZS4KKworICAgSWYgdGhlIGRhdGEgaXMgY29tcHJlc3NpYmxlLCB0aGVuIGVpdGhlciB0aGUgZml4ZWQgb3IgZHluYW1pYyBtZXRob2RzCisgICBhcmUgdXNlZC4gIEluIHRoZSBkeW5hbWljIG1ldGhvZCwgdGhlIGNvbXByZXNzZWQgZGF0YSBpcyBwcmVjZWRlZCBieQorICAgYW4gZW5jb2Rpbmcgb2YgdGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBIdWZmbWFuIGNvZGVzIHRoYXQgYXJlCisgICB0byBiZSB1c2VkIHRvIGRlY29kZSB0aGlzIGJsb2NrLiAgVGhlIHJlcHJlc2VudGF0aW9uIGlzIGl0c2VsZiBIdWZmbWFuCisgICBjb2RlZCwgYW5kIHNvIGlzIHByZWNlZGVkIGJ5IGEgZGVzY3JpcHRpb24gb2YgdGhhdCBjb2RlLiAgVGhlc2UgY29kZQorICAgZGVzY3JpcHRpb25zIHRha2UgdXAgYSBsaXR0bGUgc3BhY2UsIGFuZCBzbyBmb3Igc21hbGwgYmxvY2tzLCB0aGVyZSBpcworICAgYSBwcmVkZWZpbmVkIHNldCBvZiBjb2RlcywgY2FsbGVkIHRoZSBmaXhlZCBjb2Rlcy4gIFRoZSBmaXhlZCBtZXRob2QgaXMKKyAgIHVzZWQgaWYgdGhlIGJsb2NrIGNvZGVzIHVwIHNtYWxsZXIgdGhhdCB3YXkgKHVzdWFsbHkgZm9yIHF1aXRlIHNtYWxsCisgICBjaHVua3MpLCBvdGhlcndpc2UgdGhlIGR5bmFtaWMgbWV0aG9kIGlzIHVzZWQuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQorICAgY29kZXMgYXJlIGN1c3RvbWl6ZWQgdG8gdGhlIHByb2JhYmlsaXRpZXMgaW4gdGhlIGN1cnJlbnQgYmxvY2ssIGFuZCBzbworICAgY2FuIGNvZGUgaXQgbXVjaCBiZXR0ZXIgdGhhbiB0aGUgcHJlLWRldGVybWluZWQgZml4ZWQgY29kZXMuCisgCisgICBUaGUgSHVmZm1hbiBjb2RlcyB0aGVtc2VsdmVzIGFyZSBkZWNvZGVkIHVzaW5nIGEgbXVsdGktbGV2ZWwgdGFibGUKKyAgIGxvb2t1cCwgaW4gb3JkZXIgdG8gbWF4aW1pemUgdGhlIHNwZWVkIG9mIGRlY29kaW5nIHBsdXMgdGhlIHNwZWVkIG9mCisgICBidWlsZGluZyB0aGUgZGVjb2RpbmcgdGFibGVzLiAgU2VlIHRoZSBjb21tZW50cyBiZWxvdyB0aGF0IHByZWNlZGUgdGhlCisgICBsYml0cyBhbmQgZGJpdHMgdHVuaW5nIHBhcmFtZXRlcnMuCisgKi8KKworCisvKgorICAgTm90ZXMgYmV5b25kIHRoZSAxLjkzYSBhcHBub3RlLnR4dDoKKworICAgMS4gRGlzdGFuY2UgcG9pbnRlcnMgbmV2ZXIgcG9pbnQgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG91dHB1dAorICAgICAgc3RyZWFtLgorICAgMi4gRGlzdGFuY2UgcG9pbnRlcnMgY2FuIHBvaW50IGJhY2sgYWNyb3NzIGJsb2NrcywgdXAgdG8gMzJrIGF3YXkuCisgICAzLiBUaGVyZSBpcyBhbiBpbXBsaWVkIG1heGltdW0gb2YgNyBiaXRzIGZvciB0aGUgYml0IGxlbmd0aCB0YWJsZSBhbmQKKyAgICAgIDE1IGJpdHMgZm9yIHRoZSBhY3R1YWwgZGF0YS4KKyAgIDQuIElmIG9ubHkgb25lIGNvZGUgZXhpc3RzLCB0aGVuIGl0IGlzIGVuY29kZWQgdXNpbmcgb25lIGJpdC4gIChaZXJvCisgICAgICB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwgYnV0IHBlcmhhcHMgYSBsaXR0bGUgY29uZnVzaW5nLikgIElmIHR3bworICAgICAgY29kZXMgZXhpc3QsIHRoZXkgYXJlIGNvZGVkIHVzaW5nIG9uZSBiaXQgZWFjaCAoMCBhbmQgMSkuCisgICA1LiBUaGVyZSBpcyBubyB3YXkgb2Ygc2VuZGluZyB6ZXJvIGRpc3RhbmNlIGNvZGVzLS1hIGR1bW15IG11c3QgYmUKKyAgICAgIHNlbnQgaWYgdGhlcmUgYXJlIG5vbmUuICAoSGlzdG9yeTogYSBwcmUgMi4wIHZlcnNpb24gb2YgUEtaSVAgd291bGQKKyAgICAgIHN0b3JlIGJsb2NrcyB3aXRoIG5vIGRpc3RhbmNlIGNvZGVzLCBidXQgdGhpcyB3YXMgZGlzY292ZXJlZCB0byBiZQorICAgICAgdG9vIGhhcnNoIGEgY3JpdGVyaW9uLikgIFZhbGlkIG9ubHkgZm9yIDEuOTNhLiAgMi4wNGMgZG9lcyBhbGxvdworICAgICAgemVybyBkaXN0YW5jZSBjb2Rlcywgd2hpY2ggaXMgc2VudCBhcyBvbmUgY29kZSBvZiB6ZXJvIGJpdHMgaW4KKyAgICAgIGxlbmd0aC4KKyAgIDYuIFRoZXJlIGFyZSB1cCB0byAyODYgbGl0ZXJhbC9sZW5ndGggY29kZXMuICBDb2RlIDI1NiByZXByZXNlbnRzIHRoZQorICAgICAgZW5kLW9mLWJsb2NrLiAgTm90ZSBob3dldmVyIHRoYXQgdGhlIHN0YXRpYyBsZW5ndGggdHJlZSBkZWZpbmVzCisgICAgICAyODggY29kZXMganVzdCB0byBmaWxsIG91dCB0aGUgSHVmZm1hbiBjb2Rlcy4gIENvZGVzIDI4NiBhbmQgMjg3CisgICAgICBjYW5ub3QgYmUgdXNlZCB0aG91Z2gsIHNpbmNlIHRoZXJlIGlzIG5vIGxlbmd0aCBiYXNlIG9yIGV4dHJhIGJpdHMKKyAgICAgIGRlZmluZWQgZm9yIHRoZW0uICBTaW1pbGFybHksIHRoZXJlIGFyZSB1cCB0byAzMCBkaXN0YW5jZSBjb2Rlcy4KKyAgICAgIEhvd2V2ZXIsIHN0YXRpYyB0cmVlcyBkZWZpbmUgMzIgY29kZXMgKGFsbCA1IGJpdHMpIHRvIGZpbGwgb3V0IHRoZQorICAgICAgSHVmZm1hbiBjb2RlcywgYnV0IHRoZSBsYXN0IHR3byBoYWQgYmV0dGVyIG5vdCBzaG93IHVwIGluIHRoZSBkYXRhLgorICAgNy4gVW56aXAgY2FuIGNoZWNrIGR5bmFtaWMgSHVmZm1hbiBibG9ja3MgZm9yIGNvbXBsZXRlIGNvZGUgc2V0cy4KKyAgICAgIFRoZSBleGNlcHRpb24gaXMgdGhhdCBhIHNpbmdsZSBjb2RlIHdvdWxkIG5vdCBiZSBjb21wbGV0ZSAoc2VlICM0KS4KKyAgIDguIFRoZSBmaXZlIGJpdHMgZm9sbG93aW5nIHRoZSBibG9jayB0eXBlIGlzIHJlYWxseSB0aGUgbnVtYmVyIG9mCisgICAgICBsaXRlcmFsIGNvZGVzIHNlbnQgbWludXMgMjU3LgorICAgOS4gTGVuZ3RoIGNvZGVzIDgsMTYsMTYgYXJlIGludGVycHJldGVkIGFzIDEzIGxlbmd0aCBjb2RlcyBvZiA4IGJpdHMKKyAgICAgICgxKzYrNikuICBUaGVyZWZvcmUsIHRvIG91dHB1dCB0aHJlZSB0aW1lcyB0aGUgbGVuZ3RoLCB5b3Ugb3V0cHV0CisgICAgICB0aHJlZSBjb2RlcyAoMSsxKzEpLCB3aGVyZWFzIHRvIG91dHB1dCBmb3VyIHRpbWVzIHRoZSBzYW1lIGxlbmd0aCwKKyAgICAgIHlvdSBvbmx5IG5lZWQgdHdvIGNvZGVzICgxKzMpLiAgSG1tLgorICAxMC4gSW4gdGhlIHRyZWUgcmVjb25zdHJ1Y3Rpb24gYWxnb3JpdGhtLCBDb2RlID0gQ29kZSArIEluY3JlbWVudAorICAgICAgb25seSBpZiBCaXRMZW5ndGgoaSkgaXMgbm90IHplcm8uICAoUHJldHR5IG9idmlvdXMuKQorICAxMS4gQ29ycmVjdGlvbjogNCBCaXRzOiAjIG9mIEJpdCBMZW5ndGggY29kZXMgLSA0ICAgICAoNCAtIDE5KQorICAxMi4gTm90ZTogbGVuZ3RoIGNvZGUgMjg0IGNhbiByZXByZXNlbnQgMjI3LTI1OCwgYnV0IGxlbmd0aCBjb2RlIDI4NQorICAgICAgcmVhbGx5IGlzIDI1OC4gIFRoZSBsYXN0IGxlbmd0aCBkZXNlcnZlcyBpdHMgb3duLCBzaG9ydCBjb2RlCisgICAgICBzaW5jZSBpdCBnZXRzIHVzZWQgYSBsb3QgaW4gdmVyeSByZWR1bmRhbnQgZmlsZXMuICBUaGUgbGVuZ3RoCisgICAgICAyNTggaXMgc3BlY2lhbCBzaW5jZSAyNTggLSAzICh0aGUgbWluIG1hdGNoIGxlbmd0aCkgaXMgMjU1LgorICAxMy4gVGhlIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlIGJpdCBsZW5ndGhzIGFyZSByZWFkIGFzIGEKKyAgICAgIHNpbmdsZSBzdHJlYW0gb2YgbGVuZ3Rocy4gIEl0IGlzIHBvc3NpYmxlIChhbmQgYWR2YW50YWdlb3VzKSBmb3IKKyAgICAgIGEgcmVwZWF0IGNvZGUgKDE2LCAxNywgb3IgMTgpIHRvIGdvIGFjcm9zcyB0aGUgYm91bmRhcnkgYmV0d2VlbgorICAgICAgdGhlIHR3byBzZXRzIG9mIGxlbmd0aHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2lmZGVmIE5PX0lORkxBVEVfTUFMTE9DCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2VuZGlmCisKKyNpZmRlZiBSQ1NJRAorc3RhdGljIGNoYXIgcmNzaWRbXSA9ICIjSWQ6IGluZmxhdGUuYyx2IDAuMTQgMTk5My8wNi8xMCAxMzoyNzowNCBqbG91cCBFeHAgIyI7CisjZW5kaWYKKworI2lmbmRlZiBTVEFUSUMKKworI2lmIGRlZmluZWQoU1REQ19IRUFERVJTKSB8fCBkZWZpbmVkKEhBVkVfU1RETElCX0gpCisjICBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyMgIGluY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJnemlwLmgiCisjZGVmaW5lIFNUQVRJQworI2VuZGlmIC8qICFTVEFUSUMgKi8KKworI2lmbmRlZiBJTklUCisjZGVmaW5lIElOSVQKKyNlbmRpZgorCQorI2RlZmluZSBzbGlkZSB3aW5kb3cKKworLyogSHVmZm1hbiBjb2RlIGxvb2t1cCB0YWJsZSBlbnRyeS0tdGhpcyBlbnRyeSBpcyBmb3VyIGJ5dGVzIGZvciBtYWNoaW5lcworICAgdGhhdCBoYXZlIDE2LWJpdCBwb2ludGVycyAoZS5nLiBQQydzIGluIHRoZSBzbWFsbCBvciBtZWRpdW0gbW9kZWwpLgorICAgVmFsaWQgZXh0cmEgYml0cyBhcmUgMC4uMTMuICBlID09IDE1IGlzIEVPQiAoZW5kIG9mIGJsb2NrKSwgZSA9PSAxNgorICAgbWVhbnMgdGhhdCB2IGlzIGEgbGl0ZXJhbCwgMTYgPCBlIDwgMzIgbWVhbnMgdGhhdCB2IGlzIGEgcG9pbnRlciB0bworICAgdGhlIG5leHQgdGFibGUsIHdoaWNoIGNvZGVzIGUgLSAxNiBiaXRzLCBhbmQgbGFzdGx5IGUgPT0gOTkgaW5kaWNhdGVzCisgICBhbiB1bnVzZWQgY29kZS4gIElmIGEgY29kZSB3aXRoIGUgPT0gOTkgaXMgbG9va2VkIHVwLCB0aGlzIGltcGxpZXMgYW4KKyAgIGVycm9yIGluIHRoZSBkYXRhLiAqLworc3RydWN0IGh1ZnQgeworICB1Y2ggZTsgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgb3Igb3BlcmF0aW9uICovCisgIHVjaCBiOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3Igc3ViY29kZSAqLworICB1bmlvbiB7CisgICAgdXNoIG47ICAgICAgICAgICAgICAvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgb3IgZGlzdGFuY2UgYmFzZSAqLworICAgIHN0cnVjdCBodWZ0ICp0OyAgICAgLyogcG9pbnRlciB0byBuZXh0IGxldmVsIG9mIHRhYmxlICovCisgIH0gdjsKK307CisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyAqLworU1RBVElDIGludCBJTklUIGh1ZnRfYnVpbGQgT0YoKHVuc2lnbmVkICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgCisJCWNvbnN0IHVzaCAqLCBjb25zdCB1c2ggKiwgc3RydWN0IGh1ZnQgKiosIGludCAqKSk7CitTVEFUSUMgaW50IElOSVQgaHVmdF9mcmVlIE9GKChzdHJ1Y3QgaHVmdCAqKSk7CitTVEFUSUMgaW50IElOSVQgaW5mbGF0ZV9jb2RlcyBPRigoc3RydWN0IGh1ZnQgKiwgc3RydWN0IGh1ZnQgKiwgaW50LCBpbnQpKTsKK1NUQVRJQyBpbnQgSU5JVCBpbmZsYXRlX3N0b3JlZCBPRigodm9pZCkpOworU1RBVElDIGludCBJTklUIGluZmxhdGVfZml4ZWQgT0YoKHZvaWQpKTsKK1NUQVRJQyBpbnQgSU5JVCBpbmZsYXRlX2R5bmFtaWMgT0YoKHZvaWQpKTsKK1NUQVRJQyBpbnQgSU5JVCBpbmZsYXRlX2Jsb2NrIE9GKChpbnQgKikpOworU1RBVElDIGludCBJTklUIGluZmxhdGUgT0YoKHZvaWQpKTsKKworCisvKiBUaGUgaW5mbGF0ZSBhbGdvcml0aG0gdXNlcyBhIHNsaWRpbmcgMzIgSyBieXRlIHdpbmRvdyBvbiB0aGUgdW5jb21wcmVzc2VkCisgICBzdHJlYW0gdG8gZmluZCByZXBlYXRlZCBieXRlIHN0cmluZ3MuICBUaGlzIGlzIGltcGxlbWVudGVkIGhlcmUgYXMgYQorICAgY2lyY3VsYXIgYnVmZmVyLiAgVGhlIGluZGV4IGlzIHVwZGF0ZWQgc2ltcGx5IGJ5IGluY3JlbWVudGluZyBhbmQgdGhlbgorICAgQU5EaW5nIHdpdGggMHg3ZmZmICgzMkstMSkuICovCisvKiBJdCBpcyBsZWZ0IHRvIG90aGVyIG1vZHVsZXMgdG8gc3VwcGx5IHRoZSAzMiBLIGFyZWEuICBJdCBpcyBhc3N1bWVkCisgICB0byBiZSB1c2FibGUgYXMgaWYgaXQgd2VyZSBkZWNsYXJlZCAidWNoIHNsaWRlWzMyNzY4XTsiIG9yIGFzIGp1c3QKKyAgICJ1Y2ggKnNsaWRlOyIgYW5kIHRoZW4gbWFsbG9jJ2VkIGluIHRoZSBsYXR0ZXIgY2FzZS4gIFRoZSBkZWZpbml0aW9uCisgICBtdXN0IGJlIGluIHVuemlwLmgsIGluY2x1ZGVkIGFib3ZlLiAqLworLyogdW5zaWduZWQgd3A7ICAgICAgICAgICAgIGN1cnJlbnQgcG9zaXRpb24gaW4gc2xpZGUgKi8KKyNkZWZpbmUgd3Agb3V0Y250CisjZGVmaW5lIGZsdXNoX291dHB1dCh3KSAod3A9KHcpLGZsdXNoX3dpbmRvdygpKQorCisvKiBUYWJsZXMgZm9yIGRlZmxhdGUgZnJvbSBQS1pJUCdzIGFwcG5vdGUudHh0LiAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGJvcmRlcltdID0geyAgICAvKiBPcmRlciBvZiB0aGUgYml0IGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CitzdGF0aWMgY29uc3QgdXNoIGNwbGVuc1tdID0geyAgICAgICAgIC8qIENvcHkgbGVuZ3RocyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEzLCAxNSwgMTcsIDE5LCAyMywgMjcsIDMxLAorICAgICAgICAzNSwgNDMsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMTE1LCAxMzEsIDE2MywgMTk1LCAyMjcsIDI1OCwgMCwgMH07CisgICAgICAgIC8qIG5vdGU6IHNlZSBub3RlICMxMyBhYm92ZSBhYm91dCB0aGUgMjU4IGluIHRoaXMgbGlzdC4gKi8KK3N0YXRpYyBjb25zdCB1c2ggY3BsZXh0W10gPSB7ICAgICAgICAgLyogRXh0cmEgYml0cyBmb3IgbGl0ZXJhbCBjb2RlcyAyNTcuLjI4NSAqLworICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLAorICAgICAgICAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwLCA5OSwgOTl9OyAvKiA5OT09aW52YWxpZCAqLworc3RhdGljIGNvbnN0IHVzaCBjcGRpc3RbXSA9IHsgICAgICAgICAvKiBDb3B5IG9mZnNldHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3fTsKK3N0YXRpYyBjb25zdCB1c2ggY3BkZXh0W10gPSB7ICAgICAgICAgLyogRXh0cmEgYml0cyBmb3IgZGlzdGFuY2UgY29kZXMgKi8KKyAgICAgICAgMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwKKyAgICAgICAgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLCAxMSwgMTEsCisgICAgICAgIDEyLCAxMiwgMTMsIDEzfTsKKworCisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpIGJpdCBwZWVraW5nIGFuZCBncmFiYmluZy4KKyAgIFRoZSB1c2FnZSBpczoKKyAgIAorICAgICAgICBORUVEQklUUyhqKQorICAgICAgICB4ID0gYiAmIG1hc2tfYml0c1tqXTsKKyAgICAgICAgRFVNUEJJVFMoaikKKworICAgd2hlcmUgTkVFREJJVFMgbWFrZXMgc3VyZSB0aGF0IGIgaGFzIGF0IGxlYXN0IGogYml0cyBpbiBpdCwgYW5kCisgICBEVU1QQklUUyByZW1vdmVzIHRoZSBiaXRzIGZyb20gYi4gIFRoZSBtYWNyb3MgdXNlIHRoZSB2YXJpYWJsZSBrCisgICBmb3IgdGhlIG51bWJlciBvZiBiaXRzIGluIGIuICBOb3JtYWxseSwgYiBhbmQgayBhcmUgcmVnaXN0ZXIKKyAgIHZhcmlhYmxlcyBmb3Igc3BlZWQsIGFuZCBhcmUgaW5pdGlhbGl6ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhCisgICByb3V0aW5lIHRoYXQgdXNlcyB0aGVzZSBtYWNyb3MgZnJvbSBhIGdsb2JhbCBiaXQgYnVmZmVyIGFuZCBjb3VudC4KKworICAgSWYgd2UgYXNzdW1lIHRoYXQgRU9CIHdpbGwgYmUgdGhlIGxvbmdlc3QgY29kZSwgdGhlbiB3ZSB3aWxsIG5ldmVyCisgICBhc2sgZm9yIGJpdHMgd2l0aCBORUVEQklUUyB0aGF0IGFyZSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICAgU28sIE5FRURCSVRTIHNob3VsZCBub3QgcmVhZCBhbnkgbW9yZSBieXRlcyB0aGFuIGFyZSBuZWVkZWQgdG8KKyAgIG1lZXQgdGhlIHJlcXVlc3QuICBUaGVuIG5vIGJ5dGVzIG5lZWQgdG8gYmUgInJldHVybmVkIiB0byB0aGUgYnVmZmVyCisgICBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJsb2NrLgorCisgICBIb3dldmVyLCB0aGlzIGFzc3VtcHRpb24gaXMgbm90IHRydWUgZm9yIGZpeGVkIGJsb2Nrcy0tdGhlIEVPQiBjb2RlCisgICBpcyA3IGJpdHMsIGJ1dCB0aGUgb3RoZXIgbGl0ZXJhbC9sZW5ndGggY29kZXMgY2FuIGJlIDggb3IgOSBiaXRzLgorICAgKFRoZSBFT0IgY29kZSBpcyBzaG9ydGVyIHRoYW4gb3RoZXIgY29kZXMgYmVjYXVzZSBmaXhlZCBibG9ja3MgYXJlCisgICBnZW5lcmFsbHkgc2hvcnQuICBTbywgd2hpbGUgYSBibG9jayBhbHdheXMgaGFzIGFuIEVPQiwgbWFueSBvdGhlcgorICAgbGl0ZXJhbC9sZW5ndGggY29kZXMgaGF2ZSBhIHNpZ25pZmljYW50bHkgbG93ZXIgcHJvYmFiaWxpdHkgb2YKKyAgIHNob3dpbmcgdXAgYXQgYWxsLikgIEhvd2V2ZXIsIGJ5IG1ha2luZyB0aGUgZmlyc3QgdGFibGUgaGF2ZSBhCisgICBsb29rdXAgb2Ygc2V2ZW4gYml0cywgdGhlIEVPQiBjb2RlIHdpbGwgYmUgZm91bmQgaW4gdGhhdCBmaXJzdAorICAgbG9va3VwLCBhbmQgc28gd2lsbCBub3QgcmVxdWlyZSB0aGF0IHRvbyBtYW55IGJpdHMgYmUgcHVsbGVkIGZyb20KKyAgIHRoZSBzdHJlYW0uCisgKi8KKworU1RBVElDIHVsZyBiYjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqLworU1RBVElDIHVuc2lnbmVkIGJrOyAgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovCisKK1NUQVRJQyBjb25zdCB1c2ggbWFza19iaXRzW10gPSB7CisgICAgMHgwMDAwLAorICAgIDB4MDAwMSwgMHgwMDAzLCAweDAwMDcsIDB4MDAwZiwgMHgwMDFmLCAweDAwM2YsIDB4MDA3ZiwgMHgwMGZmLAorICAgIDB4MDFmZiwgMHgwM2ZmLCAweDA3ZmYsIDB4MGZmZiwgMHgxZmZmLCAweDNmZmYsIDB4N2ZmZiwgMHhmZmZmCit9OworCisjZGVmaW5lIE5FWFRCWVRFKCkgICh7IGludCB2ID0gZ2V0X2J5dGUoKTsgaWYgKHYgPCAwKSBnb3RvIHVuZGVycnVuOyAodWNoKXY7IH0pCisjZGVmaW5lIE5FRURCSVRTKG4pIHt3aGlsZShrPChuKSl7Ynw9KCh1bGcpTkVYVEJZVEUoKSk8PGs7ays9ODt9fQorI2RlZmluZSBEVU1QQklUUyhuKSB7Yj4+PShuKTtrLT0obik7fQorCisjaWZuZGVmIE5PX0lORkxBVEVfTUFMTE9DCisvKiBBIHRyaXZpYWwgbWFsbG9jIGltcGxlbWVudGF0aW9uLCBhZGFwdGVkIGZyb20KKyAqICBtYWxsb2MgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzIGFuZCBNYXR0aGlhcyBVcmxpY2hzIDE5OTQKKyAqLworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBtYWxsb2NfcHRyOworc3RhdGljIGludCBtYWxsb2NfY291bnQ7CisKK3N0YXRpYyB2b2lkICptYWxsb2MoaW50IHNpemUpCit7CisgICAgICAgdm9pZCAqcDsKKworICAgICAgIGlmIChzaXplIDwgMCkKKwkJZXJyb3IoIk1hbGxvYyBlcnJvciIpOworICAgICAgIGlmICghbWFsbG9jX3B0cikKKwkJbWFsbG9jX3B0ciA9IGZyZWVfbWVtX3B0cjsKKworICAgICAgIG1hbGxvY19wdHIgPSAobWFsbG9jX3B0ciArIDMpICYgfjM7ICAgICAvKiBBbGlnbiAqLworCisgICAgICAgcCA9ICh2b2lkICopbWFsbG9jX3B0cjsKKyAgICAgICBtYWxsb2NfcHRyICs9IHNpemU7CisKKyAgICAgICBpZiAoZnJlZV9tZW1fZW5kX3B0ciAmJiBtYWxsb2NfcHRyID49IGZyZWVfbWVtX2VuZF9wdHIpCisJCWVycm9yKCJPdXQgb2YgbWVtb3J5Iik7CisKKyAgICAgICBtYWxsb2NfY291bnQrKzsKKyAgICAgICByZXR1cm4gcDsKK30KKworc3RhdGljIHZvaWQgZnJlZSh2b2lkICp3aGVyZSkKK3sKKyAgICAgICBtYWxsb2NfY291bnQtLTsKKyAgICAgICBpZiAoIW1hbGxvY19jb3VudCkKKwkJbWFsbG9jX3B0ciA9IGZyZWVfbWVtX3B0cjsKK30KKyNlbHNlCisjZGVmaW5lIG1hbGxvYyhhKSBrbWFsbG9jKGEsIEdGUF9LRVJORUwpCisjZGVmaW5lIGZyZWUoYSkga2ZyZWUoYSkKKyNlbmRpZgorCisvKgorICAgSHVmZm1hbiBjb2RlIGRlY29kaW5nIGlzIHBlcmZvcm1lZCB1c2luZyBhIG11bHRpLWxldmVsIHRhYmxlIGxvb2t1cC4KKyAgIFRoZSBmYXN0ZXN0IHdheSB0byBkZWNvZGUgaXMgdG8gc2ltcGx5IGJ1aWxkIGEgbG9va3VwIHRhYmxlIHdob3NlCisgICBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIGxvbmdlc3QgY29kZS4gIEhvd2V2ZXIsIHRoZSB0aW1lIGl0IHRha2VzCisgICB0byBidWlsZCB0aGlzIHRhYmxlIGNhbiBhbHNvIGJlIGEgZmFjdG9yIGlmIHRoZSBkYXRhIGJlaW5nIGRlY29kZWQKKyAgIGlzIG5vdCB2ZXJ5IGxvbmcuICBUaGUgbW9zdCBjb21tb24gY29kZXMgYXJlIG5lY2Vzc2FyaWx5IHRoZQorICAgc2hvcnRlc3QgY29kZXMsIHNvIHRob3NlIGNvZGVzIGRvbWluYXRlIHRoZSBkZWNvZGluZyB0aW1lLCBhbmQgaGVuY2UKKyAgIHRoZSBzcGVlZC4gIFRoZSBpZGVhIGlzIHlvdSBjYW4gaGF2ZSBhIHNob3J0ZXIgdGFibGUgdGhhdCBkZWNvZGVzIHRoZQorICAgc2hvcnRlciwgbW9yZSBwcm9iYWJsZSBjb2RlcywgYW5kIHRoZW4gcG9pbnQgdG8gc3Vic2lkaWFyeSB0YWJsZXMgZm9yCisgICB0aGUgbG9uZ2VyIGNvZGVzLiAgVGhlIHRpbWUgaXQgY29zdHMgdG8gZGVjb2RlIHRoZSBsb25nZXIgY29kZXMgaXMKKyAgIHRoZW4gdHJhZGVkIGFnYWluc3QgdGhlIHRpbWUgaXQgdGFrZXMgdG8gbWFrZSBsb25nZXIgdGFibGVzLgorCisgICBUaGlzIHJlc3VsdHMgb2YgdGhpcyB0cmFkZSBhcmUgaW4gdGhlIHZhcmlhYmxlcyBsYml0cyBhbmQgZGJpdHMKKyAgIGJlbG93LiAgbGJpdHMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBmaXJzdCBsZXZlbCB0YWJsZSBmb3IgbGl0ZXJhbC8KKyAgIGxlbmd0aCBjb2RlcyBjYW4gZGVjb2RlIGluIG9uZSBzdGVwLCBhbmQgZGJpdHMgaXMgdGhlIHNhbWUgdGhpbmcgZm9yCisgICB0aGUgZGlzdGFuY2UgY29kZXMuICBTdWJzZXF1ZW50IHRhYmxlcyBhcmUgYWxzbyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKyAgIHRob3NlIHNpemVzLiAgVGhlc2UgdmFsdWVzIG1heSBiZSBhZGp1c3RlZCBlaXRoZXIgd2hlbiBhbGwgb2YgdGhlCisgICBjb2RlcyBhcmUgc2hvcnRlciB0aGFuIHRoYXQsIGluIHdoaWNoIGNhc2UgdGhlIGxvbmdlc3QgY29kZSBsZW5ndGggaW4KKyAgIGJpdHMgaXMgdXNlZCwgb3Igd2hlbiB0aGUgc2hvcnRlc3QgY29kZSBpcyAqbG9uZ2VyKiB0aGFuIHRoZSByZXF1ZXN0ZWQKKyAgIHRhYmxlIHNpemUsIGluIHdoaWNoIGNhc2UgdGhlIGxlbmd0aCBvZiB0aGUgc2hvcnRlc3QgY29kZSBpbiBiaXRzIGlzCisgICB1c2VkLgorCisgICBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCB2YWx1ZXMgZm9yIHRoZSB0d28gdGFibGVzLCBzaW5jZSB0aGV5IGNvZGUgYQorICAgZGlmZmVyZW50IG51bWJlciBvZiBwb3NzaWJpbGl0aWVzIGVhY2guICBUaGUgbGl0ZXJhbC9sZW5ndGggdGFibGUKKyAgIGNvZGVzIDI4NiBwb3NzaWJsZSB2YWx1ZXMsIG9yIGluIGEgZmxhdCBjb2RlLCBhIGxpdHRsZSBvdmVyIGVpZ2h0CisgICBiaXRzLiAgVGhlIGRpc3RhbmNlIHRhYmxlIGNvZGVzIDMwIHBvc3NpYmxlIHZhbHVlcywgb3IgYSBsaXR0bGUgbGVzcworICAgdGhhbiBmaXZlIGJpdHMsIGZsYXQuICBUaGUgb3B0aW11bSB2YWx1ZXMgZm9yIHNwZWVkIGVuZCB1cCBiZWluZworICAgYWJvdXQgb25lIGJpdCBtb3JlIHRoYW4gdGhvc2UsIHNvIGxiaXRzIGlzIDgrMSBhbmQgZGJpdHMgaXMgNSsxLgorICAgVGhlIG9wdGltdW0gdmFsdWVzIG1heSBkaWZmZXIgdGhvdWdoIGZyb20gbWFjaGluZSB0byBtYWNoaW5lLCBhbmQKKyAgIHBvc3NpYmx5IGV2ZW4gYmV0d2VlbiBjb21waWxlcnMuICBZb3VyIG1pbGVhZ2UgbWF5IHZhcnkuCisgKi8KKworCitTVEFUSUMgY29uc3QgaW50IGxiaXRzID0gOTsgICAgICAgICAgLyogYml0cyBpbiBiYXNlIGxpdGVyYWwvbGVuZ3RoIGxvb2t1cCB0YWJsZSAqLworU1RBVElDIGNvbnN0IGludCBkYml0cyA9IDY7ICAgICAgICAgIC8qIGJpdHMgaW4gYmFzZSBkaXN0YW5jZSBsb29rdXAgdGFibGUgKi8KKworCisvKiBJZiBCTUFYIG5lZWRzIHRvIGJlIGxhcmdlciB0aGFuIDE2LCB0aGVuIGggYW5kIHhbXSBzaG91bGQgYmUgdWxnLiAqLworI2RlZmluZSBCTUFYIDE2ICAgICAgICAgLyogbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGFueSBjb2RlICgxNiBmb3IgZXhwbG9kZSkgKi8KKyNkZWZpbmUgTl9NQVggMjg4ICAgICAgIC8qIG1heGltdW0gbnVtYmVyIG9mIGNvZGVzIGluIGFueSBzZXQgKi8KKworCitTVEFUSUMgdW5zaWduZWQgaHVmdHM7ICAgICAgICAgLyogdHJhY2sgbWVtb3J5IHVzYWdlICovCisKKworU1RBVElDIGludCBJTklUIGh1ZnRfYnVpbGQoCisJdW5zaWduZWQgKmIsICAgICAgICAgICAgLyogY29kZSBsZW5ndGhzIGluIGJpdHMgKGFsbCBhc3N1bWVkIDw9IEJNQVgpICovCisJdW5zaWduZWQgbiwgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGVzIChhc3N1bWVkIDw9IE5fTUFYKSAqLworCXVuc2lnbmVkIHMsICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzaW1wbGUtdmFsdWVkIGNvZGVzICgwLi5zLTEpICovCisJY29uc3QgdXNoICpkLCAgICAgICAgICAgLyogbGlzdCBvZiBiYXNlIHZhbHVlcyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworCWNvbnN0IHVzaCAqZSwgICAgICAgICAgIC8qIGxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcyAqLworCXN0cnVjdCBodWZ0ICoqdCwgICAgICAgIC8qIHJlc3VsdDogc3RhcnRpbmcgdGFibGUgKi8KKwlpbnQgKm0gICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGxvb2t1cCBiaXRzLCByZXR1cm5zIGFjdHVhbCAqLworCSkKKy8qIEdpdmVuIGEgbGlzdCBvZiBjb2RlIGxlbmd0aHMgYW5kIGEgbWF4aW11bSB0YWJsZSBzaXplLCBtYWtlIGEgc2V0IG9mCisgICB0YWJsZXMgdG8gZGVjb2RlIHRoYXQgc2V0IG9mIGNvZGVzLiAgUmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb25lIGlmCisgICB0aGUgZ2l2ZW4gY29kZSBzZXQgaXMgaW5jb21wbGV0ZSAodGhlIHRhYmxlcyBhcmUgc3RpbGwgYnVpbHQgaW4gdGhpcworICAgY2FzZSksIHR3byBpZiB0aGUgaW5wdXQgaXMgaW52YWxpZCAoYWxsIHplcm8gbGVuZ3RoIGNvZGVzIG9yIGFuCisgICBvdmVyc3Vic2NyaWJlZCBzZXQgb2YgbGVuZ3RocyksIGFuZCB0aHJlZSBpZiBub3QgZW5vdWdoIG1lbW9yeS4gKi8KK3sKKyAgdW5zaWduZWQgYTsgICAgICAgICAgICAgICAgICAgLyogY291bnRlciBmb3IgY29kZXMgb2YgbGVuZ3RoIGsgKi8KKyAgdW5zaWduZWQgZjsgICAgICAgICAgICAgICAgICAgLyogaSByZXBlYXRzIGluIHRhYmxlIGV2ZXJ5IGYgZW50cmllcyAqLworICBpbnQgZzsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisgIGludCBoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGxldmVsICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGk7ICAgICAgICAgIC8qIGNvdW50ZXIsIGN1cnJlbnQgY29kZSAqLworICByZWdpc3RlciB1bnNpZ25lZCBqOyAgICAgICAgICAvKiBjb3VudGVyICovCisgIHJlZ2lzdGVyIGludCBrOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGN1cnJlbnQgY29kZSAqLworICBpbnQgbDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXRzIHBlciB0YWJsZSAocmV0dXJuZWQgaW4gbSkgKi8KKyAgcmVnaXN0ZXIgdW5zaWduZWQgKnA7ICAgICAgICAgLyogcG9pbnRlciBpbnRvIGNbXSwgYltdLCBvciB2W10gKi8KKyAgcmVnaXN0ZXIgc3RydWN0IGh1ZnQgKnE7ICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KKyAgc3RydWN0IGh1ZnQgcjsgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIHN0cnVjdHVyZSBhc3NpZ25tZW50ICovCisgIHJlZ2lzdGVyIGludCB3OyAgICAgICAgICAgICAgIC8qIGJpdHMgYmVmb3JlIHRoaXMgdGFibGUgPT0gKGwgKiBoKSAqLworICB1bnNpZ25lZCAqeHA7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIGludG8geCAqLworICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZHVtbXkgY29kZXMgYWRkZWQgKi8KKyAgdW5zaWduZWQgejsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gY3VycmVudCB0YWJsZSAqLworICBzdHJ1Y3QgeworICAgIHVuc2lnbmVkIGNbQk1BWCsxXTsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KKyAgICBzdHJ1Y3QgaHVmdCAqdVtCTUFYXTsgICAgICAgICAvKiB0YWJsZSBzdGFjayAqLworICAgIHVuc2lnbmVkIHZbTl9NQVhdOyAgICAgICAgICAgIC8qIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RoICovCisgICAgdW5zaWduZWQgeFtCTUFYKzFdOyAgICAgICAgICAgLyogYml0IG9mZnNldHMsIHRoZW4gY29kZSBzdGFjayAqLworICB9ICpzdGs7CisgIHVuc2lnbmVkICpjLCAqdiwgKng7CisgIHN0cnVjdCBodWZ0ICoqdTsKKyAgaW50IHJldDsKKworREVCRygiaHVmdDEgIik7CisKKyAgc3RrID0gbWFsbG9jKHNpemVvZigqc3RrKSk7CisgIGlmIChzdGsgPT0gTlVMTCkKKyAgICByZXR1cm4gMzsJCQkvKiBvdXQgb2YgbWVtb3J5ICovCisKKyAgYyA9IHN0ay0+YzsKKyAgdiA9IHN0ay0+djsKKyAgeCA9IHN0ay0+eDsKKyAgdSA9IHN0ay0+dTsKKworICAvKiBHZW5lcmF0ZSBjb3VudHMgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworICBtZW16ZXJvKHN0ay0+Yywgc2l6ZW9mKHN0ay0+YykpOworICBwID0gYjsgIGkgPSBuOworICBkbyB7CisgICAgVHJhY2VjdigqcCwgKHN0ZGVyciwgKG4taSA+PSAnICcgJiYgbi1pIDw9ICd+JyA/ICIlYyAlZFxuIiA6ICIweCV4ICVkXG4iKSwgCisJICAgIG4taSwgKnApKTsKKyAgICBjWypwXSsrOyAgICAgICAgICAgICAgICAgICAgLyogYXNzdW1lIGFsbCBlbnRyaWVzIDw9IEJNQVggKi8KKyAgICBwKys7ICAgICAgICAgICAgICAgICAgICAgIC8qIENhbid0IGNvbWJpbmUgd2l0aCBhYm92ZSBsaW5lIChTb2xhcmlzIGJ1ZykgKi8KKyAgfSB3aGlsZSAoLS1pKTsKKyAgaWYgKGNbMF0gPT0gbikgICAgICAgICAgICAgICAgLyogbnVsbCBpbnB1dC0tYWxsIHplcm8gbGVuZ3RoIGNvZGVzICovCisgIHsKKyAgICAqdCA9IChzdHJ1Y3QgaHVmdCAqKU5VTEw7CisgICAgKm0gPSAwOworICAgIHJldCA9IDI7CisgICAgZ290byBvdXQ7CisgIH0KKworREVCRygiaHVmdDIgIik7CisKKyAgLyogRmluZCBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCwgYm91bmQgKm0gYnkgdGhvc2UgKi8KKyAgbCA9ICptOworICBmb3IgKGogPSAxOyBqIDw9IEJNQVg7IGorKykKKyAgICBpZiAoY1tqXSkKKyAgICAgIGJyZWFrOworICBrID0gajsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaW5pbXVtIGNvZGUgbGVuZ3RoICovCisgIGlmICgodW5zaWduZWQpbCA8IGopCisgICAgbCA9IGo7CisgIGZvciAoaSA9IEJNQVg7IGk7IGktLSkKKyAgICBpZiAoY1tpXSkKKyAgICAgIGJyZWFrOworICBnID0gaTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisgIGlmICgodW5zaWduZWQpbCA+IGkpCisgICAgbCA9IGk7CisgICptID0gbDsKKworREVCRygiaHVmdDMgIik7CisKKyAgLyogQWRqdXN0IGxhc3QgbGVuZ3RoIGNvdW50IHRvIGZpbGwgb3V0IGNvZGVzLCBpZiBuZWVkZWQgKi8KKyAgZm9yICh5ID0gMSA8PCBqOyBqIDwgaTsgaisrLCB5IDw8PSAxKQorICAgIGlmICgoeSAtPSBjW2pdKSA8IDApIHsKKyAgICAgIHJldCA9IDI7ICAgICAgICAgICAgICAgICAvKiBiYWQgaW5wdXQ6IG1vcmUgY29kZXMgdGhhbiBiaXRzICovCisgICAgICBnb3RvIG91dDsKKyAgICB9CisgIGlmICgoeSAtPSBjW2ldKSA8IDApIHsKKyAgICByZXQgPSAyOworICAgIGdvdG8gb3V0OworICB9CisgIGNbaV0gKz0geTsKKworREVCRygiaHVmdDQgIik7CisKKyAgLyogR2VuZXJhdGUgc3RhcnRpbmcgb2Zmc2V0cyBpbnRvIHRoZSB2YWx1ZSB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi8KKyAgeFsxXSA9IGogPSAwOworICBwID0gYyArIDE7ICB4cCA9IHggKyAyOworICB3aGlsZSAoLS1pKSB7ICAgICAgICAgICAgICAgICAvKiBub3RlIHRoYXQgaSA9PSBnIGZyb20gYWJvdmUgKi8KKyAgICAqeHArKyA9IChqICs9ICpwKyspOworICB9CisKK0RFQkcoImh1ZnQ1ICIpOworCisgIC8qIE1ha2UgYSB0YWJsZSBvZiB2YWx1ZXMgaW4gb3JkZXIgb2YgYml0IGxlbmd0aHMgKi8KKyAgcCA9IGI7ICBpID0gMDsKKyAgZG8geworICAgIGlmICgoaiA9ICpwKyspICE9IDApCisgICAgICB2W3hbal0rK10gPSBpOworICB9IHdoaWxlICgrK2kgPCBuKTsKKyAgbiA9IHhbZ107ICAgICAgICAgICAgICAgICAgIC8qIHNldCBuIHRvIGxlbmd0aCBvZiB2ICovCisKK0RFQkcoImg2ICIpOworCisgIC8qIEdlbmVyYXRlIHRoZSBIdWZmbWFuIGNvZGVzIGFuZCBmb3IgZWFjaCwgbWFrZSB0aGUgdGFibGUgZW50cmllcyAqLworICB4WzBdID0gaSA9IDA7ICAgICAgICAgICAgICAgICAvKiBmaXJzdCBIdWZmbWFuIGNvZGUgaXMgemVybyAqLworICBwID0gdjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBncmFiIHZhbHVlcyBpbiBiaXQgb3JkZXIgKi8KKyAgaCA9IC0xOyAgICAgICAgICAgICAgICAgICAgICAgLyogbm8gdGFibGVzIHlldC0tbGV2ZWwgLTEgKi8KKyAgdyA9IC1sOyAgICAgICAgICAgICAgICAgICAgICAgLyogYml0cyBkZWNvZGVkID09IChsICogaCkgKi8KKyAgdVswXSA9IChzdHJ1Y3QgaHVmdCAqKU5VTEw7ICAgLyoganVzdCB0byBrZWVwIGNvbXBpbGVycyBoYXBweSAqLworICBxID0gKHN0cnVjdCBodWZ0ICopTlVMTDsgICAgICAvKiBkaXR0byAqLworICB6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaXR0byAqLworREVCRygiaDZhICIpOworCisgIC8qIGdvIHRocm91Z2ggdGhlIGJpdCBsZW5ndGhzIChrIGFscmVhZHkgaXMgYml0cyBpbiBzaG9ydGVzdCBjb2RlKSAqLworICBmb3IgKDsgayA8PSBnOyBrKyspCisgIHsKK0RFQkcoImg2YiAiKTsKKyAgICBhID0gY1trXTsKKyAgICB3aGlsZSAoYS0tKQorICAgIHsKK0RFQkcoImg2YjEgIik7CisgICAgICAvKiBoZXJlIGkgaXMgdGhlIEh1ZmZtYW4gY29kZSBvZiBsZW5ndGggayBiaXRzIGZvciB2YWx1ZSAqcCAqLworICAgICAgLyogbWFrZSB0YWJsZXMgdXAgdG8gcmVxdWlyZWQgbGV2ZWwgKi8KKyAgICAgIHdoaWxlIChrID4gdyArIGwpCisgICAgICB7CitERUJHMSgiMSAiKTsKKyAgICAgICAgaCsrOworICAgICAgICB3ICs9IGw7ICAgICAgICAgICAgICAgICAvKiBwcmV2aW91cyB0YWJsZSBhbHdheXMgbCBiaXRzICovCisKKyAgICAgICAgLyogY29tcHV0ZSBtaW5pbXVtIHNpemUgdGFibGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGwgYml0cyAqLworICAgICAgICB6ID0gKHogPSBnIC0gdykgPiAodW5zaWduZWQpbCA/IGwgOiB6OyAgLyogdXBwZXIgbGltaXQgb24gdGFibGUgc2l6ZSAqLworICAgICAgICBpZiAoKGYgPSAxIDw8IChqID0gayAtIHcpKSA+IGEgKyAxKSAgICAgLyogdHJ5IGEgay13IGJpdCB0YWJsZSAqLworICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGNvZGVzIGZvciBrLXcgYml0IHRhYmxlICovCitERUJHMSgiMiAiKTsKKyAgICAgICAgICBmIC09IGEgKyAxOyAgICAgICAgICAgLyogZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgbGVmdCAqLworICAgICAgICAgIHhwID0gYyArIGs7CisgICAgICAgICAgaWYgKGogPCB6KQorICAgICAgICAgICAgd2hpbGUgKCsraiA8IHopICAgICAgIC8qIHRyeSBzbWFsbGVyIHRhYmxlcyB1cCB0byB6IGJpdHMgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKChmIDw8PSAxKSA8PSAqKyt4cCkKKyAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAvKiBlbm91Z2ggY29kZXMgdG8gdXNlIHVwIGogYml0cyAqLworICAgICAgICAgICAgICBmIC09ICp4cDsgICAgICAgICAgIC8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorREVCRzEoIjMgIik7CisgICAgICAgIHogPSAxIDw8IGo7ICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJpZXMgZm9yIGotYml0IHRhYmxlICovCisKKyAgICAgICAgLyogYWxsb2NhdGUgYW5kIGxpbmsgaW4gbmV3IHRhYmxlICovCisgICAgICAgIGlmICgocSA9IChzdHJ1Y3QgaHVmdCAqKW1hbGxvYygoeiArIDEpKnNpemVvZihzdHJ1Y3QgaHVmdCkpKSA9PQorICAgICAgICAgICAgKHN0cnVjdCBodWZ0ICopTlVMTCkKKyAgICAgICAgeworICAgICAgICAgIGlmIChoKQorICAgICAgICAgICAgaHVmdF9mcmVlKHVbMF0pOworICAgICAgICAgIHJldCA9IDM7ICAgICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5ICovCisJICBnb3RvIG91dDsKKyAgICAgICAgfQorREVCRzEoIjQgIik7CisgICAgICAgIGh1ZnRzICs9IHogKyAxOyAgICAgICAgIC8qIHRyYWNrIG1lbW9yeSB1c2FnZSAqLworICAgICAgICAqdCA9IHEgKyAxOyAgICAgICAgICAgICAvKiBsaW5rIHRvIGxpc3QgZm9yIGh1ZnRfZnJlZSgpICovCisgICAgICAgICoodCA9ICYocS0+di50KSkgPSAoc3RydWN0IGh1ZnQgKilOVUxMOworICAgICAgICB1W2hdID0gKytxOyAgICAgICAgICAgICAvKiB0YWJsZSBzdGFydHMgYWZ0ZXIgbGluayAqLworCitERUJHMSgiNSAiKTsKKyAgICAgICAgLyogY29ubmVjdCB0byBsYXN0IHRhYmxlLCBpZiB0aGVyZSBpcyBvbmUgKi8KKyAgICAgICAgaWYgKGgpCisgICAgICAgIHsKKyAgICAgICAgICB4W2hdID0gaTsgICAgICAgICAgICAgLyogc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwICovCisgICAgICAgICAgci5iID0gKHVjaClsOyAgICAgICAgIC8qIGJpdHMgdG8gZHVtcCBiZWZvcmUgdGhpcyB0YWJsZSAqLworICAgICAgICAgIHIuZSA9ICh1Y2gpKDE2ICsgaik7ICAvKiBiaXRzIGluIHRoaXMgdGFibGUgKi8KKyAgICAgICAgICByLnYudCA9IHE7ICAgICAgICAgICAgLyogcG9pbnRlciB0byB0aGlzIHRhYmxlICovCisgICAgICAgICAgaiA9IGkgPj4gKHcgLSBsKTsgICAgIC8qIChnZXQgYXJvdW5kIFR1cmJvIEMgYnVnKSAqLworICAgICAgICAgIHVbaC0xXVtqXSA9IHI7ICAgICAgICAvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUgKi8KKyAgICAgICAgfQorREVCRzEoIjYgIik7CisgICAgICB9CitERUJHKCJoNmMgIik7CisKKyAgICAgIC8qIHNldCB1cCB0YWJsZSBlbnRyeSBpbiByICovCisgICAgICByLmIgPSAodWNoKShrIC0gdyk7CisgICAgICBpZiAocCA+PSB2ICsgbikKKyAgICAgICAgci5lID0gOTk7ICAgICAgICAgICAgICAgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCisgICAgICBlbHNlIGlmICgqcCA8IHMpCisgICAgICB7CisgICAgICAgIHIuZSA9ICh1Y2gpKCpwIDwgMjU2ID8gMTYgOiAxNSk7ICAgIC8qIDI1NiBpcyBlbmQtb2YtYmxvY2sgY29kZSAqLworICAgICAgICByLnYubiA9ICh1c2gpKCpwKTsgICAgICAgICAgICAgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KKwlwKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb25lIGNvbXBpbGVyIGRvZXMgbm90IGxpa2UgKnArKyAqLworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICByLmUgPSAodWNoKWVbKnAgLSBzXTsgICAvKiBub24tc2ltcGxlLS1sb29rIHVwIGluIGxpc3RzICovCisgICAgICAgIHIudi5uID0gZFsqcCsrIC0gc107CisgICAgICB9CitERUJHKCJoNmQgIik7CisKKyAgICAgIC8qIGZpbGwgY29kZS1saWtlIGVudHJpZXMgd2l0aCByICovCisgICAgICBmID0gMSA8PCAoayAtIHcpOworICAgICAgZm9yIChqID0gaSA+PiB3OyBqIDwgejsgaiArPSBmKQorICAgICAgICBxW2pdID0gcjsKKworICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgay1iaXQgY29kZSBpICovCisgICAgICBmb3IgKGogPSAxIDw8IChrIC0gMSk7IGkgJiBqOyBqID4+PSAxKQorICAgICAgICBpIF49IGo7CisgICAgICBpIF49IGo7CisKKyAgICAgIC8qIGJhY2t1cCBvdmVyIGZpbmlzaGVkIHRhYmxlcyAqLworICAgICAgd2hpbGUgKChpICYgKCgxIDw8IHcpIC0gMSkpICE9IHhbaF0pCisgICAgICB7CisgICAgICAgIGgtLTsgICAgICAgICAgICAgICAgICAgIC8qIGRvbid0IG5lZWQgdG8gdXBkYXRlIHEgKi8KKyAgICAgICAgdyAtPSBsOworICAgICAgfQorREVCRygiaDZlICIpOworICAgIH0KK0RFQkcoImg2ZiAiKTsKKyAgfQorCitERUJHKCJodWZ0NyAiKTsKKworICAvKiBSZXR1cm4gdHJ1ZSAoMSkgaWYgd2Ugd2VyZSBnaXZlbiBhbiBpbmNvbXBsZXRlIHRhYmxlICovCisgIHJldCA9IHkgIT0gMCAmJiBnICE9IDE7CisKKyAgb3V0OgorICBmcmVlKHN0ayk7CisgIHJldHVybiByZXQ7Cit9CisKKworCitTVEFUSUMgaW50IElOSVQgaHVmdF9mcmVlKAorCXN0cnVjdCBodWZ0ICp0ICAgICAgICAgLyogdGFibGUgdG8gZnJlZSAqLworCSkKKy8qIEZyZWUgdGhlIG1hbGxvYydlZCB0YWJsZXMgYnVpbHQgYnkgaHVmdF9idWlsZCgpLCB3aGljaCBtYWtlcyBhIGxpbmtlZAorICAgbGlzdCBvZiB0aGUgdGFibGVzIGl0IG1hZGUsIHdpdGggdGhlIGxpbmtzIGluIGEgZHVtbXkgZmlyc3QgZW50cnkgb2YKKyAgIGVhY2ggdGFibGUuICovCit7CisgIHJlZ2lzdGVyIHN0cnVjdCBodWZ0ICpwLCAqcTsKKworCisgIC8qIEdvIHRocm91Z2ggbGlua2VkIGxpc3QsIGZyZWVpbmcgZnJvbSB0aGUgbWFsbG9jZWQgKHRbLTFdKSBhZGRyZXNzLiAqLworICBwID0gdDsKKyAgd2hpbGUgKHAgIT0gKHN0cnVjdCBodWZ0ICopTlVMTCkKKyAgeworICAgIHEgPSAoLS1wKS0+di50OworICAgIGZyZWUoKGNoYXIqKXApOworICAgIHAgPSBxOworICB9IAorICByZXR1cm4gMDsKK30KKworCitTVEFUSUMgaW50IElOSVQgaW5mbGF0ZV9jb2RlcygKKwlzdHJ1Y3QgaHVmdCAqdGwsICAgIC8qIGxpdGVyYWwvbGVuZ3RoIGRlY29kZXIgdGFibGVzICovCisJc3RydWN0IGh1ZnQgKnRkLCAgICAvKiBkaXN0YW5jZSBkZWNvZGVyIHRhYmxlcyAqLworCWludCBibCwgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgZGVjb2RlZCBieSB0bFtdICovCisJaW50IGJkICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBkZWNvZGVkIGJ5IHRkW10gKi8KKwkpCisvKiBpbmZsYXRlIChkZWNvbXByZXNzKSB0aGUgY29kZXMgaW4gYSBkZWZsYXRlZCAoY29tcHJlc3NlZCkgYmxvY2suCisgICBSZXR1cm4gYW4gZXJyb3IgY29kZSBvciB6ZXJvIGlmIGl0IGFsbCBnb2VzIG9rLiAqLworeworICByZWdpc3RlciB1bnNpZ25lZCBlOyAgLyogdGFibGUgZW50cnkgZmxhZy9udW1iZXIgb2YgZXh0cmEgYml0cyAqLworICB1bnNpZ25lZCBuLCBkOyAgICAgICAgLyogbGVuZ3RoIGFuZCBpbmRleCBmb3IgY29weSAqLworICB1bnNpZ25lZCB3OyAgICAgICAgICAgLyogY3VycmVudCB3aW5kb3cgcG9zaXRpb24gKi8KKyAgc3RydWN0IGh1ZnQgKnQ7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGFibGUgZW50cnkgKi8KKyAgdW5zaWduZWQgbWwsIG1kOyAgICAgIC8qIG1hc2tzIGZvciBibCBhbmQgYmQgYml0cyAqLworICByZWdpc3RlciB1bGcgYjsgICAgICAgLyogYml0IGJ1ZmZlciAqLworICByZWdpc3RlciB1bnNpZ25lZCBrOyAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisKKyAgLyogbWFrZSBsb2NhbCBjb3BpZXMgb2YgZ2xvYmFscyAqLworICBiID0gYmI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGJpdCBidWZmZXIgKi8KKyAgayA9IGJrOworICB3ID0gd3A7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHdpbmRvdyBwb3NpdGlvbiAqLworCisgIC8qIGluZmxhdGUgdGhlIGNvZGVkIGRhdGEgKi8KKyAgbWwgPSBtYXNrX2JpdHNbYmxdOyAgICAgICAgICAgLyogcHJlY29tcHV0ZSBtYXNrcyBmb3Igc3BlZWQgKi8KKyAgbWQgPSBtYXNrX2JpdHNbYmRdOworICBmb3IgKDs7KSAgICAgICAgICAgICAgICAgICAgICAvKiBkbyB1bnRpbCBlbmQgb2YgYmxvY2sgKi8KKyAgeworICAgIE5FRURCSVRTKCh1bnNpZ25lZClibCkKKyAgICBpZiAoKGUgPSAodCA9IHRsICsgKCh1bnNpZ25lZCliICYgbWwpKS0+ZSkgPiAxNikKKyAgICAgIGRvIHsKKyAgICAgICAgaWYgKGUgPT0gOTkpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIERVTVBCSVRTKHQtPmIpCisgICAgICAgIGUgLT0gMTY7CisgICAgICAgIE5FRURCSVRTKGUpCisgICAgICB9IHdoaWxlICgoZSA9ICh0ID0gdC0+di50ICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKSktPmUpID4gMTYpOworICAgIERVTVBCSVRTKHQtPmIpCisgICAgaWYgKGUgPT0gMTYpICAgICAgICAgICAgICAgIC8qIHRoZW4gaXQncyBhIGxpdGVyYWwgKi8KKyAgICB7CisgICAgICBzbGlkZVt3KytdID0gKHVjaCl0LT52Lm47CisgICAgICBUcmFjZXZ2KChzdGRlcnIsICIlYyIsIHNsaWRlW3ctMV0pKTsKKyAgICAgIGlmICh3ID09IFdTSVpFKQorICAgICAgeworICAgICAgICBmbHVzaF9vdXRwdXQodyk7CisgICAgICAgIHcgPSAwOworICAgICAgfQorICAgIH0KKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgLyogaXQncyBhbiBFT0Igb3IgYSBsZW5ndGggKi8KKyAgICB7CisgICAgICAvKiBleGl0IGlmIGVuZCBvZiBibG9jayAqLworICAgICAgaWYgKGUgPT0gMTUpCisgICAgICAgIGJyZWFrOworCisgICAgICAvKiBnZXQgbGVuZ3RoIG9mIGJsb2NrIHRvIGNvcHkgKi8KKyAgICAgIE5FRURCSVRTKGUpCisgICAgICBuID0gdC0+di5uICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKTsKKyAgICAgIERVTVBCSVRTKGUpOworCisgICAgICAvKiBkZWNvZGUgZGlzdGFuY2Ugb2YgYmxvY2sgdG8gY29weSAqLworICAgICAgTkVFREJJVFMoKHVuc2lnbmVkKWJkKQorICAgICAgaWYgKChlID0gKHQgPSB0ZCArICgodW5zaWduZWQpYiAmIG1kKSktPmUpID4gMTYpCisgICAgICAgIGRvIHsKKyAgICAgICAgICBpZiAoZSA9PSA5OSkKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgIERVTVBCSVRTKHQtPmIpCisgICAgICAgICAgZSAtPSAxNjsKKyAgICAgICAgICBORUVEQklUUyhlKQorICAgICAgICB9IHdoaWxlICgoZSA9ICh0ID0gdC0+di50ICsgKCh1bnNpZ25lZCliICYgbWFza19iaXRzW2VdKSktPmUpID4gMTYpOworICAgICAgRFVNUEJJVFModC0+YikKKyAgICAgIE5FRURCSVRTKGUpCisgICAgICBkID0gdyAtIHQtPnYubiAtICgodW5zaWduZWQpYiAmIG1hc2tfYml0c1tlXSk7CisgICAgICBEVU1QQklUUyhlKQorICAgICAgVHJhY2V2digoc3RkZXJyLCJcXFslZCwlZF0iLCB3LWQsIG4pKTsKKworICAgICAgLyogZG8gdGhlIGNvcHkgKi8KKyAgICAgIGRvIHsKKyAgICAgICAgbiAtPSAoZSA9IChlID0gV1NJWkUgLSAoKGQgJj0gV1NJWkUtMSkgPiB3ID8gZCA6IHcpKSA+IG4gPyBuIDogZSk7CisjaWYgIWRlZmluZWQoTk9NRU1DUFkpICYmICFkZWZpbmVkKERFQlVHKQorICAgICAgICBpZiAodyAtIGQgPj0gZSkgICAgICAgICAvKiAodGhpcyB0ZXN0IGFzc3VtZXMgdW5zaWduZWQgY29tcGFyaXNvbikgKi8KKyAgICAgICAgeworICAgICAgICAgIG1lbWNweShzbGlkZSArIHcsIHNsaWRlICsgZCwgZSk7CisgICAgICAgICAgdyArPSBlOworICAgICAgICAgIGQgKz0gZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgIC8qIGRvIGl0IHNsb3cgdG8gYXZvaWQgbWVtY3B5KCkgb3ZlcmxhcCAqLworI2VuZGlmIC8qICFOT01FTUNQWSAqLworICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHNsaWRlW3crK10gPSBzbGlkZVtkKytdOworCSAgICBUcmFjZXZ2KChzdGRlcnIsICIlYyIsIHNsaWRlW3ctMV0pKTsKKyAgICAgICAgICB9IHdoaWxlICgtLWUpOworICAgICAgICBpZiAodyA9PSBXU0laRSkKKyAgICAgICAgeworICAgICAgICAgIGZsdXNoX291dHB1dCh3KTsKKyAgICAgICAgICB3ID0gMDsKKyAgICAgICAgfQorICAgICAgfSB3aGlsZSAobik7CisgICAgfQorICB9CisKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWxzIGZyb20gdGhlIGxvY2FscyAqLworICB3cCA9IHc7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGdsb2JhbCB3aW5kb3cgcG9pbnRlciAqLworICBiYiA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGdsb2JhbCBiaXQgYnVmZmVyICovCisgIGJrID0gazsKKworICAvKiBkb25lICovCisgIHJldHVybiAwOworCisgdW5kZXJydW46CisgIHJldHVybiA0OwkJCS8qIElucHV0IHVuZGVycnVuICovCit9CisKKworCitTVEFUSUMgaW50IElOSVQgaW5mbGF0ZV9zdG9yZWQodm9pZCkKKy8qICJkZWNvbXByZXNzIiBhbiBpbmZsYXRlZCB0eXBlIDAgKHN0b3JlZCkgYmxvY2suICovCit7CisgIHVuc2lnbmVkIG47ICAgICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gYmxvY2sgKi8KKyAgdW5zaWduZWQgdzsgICAgICAgICAgIC8qIGN1cnJlbnQgd2luZG93IHBvc2l0aW9uICovCisgIHJlZ2lzdGVyIHVsZyBiOyAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGs7ICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKK0RFQkcoIjxzdG9yIik7CisKKyAgLyogbWFrZSBsb2NhbCBjb3BpZXMgb2YgZ2xvYmFscyAqLworICBiID0gYmI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGJpdCBidWZmZXIgKi8KKyAgayA9IGJrOworICB3ID0gd3A7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHdpbmRvdyBwb3NpdGlvbiAqLworCisKKyAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLworICBuID0gayAmIDc7CisgIERVTVBCSVRTKG4pOworCisKKyAgLyogZ2V0IHRoZSBsZW5ndGggYW5kIGl0cyBjb21wbGVtZW50ICovCisgIE5FRURCSVRTKDE2KQorICBuID0gKCh1bnNpZ25lZCliICYgMHhmZmZmKTsKKyAgRFVNUEJJVFMoMTYpCisgIE5FRURCSVRTKDE2KQorICBpZiAobiAhPSAodW5zaWduZWQpKCh+YikgJiAweGZmZmYpKQorICAgIHJldHVybiAxOyAgICAgICAgICAgICAgICAgICAvKiBlcnJvciBpbiBjb21wcmVzc2VkIGRhdGEgKi8KKyAgRFVNUEJJVFMoMTYpCisKKworICAvKiByZWFkIGFuZCBvdXRwdXQgdGhlIGNvbXByZXNzZWQgZGF0YSAqLworICB3aGlsZSAobi0tKQorICB7CisgICAgTkVFREJJVFMoOCkKKyAgICBzbGlkZVt3KytdID0gKHVjaCliOworICAgIGlmICh3ID09IFdTSVpFKQorICAgIHsKKyAgICAgIGZsdXNoX291dHB1dCh3KTsKKyAgICAgIHcgPSAwOworICAgIH0KKyAgICBEVU1QQklUUyg4KQorICB9CisKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWxzIGZyb20gdGhlIGxvY2FscyAqLworICB3cCA9IHc7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGdsb2JhbCB3aW5kb3cgcG9pbnRlciAqLworICBiYiA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIGdsb2JhbCBiaXQgYnVmZmVyICovCisgIGJrID0gazsKKworICBERUJHKCI+Iik7CisgIHJldHVybiAwOworCisgdW5kZXJydW46CisgIHJldHVybiA0OwkJCS8qIElucHV0IHVuZGVycnVuICovCit9CisKKworLyoKKyAqIFdlIHVzZSBgbm9pbmxpbmUnIGhlcmUgdG8gcHJldmVudCBnY2MtMy41IGZyb20gdXNpbmcgdG9vIG11Y2ggc3RhY2sgc3BhY2UKKyAqLworU1RBVElDIGludCBub2lubGluZSBJTklUIGluZmxhdGVfZml4ZWQodm9pZCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgdHlwZSAxIChmaXhlZCBIdWZmbWFuIGNvZGVzKSBibG9jay4gIFdlIHNob3VsZAorICAgZWl0aGVyIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGRlY29kZXIsIG9yIGF0IGxlYXN0IHByZWNvbXB1dGUgdGhlCisgICBIdWZmbWFuIHRhYmxlcy4gKi8KK3sKKyAgaW50IGk7ICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworICBzdHJ1Y3QgaHVmdCAqdGw7ICAgICAgLyogbGl0ZXJhbC9sZW5ndGggY29kZSB0YWJsZSAqLworICBzdHJ1Y3QgaHVmdCAqdGQ7ICAgICAgLyogZGlzdGFuY2UgY29kZSB0YWJsZSAqLworICBpbnQgYmw7ICAgICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRsICovCisgIGludCBiZDsgICAgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGQgKi8KKyAgdW5zaWduZWQgKmw7ICAgICAgICAgIC8qIGxlbmd0aCBsaXN0IGZvciBodWZ0X2J1aWxkICovCisKK0RFQkcoIjxmaXgiKTsKKworICBsID0gbWFsbG9jKHNpemVvZigqbCkgKiAyODgpOworICBpZiAobCA9PSBOVUxMKQorICAgIHJldHVybiAzOwkJCS8qIG91dCBvZiBtZW1vcnkgKi8KKworICAvKiBzZXQgdXAgbGl0ZXJhbCB0YWJsZSAqLworICBmb3IgKGkgPSAwOyBpIDwgMTQ0OyBpKyspCisgICAgbFtpXSA9IDg7CisgIGZvciAoOyBpIDwgMjU2OyBpKyspCisgICAgbFtpXSA9IDk7CisgIGZvciAoOyBpIDwgMjgwOyBpKyspCisgICAgbFtpXSA9IDc7CisgIGZvciAoOyBpIDwgMjg4OyBpKyspICAgICAgICAgIC8qIG1ha2UgYSBjb21wbGV0ZSwgYnV0IHdyb25nIGNvZGUgc2V0ICovCisgICAgbFtpXSA9IDg7CisgIGJsID0gNzsKKyAgaWYgKChpID0gaHVmdF9idWlsZChsLCAyODgsIDI1NywgY3BsZW5zLCBjcGxleHQsICZ0bCwgJmJsKSkgIT0gMCkgeworICAgIGZyZWUobCk7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvKiBzZXQgdXAgZGlzdGFuY2UgdGFibGUgKi8KKyAgZm9yIChpID0gMDsgaSA8IDMwOyBpKyspICAgICAgLyogbWFrZSBhbiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisgICAgbFtpXSA9IDU7CisgIGJkID0gNTsKKyAgaWYgKChpID0gaHVmdF9idWlsZChsLCAzMCwgMCwgY3BkaXN0LCBjcGRleHQsICZ0ZCwgJmJkKSkgPiAxKQorICB7CisgICAgaHVmdF9mcmVlKHRsKTsKKyAgICBmcmVlKGwpOworCisgICAgREVCRygiPiIpOworICAgIHJldHVybiBpOworICB9CisKKworICAvKiBkZWNvbXByZXNzIHVudGlsIGFuIGVuZC1vZi1ibG9jayBjb2RlICovCisgIGlmIChpbmZsYXRlX2NvZGVzKHRsLCB0ZCwgYmwsIGJkKSkgeworICAgIGZyZWUobCk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvKiBmcmVlIHRoZSBkZWNvZGluZyB0YWJsZXMsIHJldHVybiAqLworICBmcmVlKGwpOworICBodWZ0X2ZyZWUodGwpOworICBodWZ0X2ZyZWUodGQpOworICByZXR1cm4gMDsKK30KKworCisvKgorICogV2UgdXNlIGBub2lubGluZScgaGVyZSB0byBwcmV2ZW50IGdjYy0zLjUgZnJvbSB1c2luZyB0b28gbXVjaCBzdGFjayBzcGFjZQorICovCitTVEFUSUMgaW50IG5vaW5saW5lIElOSVQgaW5mbGF0ZV9keW5hbWljKHZvaWQpCisvKiBkZWNvbXByZXNzIGFuIGluZmxhdGVkIHR5cGUgMiAoZHluYW1pYyBIdWZmbWFuIGNvZGVzKSBibG9jay4gKi8KK3sKKyAgaW50IGk7ICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgKi8KKyAgdW5zaWduZWQgajsKKyAgdW5zaWduZWQgbDsgICAgICAgICAgIC8qIGxhc3QgbGVuZ3RoICovCisgIHVuc2lnbmVkIG07ICAgICAgICAgICAvKiBtYXNrIGZvciBiaXQgbGVuZ3RocyB0YWJsZSAqLworICB1bnNpZ25lZCBuOyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aHMgdG8gZ2V0ICovCisgIHN0cnVjdCBodWZ0ICp0bDsgICAgICAvKiBsaXRlcmFsL2xlbmd0aCBjb2RlIHRhYmxlICovCisgIHN0cnVjdCBodWZ0ICp0ZDsgICAgICAvKiBkaXN0YW5jZSBjb2RlIHRhYmxlICovCisgIGludCBibDsgICAgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KKyAgaW50IGJkOyAgICAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0ZCAqLworICB1bnNpZ25lZCBuYjsgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgKi8KKyAgdW5zaWduZWQgbmw7ICAgICAgICAgIC8qIG51bWJlciBvZiBsaXRlcmFsL2xlbmd0aCBjb2RlcyAqLworICB1bnNpZ25lZCBuZDsgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisgIHVuc2lnbmVkICpsbDsgICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgIHJlZ2lzdGVyIHVsZyBiOyAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGs7ICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisgIGludCByZXQ7CisKK0RFQkcoIjxkeW4iKTsKKworI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgIGxsID0gbWFsbG9jKHNpemVvZigqbGwpICogKDI4OCszMikpOyAgLyogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworI2Vsc2UKKyAgbGwgPSBtYWxsb2Moc2l6ZW9mKCpsbCkgKiAoMjg2KzMwKSk7ICAvKiBsaXRlcmFsL2xlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisjZW5kaWYKKworICBpZiAobGwgPT0gTlVMTCkKKyAgICByZXR1cm4gMTsKKworICAvKiBtYWtlIGxvY2FsIGJpdCBidWZmZXIgKi8KKyAgYiA9IGJiOworICBrID0gYms7CisKKworICAvKiByZWFkIGluIHRhYmxlIGxlbmd0aHMgKi8KKyAgTkVFREJJVFMoNSkKKyAgbmwgPSAyNTcgKyAoKHVuc2lnbmVkKWIgJiAweDFmKTsgICAgICAvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKyAgRFVNUEJJVFMoNSkKKyAgTkVFREJJVFMoNSkKKyAgbmQgPSAxICsgKCh1bnNpZ25lZCliICYgMHgxZik7ICAgICAgICAvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgRFVNUEJJVFMoNSkKKyAgTkVFREJJVFMoNCkKKyAgbmIgPSA0ICsgKCh1bnNpZ25lZCliICYgMHhmKTsgICAgICAgICAvKiBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyAqLworICBEVU1QQklUUyg0KQorI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgIGlmIChubCA+IDI4OCB8fCBuZCA+IDMyKQorI2Vsc2UKKyAgaWYgKG5sID4gMjg2IHx8IG5kID4gMzApCisjZW5kaWYKKyAgeworICAgIHJldCA9IDE7ICAgICAgICAgICAgIC8qIGJhZCBsZW5ndGhzICovCisgICAgZ290byBvdXQ7CisgIH0KKworREVCRygiZHluMSAiKTsKKworICAvKiByZWFkIGluIGJpdC1sZW5ndGgtY29kZSBsZW5ndGhzICovCisgIGZvciAoaiA9IDA7IGogPCBuYjsgaisrKQorICB7CisgICAgTkVFREJJVFMoMykKKyAgICBsbFtib3JkZXJbal1dID0gKHVuc2lnbmVkKWIgJiA3OworICAgIERVTVBCSVRTKDMpCisgIH0KKyAgZm9yICg7IGogPCAxOTsgaisrKQorICAgIGxsW2JvcmRlcltqXV0gPSAwOworCitERUJHKCJkeW4yICIpOworCisgIC8qIGJ1aWxkIGRlY29kaW5nIHRhYmxlIGZvciB0cmVlcy0tc2luZ2xlIGxldmVsLCA3IGJpdCBsb29rdXAgKi8KKyAgYmwgPSA3OworICBpZiAoKGkgPSBodWZ0X2J1aWxkKGxsLCAxOSwgMTksIE5VTEwsIE5VTEwsICZ0bCwgJmJsKSkgIT0gMCkKKyAgeworICAgIGlmIChpID09IDEpCisgICAgICBodWZ0X2ZyZWUodGwpOworICAgIHJldCA9IGk7ICAgICAgICAgICAgICAgICAgIC8qIGluY29tcGxldGUgY29kZSBzZXQgKi8KKyAgICBnb3RvIG91dDsKKyAgfQorCitERUJHKCJkeW4zICIpOworCisgIC8qIHJlYWQgaW4gbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZSBsZW5ndGhzICovCisgIG4gPSBubCArIG5kOworICBtID0gbWFza19iaXRzW2JsXTsKKyAgaSA9IGwgPSAwOworICB3aGlsZSAoKHVuc2lnbmVkKWkgPCBuKQorICB7CisgICAgTkVFREJJVFMoKHVuc2lnbmVkKWJsKQorICAgIGogPSAodGQgPSB0bCArICgodW5zaWduZWQpYiAmIG0pKS0+YjsKKyAgICBEVU1QQklUUyhqKQorICAgIGogPSB0ZC0+di5uOworICAgIGlmIChqIDwgMTYpICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY29kZSBpbiBiaXRzICgwLi4xNSkgKi8KKyAgICAgIGxsW2krK10gPSBsID0gajsgICAgICAgICAgLyogc2F2ZSBsYXN0IGxlbmd0aCBpbiBsICovCisgICAgZWxzZSBpZiAoaiA9PSAxNikgICAgICAgICAgIC8qIHJlcGVhdCBsYXN0IGxlbmd0aCAzIHRvIDYgdGltZXMgKi8KKyAgICB7CisgICAgICBORUVEQklUUygyKQorICAgICAgaiA9IDMgKyAoKHVuc2lnbmVkKWIgJiAzKTsKKyAgICAgIERVTVBCSVRTKDIpCisgICAgICBpZiAoKHVuc2lnbmVkKWkgKyBqID4gbikgeworICAgICAgICByZXQgPSAxOworCWdvdG8gb3V0OworICAgICAgfQorICAgICAgd2hpbGUgKGotLSkKKyAgICAgICAgbGxbaSsrXSA9IGw7CisgICAgfQorICAgIGVsc2UgaWYgKGogPT0gMTcpICAgICAgICAgICAvKiAzIHRvIDEwIHplcm8gbGVuZ3RoIGNvZGVzICovCisgICAgeworICAgICAgTkVFREJJVFMoMykKKyAgICAgIGogPSAzICsgKCh1bnNpZ25lZCliICYgNyk7CisgICAgICBEVU1QQklUUygzKQorICAgICAgaWYgKCh1bnNpZ25lZClpICsgaiA+IG4pIHsKKyAgICAgICAgcmV0ID0gMTsKKwlnb3RvIG91dDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIGxsW2krK10gPSAwOworICAgICAgbCA9IDA7CisgICAgfQorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAvKiBqID09IDE4OiAxMSB0byAxMzggemVybyBsZW5ndGggY29kZXMgKi8KKyAgICB7CisgICAgICBORUVEQklUUyg3KQorICAgICAgaiA9IDExICsgKCh1bnNpZ25lZCliICYgMHg3Zik7CisgICAgICBEVU1QQklUUyg3KQorICAgICAgaWYgKCh1bnNpZ25lZClpICsgaiA+IG4pIHsKKyAgICAgICAgcmV0ID0gMTsKKwlnb3RvIG91dDsKKyAgICAgIH0KKyAgICAgIHdoaWxlIChqLS0pCisgICAgICAgIGxsW2krK10gPSAwOworICAgICAgbCA9IDA7CisgICAgfQorICB9CisKK0RFQkcoImR5bjQgIik7CisKKyAgLyogZnJlZSBkZWNvZGluZyB0YWJsZSBmb3IgdHJlZXMgKi8KKyAgaHVmdF9mcmVlKHRsKTsKKworREVCRygiZHluNSAiKTsKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICBiYiA9IGI7CisgIGJrID0gazsKKworREVCRygiZHluNWEgIik7CisKKyAgLyogYnVpbGQgdGhlIGRlY29kaW5nIHRhYmxlcyBmb3IgbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGVzICovCisgIGJsID0gbGJpdHM7CisgIGlmICgoaSA9IGh1ZnRfYnVpbGQobGwsIG5sLCAyNTcsIGNwbGVucywgY3BsZXh0LCAmdGwsICZibCkpICE9IDApCisgIHsKK0RFQkcoImR5bjViICIpOworICAgIGlmIChpID09IDEpIHsKKyAgICAgIGVycm9yKCJpbmNvbXBsZXRlIGxpdGVyYWwgdHJlZSIpOworICAgICAgaHVmdF9mcmVlKHRsKTsKKyAgICB9CisgICAgcmV0ID0gaTsgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBjb2RlIHNldCAqLworICAgIGdvdG8gb3V0OworICB9CitERUJHKCJkeW41YyAiKTsKKyAgYmQgPSBkYml0czsKKyAgaWYgKChpID0gaHVmdF9idWlsZChsbCArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsICZ0ZCwgJmJkKSkgIT0gMCkKKyAgeworREVCRygiZHluNWQgIik7CisgICAgaWYgKGkgPT0gMSkgeworICAgICAgZXJyb3IoImluY29tcGxldGUgZGlzdGFuY2UgdHJlZSIpOworI2lmZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECisgICAgICBpID0gMDsKKyAgICB9CisjZWxzZQorICAgICAgaHVmdF9mcmVlKHRkKTsKKyAgICB9CisgICAgaHVmdF9mcmVlKHRsKTsKKyAgICByZXQgPSBpOyAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisgICAgZ290byBvdXQ7CisjZW5kaWYKKyAgfQorCitERUJHKCJkeW42ICIpOworCisgIC8qIGRlY29tcHJlc3MgdW50aWwgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KKyAgaWYgKGluZmxhdGVfY29kZXModGwsIHRkLCBibCwgYmQpKSB7CisgICAgcmV0ID0gMTsKKyAgICBnb3RvIG91dDsKKyAgfQorCitERUJHKCJkeW43ICIpOworCisgIC8qIGZyZWUgdGhlIGRlY29kaW5nIHRhYmxlcywgcmV0dXJuICovCisgIGh1ZnRfZnJlZSh0bCk7CisgIGh1ZnRfZnJlZSh0ZCk7CisKKyAgREVCRygiPiIpOworICByZXQgPSAwOworb3V0OgorICBmcmVlKGxsKTsKKyAgcmV0dXJuIHJldDsKKwordW5kZXJydW46CisgIHJldCA9IDQ7CQkJLyogSW5wdXQgdW5kZXJydW4gKi8KKyAgZ290byBvdXQ7Cit9CisKKworCitTVEFUSUMgaW50IElOSVQgaW5mbGF0ZV9ibG9jaygKKwlpbnQgKmUgICAgICAgICAgICAgICAgICAvKiBsYXN0IGJsb2NrIGZsYWcgKi8KKwkpCisvKiBkZWNvbXByZXNzIGFuIGluZmxhdGVkIGJsb2NrICovCit7CisgIHVuc2lnbmVkIHQ7ICAgICAgICAgICAvKiBibG9jayB0eXBlICovCisgIHJlZ2lzdGVyIHVsZyBiOyAgICAgICAvKiBiaXQgYnVmZmVyICovCisgIHJlZ2lzdGVyIHVuc2lnbmVkIGs7ICAvKiBudW1iZXIgb2YgYml0cyBpbiBiaXQgYnVmZmVyICovCisKKyAgREVCRygiPGJsayIpOworCisgIC8qIG1ha2UgbG9jYWwgYml0IGJ1ZmZlciAqLworICBiID0gYmI7CisgIGsgPSBiazsKKworCisgIC8qIHJlYWQgaW4gbGFzdCBibG9jayBiaXQgKi8KKyAgTkVFREJJVFMoMSkKKyAgKmUgPSAoaW50KWIgJiAxOworICBEVU1QQklUUygxKQorCisKKyAgLyogcmVhZCBpbiBibG9jayB0eXBlICovCisgIE5FRURCSVRTKDIpCisgIHQgPSAodW5zaWduZWQpYiAmIDM7CisgIERVTVBCSVRTKDIpCisKKworICAvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworICBiYiA9IGI7CisgIGJrID0gazsKKworICAvKiBpbmZsYXRlIHRoYXQgYmxvY2sgdHlwZSAqLworICBpZiAodCA9PSAyKQorICAgIHJldHVybiBpbmZsYXRlX2R5bmFtaWMoKTsKKyAgaWYgKHQgPT0gMCkKKyAgICByZXR1cm4gaW5mbGF0ZV9zdG9yZWQoKTsKKyAgaWYgKHQgPT0gMSkKKyAgICByZXR1cm4gaW5mbGF0ZV9maXhlZCgpOworCisgIERFQkcoIj4iKTsKKworICAvKiBiYWQgYmxvY2sgdHlwZSAqLworICByZXR1cm4gMjsKKworIHVuZGVycnVuOgorICByZXR1cm4gNDsJCQkvKiBJbnB1dCB1bmRlcnJ1biAqLworfQorCisKKworU1RBVElDIGludCBJTklUIGluZmxhdGUodm9pZCkKKy8qIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgZW50cnkgKi8KK3sKKyAgaW50IGU7ICAgICAgICAgICAgICAgIC8qIGxhc3QgYmxvY2sgZmxhZyAqLworICBpbnQgcjsgICAgICAgICAgICAgICAgLyogcmVzdWx0IGNvZGUgKi8KKyAgdW5zaWduZWQgaDsgICAgICAgICAgIC8qIG1heGltdW0gc3RydWN0IGh1ZnQncyBtYWxsb2MnZWQgKi8KKworICAvKiBpbml0aWFsaXplIHdpbmRvdywgYml0IGJ1ZmZlciAqLworICB3cCA9IDA7CisgIGJrID0gMDsKKyAgYmIgPSAwOworCisKKyAgLyogZGVjb21wcmVzcyB1bnRpbCB0aGUgbGFzdCBibG9jayAqLworICBoID0gMDsKKyAgZG8geworICAgIGh1ZnRzID0gMDsKKyNpZmRlZiBBUkNIX0hBU19ERUNPTVBfV0RPRworICAgIGFyY2hfZGVjb21wX3dkb2coKTsKKyNlbmRpZgorICAgIHIgPSBpbmZsYXRlX2Jsb2NrKCZlKTsKKyAgICBpZiAocikKKwkgICAgcmV0dXJuIHI7CisgICAgaWYgKGh1ZnRzID4gaCkKKyAgICAgIGggPSBodWZ0czsKKyAgfSB3aGlsZSAoIWUpOworCisgIC8qIFVuZG8gdG9vIG11Y2ggbG9va2FoZWFkLiBUaGUgbmV4dCByZWFkIHdpbGwgYmUgYnl0ZSBhbGlnbmVkIHNvIHdlCisgICAqIGNhbiBkaXNjYXJkIHVudXNlZCBiaXRzIGluIHRoZSBsYXN0IG1lYW5pbmdmdWwgYnl0ZS4KKyAgICovCisgIHdoaWxlIChiayA+PSA4KSB7CisgICAgYmsgLT0gODsKKyAgICBpbnB0ci0tOworICB9CisKKyAgLyogZmx1c2ggb3V0IHNsaWRlICovCisgIGZsdXNoX291dHB1dCh3cCk7CisKKworICAvKiByZXR1cm4gc3VjY2VzcyAqLworI2lmZGVmIERFQlVHCisgIGZwcmludGYoc3RkZXJyLCAiPCV1PiAiLCBoKTsKKyNlbmRpZiAvKiBERUJVRyAqLworICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgZm9sbG93aW5nIGFyZSBzdXBwb3J0IHJvdXRpbmVzIGZvciBpbmZsYXRlLmMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHVsZyBjcmNfMzJfdGFiWzI1Nl07CitzdGF0aWMgdWxnIGNyYzsJCS8qIGluaXRpYWxpemVkIGluIG1ha2VjcmMoKSBzbyBpdCdsbCByZXNpZGUgaW4gYnNzICovCisjZGVmaW5lIENSQ19WQUxVRSAoY3JjIF4gMHhmZmZmZmZmZlVMKQorCisvKgorICogQ29kZSB0byBjb21wdXRlIHRoZSBDUkMtMzIgdGFibGUuIEJvcnJvd2VkIGZyb20gCisgKiBnemlwLTEuMC4zL21ha2VjcmMuYy4KKyAqLworCitzdGF0aWMgdm9pZCBJTklUCittYWtlY3JjKHZvaWQpCit7CisvKiBOb3QgY29weXJpZ2h0ZWQgMTk5MCBNYXJrIEFkbGVyCSovCisKKyAgdW5zaWduZWQgbG9uZyBjOyAgICAgIC8qIGNyYyBzaGlmdCByZWdpc3RlciAqLworICB1bnNpZ25lZCBsb25nIGU7ICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLworICBpbnQgaTsgICAgICAgICAgICAgICAgLyogY291bnRlciBmb3IgYWxsIHBvc3NpYmxlIGVpZ2h0IGJpdCB2YWx1ZXMgKi8KKyAgaW50IGs7ICAgICAgICAgICAgICAgIC8qIGJ5dGUgYmVpbmcgc2hpZnRlZCBpbnRvIGNyYyBhcHBhcmF0dXMgKi8KKworICAvKiB0ZXJtcyBvZiBwb2x5bm9taWFsIGRlZmluaW5nIHRoaXMgY3JjIChleGNlcHQgeF4zMik6ICovCisgIHN0YXRpYyBjb25zdCBpbnQgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OworCisgIC8qIE1ha2UgZXhjbHVzaXZlLW9yIHBhdHRlcm4gZnJvbSBwb2x5bm9taWFsICovCisgIGUgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHApL3NpemVvZihpbnQpOyBpKyspCisgICAgZSB8PSAxTCA8PCAoMzEgLSBwW2ldKTsKKworICBjcmNfMzJfdGFiWzBdID0gMDsKKworICBmb3IgKGkgPSAxOyBpIDwgMjU2OyBpKyspCisgIHsKKyAgICBjID0gMDsKKyAgICBmb3IgKGsgPSBpIHwgMjU2OyBrICE9IDE7IGsgPj49IDEpCisgICAgeworICAgICAgYyA9IGMgJiAxID8gKGMgPj4gMSkgXiBlIDogYyA+PiAxOworICAgICAgaWYgKGsgJiAxKQorICAgICAgICBjIF49IGU7CisgICAgfQorICAgIGNyY18zMl90YWJbaV0gPSBjOworICB9CisKKyAgLyogdGhpcyBpcyBpbml0aWFsaXplZCBoZXJlIHNvIHRoaXMgY29kZSBjb3VsZCByZXNpZGUgaW4gUk9NICovCisgIGNyYyA9ICh1bGcpMHhmZmZmZmZmZlVMOyAvKiBzaGlmdCByZWdpc3RlciBjb250ZW50cyAqLworfQorCisvKiBnemlwIGZsYWcgYnl0ZSAqLworI2RlZmluZSBBU0NJSV9GTEFHICAgMHgwMSAvKiBiaXQgMCBzZXQ6IGZpbGUgcHJvYmFibHkgQVNDSUkgdGV4dCAqLworI2RlZmluZSBDT05USU5VQVRJT04gMHgwMiAvKiBiaXQgMSBzZXQ6IGNvbnRpbnVhdGlvbiBvZiBtdWx0aS1wYXJ0IGd6aXAgZmlsZSAqLworI2RlZmluZSBFWFRSQV9GSUVMRCAgMHgwNCAvKiBiaXQgMiBzZXQ6IGV4dHJhIGZpZWxkIHByZXNlbnQgKi8KKyNkZWZpbmUgT1JJR19OQU1FICAgIDB4MDggLyogYml0IDMgc2V0OiBvcmlnaW5hbCBmaWxlIG5hbWUgcHJlc2VudCAqLworI2RlZmluZSBDT01NRU5UICAgICAgMHgxMCAvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisjZGVmaW5lIEVOQ1JZUFRFRCAgICAweDIwIC8qIGJpdCA1IHNldDogZmlsZSBpcyBlbmNyeXB0ZWQgKi8KKyNkZWZpbmUgUkVTRVJWRUQgICAgIDB4QzAgLyogYml0IDYsNzogICByZXNlcnZlZCAqLworCisvKgorICogRG8gdGhlIHVuY29tcHJlc3Npb24hCisgKi8KK3N0YXRpYyBpbnQgSU5JVCBndW56aXAodm9pZCkKK3sKKyAgICB1Y2ggZmxhZ3M7CisgICAgdW5zaWduZWQgY2hhciBtYWdpY1syXTsgLyogbWFnaWMgaGVhZGVyICovCisgICAgY2hhciBtZXRob2Q7CisgICAgdWxnIG9yaWdfY3JjID0gMDsgICAgICAgLyogb3JpZ2luYWwgY3JjICovCisgICAgdWxnIG9yaWdfbGVuID0gMDsgICAgICAgLyogb3JpZ2luYWwgdW5jb21wcmVzc2VkIGxlbmd0aCAqLworICAgIGludCByZXM7CisKKyAgICBtYWdpY1swXSA9IE5FWFRCWVRFKCk7CisgICAgbWFnaWNbMV0gPSBORVhUQllURSgpOworICAgIG1ldGhvZCAgID0gTkVYVEJZVEUoKTsKKworICAgIGlmIChtYWdpY1swXSAhPSAwMzcgfHwKKwkoKG1hZ2ljWzFdICE9IDAyMTMpICYmIChtYWdpY1sxXSAhPSAwMjM2KSkpIHsKKwkgICAgZXJyb3IoImJhZCBnemlwIG1hZ2ljIG51bWJlcnMiKTsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIFdlIG9ubHkgc3VwcG9ydCBtZXRob2QgIzgsIERFRkxBVEVEICovCisgICAgaWYgKG1ldGhvZCAhPSA4KSAgeworCSAgICBlcnJvcigiaW50ZXJuYWwgZXJyb3IsIGludmFsaWQgbWV0aG9kIik7CisJICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmbGFncyAgPSAodWNoKWdldF9ieXRlKCk7CisgICAgaWYgKChmbGFncyAmIEVOQ1JZUFRFRCkgIT0gMCkgeworCSAgICBlcnJvcigiSW5wdXQgaXMgZW5jcnlwdGVkIik7CisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChmbGFncyAmIENPTlRJTlVBVElPTikgIT0gMCkgeworCSAgICBlcnJvcigiTXVsdGkgcGFydCBpbnB1dCIpOworCSAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoZmxhZ3MgJiBSRVNFUlZFRCkgIT0gMCkgeworCSAgICBlcnJvcigiSW5wdXQgaGFzIGludmFsaWQgZmxhZ3MiKTsKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBORVhUQllURSgpOwkvKiBHZXQgdGltZXN0YW1wICovCisgICAgTkVYVEJZVEUoKTsKKyAgICBORVhUQllURSgpOworICAgIE5FWFRCWVRFKCk7CisKKyAgICAodm9pZClORVhUQllURSgpOyAgLyogSWdub3JlIGV4dHJhIGZsYWdzIGZvciB0aGUgbW9tZW50ICovCisgICAgKHZvaWQpTkVYVEJZVEUoKTsgIC8qIElnbm9yZSBPUyB0eXBlIGZvciB0aGUgbW9tZW50ICovCisKKyAgICBpZiAoKGZsYWdzICYgRVhUUkFfRklFTEQpICE9IDApIHsKKwkgICAgdW5zaWduZWQgbGVuID0gKHVuc2lnbmVkKU5FWFRCWVRFKCk7CisJICAgIGxlbiB8PSAoKHVuc2lnbmVkKU5FWFRCWVRFKCkpPDw4OworCSAgICB3aGlsZSAobGVuLS0pICh2b2lkKU5FWFRCWVRFKCk7CisgICAgfQorCisgICAgLyogR2V0IG9yaWdpbmFsIGZpbGUgbmFtZSBpZiBpdCB3YXMgdHJ1bmNhdGVkICovCisgICAgaWYgKChmbGFncyAmIE9SSUdfTkFNRSkgIT0gMCkgeworCSAgICAvKiBEaXNjYXJkIHRoZSBvbGQgbmFtZSAqLworCSAgICB3aGlsZSAoTkVYVEJZVEUoKSAhPSAwKSAvKiBudWxsICovIDsKKyAgICB9IAorCisgICAgLyogRGlzY2FyZCBmaWxlIGNvbW1lbnQgaWYgYW55ICovCisgICAgaWYgKChmbGFncyAmIENPTU1FTlQpICE9IDApIHsKKwkgICAgd2hpbGUgKE5FWFRCWVRFKCkgIT0gMCkgLyogbnVsbCAqLyA7CisgICAgfQorCisgICAgLyogRGVjb21wcmVzcyAqLworICAgIGlmICgocmVzID0gaW5mbGF0ZSgpKSkgeworCSAgICBzd2l0Y2ggKHJlcykgeworCSAgICBjYXNlIDA6CisJCSAgICBicmVhazsKKwkgICAgY2FzZSAxOgorCQkgICAgZXJyb3IoImludmFsaWQgY29tcHJlc3NlZCBmb3JtYXQgKGVycj0xKSIpOworCQkgICAgYnJlYWs7CisJICAgIGNhc2UgMjoKKwkJICAgIGVycm9yKCJpbnZhbGlkIGNvbXByZXNzZWQgZm9ybWF0IChlcnI9MikiKTsKKwkJICAgIGJyZWFrOworCSAgICBjYXNlIDM6CisJCSAgICBlcnJvcigib3V0IG9mIG1lbW9yeSIpOworCQkgICAgYnJlYWs7CisJICAgIGNhc2UgNDoKKwkJICAgIGVycm9yKCJvdXQgb2YgaW5wdXQgZGF0YSIpOworCQkgICAgYnJlYWs7CisJICAgIGRlZmF1bHQ6CisJCSAgICBlcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGZvcm1hdCAob3RoZXIpIik7CisJICAgIH0KKwkgICAgcmV0dXJuIC0xOworICAgIH0KKwkgICAgCisgICAgLyogR2V0IHRoZSBjcmMgYW5kIG9yaWdpbmFsIGxlbmd0aCAqLworICAgIC8qIGNyYzMyICAoc2VlIGFsZ29yaXRobS5kb2MpCisgICAgICogdW5jb21wcmVzc2VkIGlucHV0IHNpemUgbW9kdWxvIDJeMzIKKyAgICAgKi8KKyAgICBvcmlnX2NyYyA9ICh1bGcpIE5FWFRCWVRFKCk7CisgICAgb3JpZ19jcmMgfD0gKHVsZykgTkVYVEJZVEUoKSA8PCA4OworICAgIG9yaWdfY3JjIHw9ICh1bGcpIE5FWFRCWVRFKCkgPDwgMTY7CisgICAgb3JpZ19jcmMgfD0gKHVsZykgTkVYVEJZVEUoKSA8PCAyNDsKKyAgICAKKyAgICBvcmlnX2xlbiA9ICh1bGcpIE5FWFRCWVRFKCk7CisgICAgb3JpZ19sZW4gfD0gKHVsZykgTkVYVEJZVEUoKSA8PCA4OworICAgIG9yaWdfbGVuIHw9ICh1bGcpIE5FWFRCWVRFKCkgPDwgMTY7CisgICAgb3JpZ19sZW4gfD0gKHVsZykgTkVYVEJZVEUoKSA8PCAyNDsKKyAgICAKKyAgICAvKiBWYWxpZGF0ZSBkZWNvbXByZXNzaW9uICovCisgICAgaWYgKG9yaWdfY3JjICE9IENSQ19WQUxVRSkgeworCSAgICBlcnJvcigiY3JjIGVycm9yIik7CisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG9yaWdfbGVuICE9IGJ5dGVzX291dCkgeworCSAgICBlcnJvcigibGVuZ3RoIGVycm9yIik7CisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7CisKKyB1bmRlcnJ1bjoJCQkvKiBORVhUQllURSgpIGdvdG8ncyBoZXJlIGlmIG5lZWRlZCAqLworICAgIGVycm9yKCJvdXQgb2YgaW5wdXQgZGF0YSIpOworICAgIHJldHVybiAtMTsKK30KKworCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pbnRfc3FydC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW50X3NxcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2JiMzAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW50X3NxcnQuYwpAQCAtMCwwICsxLDQwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBEYXZpZGxvaHIgQnVlc28gPGRhdmlkbG9oci5idWVzb0BocC5jb20+CisgKgorICogIEJhc2VkIG9uIHRoZSBzaGlmdC1hbmQtc3VidHJhY3QgYWxnb3JpdGhtIGZvciBjb21wdXRpbmcgaW50ZWdlcgorICogIHNxdWFyZSByb290IGZyb20gR3V5IEwuIFN0ZWVsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisKKy8qKgorICogaW50X3NxcnQgLSByb3VnaCBhcHByb3hpbWF0aW9uIHRvIHNxcnQKKyAqIEB4OiBpbnRlZ2VyIG9mIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgc3FydAorICoKKyAqIEEgdmVyeSByb3VnaCBhcHByb3hpbWF0aW9uIHRvIHRoZSBzcXJ0KCkgZnVuY3Rpb24uCisgKi8KK3Vuc2lnbmVkIGxvbmcgaW50X3NxcnQodW5zaWduZWQgbG9uZyB4KQoreworCXVuc2lnbmVkIGxvbmcgYiwgbSwgeSA9IDA7CisKKwlpZiAoeCA8PSAxKQorCQlyZXR1cm4geDsKKworCW0gPSAxVUwgPDwgKF9fZmxzKHgpICYgfjFVTCk7CisJd2hpbGUgKG0gIT0gMCkgeworCQliID0geSArIG07CisJCXkgPj49IDE7CisKKwkJaWYgKHggPj0gYikgeworCQkJeCAtPSBiOworCQkJeSArPSBtOworCQl9CisJCW0gPj49IDI7CisJfQorCisJcmV0dXJuIHk7Cit9CitFWFBPUlRfU1lNQk9MKGludF9zcXJ0KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ludGVydmFsX3RyZWUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2ludGVydmFsX3RyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODVmNjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW50ZXJ2YWxfdHJlZS5jCkBAIC0wLDAgKzEsMTYgQEAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnZhbF90cmVlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJ2YWxfdHJlZV9nZW5lcmljLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2RlZmluZSBTVEFSVChub2RlKSAoKG5vZGUpLT5zdGFydCkKKyNkZWZpbmUgTEFTVChub2RlKSAgKChub2RlKS0+bGFzdCkKKworSU5URVJWQUxfVFJFRV9ERUZJTkUoc3RydWN0IGludGVydmFsX3RyZWVfbm9kZSwgcmIsCisJCSAgICAgdW5zaWduZWQgbG9uZywgX19zdWJ0cmVlX2xhc3QsCisJCSAgICAgU1RBUlQsIExBU1QsLCBpbnRlcnZhbF90cmVlKQorCitFWFBPUlRfU1lNQk9MX0dQTChpbnRlcnZhbF90cmVlX2luc2VydCk7CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlcnZhbF90cmVlX3JlbW92ZSk7CitFWFBPUlRfU1lNQk9MX0dQTChpbnRlcnZhbF90cmVlX2l0ZXJfZmlyc3QpOworRVhQT1JUX1NZTUJPTF9HUEwoaW50ZXJ2YWxfdHJlZV9pdGVyX25leHQpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW50ZXJ2YWxfdHJlZV90ZXN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pbnRlcnZhbF90cmVlX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzUyNDJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW50ZXJ2YWxfdHJlZV90ZXN0LmMKQEAgLTAsMCArMSwxMzcgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVydmFsX3RyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8YXNtL3RpbWV4Lmg+CisKKyNkZWZpbmUgX19wYXJhbSh0eXBlLCBuYW1lLCBpbml0LCBtc2cpCQlcCisJc3RhdGljIHR5cGUgbmFtZSA9IGluaXQ7CQlcCisJbW9kdWxlX3BhcmFtKG5hbWUsIHR5cGUsIDA0NDQpOwkJXAorCU1PRFVMRV9QQVJNX0RFU0MobmFtZSwgbXNnKTsKKworX19wYXJhbShpbnQsIG5ub2RlcywgMTAwLCAiTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBpbnRlcnZhbCB0cmVlIik7CitfX3BhcmFtKGludCwgcGVyZl9sb29wcywgMTAwMCwgIk51bWJlciBvZiBpdGVyYXRpb25zIG1vZGlmeWluZyB0aGUgdHJlZSIpOworCitfX3BhcmFtKGludCwgbnNlYXJjaGVzLCAxMDAsICJOdW1iZXIgb2Ygc2VhcmNoZXMgdG8gdGhlIGludGVydmFsIHRyZWUiKTsKK19fcGFyYW0oaW50LCBzZWFyY2hfbG9vcHMsIDEwMDAsICJOdW1iZXIgb2YgaXRlcmF0aW9ucyBzZWFyY2hpbmcgdGhlIHRyZWUiKTsKK19fcGFyYW0oYm9vbCwgc2VhcmNoX2FsbCwgZmFsc2UsICJTZWFyY2hlcyB3aWxsIGl0ZXJhdGUgYWxsIG5vZGVzIGluIHRoZSB0cmVlIik7CisKK19fcGFyYW0odWludCwgbWF4X2VuZHBvaW50LCB+MCwgIkxhcmdlc3QgdmFsdWUgZm9yIHRoZSBpbnRlcnZhbCdzIGVuZHBvaW50Iik7CisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdF9jYWNoZWQgcm9vdCA9IFJCX1JPT1RfQ0FDSEVEOworc3RhdGljIHN0cnVjdCBpbnRlcnZhbF90cmVlX25vZGUgKm5vZGVzID0gTlVMTDsKK3N0YXRpYyB1MzIgKnF1ZXJpZXMgPSBOVUxMOworCitzdGF0aWMgc3RydWN0IHJuZF9zdGF0ZSBybmQ7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworc2VhcmNoKHN0cnVjdCByYl9yb290X2NhY2hlZCAqcm9vdCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBsYXN0KQoreworCXN0cnVjdCBpbnRlcnZhbF90cmVlX25vZGUgKm5vZGU7CisJdW5zaWduZWQgbG9uZyByZXN1bHRzID0gMDsKKworCWZvciAobm9kZSA9IGludGVydmFsX3RyZWVfaXRlcl9maXJzdChyb290LCBzdGFydCwgbGFzdCk7IG5vZGU7CisJICAgICBub2RlID0gaW50ZXJ2YWxfdHJlZV9pdGVyX25leHQobm9kZSwgc3RhcnQsIGxhc3QpKQorCQlyZXN1bHRzKys7CisJcmV0dXJuIHJlc3VsdHM7Cit9CisKK3N0YXRpYyB2b2lkIGluaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBubm9kZXM7IGkrKykgeworCQl1MzIgYiA9IChwcmFuZG9tX3UzMl9zdGF0ZSgmcm5kKSA+PiA0KSAlIG1heF9lbmRwb2ludDsKKwkJdTMyIGEgPSAocHJhbmRvbV91MzJfc3RhdGUoJnJuZCkgPj4gNCkgJSBiOworCisJCW5vZGVzW2ldLnN0YXJ0ID0gYTsKKwkJbm9kZXNbaV0ubGFzdCA9IGI7CisJfQorCisJLyoKKwkgKiBMaW1pdCB0aGUgc2VhcmNoIHNjb3BlIHRvIHdoYXQgdGhlIHVzZXIgZGVmaW5lZC4KKwkgKiBPdGhlcndpc2Ugd2UgYXJlIG1lcmVseSBtZWFzdXJpbmcgZW1wdHkgd2Fsa3MsCisJICogd2hpY2ggaXMgcG9pbnRsZXNzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBuc2VhcmNoZXM7IGkrKykKKwkJcXVlcmllc1tpXSA9IChwcmFuZG9tX3UzMl9zdGF0ZSgmcm5kKSA+PiA0KSAlIG1heF9lbmRwb2ludDsKK30KKworc3RhdGljIGludCBpbnRlcnZhbF90cmVlX3Rlc3RfaW5pdCh2b2lkKQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGxvbmcgcmVzdWx0czsKKwljeWNsZXNfdCB0aW1lMSwgdGltZTIsIHRpbWU7CisKKwlub2RlcyA9IGttYWxsb2Mobm5vZGVzICogc2l6ZW9mKHN0cnVjdCBpbnRlcnZhbF90cmVlX25vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXF1ZXJpZXMgPSBrbWFsbG9jKG5zZWFyY2hlcyAqIHNpemVvZihpbnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXF1ZXJpZXMpIHsKKwkJa2ZyZWUobm9kZXMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwcmludGsoS0VSTl9BTEVSVCAiaW50ZXJ2YWwgdHJlZSBpbnNlcnQvcmVtb3ZlIik7CisKKwlwcmFuZG9tX3NlZWRfc3RhdGUoJnJuZCwgMzE0MTU5MjY1MzU4OTc5MzIzOFVMTCk7CisJaW5pdCgpOworCisJdGltZTEgPSBnZXRfY3ljbGVzKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGVyZl9sb29wczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBubm9kZXM7IGorKykKKwkJCWludGVydmFsX3RyZWVfaW5zZXJ0KG5vZGVzICsgaiwgJnJvb3QpOworCQlmb3IgKGogPSAwOyBqIDwgbm5vZGVzOyBqKyspCisJCQlpbnRlcnZhbF90cmVlX3JlbW92ZShub2RlcyArIGosICZyb290KTsKKwl9CisKKwl0aW1lMiA9IGdldF9jeWNsZXMoKTsKKwl0aW1lID0gdGltZTIgLSB0aW1lMTsKKworCXRpbWUgPSBkaXZfdTY0KHRpbWUsIHBlcmZfbG9vcHMpOworCXByaW50aygiIC0+ICVsbHUgY3ljbGVzXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKXRpbWUpOworCisJcHJpbnRrKEtFUk5fQUxFUlQgImludGVydmFsIHRyZWUgc2VhcmNoIik7CisKKwlmb3IgKGogPSAwOyBqIDwgbm5vZGVzOyBqKyspCisJCWludGVydmFsX3RyZWVfaW5zZXJ0KG5vZGVzICsgaiwgJnJvb3QpOworCisJdGltZTEgPSBnZXRfY3ljbGVzKCk7CisKKwlyZXN1bHRzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2VhcmNoX2xvb3BzOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBuc2VhcmNoZXM7IGorKykgeworCQkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHNlYXJjaF9hbGwgPyAwIDogcXVlcmllc1tqXTsKKwkJCXVuc2lnbmVkIGxvbmcgbGFzdCA9IHNlYXJjaF9hbGwgPyBtYXhfZW5kcG9pbnQgOiBxdWVyaWVzW2pdOworCisJCQlyZXN1bHRzICs9IHNlYXJjaCgmcm9vdCwgc3RhcnQsIGxhc3QpOworCQl9CisKKwl0aW1lMiA9IGdldF9jeWNsZXMoKTsKKwl0aW1lID0gdGltZTIgLSB0aW1lMTsKKworCXRpbWUgPSBkaXZfdTY0KHRpbWUsIHNlYXJjaF9sb29wcyk7CisJcmVzdWx0cyA9IGRpdl91NjQocmVzdWx0cywgc2VhcmNoX2xvb3BzKTsKKwlwcmludGsoIiAtPiAlbGx1IGN5Y2xlcyAoJWx1IHJlc3VsdHMpXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRpbWUsIHJlc3VsdHMpOworCisJa2ZyZWUocXVlcmllcyk7CisJa2ZyZWUobm9kZXMpOworCisJcmV0dXJuIC1FQUdBSU47IC8qIEZhaWwgd2lsbCBkaXJlY3RseSB1bmxvYWQgdGhlIG1vZHVsZSAqLworfQorCitzdGF0aWMgdm9pZCBpbnRlcnZhbF90cmVlX3Rlc3RfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0FMRVJUICJ0ZXN0IGV4aXRcbiIpOworfQorCittb2R1bGVfaW5pdChpbnRlcnZhbF90cmVlX3Rlc3RfaW5pdCkKK21vZHVsZV9leGl0KGludGVydmFsX3RyZWVfdGVzdF9leGl0KQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJNaWNoZWwgTGVzcGluYXNzZSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJbnRlcnZhbCBUcmVlIHRlc3QiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbWFwLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pb21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MWQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pb21hcC5jCkBAIC0wLDAgKzEsMjUzIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIEltcGxlbWVudCB0aGUgZGVmYXVsdCBpb21hcCBpbnRlcmZhY2VzCisgKgorICogKEMpIENvcHlyaWdodCAyMDA0IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKy8qCisgKiBSZWFkL3dyaXRlIGZyb20vdG8gYW4gKG9mZnNldHRhYmxlKSBpb21lbSBjb29raWUuIEl0IG1pZ2h0IGJlIGEgUElPCisgKiBhY2Nlc3Mgb3IgYSBNTUlPIGFjY2VzcywgdGhlc2UgZnVuY3Rpb25zIGRvbid0IGNhcmUuIFRoZSBpbmZvIGlzCisgKiBlbmNvZGVkIGluIHRoZSBoYXJkd2FyZSBtYXBwaW5nIHNldCB1cCBieSB0aGUgbWFwcGluZyBmdW5jdGlvbnMKKyAqIChvciB0aGUgY29va2llIGl0c2VsZiwgZGVwZW5kaW5nIG9uIGltcGxlbWVudGF0aW9uIGFuZCBodykuCisgKgorICogVGhlIGdlbmVyaWMgcm91dGluZXMgZG9uJ3QgYXNzdW1lIGFueSBoYXJkd2FyZSBtYXBwaW5ncywgYW5kIGp1c3QKKyAqIGVuY29kZSB0aGUgUElPL01NSU8gYXMgcGFydCBvZiB0aGUgY29va2llLiBUaGV5IGNvbGRseSBhc3N1bWUgdGhhdAorICogdGhlIE1NSU8gSU8gbWFwcGluZ3MgYXJlIG5vdCBpbiB0aGUgbG93IGFkZHJlc3MgcmFuZ2UuCisgKgorICogQXJjaGl0ZWN0dXJlcyBmb3Igd2hpY2ggdGhpcyBpcyBub3QgdHJ1ZSBjYW4ndCB1c2UgdGhpcyBnZW5lcmljCisgKiBpbXBsZW1lbnRhdGlvbiBhbmQgc2hvdWxkIGRvIHRoZWlyIG93biBjb3B5LgorICovCisKKyNpZm5kZWYgSEFWRV9BUkNIX1BJT19TSVpFCisvKgorICogV2UgZW5jb2RlIHRoZSBwaHlzaWNhbCBQSU8gYWRkcmVzc2VzICgwLTB4ZmZmZikgaW50byB0aGUKKyAqIHBvaW50ZXIgYnkgb2Zmc2V0dGluZyB0aGVtIHdpdGggYSBjb25zdGFudCAoMHgxMDAwMCkgYW5kCisgKiBhc3N1bWluZyB0aGF0IGFsbCB0aGUgbG93IGFkZHJlc3NlcyBhcmUgYWx3YXlzIFBJTy4gVGhhdCBtZWFucworICogd2UgY2FuIGRvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgbG93IGJpdHMsIGFuZCBkb24ndAorICogbmVlZCB0byBqdXN0IHRha2UgdGhpbmdzIGZvciBncmFudGVkLgorICovCisjZGVmaW5lIFBJT19PRkZTRVQJMHgxMDAwMFVMCisjZGVmaW5lIFBJT19NQVNLCTB4MGZmZmZVTAorI2RlZmluZSBQSU9fUkVTRVJWRUQJMHg0MDAwMFVMCisjZW5kaWYKKworc3RhdGljIHZvaWQgYmFkX2lvX2FjY2Vzcyh1bnNpZ25lZCBsb25nIHBvcnQsIGNvbnN0IGNoYXIgKmFjY2VzcykKK3sKKwlzdGF0aWMgaW50IGNvdW50ID0gMTA7CisJaWYgKGNvdW50KSB7CisJCWNvdW50LS07CisJCVdBUk4oMSwgS0VSTl9FUlIgIkJhZCBJTyBhY2Nlc3MgYXQgcG9ydCAlI2x4ICglcylcbiIsIHBvcnQsIGFjY2Vzcyk7CisJfQorfQorCisvKgorICogVWdseSBtYWNyb3MgYXJlIGEgd2F5IG9mIGxpZmUuCisgKi8KKyNkZWZpbmUgSU9fQ09ORChhZGRyLCBpc19waW8sIGlzX21taW8pIGRvIHsJCQlcCisJdW5zaWduZWQgbG9uZyBwb3J0ID0gKHVuc2lnbmVkIGxvbmcgX19mb3JjZSlhZGRyOwlcCisJaWYgKHBvcnQgPj0gUElPX1JFU0VSVkVEKSB7CQkJCVwKKwkJaXNfbW1pbzsJCQkJCVwKKwl9IGVsc2UgaWYgKHBvcnQgPiBQSU9fT0ZGU0VUKSB7CQkJCVwKKwkJcG9ydCAmPSBQSU9fTUFTSzsJCQkJXAorCQlpc19waW87CQkJCQkJXAorCX0gZWxzZQkJCQkJCQlcCisJCWJhZF9pb19hY2Nlc3MocG9ydCwgI2lzX3BpbyApOwkJCVwKK30gd2hpbGUgKDApCisKKyNpZm5kZWYgcGlvX3JlYWQxNmJlCisjZGVmaW5lIHBpb19yZWFkMTZiZShwb3J0KSBzd2FiMTYoaW53KHBvcnQpKQorI2RlZmluZSBwaW9fcmVhZDMyYmUocG9ydCkgc3dhYjMyKGlubChwb3J0KSkKKyNlbmRpZgorCisjaWZuZGVmIG1taW9fcmVhZDE2YmUKKyNkZWZpbmUgbW1pb19yZWFkMTZiZShhZGRyKSBiZTE2X3RvX2NwdShfX3Jhd19yZWFkdyhhZGRyKSkKKyNkZWZpbmUgbW1pb19yZWFkMzJiZShhZGRyKSBiZTMyX3RvX2NwdShfX3Jhd19yZWFkbChhZGRyKSkKKyNlbmRpZgorCit1bnNpZ25lZCBpbnQgaW9yZWFkOCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJSU9fQ09ORChhZGRyLCByZXR1cm4gaW5iKHBvcnQpLCByZXR1cm4gcmVhZGIoYWRkcikpOworCXJldHVybiAweGZmOworfQordW5zaWduZWQgaW50IGlvcmVhZDE2KHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlJT19DT05EKGFkZHIsIHJldHVybiBpbncocG9ydCksIHJldHVybiByZWFkdyhhZGRyKSk7CisJcmV0dXJuIDB4ZmZmZjsKK30KK3Vuc2lnbmVkIGludCBpb3JlYWQxNmJlKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlJT19DT05EKGFkZHIsIHJldHVybiBwaW9fcmVhZDE2YmUocG9ydCksIHJldHVybiBtbWlvX3JlYWQxNmJlKGFkZHIpKTsKKwlyZXR1cm4gMHhmZmZmOworfQordW5zaWduZWQgaW50IGlvcmVhZDMyKHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlJT19DT05EKGFkZHIsIHJldHVybiBpbmwocG9ydCksIHJldHVybiByZWFkbChhZGRyKSk7CisJcmV0dXJuIDB4ZmZmZmZmZmY7Cit9Cit1bnNpZ25lZCBpbnQgaW9yZWFkMzJiZSh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJSU9fQ09ORChhZGRyLCByZXR1cm4gcGlvX3JlYWQzMmJlKHBvcnQpLCByZXR1cm4gbW1pb19yZWFkMzJiZShhZGRyKSk7CisJcmV0dXJuIDB4ZmZmZmZmZmY7Cit9CitFWFBPUlRfU1lNQk9MKGlvcmVhZDgpOworRVhQT1JUX1NZTUJPTChpb3JlYWQxNik7CitFWFBPUlRfU1lNQk9MKGlvcmVhZDE2YmUpOworRVhQT1JUX1NZTUJPTChpb3JlYWQzMik7CitFWFBPUlRfU1lNQk9MKGlvcmVhZDMyYmUpOworCisjaWZuZGVmIHBpb193cml0ZTE2YmUKKyNkZWZpbmUgcGlvX3dyaXRlMTZiZSh2YWwscG9ydCkgb3V0dyhzd2FiMTYodmFsKSxwb3J0KQorI2RlZmluZSBwaW9fd3JpdGUzMmJlKHZhbCxwb3J0KSBvdXRsKHN3YWIzMih2YWwpLHBvcnQpCisjZW5kaWYKKworI2lmbmRlZiBtbWlvX3dyaXRlMTZiZQorI2RlZmluZSBtbWlvX3dyaXRlMTZiZSh2YWwscG9ydCkgX19yYXdfd3JpdGV3KGJlMTZfdG9fY3B1KHZhbCkscG9ydCkKKyNkZWZpbmUgbW1pb193cml0ZTMyYmUodmFsLHBvcnQpIF9fcmF3X3dyaXRlbChiZTMyX3RvX2NwdSh2YWwpLHBvcnQpCisjZW5kaWYKKwordm9pZCBpb3dyaXRlOCh1OCB2YWwsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlJT19DT05EKGFkZHIsIG91dGIodmFsLHBvcnQpLCB3cml0ZWIodmFsLCBhZGRyKSk7Cit9Cit2b2lkIGlvd3JpdGUxNih1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJSU9fQ09ORChhZGRyLCBvdXR3KHZhbCxwb3J0KSwgd3JpdGV3KHZhbCwgYWRkcikpOworfQordm9pZCBpb3dyaXRlMTZiZSh1MTYgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJSU9fQ09ORChhZGRyLCBwaW9fd3JpdGUxNmJlKHZhbCxwb3J0KSwgbW1pb193cml0ZTE2YmUodmFsLCBhZGRyKSk7Cit9Cit2b2lkIGlvd3JpdGUzMih1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJSU9fQ09ORChhZGRyLCBvdXRsKHZhbCxwb3J0KSwgd3JpdGVsKHZhbCwgYWRkcikpOworfQordm9pZCBpb3dyaXRlMzJiZSh1MzIgdmFsLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJSU9fQ09ORChhZGRyLCBwaW9fd3JpdGUzMmJlKHZhbCxwb3J0KSwgbW1pb193cml0ZTMyYmUodmFsLCBhZGRyKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlvd3JpdGU4KTsKK0VYUE9SVF9TWU1CT0woaW93cml0ZTE2KTsKK0VYUE9SVF9TWU1CT0woaW93cml0ZTE2YmUpOworRVhQT1JUX1NZTUJPTChpb3dyaXRlMzIpOworRVhQT1JUX1NZTUJPTChpb3dyaXRlMzJiZSk7CisKKy8qCisgKiBUaGVzZSBhcmUgdGhlICJyZXBlYXQgTU1JTyByZWFkL3dyaXRlIiBmdW5jdGlvbnMuCisgKiBOb3RlIHRoZSAiX19yYXciIGFjY2Vzc2VzLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCisgKiBjb252ZXJ0IHRvIENQVSBieXRlIG9yZGVyLiBXZSB3cml0ZSBpbiAiSU8gYnl0ZQorICogb3JkZXIiICh3ZSBhbHNvIGRvbid0IGhhdmUgSU8gYmFycmllcnMpLgorICovCisjaWZuZGVmIG1taW9faW5zYgorc3RhdGljIGlubGluZSB2b2lkIG1taW9faW5zYih2b2lkIF9faW9tZW0gKmFkZHIsIHU4ICpkc3QsIGludCBjb3VudCkKK3sKKwl3aGlsZSAoLS1jb3VudCA+PSAwKSB7CisJCXU4IGRhdGEgPSBfX3Jhd19yZWFkYihhZGRyKTsKKwkJKmRzdCA9IGRhdGE7CisJCWRzdCsrOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWlvX2luc3codm9pZCBfX2lvbWVtICphZGRyLCB1MTYgKmRzdCwgaW50IGNvdW50KQoreworCXdoaWxlICgtLWNvdW50ID49IDApIHsKKwkJdTE2IGRhdGEgPSBfX3Jhd19yZWFkdyhhZGRyKTsKKwkJKmRzdCA9IGRhdGE7CisJCWRzdCsrOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWlvX2luc2wodm9pZCBfX2lvbWVtICphZGRyLCB1MzIgKmRzdCwgaW50IGNvdW50KQoreworCXdoaWxlICgtLWNvdW50ID49IDApIHsKKwkJdTMyIGRhdGEgPSBfX3Jhd19yZWFkbChhZGRyKTsKKwkJKmRzdCA9IGRhdGE7CisJCWRzdCsrOworCX0KK30KKyNlbmRpZgorCisjaWZuZGVmIG1taW9fb3V0c2IKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWlvX291dHNiKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3QgdTggKnNyYywgaW50IGNvdW50KQoreworCXdoaWxlICgtLWNvdW50ID49IDApIHsKKwkJX19yYXdfd3JpdGViKCpzcmMsIGFkZHIpOworCQlzcmMrKzsKKwl9Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgbW1pb19vdXRzdyh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHUxNiAqc3JjLCBpbnQgY291bnQpCit7CisJd2hpbGUgKC0tY291bnQgPj0gMCkgeworCQlfX3Jhd193cml0ZXcoKnNyYywgYWRkcik7CisJCXNyYysrOworCX0KK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBtbWlvX291dHNsKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3QgdTMyICpzcmMsIGludCBjb3VudCkKK3sKKwl3aGlsZSAoLS1jb3VudCA+PSAwKSB7CisJCV9fcmF3X3dyaXRlbCgqc3JjLCBhZGRyKTsKKwkJc3JjKys7CisJfQorfQorI2VuZGlmCisKK3ZvaWQgaW9yZWFkOF9yZXAodm9pZCBfX2lvbWVtICphZGRyLCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJSU9fQ09ORChhZGRyLCBpbnNiKHBvcnQsZHN0LGNvdW50KSwgbW1pb19pbnNiKGFkZHIsIGRzdCwgY291bnQpKTsKK30KK3ZvaWQgaW9yZWFkMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZHN0LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCUlPX0NPTkQoYWRkciwgaW5zdyhwb3J0LGRzdCxjb3VudCksIG1taW9faW5zdyhhZGRyLCBkc3QsIGNvdW50KSk7Cit9Cit2b2lkIGlvcmVhZDMyX3JlcCh2b2lkIF9faW9tZW0gKmFkZHIsIHZvaWQgKmRzdCwgdW5zaWduZWQgbG9uZyBjb3VudCkKK3sKKwlJT19DT05EKGFkZHIsIGluc2wocG9ydCxkc3QsY291bnQpLCBtbWlvX2luc2woYWRkciwgZHN0LCBjb3VudCkpOworfQorRVhQT1JUX1NZTUJPTChpb3JlYWQ4X3JlcCk7CitFWFBPUlRfU1lNQk9MKGlvcmVhZDE2X3JlcCk7CitFWFBPUlRfU1lNQk9MKGlvcmVhZDMyX3JlcCk7CisKK3ZvaWQgaW93cml0ZThfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCUlPX0NPTkQoYWRkciwgb3V0c2IocG9ydCwgc3JjLCBjb3VudCksIG1taW9fb3V0c2IoYWRkciwgc3JjLCBjb3VudCkpOworfQordm9pZCBpb3dyaXRlMTZfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCUlPX0NPTkQoYWRkciwgb3V0c3cocG9ydCwgc3JjLCBjb3VudCksIG1taW9fb3V0c3coYWRkciwgc3JjLCBjb3VudCkpOworfQordm9pZCBpb3dyaXRlMzJfcmVwKHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCUlPX0NPTkQoYWRkciwgb3V0c2wocG9ydCwgc3JjLGNvdW50KSwgbW1pb19vdXRzbChhZGRyLCBzcmMsIGNvdW50KSk7Cit9CitFWFBPUlRfU1lNQk9MKGlvd3JpdGU4X3JlcCk7CitFWFBPUlRfU1lNQk9MKGlvd3JpdGUxNl9yZXApOworRVhQT1JUX1NZTUJPTChpb3dyaXRlMzJfcmVwKTsKKworI2lmZGVmIENPTkZJR19IQVNfSU9QT1JUX01BUAorLyogQ3JlYXRlIGEgdmlydHVhbCBtYXBwaW5nIGNvb2tpZSBmb3IgYW4gSU8gcG9ydCByYW5nZSAqLwordm9pZCBfX2lvbWVtICppb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IG5yKQoreworCWlmIChwb3J0ID4gUElPX01BU0spCisJCXJldHVybiBOVUxMOworCXJldHVybiAodm9pZCBfX2lvbWVtICopICh1bnNpZ25lZCBsb25nKSAocG9ydCArIFBJT19PRkZTRVQpOworfQorCit2b2lkIGlvcG9ydF91bm1hcCh2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorRVhQT1JUX1NZTUJPTChpb3BvcnRfbWFwKTsKK0VYUE9SVF9TWU1CT0woaW9wb3J0X3VubWFwKTsKKyNlbmRpZiAvKiBDT05GSUdfSEFTX0lPUE9SVF9NQVAgKi8KKworI2lmZGVmIENPTkZJR19QQ0kKKy8qIEhpZGUgdGhlIGRldGFpbHMgaWYgdGhpcyBpcyBhIE1NSU8gb3IgUElPIGFkZHJlc3Mgc3BhY2UgYW5kIGp1c3QgZG8gd2hhdAorICogeW91IGV4cGVjdCBpbiB0aGUgY29ycmVjdCB3YXkuICovCit2b2lkIHBjaV9pb3VubWFwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHZvaWQgX19pb21lbSAqIGFkZHIpCit7CisJSU9fQ09ORChhZGRyLCAvKiBub3RoaW5nICovLCBpb3VubWFwKGFkZHIpKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2lvdW5tYXApOworI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbWFwX2NvcHkuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbWFwX2NvcHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGYxZDZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW9tYXBfY29weS5jCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBQYXRoU2NhbGUsIEluYy4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICogSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworLyoqCisgKiBfX2lvd3JpdGUzMl9jb3B5IC0gY29weSBkYXRhIHRvIE1NSU8gc3BhY2UsIGluIDMyLWJpdCB1bml0cworICogQHRvOiBkZXN0aW5hdGlvbiwgaW4gTU1JTyBzcGFjZSAobXVzdCBiZSAzMi1iaXQgYWxpZ25lZCkKKyAqIEBmcm9tOiBzb3VyY2UgKG11c3QgYmUgMzItYml0IGFsaWduZWQpCisgKiBAY291bnQ6IG51bWJlciBvZiAzMi1iaXQgcXVhbnRpdGllcyB0byBjb3B5CisgKgorICogQ29weSBkYXRhIGZyb20ga2VybmVsIHNwYWNlIHRvIE1NSU8gc3BhY2UsIGluIHVuaXRzIG9mIDMyIGJpdHMgYXQgYQorICogdGltZS4gIE9yZGVyIG9mIGFjY2VzcyBpcyBub3QgZ3VhcmFudGVlZCwgbm9yIGlzIGEgbWVtb3J5IGJhcnJpZXIKKyAqIHBlcmZvcm1lZCBhZnRlcndhcmRzLgorICovCit2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBfX2lvd3JpdGUzMl9jb3B5KHZvaWQgX19pb21lbSAqdG8sCisJCQkJCSAgICBjb25zdCB2b2lkICpmcm9tLAorCQkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXUzMiBfX2lvbWVtICpkc3QgPSB0bzsKKwljb25zdCB1MzIgKnNyYyA9IGZyb207CisJY29uc3QgdTMyICplbmQgPSBzcmMgKyBjb3VudDsKKworCXdoaWxlIChzcmMgPCBlbmQpCisJCV9fcmF3X3dyaXRlbCgqc3JjKyssIGRzdCsrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9faW93cml0ZTMyX2NvcHkpOworCisvKioKKyAqIF9faW9yZWFkMzJfY29weSAtIGNvcHkgZGF0YSBmcm9tIE1NSU8gc3BhY2UsIGluIDMyLWJpdCB1bml0cworICogQHRvOiBkZXN0aW5hdGlvbiAobXVzdCBiZSAzMi1iaXQgYWxpZ25lZCkKKyAqIEBmcm9tOiBzb3VyY2UsIGluIE1NSU8gc3BhY2UgKG11c3QgYmUgMzItYml0IGFsaWduZWQpCisgKiBAY291bnQ6IG51bWJlciBvZiAzMi1iaXQgcXVhbnRpdGllcyB0byBjb3B5CisgKgorICogQ29weSBkYXRhIGZyb20gTU1JTyBzcGFjZSB0byBrZXJuZWwgc3BhY2UsIGluIHVuaXRzIG9mIDMyIGJpdHMgYXQgYQorICogdGltZS4gIE9yZGVyIG9mIGFjY2VzcyBpcyBub3QgZ3VhcmFudGVlZCwgbm9yIGlzIGEgbWVtb3J5IGJhcnJpZXIKKyAqIHBlcmZvcm1lZCBhZnRlcndhcmRzLgorICovCit2b2lkIF9faW9yZWFkMzJfY29weSh2b2lkICp0bywgY29uc3Qgdm9pZCBfX2lvbWVtICpmcm9tLCBzaXplX3QgY291bnQpCit7CisJdTMyICpkc3QgPSB0bzsKKwljb25zdCB1MzIgX19pb21lbSAqc3JjID0gZnJvbTsKKwljb25zdCB1MzIgX19pb21lbSAqZW5kID0gc3JjICsgY291bnQ7CisKKwl3aGlsZSAoc3JjIDwgZW5kKQorCQkqZHN0KysgPSBfX3Jhd19yZWFkbChzcmMrKyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX2lvcmVhZDMyX2NvcHkpOworCisvKioKKyAqIF9faW93cml0ZTY0X2NvcHkgLSBjb3B5IGRhdGEgdG8gTU1JTyBzcGFjZSwgaW4gNjQtYml0IG9yIDMyLWJpdCB1bml0cworICogQHRvOiBkZXN0aW5hdGlvbiwgaW4gTU1JTyBzcGFjZSAobXVzdCBiZSA2NC1iaXQgYWxpZ25lZCkKKyAqIEBmcm9tOiBzb3VyY2UgKG11c3QgYmUgNjQtYml0IGFsaWduZWQpCisgKiBAY291bnQ6IG51bWJlciBvZiA2NC1iaXQgcXVhbnRpdGllcyB0byBjb3B5CisgKgorICogQ29weSBkYXRhIGZyb20ga2VybmVsIHNwYWNlIHRvIE1NSU8gc3BhY2UsIGluIHVuaXRzIG9mIDMyIG9yIDY0IGJpdHMgYXQgYQorICogdGltZS4gIE9yZGVyIG9mIGFjY2VzcyBpcyBub3QgZ3VhcmFudGVlZCwgbm9yIGlzIGEgbWVtb3J5IGJhcnJpZXIKKyAqIHBlcmZvcm1lZCBhZnRlcndhcmRzLgorICovCit2b2lkIF9fYXR0cmlidXRlX18oKHdlYWspKSBfX2lvd3JpdGU2NF9jb3B5KHZvaWQgX19pb21lbSAqdG8sCisJCQkJCSAgICBjb25zdCB2b2lkICpmcm9tLAorCQkJCQkgICAgc2l6ZV90IGNvdW50KQoreworI2lmZGVmIENPTkZJR182NEJJVAorCXU2NCBfX2lvbWVtICpkc3QgPSB0bzsKKwljb25zdCB1NjQgKnNyYyA9IGZyb207CisJY29uc3QgdTY0ICplbmQgPSBzcmMgKyBjb3VudDsKKworCXdoaWxlIChzcmMgPCBlbmQpCisJCV9fcmF3X3dyaXRlcSgqc3JjKyssIGRzdCsrKTsKKyNlbHNlCisJX19pb3dyaXRlMzJfY29weSh0bywgZnJvbSwgY291bnQgKiAyKTsKKyNlbmRpZgorfQorCitFWFBPUlRfU1lNQk9MX0dQTChfX2lvd3JpdGU2NF9jb3B5KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbW11LWNvbW1vbi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW9tbXUtY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViMDBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbW11LWNvbW1vbi5jCkBAIC0wLDAgKzEsMjY3IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIElPTU1VIG1tYXAgbWFuYWdlbWVudCBhbmQgcmFuZ2UgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisgKiBCYXNlZCBhbG1vc3QgZW50aXJlbHkgdXBvbiB0aGUgcG93ZXJwYyBpb21tdSBhbGxvY2F0b3IuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11LWhlbHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvbW11LWNvbW1vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaGFzaC5oPgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb21tdV9sYXJnZV9hbGxvYyA9IDE1OworCitzdGF0aWMJREVGSU5FX1BFUl9DUFUodW5zaWduZWQgaW50LCBpb21tdV9oYXNoX2NvbW1vbik7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWVkX2ZsdXNoKHN0cnVjdCBpb21tdV9tYXBfdGFibGUgKmlvbW11KQoreworCXJldHVybiAoKGlvbW11LT5mbGFncyAmIElPTU1VX05FRURfRkxVU0gpICE9IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZsdXNoKHN0cnVjdCBpb21tdV9tYXBfdGFibGUgKmlvbW11KQoreworCWlvbW11LT5mbGFncyB8PSBJT01NVV9ORUVEX0ZMVVNIOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfZmx1c2goc3RydWN0IGlvbW11X21hcF90YWJsZSAqaW9tbXUpCit7CisJaW9tbXUtPmZsYWdzICY9IH5JT01NVV9ORUVEX0ZMVVNIOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9pb21tdV9wb29sX2hhc2godm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdGF0aWMgYm9vbCBkb19vbmNlOworCisJaWYgKGRvX29uY2UpCisJCXJldHVybjsKKwlkb19vbmNlID0gdHJ1ZTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKKwkJcGVyX2NwdShpb21tdV9oYXNoX2NvbW1vbiwgaSkgPSBoYXNoXzMyKGksIElPTU1VX1BPT0xfSEFTSEJJVFMpOworfQorCisvKgorICogSW5pdGlhbGl6ZSBpb21tdV9wb29sIGVudHJpZXMgZm9yIHRoZSBpb21tdV9tYXBfdGFibGUuIGBudW1fZW50cmllcycKKyAqIGlzIHRoZSBudW1iZXIgb2YgdGFibGUgZW50cmllcy4gSWYgYGxhcmdlX3Bvb2wnIGlzIHNldCB0byB0cnVlLAorICogdGhlIHRvcCAxLzQgb2YgdGhlIHRhYmxlIHdpbGwgYmUgc2V0IGFzaWRlIGZvciBwb29sIGFsbG9jYXRpb25zCisgKiBvZiBtb3JlIHRoYW4gaW9tbXVfbGFyZ2VfYWxsb2MgcGFnZXMuCisgKi8KK3ZvaWQgaW9tbXVfdGJsX3Bvb2xfaW5pdChzdHJ1Y3QgaW9tbXVfbWFwX3RhYmxlICppb21tdSwKKwkJCSB1bnNpZ25lZCBsb25nIG51bV9lbnRyaWVzLAorCQkJIHUzMiB0YWJsZV9zaGlmdCwKKwkJCSB2b2lkICgqbGF6eV9mbHVzaCkoc3RydWN0IGlvbW11X21hcF90YWJsZSAqKSwKKwkJCSBib29sIGxhcmdlX3Bvb2wsIHUzMiBucG9vbHMsCisJCQkgYm9vbCBza2lwX3NwYW5fYm91bmRhcnlfY2hlY2spCit7CisJdW5zaWduZWQgaW50IHN0YXJ0LCBpOworCXN0cnVjdCBpb21tdV9wb29sICpwID0gJihpb21tdS0+bGFyZ2VfcG9vbCk7CisKKwlzZXR1cF9pb21tdV9wb29sX2hhc2goKTsKKwlpZiAobnBvb2xzID09IDApCisJCWlvbW11LT5ucl9wb29scyA9IElPTU1VX05SX1BPT0xTOworCWVsc2UKKwkJaW9tbXUtPm5yX3Bvb2xzID0gbnBvb2xzOworCUJVR19PTihucG9vbHMgPiBJT01NVV9OUl9QT09MUyk7CisKKwlpb21tdS0+dGFibGVfc2hpZnQgPSB0YWJsZV9zaGlmdDsKKwlpb21tdS0+bGF6eV9mbHVzaCA9IGxhenlfZmx1c2g7CisJc3RhcnQgPSAwOworCWlmIChza2lwX3NwYW5fYm91bmRhcnlfY2hlY2spCisJCWlvbW11LT5mbGFncyB8PSBJT01NVV9OT19TUEFOX0JPVU5EOworCWlmIChsYXJnZV9wb29sKQorCQlpb21tdS0+ZmxhZ3MgfD0gSU9NTVVfSEFTX0xBUkdFX1BPT0w7CisKKwlpZiAoIWxhcmdlX3Bvb2wpCisJCWlvbW11LT5wb29sc2l6ZSA9IG51bV9lbnRyaWVzL2lvbW11LT5ucl9wb29sczsKKwllbHNlCisJCWlvbW11LT5wb29sc2l6ZSA9IChudW1fZW50cmllcyAqIDMgLyA0KS9pb21tdS0+bnJfcG9vbHM7CisJZm9yIChpID0gMDsgaSA8IGlvbW11LT5ucl9wb29sczsgaSsrKSB7CisJCXNwaW5fbG9ja19pbml0KCYoaW9tbXUtPnBvb2xzW2ldLmxvY2spKTsKKwkJaW9tbXUtPnBvb2xzW2ldLnN0YXJ0ID0gc3RhcnQ7CisJCWlvbW11LT5wb29sc1tpXS5oaW50ID0gc3RhcnQ7CisJCXN0YXJ0ICs9IGlvbW11LT5wb29sc2l6ZTsgLyogc3RhcnQgZm9yIG5leHQgcG9vbCAqLworCQlpb21tdS0+cG9vbHNbaV0uZW5kID0gc3RhcnQgLSAxOworCX0KKwlpZiAoIWxhcmdlX3Bvb2wpCisJCXJldHVybjsKKwkvKiBpbml0aWFsaXplIGxhcmdlX3Bvb2wgKi8KKwlzcGluX2xvY2tfaW5pdCgmKHAtPmxvY2spKTsKKwlwLT5zdGFydCA9IHN0YXJ0OworCXAtPmhpbnQgPSBwLT5zdGFydDsKKwlwLT5lbmQgPSBudW1fZW50cmllczsKK30KK0VYUE9SVF9TWU1CT0woaW9tbXVfdGJsX3Bvb2xfaW5pdCk7CisKK3Vuc2lnbmVkIGxvbmcgaW9tbXVfdGJsX3JhbmdlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgaW9tbXVfbWFwX3RhYmxlICppb21tdSwKKwkJCQl1bnNpZ25lZCBsb25nIG5wYWdlcywKKwkJCQl1bnNpZ25lZCBsb25nICpoYW5kbGUsCisJCQkJdW5zaWduZWQgbG9uZyBtYXNrLAorCQkJCXVuc2lnbmVkIGludCBhbGlnbl9vcmRlcikKK3sKKwl1bnNpZ25lZCBpbnQgcG9vbF9oYXNoID0gX190aGlzX2NwdV9yZWFkKGlvbW11X2hhc2hfY29tbW9uKTsKKwl1bnNpZ25lZCBsb25nIG4sIGVuZCwgc3RhcnQsIGxpbWl0LCBib3VuZGFyeV9zaXplOworCXN0cnVjdCBpb21tdV9wb29sICpwb29sOworCWludCBwYXNzID0gMDsKKwl1bnNpZ25lZCBpbnQgcG9vbF9ucjsKKwl1bnNpZ25lZCBpbnQgbnBvb2xzID0gaW9tbXUtPm5yX3Bvb2xzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBsYXJnZV9wb29sID0gKChpb21tdS0+ZmxhZ3MgJiBJT01NVV9IQVNfTEFSR0VfUE9PTCkgIT0gMCk7CisJYm9vbCBsYXJnZWFsbG9jID0gKGxhcmdlX3Bvb2wgJiYgbnBhZ2VzID4gaW9tbXVfbGFyZ2VfYWxsb2MpOworCXVuc2lnbmVkIGxvbmcgc2hpZnQ7CisJdW5zaWduZWQgbG9uZyBhbGlnbl9tYXNrID0gMDsKKworCWlmIChhbGlnbl9vcmRlciA+IDApCisJCWFsaWduX21hc2sgPSB+MHVsID4+IChCSVRTX1BFUl9MT05HIC0gYWxpZ25fb3JkZXIpOworCisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKHVubGlrZWx5KG5wYWdlcyA9PSAwKSkgeworCQlXQVJOX09OX09OQ0UoMSk7CisJCXJldHVybiBJT01NVV9FUlJPUl9DT0RFOworCX0KKworCWlmIChsYXJnZWFsbG9jKSB7CisJCXBvb2wgPSAmKGlvbW11LT5sYXJnZV9wb29sKTsKKwkJcG9vbF9uciA9IDA7IC8qIHRvIGtlZXAgY29tcGlsZXIgaGFwcHkgKi8KKwl9IGVsc2UgeworCQkvKiBwaWNrIG91dCBwb29sX25yICovCisJCXBvb2xfbnIgPSAgcG9vbF9oYXNoICYgKG5wb29scyAtIDEpOworCQlwb29sID0gJihpb21tdS0+cG9vbHNbcG9vbF9ucl0pOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgZmxhZ3MpOworCisgYWdhaW46CisJaWYgKHBhc3MgPT0gMCAmJiBoYW5kbGUgJiYgKmhhbmRsZSAmJgorCSAgICAoKmhhbmRsZSA+PSBwb29sLT5zdGFydCkgJiYgKCpoYW5kbGUgPCBwb29sLT5lbmQpKQorCQlzdGFydCA9ICpoYW5kbGU7CisJZWxzZQorCQlzdGFydCA9IHBvb2wtPmhpbnQ7CisKKwlsaW1pdCA9IHBvb2wtPmVuZDsKKworCS8qIFRoZSBjYXNlIGJlbG93IGNhbiBoYXBwZW4gaWYgd2UgaGF2ZSBhIHNtYWxsIHNlZ21lbnQgYXBwZW5kZWQKKwkgKiB0byBhIGxhcmdlLCBvciB3aGVuIHRoZSBwcmV2aW91cyBhbGxvYyB3YXMgYXQgdGhlIHZlcnkgZW5kIG9mCisJICogdGhlIGF2YWlsYWJsZSBzcGFjZS4gSWYgc28sIGdvIGJhY2sgdG8gdGhlIGJlZ2lubmluZy4gSWYgYQorCSAqIGZsdXNoIGlzIG5lZWRlZCwgaXQgd2lsbCBnZXQgZG9uZSBiYXNlZCBvbiB0aGUgcmV0dXJuIHZhbHVlCisJICogZnJvbSBpb21tdV9hcmVhX2FsbG9jKCkgYmVsb3cuCisJICovCisJaWYgKHN0YXJ0ID49IGxpbWl0KQorCQlzdGFydCA9IHBvb2wtPnN0YXJ0OworCXNoaWZ0ID0gaW9tbXUtPnRhYmxlX21hcF9iYXNlID4+IGlvbW11LT50YWJsZV9zaGlmdDsKKwlpZiAobGltaXQgKyBzaGlmdCA+IG1hc2spIHsKKwkJbGltaXQgPSBtYXNrIC0gc2hpZnQgKyAxOworCQkvKiBJZiB3ZSdyZSBjb25zdHJhaW5lZCBvbiBhZGRyZXNzIHJhbmdlLCBmaXJzdCB0cnkKKwkJICogYXQgdGhlIG1hc2tlZCBoaW50IHRvIGF2b2lkIE8obikgc2VhcmNoIGNvbXBsZXhpdHksCisJCSAqIGJ1dCBvbiBzZWNvbmQgcGFzcywgc3RhcnQgYXQgMCBpbiBwb29sIDAuCisJCSAqLworCQlpZiAoKHN0YXJ0ICYgbWFzaykgPj0gbGltaXQgfHwgcGFzcyA+IDApIHsKKwkJCXNwaW5fdW5sb2NrKCYocG9vbC0+bG9jaykpOworCQkJcG9vbCA9ICYoaW9tbXUtPnBvb2xzWzBdKTsKKwkJCXNwaW5fbG9jaygmKHBvb2wtPmxvY2spKTsKKwkJCXN0YXJ0ID0gcG9vbC0+c3RhcnQ7CisJCX0gZWxzZSB7CisJCQlzdGFydCAmPSBtYXNrOworCQl9CisJfQorCisJaWYgKGRldikKKwkJYm91bmRhcnlfc2l6ZSA9IEFMSUdOKGRtYV9nZXRfc2VnX2JvdW5kYXJ5KGRldikgKyAxLAorCQkJCSAgICAgIDEgPDwgaW9tbXUtPnRhYmxlX3NoaWZ0KTsKKwllbHNlCisJCWJvdW5kYXJ5X3NpemUgPSBBTElHTigxVUxMIDw8IDMyLCAxIDw8IGlvbW11LT50YWJsZV9zaGlmdCk7CisKKwlib3VuZGFyeV9zaXplID0gYm91bmRhcnlfc2l6ZSA+PiBpb21tdS0+dGFibGVfc2hpZnQ7CisJLyoKKwkgKiBpZiB0aGUgc2tpcF9zcGFuX2JvdW5kYXJ5X2NoZWNrIGhhZCBiZWVuIHNldCBkdXJpbmcgaW5pdCwgd2Ugc2V0CisJICogdGhpbmdzIHVwIHNvIHRoYXQgaW9tbXVfaXNfc3Bhbl9ib3VuZGFyeSgpIG1lcmVseSBjaGVja3MgaWYgdGhlCisJICogKGluZGV4ICsgbnBhZ2VzKSA8IG51bV90c2JfZW50cmllcworCSAqLworCWlmICgoaW9tbXUtPmZsYWdzICYgSU9NTVVfTk9fU1BBTl9CT1VORCkgIT0gMCkgeworCQlzaGlmdCA9IDA7CisJCWJvdW5kYXJ5X3NpemUgPSBpb21tdS0+cG9vbHNpemUgKiBpb21tdS0+bnJfcG9vbHM7CisJfQorCW4gPSBpb21tdV9hcmVhX2FsbG9jKGlvbW11LT5tYXAsIGxpbWl0LCBzdGFydCwgbnBhZ2VzLCBzaGlmdCwKKwkJCSAgICAgYm91bmRhcnlfc2l6ZSwgYWxpZ25fbWFzayk7CisJaWYgKG4gPT0gLTEpIHsKKwkJaWYgKGxpa2VseShwYXNzID09IDApKSB7CisJCQkvKiBGaXJzdCBmYWlsdXJlLCByZXNjYW4gZnJvbSB0aGUgYmVnaW5uaW5nLiAgKi8KKwkJCXBvb2wtPmhpbnQgPSBwb29sLT5zdGFydDsKKwkJCXNldF9mbHVzaChpb21tdSk7CisJCQlwYXNzKys7CisJCQlnb3RvIGFnYWluOworCQl9IGVsc2UgaWYgKCFsYXJnZWFsbG9jICYmIHBhc3MgPD0gaW9tbXUtPm5yX3Bvb2xzKSB7CisJCQlzcGluX3VubG9jaygmKHBvb2wtPmxvY2spKTsKKwkJCXBvb2xfbnIgPSAocG9vbF9uciArIDEpICYgKGlvbW11LT5ucl9wb29scyAtIDEpOworCQkJcG9vbCA9ICYoaW9tbXUtPnBvb2xzW3Bvb2xfbnJdKTsKKwkJCXNwaW5fbG9jaygmKHBvb2wtPmxvY2spKTsKKwkJCXBvb2wtPmhpbnQgPSBwb29sLT5zdGFydDsKKwkJCXNldF9mbHVzaChpb21tdSk7CisJCQlwYXNzKys7CisJCQlnb3RvIGFnYWluOworCQl9IGVsc2UgeworCQkJLyogZ2l2ZSB1cCAqLworCQkJbiA9IElPTU1VX0VSUk9SX0NPREU7CisJCQlnb3RvIGJhaWw7CisJCX0KKwl9CisJaWYgKGlvbW11LT5sYXp5X2ZsdXNoICYmCisJICAgIChuIDwgcG9vbC0+aGludCB8fCBuZWVkX2ZsdXNoKGlvbW11KSkpIHsKKwkJY2xlYXJfZmx1c2goaW9tbXUpOworCQlpb21tdS0+bGF6eV9mbHVzaChpb21tdSk7CisJfQorCisJZW5kID0gbiArIG5wYWdlczsKKwlwb29sLT5oaW50ID0gZW5kOworCisJLyogVXBkYXRlIGhhbmRsZSBmb3IgU0cgYWxsb2NhdGlvbnMgKi8KKwlpZiAoaGFuZGxlKQorCQkqaGFuZGxlID0gZW5kOworYmFpbDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCYocG9vbC0+bG9jayksIGZsYWdzKTsKKworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChpb21tdV90YmxfcmFuZ2VfYWxsb2MpOworCitzdGF0aWMgc3RydWN0IGlvbW11X3Bvb2wgKmdldF9wb29sKHN0cnVjdCBpb21tdV9tYXBfdGFibGUgKnRibCwKKwkJCQkgICB1bnNpZ25lZCBsb25nIGVudHJ5KQoreworCXN0cnVjdCBpb21tdV9wb29sICpwOworCXVuc2lnbmVkIGxvbmcgbGFyZ2Vwb29sX3N0YXJ0ID0gdGJsLT5sYXJnZV9wb29sLnN0YXJ0OworCWJvb2wgbGFyZ2VfcG9vbCA9ICgodGJsLT5mbGFncyAmIElPTU1VX0hBU19MQVJHRV9QT09MKSAhPSAwKTsKKworCS8qIFRoZSBsYXJnZSBwb29sIGlzIHRoZSBsYXN0IHBvb2wgYXQgdGhlIHRvcCBvZiB0aGUgdGFibGUgKi8KKwlpZiAobGFyZ2VfcG9vbCAmJiBlbnRyeSA+PSBsYXJnZXBvb2xfc3RhcnQpIHsKKwkJcCA9ICZ0YmwtPmxhcmdlX3Bvb2w7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaW50IHBvb2xfbnIgPSBlbnRyeSAvIHRibC0+cG9vbHNpemU7CisKKwkJQlVHX09OKHBvb2xfbnIgPj0gdGJsLT5ucl9wb29scyk7CisJCXAgPSAmdGJsLT5wb29sc1twb29sX25yXTsKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8qIENhbGxlciBzdXBwbGllcyB0aGUgaW5kZXggb2YgdGhlIGVudHJ5IGludG8gdGhlIGlvbW11IG1hcCB0YWJsZQorICogaXRzZWxmIHdoZW4gdGhlIG1hcHBpbmcgZnJvbSBkbWFfYWRkciB0byB0aGUgZW50cnkgaXMgbm90IHRoZQorICogZGVmYXVsdCBhZGRyLT5lbnRyeSBtYXBwaW5nIGJlbG93LgorICovCit2b2lkIGlvbW11X3RibF9yYW5nZV9mcmVlKHN0cnVjdCBpb21tdV9tYXBfdGFibGUgKmlvbW11LCB1NjQgZG1hX2FkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIGVudHJ5KQoreworCXN0cnVjdCBpb21tdV9wb29sICpwb29sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzaGlmdCA9IGlvbW11LT50YWJsZV9zaGlmdDsKKworCWlmIChlbnRyeSA9PSBJT01NVV9FUlJPUl9DT0RFKSAvKiB1c2UgZGVmYXVsdCBhZGRyLT5lbnRyeSBtYXBwaW5nICovCisJCWVudHJ5ID0gKGRtYV9hZGRyIC0gaW9tbXUtPnRhYmxlX21hcF9iYXNlKSA+PiBzaGlmdDsKKwlwb29sID0gZ2V0X3Bvb2woaW9tbXUsIGVudHJ5KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCYocG9vbC0+bG9jayksIGZsYWdzKTsKKwliaXRtYXBfY2xlYXIoaW9tbXUtPm1hcCwgZW50cnksIG5wYWdlcyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKHBvb2wtPmxvY2spLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlvbW11X3RibF9yYW5nZV9mcmVlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbW11LWhlbHBlci5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaW9tbXUtaGVscGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2MzNjMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvbW11LWhlbHBlci5jCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogSU9NTVUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIGZyZWUgYXJlYSBtYW5hZ2VtZW50CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorCitpbnQgaW9tbXVfaXNfc3Bhbl9ib3VuZGFyeSh1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBuciwKKwkJCSAgIHVuc2lnbmVkIGxvbmcgc2hpZnQsCisJCQkgICB1bnNpZ25lZCBsb25nIGJvdW5kYXJ5X3NpemUpCit7CisJQlVHX09OKCFpc19wb3dlcl9vZl8yKGJvdW5kYXJ5X3NpemUpKTsKKworCXNoaWZ0ID0gKHNoaWZ0ICsgaW5kZXgpICYgKGJvdW5kYXJ5X3NpemUgLSAxKTsKKwlyZXR1cm4gc2hpZnQgKyBuciA+IGJvdW5kYXJ5X3NpemU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgaW9tbXVfYXJlYV9hbGxvYyh1bnNpZ25lZCBsb25nICptYXAsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBpbnQgbnIsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyBzaGlmdCwgdW5zaWduZWQgbG9uZyBib3VuZGFyeV9zaXplLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGluZGV4OworCisJLyogV2UgZG9uJ3Qgd2FudCB0aGUgbGFzdCBvZiB0aGUgbGltaXQgKi8KKwlzaXplIC09IDE7CithZ2FpbjoKKwlpbmRleCA9IGJpdG1hcF9maW5kX25leHRfemVyb19hcmVhKG1hcCwgc2l6ZSwgc3RhcnQsIG5yLCBhbGlnbl9tYXNrKTsKKwlpZiAoaW5kZXggPCBzaXplKSB7CisJCWlmIChpb21tdV9pc19zcGFuX2JvdW5kYXJ5KGluZGV4LCBuciwgc2hpZnQsIGJvdW5kYXJ5X3NpemUpKSB7CisJCQlzdGFydCA9IEFMSUdOKHNoaWZ0ICsgaW5kZXgsIGJvdW5kYXJ5X3NpemUpIC0gc2hpZnQ7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWJpdG1hcF9zZXQobWFwLCBpbmRleCwgbnIpOworCQlyZXR1cm4gaW5kZXg7CisJfQorCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0woaW9tbXVfYXJlYV9hbGxvYyk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pb3JlbWFwLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pb3JlbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3ZjU4NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvcmVtYXAuYwpAQCAtMCwwICsxLDE4MyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBSZS1tYXAgSU8gbWVtb3J5IHRvIGtlcm5lbCBhZGRyZXNzIHNwYWNlIHNvIHRoYXQgd2UgY2FuIGFjY2VzcyBpdC4KKyAqIFRoaXMgaXMgbmVlZGVkIGZvciBoaWdoIFBDSSBhZGRyZXNzZXMgdGhhdCBhcmVuJ3QgbWFwcGVkIGluIHRoZQorICogNjQway0xTUIgSU8gbWVtb3J5IGFyZWEgb24gUEMncworICoKKyAqIChDKSBDb3B5cmlnaHQgMTk5NSAxOTk2IExpbnVzIFRvcnZhbGRzCisgKi8KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorCisjaWZkZWYgQ09ORklHX0hBVkVfQVJDSF9IVUdFX1ZNQVAKK3N0YXRpYyBpbnQgX19yZWFkX21vc3RseSBpb3JlbWFwX3A0ZF9jYXBhYmxlOworc3RhdGljIGludCBfX3JlYWRfbW9zdGx5IGlvcmVtYXBfcHVkX2NhcGFibGU7CitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgaW9yZW1hcF9wbWRfY2FwYWJsZTsKK3N0YXRpYyBpbnQgX19yZWFkX21vc3RseSBpb3JlbWFwX2h1Z2VfZGlzYWJsZWQ7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldF9ub2h1Z2Vpb21hcChjaGFyICpzdHIpCit7CisJaW9yZW1hcF9odWdlX2Rpc2FibGVkID0gMTsKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2h1Z2Vpb21hcCIsIHNldF9ub2h1Z2Vpb21hcCk7CisKK3ZvaWQgX19pbml0IGlvcmVtYXBfaHVnZV9pbml0KHZvaWQpCit7CisJaWYgKCFpb3JlbWFwX2h1Z2VfZGlzYWJsZWQpIHsKKwkJaWYgKGFyY2hfaW9yZW1hcF9wdWRfc3VwcG9ydGVkKCkpCisJCQlpb3JlbWFwX3B1ZF9jYXBhYmxlID0gMTsKKwkJaWYgKGFyY2hfaW9yZW1hcF9wbWRfc3VwcG9ydGVkKCkpCisJCQlpb3JlbWFwX3BtZF9jYXBhYmxlID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvcmVtYXBfcDRkX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gaW9yZW1hcF9wNGRfY2FwYWJsZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW9yZW1hcF9wdWRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBpb3JlbWFwX3B1ZF9jYXBhYmxlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3BtZF9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIGlvcmVtYXBfcG1kX2NhcGFibGU7Cit9CisKKyNlbHNlCS8qICFDT05GSUdfSEFWRV9BUkNIX0hVR0VfVk1BUCAqLworc3RhdGljIGlubGluZSBpbnQgaW9yZW1hcF9wNGRfZW5hYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3B1ZF9lbmFibGVkKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGlvcmVtYXBfcG1kX2VuYWJsZWQodm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCS8qIENPTkZJR19IQVZFX0FSQ0hfSFVHRV9WTUFQICovCisKK3N0YXRpYyBpbnQgaW9yZW1hcF9wdGVfcmFuZ2UocG1kX3QgKnBtZCwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQl1bnNpZ25lZCBsb25nIGVuZCwgcGh5c19hZGRyX3QgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KQoreworCXB0ZV90ICpwdGU7CisJdTY0IHBmbjsKKworCXBmbiA9IHBoeXNfYWRkciA+PiBQQUdFX1NISUZUOworCXB0ZSA9IHB0ZV9hbGxvY19rZXJuZWwocG1kLCBhZGRyKTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJZG8geworCQlCVUdfT04oIXB0ZV9ub25lKCpwdGUpKTsKKwkJc2V0X3B0ZV9hdCgmaW5pdF9tbSwgYWRkciwgcHRlLCBwZm5fcHRlKHBmbiwgcHJvdCkpOworCQlwZm4rKzsKKwl9IHdoaWxlIChwdGUrKywgYWRkciArPSBQQUdFX1NJWkUsIGFkZHIgIT0gZW5kKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW9yZW1hcF9wbWRfcmFuZ2UocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBhZGRyLAorCQl1bnNpZ25lZCBsb25nIGVuZCwgcGh5c19hZGRyX3QgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KQoreworCXBtZF90ICpwbWQ7CisJdW5zaWduZWQgbG9uZyBuZXh0OworCisJcGh5c19hZGRyIC09IGFkZHI7CisJcG1kID0gcG1kX2FsbG9jKCZpbml0X21tLCBwdWQsIGFkZHIpOworCWlmICghcG1kKQorCQlyZXR1cm4gLUVOT01FTTsKKwlkbyB7CisJCW5leHQgPSBwbWRfYWRkcl9lbmQoYWRkciwgZW5kKTsKKworCQlpZiAoaW9yZW1hcF9wbWRfZW5hYmxlZCgpICYmCisJCSAgICAoKG5leHQgLSBhZGRyKSA9PSBQTURfU0laRSkgJiYKKwkJICAgIElTX0FMSUdORUQocGh5c19hZGRyICsgYWRkciwgUE1EX1NJWkUpICYmCisJCSAgICBwbWRfZnJlZV9wdGVfcGFnZShwbWQsIGFkZHIpKSB7CisJCQlpZiAocG1kX3NldF9odWdlKHBtZCwgcGh5c19hZGRyICsgYWRkciwgcHJvdCkpCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaW9yZW1hcF9wdGVfcmFuZ2UocG1kLCBhZGRyLCBuZXh0LCBwaHlzX2FkZHIgKyBhZGRyLCBwcm90KSkKKwkJCXJldHVybiAtRU5PTUVNOworCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpb3JlbWFwX3B1ZF9yYW5nZShwNGRfdCAqcDRkLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCXVuc2lnbmVkIGxvbmcgZW5kLCBwaHlzX2FkZHJfdCBwaHlzX2FkZHIsIHBncHJvdF90IHByb3QpCit7CisJcHVkX3QgKnB1ZDsKKwl1bnNpZ25lZCBsb25nIG5leHQ7CisKKwlwaHlzX2FkZHIgLT0gYWRkcjsKKwlwdWQgPSBwdWRfYWxsb2MoJmluaXRfbW0sIHA0ZCwgYWRkcik7CisJaWYgKCFwdWQpCisJCXJldHVybiAtRU5PTUVNOworCWRvIHsKKwkJbmV4dCA9IHB1ZF9hZGRyX2VuZChhZGRyLCBlbmQpOworCisJCWlmIChpb3JlbWFwX3B1ZF9lbmFibGVkKCkgJiYKKwkJICAgICgobmV4dCAtIGFkZHIpID09IFBVRF9TSVpFKSAmJgorCQkgICAgSVNfQUxJR05FRChwaHlzX2FkZHIgKyBhZGRyLCBQVURfU0laRSkgJiYKKwkJICAgIHB1ZF9mcmVlX3BtZF9wYWdlKHB1ZCwgYWRkcikpIHsKKwkJCWlmIChwdWRfc2V0X2h1Z2UocHVkLCBwaHlzX2FkZHIgKyBhZGRyLCBwcm90KSkKKwkJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChpb3JlbWFwX3BtZF9yYW5nZShwdWQsIGFkZHIsIG5leHQsIHBoeXNfYWRkciArIGFkZHIsIHByb3QpKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfSB3aGlsZSAocHVkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlvcmVtYXBfcDRkX3JhbmdlKHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkciwKKwkJdW5zaWduZWQgbG9uZyBlbmQsIHBoeXNfYWRkcl90IHBoeXNfYWRkciwgcGdwcm90X3QgcHJvdCkKK3sKKwlwNGRfdCAqcDRkOworCXVuc2lnbmVkIGxvbmcgbmV4dDsKKworCXBoeXNfYWRkciAtPSBhZGRyOworCXA0ZCA9IHA0ZF9hbGxvYygmaW5pdF9tbSwgcGdkLCBhZGRyKTsKKwlpZiAoIXA0ZCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZG8geworCQluZXh0ID0gcDRkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisKKwkJaWYgKGlvcmVtYXBfcDRkX2VuYWJsZWQoKSAmJgorCQkgICAgKChuZXh0IC0gYWRkcikgPT0gUDREX1NJWkUpICYmCisJCSAgICBJU19BTElHTkVEKHBoeXNfYWRkciArIGFkZHIsIFA0RF9TSVpFKSkgeworCQkJaWYgKHA0ZF9zZXRfaHVnZShwNGQsIHBoeXNfYWRkciArIGFkZHIsIHByb3QpKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlvcmVtYXBfcHVkX3JhbmdlKHA0ZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyICsgYWRkciwgcHJvdCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9IHdoaWxlIChwNGQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGlvcmVtYXBfcGFnZV9yYW5nZSh1bnNpZ25lZCBsb25nIGFkZHIsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGVuZCwgcGh5c19hZGRyX3QgcGh5c19hZGRyLCBwZ3Byb3RfdCBwcm90KQoreworCXBnZF90ICpwZ2Q7CisJdW5zaWduZWQgbG9uZyBzdGFydDsKKwl1bnNpZ25lZCBsb25nIG5leHQ7CisJaW50IGVycjsKKworCW1pZ2h0X3NsZWVwKCk7CisJQlVHX09OKGFkZHIgPj0gZW5kKTsKKworCXN0YXJ0ID0gYWRkcjsKKwlwaHlzX2FkZHIgLT0gYWRkcjsKKwlwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcik7CisJZG8geworCQluZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CisJCWVyciA9IGlvcmVtYXBfcDRkX3JhbmdlKHBnZCwgYWRkciwgbmV4dCwgcGh5c19hZGRyK2FkZHIsIHByb3QpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJfSB3aGlsZSAocGdkKyssIGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CisKKwlmbHVzaF9jYWNoZV92bWFwKHN0YXJ0LCBlbmQpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lvdl9pdGVyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pb3ZfaXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMmZkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pb3ZfaXRlci5jCkBAIC0wLDAgKzEsMTQ2MSBAQAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2J2ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC91aW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGxpY2UuaD4KKyNpbmNsdWRlIDxuZXQvY2hlY2tzdW0uaD4KKworI2RlZmluZSBQSVBFX1BBUkFOT0lBIC8qIGZvciBub3cgKi8KKworI2RlZmluZSBpdGVyYXRlX2lvdmVjKGksIG4sIF9fdiwgX19wLCBza2lwLCBTVEVQKSB7CVwKKwlzaXplX3QgbGVmdDsJCQkJCVwKKwlzaXplX3Qgd2FudGVkID0gbjsJCQkJXAorCV9fcCA9IGktPmlvdjsJCQkJCVwKKwlfX3YuaW92X2xlbiA9IG1pbihuLCBfX3AtPmlvdl9sZW4gLSBza2lwKTsJXAorCWlmIChsaWtlbHkoX192Lmlvdl9sZW4pKSB7CQkJXAorCQlfX3YuaW92X2Jhc2UgPSBfX3AtPmlvdl9iYXNlICsgc2tpcDsJXAorCQlsZWZ0ID0gKFNURVApOwkJCQlcCisJCV9fdi5pb3ZfbGVuIC09IGxlZnQ7CQkJXAorCQlza2lwICs9IF9fdi5pb3ZfbGVuOwkJCVwKKwkJbiAtPSBfX3YuaW92X2xlbjsJCQlcCisJfSBlbHNlIHsJCQkJCVwKKwkJbGVmdCA9IDA7CQkJCVwKKwl9CQkJCQkJXAorCXdoaWxlICh1bmxpa2VseSghbGVmdCAmJiBuKSkgewkJCVwKKwkJX19wKys7CQkJCQlcCisJCV9fdi5pb3ZfbGVuID0gbWluKG4sIF9fcC0+aW92X2xlbik7CVwKKwkJaWYgKHVubGlrZWx5KCFfX3YuaW92X2xlbikpCQlcCisJCQljb250aW51ZTsJCQlcCisJCV9fdi5pb3ZfYmFzZSA9IF9fcC0+aW92X2Jhc2U7CQlcCisJCWxlZnQgPSAoU1RFUCk7CQkJCVwKKwkJX192Lmlvdl9sZW4gLT0gbGVmdDsJCQlcCisJCXNraXAgPSBfX3YuaW92X2xlbjsJCQlcCisJCW4gLT0gX192Lmlvdl9sZW47CQkJXAorCX0JCQkJCQlcCisJbiA9IHdhbnRlZCAtIG47CQkJCQlcCit9CisKKyNkZWZpbmUgaXRlcmF0ZV9rdmVjKGksIG4sIF9fdiwgX19wLCBza2lwLCBTVEVQKSB7CVwKKwlzaXplX3Qgd2FudGVkID0gbjsJCQkJXAorCV9fcCA9IGktPmt2ZWM7CQkJCQlcCisJX192Lmlvdl9sZW4gPSBtaW4obiwgX19wLT5pb3ZfbGVuIC0gc2tpcCk7CVwKKwlpZiAobGlrZWx5KF9fdi5pb3ZfbGVuKSkgewkJCVwKKwkJX192Lmlvdl9iYXNlID0gX19wLT5pb3ZfYmFzZSArIHNraXA7CVwKKwkJKHZvaWQpKFNURVApOwkJCQlcCisJCXNraXAgKz0gX192Lmlvdl9sZW47CQkJXAorCQluIC09IF9fdi5pb3ZfbGVuOwkJCVwKKwl9CQkJCQkJXAorCXdoaWxlICh1bmxpa2VseShuKSkgewkJCQlcCisJCV9fcCsrOwkJCQkJXAorCQlfX3YuaW92X2xlbiA9IG1pbihuLCBfX3AtPmlvdl9sZW4pOwlcCisJCWlmICh1bmxpa2VseSghX192Lmlvdl9sZW4pKQkJXAorCQkJY29udGludWU7CQkJXAorCQlfX3YuaW92X2Jhc2UgPSBfX3AtPmlvdl9iYXNlOwkJXAorCQkodm9pZCkoU1RFUCk7CQkJCVwKKwkJc2tpcCA9IF9fdi5pb3ZfbGVuOwkJCVwKKwkJbiAtPSBfX3YuaW92X2xlbjsJCQlcCisJfQkJCQkJCVwKKwluID0gd2FudGVkOwkJCQkJXAorfQorCisjZGVmaW5lIGl0ZXJhdGVfYnZlYyhpLCBuLCBfX3YsIF9fYmksIHNraXAsIFNURVApIHsJXAorCXN0cnVjdCBidmVjX2l0ZXIgX19zdGFydDsJCQlcCisJX19zdGFydC5iaV9zaXplID0gbjsJCQkJXAorCV9fc3RhcnQuYmlfYnZlY19kb25lID0gc2tpcDsJCQlcCisJX19zdGFydC5iaV9pZHggPSAwOwkJCQlcCisJZm9yX2VhY2hfYnZlYyhfX3YsIGktPmJ2ZWMsIF9fYmksIF9fc3RhcnQpIHsJXAorCQlpZiAoIV9fdi5idl9sZW4pCQkJXAorCQkJY29udGludWU7CQkJXAorCQkodm9pZCkoU1RFUCk7CQkJCVwKKwl9CQkJCQkJXAorfQorCisjZGVmaW5lIGl0ZXJhdGVfYWxsX2tpbmRzKGksIG4sIHYsIEksIEIsIEspIHsJCQlcCisJaWYgKGxpa2VseShuKSkgewkJCQkJXAorCQlzaXplX3Qgc2tpcCA9IGktPmlvdl9vZmZzZXQ7CQkJXAorCQlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfQlZFQykpIHsJCVwKKwkJCXN0cnVjdCBiaW9fdmVjIHY7CQkJXAorCQkJc3RydWN0IGJ2ZWNfaXRlciBfX2JpOwkJCVwKKwkJCWl0ZXJhdGVfYnZlYyhpLCBuLCB2LCBfX2JpLCBza2lwLCAoQikpCVwKKwkJfSBlbHNlIGlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9LVkVDKSkgewlcCisJCQljb25zdCBzdHJ1Y3Qga3ZlYyAqa3ZlYzsJCVwKKwkJCXN0cnVjdCBrdmVjIHY7CQkJCVwKKwkJCWl0ZXJhdGVfa3ZlYyhpLCBuLCB2LCBrdmVjLCBza2lwLCAoSykpCVwKKwkJfSBlbHNlIHsJCQkJCVwKKwkJCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92OwkJXAorCQkJc3RydWN0IGlvdmVjIHY7CQkJCVwKKwkJCWl0ZXJhdGVfaW92ZWMoaSwgbiwgdiwgaW92LCBza2lwLCAoSSkpCVwKKwkJfQkJCQkJCVwKKwl9CQkJCQkJCVwKK30KKworI2RlZmluZSBpdGVyYXRlX2FuZF9hZHZhbmNlKGksIG4sIHYsIEksIEIsIEspIHsJCQlcCisJaWYgKHVubGlrZWx5KGktPmNvdW50IDwgbikpCQkJCVwKKwkJbiA9IGktPmNvdW50OwkJCQkJXAorCWlmIChpLT5jb3VudCkgewkJCQkJCVwKKwkJc2l6ZV90IHNraXAgPSBpLT5pb3Zfb2Zmc2V0OwkJCVwKKwkJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX0JWRUMpKSB7CQlcCisJCQljb25zdCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYyA9IGktPmJ2ZWM7CVwKKwkJCXN0cnVjdCBiaW9fdmVjIHY7CQkJXAorCQkJc3RydWN0IGJ2ZWNfaXRlciBfX2JpOwkJCVwKKwkJCWl0ZXJhdGVfYnZlYyhpLCBuLCB2LCBfX2JpLCBza2lwLCAoQikpCVwKKwkJCWktPmJ2ZWMgPSBfX2J2ZWNfaXRlcl9idmVjKGktPmJ2ZWMsIF9fYmkpOwlcCisJCQlpLT5ucl9zZWdzIC09IGktPmJ2ZWMgLSBidmVjOwkJXAorCQkJc2tpcCA9IF9fYmkuYmlfYnZlY19kb25lOwkJXAorCQl9IGVsc2UgaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX0tWRUMpKSB7CVwKKwkJCWNvbnN0IHN0cnVjdCBrdmVjICprdmVjOwkJXAorCQkJc3RydWN0IGt2ZWMgdjsJCQkJXAorCQkJaXRlcmF0ZV9rdmVjKGksIG4sIHYsIGt2ZWMsIHNraXAsIChLKSkJXAorCQkJaWYgKHNraXAgPT0ga3ZlYy0+aW92X2xlbikgewkJXAorCQkJCWt2ZWMrKzsJCQkJXAorCQkJCXNraXAgPSAwOwkJCVwKKwkJCX0JCQkJCVwKKwkJCWktPm5yX3NlZ3MgLT0ga3ZlYyAtIGktPmt2ZWM7CQlcCisJCQlpLT5rdmVjID0ga3ZlYzsJCQkJXAorCQl9IGVsc2UgewkJCQkJXAorCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3Y7CQlcCisJCQlzdHJ1Y3QgaW92ZWMgdjsJCQkJXAorCQkJaXRlcmF0ZV9pb3ZlYyhpLCBuLCB2LCBpb3YsIHNraXAsIChJKSkJXAorCQkJaWYgKHNraXAgPT0gaW92LT5pb3ZfbGVuKSB7CQlcCisJCQkJaW92Kys7CQkJCVwKKwkJCQlza2lwID0gMDsJCQlcCisJCQl9CQkJCQlcCisJCQlpLT5ucl9zZWdzIC09IGlvdiAtIGktPmlvdjsJCVwKKwkJCWktPmlvdiA9IGlvdjsJCQkJXAorCQl9CQkJCQkJXAorCQlpLT5jb3VudCAtPSBuOwkJCQkJXAorCQlpLT5pb3Zfb2Zmc2V0ID0gc2tpcDsJCQkJXAorCX0JCQkJCQkJXAorfQorCitzdGF0aWMgaW50IGNvcHlvdXQodm9pZCBfX3VzZXIgKnRvLCBjb25zdCB2b2lkICpmcm9tLCBzaXplX3QgbikKK3sKKwlpZiAoYWNjZXNzX29rKFZFUklGWV9XUklURSwgdG8sIG4pKSB7CisJCWthc2FuX2NoZWNrX3JlYWQoZnJvbSwgbik7CisJCW4gPSByYXdfY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgY29weWluKHZvaWQgKnRvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwgc2l6ZV90IG4pCit7CisJaWYgKGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpIHsKKwkJa2FzYW5fY2hlY2tfd3JpdGUodG8sIG4pOworCQluID0gcmF3X2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzaXplX3QgY29weV9wYWdlX3RvX2l0ZXJfaW92ZWMoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKKwkJCSBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc2l6ZV90IHNraXAsIGNvcHksIGxlZnQsIHdhbnRlZDsKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdjsKKwljaGFyIF9fdXNlciAqYnVmOworCXZvaWQgKmthZGRyLCAqZnJvbTsKKworCWlmICh1bmxpa2VseShieXRlcyA+IGktPmNvdW50KSkKKwkJYnl0ZXMgPSBpLT5jb3VudDsKKworCWlmICh1bmxpa2VseSghYnl0ZXMpKQorCQlyZXR1cm4gMDsKKworCW1pZ2h0X2ZhdWx0KCk7CisJd2FudGVkID0gYnl0ZXM7CisJaW92ID0gaS0+aW92OworCXNraXAgPSBpLT5pb3Zfb2Zmc2V0OworCWJ1ZiA9IGlvdi0+aW92X2Jhc2UgKyBza2lwOworCWNvcHkgPSBtaW4oYnl0ZXMsIGlvdi0+aW92X2xlbiAtIHNraXApOworCisJaWYgKElTX0VOQUJMRUQoQ09ORklHX0hJR0hNRU0pICYmICFmYXVsdF9pbl9wYWdlc193cml0ZWFibGUoYnVmLCBjb3B5KSkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UpOworCQlmcm9tID0ga2FkZHIgKyBvZmZzZXQ7CisKKwkJLyogZmlyc3QgY2h1bmssIHVzdWFsbHkgdGhlIG9ubHkgb25lICovCisJCWxlZnQgPSBjb3B5b3V0KGJ1ZiwgZnJvbSwgY29weSk7CisJCWNvcHkgLT0gbGVmdDsKKwkJc2tpcCArPSBjb3B5OworCQlmcm9tICs9IGNvcHk7CisJCWJ5dGVzIC09IGNvcHk7CisKKwkJd2hpbGUgKHVubGlrZWx5KCFsZWZ0ICYmIGJ5dGVzKSkgeworCQkJaW92Kys7CisJCQlidWYgPSBpb3YtPmlvdl9iYXNlOworCQkJY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuKTsKKwkJCWxlZnQgPSBjb3B5b3V0KGJ1ZiwgZnJvbSwgY29weSk7CisJCQljb3B5IC09IGxlZnQ7CisJCQlza2lwID0gY29weTsKKwkJCWZyb20gKz0gY29weTsKKwkJCWJ5dGVzIC09IGNvcHk7CisJCX0KKwkJaWYgKGxpa2VseSghYnl0ZXMpKSB7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlvZmZzZXQgPSBmcm9tIC0ga2FkZHI7CisJCWJ1ZiArPSBjb3B5OworCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJY29weSA9IG1pbihieXRlcywgaW92LT5pb3ZfbGVuIC0gc2tpcCk7CisJfQorCS8qIFRvbyBiYWQgLSByZXZlcnQgdG8gbm9uLWF0b21pYyBrbWFwICovCisKKwlrYWRkciA9IGttYXAocGFnZSk7CisJZnJvbSA9IGthZGRyICsgb2Zmc2V0OworCWxlZnQgPSBjb3B5b3V0KGJ1ZiwgZnJvbSwgY29weSk7CisJY29weSAtPSBsZWZ0OworCXNraXAgKz0gY29weTsKKwlmcm9tICs9IGNvcHk7CisJYnl0ZXMgLT0gY29weTsKKwl3aGlsZSAodW5saWtlbHkoIWxlZnQgJiYgYnl0ZXMpKSB7CisJCWlvdisrOworCQlidWYgPSBpb3YtPmlvdl9iYXNlOworCQljb3B5ID0gbWluKGJ5dGVzLCBpb3YtPmlvdl9sZW4pOworCQlsZWZ0ID0gY29weW91dChidWYsIGZyb20sIGNvcHkpOworCQljb3B5IC09IGxlZnQ7CisJCXNraXAgPSBjb3B5OworCQlmcm9tICs9IGNvcHk7CisJCWJ5dGVzIC09IGNvcHk7CisJfQorCWt1bm1hcChwYWdlKTsKKworZG9uZToKKwlpZiAoc2tpcCA9PSBpb3YtPmlvdl9sZW4pIHsKKwkJaW92Kys7CisJCXNraXAgPSAwOworCX0KKwlpLT5jb3VudCAtPSB3YW50ZWQgLSBieXRlczsKKwlpLT5ucl9zZWdzIC09IGlvdiAtIGktPmlvdjsKKwlpLT5pb3YgPSBpb3Y7CisJaS0+aW92X29mZnNldCA9IHNraXA7CisJcmV0dXJuIHdhbnRlZCAtIGJ5dGVzOworfQorCitzdGF0aWMgc2l6ZV90IGNvcHlfcGFnZV9mcm9tX2l0ZXJfaW92ZWMoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKKwkJCSBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc2l6ZV90IHNraXAsIGNvcHksIGxlZnQsIHdhbnRlZDsKKwljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdjsKKwljaGFyIF9fdXNlciAqYnVmOworCXZvaWQgKmthZGRyLCAqdG87CisKKwlpZiAodW5saWtlbHkoYnl0ZXMgPiBpLT5jb3VudCkpCisJCWJ5dGVzID0gaS0+Y291bnQ7CisKKwlpZiAodW5saWtlbHkoIWJ5dGVzKSkKKwkJcmV0dXJuIDA7CisKKwltaWdodF9mYXVsdCgpOworCXdhbnRlZCA9IGJ5dGVzOworCWlvdiA9IGktPmlvdjsKKwlza2lwID0gaS0+aW92X29mZnNldDsKKwlidWYgPSBpb3YtPmlvdl9iYXNlICsgc2tpcDsKKwljb3B5ID0gbWluKGJ5dGVzLCBpb3YtPmlvdl9sZW4gLSBza2lwKTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19ISUdITUVNKSAmJiAhZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBjb3B5KSkgeworCQlrYWRkciA9IGttYXBfYXRvbWljKHBhZ2UpOworCQl0byA9IGthZGRyICsgb2Zmc2V0OworCisJCS8qIGZpcnN0IGNodW5rLCB1c3VhbGx5IHRoZSBvbmx5IG9uZSAqLworCQlsZWZ0ID0gY29weWluKHRvLCBidWYsIGNvcHkpOworCQljb3B5IC09IGxlZnQ7CisJCXNraXAgKz0gY29weTsKKwkJdG8gKz0gY29weTsKKwkJYnl0ZXMgLT0gY29weTsKKworCQl3aGlsZSAodW5saWtlbHkoIWxlZnQgJiYgYnl0ZXMpKSB7CisJCQlpb3YrKzsKKwkJCWJ1ZiA9IGlvdi0+aW92X2Jhc2U7CisJCQljb3B5ID0gbWluKGJ5dGVzLCBpb3YtPmlvdl9sZW4pOworCQkJbGVmdCA9IGNvcHlpbih0bywgYnVmLCBjb3B5KTsKKwkJCWNvcHkgLT0gbGVmdDsKKwkJCXNraXAgPSBjb3B5OworCQkJdG8gKz0gY29weTsKKwkJCWJ5dGVzIC09IGNvcHk7CisJCX0KKwkJaWYgKGxpa2VseSghYnl0ZXMpKSB7CisJCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCQlvZmZzZXQgPSB0byAtIGthZGRyOworCQlidWYgKz0gY29weTsKKwkJa3VubWFwX2F0b21pYyhrYWRkcik7CisJCWNvcHkgPSBtaW4oYnl0ZXMsIGlvdi0+aW92X2xlbiAtIHNraXApOworCX0KKwkvKiBUb28gYmFkIC0gcmV2ZXJ0IHRvIG5vbi1hdG9taWMga21hcCAqLworCisJa2FkZHIgPSBrbWFwKHBhZ2UpOworCXRvID0ga2FkZHIgKyBvZmZzZXQ7CisJbGVmdCA9IGNvcHlpbih0bywgYnVmLCBjb3B5KTsKKwljb3B5IC09IGxlZnQ7CisJc2tpcCArPSBjb3B5OworCXRvICs9IGNvcHk7CisJYnl0ZXMgLT0gY29weTsKKwl3aGlsZSAodW5saWtlbHkoIWxlZnQgJiYgYnl0ZXMpKSB7CisJCWlvdisrOworCQlidWYgPSBpb3YtPmlvdl9iYXNlOworCQljb3B5ID0gbWluKGJ5dGVzLCBpb3YtPmlvdl9sZW4pOworCQlsZWZ0ID0gY29weWluKHRvLCBidWYsIGNvcHkpOworCQljb3B5IC09IGxlZnQ7CisJCXNraXAgPSBjb3B5OworCQl0byArPSBjb3B5OworCQlieXRlcyAtPSBjb3B5OworCX0KKwlrdW5tYXAocGFnZSk7CisKK2RvbmU6CisJaWYgKHNraXAgPT0gaW92LT5pb3ZfbGVuKSB7CisJCWlvdisrOworCQlza2lwID0gMDsKKwl9CisJaS0+Y291bnQgLT0gd2FudGVkIC0gYnl0ZXM7CisJaS0+bnJfc2VncyAtPSBpb3YgLSBpLT5pb3Y7CisJaS0+aW92ID0gaW92OworCWktPmlvdl9vZmZzZXQgPSBza2lwOworCXJldHVybiB3YW50ZWQgLSBieXRlczsKK30KKworI2lmZGVmIFBJUEVfUEFSQU5PSUEKK3N0YXRpYyBib29sIHNhbml0eShjb25zdCBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJaW50IGlkeCA9IGktPmlkeDsKKwlpbnQgbmV4dCA9IHBpcGUtPmN1cmJ1ZiArIHBpcGUtPm5yYnVmczsKKwlpZiAoaS0+aW92X29mZnNldCkgeworCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKnA7CisJCWlmICh1bmxpa2VseSghcGlwZS0+bnJidWZzKSkKKwkJCWdvdG8gQmFkOwkvLyBwaXBlIG11c3QgYmUgbm9uLWVtcHR5CisJCWlmICh1bmxpa2VseShpZHggIT0gKChuZXh0IC0gMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpKSkpCisJCQlnb3RvIEJhZDsJLy8gbXVzdCBiZSBhdCB0aGUgbGFzdCBidWZmZXIuLi4KKworCQlwID0gJnBpcGUtPmJ1ZnNbaWR4XTsKKwkJaWYgKHVubGlrZWx5KHAtPm9mZnNldCArIHAtPmxlbiAhPSBpLT5pb3Zfb2Zmc2V0KSkKKwkJCWdvdG8gQmFkOwkvLyAuLi4gYXQgdGhlIGVuZCBvZiBzZWdtZW50CisJfSBlbHNlIHsKKwkJaWYgKGlkeCAhPSAobmV4dCAmIChwaXBlLT5idWZmZXJzIC0gMSkpKQorCQkJZ290byBCYWQ7CS8vIG11c3QgYmUgcmlnaHQgYWZ0ZXIgdGhlIGxhc3QgYnVmZmVyCisJfQorCXJldHVybiB0cnVlOworQmFkOgorCXByaW50ayhLRVJOX0VSUiAiaWR4ID0gJWQsIG9mZnNldCA9ICV6ZFxuIiwgaS0+aWR4LCBpLT5pb3Zfb2Zmc2V0KTsKKwlwcmludGsoS0VSTl9FUlIgImN1cmJ1ZiA9ICVkLCBucmJ1ZnMgPSAlZCwgYnVmZmVycyA9ICVkXG4iLAorCQkJcGlwZS0+Y3VyYnVmLCBwaXBlLT5ucmJ1ZnMsIHBpcGUtPmJ1ZmZlcnMpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgcGlwZS0+YnVmZmVyczsgaWR4KyspCisJCXByaW50ayhLRVJOX0VSUiAiWyVwICVwICVkICVkXVxuIiwKKwkJCXBpcGUtPmJ1ZnNbaWR4XS5vcHMsCisJCQlwaXBlLT5idWZzW2lkeF0ucGFnZSwKKwkJCXBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQsCisJCQlwaXBlLT5idWZzW2lkeF0ubGVuKTsKKwlXQVJOX09OKDEpOworCXJldHVybiBmYWxzZTsKK30KKyNlbHNlCisjZGVmaW5lIHNhbml0eShpKSB0cnVlCisjZW5kaWYKKworc3RhdGljIGlubGluZSBpbnQgbmV4dF9pZHgoaW50IGlkeCwgc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSkKK3sKKwlyZXR1cm4gKGlkeCArIDEpICYgKHBpcGUtPmJ1ZmZlcnMgLSAxKTsKK30KKworc3RhdGljIHNpemVfdCBjb3B5X3BhZ2VfdG9faXRlcl9waXBlKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgYnl0ZXMsCisJCQkgc3RydWN0IGlvdl9pdGVyICppKQoreworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnBpcGUgPSBpLT5waXBlOworCXN0cnVjdCBwaXBlX2J1ZmZlciAqYnVmOworCXNpemVfdCBvZmY7CisJaW50IGlkeDsKKworCWlmICh1bmxpa2VseShieXRlcyA+IGktPmNvdW50KSkKKwkJYnl0ZXMgPSBpLT5jb3VudDsKKworCWlmICh1bmxpa2VseSghYnl0ZXMpKQorCQlyZXR1cm4gMDsKKworCWlmICghc2FuaXR5KGkpKQorCQlyZXR1cm4gMDsKKworCW9mZiA9IGktPmlvdl9vZmZzZXQ7CisJaWR4ID0gaS0+aWR4OworCWJ1ZiA9ICZwaXBlLT5idWZzW2lkeF07CisJaWYgKG9mZikgeworCQlpZiAob2Zmc2V0ID09IG9mZiAmJiBidWYtPnBhZ2UgPT0gcGFnZSkgeworCQkJLyogbWVyZ2Ugd2l0aCB0aGUgbGFzdCBvbmUgKi8KKwkJCWJ1Zi0+bGVuICs9IGJ5dGVzOworCQkJaS0+aW92X29mZnNldCArPSBieXRlczsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSk7CisJCWJ1ZiA9ICZwaXBlLT5idWZzW2lkeF07CisJfQorCWlmIChpZHggPT0gcGlwZS0+Y3VyYnVmICYmIHBpcGUtPm5yYnVmcykKKwkJcmV0dXJuIDA7CisJcGlwZS0+bnJidWZzKys7CisJYnVmLT5vcHMgPSAmcGFnZV9jYWNoZV9waXBlX2J1Zl9vcHM7CisJZ2V0X3BhZ2UoYnVmLT5wYWdlID0gcGFnZSk7CisJYnVmLT5vZmZzZXQgPSBvZmZzZXQ7CisJYnVmLT5sZW4gPSBieXRlczsKKwlpLT5pb3Zfb2Zmc2V0ID0gb2Zmc2V0ICsgYnl0ZXM7CisJaS0+aWR4ID0gaWR4Oworb3V0OgorCWktPmNvdW50IC09IGJ5dGVzOworCXJldHVybiBieXRlczsKK30KKworLyoKKyAqIEZhdWx0IGluIG9uZSBvciBtb3JlIGlvdmVjcyBvZiB0aGUgZ2l2ZW4gaW92X2l0ZXIsIHRvIGEgbWF4aW11bSBsZW5ndGggb2YKKyAqIGJ5dGVzLiAgRm9yIGVhY2ggaW92ZWMsIGZhdWx0IGluIGVhY2ggcGFnZSB0aGF0IGNvbnN0aXR1dGVzIHRoZSBpb3ZlYy4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCBvciBub24temVybyBpZiB0aGUgbWVtb3J5IGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCAoaS5lLgorICogYmVjYXVzZSBpdCBpcyBhbiBpbnZhbGlkIGFkZHJlc3MpLgorICovCitpbnQgaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUoc3RydWN0IGlvdl9pdGVyICppLCBzaXplX3QgYnl0ZXMpCit7CisJc2l6ZV90IHNraXAgPSBpLT5pb3Zfb2Zmc2V0OworCWNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92OworCWludCBlcnI7CisJc3RydWN0IGlvdmVjIHY7CisKKwlpZiAoIShpLT50eXBlICYgKElURVJfQlZFQ3xJVEVSX0tWRUMpKSkgeworCQlpdGVyYXRlX2lvdmVjKGksIGJ5dGVzLCB2LCBpb3YsIHNraXAsICh7CisJCQllcnIgPSBmYXVsdF9pbl9wYWdlc19yZWFkYWJsZSh2Lmlvdl9iYXNlLCB2Lmlvdl9sZW4pOworCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQlyZXR1cm4gZXJyOworCQkwO30pKQorCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfZmF1bHRfaW5fcmVhZGFibGUpOworCit2b2lkIGlvdl9pdGVyX2luaXQoc3RydWN0IGlvdl9pdGVyICppLCBpbnQgZGlyZWN0aW9uLAorCQkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIHVuc2lnbmVkIGxvbmcgbnJfc2VncywKKwkJCXNpemVfdCBjb3VudCkKK3sKKwkvKiBJdCB3aWxsIGdldCBiZXR0ZXIuICBFdmVudHVhbGx5Li4uICovCisJaWYgKHVhY2Nlc3Nfa2VybmVsKCkpIHsKKwkJZGlyZWN0aW9uIHw9IElURVJfS1ZFQzsKKwkJaS0+dHlwZSA9IGRpcmVjdGlvbjsKKwkJaS0+a3ZlYyA9IChzdHJ1Y3Qga3ZlYyAqKWlvdjsKKwl9IGVsc2UgeworCQlpLT50eXBlID0gZGlyZWN0aW9uOworCQlpLT5pb3YgPSBpb3Y7CisJfQorCWktPm5yX3NlZ3MgPSBucl9zZWdzOworCWktPmlvdl9vZmZzZXQgPSAwOworCWktPmNvdW50ID0gY291bnQ7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2luaXQpOworCitzdGF0aWMgdm9pZCBtZW1jcHlfZnJvbV9wYWdlKGNoYXIgKnRvLCBzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbikKK3sKKwljaGFyICpmcm9tID0ga21hcF9hdG9taWMocGFnZSk7CisJbWVtY3B5KHRvLCBmcm9tICsgb2Zmc2V0LCBsZW4pOworCWt1bm1hcF9hdG9taWMoZnJvbSk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbWNweV90b19wYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzaXplX3Qgb2Zmc2V0LCBjb25zdCBjaGFyICpmcm9tLCBzaXplX3QgbGVuKQoreworCWNoYXIgKnRvID0ga21hcF9hdG9taWMocGFnZSk7CisJbWVtY3B5KHRvICsgb2Zmc2V0LCBmcm9tLCBsZW4pOworCWt1bm1hcF9hdG9taWModG8pOworfQorCitzdGF0aWMgdm9pZCBtZW16ZXJvX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW4pCit7CisJY2hhciAqYWRkciA9IGttYXBfYXRvbWljKHBhZ2UpOworCW1lbXNldChhZGRyICsgb2Zmc2V0LCAwLCBsZW4pOworCWt1bm1hcF9hdG9taWMoYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBhbGxvY2F0ZWQoc3RydWN0IHBpcGVfYnVmZmVyICpidWYpCit7CisJcmV0dXJuIGJ1Zi0+b3BzID09ICZkZWZhdWx0X3BpcGVfYnVmX29wczsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRhdGFfc3RhcnQoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppLCBpbnQgKmlkeHAsIHNpemVfdCAqb2ZmcCkKK3sKKwlzaXplX3Qgb2ZmID0gaS0+aW92X29mZnNldDsKKwlpbnQgaWR4ID0gaS0+aWR4OworCWlmIChvZmYgJiYgKCFhbGxvY2F0ZWQoJmktPnBpcGUtPmJ1ZnNbaWR4XSkgfHwgb2ZmID09IFBBR0VfU0laRSkpIHsKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBpLT5waXBlKTsKKwkJb2ZmID0gMDsKKwl9CisJKmlkeHAgPSBpZHg7CisJKm9mZnAgPSBvZmY7Cit9CisKK3N0YXRpYyBzaXplX3QgcHVzaF9waXBlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IHNpemUsCisJCQlpbnQgKmlkeHAsIHNpemVfdCAqb2ZmcCkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwlzaXplX3Qgb2ZmOworCWludCBpZHg7CisJc3NpemVfdCBsZWZ0OworCisJaWYgKHVubGlrZWx5KHNpemUgPiBpLT5jb3VudCkpCisJCXNpemUgPSBpLT5jb3VudDsKKwlpZiAodW5saWtlbHkoIXNpemUpKQorCQlyZXR1cm4gMDsKKworCWxlZnQgPSBzaXplOworCWRhdGFfc3RhcnQoaSwgJmlkeCwgJm9mZik7CisJKmlkeHAgPSBpZHg7CisJKm9mZnAgPSBvZmY7CisJaWYgKG9mZikgeworCQlsZWZ0IC09IFBBR0VfU0laRSAtIG9mZjsKKwkJaWYgKGxlZnQgPD0gMCkgeworCQkJcGlwZS0+YnVmc1tpZHhdLmxlbiArPSBzaXplOworCQkJcmV0dXJuIHNpemU7CisJCX0KKwkJcGlwZS0+YnVmc1tpZHhdLmxlbiA9IFBBR0VfU0laRTsKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwl9CisJd2hpbGUgKGlkeCAhPSBwaXBlLT5jdXJidWYgfHwgIXBpcGUtPm5yYnVmcykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX1VTRVIpOworCQlpZiAoIXBhZ2UpCisJCQlicmVhazsKKwkJcGlwZS0+bnJidWZzKys7CisJCXBpcGUtPmJ1ZnNbaWR4XS5vcHMgPSAmZGVmYXVsdF9waXBlX2J1Zl9vcHM7CisJCXBpcGUtPmJ1ZnNbaWR4XS5wYWdlID0gcGFnZTsKKwkJcGlwZS0+YnVmc1tpZHhdLm9mZnNldCA9IDA7CisJCWlmIChsZWZ0IDw9IFBBR0VfU0laRSkgeworCQkJcGlwZS0+YnVmc1tpZHhdLmxlbiA9IGxlZnQ7CisJCQlyZXR1cm4gc2l6ZTsKKwkJfQorCQlwaXBlLT5idWZzW2lkeF0ubGVuID0gUEFHRV9TSVpFOworCQlsZWZ0IC09IFBBR0VfU0laRTsKKwkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwl9CisJcmV0dXJuIHNpemUgLSBsZWZ0OworfQorCitzdGF0aWMgc2l6ZV90IGNvcHlfcGlwZV90b19pdGVyKGNvbnN0IHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywKKwkJCQlzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJc2l6ZV90IG4sIG9mZjsKKwlpbnQgaWR4OworCisJaWYgKCFzYW5pdHkoaSkpCisJCXJldHVybiAwOworCisJYnl0ZXMgPSBuID0gcHVzaF9waXBlKGksIGJ5dGVzLCAmaWR4LCAmb2ZmKTsKKwlpZiAodW5saWtlbHkoIW4pKQorCQlyZXR1cm4gMDsKKwlmb3IgKCA7IG47IGlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSksIG9mZiA9IDApIHsKKwkJc2l6ZV90IGNodW5rID0gbWluX3Qoc2l6ZV90LCBuLCBQQUdFX1NJWkUgLSBvZmYpOworCQltZW1jcHlfdG9fcGFnZShwaXBlLT5idWZzW2lkeF0ucGFnZSwgb2ZmLCBhZGRyLCBjaHVuayk7CisJCWktPmlkeCA9IGlkeDsKKwkJaS0+aW92X29mZnNldCA9IG9mZiArIGNodW5rOworCQluIC09IGNodW5rOworCQlhZGRyICs9IGNodW5rOworCX0KKwlpLT5jb3VudCAtPSBieXRlczsKKwlyZXR1cm4gYnl0ZXM7Cit9CisKK3NpemVfdCBfY29weV90b19pdGVyKGNvbnN0IHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywgc3RydWN0IGlvdl9pdGVyICppKQoreworCWNvbnN0IGNoYXIgKmZyb20gPSBhZGRyOworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkKKwkJcmV0dXJuIGNvcHlfcGlwZV90b19pdGVyKGFkZHIsIGJ5dGVzLCBpKTsKKwlpZiAoaXRlcl9pc19pb3ZlYyhpKSkKKwkJbWlnaHRfZmF1bHQoKTsKKwlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LAorCQljb3B5b3V0KHYuaW92X2Jhc2UsIChmcm9tICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sIHYuaW92X2xlbiksCisJCW1lbWNweV90b19wYWdlKHYuYnZfcGFnZSwgdi5idl9vZmZzZXQsCisJCQkgICAgICAgKGZyb20gKz0gdi5idl9sZW4pIC0gdi5idl9sZW4sIHYuYnZfbGVuKSwKKwkJbWVtY3B5KHYuaW92X2Jhc2UsIChmcm9tICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sIHYuaW92X2xlbikKKwkpCisKKwlyZXR1cm4gYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKF9jb3B5X3RvX2l0ZXIpOworCitzaXplX3QgX2NvcHlfZnJvbV9pdGVyKHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywgc3RydWN0IGlvdl9pdGVyICppKQoreworCWNoYXIgKnRvID0gYWRkcjsKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpdGVyX2lzX2lvdmVjKGkpKQorCQltaWdodF9mYXVsdCgpOworCWl0ZXJhdGVfYW5kX2FkdmFuY2UoaSwgYnl0ZXMsIHYsCisJCWNvcHlpbigodG8gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwgdi5pb3ZfYmFzZSwgdi5pb3ZfbGVuKSwKKwkJbWVtY3B5X2Zyb21fcGFnZSgodG8gKz0gdi5idl9sZW4pIC0gdi5idl9sZW4sIHYuYnZfcGFnZSwKKwkJCQkgdi5idl9vZmZzZXQsIHYuYnZfbGVuKSwKKwkJbWVtY3B5KCh0byArPSB2Lmlvdl9sZW4pIC0gdi5pb3ZfbGVuLCB2Lmlvdl9iYXNlLCB2Lmlvdl9sZW4pCisJKQorCisJcmV0dXJuIGJ5dGVzOworfQorRVhQT1JUX1NZTUJPTChfY29weV9mcm9tX2l0ZXIpOworCitib29sIF9jb3B5X2Zyb21faXRlcl9mdWxsKHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywgc3RydWN0IGlvdl9pdGVyICppKQoreworCWNoYXIgKnRvID0gYWRkcjsKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodW5saWtlbHkoaS0+Y291bnQgPCBieXRlcykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChpdGVyX2lzX2lvdmVjKGkpKQorCQltaWdodF9mYXVsdCgpOworCWl0ZXJhdGVfYWxsX2tpbmRzKGksIGJ5dGVzLCB2LCAoeworCQlpZiAoY29weWluKCh0byArPSB2Lmlvdl9sZW4pIC0gdi5pb3ZfbGVuLAorCQkJCSAgICAgIHYuaW92X2Jhc2UsIHYuaW92X2xlbikpCisJCQlyZXR1cm4gZmFsc2U7CisJCTA7fSksCisJCW1lbWNweV9mcm9tX3BhZ2UoKHRvICs9IHYuYnZfbGVuKSAtIHYuYnZfbGVuLCB2LmJ2X3BhZ2UsCisJCQkJIHYuYnZfb2Zmc2V0LCB2LmJ2X2xlbiksCisJCW1lbWNweSgodG8gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwgdi5pb3ZfYmFzZSwgdi5pb3ZfbGVuKQorCSkKKworCWlvdl9pdGVyX2FkdmFuY2UoaSwgYnl0ZXMpOworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChfY29weV9mcm9tX2l0ZXJfZnVsbCk7CisKK3NpemVfdCBfY29weV9mcm9tX2l0ZXJfbm9jYWNoZSh2b2lkICphZGRyLCBzaXplX3QgYnl0ZXMsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwljaGFyICp0byA9IGFkZHI7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKwlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LAorCQlfX2NvcHlfZnJvbV91c2VyX2luYXRvbWljX25vY2FjaGUoKHRvICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sCisJCQkJCSB2Lmlvdl9iYXNlLCB2Lmlvdl9sZW4pLAorCQltZW1jcHlfZnJvbV9wYWdlKCh0byArPSB2LmJ2X2xlbikgLSB2LmJ2X2xlbiwgdi5idl9wYWdlLAorCQkJCSB2LmJ2X29mZnNldCwgdi5idl9sZW4pLAorCQltZW1jcHkoKHRvICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sIHYuaW92X2Jhc2UsIHYuaW92X2xlbikKKwkpCisKKwlyZXR1cm4gYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKF9jb3B5X2Zyb21faXRlcl9ub2NhY2hlKTsKKworI2lmZGVmIENPTkZJR19BUkNIX0hBU19VQUNDRVNTX0ZMVVNIQ0FDSEUKK3NpemVfdCBfY29weV9mcm9tX2l0ZXJfZmx1c2hjYWNoZSh2b2lkICphZGRyLCBzaXplX3QgYnl0ZXMsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwljaGFyICp0byA9IGFkZHI7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKwlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LAorCQlfX2NvcHlfZnJvbV91c2VyX2ZsdXNoY2FjaGUoKHRvICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sCisJCQkJCSB2Lmlvdl9iYXNlLCB2Lmlvdl9sZW4pLAorCQltZW1jcHlfcGFnZV9mbHVzaGNhY2hlKCh0byArPSB2LmJ2X2xlbikgLSB2LmJ2X2xlbiwgdi5idl9wYWdlLAorCQkJCSB2LmJ2X29mZnNldCwgdi5idl9sZW4pLAorCQltZW1jcHlfZmx1c2hjYWNoZSgodG8gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwgdi5pb3ZfYmFzZSwKKwkJCXYuaW92X2xlbikKKwkpCisKKwlyZXR1cm4gYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfY29weV9mcm9tX2l0ZXJfZmx1c2hjYWNoZSk7CisjZW5kaWYKKworYm9vbCBfY29weV9mcm9tX2l0ZXJfZnVsbF9ub2NhY2hlKHZvaWQgKmFkZHIsIHNpemVfdCBieXRlcywgc3RydWN0IGlvdl9pdGVyICppKQoreworCWNoYXIgKnRvID0gYWRkcjsKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJV0FSTl9PTigxKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlpZiAodW5saWtlbHkoaS0+Y291bnQgPCBieXRlcykpCisJCXJldHVybiBmYWxzZTsKKwlpdGVyYXRlX2FsbF9raW5kcyhpLCBieXRlcywgdiwgKHsKKwkJaWYgKF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWNfbm9jYWNoZSgodG8gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwKKwkJCQkJICAgICB2Lmlvdl9iYXNlLCB2Lmlvdl9sZW4pKQorCQkJcmV0dXJuIGZhbHNlOworCQkwO30pLAorCQltZW1jcHlfZnJvbV9wYWdlKCh0byArPSB2LmJ2X2xlbikgLSB2LmJ2X2xlbiwgdi5idl9wYWdlLAorCQkJCSB2LmJ2X29mZnNldCwgdi5idl9sZW4pLAorCQltZW1jcHkoKHRvICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sIHYuaW92X2Jhc2UsIHYuaW92X2xlbikKKwkpCisKKwlpb3ZfaXRlcl9hZHZhbmNlKGksIGJ5dGVzKTsKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0woX2NvcHlfZnJvbV9pdGVyX2Z1bGxfbm9jYWNoZSk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwYWdlX2NvcHlfc2FuZShzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IG4pCit7CisJc3RydWN0IHBhZ2UgKmhlYWQ7CisJc2l6ZV90IHYgPSBuICsgb2Zmc2V0OworCisJLyoKKwkgKiBUaGUgZ2VuZXJhbCBjYXNlIG5lZWRzIHRvIGFjY2VzcyB0aGUgcGFnZSBvcmRlciBpbiBvcmRlcgorCSAqIHRvIGNvbXB1dGUgdGhlIHBhZ2Ugc2l6ZS4KKwkgKiBIb3dldmVyLCB3ZSBtb3N0bHkgZGVhbCB3aXRoIG9yZGVyLTAgcGFnZXMgYW5kIHRodXMgY2FuCisJICogYXZvaWQgYSBwb3NzaWJsZSBjYWNoZSBsaW5lIG1pc3MgZm9yIHJlcXVlc3RzIHRoYXQgZml0IGFsbAorCSAqIHBhZ2Ugb3JkZXJzLgorCSAqLworCWlmIChuIDw9IHYgJiYgdiA8PSBQQUdFX1NJWkUpCisJCXJldHVybiB0cnVlOworCisJaGVhZCA9IGNvbXBvdW5kX2hlYWQocGFnZSk7CisJdiArPSAocGFnZSAtIGhlYWQpIDw8IFBBR0VfU0hJRlQ7CisKKwlpZiAobGlrZWx5KG4gPD0gdiAmJiB2IDw9IChQQUdFX1NJWkUgPDwgY29tcG91bmRfb3JkZXIoaGVhZCkpKSkKKwkJcmV0dXJuIHRydWU7CisJV0FSTl9PTigxKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3NpemVfdCBjb3B5X3BhZ2VfdG9faXRlcihzdHJ1Y3QgcGFnZSAqcGFnZSwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IGJ5dGVzLAorCQkJIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlpZiAodW5saWtlbHkoIXBhZ2VfY29weV9zYW5lKHBhZ2UsIG9mZnNldCwgYnl0ZXMpKSkKKwkJcmV0dXJuIDA7CisJaWYgKGktPnR5cGUgJiAoSVRFUl9CVkVDfElURVJfS1ZFQykpIHsKKwkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwkJc2l6ZV90IHdhbnRlZCA9IGNvcHlfdG9faXRlcihrYWRkciArIG9mZnNldCwgYnl0ZXMsIGkpOworCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJcmV0dXJuIHdhbnRlZDsKKwl9IGVsc2UgaWYgKGxpa2VseSghKGktPnR5cGUgJiBJVEVSX1BJUEUpKSkKKwkJcmV0dXJuIGNvcHlfcGFnZV90b19pdGVyX2lvdmVjKHBhZ2UsIG9mZnNldCwgYnl0ZXMsIGkpOworCWVsc2UKKwkJcmV0dXJuIGNvcHlfcGFnZV90b19pdGVyX3BpcGUocGFnZSwgb2Zmc2V0LCBieXRlcywgaSk7Cit9CitFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZV90b19pdGVyKTsKKworc2l6ZV90IGNvcHlfcGFnZV9mcm9tX2l0ZXIoc3RydWN0IHBhZ2UgKnBhZ2UsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBieXRlcywKKwkJCSBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJaWYgKHVubGlrZWx5KCFwYWdlX2NvcHlfc2FuZShwYWdlLCBvZmZzZXQsIGJ5dGVzKSkpCisJCXJldHVybiAwOworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGktPnR5cGUgJiAoSVRFUl9CVkVDfElURVJfS1ZFQykpIHsKKwkJdm9pZCAqa2FkZHIgPSBrbWFwX2F0b21pYyhwYWdlKTsKKwkJc2l6ZV90IHdhbnRlZCA9IF9jb3B5X2Zyb21faXRlcihrYWRkciArIG9mZnNldCwgYnl0ZXMsIGkpOworCQlrdW5tYXBfYXRvbWljKGthZGRyKTsKKwkJcmV0dXJuIHdhbnRlZDsKKwl9IGVsc2UKKwkJcmV0dXJuIGNvcHlfcGFnZV9mcm9tX2l0ZXJfaW92ZWMocGFnZSwgb2Zmc2V0LCBieXRlcywgaSk7Cit9CitFWFBPUlRfU1lNQk9MKGNvcHlfcGFnZV9mcm9tX2l0ZXIpOworCitzdGF0aWMgc2l6ZV90IHBpcGVfemVybyhzaXplX3QgYnl0ZXMsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwlzaXplX3Qgbiwgb2ZmOworCWludCBpZHg7CisKKwlpZiAoIXNhbml0eShpKSkKKwkJcmV0dXJuIDA7CisKKwlieXRlcyA9IG4gPSBwdXNoX3BpcGUoaSwgYnl0ZXMsICZpZHgsICZvZmYpOworCWlmICh1bmxpa2VseSghbikpCisJCXJldHVybiAwOworCisJZm9yICggOyBuOyBpZHggPSBuZXh0X2lkeChpZHgsIHBpcGUpLCBvZmYgPSAwKSB7CisJCXNpemVfdCBjaHVuayA9IG1pbl90KHNpemVfdCwgbiwgUEFHRV9TSVpFIC0gb2ZmKTsKKwkJbWVtemVyb19wYWdlKHBpcGUtPmJ1ZnNbaWR4XS5wYWdlLCBvZmYsIGNodW5rKTsKKwkJaS0+aWR4ID0gaWR4OworCQlpLT5pb3Zfb2Zmc2V0ID0gb2ZmICsgY2h1bms7CisJCW4gLT0gY2h1bms7CisJfQorCWktPmNvdW50IC09IGJ5dGVzOworCXJldHVybiBieXRlczsKK30KKworc2l6ZV90IGlvdl9pdGVyX3plcm8oc2l6ZV90IGJ5dGVzLCBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKQorCQlyZXR1cm4gcGlwZV96ZXJvKGJ5dGVzLCBpKTsKKwlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LAorCQljbGVhcl91c2VyKHYuaW92X2Jhc2UsIHYuaW92X2xlbiksCisJCW1lbXplcm9fcGFnZSh2LmJ2X3BhZ2UsIHYuYnZfb2Zmc2V0LCB2LmJ2X2xlbiksCisJCW1lbXNldCh2Lmlvdl9iYXNlLCAwLCB2Lmlvdl9sZW4pCisJKQorCisJcmV0dXJuIGJ5dGVzOworfQorRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl96ZXJvKTsKKworc2l6ZV90IGlvdl9pdGVyX2NvcHlfZnJvbV91c2VyX2F0b21pYyhzdHJ1Y3QgcGFnZSAqcGFnZSwKKwkJc3RydWN0IGlvdl9pdGVyICppLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IGJ5dGVzKQoreworCWNoYXIgKmthZGRyID0ga21hcF9hdG9taWMocGFnZSksICpwID0ga2FkZHIgKyBvZmZzZXQ7CisJaWYgKHVubGlrZWx5KCFwYWdlX2NvcHlfc2FuZShwYWdlLCBvZmZzZXQsIGJ5dGVzKSkpIHsKKwkJa3VubWFwX2F0b21pYyhrYWRkcik7CisJCXJldHVybiAwOworCX0KKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJa3VubWFwX2F0b21pYyhrYWRkcik7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKwlpdGVyYXRlX2FsbF9raW5kcyhpLCBieXRlcywgdiwKKwkJY29weWluKChwICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sIHYuaW92X2Jhc2UsIHYuaW92X2xlbiksCisJCW1lbWNweV9mcm9tX3BhZ2UoKHAgKz0gdi5idl9sZW4pIC0gdi5idl9sZW4sIHYuYnZfcGFnZSwKKwkJCQkgdi5idl9vZmZzZXQsIHYuYnZfbGVuKSwKKwkJbWVtY3B5KChwICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sIHYuaW92X2Jhc2UsIHYuaW92X2xlbikKKwkpCisJa3VubWFwX2F0b21pYyhrYWRkcik7CisJcmV0dXJuIGJ5dGVzOworfQorRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9jb3B5X2Zyb21fdXNlcl9hdG9taWMpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcGlwZV90cnVuY2F0ZShzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJaWYgKHBpcGUtPm5yYnVmcykgeworCQlzaXplX3Qgb2ZmID0gaS0+aW92X29mZnNldDsKKwkJaW50IGlkeCA9IGktPmlkeDsKKwkJaW50IG5yYnVmcyA9IChpZHggLSBwaXBlLT5jdXJidWYpICYgKHBpcGUtPmJ1ZmZlcnMgLSAxKTsKKwkJaWYgKG9mZikgeworCQkJcGlwZS0+YnVmc1tpZHhdLmxlbiA9IG9mZiAtIHBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQ7CisJCQlpZHggPSBuZXh0X2lkeChpZHgsIHBpcGUpOworCQkJbnJidWZzKys7CisJCX0KKwkJd2hpbGUgKHBpcGUtPm5yYnVmcyA+IG5yYnVmcykgeworCQkJcGlwZV9idWZfcmVsZWFzZShwaXBlLCAmcGlwZS0+YnVmc1tpZHhdKTsKKwkJCWlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSk7CisJCQlwaXBlLT5ucmJ1ZnMtLTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGlwZV9hZHZhbmNlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IHNpemUpCit7CisJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJaWYgKHVubGlrZWx5KGktPmNvdW50IDwgc2l6ZSkpCisJCXNpemUgPSBpLT5jb3VudDsKKwlpZiAoc2l6ZSkgeworCQlzdHJ1Y3QgcGlwZV9idWZmZXIgKmJ1ZjsKKwkJc2l6ZV90IG9mZiA9IGktPmlvdl9vZmZzZXQsIGxlZnQgPSBzaXplOworCQlpbnQgaWR4ID0gaS0+aWR4OworCQlpZiAob2ZmKSAvKiBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgYnVmZmVyICovCisJCQlsZWZ0ICs9IG9mZiAtIHBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQ7CisJCXdoaWxlICgxKSB7CisJCQlidWYgPSAmcGlwZS0+YnVmc1tpZHhdOworCQkJaWYgKGxlZnQgPD0gYnVmLT5sZW4pCisJCQkJYnJlYWs7CisJCQlsZWZ0IC09IGJ1Zi0+bGVuOworCQkJaWR4ID0gbmV4dF9pZHgoaWR4LCBwaXBlKTsKKwkJfQorCQlpLT5pZHggPSBpZHg7CisJCWktPmlvdl9vZmZzZXQgPSBidWYtPm9mZnNldCArIGxlZnQ7CisJfQorCWktPmNvdW50IC09IHNpemU7CisJLyogLi4uIGFuZCBkaXNjYXJkIGV2ZXJ5dGhpbmcgcGFzdCB0aGF0IHBvaW50ICovCisJcGlwZV90cnVuY2F0ZShpKTsKK30KKwordm9pZCBpb3ZfaXRlcl9hZHZhbmNlKHN0cnVjdCBpb3ZfaXRlciAqaSwgc2l6ZV90IHNpemUpCit7CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCXBpcGVfYWR2YW5jZShpLCBzaXplKTsKKwkJcmV0dXJuOworCX0KKwlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIHNpemUsIHYsIDAsIDAsIDApCit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2FkdmFuY2UpOworCit2b2lkIGlvdl9pdGVyX3JldmVydChzdHJ1Y3QgaW92X2l0ZXIgKmksIHNpemVfdCB1bnJvbGwpCit7CisJaWYgKCF1bnJvbGwpCisJCXJldHVybjsKKwlpZiAoV0FSTl9PTih1bnJvbGwgPiBNQVhfUldfQ09VTlQpKQorCQlyZXR1cm47CisJaS0+Y291bnQgKz0gdW5yb2xsOworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwkJaW50IGlkeCA9IGktPmlkeDsKKwkJc2l6ZV90IG9mZiA9IGktPmlvdl9vZmZzZXQ7CisJCXdoaWxlICgxKSB7CisJCQlzaXplX3QgbiA9IG9mZiAtIHBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQ7CisJCQlpZiAodW5yb2xsIDwgbikgeworCQkJCW9mZiAtPSB1bnJvbGw7CisJCQkJYnJlYWs7CisJCQl9CisJCQl1bnJvbGwgLT0gbjsKKwkJCWlmICghdW5yb2xsICYmIGlkeCA9PSBpLT5zdGFydF9pZHgpIHsKKwkJCQlvZmYgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFpZHgtLSkKKwkJCQlpZHggPSBwaXBlLT5idWZmZXJzIC0gMTsKKwkJCW9mZiA9IHBpcGUtPmJ1ZnNbaWR4XS5vZmZzZXQgKyBwaXBlLT5idWZzW2lkeF0ubGVuOworCQl9CisJCWktPmlvdl9vZmZzZXQgPSBvZmY7CisJCWktPmlkeCA9IGlkeDsKKwkJcGlwZV90cnVuY2F0ZShpKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodW5yb2xsIDw9IGktPmlvdl9vZmZzZXQpIHsKKwkJaS0+aW92X29mZnNldCAtPSB1bnJvbGw7CisJCXJldHVybjsKKwl9CisJdW5yb2xsIC09IGktPmlvdl9vZmZzZXQ7CisJaWYgKGktPnR5cGUgJiBJVEVSX0JWRUMpIHsKKwkJY29uc3Qgc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBpLT5idmVjOworCQl3aGlsZSAoMSkgeworCQkJc2l6ZV90IG4gPSAoLS1idmVjKS0+YnZfbGVuOworCQkJaS0+bnJfc2VncysrOworCQkJaWYgKHVucm9sbCA8PSBuKSB7CisJCQkJaS0+YnZlYyA9IGJ2ZWM7CisJCQkJaS0+aW92X29mZnNldCA9IG4gLSB1bnJvbGw7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdW5yb2xsIC09IG47CisJCX0KKwl9IGVsc2UgeyAvKiBzYW1lIGxvZ2ljcyBmb3IgaW92ZWMgYW5kIGt2ZWMgKi8KKwkJY29uc3Qgc3RydWN0IGlvdmVjICppb3YgPSBpLT5pb3Y7CisJCXdoaWxlICgxKSB7CisJCQlzaXplX3QgbiA9ICgtLWlvdiktPmlvdl9sZW47CisJCQlpLT5ucl9zZWdzKys7CisJCQlpZiAodW5yb2xsIDw9IG4pIHsKKwkJCQlpLT5pb3YgPSBpb3Y7CisJCQkJaS0+aW92X29mZnNldCA9IG4gLSB1bnJvbGw7CisJCQkJcmV0dXJuOworCQkJfQorCQkJdW5yb2xsIC09IG47CisJCX0KKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX3JldmVydCk7CisKKy8qCisgKiBSZXR1cm4gdGhlIGNvdW50IG9mIGp1c3QgdGhlIGN1cnJlbnQgaW92X2l0ZXIgc2VnbWVudC4KKyAqLworc2l6ZV90IGlvdl9pdGVyX3NpbmdsZV9zZWdfY291bnQoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppKQoreworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkKKwkJcmV0dXJuIGktPmNvdW50OwkvLyBpdCBpcyBhIHNpbGx5IHBsYWNlLCBhbnl3YXkKKwlpZiAoaS0+bnJfc2VncyA9PSAxKQorCQlyZXR1cm4gaS0+Y291bnQ7CisJZWxzZSBpZiAoaS0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIG1pbihpLT5jb3VudCwgaS0+YnZlYy0+YnZfbGVuIC0gaS0+aW92X29mZnNldCk7CisJZWxzZQorCQlyZXR1cm4gbWluKGktPmNvdW50LCBpLT5pb3YtPmlvdl9sZW4gLSBpLT5pb3Zfb2Zmc2V0KTsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfc2luZ2xlX3NlZ19jb3VudCk7CisKK3ZvaWQgaW92X2l0ZXJfa3ZlYyhzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBkaXJlY3Rpb24sCisJCQljb25zdCBzdHJ1Y3Qga3ZlYyAqa3ZlYywgdW5zaWduZWQgbG9uZyBucl9zZWdzLAorCQkJc2l6ZV90IGNvdW50KQoreworCUJVR19PTighKGRpcmVjdGlvbiAmIElURVJfS1ZFQykpOworCWktPnR5cGUgPSBkaXJlY3Rpb247CisJaS0+a3ZlYyA9IGt2ZWM7CisJaS0+bnJfc2VncyA9IG5yX3NlZ3M7CisJaS0+aW92X29mZnNldCA9IDA7CisJaS0+Y291bnQgPSBjb3VudDsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfa3ZlYyk7CisKK3ZvaWQgaW92X2l0ZXJfYnZlYyhzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBkaXJlY3Rpb24sCisJCQljb25zdCBzdHJ1Y3QgYmlvX3ZlYyAqYnZlYywgdW5zaWduZWQgbG9uZyBucl9zZWdzLAorCQkJc2l6ZV90IGNvdW50KQoreworCUJVR19PTighKGRpcmVjdGlvbiAmIElURVJfQlZFQykpOworCWktPnR5cGUgPSBkaXJlY3Rpb247CisJaS0+YnZlYyA9IGJ2ZWM7CisJaS0+bnJfc2VncyA9IG5yX3NlZ3M7CisJaS0+aW92X29mZnNldCA9IDA7CisJaS0+Y291bnQgPSBjb3VudDsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfYnZlYyk7CisKK3ZvaWQgaW92X2l0ZXJfcGlwZShzdHJ1Y3QgaW92X2l0ZXIgKmksIGludCBkaXJlY3Rpb24sCisJCQlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlLAorCQkJc2l6ZV90IGNvdW50KQoreworCUJVR19PTihkaXJlY3Rpb24gIT0gSVRFUl9QSVBFKTsKKwlXQVJOX09OKHBpcGUtPm5yYnVmcyA9PSBwaXBlLT5idWZmZXJzKTsKKwlpLT50eXBlID0gZGlyZWN0aW9uOworCWktPnBpcGUgPSBwaXBlOworCWktPmlkeCA9IChwaXBlLT5jdXJidWYgKyBwaXBlLT5ucmJ1ZnMpICYgKHBpcGUtPmJ1ZmZlcnMgLSAxKTsKKwlpLT5pb3Zfb2Zmc2V0ID0gMDsKKwlpLT5jb3VudCA9IGNvdW50OworCWktPnN0YXJ0X2lkeCA9IGktPmlkeDsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfcGlwZSk7CisKK3Vuc2lnbmVkIGxvbmcgaW92X2l0ZXJfYWxpZ25tZW50KGNvbnN0IHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisJc2l6ZV90IHNpemUgPSBpLT5jb3VudDsKKworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlpZiAoc2l6ZSAmJiBpLT5pb3Zfb2Zmc2V0ICYmIGFsbG9jYXRlZCgmaS0+cGlwZS0+YnVmc1tpLT5pZHhdKSkKKwkJCXJldHVybiBzaXplIHwgaS0+aW92X29mZnNldDsKKwkJcmV0dXJuIHNpemU7CisJfQorCWl0ZXJhdGVfYWxsX2tpbmRzKGksIHNpemUsIHYsCisJCShyZXMgfD0gKHVuc2lnbmVkIGxvbmcpdi5pb3ZfYmFzZSB8IHYuaW92X2xlbiwgMCksCisJCXJlcyB8PSB2LmJ2X29mZnNldCB8IHYuYnZfbGVuLAorCQlyZXMgfD0gKHVuc2lnbmVkIGxvbmcpdi5pb3ZfYmFzZSB8IHYuaW92X2xlbgorCSkKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChpb3ZfaXRlcl9hbGlnbm1lbnQpOworCit1bnNpZ25lZCBsb25nIGlvdl9pdGVyX2dhcF9hbGlnbm1lbnQoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppKQoreworCXVuc2lnbmVkIGxvbmcgcmVzID0gMDsKKwlzaXplX3Qgc2l6ZSA9IGktPmNvdW50OworCisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiB+MFU7CisJfQorCisJaXRlcmF0ZV9hbGxfa2luZHMoaSwgc2l6ZSwgdiwKKwkJKHJlcyB8PSAoIXJlcyA/IDAgOiAodW5zaWduZWQgbG9uZyl2Lmlvdl9iYXNlKSB8CisJCQkoc2l6ZSAhPSB2Lmlvdl9sZW4gPyBzaXplIDogMCksIDApLAorCQkocmVzIHw9ICghcmVzID8gMCA6ICh1bnNpZ25lZCBsb25nKXYuYnZfb2Zmc2V0KSB8CisJCQkoc2l6ZSAhPSB2LmJ2X2xlbiA/IHNpemUgOiAwKSksCisJCShyZXMgfD0gKCFyZXMgPyAwIDogKHVuc2lnbmVkIGxvbmcpdi5pb3ZfYmFzZSkgfAorCQkJKHNpemUgIT0gdi5pb3ZfbGVuID8gc2l6ZSA6IDApKQorCQkpOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2dhcF9hbGlnbm1lbnQpOworCitzdGF0aWMgaW5saW5lIHNpemVfdCBfX3BpcGVfZ2V0X3BhZ2VzKHN0cnVjdCBpb3ZfaXRlciAqaSwKKwkJCQlzaXplX3QgbWF4c2l6ZSwKKwkJCQlzdHJ1Y3QgcGFnZSAqKnBhZ2VzLAorCQkJCWludCBpZHgsCisJCQkJc2l6ZV90ICpzdGFydCkKK3sKKwlzdHJ1Y3QgcGlwZV9pbm9kZV9pbmZvICpwaXBlID0gaS0+cGlwZTsKKwlzc2l6ZV90IG4gPSBwdXNoX3BpcGUoaSwgbWF4c2l6ZSwgJmlkeCwgc3RhcnQpOworCWlmICghbikKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltYXhzaXplID0gbjsKKwluICs9ICpzdGFydDsKKwl3aGlsZSAobiA+IDApIHsKKwkJZ2V0X3BhZ2UoKnBhZ2VzKysgPSBwaXBlLT5idWZzW2lkeF0ucGFnZSk7CisJCWlkeCA9IG5leHRfaWR4KGlkeCwgcGlwZSk7CisJCW4gLT0gUEFHRV9TSVpFOworCX0KKworCXJldHVybiBtYXhzaXplOworfQorCitzdGF0aWMgc3NpemVfdCBwaXBlX2dldF9wYWdlcyhzdHJ1Y3QgaW92X2l0ZXIgKmksCisJCSAgIHN0cnVjdCBwYWdlICoqcGFnZXMsIHNpemVfdCBtYXhzaXplLCB1bnNpZ25lZCBtYXhwYWdlcywKKwkJICAgc2l6ZV90ICpzdGFydCkKK3sKKwl1bnNpZ25lZCBucGFnZXM7CisJc2l6ZV90IGNhcGFjaXR5OworCWludCBpZHg7CisKKwlpZiAoIW1heHNpemUpCisJCXJldHVybiAwOworCisJaWYgKCFzYW5pdHkoaSkpCisJCXJldHVybiAtRUZBVUxUOworCisJZGF0YV9zdGFydChpLCAmaWR4LCBzdGFydCk7CisJLyogc29tZSBvZiB0aGlzIG9uZSArIGFsbCBhZnRlciB0aGlzIG9uZSAqLworCW5wYWdlcyA9ICgoaS0+cGlwZS0+Y3VyYnVmIC0gaWR4IC0gMSkgJiAoaS0+cGlwZS0+YnVmZmVycyAtIDEpKSArIDE7CisJY2FwYWNpdHkgPSBtaW4obnBhZ2VzLG1heHBhZ2VzKSAqIFBBR0VfU0laRSAtICpzdGFydDsKKworCXJldHVybiBfX3BpcGVfZ2V0X3BhZ2VzKGksIG1pbihtYXhzaXplLCBjYXBhY2l0eSksIHBhZ2VzLCBpZHgsIHN0YXJ0KTsKK30KKworc3NpemVfdCBpb3ZfaXRlcl9nZXRfcGFnZXMoc3RydWN0IGlvdl9pdGVyICppLAorCQkgICBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzaXplX3QgbWF4c2l6ZSwgdW5zaWduZWQgbWF4cGFnZXMsCisJCSAgIHNpemVfdCAqc3RhcnQpCit7CisJaWYgKG1heHNpemUgPiBpLT5jb3VudCkKKwkJbWF4c2l6ZSA9IGktPmNvdW50OworCisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKQorCQlyZXR1cm4gcGlwZV9nZXRfcGFnZXMoaSwgcGFnZXMsIG1heHNpemUsIG1heHBhZ2VzLCBzdGFydCk7CisJaXRlcmF0ZV9hbGxfa2luZHMoaSwgbWF4c2l6ZSwgdiwgKHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpdi5pb3ZfYmFzZTsKKwkJc2l6ZV90IGxlbiA9IHYuaW92X2xlbiArICgqc3RhcnQgPSBhZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKKwkJaW50IG47CisJCWludCByZXM7CisKKwkJaWYgKGxlbiA+IG1heHBhZ2VzICogUEFHRV9TSVpFKQorCQkJbGVuID0gbWF4cGFnZXMgKiBQQUdFX1NJWkU7CisJCWFkZHIgJj0gfihQQUdFX1NJWkUgLSAxKTsKKwkJbiA9IERJVl9ST1VORF9VUChsZW4sIFBBR0VfU0laRSk7CisJCXJlcyA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbiwgKGktPnR5cGUgJiBXUklURSkgIT0gV1JJVEUsIHBhZ2VzKTsKKwkJaWYgKHVubGlrZWx5KHJlcyA8IDApKQorCQkJcmV0dXJuIHJlczsKKwkJcmV0dXJuIChyZXMgPT0gbiA/IGxlbiA6IHJlcyAqIFBBR0VfU0laRSkgLSAqc3RhcnQ7CisJMDt9KSwoeworCQkvKiBjYW4ndCBiZSBtb3JlIHRoYW4gUEFHRV9TSVpFICovCisJCSpzdGFydCA9IHYuYnZfb2Zmc2V0OworCQlnZXRfcGFnZSgqcGFnZXMgPSB2LmJ2X3BhZ2UpOworCQlyZXR1cm4gdi5idl9sZW47CisJfSksKHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfSkKKwkpCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2dldF9wYWdlcyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqKmdldF9wYWdlc19hcnJheShzaXplX3QgbikKK3sKKwlyZXR1cm4ga3ZtYWxsb2NfYXJyYXkobiwgc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHNzaXplX3QgcGlwZV9nZXRfcGFnZXNfYWxsb2Moc3RydWN0IGlvdl9pdGVyICppLAorCQkgICBzdHJ1Y3QgcGFnZSAqKipwYWdlcywgc2l6ZV90IG1heHNpemUsCisJCSAgIHNpemVfdCAqc3RhcnQpCit7CisJc3RydWN0IHBhZ2UgKipwOworCXNpemVfdCBuOworCWludCBpZHg7CisJaW50IG5wYWdlczsKKworCWlmICghbWF4c2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXNhbml0eShpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlkYXRhX3N0YXJ0KGksICZpZHgsIHN0YXJ0KTsKKwkvKiBzb21lIG9mIHRoaXMgb25lICsgYWxsIGFmdGVyIHRoaXMgb25lICovCisJbnBhZ2VzID0gKChpLT5waXBlLT5jdXJidWYgLSBpZHggLSAxKSAmIChpLT5waXBlLT5idWZmZXJzIC0gMSkpICsgMTsKKwluID0gbnBhZ2VzICogUEFHRV9TSVpFIC0gKnN0YXJ0OworCWlmIChtYXhzaXplID4gbikKKwkJbWF4c2l6ZSA9IG47CisJZWxzZQorCQlucGFnZXMgPSBESVZfUk9VTkRfVVAobWF4c2l6ZSArICpzdGFydCwgUEFHRV9TSVpFKTsKKwlwID0gZ2V0X3BhZ2VzX2FycmF5KG5wYWdlcyk7CisJaWYgKCFwKQorCQlyZXR1cm4gLUVOT01FTTsKKwluID0gX19waXBlX2dldF9wYWdlcyhpLCBtYXhzaXplLCBwLCBpZHgsIHN0YXJ0KTsKKwlpZiAobiA+IDApCisJCSpwYWdlcyA9IHA7CisJZWxzZQorCQlrdmZyZWUocCk7CisJcmV0dXJuIG47Cit9CisKK3NzaXplX3QgaW92X2l0ZXJfZ2V0X3BhZ2VzX2FsbG9jKHN0cnVjdCBpb3ZfaXRlciAqaSwKKwkJICAgc3RydWN0IHBhZ2UgKioqcGFnZXMsIHNpemVfdCBtYXhzaXplLAorCQkgICBzaXplX3QgKnN0YXJ0KQoreworCXN0cnVjdCBwYWdlICoqcDsKKworCWlmIChtYXhzaXplID4gaS0+Y291bnQpCisJCW1heHNpemUgPSBpLT5jb3VudDsKKworCWlmICh1bmxpa2VseShpLT50eXBlICYgSVRFUl9QSVBFKSkKKwkJcmV0dXJuIHBpcGVfZ2V0X3BhZ2VzX2FsbG9jKGksIHBhZ2VzLCBtYXhzaXplLCBzdGFydCk7CisJaXRlcmF0ZV9hbGxfa2luZHMoaSwgbWF4c2l6ZSwgdiwgKHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpdi5pb3ZfYmFzZTsKKwkJc2l6ZV90IGxlbiA9IHYuaW92X2xlbiArICgqc3RhcnQgPSBhZGRyICYgKFBBR0VfU0laRSAtIDEpKTsKKwkJaW50IG47CisJCWludCByZXM7CisKKwkJYWRkciAmPSB+KFBBR0VfU0laRSAtIDEpOworCQluID0gRElWX1JPVU5EX1VQKGxlbiwgUEFHRV9TSVpFKTsKKwkJcCA9IGdldF9wYWdlc19hcnJheShuKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJlcyA9IGdldF91c2VyX3BhZ2VzX2Zhc3QoYWRkciwgbiwgKGktPnR5cGUgJiBXUklURSkgIT0gV1JJVEUsIHApOworCQlpZiAodW5saWtlbHkocmVzIDwgMCkpIHsKKwkJCWt2ZnJlZShwKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwkJKnBhZ2VzID0gcDsKKwkJcmV0dXJuIChyZXMgPT0gbiA/IGxlbiA6IHJlcyAqIFBBR0VfU0laRSkgLSAqc3RhcnQ7CisJMDt9KSwoeworCQkvKiBjYW4ndCBiZSBtb3JlIHRoYW4gUEFHRV9TSVpFICovCisJCSpzdGFydCA9IHYuYnZfb2Zmc2V0OworCQkqcGFnZXMgPSBwID0gZ2V0X3BhZ2VzX2FycmF5KDEpOworCQlpZiAoIXApCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZ2V0X3BhZ2UoKnAgPSB2LmJ2X3BhZ2UpOworCQlyZXR1cm4gdi5idl9sZW47CisJfSksKHsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfSkKKwkpCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlvdl9pdGVyX2dldF9wYWdlc19hbGxvYyk7CisKK3NpemVfdCBjc3VtX2FuZF9jb3B5X2Zyb21faXRlcih2b2lkICphZGRyLCBzaXplX3QgYnl0ZXMsIF9fd3N1bSAqY3N1bSwKKwkJCSAgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJY2hhciAqdG8gPSBhZGRyOworCV9fd3N1bSBzdW0sIG5leHQ7CisJc2l6ZV90IG9mZiA9IDA7CisJc3VtID0gKmNzdW07CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiAwOworCX0KKwlpdGVyYXRlX2FuZF9hZHZhbmNlKGksIGJ5dGVzLCB2LCAoeworCQlpbnQgZXJyID0gMDsKKwkJbmV4dCA9IGNzdW1fYW5kX2NvcHlfZnJvbV91c2VyKHYuaW92X2Jhc2UsCisJCQkJCSAgICAgICAodG8gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwKKwkJCQkJICAgICAgIHYuaW92X2xlbiwgMCwgJmVycik7CisJCWlmICghZXJyKSB7CisJCQlzdW0gPSBjc3VtX2Jsb2NrX2FkZChzdW0sIG5leHQsIG9mZik7CisJCQlvZmYgKz0gdi5pb3ZfbGVuOworCQl9CisJCWVyciA/IHYuaW92X2xlbiA6IDA7CisJfSksICh7CisJCWNoYXIgKnAgPSBrbWFwX2F0b21pYyh2LmJ2X3BhZ2UpOworCQluZXh0ID0gY3N1bV9wYXJ0aWFsX2NvcHlfbm9jaGVjayhwICsgdi5idl9vZmZzZXQsCisJCQkJCQkgKHRvICs9IHYuYnZfbGVuKSAtIHYuYnZfbGVuLAorCQkJCQkJIHYuYnZfbGVuLCAwKTsKKwkJa3VubWFwX2F0b21pYyhwKTsKKwkJc3VtID0gY3N1bV9ibG9ja19hZGQoc3VtLCBuZXh0LCBvZmYpOworCQlvZmYgKz0gdi5idl9sZW47CisJfSksKHsKKwkJbmV4dCA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2sodi5pb3ZfYmFzZSwKKwkJCQkJCSAodG8gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwKKwkJCQkJCSB2Lmlvdl9sZW4sIDApOworCQlzdW0gPSBjc3VtX2Jsb2NrX2FkZChzdW0sIG5leHQsIG9mZik7CisJCW9mZiArPSB2Lmlvdl9sZW47CisJfSkKKwkpCisJKmNzdW0gPSBzdW07CisJcmV0dXJuIGJ5dGVzOworfQorRVhQT1JUX1NZTUJPTChjc3VtX2FuZF9jb3B5X2Zyb21faXRlcik7CisKK2Jvb2wgY3N1bV9hbmRfY29weV9mcm9tX2l0ZXJfZnVsbCh2b2lkICphZGRyLCBzaXplX3QgYnl0ZXMsIF9fd3N1bSAqY3N1bSwKKwkJCSAgICAgICBzdHJ1Y3QgaW92X2l0ZXIgKmkpCit7CisJY2hhciAqdG8gPSBhZGRyOworCV9fd3N1bSBzdW0sIG5leHQ7CisJc2l6ZV90IG9mZiA9IDA7CisJc3VtID0gKmNzdW07CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKHVubGlrZWx5KGktPmNvdW50IDwgYnl0ZXMpKQorCQlyZXR1cm4gZmFsc2U7CisJaXRlcmF0ZV9hbGxfa2luZHMoaSwgYnl0ZXMsIHYsICh7CisJCWludCBlcnIgPSAwOworCQluZXh0ID0gY3N1bV9hbmRfY29weV9mcm9tX3VzZXIodi5pb3ZfYmFzZSwKKwkJCQkJICAgICAgICh0byArPSB2Lmlvdl9sZW4pIC0gdi5pb3ZfbGVuLAorCQkJCQkgICAgICAgdi5pb3ZfbGVuLCAwLCAmZXJyKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBmYWxzZTsKKwkJc3VtID0gY3N1bV9ibG9ja19hZGQoc3VtLCBuZXh0LCBvZmYpOworCQlvZmYgKz0gdi5pb3ZfbGVuOworCQkwOworCX0pLCAoeworCQljaGFyICpwID0ga21hcF9hdG9taWModi5idl9wYWdlKTsKKwkJbmV4dCA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2socCArIHYuYnZfb2Zmc2V0LAorCQkJCQkJICh0byArPSB2LmJ2X2xlbikgLSB2LmJ2X2xlbiwKKwkJCQkJCSB2LmJ2X2xlbiwgMCk7CisJCWt1bm1hcF9hdG9taWMocCk7CisJCXN1bSA9IGNzdW1fYmxvY2tfYWRkKHN1bSwgbmV4dCwgb2ZmKTsKKwkJb2ZmICs9IHYuYnZfbGVuOworCX0pLCh7CisJCW5leHQgPSBjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKHYuaW92X2Jhc2UsCisJCQkJCQkgKHRvICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sCisJCQkJCQkgdi5pb3ZfbGVuLCAwKTsKKwkJc3VtID0gY3N1bV9ibG9ja19hZGQoc3VtLCBuZXh0LCBvZmYpOworCQlvZmYgKz0gdi5pb3ZfbGVuOworCX0pCisJKQorCSpjc3VtID0gc3VtOworCWlvdl9pdGVyX2FkdmFuY2UoaSwgYnl0ZXMpOworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChjc3VtX2FuZF9jb3B5X2Zyb21faXRlcl9mdWxsKTsKKworc2l6ZV90IGNzdW1fYW5kX2NvcHlfdG9faXRlcihjb25zdCB2b2lkICphZGRyLCBzaXplX3QgYnl0ZXMsIF9fd3N1bSAqY3N1bSwKKwkJCSAgICAgc3RydWN0IGlvdl9pdGVyICppKQoreworCWNvbnN0IGNoYXIgKmZyb20gPSBhZGRyOworCV9fd3N1bSBzdW0sIG5leHQ7CisJc2l6ZV90IG9mZiA9IDA7CisJc3VtID0gKmNzdW07CisJaWYgKHVubGlrZWx5KGktPnR5cGUgJiBJVEVSX1BJUEUpKSB7CisJCVdBUk5fT04oMSk7CS8qIGZvciBub3cgKi8KKwkJcmV0dXJuIDA7CisJfQorCWl0ZXJhdGVfYW5kX2FkdmFuY2UoaSwgYnl0ZXMsIHYsICh7CisJCWludCBlcnIgPSAwOworCQluZXh0ID0gY3N1bV9hbmRfY29weV90b191c2VyKChmcm9tICs9IHYuaW92X2xlbikgLSB2Lmlvdl9sZW4sCisJCQkJCSAgICAgdi5pb3ZfYmFzZSwKKwkJCQkJICAgICB2Lmlvdl9sZW4sIDAsICZlcnIpOworCQlpZiAoIWVycikgeworCQkJc3VtID0gY3N1bV9ibG9ja19hZGQoc3VtLCBuZXh0LCBvZmYpOworCQkJb2ZmICs9IHYuaW92X2xlbjsKKwkJfQorCQllcnIgPyB2Lmlvdl9sZW4gOiAwOworCX0pLCAoeworCQljaGFyICpwID0ga21hcF9hdG9taWModi5idl9wYWdlKTsKKwkJbmV4dCA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soKGZyb20gKz0gdi5idl9sZW4pIC0gdi5idl9sZW4sCisJCQkJCQkgcCArIHYuYnZfb2Zmc2V0LAorCQkJCQkJIHYuYnZfbGVuLCAwKTsKKwkJa3VubWFwX2F0b21pYyhwKTsKKwkJc3VtID0gY3N1bV9ibG9ja19hZGQoc3VtLCBuZXh0LCBvZmYpOworCQlvZmYgKz0gdi5idl9sZW47CisJfSksKHsKKwkJbmV4dCA9IGNzdW1fcGFydGlhbF9jb3B5X25vY2hlY2soKGZyb20gKz0gdi5pb3ZfbGVuKSAtIHYuaW92X2xlbiwKKwkJCQkJCSB2Lmlvdl9iYXNlLAorCQkJCQkJIHYuaW92X2xlbiwgMCk7CisJCXN1bSA9IGNzdW1fYmxvY2tfYWRkKHN1bSwgbmV4dCwgb2ZmKTsKKwkJb2ZmICs9IHYuaW92X2xlbjsKKwl9KQorCSkKKwkqY3N1bSA9IHN1bTsKKwlyZXR1cm4gYnl0ZXM7Cit9CitFWFBPUlRfU1lNQk9MKGNzdW1fYW5kX2NvcHlfdG9faXRlcik7CisKK2ludCBpb3ZfaXRlcl9ucGFnZXMoY29uc3Qgc3RydWN0IGlvdl9pdGVyICppLCBpbnQgbWF4cGFnZXMpCit7CisJc2l6ZV90IHNpemUgPSBpLT5jb3VudDsKKwlpbnQgbnBhZ2VzID0gMDsKKworCWlmICghc2l6ZSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodW5saWtlbHkoaS0+dHlwZSAmIElURVJfUElQRSkpIHsKKwkJc3RydWN0IHBpcGVfaW5vZGVfaW5mbyAqcGlwZSA9IGktPnBpcGU7CisJCXNpemVfdCBvZmY7CisJCWludCBpZHg7CisKKwkJaWYgKCFzYW5pdHkoaSkpCisJCQlyZXR1cm4gMDsKKworCQlkYXRhX3N0YXJ0KGksICZpZHgsICZvZmYpOworCQkvKiBzb21lIG9mIHRoaXMgb25lICsgYWxsIGFmdGVyIHRoaXMgb25lICovCisJCW5wYWdlcyA9ICgocGlwZS0+Y3VyYnVmIC0gaWR4IC0gMSkgJiAocGlwZS0+YnVmZmVycyAtIDEpKSArIDE7CisJCWlmIChucGFnZXMgPj0gbWF4cGFnZXMpCisJCQlyZXR1cm4gbWF4cGFnZXM7CisJfSBlbHNlIGl0ZXJhdGVfYWxsX2tpbmRzKGksIHNpemUsIHYsICh7CisJCXVuc2lnbmVkIGxvbmcgcCA9ICh1bnNpZ25lZCBsb25nKXYuaW92X2Jhc2U7CisJCW5wYWdlcyArPSBESVZfUk9VTkRfVVAocCArIHYuaW92X2xlbiwgUEFHRV9TSVpFKQorCQkJLSBwIC8gUEFHRV9TSVpFOworCQlpZiAobnBhZ2VzID49IG1heHBhZ2VzKQorCQkJcmV0dXJuIG1heHBhZ2VzOworCTA7fSksKHsKKwkJbnBhZ2VzKys7CisJCWlmIChucGFnZXMgPj0gbWF4cGFnZXMpCisJCQlyZXR1cm4gbWF4cGFnZXM7CisJfSksKHsKKwkJdW5zaWduZWQgbG9uZyBwID0gKHVuc2lnbmVkIGxvbmcpdi5pb3ZfYmFzZTsKKwkJbnBhZ2VzICs9IERJVl9ST1VORF9VUChwICsgdi5pb3ZfbGVuLCBQQUdFX1NJWkUpCisJCQktIHAgLyBQQUdFX1NJWkU7CisJCWlmIChucGFnZXMgPj0gbWF4cGFnZXMpCisJCQlyZXR1cm4gbWF4cGFnZXM7CisJfSkKKwkpCisJcmV0dXJuIG5wYWdlczsKK30KK0VYUE9SVF9TWU1CT0woaW92X2l0ZXJfbnBhZ2VzKTsKKworY29uc3Qgdm9pZCAqZHVwX2l0ZXIoc3RydWN0IGlvdl9pdGVyICpuZXcsIHN0cnVjdCBpb3ZfaXRlciAqb2xkLCBnZnBfdCBmbGFncykKK3sKKwkqbmV3ID0gKm9sZDsKKwlpZiAodW5saWtlbHkobmV3LT50eXBlICYgSVRFUl9QSVBFKSkgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKG5ldy0+dHlwZSAmIElURVJfQlZFQykKKwkJcmV0dXJuIG5ldy0+YnZlYyA9IGttZW1kdXAobmV3LT5idmVjLAorCQkJCSAgICBuZXctPm5yX3NlZ3MgKiBzaXplb2Yoc3RydWN0IGJpb192ZWMpLAorCQkJCSAgICBmbGFncyk7CisJZWxzZQorCQkvKiBpb3ZlYyBhbmQga3ZlYyBoYXZlIGlkZW50aWNhbCBsYXlvdXQgKi8KKwkJcmV0dXJuIG5ldy0+aW92ID0ga21lbWR1cChuZXctPmlvdiwKKwkJCQkgICBuZXctPm5yX3NlZ3MgKiBzaXplb2Yoc3RydWN0IGlvdmVjKSwKKwkJCQkgICBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGR1cF9pdGVyKTsKKworLyoqCisgKiBpbXBvcnRfaW92ZWMoKSAtIENvcHkgYW4gYXJyYXkgb2YgJnN0cnVjdCBpb3ZlYyBmcm9tIHVzZXJzcGFjZQorICogICAgIGludG8gdGhlIGtlcm5lbCwgY2hlY2sgdGhhdCBpdCBpcyB2YWxpZCwgYW5kIGluaXRpYWxpemUgYSBuZXcKKyAqICAgICAmc3RydWN0IGlvdl9pdGVyIGl0ZXJhdG9yIHRvIGFjY2VzcyBpdC4KKyAqCisgKiBAdHlwZTogT25lIG9mICVSRUFEIG9yICVXUklURS4KKyAqIEB1dmVjdG9yOiBQb2ludGVyIHRvIHRoZSB1c2Vyc3BhY2UgYXJyYXkuCisgKiBAbnJfc2VnczogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHVzZXJzcGFjZSBhcnJheS4KKyAqIEBmYXN0X3NlZ3M6IE51bWJlciBvZiBlbGVtZW50cyBpbiBAaW92LgorICogQGlvdjogKGlucHV0IGFuZCBvdXRwdXQgcGFyYW1ldGVyKSBQb2ludGVyIHRvIHBvaW50ZXIgdG8gKHVzdWFsbHkgc21hbGwKKyAqICAgICBvbi1zdGFjaykga2VybmVsIGFycmF5LgorICogQGk6IFBvaW50ZXIgdG8gaXRlcmF0b3IgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIG9uIHN1Y2Nlc3MuCisgKgorICogSWYgdGhlIGFycmF5IHBvaW50ZWQgdG8gYnkgKkBpb3YgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIEBucl9zZWdzLAorICogdGhlbiB0aGlzIGZ1bmN0aW9uIHBsYWNlcyAlTlVMTCBpbiAqQGlvdiBvbiByZXR1cm4uIE90aGVyd2lzZSwgYSBuZXcKKyAqIGFycmF5IHdpbGwgYmUgYWxsb2NhdGVkIGFuZCB0aGUgcmVzdWx0IHBsYWNlZCBpbiAqQGlvdi4gVGhpcyBtZWFucyB0aGF0CisgKiB0aGUgY2FsbGVyIG1heSBjYWxsIGtmcmVlKCkgb24gKkBpb3YgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzbWFsbAorICogb24tc3RhY2sgYXJyYXkgd2FzIHVzZWQgb3Igbm90IChhbmQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgZnVuY3Rpb24KKyAqIHJldHVybnMgYW4gZXJyb3Igb3Igbm90KS4KKyAqCisgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGVycm9yLgorICovCitpbnQgaW1wb3J0X2lvdmVjKGludCB0eXBlLCBjb25zdCBzdHJ1Y3QgaW92ZWMgX191c2VyICogdXZlY3RvciwKKwkJIHVuc2lnbmVkIG5yX3NlZ3MsIHVuc2lnbmVkIGZhc3Rfc2VncywKKwkJIHN0cnVjdCBpb3ZlYyAqKmlvdiwgc3RydWN0IGlvdl9pdGVyICppKQoreworCXNzaXplX3QgbjsKKwlzdHJ1Y3QgaW92ZWMgKnA7CisJbiA9IHJ3X2NvcHlfY2hlY2tfdXZlY3Rvcih0eXBlLCB1dmVjdG9yLCBucl9zZWdzLCBmYXN0X3NlZ3MsCisJCQkJICAqaW92LCAmcCk7CisJaWYgKG4gPCAwKSB7CisJCWlmIChwICE9ICppb3YpCisJCQlrZnJlZShwKTsKKwkJKmlvdiA9IE5VTEw7CisJCXJldHVybiBuOworCX0KKwlpb3ZfaXRlcl9pbml0KGksIHR5cGUsIHAsIG5yX3NlZ3MsIG4pOworCSppb3YgPSBwID09ICppb3YgPyBOVUxMIDogcDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaW1wb3J0X2lvdmVjKTsKKworI2lmZGVmIENPTkZJR19DT01QQVQKKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKworaW50IGNvbXBhdF9pbXBvcnRfaW92ZWMoaW50IHR5cGUsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICogdXZlY3RvciwKKwkJIHVuc2lnbmVkIG5yX3NlZ3MsIHVuc2lnbmVkIGZhc3Rfc2VncywKKwkJIHN0cnVjdCBpb3ZlYyAqKmlvdiwgc3RydWN0IGlvdl9pdGVyICppKQoreworCXNzaXplX3QgbjsKKwlzdHJ1Y3QgaW92ZWMgKnA7CisJbiA9IGNvbXBhdF9yd19jb3B5X2NoZWNrX3V2ZWN0b3IodHlwZSwgdXZlY3RvciwgbnJfc2VncywgZmFzdF9zZWdzLAorCQkJCSAgKmlvdiwgJnApOworCWlmIChuIDwgMCkgeworCQlpZiAocCAhPSAqaW92KQorCQkJa2ZyZWUocCk7CisJCSppb3YgPSBOVUxMOworCQlyZXR1cm4gbjsKKwl9CisJaW92X2l0ZXJfaW5pdChpLCB0eXBlLCBwLCBucl9zZWdzLCBuKTsKKwkqaW92ID0gcCA9PSAqaW92ID8gTlVMTCA6IHA7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IGltcG9ydF9zaW5nbGVfcmFuZ2UoaW50IHJ3LCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkgc3RydWN0IGlvdmVjICppb3YsIHN0cnVjdCBpb3ZfaXRlciAqaSkKK3sKKwlpZiAobGVuID4gTUFYX1JXX0NPVU5UKQorCQlsZW4gPSBNQVhfUldfQ09VTlQ7CisJaWYgKHVubGlrZWx5KCFhY2Nlc3Nfb2soIXJ3LCBidWYsIGxlbikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlvdi0+aW92X2Jhc2UgPSBidWY7CisJaW92LT5pb3ZfbGVuID0gbGVuOworCWlvdl9pdGVyX2luaXQoaSwgcncsIGlvdiwgMSwgbGVuKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaW1wb3J0X3NpbmdsZV9yYW5nZSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pcnFfcG9sbC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaXJxX3BvbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE3MDk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvaXJxX3BvbGwuYwpAQCAtMCwwICsxLDIxNSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBpbnRlcnJ1cHQtcG9sbCBoYW5kbGluZyBpbiB0aGUgYmxvY2sgbGF5ZXIuIFRoaXMKKyAqIGlzIHNpbWlsYXIgdG8gTkFQSSBmb3IgbmV0d29yayBkZXZpY2VzLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycV9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworc3RhdGljIHVuc2lnbmVkIGludCBpcnFfcG9sbF9idWRnZXQgX19yZWFkX21vc3RseSA9IDI1NjsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBsaXN0X2hlYWQsIGJsa19jcHVfaW9wb2xsKTsKKworLyoqCisgKiBpcnFfcG9sbF9zY2hlZCAtIFNjaGVkdWxlIGEgcnVuIG9mIHRoZSBpb3BvbGwgaGFuZGxlcgorICogQGlvcDogICAgICBUaGUgcGFyZW50IGlvcG9sbCBzdHJ1Y3R1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBBZGQgdGhpcyBpcnFfcG9sbCBzdHJ1Y3R1cmUgdG8gdGhlIHBlbmRpbmcgcG9sbCBsaXN0IGFuZCB0cmlnZ2VyIHRoZQorICogICAgIHJhaXNlIG9mIHRoZSBibGsgaW9wb2xsIHNvZnRpcnEuCisgKiovCit2b2lkIGlycV9wb2xsX3NjaGVkKHN0cnVjdCBpcnFfcG9sbCAqaW9wKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAodGVzdF9iaXQoSVJRX1BPTExfRl9ESVNBQkxFLCAmaW9wLT5zdGF0ZSkpCisJCXJldHVybjsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdChJUlFfUE9MTF9GX1NDSEVELCAmaW9wLT5zdGF0ZSkpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZpb3AtPmxpc3QsIHRoaXNfY3B1X3B0cigmYmxrX2NwdV9pb3BvbGwpKTsKKwlfX3JhaXNlX3NvZnRpcnFfaXJxb2ZmKElSUV9QT0xMX1NPRlRJUlEpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaXJxX3BvbGxfc2NoZWQpOworCisvKioKKyAqIF9faXJxX3BvbGxfY29tcGxldGUgLSBNYXJrIHRoaXMgQGlvcCBhcyB1bi1wb2xsZWQgYWdhaW4KKyAqIEBpb3A6ICAgICAgVGhlIHBhcmVudCBpb3BvbGwgc3RydWN0dXJlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgU2VlIGlycV9wb2xsX2NvbXBsZXRlKCkuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzCisgKiAgICAgZGlzYWJsZWQuCisgKiovCitzdGF0aWMgdm9pZCBfX2lycV9wb2xsX2NvbXBsZXRlKHN0cnVjdCBpcnFfcG9sbCAqaW9wKQoreworCWxpc3RfZGVsKCZpb3AtPmxpc3QpOworCXNtcF9tYl9fYmVmb3JlX2F0b21pYygpOworCWNsZWFyX2JpdF91bmxvY2soSVJRX1BPTExfRl9TQ0hFRCwgJmlvcC0+c3RhdGUpOworfQorCisvKioKKyAqIGlycV9wb2xsX2NvbXBsZXRlIC0gTWFyayB0aGlzIEBpb3AgYXMgdW4tcG9sbGVkIGFnYWluCisgKiBAaW9wOiAgICAgIFRoZSBwYXJlbnQgaW9wb2xsIHN0cnVjdHVyZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICAgIElmIGEgZHJpdmVyIGNvbnN1bWVzIGxlc3MgdGhhbiB0aGUgYXNzaWduZWQgYnVkZ2V0IGluIGl0cyBydW4gb2YgdGhlCisgKiAgICAgaW9wb2xsIGhhbmRsZXIsIGl0J2xsIGVuZCB0aGUgcG9sbGVkIG1vZGUgYnkgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBUaGUKKyAqICAgICBpb3BvbGwgaGFuZGxlciB3aWxsIG5vdCBiZSBpbnZva2VkIGFnYWluIGJlZm9yZSBpcnFfcG9sbF9zY2hlZCgpCisgKiAgICAgaXMgY2FsbGVkLgorICoqLwordm9pZCBpcnFfcG9sbF9jb21wbGV0ZShzdHJ1Y3QgaXJxX3BvbGwgKmlvcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9faXJxX3BvbGxfY29tcGxldGUoaW9wKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlycV9wb2xsX2NvbXBsZXRlKTsKKworc3RhdGljIHZvaWQgX19sYXRlbnRfZW50cm9weSBpcnFfcG9sbF9zb2Z0aXJxKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gdGhpc19jcHVfcHRyKCZibGtfY3B1X2lvcG9sbCk7CisJaW50IHJlYXJtID0gMCwgYnVkZ2V0ID0gaXJxX3BvbGxfYnVkZ2V0OworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZSA9IGppZmZpZXM7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGxpc3QpKSB7CisJCXN0cnVjdCBpcnFfcG9sbCAqaW9wOworCQlpbnQgd29yaywgd2VpZ2h0OworCisJCS8qCisJCSAqIElmIHNvZnRpcnEgd2luZG93IGlzIGV4aGF1c3RlZCB0aGVuIHB1bnQuCisJCSAqLworCQlpZiAoYnVkZ2V0IDw9IDAgfHwgdGltZV9hZnRlcihqaWZmaWVzLCBzdGFydF90aW1lKSkgeworCQkJcmVhcm0gPSAxOworCQkJYnJlYWs7CisJCX0KKworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwkJLyogRXZlbiB0aG91Z2ggaW50ZXJydXB0cyBoYXZlIGJlZW4gcmUtZW5hYmxlZCwgdGhpcworCQkgKiBhY2Nlc3MgaXMgc2FmZSBiZWNhdXNlIGludGVycnVwdHMgY2FuIG9ubHkgYWRkIG5ldworCQkgKiBlbnRyaWVzIHRvIHRoZSB0YWlsIG9mIHRoaXMgbGlzdCwgYW5kIG9ubHkgLT5wb2xsKCkKKwkJICogY2FsbHMgY2FuIHJlbW92ZSB0aGlzIGhlYWQgZW50cnkgZnJvbSB0aGUgbGlzdC4KKwkJICovCisJCWlvcCA9IGxpc3RfZW50cnkobGlzdC0+bmV4dCwgc3RydWN0IGlycV9wb2xsLCBsaXN0KTsKKworCQl3ZWlnaHQgPSBpb3AtPndlaWdodDsKKwkJd29yayA9IDA7CisJCWlmICh0ZXN0X2JpdChJUlFfUE9MTF9GX1NDSEVELCAmaW9wLT5zdGF0ZSkpCisJCQl3b3JrID0gaW9wLT5wb2xsKGlvcCwgd2VpZ2h0KTsKKworCQlidWRnZXQgLT0gd29yazsKKworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJCS8qCisJCSAqIERyaXZlcnMgbXVzdCBub3QgbW9kaWZ5IHRoZSBpb3BvbGwgc3RhdGUsIGlmIHRoZXkKKwkJICogY29uc3VtZSB0aGVpciBhc3NpZ25lZCB3ZWlnaHQgKG9yIG1vcmUsIHNvbWUgZHJpdmVycyBjYW4ndAorCQkgKiBlYXNpbHkganVzdCBzdG9wIHByb2Nlc3NpbmcsIHRoZXkgaGF2ZSB0byBjb21wbGV0ZSBhbgorCQkgKiBlbnRpcmUgbWFzayBvZiBjb21tYW5kcykuSW4gc3VjaCBjYXNlcyB0aGlzIGNvZGUKKwkJICogc3RpbGwgIm93bnMiIHRoZSBpb3BvbGwgaW5zdGFuY2UgYW5kIHRoZXJlZm9yZSBjYW4KKwkJICogbW92ZSB0aGUgaW5zdGFuY2UgYXJvdW5kIG9uIHRoZSBsaXN0IGF0LXdpbGwuCisJCSAqLworCQlpZiAod29yayA+PSB3ZWlnaHQpIHsKKwkJCWlmICh0ZXN0X2JpdChJUlFfUE9MTF9GX0RJU0FCTEUsICZpb3AtPnN0YXRlKSkKKwkJCQlfX2lycV9wb2xsX2NvbXBsZXRlKGlvcCk7CisJCQllbHNlCisJCQkJbGlzdF9tb3ZlX3RhaWwoJmlvcC0+bGlzdCwgbGlzdCk7CisJCX0KKwl9CisKKwlpZiAocmVhcm0pCisJCV9fcmFpc2Vfc29mdGlycV9pcnFvZmYoSVJRX1BPTExfU09GVElSUSk7CisKKwlsb2NhbF9pcnFfZW5hYmxlKCk7Cit9CisKKy8qKgorICogaXJxX3BvbGxfZGlzYWJsZSAtIERpc2FibGUgaW9wb2xsIG9uIHRoaXMgQGlvcAorICogQGlvcDogICAgICBUaGUgcGFyZW50IGlvcG9sbCBzdHJ1Y3R1cmUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgICBEaXNhYmxlIGlvIHBvbGxpbmcgYW5kIHdhaXQgZm9yIGFueSBwZW5kaW5nIGNhbGxiYWNrcyB0byBoYXZlIGNvbXBsZXRlZC4KKyAqKi8KK3ZvaWQgaXJxX3BvbGxfZGlzYWJsZShzdHJ1Y3QgaXJxX3BvbGwgKmlvcCkKK3sKKwlzZXRfYml0KElSUV9QT0xMX0ZfRElTQUJMRSwgJmlvcC0+c3RhdGUpOworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KElSUV9QT0xMX0ZfU0NIRUQsICZpb3AtPnN0YXRlKSkKKwkJbXNsZWVwKDEpOworCWNsZWFyX2JpdChJUlFfUE9MTF9GX0RJU0FCTEUsICZpb3AtPnN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0woaXJxX3BvbGxfZGlzYWJsZSk7CisKKy8qKgorICogaXJxX3BvbGxfZW5hYmxlIC0gRW5hYmxlIGlvcG9sbCBvbiB0aGlzIEBpb3AKKyAqIEBpb3A6ICAgICAgVGhlIHBhcmVudCBpb3BvbGwgc3RydWN0dXJlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgRW5hYmxlIGlvcG9sbCBvbiB0aGlzIEBpb3AuIE5vdGUgdGhhdCB0aGUgaGFuZGxlciBydW4gd2lsbCBub3QgYmUKKyAqICAgICBzY2hlZHVsZWQsIGl0IHdpbGwgb25seSBtYXJrIGl0IGFzIGFjdGl2ZS4KKyAqKi8KK3ZvaWQgaXJxX3BvbGxfZW5hYmxlKHN0cnVjdCBpcnFfcG9sbCAqaW9wKQoreworCUJVR19PTighdGVzdF9iaXQoSVJRX1BPTExfRl9TQ0hFRCwgJmlvcC0+c3RhdGUpKTsKKwlzbXBfbWJfX2JlZm9yZV9hdG9taWMoKTsKKwljbGVhcl9iaXRfdW5sb2NrKElSUV9QT0xMX0ZfU0NIRUQsICZpb3AtPnN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0woaXJxX3BvbGxfZW5hYmxlKTsKKworLyoqCisgKiBpcnFfcG9sbF9pbml0IC0gSW5pdGlhbGl6ZSB0aGlzIEBpb3AKKyAqIEBpb3A6ICAgICAgVGhlIHBhcmVudCBpb3BvbGwgc3RydWN0dXJlCisgKiBAd2VpZ2h0OiAgIFRoZSBkZWZhdWx0IHdlaWdodCAob3IgY29tbWFuZCBjb21wbGV0aW9uIGJ1ZGdldCkKKyAqIEBwb2xsX2ZuOiAgVGhlIGhhbmRsZXIgdG8gaW52b2tlCisgKgorICogRGVzY3JpcHRpb246CisgKiAgICAgSW5pdGlhbGl6ZSBhbmQgZW5hYmxlIHRoaXMgaXJxX3BvbGwgc3RydWN0dXJlLgorICoqLwordm9pZCBpcnFfcG9sbF9pbml0KHN0cnVjdCBpcnFfcG9sbCAqaW9wLCBpbnQgd2VpZ2h0LCBpcnFfcG9sbF9mbiAqcG9sbF9mbikKK3sKKwltZW1zZXQoaW9wLCAwLCBzaXplb2YoKmlvcCkpOworCUlOSVRfTElTVF9IRUFEKCZpb3AtPmxpc3QpOworCWlvcC0+d2VpZ2h0ID0gd2VpZ2h0OworCWlvcC0+cG9sbCA9IHBvbGxfZm47Cit9CitFWFBPUlRfU1lNQk9MKGlycV9wb2xsX2luaXQpOworCitzdGF0aWMgaW50IGlycV9wb2xsX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisJLyoKKwkgKiBJZiBhIENQVSBnb2VzIGF3YXksIHNwbGljZSBpdHMgZW50cmllcyB0byB0aGUgY3VycmVudCBDUFUKKwkgKiBhbmQgdHJpZ2dlciBhIHJ1biBvZiB0aGUgc29mdGlycQorCSAqLworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbGlzdF9zcGxpY2VfaW5pdCgmcGVyX2NwdShibGtfY3B1X2lvcG9sbCwgY3B1KSwKKwkJCSB0aGlzX2NwdV9wdHIoJmJsa19jcHVfaW9wb2xsKSk7CisJX19yYWlzZV9zb2Z0aXJxX2lycW9mZihJUlFfUE9MTF9TT0ZUSVJRKTsKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgaXJxX3BvbGxfc2V0dXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQlJTklUX0xJU1RfSEVBRCgmcGVyX2NwdShibGtfY3B1X2lvcG9sbCwgaSkpOworCisJb3Blbl9zb2Z0aXJxKElSUV9QT0xMX1NPRlRJUlEsIGlycV9wb2xsX3NvZnRpcnEpOworCWNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfSVJRX1BPTExfREVBRCwgImlycV9wb2xsOmRlYWQiLCBOVUxMLAorCQkJCSAgaXJxX3BvbGxfY3B1X2RlYWQpOworCXJldHVybiAwOworfQorc3Vic3lzX2luaXRjYWxsKGlycV9wb2xsX3NldHVwKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lycV9yZWdzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pcnFfcmVncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMGExZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pcnFfcmVncy5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIHNhdmVkIHBlci1DUFUgSVJRIHJlZ2lzdGVyIHBvaW50ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KKworI2lmbmRlZiBBUkNIX0hBU19PV05fSVJRX1JFR1MKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBwdF9yZWdzICosIF9faXJxX3JlZ3MpOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKF9faXJxX3JlZ3MpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pc19zaW5nbGVfdGhyZWFkZWQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2lzX3NpbmdsZV90aHJlYWRlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2Q4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9pc19zaW5nbGVfdGhyZWFkZWQuYwpAQCAtMCwwICsxLDU4IEBACisvKiBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgYSB0aHJlYWQgZ3JvdXAgaXMgc2luZ2xlIHRocmVhZGVkIG9yIG5vdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBSZWQgSGF0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IERhdmlkIEhvd2VsbHMgKGRob3dlbGxzQHJlZGhhdC5jb20pCisgKiAtIERlcml2ZWQgZnJvbSBzZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5jZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbmNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgvc2NoZWQvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL21tLmg+CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgZG9lcyBub3Qgc2hhcmUgLT5tbSB3aXRoIGFub3RoZXIgdGhyZWFkL3Byb2Nlc3MuCisgKi8KK2Jvb2wgY3VycmVudF9pc19zaW5nbGVfdGhyZWFkZWQodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdXJyZW50OworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gdGFzay0+bW07CisJc3RydWN0IHRhc2tfc3RydWN0ICpwLCAqdDsKKwlib29sIHJldDsKKworCWlmIChhdG9taWNfcmVhZCgmdGFzay0+c2lnbmFsLT5saXZlKSAhPSAxKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPT0gMSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXQgPSBmYWxzZTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yX2VhY2hfcHJvY2VzcyhwKSB7CisJCWlmICh1bmxpa2VseShwLT5mbGFncyAmIFBGX0tUSFJFQUQpKQorCQkJY29udGludWU7CisJCWlmICh1bmxpa2VseShwID09IHRhc2stPmdyb3VwX2xlYWRlcikpCisJCQljb250aW51ZTsKKworCQlmb3JfZWFjaF90aHJlYWQocCwgdCkgeworCQkJaWYgKHVubGlrZWx5KHQtPm1tID09IG1tKSkKKwkJCQlnb3RvIGZvdW5kOworCQkJaWYgKGxpa2VseSh0LT5tbSkpCisJCQkJYnJlYWs7CisJCQkvKgorCQkJICogdC0+bW0gPT0gTlVMTC4gTWFrZSBzdXJlIG5leHRfdGhyZWFkL25leHRfdGFzaworCQkJICogd2lsbCBzZWUgb3RoZXIgQ0xPTkVfVk0gdGFza3Mgd2hpY2ggbWlnaHQgYmUKKwkJCSAqIGZvcmtlZCBiZWZvcmUgZXhpdGluZy4KKwkJCSAqLworCQkJc21wX3JtYigpOworCQl9CisJfQorCXJldCA9IHRydWU7Citmb3VuZDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9qZWRlY19kZHJfZGF0YS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvamVkZWNfZGRyX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJjYmYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvamVkZWNfZGRyX2RhdGEuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIEREUiBhZGRyZXNzaW5nIGRldGFpbHMgYW5kIEFDIHRpbWluZyBwYXJhbWV0ZXJzIGZyb20gSkVERUMgc3BlY3MKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGV4YXMgSW5zdHJ1bWVudHMsIEluYy4KKyAqCisgKiBBbmVlc2ggViA8YW5lZXNoQHRpLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxtZW1vcnkvamVkZWNfZGRyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKy8qIExQRERSMiBhZGRyZXNzaW5nIGRldGFpbHMgZnJvbSBKRVNEMjA5LTIgc2VjdGlvbiAyLjQgKi8KK2NvbnN0IHN0cnVjdCBscGRkcjJfYWRkcmVzc2luZworCWxwZGRyMl9qZWRlY19hZGRyZXNzaW5nX3RhYmxlW05VTV9ERFJfQUREUl9UQUJMRV9FTlRSSUVTXSA9IHsKKwl7QjQsIFRfUkVGSV8xNV82LCBUX1JGQ185MH0sIC8qIDY0TSAqLworCXtCNCwgVF9SRUZJXzE1XzYsIFRfUkZDXzkwfSwgLyogMTI4TSAqLworCXtCNCwgVF9SRUZJXzdfOCwgIFRfUkZDXzkwfSwgLyogMjU2TSAqLworCXtCNCwgVF9SRUZJXzdfOCwgIFRfUkZDXzkwfSwgLyogNTEyTSAqLworCXtCOCwgVF9SRUZJXzdfOCwgVF9SRkNfMTMwfSwgLyogMUdTNCAqLworCXtCOCwgVF9SRUZJXzNfOSwgVF9SRkNfMTMwfSwgLyogMkdTNCAqLworCXtCOCwgVF9SRUZJXzNfOSwgVF9SRkNfMTMwfSwgLyogNEcgKi8KKwl7QjgsIFRfUkVGSV8zXzksIFRfUkZDXzIxMH0sIC8qIDhHICovCisJe0I0LCBUX1JFRklfN184LCBUX1JGQ18xMzB9LCAvKiAxR1MyICovCisJe0I0LCBUX1JFRklfM185LCBUX1JGQ18xMzB9LCAvKiAyR1MyICovCit9OworRVhQT1JUX1NZTUJPTF9HUEwobHBkZHIyX2plZGVjX2FkZHJlc3NpbmdfdGFibGUpOworCisvKiBMUEREUjIgQUMgdGltaW5nIHBhcmFtZXRlcnMgZnJvbSBKRVNEMjA5LTIgc2VjdGlvbiAxMiAqLworY29uc3Qgc3RydWN0IGxwZGRyMl90aW1pbmdzCisJbHBkZHIyX2plZGVjX3RpbWluZ3NbTlVNX0REUl9USU1JTkdfVEFCTEVfRU5UUklFU10gPSB7CisJLyogU3BlZWQgYmluIDQwMCgyMDAgTUh6KSAqLworCVswXSA9IHsKKwkJLm1heF9mcmVxCT0gMjAwMDAwMDAwLAorCQkubWluX2ZyZXEJPSAxMDAwMDAwMCwKKwkJLnRSUGFiCQk9IDIxMDAwLAorCQkudFJDRAkJPSAxODAwMCwKKwkJLnRXUgkJPSAxNTAwMCwKKwkJLnRSQVNfbWluCT0gNDIwMDAsCisJCS50UlJECQk9IDEwMDAwLAorCQkudFdUUgkJPSAxMDAwMCwKKwkJLnRYUAkJPSA3NTAwLAorCQkudFJUUAkJPSA3NTAwLAorCQkudENLRVNSCQk9IDE1MDAwLAorCQkudERRU0NLX21heAk9IDU1MDAsCisJCS50RkFXCQk9IDUwMDAwLAorCQkudFpRQ1MJCT0gOTAwMDAsCisJCS50WlFDTAkJPSAzNjAwMDAsCisJCS50WlFpbml0CT0gMTAwMDAwMCwKKwkJLnRSQVNfbWF4X25zCT0gNzAwMDAsCisJCS50RFFTQ0tfbWF4X2RlcmF0ZWQgPSA2MDAwLAorCX0sCisJLyogU3BlZWQgYmluIDUzMygyNjYgTUh6KSAqLworCVsxXSA9IHsKKwkJLm1heF9mcmVxCT0gMjY2NjY2NjY2LAorCQkubWluX2ZyZXEJPSAxMDAwMDAwMCwKKwkJLnRSUGFiCQk9IDIxMDAwLAorCQkudFJDRAkJPSAxODAwMCwKKwkJLnRXUgkJPSAxNTAwMCwKKwkJLnRSQVNfbWluCT0gNDIwMDAsCisJCS50UlJECQk9IDEwMDAwLAorCQkudFdUUgkJPSA3NTAwLAorCQkudFhQCQk9IDc1MDAsCisJCS50UlRQCQk9IDc1MDAsCisJCS50Q0tFU1IJCT0gMTUwMDAsCisJCS50RFFTQ0tfbWF4CT0gNTUwMCwKKwkJLnRGQVcJCT0gNTAwMDAsCisJCS50WlFDUwkJPSA5MDAwMCwKKwkJLnRaUUNMCQk9IDM2MDAwMCwKKwkJLnRaUWluaXQJPSAxMDAwMDAwLAorCQkudFJBU19tYXhfbnMJPSA3MDAwMCwKKwkJLnREUVNDS19tYXhfZGVyYXRlZCA9IDYwMDAsCisJfSwKKwkvKiBTcGVlZCBiaW4gODAwKDQwMCBNSHopICovCisJWzJdID0geworCQkubWF4X2ZyZXEJPSA0MDAwMDAwMDAsCisJCS5taW5fZnJlcQk9IDEwMDAwMDAwLAorCQkudFJQYWIJCT0gMjEwMDAsCisJCS50UkNECQk9IDE4MDAwLAorCQkudFdSCQk9IDE1MDAwLAorCQkudFJBU19taW4JPSA0MjAwMCwKKwkJLnRSUkQJCT0gMTAwMDAsCisJCS50V1RSCQk9IDc1MDAsCisJCS50WFAJCT0gNzUwMCwKKwkJLnRSVFAJCT0gNzUwMCwKKwkJLnRDS0VTUgkJPSAxNTAwMCwKKwkJLnREUVNDS19tYXgJPSA1NTAwLAorCQkudEZBVwkJPSA1MDAwMCwKKwkJLnRaUUNTCQk9IDkwMDAwLAorCQkudFpRQ0wJCT0gMzYwMDAwLAorCQkudFpRaW5pdAk9IDEwMDAwMDAsCisJCS50UkFTX21heF9ucwk9IDcwMDAwLAorCQkudERRU0NLX21heF9kZXJhdGVkID0gNjAwMCwKKwl9LAorCS8qIFNwZWVkIGJpbiAxMDY2KDUzMyBNSHopICovCisJWzNdID0geworCQkubWF4X2ZyZXEJPSA1MzMzMzMzMzMsCisJCS5taW5fZnJlcQk9IDEwMDAwMDAwLAorCQkudFJQYWIJCT0gMjEwMDAsCisJCS50UkNECQk9IDE4MDAwLAorCQkudFdSCQk9IDE1MDAwLAorCQkudFJBU19taW4JPSA0MjAwMCwKKwkJLnRSUkQJCT0gMTAwMDAsCisJCS50V1RSCQk9IDc1MDAsCisJCS50WFAJCT0gNzUwMCwKKwkJLnRSVFAJCT0gNzUwMCwKKwkJLnRDS0VTUgkJPSAxNTAwMCwKKwkJLnREUVNDS19tYXgJPSA1NTAwLAorCQkudEZBVwkJPSA1MDAwMCwKKwkJLnRaUUNTCQk9IDkwMDAwLAorCQkudFpRQ0wJCT0gMzYwMDAwLAorCQkudFpRaW5pdAk9IDEwMDAwMDAsCisJCS50UkFTX21heF9ucwk9IDcwMDAwLAorCQkudERRU0NLX21heF9kZXJhdGVkID0gNTYyMCwKKwl9LAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxwZGRyMl9qZWRlY190aW1pbmdzKTsKKworY29uc3Qgc3RydWN0IGxwZGRyMl9taW5fdGNrIGxwZGRyMl9qZWRlY19taW5fdGNrID0geworCS50UlBhYgkJPSAzLAorCS50UkNECQk9IDMsCisJLnRXUgkJPSAzLAorCS50UkFTbWluCT0gMywKKwkudFJSRAkJPSAyLAorCS50V1RSCQk9IDIsCisJLnRYUAkJPSAyLAorCS50UlRQCQk9IDIsCisJLnRDS0UJCT0gMywKKwkudENLRVNSCQk9IDMsCisJLnRGQVcJCT0gOAorfTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxwZGRyMl9qZWRlY19taW5fdGNrKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2thc3ByaW50Zi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIva2FzcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjZjdiODMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9rYXNwcmludGYuYwpAQCAtMCwwICsxLDY0IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqICBsaW51eC9saWIva2FzcHJpbnRmLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKworLyogU2ltcGxpZmllZCBhc3ByaW50Zi4gKi8KK2NoYXIgKmt2YXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXApCit7CisJdW5zaWduZWQgaW50IGZpcnN0LCBzZWNvbmQ7CisJY2hhciAqcDsKKwl2YV9saXN0IGFxOworCisJdmFfY29weShhcSwgYXApOworCWZpcnN0ID0gdnNucHJpbnRmKE5VTEwsIDAsIGZtdCwgYXEpOworCXZhX2VuZChhcSk7CisKKwlwID0ga21hbGxvY190cmFja19jYWxsZXIoZmlyc3QrMSwgZ2ZwKTsKKwlpZiAoIXApCisJCXJldHVybiBOVUxMOworCisJc2Vjb25kID0gdnNucHJpbnRmKHAsIGZpcnN0KzEsIGZtdCwgYXApOworCVdBUk4oZmlyc3QgIT0gc2Vjb25kLCAiZGlmZmVyZW50IHJldHVybiB2YWx1ZXMgKCV1IGFuZCAldSkgZnJvbSB2c25wcmludGYoXCIlc1wiLCAuLi4pIiwKKwkgICAgIGZpcnN0LCBzZWNvbmQsIGZtdCk7CisKKwlyZXR1cm4gcDsKK30KK0VYUE9SVF9TWU1CT0woa3Zhc3ByaW50Zik7CisKKy8qCisgKiBJZiBmbXQgY29udGFpbnMgbm8gJSAob3IgaXMgZXhhY3RseSAlcyksIHVzZSBrc3RyZHVwX2NvbnN0LiBJZiBmbXQKKyAqIChvciB0aGUgc29sZSB2YXJhcmcpIHBvaW50cyB0byByb2RhdGEsIHdlIHdpbGwgdGhlbiBzYXZlIGEgbWVtb3J5CisgKiBhbGxvY2F0aW9uIGFuZCBzdHJpbmcgY29weS4gSW4gYW55IGNhc2UsIHRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlCisgKiBmcmVlZCB1c2luZyBrZnJlZV9jb25zdCgpLgorICovCitjb25zdCBjaGFyICprdmFzcHJpbnRmX2NvbnN0KGdmcF90IGdmcCwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCWlmICghc3RyY2hyKGZtdCwgJyUnKSkKKwkJcmV0dXJuIGtzdHJkdXBfY29uc3QoZm10LCBnZnApOworCWlmICghc3RyY21wKGZtdCwgIiVzIikpCisJCXJldHVybiBrc3RyZHVwX2NvbnN0KHZhX2FyZyhhcCwgY29uc3QgY2hhciopLCBnZnApOworCXJldHVybiBrdmFzcHJpbnRmKGdmcCwgZm10LCBhcCk7Cit9CitFWFBPUlRfU1lNQk9MKGt2YXNwcmludGZfY29uc3QpOworCitjaGFyICprYXNwcmludGYoZ2ZwX3QgZ2ZwLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWNoYXIgKnA7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlwID0ga3Zhc3ByaW50ZihnZnAsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gcDsKK30KK0VYUE9SVF9TWU1CT0woa2FzcHJpbnRmKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tmaWZvLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9rZmlmby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NDIyN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9rZmlmby5jCkBAIC0wLDAgKzEsNjA2IEBACisvKgorICogQSBnZW5lcmljIGtlcm5lbCBGSUZPIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LzIwMTAgU3RlZmFuaSBTZWlib2xkIDxzdGVmYW5pQHNlaWJvbGQubmV0PgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorCisvKgorICogaW50ZXJuYWwgaGVscGVyIHRvIGNhbGN1bGF0ZSB0aGUgdW51c2VkIGVsZW1lbnRzIGluIGEgZmlmbworICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBrZmlmb191bnVzZWQoc3RydWN0IF9fa2ZpZm8gKmZpZm8pCit7CisJcmV0dXJuIChmaWZvLT5tYXNrICsgMSkgLSAoZmlmby0+aW4gLSBmaWZvLT5vdXQpOworfQorCitpbnQgX19rZmlmb19hbGxvYyhzdHJ1Y3QgX19rZmlmbyAqZmlmbywgdW5zaWduZWQgaW50IHNpemUsCisJCXNpemVfdCBlc2l6ZSwgZ2ZwX3QgZ2ZwX21hc2spCit7CisJLyoKKwkgKiByb3VuZCBkb3duIHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIsIHNpbmNlIG91ciAnbGV0IHRoZSBpbmRpY2VzCisJICogd3JhcCcgdGVjaG5pcXVlIHdvcmtzIG9ubHkgaW4gdGhpcyBjYXNlLgorCSAqLworCXNpemUgPSByb3VuZHVwX3Bvd19vZl90d28oc2l6ZSk7CisKKwlmaWZvLT5pbiA9IDA7CisJZmlmby0+b3V0ID0gMDsKKwlmaWZvLT5lc2l6ZSA9IGVzaXplOworCisJaWYgKHNpemUgPCAyKSB7CisJCWZpZm8tPmRhdGEgPSBOVUxMOworCQlmaWZvLT5tYXNrID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmlmby0+ZGF0YSA9IGttYWxsb2Moc2l6ZSAqIGVzaXplLCBnZnBfbWFzayk7CisKKwlpZiAoIWZpZm8tPmRhdGEpIHsKKwkJZmlmby0+bWFzayA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlmaWZvLT5tYXNrID0gc2l6ZSAtIDE7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19hbGxvYyk7CisKK3ZvaWQgX19rZmlmb19mcmVlKHN0cnVjdCBfX2tmaWZvICpmaWZvKQoreworCWtmcmVlKGZpZm8tPmRhdGEpOworCWZpZm8tPmluID0gMDsKKwlmaWZvLT5vdXQgPSAwOworCWZpZm8tPmVzaXplID0gMDsKKwlmaWZvLT5kYXRhID0gTlVMTDsKKwlmaWZvLT5tYXNrID0gMDsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19mcmVlKTsKKworaW50IF9fa2ZpZm9faW5pdChzdHJ1Y3QgX19rZmlmbyAqZmlmbywgdm9pZCAqYnVmZmVyLAorCQl1bnNpZ25lZCBpbnQgc2l6ZSwgc2l6ZV90IGVzaXplKQoreworCXNpemUgLz0gZXNpemU7CisKKwlpZiAoIWlzX3Bvd2VyX29mXzIoc2l6ZSkpCisJCXNpemUgPSByb3VuZGRvd25fcG93X29mX3R3byhzaXplKTsKKworCWZpZm8tPmluID0gMDsKKwlmaWZvLT5vdXQgPSAwOworCWZpZm8tPmVzaXplID0gZXNpemU7CisJZmlmby0+ZGF0YSA9IGJ1ZmZlcjsKKworCWlmIChzaXplIDwgMikgeworCQlmaWZvLT5tYXNrID0gMDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWZpZm8tPm1hc2sgPSBzaXplIC0gMTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX2luaXQpOworCitzdGF0aWMgdm9pZCBrZmlmb19jb3B5X2luKHN0cnVjdCBfX2tmaWZvICpmaWZvLCBjb25zdCB2b2lkICpzcmMsCisJCXVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmYpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSBmaWZvLT5tYXNrICsgMTsKKwl1bnNpZ25lZCBpbnQgZXNpemUgPSBmaWZvLT5lc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbDsKKworCW9mZiAmPSBmaWZvLT5tYXNrOworCWlmIChlc2l6ZSAhPSAxKSB7CisJCW9mZiAqPSBlc2l6ZTsKKwkJc2l6ZSAqPSBlc2l6ZTsKKwkJbGVuICo9IGVzaXplOworCX0KKwlsID0gbWluKGxlbiwgc2l6ZSAtIG9mZik7CisKKwltZW1jcHkoZmlmby0+ZGF0YSArIG9mZiwgc3JjLCBsKTsKKwltZW1jcHkoZmlmby0+ZGF0YSwgc3JjICsgbCwgbGVuIC0gbCk7CisJLyoKKwkgKiBtYWtlIHN1cmUgdGhhdCB0aGUgZGF0YSBpbiB0aGUgZmlmbyBpcyB1cCB0byBkYXRlIGJlZm9yZQorCSAqIGluY3JlbWVudGluZyB0aGUgZmlmby0+aW4gaW5kZXggY291bnRlcgorCSAqLworCXNtcF93bWIoKTsKK30KKwordW5zaWduZWQgaW50IF9fa2ZpZm9faW4oc3RydWN0IF9fa2ZpZm8gKmZpZm8sCisJCWNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgbDsKKworCWwgPSBrZmlmb191bnVzZWQoZmlmbyk7CisJaWYgKGxlbiA+IGwpCisJCWxlbiA9IGw7CisKKwlrZmlmb19jb3B5X2luKGZpZm8sIGJ1ZiwgbGVuLCBmaWZvLT5pbik7CisJZmlmby0+aW4gKz0gbGVuOworCXJldHVybiBsZW47Cit9CitFWFBPUlRfU1lNQk9MKF9fa2ZpZm9faW4pOworCitzdGF0aWMgdm9pZCBrZmlmb19jb3B5X291dChzdHJ1Y3QgX19rZmlmbyAqZmlmbywgdm9pZCAqZHN0LAorCQl1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgb2ZmKQoreworCXVuc2lnbmVkIGludCBzaXplID0gZmlmby0+bWFzayArIDE7CisJdW5zaWduZWQgaW50IGVzaXplID0gZmlmby0+ZXNpemU7CisJdW5zaWduZWQgaW50IGw7CisKKwlvZmYgJj0gZmlmby0+bWFzazsKKwlpZiAoZXNpemUgIT0gMSkgeworCQlvZmYgKj0gZXNpemU7CisJCXNpemUgKj0gZXNpemU7CisJCWxlbiAqPSBlc2l6ZTsKKwl9CisJbCA9IG1pbihsZW4sIHNpemUgLSBvZmYpOworCisJbWVtY3B5KGRzdCwgZmlmby0+ZGF0YSArIG9mZiwgbCk7CisJbWVtY3B5KGRzdCArIGwsIGZpZm8tPmRhdGEsIGxlbiAtIGwpOworCS8qCisJICogbWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgaXMgY29waWVkIGJlZm9yZQorCSAqIGluY3JlbWVudGluZyB0aGUgZmlmby0+b3V0IGluZGV4IGNvdW50ZXIKKwkgKi8KKwlzbXBfd21iKCk7Cit9CisKK3Vuc2lnbmVkIGludCBfX2tmaWZvX291dF9wZWVrKHN0cnVjdCBfX2tmaWZvICpmaWZvLAorCQl2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IGw7CisKKwlsID0gZmlmby0+aW4gLSBmaWZvLT5vdXQ7CisJaWYgKGxlbiA+IGwpCisJCWxlbiA9IGw7CisKKwlrZmlmb19jb3B5X291dChmaWZvLCBidWYsIGxlbiwgZmlmby0+b3V0KTsKKwlyZXR1cm4gbGVuOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX291dF9wZWVrKTsKKwordW5zaWduZWQgaW50IF9fa2ZpZm9fb3V0KHN0cnVjdCBfX2tmaWZvICpmaWZvLAorCQl2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4pCit7CisJbGVuID0gX19rZmlmb19vdXRfcGVlayhmaWZvLCBidWYsIGxlbik7CisJZmlmby0+b3V0ICs9IGxlbjsKKwlyZXR1cm4gbGVuOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX291dCk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGtmaWZvX2NvcHlfZnJvbV91c2VyKHN0cnVjdCBfX2tmaWZvICpmaWZvLAorCWNvbnN0IHZvaWQgX191c2VyICpmcm9tLCB1bnNpZ25lZCBpbnQgbGVuLCB1bnNpZ25lZCBpbnQgb2ZmLAorCXVuc2lnbmVkIGludCAqY29waWVkKQoreworCXVuc2lnbmVkIGludCBzaXplID0gZmlmby0+bWFzayArIDE7CisJdW5zaWduZWQgaW50IGVzaXplID0gZmlmby0+ZXNpemU7CisJdW5zaWduZWQgaW50IGw7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlvZmYgJj0gZmlmby0+bWFzazsKKwlpZiAoZXNpemUgIT0gMSkgeworCQlvZmYgKj0gZXNpemU7CisJCXNpemUgKj0gZXNpemU7CisJCWxlbiAqPSBlc2l6ZTsKKwl9CisJbCA9IG1pbihsZW4sIHNpemUgLSBvZmYpOworCisJcmV0ID0gY29weV9mcm9tX3VzZXIoZmlmby0+ZGF0YSArIG9mZiwgZnJvbSwgbCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCXJldCA9IERJVl9ST1VORF9VUChyZXQgKyBsZW4gLSBsLCBlc2l6ZSk7CisJZWxzZSB7CisJCXJldCA9IGNvcHlfZnJvbV91c2VyKGZpZm8tPmRhdGEsIGZyb20gKyBsLCBsZW4gLSBsKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXQgPSBESVZfUk9VTkRfVVAocmV0LCBlc2l6ZSk7CisJfQorCS8qCisJICogbWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgaW4gdGhlIGZpZm8gaXMgdXAgdG8gZGF0ZSBiZWZvcmUKKwkgKiBpbmNyZW1lbnRpbmcgdGhlIGZpZm8tPmluIGluZGV4IGNvdW50ZXIKKwkgKi8KKwlzbXBfd21iKCk7CisJKmNvcGllZCA9IGxlbiAtIHJldCAqIGVzaXplOworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdoaWNoIGFyZSBub3QgY29waWVkICovCisJcmV0dXJuIHJldDsKK30KKworaW50IF9fa2ZpZm9fZnJvbV91c2VyKHN0cnVjdCBfX2tmaWZvICpmaWZvLCBjb25zdCB2b2lkIF9fdXNlciAqZnJvbSwKKwkJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGludCAqY29waWVkKQoreworCXVuc2lnbmVkIGludCBsOworCXVuc2lnbmVkIGxvbmcgcmV0OworCXVuc2lnbmVkIGludCBlc2l6ZSA9IGZpZm8tPmVzaXplOworCWludCBlcnI7CisKKwlpZiAoZXNpemUgIT0gMSkKKwkJbGVuIC89IGVzaXplOworCisJbCA9IGtmaWZvX3VudXNlZChmaWZvKTsKKwlpZiAobGVuID4gbCkKKwkJbGVuID0gbDsKKworCXJldCA9IGtmaWZvX2NvcHlfZnJvbV91c2VyKGZpZm8sIGZyb20sIGxlbiwgZmlmby0+aW4sIGNvcGllZCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJbGVuIC09IHJldDsKKwkJZXJyID0gLUVGQVVMVDsKKwl9IGVsc2UKKwkJZXJyID0gMDsKKwlmaWZvLT5pbiArPSBsZW47CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19mcm9tX3VzZXIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBrZmlmb19jb3B5X3RvX3VzZXIoc3RydWN0IF9fa2ZpZm8gKmZpZm8sIHZvaWQgX191c2VyICp0bywKKwkJdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IG9mZiwgdW5zaWduZWQgaW50ICpjb3BpZWQpCit7CisJdW5zaWduZWQgaW50IGw7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgaW50IHNpemUgPSBmaWZvLT5tYXNrICsgMTsKKwl1bnNpZ25lZCBpbnQgZXNpemUgPSBmaWZvLT5lc2l6ZTsKKworCW9mZiAmPSBmaWZvLT5tYXNrOworCWlmIChlc2l6ZSAhPSAxKSB7CisJCW9mZiAqPSBlc2l6ZTsKKwkJc2l6ZSAqPSBlc2l6ZTsKKwkJbGVuICo9IGVzaXplOworCX0KKwlsID0gbWluKGxlbiwgc2l6ZSAtIG9mZik7CisKKwlyZXQgPSBjb3B5X3RvX3VzZXIodG8sIGZpZm8tPmRhdGEgKyBvZmYsIGwpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXQgPSBESVZfUk9VTkRfVVAocmV0ICsgbGVuIC0gbCwgZXNpemUpOworCWVsc2UgeworCQlyZXQgPSBjb3B5X3RvX3VzZXIodG8gKyBsLCBmaWZvLT5kYXRhLCBsZW4gLSBsKTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXQgPSBESVZfUk9VTkRfVVAocmV0LCBlc2l6ZSk7CisJfQorCS8qCisJICogbWFrZSBzdXJlIHRoYXQgdGhlIGRhdGEgaXMgY29waWVkIGJlZm9yZQorCSAqIGluY3JlbWVudGluZyB0aGUgZmlmby0+b3V0IGluZGV4IGNvdW50ZXIKKwkgKi8KKwlzbXBfd21iKCk7CisJKmNvcGllZCA9IGxlbiAtIHJldCAqIGVzaXplOworCS8qIHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdoaWNoIGFyZSBub3QgY29waWVkICovCisJcmV0dXJuIHJldDsKK30KKworaW50IF9fa2ZpZm9fdG9fdXNlcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywgdm9pZCBfX3VzZXIgKnRvLAorCQl1bnNpZ25lZCBsb25nIGxlbiwgdW5zaWduZWQgaW50ICpjb3BpZWQpCit7CisJdW5zaWduZWQgaW50IGw7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgaW50IGVzaXplID0gZmlmby0+ZXNpemU7CisJaW50IGVycjsKKworCWlmIChlc2l6ZSAhPSAxKQorCQlsZW4gLz0gZXNpemU7CisKKwlsID0gZmlmby0+aW4gLSBmaWZvLT5vdXQ7CisJaWYgKGxlbiA+IGwpCisJCWxlbiA9IGw7CisJcmV0ID0ga2ZpZm9fY29weV90b191c2VyKGZpZm8sIHRvLCBsZW4sIGZpZm8tPm91dCwgY29waWVkKTsKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlsZW4gLT0gcmV0OworCQllcnIgPSAtRUZBVUxUOworCX0gZWxzZQorCQllcnIgPSAwOworCWZpZm8tPm91dCArPSBsZW47CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb190b191c2VyKTsKKworc3RhdGljIGludCBzZXR1cF9zZ2xfYnVmKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB2b2lkICpidWYsCisJCWludCBuZW50cywgdW5zaWduZWQgaW50IGxlbikKK3sKKwlpbnQgbjsKKwl1bnNpZ25lZCBpbnQgbDsKKwl1bnNpZ25lZCBpbnQgb2ZmOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKCFuZW50cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwluID0gMDsKKwlwYWdlID0gdmlydF90b19wYWdlKGJ1Zik7CisJb2ZmID0gb2Zmc2V0X2luX3BhZ2UoYnVmKTsKKwlsID0gMDsKKworCXdoaWxlIChsZW4gPj0gbCArIFBBR0VfU0laRSAtIG9mZikgeworCQlzdHJ1Y3QgcGFnZSAqbnBhZ2U7CisKKwkJbCArPSBQQUdFX1NJWkU7CisJCWJ1ZiArPSBQQUdFX1NJWkU7CisJCW5wYWdlID0gdmlydF90b19wYWdlKGJ1Zik7CisJCWlmIChwYWdlX3RvX3BoeXMocGFnZSkgIT0gcGFnZV90b19waHlzKG5wYWdlKSAtIGwpIHsKKwkJCXNnX3NldF9wYWdlKHNnbCwgcGFnZSwgbCAtIG9mZiwgb2ZmKTsKKwkJCXNnbCA9IHNnX25leHQoc2dsKTsKKwkJCWlmICgrK24gPT0gbmVudHMgfHwgc2dsID09IE5VTEwpCisJCQkJcmV0dXJuIG47CisJCQlwYWdlID0gbnBhZ2U7CisJCQlsZW4gLT0gbCAtIG9mZjsKKwkJCWwgPSBvZmYgPSAwOworCQl9CisJfQorCXNnX3NldF9wYWdlKHNnbCwgcGFnZSwgbGVuLCBvZmYpOworCXJldHVybiBuICsgMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzZXR1cF9zZ2woc3RydWN0IF9fa2ZpZm8gKmZpZm8sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAorCQlpbnQgbmVudHMsIHVuc2lnbmVkIGludCBsZW4sIHVuc2lnbmVkIGludCBvZmYpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSBmaWZvLT5tYXNrICsgMTsKKwl1bnNpZ25lZCBpbnQgZXNpemUgPSBmaWZvLT5lc2l6ZTsKKwl1bnNpZ25lZCBpbnQgbDsKKwl1bnNpZ25lZCBpbnQgbjsKKworCW9mZiAmPSBmaWZvLT5tYXNrOworCWlmIChlc2l6ZSAhPSAxKSB7CisJCW9mZiAqPSBlc2l6ZTsKKwkJc2l6ZSAqPSBlc2l6ZTsKKwkJbGVuICo9IGVzaXplOworCX0KKwlsID0gbWluKGxlbiwgc2l6ZSAtIG9mZik7CisKKwluID0gc2V0dXBfc2dsX2J1ZihzZ2wsIGZpZm8tPmRhdGEgKyBvZmYsIG5lbnRzLCBsKTsKKwluICs9IHNldHVwX3NnbF9idWYoc2dsICsgbiwgZmlmby0+ZGF0YSwgbmVudHMgLSBuLCBsZW4gLSBsKTsKKworCXJldHVybiBuOworfQorCit1bnNpZ25lZCBpbnQgX19rZmlmb19kbWFfaW5fcHJlcGFyZShzdHJ1Y3QgX19rZmlmbyAqZmlmbywKKwkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZW50cywgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgbDsKKworCWwgPSBrZmlmb191bnVzZWQoZmlmbyk7CisJaWYgKGxlbiA+IGwpCisJCWxlbiA9IGw7CisKKwlyZXR1cm4gc2V0dXBfc2dsKGZpZm8sIHNnbCwgbmVudHMsIGxlbiwgZmlmby0+aW4pOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX2RtYV9pbl9wcmVwYXJlKTsKKwordW5zaWduZWQgaW50IF9fa2ZpZm9fZG1hX291dF9wcmVwYXJlKHN0cnVjdCBfX2tmaWZvICpmaWZvLAorCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG5lbnRzLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBsOworCisJbCA9IGZpZm8tPmluIC0gZmlmby0+b3V0OworCWlmIChsZW4gPiBsKQorCQlsZW4gPSBsOworCisJcmV0dXJuIHNldHVwX3NnbChmaWZvLCBzZ2wsIG5lbnRzLCBsZW4sIGZpZm8tPm91dCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fa2ZpZm9fZG1hX291dF9wcmVwYXJlKTsKKwordW5zaWduZWQgaW50IF9fa2ZpZm9fbWF4X3IodW5zaWduZWQgaW50IGxlbiwgc2l6ZV90IHJlY3NpemUpCit7CisJdW5zaWduZWQgaW50IG1heCA9ICgxIDw8IChyZWNzaXplIDw8IDMpKSAtIDE7CisKKwlpZiAobGVuID4gbWF4KQorCQlyZXR1cm4gbWF4OworCXJldHVybiBsZW47Cit9CitFWFBPUlRfU1lNQk9MKF9fa2ZpZm9fbWF4X3IpOworCisjZGVmaW5lCV9fS0ZJRk9fUEVFSyhkYXRhLCBvdXQsIG1hc2spIFwKKwkoKGRhdGEpWyhvdXQpICYgKG1hc2spXSkKKy8qCisgKiBfX2tmaWZvX3BlZWtfbiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gZm9yIGRldGVybWluYXRlIHRoZSBsZW5ndGggb2YKKyAqIHRoZSBuZXh0IHJlY29yZCBpbiB0aGUgZmlmbworICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9fa2ZpZm9fcGVla19uKHN0cnVjdCBfX2tmaWZvICpmaWZvLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGZpZm8tPm1hc2s7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IGZpZm8tPmRhdGE7CisKKwlsID0gX19LRklGT19QRUVLKGRhdGEsIGZpZm8tPm91dCwgbWFzayk7CisKKwlpZiAoLS1yZWNzaXplKQorCQlsIHw9IF9fS0ZJRk9fUEVFSyhkYXRhLCBmaWZvLT5vdXQgKyAxLCBtYXNrKSA8PCA4OworCisJcmV0dXJuIGw7Cit9CisKKyNkZWZpbmUJX19LRklGT19QT0tFKGRhdGEsIGluLCBtYXNrLCB2YWwpIFwKKwkoIFwKKwkoZGF0YSlbKGluKSAmIChtYXNrKV0gPSAodW5zaWduZWQgY2hhcikodmFsKSBcCisJKQorCisvKgorICogX19rZmlmb19wb2tlX24gaW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciBzdG9yZWluZyB0aGUgbGVuZ3RoIG9mCisgKiB0aGUgcmVjb3JkIGludG8gdGhlIGZpZm8KKyAqLworc3RhdGljIHZvaWQgX19rZmlmb19wb2tlX24oc3RydWN0IF9fa2ZpZm8gKmZpZm8sIHVuc2lnbmVkIGludCBuLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IGZpZm8tPm1hc2s7CisJdW5zaWduZWQgY2hhciAqZGF0YSA9IGZpZm8tPmRhdGE7CisKKwlfX0tGSUZPX1BPS0UoZGF0YSwgZmlmby0+aW4sIG1hc2ssIG4pOworCisJaWYgKHJlY3NpemUgPiAxKQorCQlfX0tGSUZPX1BPS0UoZGF0YSwgZmlmby0+aW4gKyAxLCBtYXNrLCBuID4+IDgpOworfQorCit1bnNpZ25lZCBpbnQgX19rZmlmb19sZW5fcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywgc2l6ZV90IHJlY3NpemUpCit7CisJcmV0dXJuIF9fa2ZpZm9fcGVla19uKGZpZm8sIHJlY3NpemUpOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX2xlbl9yKTsKKwordW5zaWduZWQgaW50IF9fa2ZpZm9faW5fcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywgY29uc3Qgdm9pZCAqYnVmLAorCQl1bnNpZ25lZCBpbnQgbGVuLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwlpZiAobGVuICsgcmVjc2l6ZSA+IGtmaWZvX3VudXNlZChmaWZvKSkKKwkJcmV0dXJuIDA7CisKKwlfX2tmaWZvX3Bva2VfbihmaWZvLCBsZW4sIHJlY3NpemUpOworCisJa2ZpZm9fY29weV9pbihmaWZvLCBidWYsIGxlbiwgZmlmby0+aW4gKyByZWNzaXplKTsKKwlmaWZvLT5pbiArPSBsZW4gKyByZWNzaXplOworCXJldHVybiBsZW47Cit9CitFWFBPUlRfU1lNQk9MKF9fa2ZpZm9faW5fcik7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga2ZpZm9fb3V0X2NvcHlfcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywKKwl2b2lkICpidWYsIHVuc2lnbmVkIGludCBsZW4sIHNpemVfdCByZWNzaXplLCB1bnNpZ25lZCBpbnQgKm4pCit7CisJKm4gPSBfX2tmaWZvX3BlZWtfbihmaWZvLCByZWNzaXplKTsKKworCWlmIChsZW4gPiAqbikKKwkJbGVuID0gKm47CisKKwlrZmlmb19jb3B5X291dChmaWZvLCBidWYsIGxlbiwgZmlmby0+b3V0ICsgcmVjc2l6ZSk7CisJcmV0dXJuIGxlbjsKK30KKwordW5zaWduZWQgaW50IF9fa2ZpZm9fb3V0X3BlZWtfcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywgdm9pZCAqYnVmLAorCQl1bnNpZ25lZCBpbnQgbGVuLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbjsKKworCWlmIChmaWZvLT5pbiA9PSBmaWZvLT5vdXQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGtmaWZvX291dF9jb3B5X3IoZmlmbywgYnVmLCBsZW4sIHJlY3NpemUsICZuKTsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19vdXRfcGVla19yKTsKKwordW5zaWduZWQgaW50IF9fa2ZpZm9fb3V0X3Ioc3RydWN0IF9fa2ZpZm8gKmZpZm8sIHZvaWQgKmJ1ZiwKKwkJdW5zaWduZWQgaW50IGxlbiwgc2l6ZV90IHJlY3NpemUpCit7CisJdW5zaWduZWQgaW50IG47CisKKwlpZiAoZmlmby0+aW4gPT0gZmlmby0+b3V0KQorCQlyZXR1cm4gMDsKKworCWxlbiA9IGtmaWZvX291dF9jb3B5X3IoZmlmbywgYnVmLCBsZW4sIHJlY3NpemUsICZuKTsKKwlmaWZvLT5vdXQgKz0gbiArIHJlY3NpemU7CisJcmV0dXJuIGxlbjsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19vdXRfcik7CisKK3ZvaWQgX19rZmlmb19za2lwX3Ioc3RydWN0IF9fa2ZpZm8gKmZpZm8sIHNpemVfdCByZWNzaXplKQoreworCXVuc2lnbmVkIGludCBuOworCisJbiA9IF9fa2ZpZm9fcGVla19uKGZpZm8sIHJlY3NpemUpOworCWZpZm8tPm91dCArPSBuICsgcmVjc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19za2lwX3IpOworCitpbnQgX19rZmlmb19mcm9tX3VzZXJfcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGludCAqY29waWVkLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKworCWxlbiA9IF9fa2ZpZm9fbWF4X3IobGVuLCByZWNzaXplKTsKKworCWlmIChsZW4gKyByZWNzaXplID4ga2ZpZm9fdW51c2VkKGZpZm8pKSB7CisJCSpjb3BpZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlfX2tmaWZvX3Bva2VfbihmaWZvLCBsZW4sIHJlY3NpemUpOworCisJcmV0ID0ga2ZpZm9fY29weV9mcm9tX3VzZXIoZmlmbywgZnJvbSwgbGVuLCBmaWZvLT5pbiArIHJlY3NpemUsIGNvcGllZCk7CisJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJKmNvcGllZCA9IDA7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwlmaWZvLT5pbiArPSBsZW4gKyByZWNzaXplOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX2Zyb21fdXNlcl9yKTsKKworaW50IF9fa2ZpZm9fdG9fdXNlcl9yKHN0cnVjdCBfX2tmaWZvICpmaWZvLCB2b2lkIF9fdXNlciAqdG8sCisJdW5zaWduZWQgbG9uZyBsZW4sIHVuc2lnbmVkIGludCAqY29waWVkLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwl1bnNpZ25lZCBpbnQgbjsKKworCWlmIChmaWZvLT5pbiA9PSBmaWZvLT5vdXQpIHsKKwkJKmNvcGllZCA9IDA7CisJCXJldHVybiAwOworCX0KKworCW4gPSBfX2tmaWZvX3BlZWtfbihmaWZvLCByZWNzaXplKTsKKwlpZiAobGVuID4gbikKKwkJbGVuID0gbjsKKworCXJldCA9IGtmaWZvX2NvcHlfdG9fdXNlcihmaWZvLCB0bywgbGVuLCBmaWZvLT5vdXQgKyByZWNzaXplLCBjb3BpZWQpOworCWlmICh1bmxpa2VseShyZXQpKSB7CisJCSpjb3BpZWQgPSAwOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJZmlmby0+b3V0ICs9IG4gKyByZWNzaXplOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX3RvX3VzZXJfcik7CisKK3Vuc2lnbmVkIGludCBfX2tmaWZvX2RtYV9pbl9wcmVwYXJlX3Ioc3RydWN0IF9fa2ZpZm8gKmZpZm8sCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIGludCBuZW50cywgdW5zaWduZWQgaW50IGxlbiwgc2l6ZV90IHJlY3NpemUpCit7CisJQlVHX09OKCFuZW50cyk7CisKKwlsZW4gPSBfX2tmaWZvX21heF9yKGxlbiwgcmVjc2l6ZSk7CisKKwlpZiAobGVuICsgcmVjc2l6ZSA+IGtmaWZvX3VudXNlZChmaWZvKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2V0dXBfc2dsKGZpZm8sIHNnbCwgbmVudHMsIGxlbiwgZmlmby0+aW4gKyByZWNzaXplKTsKK30KK0VYUE9SVF9TWU1CT0woX19rZmlmb19kbWFfaW5fcHJlcGFyZV9yKTsKKwordm9pZCBfX2tmaWZvX2RtYV9pbl9maW5pc2hfcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywKKwl1bnNpZ25lZCBpbnQgbGVuLCBzaXplX3QgcmVjc2l6ZSkKK3sKKwlsZW4gPSBfX2tmaWZvX21heF9yKGxlbiwgcmVjc2l6ZSk7CisJX19rZmlmb19wb2tlX24oZmlmbywgbGVuLCByZWNzaXplKTsKKwlmaWZvLT5pbiArPSBsZW4gKyByZWNzaXplOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX2RtYV9pbl9maW5pc2hfcik7CisKK3Vuc2lnbmVkIGludCBfX2tmaWZvX2RtYV9vdXRfcHJlcGFyZV9yKHN0cnVjdCBfX2tmaWZvICpmaWZvLAorCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVudHMsIHVuc2lnbmVkIGludCBsZW4sIHNpemVfdCByZWNzaXplKQoreworCUJVR19PTighbmVudHMpOworCisJbGVuID0gX19rZmlmb19tYXhfcihsZW4sIHJlY3NpemUpOworCisJaWYgKGxlbiArIHJlY3NpemUgPiBmaWZvLT5pbiAtIGZpZm8tPm91dCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2V0dXBfc2dsKGZpZm8sIHNnbCwgbmVudHMsIGxlbiwgZmlmby0+b3V0ICsgcmVjc2l6ZSk7Cit9CitFWFBPUlRfU1lNQk9MKF9fa2ZpZm9fZG1hX291dF9wcmVwYXJlX3IpOworCit2b2lkIF9fa2ZpZm9fZG1hX291dF9maW5pc2hfcihzdHJ1Y3QgX19rZmlmbyAqZmlmbywgc2l6ZV90IHJlY3NpemUpCit7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IF9fa2ZpZm9fcGVla19uKGZpZm8sIHJlY3NpemUpOworCWZpZm8tPm91dCArPSBsZW4gKyByZWNzaXplOworfQorRVhQT1JUX1NZTUJPTChfX2tmaWZvX2RtYV9vdXRfZmluaXNoX3IpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIva2xpc3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZiNTQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tsaXN0LmMKQEAgLTAsMCArMSw0MDggQEAKKy8qCisgKiBrbGlzdC5jIC0gUm91dGluZXMgZm9yIG1hbmlwdWxhdGluZyBrbGlzdHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFBhdHJpY2sgTW9jaGVsCisgKgorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdjIuCisgKgorICogVGhpcyBrbGlzdCBpbnRlcmZhY2UgcHJvdmlkZXMgYSBjb3VwbGUgb2Ygc3RydWN0dXJlcyB0aGF0IHdyYXAgYXJvdW5kCisgKiBzdHJ1Y3QgbGlzdF9oZWFkIHRvIHByb3ZpZGUgZXhwbGljaXQgbGlzdCAiaGVhZCIgKHN0cnVjdCBrbGlzdCkgYW5kIGxpc3QKKyAqICJub2RlIiAoc3RydWN0IGtsaXN0X25vZGUpIG9iamVjdHMuIEZvciBzdHJ1Y3Qga2xpc3QsIGEgc3BpbmxvY2sgaXMKKyAqIGluY2x1ZGVkIHRoYXQgcHJvdGVjdHMgYWNjZXNzIHRvIHRoZSBhY3R1YWwgbGlzdCBpdHNlbGYuIHN0cnVjdAorICoga2xpc3Rfbm9kZSBwcm92aWRlcyBhIHBvaW50ZXIgdG8gdGhlIGtsaXN0IHRoYXQgb3ducyBpdCBhbmQgYSBrcmVmCisgKiByZWZlcmVuY2UgY291bnQgdGhhdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjdXJyZW50IHVzZXJzIG9mIHRoYXQgbm9kZQorICogaW4gdGhlIGxpc3QuCisgKgorICogVGhlIGVudGlyZSBwb2ludCBpcyB0byBwcm92aWRlIGFuIGludGVyZmFjZSBmb3IgaXRlcmF0aW5nIG92ZXIgYSBsaXN0CisgKiB0aGF0IGlzIHNhZmUgYW5kIGFsbG93cyBmb3IgbW9kaWZpY2F0aW9uIG9mIHRoZSBsaXN0IGR1cmluZyB0aGUKKyAqIGl0ZXJhdGlvbiAoZS5nLiBpbnNlcnRpb24gYW5kIHJlbW92YWwpLCBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uIG9mIHRoZQorICogY3VycmVudCBub2RlIG9uIHRoZSBsaXN0LgorICoKKyAqIEl0IHdvcmtzIHVzaW5nIGEgM3JkIG9iamVjdCB0eXBlIC0gc3RydWN0IGtsaXN0X2l0ZXIgLSB0aGF0IGlzIGRlY2xhcmVkCisgKiBhbmQgaW5pdGlhbGl6ZWQgYmVmb3JlIGFuIGl0ZXJhdGlvbi4ga2xpc3RfbmV4dCgpIGlzIHVzZWQgdG8gYWNxdWlyZSB0aGUKKyAqIG5leHQgZWxlbWVudCBpbiB0aGUgbGlzdC4gSXQgcmV0dXJucyBOVUxMIGlmIHRoZXJlIGFyZSBubyBtb3JlIGl0ZW1zLgorICogSW50ZXJuYWxseSwgdGhhdCByb3V0aW5lIHRha2VzIHRoZSBrbGlzdCdzIGxvY2ssIGRlY3JlbWVudHMgdGhlCisgKiByZWZlcmVuY2UgY291bnQgb2YgdGhlIHByZXZpb3VzIGtsaXN0X25vZGUgYW5kIGluY3JlbWVudHMgdGhlIGNvdW50IG9mCisgKiB0aGUgbmV4dCBrbGlzdF9ub2RlLiBJdCB0aGVuIGRyb3BzIHRoZSBsb2NrIGFuZCByZXR1cm5zLgorICoKKyAqIFRoZXJlIGFyZSBwcmltaXRpdmVzIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIG5vZGVzIHRvL2Zyb20gYSBrbGlzdC4KKyAqIFdoZW4gZGVsZXRpbmcsIGtsaXN0X2RlbCgpIHdpbGwgc2ltcGx5IGRlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50LgorICogT25seSB3aGVuIHRoZSBjb3VudCBnb2VzIHRvIDAgaXMgdGhlIG5vZGUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICoga2xpc3RfcmVtb3ZlKCkgd2lsbCB0cnkgdG8gZGVsZXRlIHRoZSBub2RlIGZyb20gdGhlIGxpc3QgYW5kIGJsb2NrIHVudGlsCisgKiBpdCBpcyBhY3R1YWxseSByZW1vdmVkLiBUaGlzIGlzIHVzZWZ1bCBmb3Igb2JqZWN0cyAobGlrZSBkZXZpY2VzKSB0aGF0CisgKiBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzeXN0ZW0gYW5kIG11c3QgYmUgZnJlZWQgKGJ1dCBtdXN0IHdhaXQgdW50aWwKKyAqIGFsbCBhY2Nlc3NvcnMgaGF2ZSBmaW5pc2hlZCkuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKworLyoKKyAqIFVzZSB0aGUgbG93ZXN0IGJpdCBvZiBuX2tsaXN0IHRvIG1hcmsgZGVsZXRlZCBub2RlcyBhbmQgZXhjbHVkZQorICogZGVhZCBvbmVzIGZyb20gaXRlcmF0aW9uLgorICovCisjZGVmaW5lIEtOT0RFX0RFQUQJCTFMVQorI2RlZmluZSBLTk9ERV9LTElTVF9NQVNLCX5LTk9ERV9ERUFECisKK3N0YXRpYyBzdHJ1Y3Qga2xpc3QgKmtub2RlX2tsaXN0KHN0cnVjdCBrbGlzdF9ub2RlICprbm9kZSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBrbGlzdCAqKQorCQkoKHVuc2lnbmVkIGxvbmcpa25vZGUtPm5fa2xpc3QgJiBLTk9ERV9LTElTVF9NQVNLKTsKK30KKworc3RhdGljIGJvb2wga25vZGVfZGVhZChzdHJ1Y3Qga2xpc3Rfbm9kZSAqa25vZGUpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWtub2RlLT5uX2tsaXN0ICYgS05PREVfREVBRDsKK30KKworc3RhdGljIHZvaWQga25vZGVfc2V0X2tsaXN0KHN0cnVjdCBrbGlzdF9ub2RlICprbm9kZSwgc3RydWN0IGtsaXN0ICprbGlzdCkKK3sKKwlrbm9kZS0+bl9rbGlzdCA9IGtsaXN0OworCS8qIG5vIGtub2RlIGRlc2VydmVzIHRvIHN0YXJ0IGl0cyBsaWZlIGRlYWQgKi8KKwlXQVJOX09OKGtub2RlX2RlYWQoa25vZGUpKTsKK30KKworc3RhdGljIHZvaWQga25vZGVfa2lsbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqa25vZGUpCit7CisJLyogYW5kIG5vIGtub2RlIHNob3VsZCBkaWUgdHdpY2UgZXZlciBlaXRoZXIsIHNlZSB3ZSdyZSB2ZXJ5IGh1bWFuZSAqLworCVdBUk5fT04oa25vZGVfZGVhZChrbm9kZSkpOworCSoodW5zaWduZWQgbG9uZyAqKSZrbm9kZS0+bl9rbGlzdCB8PSBLTk9ERV9ERUFEOworfQorCisvKioKKyAqIGtsaXN0X2luaXQgLSBJbml0aWFsaXplIGEga2xpc3Qgc3RydWN0dXJlLgorICogQGs6IFRoZSBrbGlzdCB3ZSdyZSBpbml0aWFsaXppbmcuCisgKiBAZ2V0OiBUaGUgZ2V0IGZ1bmN0aW9uIGZvciB0aGUgZW1iZWRkaW5nIG9iamVjdCAoTlVMTCBpZiBub25lKQorICogQHB1dDogVGhlIHB1dCBmdW5jdGlvbiBmb3IgdGhlIGVtYmVkZGluZyBvYmplY3QgKE5VTEwgaWYgbm9uZSkKKyAqCisgKiBJbml0aWFsaXNlcyB0aGUga2xpc3Qgc3RydWN0dXJlLiAgSWYgdGhlIGtsaXN0X25vZGUgc3RydWN0dXJlcyBhcmUKKyAqIGdvaW5nIHRvIGJlIGVtYmVkZGVkIGluIHJlZmNvdW50ZWQgb2JqZWN0cyAobmVjZXNzYXJ5IGZvciBzYWZlCisgKiBkZWxldGlvbikgdGhlbiB0aGUgZ2V0L3B1dCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gaW5pdGlhbGlzZQorICogZnVuY3Rpb25zIHRoYXQgdGFrZSBhbmQgcmVsZWFzZSByZWZlcmVuY2VzIG9uIHRoZSBlbWJlZGRpbmcKKyAqIG9iamVjdHMuCisgKi8KK3ZvaWQga2xpc3RfaW5pdChzdHJ1Y3Qga2xpc3QgKmssIHZvaWQgKCpnZXQpKHN0cnVjdCBrbGlzdF9ub2RlICopLAorCQl2b2lkICgqcHV0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSkKK3sKKwlJTklUX0xJU1RfSEVBRCgmay0+a19saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmay0+a19sb2NrKTsKKwlrLT5nZXQgPSBnZXQ7CisJay0+cHV0ID0gcHV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfaW5pdCk7CisKK3N0YXRpYyB2b2lkIGFkZF9oZWFkKHN0cnVjdCBrbGlzdCAqaywgc3RydWN0IGtsaXN0X25vZGUgKm4pCit7CisJc3Bpbl9sb2NrKCZrLT5rX2xvY2spOworCWxpc3RfYWRkKCZuLT5uX25vZGUsICZrLT5rX2xpc3QpOworCXNwaW5fdW5sb2NrKCZrLT5rX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBhZGRfdGFpbChzdHJ1Y3Qga2xpc3QgKmssIHN0cnVjdCBrbGlzdF9ub2RlICpuKQoreworCXNwaW5fbG9jaygmay0+a19sb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZuLT5uX25vZGUsICZrLT5rX2xpc3QpOworCXNwaW5fdW5sb2NrKCZrLT5rX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBrbGlzdF9ub2RlX2luaXQoc3RydWN0IGtsaXN0ICprLCBzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlJTklUX0xJU1RfSEVBRCgmbi0+bl9ub2RlKTsKKwlrcmVmX2luaXQoJm4tPm5fcmVmKTsKKwlrbm9kZV9zZXRfa2xpc3Qobiwgayk7CisJaWYgKGstPmdldCkKKwkJay0+Z2V0KG4pOworfQorCisvKioKKyAqIGtsaXN0X2FkZF9oZWFkIC0gSW5pdGlhbGl6ZSBhIGtsaXN0X25vZGUgYW5kIGFkZCBpdCB0byBmcm9udC4KKyAqIEBuOiBub2RlIHdlJ3JlIGFkZGluZy4KKyAqIEBrOiBrbGlzdCBpdCdzIGdvaW5nIG9uLgorICovCit2b2lkIGtsaXN0X2FkZF9oZWFkKHN0cnVjdCBrbGlzdF9ub2RlICpuLCBzdHJ1Y3Qga2xpc3QgKmspCit7CisJa2xpc3Rfbm9kZV9pbml0KGssIG4pOworCWFkZF9oZWFkKGssIG4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfYWRkX2hlYWQpOworCisvKioKKyAqIGtsaXN0X2FkZF90YWlsIC0gSW5pdGlhbGl6ZSBhIGtsaXN0X25vZGUgYW5kIGFkZCBpdCB0byBiYWNrLgorICogQG46IG5vZGUgd2UncmUgYWRkaW5nLgorICogQGs6IGtsaXN0IGl0J3MgZ29pbmcgb24uCisgKi8KK3ZvaWQga2xpc3RfYWRkX3RhaWwoc3RydWN0IGtsaXN0X25vZGUgKm4sIHN0cnVjdCBrbGlzdCAqaykKK3sKKwlrbGlzdF9ub2RlX2luaXQoaywgbik7CisJYWRkX3RhaWwoaywgbik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9hZGRfdGFpbCk7CisKKy8qKgorICoga2xpc3RfYWRkX2JlaGluZCAtIEluaXQgYSBrbGlzdF9ub2RlIGFuZCBhZGQgaXQgYWZ0ZXIgYW4gZXhpc3Rpbmcgbm9kZQorICogQG46IG5vZGUgd2UncmUgYWRkaW5nLgorICogQHBvczogbm9kZSB0byBwdXQgQG4gYWZ0ZXIKKyAqLwordm9pZCBrbGlzdF9hZGRfYmVoaW5kKHN0cnVjdCBrbGlzdF9ub2RlICpuLCBzdHJ1Y3Qga2xpc3Rfbm9kZSAqcG9zKQoreworCXN0cnVjdCBrbGlzdCAqayA9IGtub2RlX2tsaXN0KHBvcyk7CisKKwlrbGlzdF9ub2RlX2luaXQoaywgbik7CisJc3Bpbl9sb2NrKCZrLT5rX2xvY2spOworCWxpc3RfYWRkKCZuLT5uX25vZGUsICZwb3MtPm5fbm9kZSk7CisJc3Bpbl91bmxvY2soJmstPmtfbG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9hZGRfYmVoaW5kKTsKKworLyoqCisgKiBrbGlzdF9hZGRfYmVmb3JlIC0gSW5pdCBhIGtsaXN0X25vZGUgYW5kIGFkZCBpdCBiZWZvcmUgYW4gZXhpc3Rpbmcgbm9kZQorICogQG46IG5vZGUgd2UncmUgYWRkaW5nLgorICogQHBvczogbm9kZSB0byBwdXQgQG4gYWZ0ZXIKKyAqLwordm9pZCBrbGlzdF9hZGRfYmVmb3JlKHN0cnVjdCBrbGlzdF9ub2RlICpuLCBzdHJ1Y3Qga2xpc3Rfbm9kZSAqcG9zKQoreworCXN0cnVjdCBrbGlzdCAqayA9IGtub2RlX2tsaXN0KHBvcyk7CisKKwlrbGlzdF9ub2RlX2luaXQoaywgbik7CisJc3Bpbl9sb2NrKCZrLT5rX2xvY2spOworCWxpc3RfYWRkX3RhaWwoJm4tPm5fbm9kZSwgJnBvcy0+bl9ub2RlKTsKKwlzcGluX3VubG9jaygmay0+a19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X2FkZF9iZWZvcmUpOworCitzdHJ1Y3Qga2xpc3Rfd2FpdGVyIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IGtsaXN0X25vZGUgKm5vZGU7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwcm9jZXNzOworCWludCB3b2tlbjsKK307CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa2xpc3RfcmVtb3ZlX2xvY2spOworc3RhdGljIExJU1RfSEVBRChrbGlzdF9yZW1vdmVfd2FpdGVycyk7CisKK3N0YXRpYyB2b2lkIGtsaXN0X3JlbGVhc2Uoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGtsaXN0X3dhaXRlciAqd2FpdGVyLCAqdG1wOworCXN0cnVjdCBrbGlzdF9ub2RlICpuID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBrbGlzdF9ub2RlLCBuX3JlZik7CisKKwlXQVJOX09OKCFrbm9kZV9kZWFkKG4pKTsKKwlsaXN0X2RlbCgmbi0+bl9ub2RlKTsKKwlzcGluX2xvY2soJmtsaXN0X3JlbW92ZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUod2FpdGVyLCB0bXAsICZrbGlzdF9yZW1vdmVfd2FpdGVycywgbGlzdCkgeworCQlpZiAod2FpdGVyLT5ub2RlICE9IG4pCisJCQljb250aW51ZTsKKworCQlsaXN0X2RlbCgmd2FpdGVyLT5saXN0KTsKKwkJd2FpdGVyLT53b2tlbiA9IDE7CisJCW1iKCk7CisJCXdha2VfdXBfcHJvY2Vzcyh3YWl0ZXItPnByb2Nlc3MpOworCX0KKwlzcGluX3VubG9jaygma2xpc3RfcmVtb3ZlX2xvY2spOworCWtub2RlX3NldF9rbGlzdChuLCBOVUxMKTsKK30KKworc3RhdGljIGludCBrbGlzdF9kZWNfYW5kX2RlbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlyZXR1cm4ga3JlZl9wdXQoJm4tPm5fcmVmLCBrbGlzdF9yZWxlYXNlKTsKK30KKworc3RhdGljIHZvaWQga2xpc3RfcHV0KHN0cnVjdCBrbGlzdF9ub2RlICpuLCBib29sIGtpbGwpCit7CisJc3RydWN0IGtsaXN0ICprID0ga25vZGVfa2xpc3Qobik7CisJdm9pZCAoKnB1dCkoc3RydWN0IGtsaXN0X25vZGUgKikgPSBrLT5wdXQ7CisKKwlzcGluX2xvY2soJmstPmtfbG9jayk7CisJaWYgKGtpbGwpCisJCWtub2RlX2tpbGwobik7CisJaWYgKCFrbGlzdF9kZWNfYW5kX2RlbChuKSkKKwkJcHV0ID0gTlVMTDsKKwlzcGluX3VubG9jaygmay0+a19sb2NrKTsKKwlpZiAocHV0KQorCQlwdXQobik7Cit9CisKKy8qKgorICoga2xpc3RfZGVsIC0gRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2Ygbm9kZSBhbmQgdHJ5IHRvIHJlbW92ZS4KKyAqIEBuOiBub2RlIHdlJ3JlIGRlbGV0aW5nLgorICovCit2b2lkIGtsaXN0X2RlbChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlrbGlzdF9wdXQobiwgdHJ1ZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9kZWwpOworCisvKioKKyAqIGtsaXN0X3JlbW92ZSAtIERlY3JlbWVudCB0aGUgcmVmY291bnQgb2Ygbm9kZSBhbmQgd2FpdCBmb3IgaXQgdG8gZ28gYXdheS4KKyAqIEBuOiBub2RlIHdlJ3JlIHJlbW92aW5nLgorICovCit2b2lkIGtsaXN0X3JlbW92ZShzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlzdHJ1Y3Qga2xpc3Rfd2FpdGVyIHdhaXRlcjsKKworCXdhaXRlci5ub2RlID0gbjsKKwl3YWl0ZXIucHJvY2VzcyA9IGN1cnJlbnQ7CisJd2FpdGVyLndva2VuID0gMDsKKwlzcGluX2xvY2soJmtsaXN0X3JlbW92ZV9sb2NrKTsKKwlsaXN0X2FkZCgmd2FpdGVyLmxpc3QsICZrbGlzdF9yZW1vdmVfd2FpdGVycyk7CisJc3Bpbl91bmxvY2soJmtsaXN0X3JlbW92ZV9sb2NrKTsKKworCWtsaXN0X2RlbChuKTsKKworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlpZiAod2FpdGVyLndva2VuKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X3JlbW92ZSk7CisKKy8qKgorICoga2xpc3Rfbm9kZV9hdHRhY2hlZCAtIFNheSB3aGV0aGVyIGEgbm9kZSBpcyBib3VuZCB0byBhIGxpc3Qgb3Igbm90LgorICogQG46IE5vZGUgdGhhdCB3ZSdyZSB0ZXN0aW5nLgorICovCitpbnQga2xpc3Rfbm9kZV9hdHRhY2hlZChzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlyZXR1cm4gKG4tPm5fa2xpc3QgIT0gTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9ub2RlX2F0dGFjaGVkKTsKKworLyoqCisgKiBrbGlzdF9pdGVyX2luaXRfbm9kZSAtIEluaXRpYWxpemUgYSBrbGlzdF9pdGVyIHN0cnVjdHVyZS4KKyAqIEBrOiBrbGlzdCB3ZSdyZSBpdGVyYXRpbmcuCisgKiBAaToga2xpc3RfaXRlciB3ZSdyZSBmaWxsaW5nLgorICogQG46IG5vZGUgdG8gc3RhcnQgd2l0aC4KKyAqCisgKiBTaW1pbGFyIHRvIGtsaXN0X2l0ZXJfaW5pdCgpLCBidXQgc3RhcnRzIHRoZSBhY3Rpb24gb2ZmIHdpdGggQG4sCisgKiBpbnN0ZWFkIG9mIHdpdGggdGhlIGxpc3QgaGVhZC4KKyAqLwordm9pZCBrbGlzdF9pdGVyX2luaXRfbm9kZShzdHJ1Y3Qga2xpc3QgKmssIHN0cnVjdCBrbGlzdF9pdGVyICppLAorCQkJICBzdHJ1Y3Qga2xpc3Rfbm9kZSAqbikKK3sKKwlpLT5pX2tsaXN0ID0gazsKKwlpLT5pX2N1ciA9IE5VTEw7CisJaWYgKG4gJiYga3JlZl9nZXRfdW5sZXNzX3plcm8oJm4tPm5fcmVmKSkKKwkJaS0+aV9jdXIgPSBuOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfaXRlcl9pbml0X25vZGUpOworCisvKioKKyAqIGtsaXN0X2l0ZXJfaW5pdCAtIEluaWl0YWxpemUgYSBrbGlzdF9pdGVyIHN0cnVjdHVyZS4KKyAqIEBrOiBrbGlzdCB3ZSdyZSBpdGVyYXRpbmcuCisgKiBAaToga2xpc3RfaXRlciBzdHJ1Y3R1cmUgd2UncmUgZmlsbGluZy4KKyAqCisgKiBTaW1pbGFyIHRvIGtsaXN0X2l0ZXJfaW5pdF9ub2RlKCksIGJ1dCBzdGFydCB3aXRoIHRoZSBsaXN0IGhlYWQuCisgKi8KK3ZvaWQga2xpc3RfaXRlcl9pbml0KHN0cnVjdCBrbGlzdCAqaywgc3RydWN0IGtsaXN0X2l0ZXIgKmkpCit7CisJa2xpc3RfaXRlcl9pbml0X25vZGUoaywgaSwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrbGlzdF9pdGVyX2luaXQpOworCisvKioKKyAqIGtsaXN0X2l0ZXJfZXhpdCAtIEZpbmlzaCBhIGxpc3QgaXRlcmF0aW9uLgorICogQGk6IEl0ZXJhdG9yIHN0cnVjdHVyZS4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aGVuIGRvbmUgaXRlcmF0aW5nIG92ZXIgbGlzdCwgYXMgaXQgZGVjcmVtZW50cyB0aGUKKyAqIHJlZmNvdW50IG9mIHRoZSBjdXJyZW50IG5vZGUuIE5lY2Vzc2FyeSBpbiBjYXNlIGl0ZXJhdGlvbiBleGl0ZWQgYmVmb3JlCisgKiB0aGUgZW5kIG9mIHRoZSBsaXN0IHdhcyByZWFjaGVkLCBhbmQgYWx3YXlzIGdvb2QgZm9ybS4KKyAqLwordm9pZCBrbGlzdF9pdGVyX2V4aXQoc3RydWN0IGtsaXN0X2l0ZXIgKmkpCit7CisJaWYgKGktPmlfY3VyKSB7CisJCWtsaXN0X3B1dChpLT5pX2N1ciwgZmFsc2UpOworCQlpLT5pX2N1ciA9IE5VTEw7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfaXRlcl9leGl0KTsKKworc3RhdGljIHN0cnVjdCBrbGlzdF9ub2RlICp0b19rbGlzdF9ub2RlKHN0cnVjdCBsaXN0X2hlYWQgKm4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihuLCBzdHJ1Y3Qga2xpc3Rfbm9kZSwgbl9ub2RlKTsKK30KKworLyoqCisgKiBrbGlzdF9wcmV2IC0gQW50ZSB1cCBwcmV2IG5vZGUgaW4gbGlzdC4KKyAqIEBpOiBJdGVyYXRvciBzdHJ1Y3R1cmUuCisgKgorICogRmlyc3QgZ3JhYiBsaXN0IGxvY2suIERlY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBwcmV2aW91cworICogbm9kZSwgaWYgdGhlcmUgd2FzIG9uZS4gR3JhYiB0aGUgcHJldiBub2RlLCBpbmNyZW1lbnQgaXRzIHJlZmVyZW5jZQorICogY291bnQsIGRyb3AgdGhlIGxvY2ssIGFuZCByZXR1cm4gdGhhdCBwcmV2IG5vZGUuCisgKi8KK3N0cnVjdCBrbGlzdF9ub2RlICprbGlzdF9wcmV2KHN0cnVjdCBrbGlzdF9pdGVyICppKQoreworCXZvaWQgKCpwdXQpKHN0cnVjdCBrbGlzdF9ub2RlICopID0gaS0+aV9rbGlzdC0+cHV0OworCXN0cnVjdCBrbGlzdF9ub2RlICpsYXN0ID0gaS0+aV9jdXI7CisJc3RydWN0IGtsaXN0X25vZGUgKnByZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpLT5pX2tsaXN0LT5rX2xvY2ssIGZsYWdzKTsKKworCWlmIChsYXN0KSB7CisJCXByZXYgPSB0b19rbGlzdF9ub2RlKGxhc3QtPm5fbm9kZS5wcmV2KTsKKwkJaWYgKCFrbGlzdF9kZWNfYW5kX2RlbChsYXN0KSkKKwkJCXB1dCA9IE5VTEw7CisJfSBlbHNlCisJCXByZXYgPSB0b19rbGlzdF9ub2RlKGktPmlfa2xpc3QtPmtfbGlzdC5wcmV2KTsKKworCWktPmlfY3VyID0gTlVMTDsKKwl3aGlsZSAocHJldiAhPSB0b19rbGlzdF9ub2RlKCZpLT5pX2tsaXN0LT5rX2xpc3QpKSB7CisJCWlmIChsaWtlbHkoIWtub2RlX2RlYWQocHJldikpKSB7CisJCQlrcmVmX2dldCgmcHJldi0+bl9yZWYpOworCQkJaS0+aV9jdXIgPSBwcmV2OworCQkJYnJlYWs7CisJCX0KKwkJcHJldiA9IHRvX2tsaXN0X25vZGUocHJldi0+bl9ub2RlLnByZXYpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmktPmlfa2xpc3QtPmtfbG9jaywgZmxhZ3MpOworCisJaWYgKHB1dCAmJiBsYXN0KQorCQlwdXQobGFzdCk7CisJcmV0dXJuIGktPmlfY3VyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa2xpc3RfcHJldik7CisKKy8qKgorICoga2xpc3RfbmV4dCAtIEFudGUgdXAgbmV4dCBub2RlIGluIGxpc3QuCisgKiBAaTogSXRlcmF0b3Igc3RydWN0dXJlLgorICoKKyAqIEZpcnN0IGdyYWIgbGlzdCBsb2NrLiBEZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgcHJldmlvdXMKKyAqIG5vZGUsIGlmIHRoZXJlIHdhcyBvbmUuIEdyYWIgdGhlIG5leHQgbm9kZSwgaW5jcmVtZW50IGl0cyByZWZlcmVuY2UKKyAqIGNvdW50LCBkcm9wIHRoZSBsb2NrLCBhbmQgcmV0dXJuIHRoYXQgbmV4dCBub2RlLgorICovCitzdHJ1Y3Qga2xpc3Rfbm9kZSAqa2xpc3RfbmV4dChzdHJ1Y3Qga2xpc3RfaXRlciAqaSkKK3sKKwl2b2lkICgqcHV0KShzdHJ1Y3Qga2xpc3Rfbm9kZSAqKSA9IGktPmlfa2xpc3QtPnB1dDsKKwlzdHJ1Y3Qga2xpc3Rfbm9kZSAqbGFzdCA9IGktPmlfY3VyOworCXN0cnVjdCBrbGlzdF9ub2RlICpuZXh0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaS0+aV9rbGlzdC0+a19sb2NrLCBmbGFncyk7CisKKwlpZiAobGFzdCkgeworCQluZXh0ID0gdG9fa2xpc3Rfbm9kZShsYXN0LT5uX25vZGUubmV4dCk7CisJCWlmICgha2xpc3RfZGVjX2FuZF9kZWwobGFzdCkpCisJCQlwdXQgPSBOVUxMOworCX0gZWxzZQorCQluZXh0ID0gdG9fa2xpc3Rfbm9kZShpLT5pX2tsaXN0LT5rX2xpc3QubmV4dCk7CisKKwlpLT5pX2N1ciA9IE5VTEw7CisJd2hpbGUgKG5leHQgIT0gdG9fa2xpc3Rfbm9kZSgmaS0+aV9rbGlzdC0+a19saXN0KSkgeworCQlpZiAobGlrZWx5KCFrbm9kZV9kZWFkKG5leHQpKSkgeworCQkJa3JlZl9nZXQoJm5leHQtPm5fcmVmKTsKKwkJCWktPmlfY3VyID0gbmV4dDsKKwkJCWJyZWFrOworCQl9CisJCW5leHQgPSB0b19rbGlzdF9ub2RlKG5leHQtPm5fbm9kZS5uZXh0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpLT5pX2tsaXN0LT5rX2xvY2ssIGZsYWdzKTsKKworCWlmIChwdXQgJiYgbGFzdCkKKwkJcHV0KGxhc3QpOworCXJldHVybiBpLT5pX2N1cjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGtsaXN0X25leHQpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIva29iamVjdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIva29iamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmIwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9rb2JqZWN0LmMKQEAgLTAsMCArMSwxMDc0IEBACisvKgorICoga29iamVjdC5jIC0gbGlicmFyeSByb3V0aW5lcyBmb3IgaGFuZGxpbmcgZ2VuZXJpYyBrZXJuZWwgb2JqZWN0cworICoKKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzIFBhdHJpY2sgTW9jaGVsIDxtb2NoZWxAb3NkbC5vcmc+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNyBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgTm92ZWxsIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgorICoKKyAqCisgKiBQbGVhc2Ugc2VlIHRoZSBmaWxlIERvY3VtZW50YXRpb24va29iamVjdC50eHQgZm9yIGNyaXRpY2FsIGluZm9ybWF0aW9uCisgKiBhYm91dCB1c2luZyB0aGUga29iamVjdCBpbnRlcmZhY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorCisvKioKKyAqIGtvYmplY3RfbmFtZXNwYWNlIC0gcmV0dXJuIEBrb2JqJ3MgbmFtZXNwYWNlIHRhZworICogQGtvYmo6IGtvYmplY3QgaW4gcXVlc3Rpb24KKyAqCisgKiBSZXR1cm5zIG5hbWVzcGFjZSB0YWcgb2YgQGtvYmogaWYgaXRzIHBhcmVudCBoYXMgbmFtZXNwYWNlIG9wcyBlbmFibGVkCisgKiBhbmQgdGh1cyBAa29iaiBzaG91bGQgaGF2ZSBhIG5hbWVzcGFjZSB0YWcgYXNzb2NpYXRlZCB3aXRoIGl0LiAgUmV0dXJucworICogJU5VTEwgb3RoZXJ3aXNlLgorICovCitjb25zdCB2b2lkICprb2JqZWN0X25hbWVzcGFjZShzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwljb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKm5zX29wcyA9IGtvYmpfbnNfb3BzKGtvYmopOworCisJaWYgKCFuc19vcHMgfHwgbnNfb3BzLT50eXBlID09IEtPQkpfTlNfVFlQRV9OT05FKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBrb2JqLT5rdHlwZS0+bmFtZXNwYWNlKGtvYmopOworfQorCisvKgorICogcG9wdWxhdGVfZGlyIC0gcG9wdWxhdGUgZGlyZWN0b3J5IHdpdGggYXR0cmlidXRlcy4KKyAqIEBrb2JqOiBvYmplY3Qgd2UncmUgd29ya2luZyBvbi4KKyAqCisgKiBNb3N0IHN1YnN5c3RlbXMgaGF2ZSBhIHNldCBvZiBkZWZhdWx0IGF0dHJpYnV0ZXMgdGhhdCBhcmUgYXNzb2NpYXRlZAorICogd2l0aCBhbiBvYmplY3QgdGhhdCByZWdpc3RlcnMgd2l0aCB0aGVtLiAgVGhpcyBpcyBhIGhlbHBlciBjYWxsZWQgZHVyaW5nCisgKiBvYmplY3QgcmVnaXN0cmF0aW9uIHRoYXQgbG9vcHMgdGhyb3VnaCB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIG9mIHRoZQorICogc3Vic3lzdGVtIGFuZCBjcmVhdGVzIGF0dHJpYnV0ZXMgZmlsZXMgZm9yIHRoZW0gaW4gc3lzZnMuCisgKi8KK3N0YXRpYyBpbnQgcG9wdWxhdGVfZGlyKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBrb2JqX3R5cGUgKnQgPSBnZXRfa3R5cGUoa29iaik7CisJc3RydWN0IGF0dHJpYnV0ZSAqYXR0cjsKKwlpbnQgZXJyb3IgPSAwOworCWludCBpOworCisJaWYgKHQgJiYgdC0+ZGVmYXVsdF9hdHRycykgeworCQlmb3IgKGkgPSAwOyAoYXR0ciA9IHQtPmRlZmF1bHRfYXR0cnNbaV0pICE9IE5VTEw7IGkrKykgeworCQkJZXJyb3IgPSBzeXNmc19jcmVhdGVfZmlsZShrb2JqLCBhdHRyKTsKKwkJCWlmIChlcnJvcikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2RpcihzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwljb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKm9wczsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IHN5c2ZzX2NyZWF0ZV9kaXJfbnMoa29iaiwga29iamVjdF9uYW1lc3BhY2Uoa29iaikpOworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCisJZXJyb3IgPSBwb3B1bGF0ZV9kaXIoa29iaik7CisJaWYgKGVycm9yKSB7CisJCXN5c2ZzX3JlbW92ZV9kaXIoa29iaik7CisJCXJldHVybiBlcnJvcjsKKwl9CisKKwkvKgorCSAqIEBrb2JqLT5zZCBtYXkgYmUgZGVsZXRlZCBieSBhbiBhbmNlc3RvciBnb2luZyBhd2F5LiAgSG9sZCBhbgorCSAqIGV4dHJhIHJlZmVyZW5jZSBzbyB0aGF0IGl0IHN0YXlzIHVudGlsIEBrb2JqIGlzIGdvbmUuCisJICovCisJc3lzZnNfZ2V0KGtvYmotPnNkKTsKKworCS8qCisJICogSWYgQGtvYmogaGFzIG5zX29wcywgaXRzIGNoaWxkcmVuIG5lZWQgdG8gYmUgZmlsdGVyZWQgYmFzZWQgb24KKwkgKiB0aGVpciBuYW1lc3BhY2UgdGFncy4gIEVuYWJsZSBuYW1lc3BhY2Ugc3VwcG9ydCBvbiBAa29iai0+c2QuCisJICovCisJb3BzID0ga29ial9jaGlsZF9uc19vcHMoa29iaik7CisJaWYgKG9wcykgeworCQlCVUdfT04ob3BzLT50eXBlIDw9IEtPQkpfTlNfVFlQRV9OT05FKTsKKwkJQlVHX09OKG9wcy0+dHlwZSA+PSBLT0JKX05TX1RZUEVTKTsKKwkJQlVHX09OKCFrb2JqX25zX3R5cGVfcmVnaXN0ZXJlZChvcHMtPnR5cGUpKTsKKworCQlzeXNmc19lbmFibGVfbnMoa29iai0+c2QpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9rb2JqX3BhdGhfbGVuZ3RoKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWludCBsZW5ndGggPSAxOworCXN0cnVjdCBrb2JqZWN0ICpwYXJlbnQgPSBrb2JqOworCisJLyogd2FsayB1cCB0aGUgYW5jZXN0b3JzIHVudGlsIHdlIGhpdCB0aGUgb25lIHBvaW50aW5nIHRvIHRoZQorCSAqIHJvb3QuCisJICogQWRkIDEgdG8gc3RybGVuIGZvciBsZWFkaW5nICcvJyBvZiBlYWNoIGxldmVsLgorCSAqLworCWRvIHsKKwkJaWYgKGtvYmplY3RfbmFtZShwYXJlbnQpID09IE5VTEwpCisJCQlyZXR1cm4gMDsKKwkJbGVuZ3RoICs9IHN0cmxlbihrb2JqZWN0X25hbWUocGFyZW50KSkgKyAxOworCQlwYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwl9IHdoaWxlIChwYXJlbnQpOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfa29ial9wYXRoKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBjaGFyICpwYXRoLCBpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBrb2JqZWN0ICpwYXJlbnQ7CisKKwktLWxlbmd0aDsKKwlmb3IgKHBhcmVudCA9IGtvYmo7IHBhcmVudDsgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQpIHsKKwkJaW50IGN1ciA9IHN0cmxlbihrb2JqZWN0X25hbWUocGFyZW50KSk7CisJCS8qIGJhY2sgdXAgZW5vdWdoIHRvIHByaW50IHRoaXMgbmFtZSB3aXRoICcvJyAqLworCQlsZW5ndGggLT0gY3VyOworCQltZW1jcHkocGF0aCArIGxlbmd0aCwga29iamVjdF9uYW1lKHBhcmVudCksIGN1cik7CisJCSoocGF0aCArIC0tbGVuZ3RoKSA9ICcvJzsKKwl9CisKKwlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiAlczogcGF0aCA9ICclcydcbiIsIGtvYmplY3RfbmFtZShrb2JqKSwKKwkJIGtvYmosIF9fZnVuY19fLCBwYXRoKTsKK30KKworLyoqCisgKiBrb2JqZWN0X2dldF9wYXRoIC0gZ2VuZXJhdGUgYW5kIHJldHVybiB0aGUgcGF0aCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBrb2JqIGFuZCBrc2V0IHBhaXIuCisgKgorICogQGtvYmo6CWtvYmplY3QgaW4gcXVlc3Rpb24sIHdpdGggd2hpY2ggdG8gYnVpbGQgdGhlIHBhdGgKKyAqIEBnZnBfbWFzazoJdGhlIGFsbG9jYXRpb24gdHlwZSB1c2VkIHRvIGFsbG9jYXRlIHRoZSBwYXRoCisgKgorICogVGhlIHJlc3VsdCBtdXN0IGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIgd2l0aCBrZnJlZSgpLgorICovCitjaGFyICprb2JqZWN0X2dldF9wYXRoKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBnZnBfdCBnZnBfbWFzaykKK3sKKwljaGFyICpwYXRoOworCWludCBsZW47CisKKwlsZW4gPSBnZXRfa29ial9wYXRoX2xlbmd0aChrb2JqKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCXBhdGggPSBremFsbG9jKGxlbiwgZ2ZwX21hc2spOworCWlmICghcGF0aCkKKwkJcmV0dXJuIE5VTEw7CisJZmlsbF9rb2JqX3BhdGgoa29iaiwgcGF0aCwgbGVuKTsKKworCXJldHVybiBwYXRoOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa29iamVjdF9nZXRfcGF0aCk7CisKKy8qIGFkZCB0aGUga29iamVjdCB0byBpdHMga3NldCdzIGxpc3QgKi8KK3N0YXRpYyB2b2lkIGtvYmpfa3NldF9qb2luKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmICgha29iai0+a3NldCkKKwkJcmV0dXJuOworCisJa3NldF9nZXQoa29iai0+a3NldCk7CisJc3Bpbl9sb2NrKCZrb2JqLT5rc2V0LT5saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJmtvYmotPmVudHJ5LCAma29iai0+a3NldC0+bGlzdCk7CisJc3Bpbl91bmxvY2soJmtvYmotPmtzZXQtPmxpc3RfbG9jayk7Cit9CisKKy8qIHJlbW92ZSB0aGUga29iamVjdCBmcm9tIGl0cyBrc2V0J3MgbGlzdCAqLworc3RhdGljIHZvaWQga29ial9rc2V0X2xlYXZlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmICgha29iai0+a3NldCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZrb2JqLT5rc2V0LT5saXN0X2xvY2spOworCWxpc3RfZGVsX2luaXQoJmtvYmotPmVudHJ5KTsKKwlzcGluX3VubG9jaygma29iai0+a3NldC0+bGlzdF9sb2NrKTsKKwlrc2V0X3B1dChrb2JqLT5rc2V0KTsKK30KKworc3RhdGljIHZvaWQga29iamVjdF9pbml0X2ludGVybmFsKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmICgha29iaikKKwkJcmV0dXJuOworCWtyZWZfaW5pdCgma29iai0+a3JlZik7CisJSU5JVF9MSVNUX0hFQUQoJmtvYmotPmVudHJ5KTsKKwlrb2JqLT5zdGF0ZV9pbl9zeXNmcyA9IDA7CisJa29iai0+c3RhdGVfYWRkX3VldmVudF9zZW50ID0gMDsKKwlrb2JqLT5zdGF0ZV9yZW1vdmVfdWV2ZW50X3NlbnQgPSAwOworCWtvYmotPnN0YXRlX2luaXRpYWxpemVkID0gMTsKK30KKworCitzdGF0aWMgaW50IGtvYmplY3RfYWRkX2ludGVybmFsKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWludCBlcnJvciA9IDA7CisJc3RydWN0IGtvYmplY3QgKnBhcmVudDsKKworCWlmICgha29iaikKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwlpZiAoIWtvYmotPm5hbWUgfHwgIWtvYmotPm5hbWVbMF0pIHsKKwkJV0FSTigxLCAia29iamVjdDogKCVwKTogYXR0ZW1wdGVkIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCBlbXB0eSAiCisJCQkgIm5hbWUhXG4iLCBrb2JqKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGFyZW50ID0ga29iamVjdF9nZXQoa29iai0+cGFyZW50KTsKKworCS8qIGpvaW4ga3NldCBpZiBzZXQsIHVzZSBpdCBhcyBwYXJlbnQgaWYgd2UgZG8gbm90IGFscmVhZHkgaGF2ZSBvbmUgKi8KKwlpZiAoa29iai0+a3NldCkgeworCQlpZiAoIXBhcmVudCkKKwkJCXBhcmVudCA9IGtvYmplY3RfZ2V0KCZrb2JqLT5rc2V0LT5rb2JqKTsKKwkJa29ial9rc2V0X2pvaW4oa29iaik7CisJCWtvYmotPnBhcmVudCA9IHBhcmVudDsKKwl9CisKKwlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiAlczogcGFyZW50OiAnJXMnLCBzZXQ6ICclcydcbiIsCisJCSBrb2JqZWN0X25hbWUoa29iaiksIGtvYmosIF9fZnVuY19fLAorCQkgcGFyZW50ID8ga29iamVjdF9uYW1lKHBhcmVudCkgOiAiPE5VTEw+IiwKKwkJIGtvYmotPmtzZXQgPyBrb2JqZWN0X25hbWUoJmtvYmotPmtzZXQtPmtvYmopIDogIjxOVUxMPiIpOworCisJZXJyb3IgPSBjcmVhdGVfZGlyKGtvYmopOworCWlmIChlcnJvcikgeworCQlrb2JqX2tzZXRfbGVhdmUoa29iaik7CisJCWtvYmplY3RfcHV0KHBhcmVudCk7CisJCWtvYmotPnBhcmVudCA9IE5VTEw7CisKKwkJLyogYmUgbm9pc3kgb24gZXJyb3IgaXNzdWVzICovCisJCWlmIChlcnJvciA9PSAtRUVYSVNUKQorCQkJcHJfZXJyKCIlcyBmYWlsZWQgZm9yICVzIHdpdGggLUVFWElTVCwgZG9uJ3QgdHJ5IHRvIHJlZ2lzdGVyIHRoaW5ncyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LlxuIiwKKwkJCSAgICAgICBfX2Z1bmNfXywga29iamVjdF9uYW1lKGtvYmopKTsKKwkJZWxzZQorCQkJcHJfZXJyKCIlcyBmYWlsZWQgZm9yICVzIChlcnJvcjogJWQgcGFyZW50OiAlcylcbiIsCisJCQkgICAgICAgX19mdW5jX18sIGtvYmplY3RfbmFtZShrb2JqKSwgZXJyb3IsCisJCQkgICAgICAgcGFyZW50ID8ga29iamVjdF9uYW1lKHBhcmVudCkgOiAiJ25vbmUnIik7CisJfSBlbHNlCisJCWtvYmotPnN0YXRlX2luX3N5c2ZzID0gMTsKKworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBrb2JqZWN0X3NldF9uYW1lX3ZhcmdzIC0gU2V0IHRoZSBuYW1lIG9mIGFuIGtvYmplY3QKKyAqIEBrb2JqOiBzdHJ1Y3Qga29iamVjdCB0byBzZXQgdGhlIG5hbWUgb2YKKyAqIEBmbXQ6IGZvcm1hdCBzdHJpbmcgdXNlZCB0byBidWlsZCB0aGUgbmFtZQorICogQHZhcmdzOiB2YXJncyB0byBmb3JtYXQgdGhlIHN0cmluZy4KKyAqLworaW50IGtvYmplY3Rfc2V0X25hbWVfdmFyZ3Moc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKmZtdCwKKwkJCQkgIHZhX2xpc3QgdmFyZ3MpCit7CisJY29uc3QgY2hhciAqczsKKworCWlmIChrb2JqLT5uYW1lICYmICFmbXQpCisJCXJldHVybiAwOworCisJcyA9IGt2YXNwcmludGZfY29uc3QoR0ZQX0tFUk5FTCwgZm10LCB2YXJncyk7CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogZXd3dy4uLiBzb21lIG9mIHRoZXNlIGJ1Z2dlcnMgaGF2ZSAnLycgaW4gdGhlIG5hbWUgLi4uIElmCisJICogdGhhdCdzIHRoZSBjYXNlLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIGFjdHVhbAorCSAqIGFsbG9jYXRlZCBjb3B5IHRvIG1vZGlmeSwgc2luY2Uga3Zhc3ByaW50Zl9jb25zdCBtYXkgaGF2ZQorCSAqIHJldHVybmVkIHNvbWV0aGluZyBmcm9tIC5yb2RhdGEuCisJICovCisJaWYgKHN0cmNocihzLCAnLycpKSB7CisJCWNoYXIgKnQ7CisKKwkJdCA9IGtzdHJkdXAocywgR0ZQX0tFUk5FTCk7CisJCWtmcmVlX2NvbnN0KHMpOworCQlpZiAoIXQpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJc3RycmVwbGFjZSh0LCAnLycsICchJyk7CisJCXMgPSB0OworCX0KKwlrZnJlZV9jb25zdChrb2JqLT5uYW1lKTsKKwlrb2JqLT5uYW1lID0gczsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGtvYmplY3Rfc2V0X25hbWUgLSBTZXQgdGhlIG5hbWUgb2YgYSBrb2JqZWN0CisgKiBAa29iajogc3RydWN0IGtvYmplY3QgdG8gc2V0IHRoZSBuYW1lIG9mCisgKiBAZm10OiBmb3JtYXQgc3RyaW5nIHVzZWQgdG8gYnVpbGQgdGhlIG5hbWUKKyAqCisgKiBUaGlzIHNldHMgdGhlIG5hbWUgb2YgdGhlIGtvYmplY3QuICBJZiB5b3UgaGF2ZSBhbHJlYWR5IGFkZGVkIHRoZQorICoga29iamVjdCB0byB0aGUgc3lzdGVtLCB5b3UgbXVzdCBjYWxsIGtvYmplY3RfcmVuYW1lKCkgaW4gb3JkZXIgdG8KKyAqIGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUga29iamVjdC4KKyAqLworaW50IGtvYmplY3Rfc2V0X25hbWUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgdmFyZ3M7CisJaW50IHJldHZhbDsKKworCXZhX3N0YXJ0KHZhcmdzLCBmbXQpOworCXJldHZhbCA9IGtvYmplY3Rfc2V0X25hbWVfdmFyZ3Moa29iaiwgZm10LCB2YXJncyk7CisJdmFfZW5kKHZhcmdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGtvYmplY3Rfc2V0X25hbWUpOworCisvKioKKyAqIGtvYmplY3RfaW5pdCAtIGluaXRpYWxpemUgYSBrb2JqZWN0IHN0cnVjdHVyZQorICogQGtvYmo6IHBvaW50ZXIgdG8gdGhlIGtvYmplY3QgdG8gaW5pdGlhbGl6ZQorICogQGt0eXBlOiBwb2ludGVyIHRvIHRoZSBrdHlwZSBmb3IgdGhpcyBrb2JqZWN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9wZXJseSBpbml0aWFsaXplIGEga29iamVjdCBzdWNoIHRoYXQgaXQgY2FuIHRoZW4KKyAqIGJlIHBhc3NlZCB0byB0aGUga29iamVjdF9hZGQoKSBjYWxsLgorICoKKyAqIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUga29iamVjdCBNVVNUIGJlIGNsZWFuZWQgdXAgYnkgYSBjYWxsCisgKiB0byBrb2JqZWN0X3B1dCgpLCBub3QgYnkgYSBjYWxsIHRvIGtmcmVlIGRpcmVjdGx5IHRvIGVuc3VyZSB0aGF0IGFsbCBvZgorICogdGhlIG1lbW9yeSBpcyBjbGVhbmVkIHVwIHByb3Blcmx5LgorICovCit2b2lkIGtvYmplY3RfaW5pdChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfdHlwZSAqa3R5cGUpCit7CisJY2hhciAqZXJyX3N0cjsKKworCWlmICgha29iaikgeworCQllcnJfc3RyID0gImludmFsaWQga29iamVjdCBwb2ludGVyISI7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmICgha3R5cGUpIHsKKwkJZXJyX3N0ciA9ICJtdXN0IGhhdmUgYSBrdHlwZSB0byBiZSBpbml0aWFsaXplZCBwcm9wZXJseSFcbiI7CisJCWdvdG8gZXJyb3I7CisJfQorCWlmIChrb2JqLT5zdGF0ZV9pbml0aWFsaXplZCkgeworCQkvKiBkbyBub3QgZXJyb3Igb3V0IGFzIHNvbWV0aW1lcyB3ZSBjYW4gcmVjb3ZlciAqLworCQlwcmludGsoS0VSTl9FUlIgImtvYmplY3QgKCVwKTogdHJpZWQgdG8gaW5pdCBhbiBpbml0aWFsaXplZCAiCisJCSAgICAgICAib2JqZWN0LCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nLlxuIiwga29iaik7CisJCWR1bXBfc3RhY2soKTsKKwl9CisKKwlrb2JqZWN0X2luaXRfaW50ZXJuYWwoa29iaik7CisJa29iai0+a3R5cGUgPSBrdHlwZTsKKwlyZXR1cm47CisKK2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAia29iamVjdCAoJXApOiAlc1xuIiwga29iaiwgZXJyX3N0cik7CisJZHVtcF9zdGFjaygpOworfQorRVhQT1JUX1NZTUJPTChrb2JqZWN0X2luaXQpOworCitzdGF0aWMgX19wcmludGYoMywgMCkgaW50IGtvYmplY3RfYWRkX3Zhcmcoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJCSAgIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsCisJCQkJCSAgIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YXJncykKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0ga29iamVjdF9zZXRfbmFtZV92YXJncyhrb2JqLCBmbXQsIHZhcmdzKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0VSUiAia29iamVjdDogY2FuIG5vdCBzZXQgbmFtZSBwcm9wZXJseSFcbiIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKwlrb2JqLT5wYXJlbnQgPSBwYXJlbnQ7CisJcmV0dXJuIGtvYmplY3RfYWRkX2ludGVybmFsKGtvYmopOworfQorCisvKioKKyAqIGtvYmplY3RfYWRkIC0gdGhlIG1haW4ga29iamVjdCBhZGQgZnVuY3Rpb24KKyAqIEBrb2JqOiB0aGUga29iamVjdCB0byBhZGQKKyAqIEBwYXJlbnQ6IHBvaW50ZXIgdG8gdGhlIHBhcmVudCBvZiB0aGUga29iamVjdC4KKyAqIEBmbXQ6IGZvcm1hdCB0byBuYW1lIHRoZSBrb2JqZWN0IHdpdGguCisgKgorICogVGhlIGtvYmplY3QgbmFtZSBpcyBzZXQgYW5kIGFkZGVkIHRvIHRoZSBrb2JqZWN0IGhpZXJhcmNoeSBpbiB0aGlzCisgKiBmdW5jdGlvbi4KKyAqCisgKiBJZiBAcGFyZW50IGlzIHNldCwgdGhlbiB0aGUgcGFyZW50IG9mIHRoZSBAa29iaiB3aWxsIGJlIHNldCB0byBpdC4KKyAqIElmIEBwYXJlbnQgaXMgTlVMTCwgdGhlbiB0aGUgcGFyZW50IG9mIHRoZSBAa29iaiB3aWxsIGJlIHNldCB0byB0aGUKKyAqIGtvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBrc2V0IGFzc2lnbmVkIHRvIHRoaXMga29iamVjdC4gIElmIG5vIGtzZXQKKyAqIGlzIGFzc2lnbmVkIHRvIHRoZSBrb2JqZWN0LCB0aGVuIHRoZSBrb2JqZWN0IHdpbGwgYmUgbG9jYXRlZCBpbiB0aGUKKyAqIHJvb3Qgb2YgdGhlIHN5c2ZzIHRyZWUuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yLCBrb2JqZWN0X3B1dCgpIG11c3QgYmUgY2FsbGVkIHRvCisgKiBwcm9wZXJseSBjbGVhbiB1cCB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgb2JqZWN0LgorICogVW5kZXIgbm8gaW5zdGFuY2Ugc2hvdWxkIHRoZSBrb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24KKyAqIGJlIGRpcmVjdGx5IGZyZWVkIHdpdGggYSBjYWxsIHRvIGtmcmVlKCksIHRoYXQgY2FuIGxlYWsgbWVtb3J5LgorICoKKyAqIE5vdGUsIG5vICJhZGQiIHVldmVudCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGlzIGNhbGwsIHRoZSBjYWxsZXIgc2hvdWxkIHNldAorICogdXAgYWxsIG9mIHRoZSBuZWNlc3Nhcnkgc3lzZnMgZmlsZXMgZm9yIHRoZSBvYmplY3QgYW5kIHRoZW4gY2FsbAorICoga29iamVjdF91ZXZlbnQoKSB3aXRoIHRoZSBVRVZFTlRfQUREIHBhcmFtZXRlciB0byBlbnN1cmUgdGhhdAorICogdXNlcnNwYWNlIGlzIHByb3Blcmx5IG5vdGlmaWVkIG9mIHRoaXMga29iamVjdCdzIGNyZWF0aW9uLgorICovCitpbnQga29iamVjdF9hZGQoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQsCisJCWNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgcmV0dmFsOworCisJaWYgKCFrb2JqKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgha29iai0+c3RhdGVfaW5pdGlhbGl6ZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJrb2JqZWN0ICclcycgKCVwKTogdHJpZWQgdG8gYWRkIGFuICIKKwkJICAgICAgICJ1bmluaXRpYWxpemVkIG9iamVjdCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZy5cbiIsCisJCSAgICAgICBrb2JqZWN0X25hbWUoa29iaiksIGtvYmopOworCQlkdW1wX3N0YWNrKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXJldHZhbCA9IGtvYmplY3RfYWRkX3Zhcmcoa29iaiwgcGFyZW50LCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXJldHVybiByZXR2YWw7Cit9CitFWFBPUlRfU1lNQk9MKGtvYmplY3RfYWRkKTsKKworLyoqCisgKiBrb2JqZWN0X2luaXRfYW5kX2FkZCAtIGluaXRpYWxpemUgYSBrb2JqZWN0IHN0cnVjdHVyZSBhbmQgYWRkIGl0IHRvIHRoZSBrb2JqZWN0IGhpZXJhcmNoeQorICogQGtvYmo6IHBvaW50ZXIgdG8gdGhlIGtvYmplY3QgdG8gaW5pdGlhbGl6ZQorICogQGt0eXBlOiBwb2ludGVyIHRvIHRoZSBrdHlwZSBmb3IgdGhpcyBrb2JqZWN0LgorICogQHBhcmVudDogcG9pbnRlciB0byB0aGUgcGFyZW50IG9mIHRoaXMga29iamVjdC4KKyAqIEBmbXQ6IHRoZSBuYW1lIG9mIHRoZSBrb2JqZWN0LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY29tYmluZXMgdGhlIGNhbGwgdG8ga29iamVjdF9pbml0KCkgYW5kCisgKiBrb2JqZWN0X2FkZCgpLiAgVGhlIHNhbWUgdHlwZSBvZiBlcnJvciBoYW5kbGluZyBhZnRlciBhIGNhbGwgdG8KKyAqIGtvYmplY3RfYWRkKCkgYW5kIGtvYmplY3QgbGlmZXRpbWUgcnVsZXMgYXJlIHRoZSBzYW1lIGhlcmUuCisgKi8KK2ludCBrb2JqZWN0X2luaXRfYW5kX2FkZChzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGtvYmpfdHlwZSAqa3R5cGUsCisJCQkgc3RydWN0IGtvYmplY3QgKnBhcmVudCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCByZXR2YWw7CisKKwlrb2JqZWN0X2luaXQoa29iaiwga3R5cGUpOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlyZXR2YWwgPSBrb2JqZWN0X2FkZF92YXJnKGtvYmosIHBhcmVudCwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa29iamVjdF9pbml0X2FuZF9hZGQpOworCisvKioKKyAqIGtvYmplY3RfcmVuYW1lIC0gY2hhbmdlIHRoZSBuYW1lIG9mIGFuIG9iamVjdAorICogQGtvYmo6IG9iamVjdCBpbiBxdWVzdGlvbi4KKyAqIEBuZXdfbmFtZTogb2JqZWN0J3MgbmV3IG5hbWUKKyAqCisgKiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byBwcm92aWRlIG11dHVhbAorICogZXhjbHVzaW9uIGJldHdlZW4gdHdvIGRpZmZlcmVudCBjYWxscyBvZiBrb2JqZWN0X3JlbmFtZQorICogb24gdGhlIHNhbWUga29iamVjdCBhbmQgdG8gZW5zdXJlIHRoYXQgbmV3X25hbWUgaXMgdmFsaWQgYW5kCisgKiB3b24ndCBjb25mbGljdCB3aXRoIG90aGVyIGtvYmplY3RzLgorICovCitpbnQga29iamVjdF9yZW5hbWUoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKm5ld19uYW1lKQoreworCWludCBlcnJvciA9IDA7CisJY29uc3QgY2hhciAqZGV2cGF0aCA9IE5VTEw7CisJY29uc3QgY2hhciAqZHVwX25hbWUgPSBOVUxMLCAqbmFtZTsKKwljaGFyICpkZXZwYXRoX3N0cmluZyA9IE5VTEw7CisJY2hhciAqZW52cFsyXTsKKworCWtvYmogPSBrb2JqZWN0X2dldChrb2JqKTsKKwlpZiAoIWtvYmopCisJCXJldHVybiAtRUlOVkFMOworCWlmICgha29iai0+cGFyZW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKGtvYmosIEdGUF9LRVJORUwpOworCWlmICghZGV2cGF0aCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlkZXZwYXRoX3N0cmluZyA9IGttYWxsb2Moc3RybGVuKGRldnBhdGgpICsgMTUsIEdGUF9LRVJORUwpOworCWlmICghZGV2cGF0aF9zdHJpbmcpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJc3ByaW50ZihkZXZwYXRoX3N0cmluZywgIkRFVlBBVEhfT0xEPSVzIiwgZGV2cGF0aCk7CisJZW52cFswXSA9IGRldnBhdGhfc3RyaW5nOworCWVudnBbMV0gPSBOVUxMOworCisJbmFtZSA9IGR1cF9uYW1lID0ga3N0cmR1cF9jb25zdChuZXdfbmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyb3IgPSBzeXNmc19yZW5hbWVfZGlyX25zKGtvYmosIG5ld19uYW1lLCBrb2JqZWN0X25hbWVzcGFjZShrb2JqKSk7CisJaWYgKGVycm9yKQorCQlnb3RvIG91dDsKKworCS8qIEluc3RhbGwgdGhlIG5ldyBrb2JqZWN0IG5hbWUgKi8KKwlkdXBfbmFtZSA9IGtvYmotPm5hbWU7CisJa29iai0+bmFtZSA9IG5hbWU7CisKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIG1vc3RseS9vbmx5IHVzZWQgZm9yIG5ldHdvcmsgaW50ZXJmYWNlLgorCSAqIFNvbWUgaG90cGx1ZyBwYWNrYWdlIHRyYWNrIGludGVyZmFjZXMgYnkgdGhlaXIgbmFtZSBhbmQKKwkgKiB0aGVyZWZvcmUgd2FudCB0byBrbm93IHdoZW4gdGhlIG5hbWUgaXMgY2hhbmdlZCBieSB0aGUgdXNlci4gKi8KKwlrb2JqZWN0X3VldmVudF9lbnYoa29iaiwgS09CSl9NT1ZFLCBlbnZwKTsKKworb3V0OgorCWtmcmVlX2NvbnN0KGR1cF9uYW1lKTsKKwlrZnJlZShkZXZwYXRoX3N0cmluZyk7CisJa2ZyZWUoZGV2cGF0aCk7CisJa29iamVjdF9wdXQoa29iaik7CisKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrb2JqZWN0X3JlbmFtZSk7CisKKy8qKgorICoga29iamVjdF9tb3ZlIC0gbW92ZSBvYmplY3QgdG8gYW5vdGhlciBwYXJlbnQKKyAqIEBrb2JqOiBvYmplY3QgaW4gcXVlc3Rpb24uCisgKiBAbmV3X3BhcmVudDogb2JqZWN0J3MgbmV3IHBhcmVudCAoY2FuIGJlIE5VTEwpCisgKi8KK2ludCBrb2JqZWN0X21vdmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBrb2JqZWN0ICpuZXdfcGFyZW50KQoreworCWludCBlcnJvcjsKKwlzdHJ1Y3Qga29iamVjdCAqb2xkX3BhcmVudDsKKwljb25zdCBjaGFyICpkZXZwYXRoID0gTlVMTDsKKwljaGFyICpkZXZwYXRoX3N0cmluZyA9IE5VTEw7CisJY2hhciAqZW52cFsyXTsKKworCWtvYmogPSBrb2JqZWN0X2dldChrb2JqKTsKKwlpZiAoIWtvYmopCisJCXJldHVybiAtRUlOVkFMOworCW5ld19wYXJlbnQgPSBrb2JqZWN0X2dldChuZXdfcGFyZW50KTsKKwlpZiAoIW5ld19wYXJlbnQpIHsKKwkJaWYgKGtvYmotPmtzZXQpCisJCQluZXdfcGFyZW50ID0ga29iamVjdF9nZXQoJmtvYmotPmtzZXQtPmtvYmopOworCX0KKworCS8qIG9sZCBvYmplY3QgcGF0aCAqLworCWRldnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKGtvYmosIEdGUF9LRVJORUwpOworCWlmICghZGV2cGF0aCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKwlkZXZwYXRoX3N0cmluZyA9IGttYWxsb2Moc3RybGVuKGRldnBhdGgpICsgMTUsIEdGUF9LRVJORUwpOworCWlmICghZGV2cGF0aF9zdHJpbmcpIHsKKwkJZXJyb3IgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisJc3ByaW50ZihkZXZwYXRoX3N0cmluZywgIkRFVlBBVEhfT0xEPSVzIiwgZGV2cGF0aCk7CisJZW52cFswXSA9IGRldnBhdGhfc3RyaW5nOworCWVudnBbMV0gPSBOVUxMOworCWVycm9yID0gc3lzZnNfbW92ZV9kaXJfbnMoa29iaiwgbmV3X3BhcmVudCwga29iamVjdF9uYW1lc3BhY2Uoa29iaikpOworCWlmIChlcnJvcikKKwkJZ290byBvdXQ7CisJb2xkX3BhcmVudCA9IGtvYmotPnBhcmVudDsKKwlrb2JqLT5wYXJlbnQgPSBuZXdfcGFyZW50OworCW5ld19wYXJlbnQgPSBOVUxMOworCWtvYmplY3RfcHV0KG9sZF9wYXJlbnQpOworCWtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBLT0JKX01PVkUsIGVudnApOworb3V0OgorCWtvYmplY3RfcHV0KG5ld19wYXJlbnQpOworCWtvYmplY3RfcHV0KGtvYmopOworCWtmcmVlKGRldnBhdGhfc3RyaW5nKTsKKwlrZnJlZShkZXZwYXRoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrb2JqZWN0X21vdmUpOworCisvKioKKyAqIGtvYmplY3RfZGVsIC0gdW5saW5rIGtvYmplY3QgZnJvbSBoaWVyYXJjaHkuCisgKiBAa29iajogb2JqZWN0LgorICovCit2b2lkIGtvYmplY3RfZGVsKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBrZXJuZnNfbm9kZSAqc2Q7CisKKwlpZiAoIWtvYmopCisJCXJldHVybjsKKworCXNkID0ga29iai0+c2Q7CisJc3lzZnNfcmVtb3ZlX2Rpcihrb2JqKTsKKwlzeXNmc19wdXQoc2QpOworCisJa29iai0+c3RhdGVfaW5fc3lzZnMgPSAwOworCWtvYmpfa3NldF9sZWF2ZShrb2JqKTsKKwlrb2JqZWN0X3B1dChrb2JqLT5wYXJlbnQpOworCWtvYmotPnBhcmVudCA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGtvYmplY3RfZGVsKTsKKworLyoqCisgKiBrb2JqZWN0X2dldCAtIGluY3JlbWVudCByZWZjb3VudCBmb3Igb2JqZWN0LgorICogQGtvYmo6IG9iamVjdC4KKyAqLworc3RydWN0IGtvYmplY3QgKmtvYmplY3RfZ2V0KHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmIChrb2JqKSB7CisJCWlmICgha29iai0+c3RhdGVfaW5pdGlhbGl6ZWQpCisJCQlXQVJOKDEsIEtFUk5fV0FSTklORyAia29iamVjdDogJyVzJyAoJXApOiBpcyBub3QgIgorCQkJICAgICAgICJpbml0aWFsaXplZCwgeWV0IGtvYmplY3RfZ2V0KCkgaXMgYmVpbmcgIgorCQkJICAgICAgICJjYWxsZWQuXG4iLCBrb2JqZWN0X25hbWUoa29iaiksIGtvYmopOworCQlrcmVmX2dldCgma29iai0+a3JlZik7CisJfQorCXJldHVybiBrb2JqOworfQorRVhQT1JUX1NZTUJPTChrb2JqZWN0X2dldCk7CisKK3N0cnVjdCBrb2JqZWN0ICogX19tdXN0X2NoZWNrIGtvYmplY3RfZ2V0X3VubGVzc196ZXJvKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmICgha29iaikKKwkJcmV0dXJuIE5VTEw7CisJaWYgKCFrcmVmX2dldF91bmxlc3NfemVybygma29iai0+a3JlZikpCisJCWtvYmogPSBOVUxMOworCXJldHVybiBrb2JqOworfQorRVhQT1JUX1NZTUJPTChrb2JqZWN0X2dldF91bmxlc3NfemVybyk7CisKKy8qCisgKiBrb2JqZWN0X2NsZWFudXAgLSBmcmVlIGtvYmplY3QgcmVzb3VyY2VzLgorICogQGtvYmo6IG9iamVjdCB0byBjbGVhbnVwCisgKi8KK3N0YXRpYyB2b2lkIGtvYmplY3RfY2xlYW51cChzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwlzdHJ1Y3Qga29ial90eXBlICp0ID0gZ2V0X2t0eXBlKGtvYmopOworCWNvbnN0IGNoYXIgKm5hbWUgPSBrb2JqLT5uYW1lOworCisJcHJfZGVidWcoImtvYmplY3Q6ICclcycgKCVwKTogJXMsIHBhcmVudCAlcFxuIiwKKwkJIGtvYmplY3RfbmFtZShrb2JqKSwga29iaiwgX19mdW5jX18sIGtvYmotPnBhcmVudCk7CisKKwlpZiAodCAmJiAhdC0+cmVsZWFzZSkKKwkJcHJfZGVidWcoImtvYmplY3Q6ICclcycgKCVwKTogZG9lcyBub3QgaGF2ZSBhIHJlbGVhc2UoKSAiCisJCQkgImZ1bmN0aW9uLCBpdCBpcyBicm9rZW4gYW5kIG11c3QgYmUgZml4ZWQuXG4iLAorCQkJIGtvYmplY3RfbmFtZShrb2JqKSwga29iaik7CisKKwkvKiBzZW5kICJyZW1vdmUiIGlmIHRoZSBjYWxsZXIgZGlkIG5vdCBkbyBpdCBidXQgc2VudCAiYWRkIiAqLworCWlmIChrb2JqLT5zdGF0ZV9hZGRfdWV2ZW50X3NlbnQgJiYgIWtvYmotPnN0YXRlX3JlbW92ZV91ZXZlbnRfc2VudCkgeworCQlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiBhdXRvIGNsZWFudXAgJ3JlbW92ZScgZXZlbnRcbiIsCisJCQkga29iamVjdF9uYW1lKGtvYmopLCBrb2JqKTsKKwkJa29iamVjdF91ZXZlbnQoa29iaiwgS09CSl9SRU1PVkUpOworCX0KKworCS8qIHJlbW92ZSBmcm9tIHN5c2ZzIGlmIHRoZSBjYWxsZXIgZGlkIG5vdCBkbyBpdCAqLworCWlmIChrb2JqLT5zdGF0ZV9pbl9zeXNmcykgeworCQlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiBhdXRvIGNsZWFudXAga29iamVjdF9kZWxcbiIsCisJCQkga29iamVjdF9uYW1lKGtvYmopLCBrb2JqKTsKKwkJa29iamVjdF9kZWwoa29iaik7CisJfQorCisJaWYgKHQgJiYgdC0+cmVsZWFzZSkgeworCQlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiBjYWxsaW5nIGt0eXBlIHJlbGVhc2VcbiIsCisJCQkga29iamVjdF9uYW1lKGtvYmopLCBrb2JqKTsKKwkJdC0+cmVsZWFzZShrb2JqKTsKKwl9CisKKwkvKiBmcmVlIG5hbWUgaWYgd2UgYWxsb2NhdGVkIGl0ICovCisJaWYgKG5hbWUpIHsKKwkJcHJfZGVidWcoImtvYmplY3Q6ICclcyc6IGZyZWUgbmFtZVxuIiwgbmFtZSk7CisJCWtmcmVlX2NvbnN0KG5hbWUpOworCX0KK30KKworI2lmZGVmIENPTkZJR19ERUJVR19LT0JKRUNUX1JFTEVBU0UKK3N0YXRpYyB2b2lkIGtvYmplY3RfZGVsYXllZF9jbGVhbnVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlrb2JqZWN0X2NsZWFudXAoY29udGFpbmVyX29mKHRvX2RlbGF5ZWRfd29yayh3b3JrKSwKKwkJCQkgICAgIHN0cnVjdCBrb2JqZWN0LCByZWxlYXNlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQga29iamVjdF9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBrb2JqZWN0LCBrcmVmKTsKKyNpZmRlZiBDT05GSUdfREVCVUdfS09CSkVDVF9SRUxFQVNFCisJdW5zaWduZWQgbG9uZyBkZWxheSA9IEhaICsgSFogKiAoZ2V0X3JhbmRvbV9pbnQoKSAmIDB4Myk7CisJcHJfaW5mbygia29iamVjdDogJyVzJyAoJXApOiAlcywgcGFyZW50ICVwIChkZWxheWVkICVsZClcbiIsCisJCSBrb2JqZWN0X25hbWUoa29iaiksIGtvYmosIF9fZnVuY19fLCBrb2JqLT5wYXJlbnQsIGRlbGF5KTsKKwlJTklUX0RFTEFZRURfV09SSygma29iai0+cmVsZWFzZSwga29iamVjdF9kZWxheWVkX2NsZWFudXApOworCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZrb2JqLT5yZWxlYXNlLCBkZWxheSk7CisjZWxzZQorCWtvYmplY3RfY2xlYW51cChrb2JqKTsKKyNlbmRpZgorfQorCisvKioKKyAqIGtvYmplY3RfcHV0IC0gZGVjcmVtZW50IHJlZmNvdW50IGZvciBvYmplY3QuCisgKiBAa29iajogb2JqZWN0LgorICoKKyAqIERlY3JlbWVudCB0aGUgcmVmY291bnQsIGFuZCBpZiAwLCBjYWxsIGtvYmplY3RfY2xlYW51cCgpLgorICovCit2b2lkIGtvYmplY3RfcHV0KHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCWlmIChrb2JqKSB7CisJCWlmICgha29iai0+c3RhdGVfaW5pdGlhbGl6ZWQpCisJCQlXQVJOKDEsIEtFUk5fV0FSTklORyAia29iamVjdDogJyVzJyAoJXApOiBpcyBub3QgIgorCQkJICAgICAgICJpbml0aWFsaXplZCwgeWV0IGtvYmplY3RfcHV0KCkgaXMgYmVpbmcgIgorCQkJICAgICAgICJjYWxsZWQuXG4iLCBrb2JqZWN0X25hbWUoa29iaiksIGtvYmopOworCQlrcmVmX3B1dCgma29iai0+a3JlZiwga29iamVjdF9yZWxlYXNlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGtvYmplY3RfcHV0KTsKKworc3RhdGljIHZvaWQgZHluYW1pY19rb2JqX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJcHJfZGVidWcoImtvYmplY3Q6ICglcCk6ICVzXG4iLCBrb2JqLCBfX2Z1bmNfXyk7CisJa2ZyZWUoa29iaik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial90eXBlIGR5bmFtaWNfa29ial9rdHlwZSA9IHsKKwkucmVsZWFzZQk9IGR5bmFtaWNfa29ial9yZWxlYXNlLAorCS5zeXNmc19vcHMJPSAma29ial9zeXNmc19vcHMsCit9OworCisvKioKKyAqIGtvYmplY3RfY3JlYXRlIC0gY3JlYXRlIGEgc3RydWN0IGtvYmplY3QgZHluYW1pY2FsbHkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBrb2JqZWN0IHN0cnVjdHVyZSBkeW5hbWljYWxseSBhbmQgc2V0cyBpdCB1cAorICogdG8gYmUgYSAiZHluYW1pYyIga29iamVjdCB3aXRoIGEgZGVmYXVsdCByZWxlYXNlIGZ1bmN0aW9uIHNldCB1cC4KKyAqCisgKiBJZiB0aGUga29iamVjdCB3YXMgbm90IGFibGUgdG8gYmUgY3JlYXRlZCwgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICogVGhlIGtvYmplY3Qgc3RydWN0dXJlIHJldHVybmVkIGZyb20gaGVyZSBtdXN0IGJlIGNsZWFuZWQgdXAgd2l0aCBhCisgKiBjYWxsIHRvIGtvYmplY3RfcHV0KCkgYW5kIG5vdCBrZnJlZSgpLCBhcyBrb2JqZWN0X2luaXQoKSBoYXMKKyAqIGFscmVhZHkgYmVlbiBjYWxsZWQgb24gdGhpcyBzdHJ1Y3R1cmUuCisgKi8KK3N0cnVjdCBrb2JqZWN0ICprb2JqZWN0X2NyZWF0ZSh2b2lkKQoreworCXN0cnVjdCBrb2JqZWN0ICprb2JqOworCisJa29iaiA9IGt6YWxsb2Moc2l6ZW9mKCprb2JqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrb2JqKQorCQlyZXR1cm4gTlVMTDsKKworCWtvYmplY3RfaW5pdChrb2JqLCAmZHluYW1pY19rb2JqX2t0eXBlKTsKKwlyZXR1cm4ga29iajsKK30KKworLyoqCisgKiBrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkIC0gY3JlYXRlIGEgc3RydWN0IGtvYmplY3QgZHluYW1pY2FsbHkgYW5kIHJlZ2lzdGVyIGl0IHdpdGggc3lzZnMKKyAqCisgKiBAbmFtZTogdGhlIG5hbWUgZm9yIHRoZSBrb2JqZWN0CisgKiBAcGFyZW50OiB0aGUgcGFyZW50IGtvYmplY3Qgb2YgdGhpcyBrb2JqZWN0LCBpZiBhbnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEga29iamVjdCBzdHJ1Y3R1cmUgZHluYW1pY2FsbHkgYW5kIHJlZ2lzdGVycyBpdAorICogd2l0aCBzeXNmcy4gIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoaXMgc3RydWN0dXJlLCBjYWxsCisgKiBrb2JqZWN0X3B1dCgpIGFuZCB0aGUgc3RydWN0dXJlIHdpbGwgYmUgZHluYW1pY2FsbHkgZnJlZWQgd2hlbgorICogaXQgaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQuCisgKgorICogSWYgdGhlIGtvYmplY3Qgd2FzIG5vdCBhYmxlIHRvIGJlIGNyZWF0ZWQsIE5VTEwgd2lsbCBiZSByZXR1cm5lZC4KKyAqLworc3RydWN0IGtvYmplY3QgKmtvYmplY3RfY3JlYXRlX2FuZF9hZGQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGtvYmplY3QgKnBhcmVudCkKK3sKKwlzdHJ1Y3Qga29iamVjdCAqa29iajsKKwlpbnQgcmV0dmFsOworCisJa29iaiA9IGtvYmplY3RfY3JlYXRlKCk7CisJaWYgKCFrb2JqKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHZhbCA9IGtvYmplY3RfYWRkKGtvYmosIHBhcmVudCwgIiVzIiwgbmFtZSk7CisJaWYgKHJldHZhbCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczoga29iamVjdF9hZGQgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgX19mdW5jX18sIHJldHZhbCk7CisJCWtvYmplY3RfcHV0KGtvYmopOworCQlrb2JqID0gTlVMTDsKKwl9CisJcmV0dXJuIGtvYmo7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrb2JqZWN0X2NyZWF0ZV9hbmRfYWRkKTsKKworLyoqCisgKiBrc2V0X2luaXQgLSBpbml0aWFsaXplIGEga3NldCBmb3IgdXNlCisgKiBAazoga3NldAorICovCit2b2lkIGtzZXRfaW5pdChzdHJ1Y3Qga3NldCAqaykKK3sKKwlrb2JqZWN0X2luaXRfaW50ZXJuYWwoJmstPmtvYmopOworCUlOSVRfTElTVF9IRUFEKCZrLT5saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmay0+bGlzdF9sb2NrKTsKK30KKworLyogZGVmYXVsdCBrb2JqZWN0IGF0dHJpYnV0ZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3NpemVfdCBrb2JqX2F0dHJfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmthdHRyOworCXNzaXplX3QgcmV0ID0gLUVJTzsKKworCWthdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSwgYXR0cik7CisJaWYgKGthdHRyLT5zaG93KQorCQlyZXQgPSBrYXR0ci0+c2hvdyhrb2JqLCBrYXR0ciwgYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBrb2JqX2F0dHJfc3RvcmUoc3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGtvYmpfYXR0cmlidXRlICprYXR0cjsKKwlzc2l6ZV90IHJldCA9IC1FSU87CisKKwlrYXR0ciA9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUsIGF0dHIpOworCWlmIChrYXR0ci0+c3RvcmUpCisJCXJldCA9IGthdHRyLT5zdG9yZShrb2JqLCBrYXR0ciwgYnVmLCBjb3VudCk7CisJcmV0dXJuIHJldDsKK30KKworY29uc3Qgc3RydWN0IHN5c2ZzX29wcyBrb2JqX3N5c2ZzX29wcyA9IHsKKwkuc2hvdwk9IGtvYmpfYXR0cl9zaG93LAorCS5zdG9yZQk9IGtvYmpfYXR0cl9zdG9yZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChrb2JqX3N5c2ZzX29wcyk7CisKKy8qKgorICoga3NldF9yZWdpc3RlciAtIGluaXRpYWxpemUgYW5kIGFkZCBhIGtzZXQuCisgKiBAazoga3NldC4KKyAqLworaW50IGtzZXRfcmVnaXN0ZXIoc3RydWN0IGtzZXQgKmspCit7CisJaW50IGVycjsKKworCWlmICghaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlrc2V0X2luaXQoayk7CisJZXJyID0ga29iamVjdF9hZGRfaW50ZXJuYWwoJmstPmtvYmopOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJa29iamVjdF91ZXZlbnQoJmstPmtvYmosIEtPQkpfQUREKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woa3NldF9yZWdpc3Rlcik7CisKKy8qKgorICoga3NldF91bnJlZ2lzdGVyIC0gcmVtb3ZlIGEga3NldC4KKyAqIEBrOiBrc2V0LgorICovCit2b2lkIGtzZXRfdW5yZWdpc3RlcihzdHJ1Y3Qga3NldCAqaykKK3sKKwlpZiAoIWspCisJCXJldHVybjsKKwlrb2JqZWN0X2RlbCgmay0+a29iaik7CisJa29iamVjdF9wdXQoJmstPmtvYmopOworfQorRVhQT1JUX1NZTUJPTChrc2V0X3VucmVnaXN0ZXIpOworCisvKioKKyAqIGtzZXRfZmluZF9vYmogLSBzZWFyY2ggZm9yIG9iamVjdCBpbiBrc2V0LgorICogQGtzZXQ6IGtzZXQgd2UncmUgbG9va2luZyBpbi4KKyAqIEBuYW1lOiBvYmplY3QncyBuYW1lLgorICoKKyAqIExvY2sga3NldCB2aWEgQGtzZXQtPnN1YnN5cywgYW5kIGl0ZXJhdGUgb3ZlciBAa3NldC0+bGlzdCwKKyAqIGxvb2tpbmcgZm9yIGEgbWF0Y2hpbmcga29iamVjdC4gSWYgbWF0Y2hpbmcgb2JqZWN0IGlzIGZvdW5kCisgKiB0YWtlIGEgcmVmZXJlbmNlIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KKyAqLworc3RydWN0IGtvYmplY3QgKmtzZXRfZmluZF9vYmooc3RydWN0IGtzZXQgKmtzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGtvYmplY3QgKms7CisJc3RydWN0IGtvYmplY3QgKnJldCA9IE5VTEw7CisKKwlzcGluX2xvY2soJmtzZXQtPmxpc3RfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGssICZrc2V0LT5saXN0LCBlbnRyeSkgeworCQlpZiAoa29iamVjdF9uYW1lKGspICYmICFzdHJjbXAoa29iamVjdF9uYW1lKGspLCBuYW1lKSkgeworCQkJcmV0ID0ga29iamVjdF9nZXRfdW5sZXNzX3plcm8oayk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZrc2V0LT5saXN0X2xvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrc2V0X2ZpbmRfb2JqKTsKKworc3RhdGljIHZvaWQga3NldF9yZWxlYXNlKHN0cnVjdCBrb2JqZWN0ICprb2JqKQoreworCXN0cnVjdCBrc2V0ICprc2V0ID0gY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCBrc2V0LCBrb2JqKTsKKwlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiAlc1xuIiwKKwkJIGtvYmplY3RfbmFtZShrb2JqKSwga29iaiwgX19mdW5jX18pOworCWtmcmVlKGtzZXQpOworfQorCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBrc2V0X2t0eXBlID0geworCS5zeXNmc19vcHMJPSAma29ial9zeXNmc19vcHMsCisJLnJlbGVhc2UgPSBrc2V0X3JlbGVhc2UsCit9OworCisvKioKKyAqIGtzZXRfY3JlYXRlIC0gY3JlYXRlIGEgc3RydWN0IGtzZXQgZHluYW1pY2FsbHkKKyAqCisgKiBAbmFtZTogdGhlIG5hbWUgZm9yIHRoZSBrc2V0CisgKiBAdWV2ZW50X29wczogYSBzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzIGZvciB0aGUga3NldAorICogQHBhcmVudF9rb2JqOiB0aGUgcGFyZW50IGtvYmplY3Qgb2YgdGhpcyBrc2V0LCBpZiBhbnkuCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEga3NldCBzdHJ1Y3R1cmUgZHluYW1pY2FsbHkuICBUaGlzIHN0cnVjdHVyZSBjYW4KKyAqIHRoZW4gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzeXN0ZW0gYW5kIHNob3cgdXAgaW4gc3lzZnMgd2l0aCBhIGNhbGwgdG8KKyAqIGtzZXRfcmVnaXN0ZXIoKS4gIFdoZW4geW91IGFyZSBmaW5pc2hlZCB3aXRoIHRoaXMgc3RydWN0dXJlLCBpZgorICoga3NldF9yZWdpc3RlcigpIGhhcyBiZWVuIGNhbGxlZCwgY2FsbCBrc2V0X3VucmVnaXN0ZXIoKSBhbmQgdGhlCisgKiBzdHJ1Y3R1cmUgd2lsbCBiZSBkeW5hbWljYWxseSBmcmVlZCB3aGVuIGl0IGlzIG5vIGxvbmdlciBiZWluZyB1c2VkLgorICoKKyAqIElmIHRoZSBrc2V0IHdhcyBub3QgYWJsZSB0byBiZSBjcmVhdGVkLCBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qga3NldCAqa3NldF9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKKwkJCQljb25zdCBzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzICp1ZXZlbnRfb3BzLAorCQkJCXN0cnVjdCBrb2JqZWN0ICpwYXJlbnRfa29iaikKK3sKKwlzdHJ1Y3Qga3NldCAqa3NldDsKKwlpbnQgcmV0dmFsOworCisJa3NldCA9IGt6YWxsb2Moc2l6ZW9mKCprc2V0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrc2V0KQorCQlyZXR1cm4gTlVMTDsKKwlyZXR2YWwgPSBrb2JqZWN0X3NldF9uYW1lKCZrc2V0LT5rb2JqLCAiJXMiLCBuYW1lKTsKKwlpZiAocmV0dmFsKSB7CisJCWtmcmVlKGtzZXQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJa3NldC0+dWV2ZW50X29wcyA9IHVldmVudF9vcHM7CisJa3NldC0+a29iai5wYXJlbnQgPSBwYXJlbnRfa29iajsKKworCS8qCisJICogVGhlIGtvYmplY3Qgb2YgdGhpcyBrc2V0IHdpbGwgaGF2ZSBhIHR5cGUgb2Yga3NldF9rdHlwZSBhbmQgYmVsb25nIHRvCisJICogbm8ga3NldCBpdHNlbGYuICBUaGF0IHdheSB3ZSBjYW4gcHJvcGVybHkgZnJlZSBpdCB3aGVuIGl0IGlzCisJICogZmluaXNoZWQgYmVpbmcgdXNlZC4KKwkgKi8KKwlrc2V0LT5rb2JqLmt0eXBlID0gJmtzZXRfa3R5cGU7CisJa3NldC0+a29iai5rc2V0ID0gTlVMTDsKKworCXJldHVybiBrc2V0OworfQorCisvKioKKyAqIGtzZXRfY3JlYXRlX2FuZF9hZGQgLSBjcmVhdGUgYSBzdHJ1Y3Qga3NldCBkeW5hbWljYWxseSBhbmQgYWRkIGl0IHRvIHN5c2ZzCisgKgorICogQG5hbWU6IHRoZSBuYW1lIGZvciB0aGUga3NldAorICogQHVldmVudF9vcHM6IGEgc3RydWN0IGtzZXRfdWV2ZW50X29wcyBmb3IgdGhlIGtzZXQKKyAqIEBwYXJlbnRfa29iajogdGhlIHBhcmVudCBrb2JqZWN0IG9mIHRoaXMga3NldCwgaWYgYW55LgorICoKKyAqIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIGtzZXQgc3RydWN0dXJlIGR5bmFtaWNhbGx5IGFuZCByZWdpc3RlcnMgaXQKKyAqIHdpdGggc3lzZnMuICBXaGVuIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB0aGlzIHN0cnVjdHVyZSwgY2FsbAorICoga3NldF91bnJlZ2lzdGVyKCkgYW5kIHRoZSBzdHJ1Y3R1cmUgd2lsbCBiZSBkeW5hbWljYWxseSBmcmVlZCB3aGVuIGl0CisgKiBpcyBubyBsb25nZXIgYmVpbmcgdXNlZC4KKyAqCisgKiBJZiB0aGUga3NldCB3YXMgbm90IGFibGUgdG8gYmUgY3JlYXRlZCwgTlVMTCB3aWxsIGJlIHJldHVybmVkLgorICovCitzdHJ1Y3Qga3NldCAqa3NldF9jcmVhdGVfYW5kX2FkZChjb25zdCBjaGFyICpuYW1lLAorCQkJCSBjb25zdCBzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzICp1ZXZlbnRfb3BzLAorCQkJCSBzdHJ1Y3Qga29iamVjdCAqcGFyZW50X2tvYmopCit7CisJc3RydWN0IGtzZXQgKmtzZXQ7CisJaW50IGVycm9yOworCisJa3NldCA9IGtzZXRfY3JlYXRlKG5hbWUsIHVldmVudF9vcHMsIHBhcmVudF9rb2JqKTsKKwlpZiAoIWtzZXQpCisJCXJldHVybiBOVUxMOworCWVycm9yID0ga3NldF9yZWdpc3Rlcihrc2V0KTsKKwlpZiAoZXJyb3IpIHsKKwkJa2ZyZWUoa3NldCk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4ga3NldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGtzZXRfY3JlYXRlX2FuZF9hZGQpOworCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soa29ial9uc190eXBlX2xvY2spOworc3RhdGljIGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqa29ial9uc19vcHNfdGJsW0tPQkpfTlNfVFlQRVNdOworCitpbnQga29ial9uc190eXBlX3JlZ2lzdGVyKGNvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqb3BzKQoreworCWVudW0ga29ial9uc190eXBlIHR5cGUgPSBvcHMtPnR5cGU7CisJaW50IGVycm9yOworCisJc3Bpbl9sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHR5cGUgPj0gS09CSl9OU19UWVBFUykKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IC1FSU5WQUw7CisJaWYgKHR5cGUgPD0gS09CSl9OU19UWVBFX05PTkUpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRUJVU1k7CisJaWYgKGtvYmpfbnNfb3BzX3RibFt0eXBlXSkKKwkJZ290byBvdXQ7CisKKwllcnJvciA9IDA7CisJa29ial9uc19vcHNfdGJsW3R5cGVdID0gb3BzOworCitvdXQ6CisJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK2ludCBrb2JqX25zX3R5cGVfcmVnaXN0ZXJlZChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKQoreworCWludCByZWdpc3RlcmVkID0gMDsKKworCXNwaW5fbG9jaygma29ial9uc190eXBlX2xvY2spOworCWlmICgodHlwZSA+IEtPQkpfTlNfVFlQRV9OT05FKSAmJiAodHlwZSA8IEtPQkpfTlNfVFlQRVMpKQorCQlyZWdpc3RlcmVkID0ga29ial9uc19vcHNfdGJsW3R5cGVdICE9IE5VTEw7CisJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKKworCXJldHVybiByZWdpc3RlcmVkOworfQorCitjb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKmtvYmpfY2hpbGRfbnNfb3BzKHN0cnVjdCBrb2JqZWN0ICpwYXJlbnQpCit7CisJY29uc3Qgc3RydWN0IGtvYmpfbnNfdHlwZV9vcGVyYXRpb25zICpvcHMgPSBOVUxMOworCisJaWYgKHBhcmVudCAmJiBwYXJlbnQtPmt0eXBlICYmIHBhcmVudC0+a3R5cGUtPmNoaWxkX25zX3R5cGUpCisJCW9wcyA9IHBhcmVudC0+a3R5cGUtPmNoaWxkX25zX3R5cGUocGFyZW50KTsKKworCXJldHVybiBvcHM7Cit9CisKK2NvbnN0IHN0cnVjdCBrb2JqX25zX3R5cGVfb3BlcmF0aW9ucyAqa29ial9uc19vcHMoc3RydWN0IGtvYmplY3QgKmtvYmopCit7CisJcmV0dXJuIGtvYmpfY2hpbGRfbnNfb3BzKGtvYmotPnBhcmVudCk7Cit9CisKK2Jvb2wga29ial9uc19jdXJyZW50X21heV9tb3VudChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKQoreworCWJvb2wgbWF5X21vdW50ID0gdHJ1ZTsKKworCXNwaW5fbG9jaygma29ial9uc190eXBlX2xvY2spOworCWlmICgodHlwZSA+IEtPQkpfTlNfVFlQRV9OT05FKSAmJiAodHlwZSA8IEtPQkpfTlNfVFlQRVMpICYmCisJICAgIGtvYmpfbnNfb3BzX3RibFt0eXBlXSkKKwkJbWF5X21vdW50ID0ga29ial9uc19vcHNfdGJsW3R5cGVdLT5jdXJyZW50X21heV9tb3VudCgpOworCXNwaW5fdW5sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisKKwlyZXR1cm4gbWF5X21vdW50OworfQorCit2b2lkICprb2JqX25zX2dyYWJfY3VycmVudChlbnVtIGtvYmpfbnNfdHlwZSB0eXBlKQoreworCXZvaWQgKm5zID0gTlVMTDsKKworCXNwaW5fbG9jaygma29ial9uc190eXBlX2xvY2spOworCWlmICgodHlwZSA+IEtPQkpfTlNfVFlQRV9OT05FKSAmJiAodHlwZSA8IEtPQkpfTlNfVFlQRVMpICYmCisJICAgIGtvYmpfbnNfb3BzX3RibFt0eXBlXSkKKwkJbnMgPSBrb2JqX25zX29wc190YmxbdHlwZV0tPmdyYWJfY3VycmVudF9ucygpOworCXNwaW5fdW5sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisKKwlyZXR1cm4gbnM7Cit9CisKK2NvbnN0IHZvaWQgKmtvYmpfbnNfbmV0bGluayhlbnVtIGtvYmpfbnNfdHlwZSB0eXBlLCBzdHJ1Y3Qgc29jayAqc2spCit7CisJY29uc3Qgdm9pZCAqbnMgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisJaWYgKCh0eXBlID4gS09CSl9OU19UWVBFX05PTkUpICYmICh0eXBlIDwgS09CSl9OU19UWVBFUykgJiYKKwkgICAga29ial9uc19vcHNfdGJsW3R5cGVdKQorCQlucyA9IGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+bmV0bGlua19ucyhzayk7CisJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKKworCXJldHVybiBuczsKK30KKworY29uc3Qgdm9pZCAqa29ial9uc19pbml0aWFsKGVudW0ga29ial9uc190eXBlIHR5cGUpCit7CisJY29uc3Qgdm9pZCAqbnMgPSBOVUxMOworCisJc3Bpbl9sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisJaWYgKCh0eXBlID4gS09CSl9OU19UWVBFX05PTkUpICYmICh0eXBlIDwgS09CSl9OU19UWVBFUykgJiYKKwkgICAga29ial9uc19vcHNfdGJsW3R5cGVdKQorCQlucyA9IGtvYmpfbnNfb3BzX3RibFt0eXBlXS0+aW5pdGlhbF9ucygpOworCXNwaW5fdW5sb2NrKCZrb2JqX25zX3R5cGVfbG9jayk7CisKKwlyZXR1cm4gbnM7Cit9CisKK3ZvaWQga29ial9uc19kcm9wKGVudW0ga29ial9uc190eXBlIHR5cGUsIHZvaWQgKm5zKQoreworCXNwaW5fbG9jaygma29ial9uc190eXBlX2xvY2spOworCWlmICgodHlwZSA+IEtPQkpfTlNfVFlQRV9OT05FKSAmJiAodHlwZSA8IEtPQkpfTlNfVFlQRVMpICYmCisJICAgIGtvYmpfbnNfb3BzX3RibFt0eXBlXSAmJiBrb2JqX25zX29wc190YmxbdHlwZV0tPmRyb3BfbnMpCisJCWtvYmpfbnNfb3BzX3RibFt0eXBlXS0+ZHJvcF9ucyhucyk7CisJc3Bpbl91bmxvY2soJmtvYmpfbnNfdHlwZV9sb2NrKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tvYmplY3RfdWV2ZW50LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9rb2JqZWN0X3VldmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTZjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9rb2JqZWN0X3VldmVudC5jCkBAIC0wLDAgKzEsNjUwIEBACisvKgorICoga2VybmVsIHVzZXJzcGFjZSBldmVudCBkZWxpdmVyeQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBSZWQgSGF0LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IE5vdmVsbCwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCBJQk0sIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgR05VIEdQTCB2Mi4KKyAqCisgKiBBdXRob3JzOgorICoJUm9iZXJ0IExvdmUJCTxybWxAbm92ZWxsLmNvbT4KKyAqCUtheSBTaWV2ZXJzCQk8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKglBcmphbiB2YW4gZGUgVmVuCTxhcmphbnZAcmVkaGF0LmNvbT4KKyAqCUdyZWcgS3JvYWgtSGFydG1hbgk8Z3JlZ0Brcm9haC5jb20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KKworCit1NjQgdWV2ZW50X3NlcW51bTsKKyNpZmRlZiBDT05GSUdfVUVWRU5UX0hFTFBFUgorY2hhciB1ZXZlbnRfaGVscGVyW1VFVkVOVF9IRUxQRVJfUEFUSF9MRU5dID0gQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVQKK3N0cnVjdCB1ZXZlbnRfc29jayB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBzb2NrICpzazsKK307CitzdGF0aWMgTElTVF9IRUFEKHVldmVudF9zb2NrX2xpc3QpOworI2VuZGlmCisKKy8qIFRoaXMgbG9jayBwcm90ZWN0cyB1ZXZlbnRfc2VxbnVtIGFuZCB1ZXZlbnRfc29ja19saXN0ICovCitzdGF0aWMgREVGSU5FX01VVEVYKHVldmVudF9zb2NrX211dGV4KTsKKworLyogdGhlIHN0cmluZ3MgaGVyZSBtdXN0IG1hdGNoIHRoZSBlbnVtIGluIGluY2x1ZGUvbGludXgva29iamVjdC5oICovCitzdGF0aWMgY29uc3QgY2hhciAqa29iamVjdF9hY3Rpb25zW10gPSB7CisJW0tPQkpfQUREXSA9CQkiYWRkIiwKKwlbS09CSl9SRU1PVkVdID0JCSJyZW1vdmUiLAorCVtLT0JKX0NIQU5HRV0gPQkJImNoYW5nZSIsCisJW0tPQkpfTU9WRV0gPQkJIm1vdmUiLAorCVtLT0JKX09OTElORV0gPQkJIm9ubGluZSIsCisJW0tPQkpfT0ZGTElORV0gPQkib2ZmbGluZSIsCisJW0tPQkpfQklORF0gPQkJImJpbmQiLAorCVtLT0JKX1VOQklORF0gPQkJInVuYmluZCIsCit9OworCitzdGF0aWMgaW50IGtvYmplY3RfYWN0aW9uX3R5cGUoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgICAgZW51bSBrb2JqZWN0X2FjdGlvbiAqdHlwZSwKKwkJCSAgICAgICBjb25zdCBjaGFyICoqYXJncykKK3sKKwllbnVtIGtvYmplY3RfYWN0aW9uIGFjdGlvbjsKKwlzaXplX3QgY291bnRfZmlyc3Q7CisJY29uc3QgY2hhciAqYXJnc19zdGFydDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCWlmIChjb3VudCAmJiAoYnVmW2NvdW50LTFdID09ICdcbicgfHwgYnVmW2NvdW50LTFdID09ICdcMCcpKQorCQljb3VudC0tOworCisJaWYgKCFjb3VudCkKKwkJZ290byBvdXQ7CisKKwlhcmdzX3N0YXJ0ID0gc3RybmNocihidWYsIGNvdW50LCAnICcpOworCWlmIChhcmdzX3N0YXJ0KSB7CisJCWNvdW50X2ZpcnN0ID0gYXJnc19zdGFydCAtIGJ1ZjsKKwkJYXJnc19zdGFydCA9IGFyZ3Nfc3RhcnQgKyAxOworCX0gZWxzZQorCQljb3VudF9maXJzdCA9IGNvdW50OworCisJZm9yIChhY3Rpb24gPSAwOyBhY3Rpb24gPCBBUlJBWV9TSVpFKGtvYmplY3RfYWN0aW9ucyk7IGFjdGlvbisrKSB7CisJCWlmIChzdHJuY21wKGtvYmplY3RfYWN0aW9uc1thY3Rpb25dLCBidWYsIGNvdW50X2ZpcnN0KSAhPSAwKQorCQkJY29udGludWU7CisJCWlmIChrb2JqZWN0X2FjdGlvbnNbYWN0aW9uXVtjb3VudF9maXJzdF0gIT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlpZiAoYXJncykKKwkJCSphcmdzID0gYXJnc19zdGFydDsKKwkJKnR5cGUgPSBhY3Rpb247CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYWN0aW9uX2FyZ193b3JkX2VuZChjb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKmJ1Zl9lbmQsCisJCQkJICAgICAgIGNoYXIgZGVsaW0pCit7CisJY29uc3QgY2hhciAqbmV4dCA9IGJ1ZjsKKworCXdoaWxlIChuZXh0IDw9IGJ1Zl9lbmQgJiYgKm5leHQgIT0gZGVsaW0pCisJCWlmICghaXNhbG51bSgqbmV4dCsrKSkKKwkJCXJldHVybiBOVUxMOworCisJaWYgKG5leHQgPT0gYnVmKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgaW50IGtvYmplY3RfYWN0aW9uX2FyZ3MoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgICAgc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqKnJldF9lbnYpCit7CisJc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52ID0gTlVMTDsKKwljb25zdCBjaGFyICpuZXh0LCAqYnVmX2VuZCwgKmtleTsKKwlpbnQga2V5X2xlbjsKKwlpbnQgciA9IC1FSU5WQUw7CisKKwlpZiAoY291bnQgJiYgKGJ1Zltjb3VudCAtIDFdID09ICdcbicgfHwgYnVmW2NvdW50IC0gMV0gPT0gJ1wwJykpCisJCWNvdW50LS07CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVudiA9IGt6YWxsb2Moc2l6ZW9mKCplbnYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBmaXJzdCBhcmcgaXMgVVVJRCAqLworCWlmIChjb3VudCA8IFVVSURfU1RSSU5HX0xFTiB8fCAhdXVpZF9pc192YWxpZChidWYpIHx8CisJICAgIGFkZF91ZXZlbnRfdmFyKGVudiwgIlNZTlRIX1VVSUQ9JS4qcyIsIFVVSURfU1RSSU5HX0xFTiwgYnVmKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIHRoZSByZXN0IGFyZSBjdXN0b20gZW52aXJvbm1lbnQgdmFyaWFibGVzIGluIEtFWT1WQUxVRQorCSAqIGZvcm1hdCB3aXRoICcgJyBkZWxpbWl0ZXIgYmV0d2VlbiBlYWNoIEtFWT1WQUxVRSBwYWlyCisJICovCisJbmV4dCA9IGJ1ZiArIFVVSURfU1RSSU5HX0xFTjsKKwlidWZfZW5kID0gYnVmICsgY291bnQgLSAxOworCisJd2hpbGUgKG5leHQgPD0gYnVmX2VuZCkgeworCQlpZiAoKm5leHQgIT0gJyAnKQorCQkJZ290byBvdXQ7CisKKwkJLyogc2tpcCB0aGUgJyAnLCBrZXkgbXVzdCBmb2xsb3cgKi8KKwkJa2V5ID0gKytuZXh0OworCQlpZiAoa2V5ID4gYnVmX2VuZCkKKwkJCWdvdG8gb3V0OworCisJCWJ1ZiA9IG5leHQ7CisJCW5leHQgPSBhY3Rpb25fYXJnX3dvcmRfZW5kKGJ1ZiwgYnVmX2VuZCwgJz0nKTsKKwkJaWYgKCFuZXh0IHx8IG5leHQgPiBidWZfZW5kIHx8ICpuZXh0ICE9ICc9JykKKwkJCWdvdG8gb3V0OworCQlrZXlfbGVuID0gbmV4dCAtIGJ1ZjsKKworCQkvKiBza2lwIHRoZSAnPScsIHZhbHVlIG11c3QgZm9sbG93ICovCisJCWlmICgrK25leHQgPiBidWZfZW5kKQorCQkJZ290byBvdXQ7CisKKwkJYnVmID0gbmV4dDsKKwkJbmV4dCA9IGFjdGlvbl9hcmdfd29yZF9lbmQoYnVmLCBidWZfZW5kLCAnICcpOworCQlpZiAoIW5leHQpCisJCQlnb3RvIG91dDsKKworCQlpZiAoYWRkX3VldmVudF92YXIoZW52LCAiU1lOVEhfQVJHXyUuKnM9JS4qcyIsCisJCQkJICAga2V5X2xlbiwga2V5LCAoaW50KSAobmV4dCAtIGJ1ZiksIGJ1ZikpCisJCQlnb3RvIG91dDsKKwl9CisKKwlyID0gMDsKK291dDoKKwlpZiAocikKKwkJa2ZyZWUoZW52KTsKKwllbHNlCisJCSpyZXRfZW52ID0gZW52OworCXJldHVybiByOworfQorCisvKioKKyAqIGtvYmplY3Rfc3ludGhfdWV2ZW50IC0gc2VuZCBzeW50aGV0aWMgdWV2ZW50IHdpdGggYXJndW1lbnRzCisgKgorICogQGtvYmo6IHN0cnVjdCBrb2JqZWN0IGZvciB3aGljaCBzeW50aGV0aWMgdWV2ZW50IGlzIHRvIGJlIGdlbmVyYXRlZAorICogQGJ1ZjogYnVmZmVyIGNvbnRhaW5pbmcgYWN0aW9uIHR5cGUgYW5kIGFjdGlvbiBhcmdzLCBuZXdsaW5lIGlzIGlnbm9yZWQKKyAqIEBjb3VudDogbGVuZ3RoIG9mIGJ1ZmZlcgorICoKKyAqIFJldHVybnMgMCBpZiBrb2JqZWN0X3N5bnRoZXRpY191ZXZlbnQoKSBpcyBjb21wbGV0ZWQgd2l0aCBzdWNjZXNzIG9yIHRoZQorICogY29ycmVzcG9uZGluZyBlcnJvciB3aGVuIGl0IGZhaWxzLgorICovCitpbnQga29iamVjdF9zeW50aF91ZXZlbnQoc3RydWN0IGtvYmplY3QgKmtvYmosIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKm5vX3V1aWRfZW52cFtdID0geyAiU1lOVEhfVVVJRD0wIiwgTlVMTCB9OworCWVudW0ga29iamVjdF9hY3Rpb24gYWN0aW9uOworCWNvbnN0IGNoYXIgKmFjdGlvbl9hcmdzOworCXN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudjsKKwljb25zdCBjaGFyICptc2cgPSBOVUxMLCAqZGV2cGF0aDsKKwlpbnQgcjsKKworCXIgPSBrb2JqZWN0X2FjdGlvbl90eXBlKGJ1ZiwgY291bnQsICZhY3Rpb24sICZhY3Rpb25fYXJncyk7CisJaWYgKHIpIHsKKwkJbXNnID0gInVua25vd24gdWV2ZW50IGFjdGlvbiBzdHJpbmdcbiI7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghYWN0aW9uX2FyZ3MpIHsKKwkJciA9IGtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBhY3Rpb24sIG5vX3V1aWRfZW52cCk7CisJCWdvdG8gb3V0OworCX0KKworCXIgPSBrb2JqZWN0X2FjdGlvbl9hcmdzKGFjdGlvbl9hcmdzLAorCQkJCWNvdW50IC0gKGFjdGlvbl9hcmdzIC0gYnVmKSwgJmVudik7CisJaWYgKHIgPT0gLUVJTlZBTCkgeworCQltc2cgPSAiaW5jb3JyZWN0IHVldmVudCBhY3Rpb24gYXJndW1lbnRzXG4iOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocikKKwkJZ290byBvdXQ7CisKKwlyID0ga29iamVjdF91ZXZlbnRfZW52KGtvYmosIGFjdGlvbiwgZW52LT5lbnZwKTsKKwlrZnJlZShlbnYpOworb3V0OgorCWlmIChyKSB7CisJCWRldnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKGtvYmosIEdGUF9LRVJORUwpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzeW50aCB1ZXZlbnQ6ICVzOiAlcyIsCisJCSAgICAgICBkZXZwYXRoID86ICJ1bmtub3duIGRldmljZSIsCisJCSAgICAgICBtc2cgPzogImZhaWxlZCB0byBzZW5kIHVldmVudCIpOworCQlrZnJlZShkZXZwYXRoKTsKKwl9CisJcmV0dXJuIHI7Cit9CisKKyNpZmRlZiBDT05GSUdfTkVUCitzdGF0aWMgaW50IGtvYmpfYmNhc3RfZmlsdGVyKHN0cnVjdCBzb2NrICpkc2ssIHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGtvYmplY3QgKmtvYmogPSBkYXRhLCAqa3NvYmo7CisJY29uc3Qgc3RydWN0IGtvYmpfbnNfdHlwZV9vcGVyYXRpb25zICpvcHM7CisKKwlvcHMgPSBrb2JqX25zX29wcyhrb2JqKTsKKwlpZiAoIW9wcyAmJiBrb2JqLT5rc2V0KSB7CisJCWtzb2JqID0gJmtvYmotPmtzZXQtPmtvYmo7CisJCWlmIChrc29iai0+cGFyZW50ICE9IE5VTEwpCisJCQlvcHMgPSBrb2JqX25zX29wcyhrc29iai0+cGFyZW50KTsKKwl9CisKKwlpZiAob3BzICYmIG9wcy0+bmV0bGlua19ucyAmJiBrb2JqLT5rdHlwZS0+bmFtZXNwYWNlKSB7CisJCWNvbnN0IHZvaWQgKnNvY2tfbnMsICpuczsKKwkJbnMgPSBrb2JqLT5rdHlwZS0+bmFtZXNwYWNlKGtvYmopOworCQlzb2NrX25zID0gb3BzLT5uZXRsaW5rX25zKGRzayk7CisJCXJldHVybiBzb2NrX25zICE9IG5zOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVUVWRU5UX0hFTFBFUgorc3RhdGljIGludCBrb2JqX3VzZXJtb2RlX2ZpbHRlcihzdHJ1Y3Qga29iamVjdCAqa29iaikKK3sKKwljb25zdCBzdHJ1Y3Qga29ial9uc190eXBlX29wZXJhdGlvbnMgKm9wczsKKworCW9wcyA9IGtvYmpfbnNfb3BzKGtvYmopOworCWlmIChvcHMpIHsKKwkJY29uc3Qgdm9pZCAqaW5pdF9ucywgKm5zOworCQlucyA9IGtvYmotPmt0eXBlLT5uYW1lc3BhY2Uoa29iaik7CisJCWluaXRfbnMgPSBvcHMtPmluaXRpYWxfbnMoKTsKKwkJcmV0dXJuIG5zICE9IGluaXRfbnM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF91ZXZlbnRfYXJndihzdHJ1Y3Qga29ial91ZXZlbnRfZW52ICplbnYsIGNvbnN0IGNoYXIgKnN1YnN5c3RlbSkKK3sKKwlpbnQgbGVuOworCisJbGVuID0gc3RybGNweSgmZW52LT5idWZbZW52LT5idWZsZW5dLCBzdWJzeXN0ZW0sCisJCSAgICAgIHNpemVvZihlbnYtPmJ1ZikgLSBlbnYtPmJ1Zmxlbik7CisJaWYgKGxlbiA+PSAoc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuKSkgeworCQlXQVJOKDEsIEtFUk5fRVJSICJpbml0X3VldmVudF9hcmd2OiBidWZmZXIgc2l6ZSB0b28gc21hbGxcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllbnYtPmFyZ3ZbMF0gPSB1ZXZlbnRfaGVscGVyOworCWVudi0+YXJndlsxXSA9ICZlbnYtPmJ1ZltlbnYtPmJ1Zmxlbl07CisJZW52LT5hcmd2WzJdID0gTlVMTDsKKworCWVudi0+YnVmbGVuICs9IGxlbiArIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFudXBfdWV2ZW50X2VudihzdHJ1Y3Qgc3VicHJvY2Vzc19pbmZvICppbmZvKQoreworCWtmcmVlKGluZm8tPmRhdGEpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHphcF9tb2RhbGlhc19lbnYoc3RydWN0IGtvYmpfdWV2ZW50X2VudiAqZW52KQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1vZGFsaWFzX3ByZWZpeFtdID0gIk1PREFMSUFTPSI7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW52LT5lbnZwX2lkeDspIHsKKwkJaWYgKHN0cm5jbXAoZW52LT5lbnZwW2ldLCBtb2RhbGlhc19wcmVmaXgsCisJCQkgICAgc2l6ZW9mKG1vZGFsaWFzX3ByZWZpeCkgLSAxKSkgeworCQkJaSsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaSAhPSBlbnYtPmVudnBfaWR4IC0gMSkKKwkJCW1lbW1vdmUoJmVudi0+ZW52cFtpXSwgJmVudi0+ZW52cFtpICsgMV0sCisJCQkJc2l6ZW9mKGVudi0+ZW52cFtpXSkgKiBlbnYtPmVudnBfaWR4IC0gMSk7CisKKwkJZW52LT5lbnZwX2lkeC0tOworCX0KK30KKworLyoqCisgKiBrb2JqZWN0X3VldmVudF9lbnYgLSBzZW5kIGFuIHVldmVudCB3aXRoIGVudmlyb25tZW50YWwgZGF0YQorICoKKyAqIEBrb2JqOiBzdHJ1Y3Qga29iamVjdCB0aGF0IHRoZSBhY3Rpb24gaXMgaGFwcGVuaW5nIHRvCisgKiBAYWN0aW9uOiBhY3Rpb24gdGhhdCBpcyBoYXBwZW5pbmcKKyAqIEBlbnZwX2V4dDogcG9pbnRlciB0byBlbnZpcm9ubWVudGFsIGRhdGEKKyAqCisgKiBSZXR1cm5zIDAgaWYga29iamVjdF91ZXZlbnRfZW52KCkgaXMgY29tcGxldGVkIHdpdGggc3VjY2VzcyBvciB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgZXJyb3Igd2hlbiBpdCBmYWlscy4KKyAqLworaW50IGtvYmplY3RfdWV2ZW50X2VudihzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24sCisJCSAgICAgICBjaGFyICplbnZwX2V4dFtdKQoreworCXN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudjsKKwljb25zdCBjaGFyICphY3Rpb25fc3RyaW5nID0ga29iamVjdF9hY3Rpb25zW2FjdGlvbl07CisJY29uc3QgY2hhciAqZGV2cGF0aCA9IE5VTEw7CisJY29uc3QgY2hhciAqc3Vic3lzdGVtOworCXN0cnVjdCBrb2JqZWN0ICp0b3Bfa29iajsKKwlzdHJ1Y3Qga3NldCAqa3NldDsKKwljb25zdCBzdHJ1Y3Qga3NldF91ZXZlbnRfb3BzICp1ZXZlbnRfb3BzOworCWludCBpID0gMDsKKwlpbnQgcmV0dmFsID0gMDsKKyNpZmRlZiBDT05GSUdfTkVUCisJc3RydWN0IHVldmVudF9zb2NrICp1ZV9zazsKKyNlbmRpZgorCisJLyoKKwkgKiBNYXJrICJyZW1vdmUiIGV2ZW50IGRvbmUgcmVnYXJkbGVzcyBvZiByZXN1bHQsIGZvciBzb21lIHN1YnN5c3RlbXMKKwkgKiBkbyBub3Qgd2FudCB0byByZS10cmlnZ2VyICJyZW1vdmUiIGV2ZW50IHZpYSBhdXRvbWF0aWMgY2xlYW51cC4KKwkgKi8KKwlpZiAoYWN0aW9uID09IEtPQkpfUkVNT1ZFKQorCQlrb2JqLT5zdGF0ZV9yZW1vdmVfdWV2ZW50X3NlbnQgPSAxOworCisJcHJfZGVidWcoImtvYmplY3Q6ICclcycgKCVwKTogJXNcbiIsCisJCSBrb2JqZWN0X25hbWUoa29iaiksIGtvYmosIF9fZnVuY19fKTsKKworCS8qIHNlYXJjaCB0aGUga3NldCB3ZSBiZWxvbmcgdG8gKi8KKwl0b3Bfa29iaiA9IGtvYmo7CisJd2hpbGUgKCF0b3Bfa29iai0+a3NldCAmJiB0b3Bfa29iai0+cGFyZW50KQorCQl0b3Bfa29iaiA9IHRvcF9rb2JqLT5wYXJlbnQ7CisKKwlpZiAoIXRvcF9rb2JqLT5rc2V0KSB7CisJCXByX2RlYnVnKCJrb2JqZWN0OiAnJXMnICglcCk6ICVzOiBhdHRlbXB0ZWQgdG8gc2VuZCB1ZXZlbnQgIgorCQkJICJ3aXRob3V0IGtzZXQhXG4iLCBrb2JqZWN0X25hbWUoa29iaiksIGtvYmosCisJCQkgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrc2V0ID0gdG9wX2tvYmotPmtzZXQ7CisJdWV2ZW50X29wcyA9IGtzZXQtPnVldmVudF9vcHM7CisKKwkvKiBza2lwIHRoZSBldmVudCwgaWYgdWV2ZW50X3N1cHByZXNzIGlzIHNldCovCisJaWYgKGtvYmotPnVldmVudF9zdXBwcmVzcykgeworCQlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiAlczogdWV2ZW50X3N1cHByZXNzICIKKwkJCQkgImNhdXNlZCB0aGUgZXZlbnQgdG8gZHJvcCFcbiIsCisJCQkJIGtvYmplY3RfbmFtZShrb2JqKSwga29iaiwgX19mdW5jX18pOworCQlyZXR1cm4gMDsKKwl9CisJLyogc2tpcCB0aGUgZXZlbnQsIGlmIHRoZSBmaWx0ZXIgcmV0dXJucyB6ZXJvLiAqLworCWlmICh1ZXZlbnRfb3BzICYmIHVldmVudF9vcHMtPmZpbHRlcikKKwkJaWYgKCF1ZXZlbnRfb3BzLT5maWx0ZXIoa3NldCwga29iaikpIHsKKwkJCXByX2RlYnVnKCJrb2JqZWN0OiAnJXMnICglcCk6ICVzOiBmaWx0ZXIgZnVuY3Rpb24gIgorCQkJCSAiY2F1c2VkIHRoZSBldmVudCB0byBkcm9wIVxuIiwKKwkJCQkga29iamVjdF9uYW1lKGtvYmopLCBrb2JqLCBfX2Z1bmNfXyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJLyogb3JpZ2luYXRpbmcgc3Vic3lzdGVtICovCisJaWYgKHVldmVudF9vcHMgJiYgdWV2ZW50X29wcy0+bmFtZSkKKwkJc3Vic3lzdGVtID0gdWV2ZW50X29wcy0+bmFtZShrc2V0LCBrb2JqKTsKKwllbHNlCisJCXN1YnN5c3RlbSA9IGtvYmplY3RfbmFtZSgma3NldC0+a29iaik7CisJaWYgKCFzdWJzeXN0ZW0pIHsKKwkJcHJfZGVidWcoImtvYmplY3Q6ICclcycgKCVwKTogJXM6IHVuc2V0IHN1YnN5c3RlbSBjYXVzZWQgdGhlICIKKwkJCSAiZXZlbnQgdG8gZHJvcCFcbiIsIGtvYmplY3RfbmFtZShrb2JqKSwga29iaiwKKwkJCSBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCS8qIGVudmlyb25tZW50IGJ1ZmZlciAqLworCWVudiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBrb2JqX3VldmVudF9lbnYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjb21wbGV0ZSBvYmplY3QgcGF0aCAqLworCWRldnBhdGggPSBrb2JqZWN0X2dldF9wYXRoKGtvYmosIEdGUF9LRVJORUwpOworCWlmICghZGV2cGF0aCkgeworCQlyZXR2YWwgPSAtRU5PRU5UOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogZGVmYXVsdCBrZXlzICovCisJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCAiQUNUSU9OPSVzIiwgYWN0aW9uX3N0cmluZyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBleGl0OworCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudiwgIkRFVlBBVEg9JXMiLCBkZXZwYXRoKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGV4aXQ7CisJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCAiU1VCU1lTVEVNPSVzIiwgc3Vic3lzdGVtKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGV4aXQ7CisKKwkvKiBrZXlzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIgKi8KKwlpZiAoZW52cF9leHQpIHsKKwkJZm9yIChpID0gMDsgZW52cF9leHRbaV07IGkrKykgeworCQkJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCAiJXMiLCBlbnZwX2V4dFtpXSk7CisJCQlpZiAocmV0dmFsKQorCQkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCS8qIGxldCB0aGUga3NldCBzcGVjaWZpYyBmdW5jdGlvbiBhZGQgaXRzIHN0dWZmICovCisJaWYgKHVldmVudF9vcHMgJiYgdWV2ZW50X29wcy0+dWV2ZW50KSB7CisJCXJldHZhbCA9IHVldmVudF9vcHMtPnVldmVudChrc2V0LCBrb2JqLCBlbnYpOworCQlpZiAocmV0dmFsKSB7CisJCQlwcl9kZWJ1Zygia29iamVjdDogJyVzJyAoJXApOiAlczogdWV2ZW50KCkgcmV0dXJuZWQgIgorCQkJCSAiJWRcbiIsIGtvYmplY3RfbmFtZShrb2JqKSwga29iaiwKKwkJCQkgX19mdW5jX18sIHJldHZhbCk7CisJCQlnb3RvIGV4aXQ7CisJCX0KKwl9CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgS09CSl9BREQ6CisJCS8qCisJCSAqIE1hcmsgImFkZCIgZXZlbnQgc28gd2UgY2FuIG1ha2Ugc3VyZSB3ZSBkZWxpdmVyICJyZW1vdmUiCisJCSAqIGV2ZW50IHRvIHVzZXJzcGFjZSBkdXJpbmcgYXV0b21hdGljIGNsZWFudXAuIElmCisJCSAqIHRoZSBvYmplY3QgZGlkIHNlbmQgYW4gImFkZCIgZXZlbnQsICJyZW1vdmUiIHdpbGwKKwkJICogYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIGNvcmUsIGlmIG5vdCBhbHJlYWR5IGRvbmUKKwkJICogYnkgdGhlIGNhbGxlci4KKwkJICovCisJCWtvYmotPnN0YXRlX2FkZF91ZXZlbnRfc2VudCA9IDE7CisJCWJyZWFrOworCisJY2FzZSBLT0JKX1VOQklORDoKKwkJemFwX21vZGFsaWFzX2VudihlbnYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW11dGV4X2xvY2soJnVldmVudF9zb2NrX211dGV4KTsKKwkvKiB3ZSB3aWxsIHNlbmQgYW4gZXZlbnQsIHNvIHJlcXVlc3QgYSBuZXcgc2VxdWVuY2UgbnVtYmVyICovCisJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCAiU0VRTlVNPSVsbHUiLCAodW5zaWduZWQgbG9uZyBsb25nKSsrdWV2ZW50X3NlcW51bSk7CisJaWYgKHJldHZhbCkgeworCQltdXRleF91bmxvY2soJnVldmVudF9zb2NrX211dGV4KTsKKwkJZ290byBleGl0OworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX05FVCkKKwkvKiBzZW5kIG5ldGxpbmsgbWVzc2FnZSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodWVfc2ssICZ1ZXZlbnRfc29ja19saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBzb2NrICp1ZXZlbnRfc29jayA9IHVlX3NrLT5zazsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJc2l6ZV90IGxlbjsKKworCQlpZiAoIW5ldGxpbmtfaGFzX2xpc3RlbmVycyh1ZXZlbnRfc29jaywgMSkpCisJCQljb250aW51ZTsKKworCQkvKiBhbGxvY2F0ZSBtZXNzYWdlIHdpdGggdGhlIG1heGltdW0gcG9zc2libGUgc2l6ZSAqLworCQlsZW4gPSBzdHJsZW4oYWN0aW9uX3N0cmluZykgKyBzdHJsZW4oZGV2cGF0aCkgKyAyOworCQlza2IgPSBhbGxvY19za2IobGVuICsgZW52LT5idWZsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoc2tiKSB7CisJCQljaGFyICpzY3JhdGNoOworCisJCQkvKiBhZGQgaGVhZGVyICovCisJCQlzY3JhdGNoID0gc2tiX3B1dChza2IsIGxlbik7CisJCQlzcHJpbnRmKHNjcmF0Y2gsICIlc0AlcyIsIGFjdGlvbl9zdHJpbmcsIGRldnBhdGgpOworCisJCQkvKiBjb3B5IGtleXMgdG8gb3VyIGNvbnRpbnVvdXMgZXZlbnQgcGF5bG9hZCBidWZmZXIgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBlbnYtPmVudnBfaWR4OyBpKyspIHsKKwkJCQlsZW4gPSBzdHJsZW4oZW52LT5lbnZwW2ldKSArIDE7CisJCQkJc2NyYXRjaCA9IHNrYl9wdXQoc2tiLCBsZW4pOworCQkJCXN0cmNweShzY3JhdGNoLCBlbnYtPmVudnBbaV0pOworCQkJfQorCisJCQlORVRMSU5LX0NCKHNrYikuZHN0X2dyb3VwID0gMTsKKwkJCXJldHZhbCA9IG5ldGxpbmtfYnJvYWRjYXN0X2ZpbHRlcmVkKHVldmVudF9zb2NrLCBza2IsCisJCQkJCQkJICAgIDAsIDEsIEdGUF9LRVJORUwsCisJCQkJCQkJICAgIGtvYmpfYmNhc3RfZmlsdGVyLAorCQkJCQkJCSAgICBrb2JqKTsKKwkJCS8qIEVOT0JVRlMgc2hvdWxkIGJlIGhhbmRsZWQgaW4gdXNlcnNwYWNlICovCisJCQlpZiAocmV0dmFsID09IC1FTk9CVUZTIHx8IHJldHZhbCA9PSAtRVNSQ0gpCisJCQkJcmV0dmFsID0gMDsKKwkJfSBlbHNlCisJCQlyZXR2YWwgPSAtRU5PTUVNOworCX0KKyNlbmRpZgorCW11dGV4X3VubG9jaygmdWV2ZW50X3NvY2tfbXV0ZXgpOworCisjaWZkZWYgQ09ORklHX1VFVkVOVF9IRUxQRVIKKwkvKiBjYWxsIHVldmVudF9oZWxwZXIsIHVzdWFsbHkgb25seSBlbmFibGVkIGR1cmluZyBlYXJseSBib290ICovCisJaWYgKHVldmVudF9oZWxwZXJbMF0gJiYgIWtvYmpfdXNlcm1vZGVfZmlsdGVyKGtvYmopKSB7CisJCXN0cnVjdCBzdWJwcm9jZXNzX2luZm8gKmluZm87CisKKwkJcmV0dmFsID0gYWRkX3VldmVudF92YXIoZW52LCAiSE9NRT0vIik7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGV4aXQ7CisJCXJldHZhbCA9IGFkZF91ZXZlbnRfdmFyKGVudiwKKwkJCQkJIlBBVEg9L3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4iKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gZXhpdDsKKwkJcmV0dmFsID0gaW5pdF91ZXZlbnRfYXJndihlbnYsIHN1YnN5c3RlbSk7CisJCWlmIChyZXR2YWwpCisJCQlnb3RvIGV4aXQ7CisKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJaW5mbyA9IGNhbGxfdXNlcm1vZGVoZWxwZXJfc2V0dXAoZW52LT5hcmd2WzBdLCBlbnYtPmFyZ3YsCisJCQkJCQkgZW52LT5lbnZwLCBHRlBfS0VSTkVMLAorCQkJCQkJIE5VTEwsIGNsZWFudXBfdWV2ZW50X2VudiwgZW52KTsKKwkJaWYgKGluZm8pIHsKKwkJCXJldHZhbCA9IGNhbGxfdXNlcm1vZGVoZWxwZXJfZXhlYyhpbmZvLCBVTUhfTk9fV0FJVCk7CisJCQllbnYgPSBOVUxMOwkvKiBmcmVlZCBieSBjbGVhbnVwX3VldmVudF9lbnYgKi8KKwkJfQorCX0KKyNlbmRpZgorCitleGl0OgorCWtmcmVlKGRldnBhdGgpOworCWtmcmVlKGVudik7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGtvYmplY3RfdWV2ZW50X2Vudik7CisKKy8qKgorICoga29iamVjdF91ZXZlbnQgLSBub3RpZnkgdXNlcnNwYWNlIGJ5IHNlbmRpbmcgYW4gdWV2ZW50CisgKgorICogQGtvYmo6IHN0cnVjdCBrb2JqZWN0IHRoYXQgdGhlIGFjdGlvbiBpcyBoYXBwZW5pbmcgdG8KKyAqIEBhY3Rpb246IGFjdGlvbiB0aGF0IGlzIGhhcHBlbmluZworICoKKyAqIFJldHVybnMgMCBpZiBrb2JqZWN0X3VldmVudCgpIGlzIGNvbXBsZXRlZCB3aXRoIHN1Y2Nlc3Mgb3IgdGhlCisgKiBjb3JyZXNwb25kaW5nIGVycm9yIHdoZW4gaXQgZmFpbHMuCisgKi8KK2ludCBrb2JqZWN0X3VldmVudChzdHJ1Y3Qga29iamVjdCAqa29iaiwgZW51bSBrb2JqZWN0X2FjdGlvbiBhY3Rpb24pCit7CisJcmV0dXJuIGtvYmplY3RfdWV2ZW50X2Vudihrb2JqLCBhY3Rpb24sIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa29iamVjdF91ZXZlbnQpOworCisvKioKKyAqIGFkZF91ZXZlbnRfdmFyIC0gYWRkIGtleSB2YWx1ZSBzdHJpbmcgdG8gdGhlIGVudmlyb25tZW50IGJ1ZmZlcgorICogQGVudjogZW52aXJvbm1lbnQgYnVmZmVyIHN0cnVjdHVyZQorICogQGZvcm1hdDogcHJpbnRmIGZvcm1hdCBmb3IgdGhlIGtleT12YWx1ZSBwYWlyCisgKgorICogUmV0dXJucyAwIGlmIGVudmlyb25tZW50IHZhcmlhYmxlIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3IgLUVOT01FTQorICogaWYgbm8gc3BhY2Ugd2FzIGF2YWlsYWJsZS4KKyAqLworaW50IGFkZF91ZXZlbnRfdmFyKHN0cnVjdCBrb2JqX3VldmVudF9lbnYgKmVudiwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBsZW47CisKKwlpZiAoZW52LT5lbnZwX2lkeCA+PSBBUlJBWV9TSVpFKGVudi0+ZW52cCkpIHsKKwkJV0FSTigxLCBLRVJOX0VSUiAiYWRkX3VldmVudF92YXI6IHRvbyBtYW55IGtleXNcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCWxlbiA9IHZzbnByaW50ZigmZW52LT5idWZbZW52LT5idWZsZW5dLAorCQkJc2l6ZW9mKGVudi0+YnVmKSAtIGVudi0+YnVmbGVuLAorCQkJZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlpZiAobGVuID49IChzaXplb2YoZW52LT5idWYpIC0gZW52LT5idWZsZW4pKSB7CisJCVdBUk4oMSwgS0VSTl9FUlIgImFkZF91ZXZlbnRfdmFyOiBidWZmZXIgc2l6ZSB0b28gc21hbGxcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwllbnYtPmVudnBbZW52LT5lbnZwX2lkeCsrXSA9ICZlbnYtPmJ1ZltlbnYtPmJ1Zmxlbl07CisJZW52LT5idWZsZW4gKz0gbGVuICsgMTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFkZF91ZXZlbnRfdmFyKTsKKworI2lmIGRlZmluZWQoQ09ORklHX05FVCkKK3N0YXRpYyBpbnQgdWV2ZW50X25ldF9pbml0KHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlzdHJ1Y3QgdWV2ZW50X3NvY2sgKnVlX3NrOworCXN0cnVjdCBuZXRsaW5rX2tlcm5lbF9jZmcgY2ZnID0geworCQkuZ3JvdXBzCT0gMSwKKwkJLmZsYWdzCT0gTkxfQ0ZHX0ZfTk9OUk9PVF9SRUNWLAorCX07CisKKwl1ZV9zayA9IGt6YWxsb2Moc2l6ZW9mKCp1ZV9zayksIEdGUF9LRVJORUwpOworCWlmICghdWVfc2spCisJCXJldHVybiAtRU5PTUVNOworCisJdWVfc2stPnNrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKG5ldCwgTkVUTElOS19LT0JKRUNUX1VFVkVOVCwgJmNmZyk7CisJaWYgKCF1ZV9zay0+c2spIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAia29iamVjdF91ZXZlbnQ6IHVuYWJsZSB0byBjcmVhdGUgbmV0bGluayBzb2NrZXQhXG4iKTsKKwkJa2ZyZWUodWVfc2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJbXV0ZXhfbG9jaygmdWV2ZW50X3NvY2tfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJnVlX3NrLT5saXN0LCAmdWV2ZW50X3NvY2tfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ1ZXZlbnRfc29ja19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVldmVudF9uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCit7CisJc3RydWN0IHVldmVudF9zb2NrICp1ZV9zazsKKworCW11dGV4X2xvY2soJnVldmVudF9zb2NrX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVlX3NrLCAmdWV2ZW50X3NvY2tfbGlzdCwgbGlzdCkgeworCQlpZiAoc29ja19uZXQodWVfc2stPnNrKSA9PSBuZXQpCisJCQlnb3RvIGZvdW5kOworCX0KKwltdXRleF91bmxvY2soJnVldmVudF9zb2NrX211dGV4KTsKKwlyZXR1cm47CisKK2ZvdW5kOgorCWxpc3RfZGVsKCZ1ZV9zay0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ1ZXZlbnRfc29ja19tdXRleCk7CisKKwluZXRsaW5rX2tlcm5lbF9yZWxlYXNlKHVlX3NrLT5zayk7CisJa2ZyZWUodWVfc2spOworfQorCitzdGF0aWMgc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIHVldmVudF9uZXRfb3BzID0geworCS5pbml0CT0gdWV2ZW50X25ldF9pbml0LAorCS5leGl0CT0gdWV2ZW50X25ldF9leGl0LAorfTsKKworc3RhdGljIGludCBfX2luaXQga29iamVjdF91ZXZlbnRfaW5pdCh2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZ1ZXZlbnRfbmV0X29wcyk7Cit9CisKKworcG9zdGNvcmVfaW5pdGNhbGwoa29iamVjdF91ZXZlbnRfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tzdHJ0b3guYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tzdHJ0b3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFhMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIva3N0cnRveC5jCkBAIC0wLDAgKzEsNDEwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIENvbnZlcnQgaW50ZWdlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gdG8gYW4gaW50ZWdlci4KKyAqIElmIGFuIGludGVnZXIgZG9lc24ndCBmaXQgaW50byBzcGVjaWZpZWQgdHlwZSwgLUUgaXMgcmV0dXJuZWQuCisgKgorICogSW50ZWdlciBzdGFydHMgd2l0aCBvcHRpb25hbCBzaWduLgorICoga3N0cnRvdSooKSBmdW5jdGlvbnMgZG8gbm90IGFjY2VwdCBzaWduICItIi4KKyAqCisgKiBSYWRpeCAwIG1lYW5zIGF1dG9kZXRlY3Rpb246IGxlYWRpbmcgIjB4IiBpbXBsaWVzIHJhZGl4IDE2LAorICogbGVhZGluZyAiMCIgaW1wbGllcyByYWRpeCA4LCBvdGhlcndpc2UgcmFkaXggaXMgMTAuCisgKiBBdXRvZGV0ZWN0aW9uIGhpbnRzIHdvcmsgYWZ0ZXIgb3B0aW9uYWwgc2lnbiwgYnV0IG5vdCBiZWZvcmUuCisgKgorICogSWYgLUUgaXMgcmV0dXJuZWQsIHJlc3VsdCBpcyBub3QgdG91Y2hlZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJrc3RydG94LmgiCisKK2NvbnN0IGNoYXIgKl9wYXJzZV9pbnRlZ2VyX2ZpeHVwX3JhZGl4KGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqYmFzZSkKK3sKKwlpZiAoKmJhc2UgPT0gMCkgeworCQlpZiAoc1swXSA9PSAnMCcpIHsKKwkJCWlmIChfdG9sb3dlcihzWzFdKSA9PSAneCcgJiYgaXN4ZGlnaXQoc1syXSkpCisJCQkJKmJhc2UgPSAxNjsKKwkJCWVsc2UKKwkJCQkqYmFzZSA9IDg7CisJCX0gZWxzZQorCQkJKmJhc2UgPSAxMDsKKwl9CisJaWYgKCpiYXNlID09IDE2ICYmIHNbMF0gPT0gJzAnICYmIF90b2xvd2VyKHNbMV0pID09ICd4JykKKwkJcyArPSAyOworCXJldHVybiBzOworfQorCisvKgorICogQ29udmVydCBub24tbmVnYXRpdmUgaW50ZWdlciBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gZXhwbGljaXRseSBnaXZlbiByYWRpeAorICogdG8gYW4gaW50ZWdlci4KKyAqIFJldHVybiBudW1iZXIgb2YgY2hhcmFjdGVycyBjb25zdW1lZCBtYXliZSBvci1lZCB3aXRoIG92ZXJmbG93IGJpdC4KKyAqIElmIG92ZXJmbG93IG9jY3VycywgcmVzdWx0IGludGVnZXIgKGluY29ycmVjdCkgaXMgc3RpbGwgcmV0dXJuZWQuCisgKgorICogRG9uJ3QgeW91IGRhcmUgdXNlIHRoaXMgZnVuY3Rpb24uCisgKi8KK3Vuc2lnbmVkIGludCBfcGFyc2VfaW50ZWdlcihjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgYmFzZSwgdW5zaWduZWQgbG9uZyBsb25nICpwKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXM7CisJdW5zaWduZWQgaW50IHJ2OworCisJcmVzID0gMDsKKwlydiA9IDA7CisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgaW50IGMgPSAqczsKKwkJdW5zaWduZWQgaW50IGxjID0gYyB8IDB4MjA7IC8qIGRvbid0IHRvbG93ZXIoKSB0aGlzIGxpbmUgKi8KKwkJdW5zaWduZWQgaW50IHZhbDsKKworCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpCisJCQl2YWwgPSBjIC0gJzAnOworCQllbHNlIGlmICgnYScgPD0gbGMgJiYgbGMgPD0gJ2YnKQorCQkJdmFsID0gbGMgLSAnYScgKyAxMDsKKwkJZWxzZQorCQkJYnJlYWs7CisKKwkJaWYgKHZhbCA+PSBiYXNlKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIENoZWNrIGZvciBvdmVyZmxvdyBvbmx5IGlmIHdlIGFyZSB3aXRoaW4gcmFuZ2Ugb2YKKwkJICogaXQgaW4gdGhlIG1heCBiYXNlIHdlIHN1cHBvcnQgKDE2KQorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHJlcyAmICh+MHVsbCA8PCA2MCkpKSB7CisJCQlpZiAocmVzID4gZGl2X3U2NChVTExPTkdfTUFYIC0gdmFsLCBiYXNlKSkKKwkJCQlydiB8PSBLU1RSVE9YX09WRVJGTE9XOworCQl9CisJCXJlcyA9IHJlcyAqIGJhc2UgKyB2YWw7CisJCXJ2Kys7CisJCXMrKzsKKwl9CisJKnAgPSByZXM7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IF9rc3RydG91bGwoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBfcmVzOworCXVuc2lnbmVkIGludCBydjsKKworCXMgPSBfcGFyc2VfaW50ZWdlcl9maXh1cF9yYWRpeChzLCAmYmFzZSk7CisJcnYgPSBfcGFyc2VfaW50ZWdlcihzLCBiYXNlLCAmX3Jlcyk7CisJaWYgKHJ2ICYgS1NUUlRPWF9PVkVSRkxPVykKKwkJcmV0dXJuIC1FUkFOR0U7CisJaWYgKHJ2ID09IDApCisJCXJldHVybiAtRUlOVkFMOworCXMgKz0gcnY7CisJaWYgKCpzID09ICdcbicpCisJCXMrKzsKKwlpZiAoKnMpCisJCXJldHVybiAtRUlOVkFMOworCSpyZXMgPSBfcmVzOworCXJldHVybiAwOworfQorCisvKioKKyAqIGtzdHJ0b3VsbCAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYW4gdW5zaWduZWQgbG9uZyBsb25nCisgKiBAczogVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcuIFRoZSBzdHJpbmcgbXVzdCBiZSBudWxsLXRlcm1pbmF0ZWQsIGFuZCBtYXkgYWxzbworICogIGluY2x1ZGUgYSBzaW5nbGUgbmV3bGluZSBiZWZvcmUgaXRzIHRlcm1pbmF0aW5nIG51bGwuIFRoZSBmaXJzdCBjaGFyYWN0ZXIKKyAqICBtYXkgYWxzbyBiZSBhIHBsdXMgc2lnbiwgYnV0IG5vdCBhIG1pbnVzIHNpZ24uCisgKiBAYmFzZTogVGhlIG51bWJlciBiYXNlIHRvIHVzZS4gVGhlIG1heGltdW0gc3VwcG9ydGVkIGJhc2UgaXMgMTYuIElmIGJhc2UgaXMKKyAqICBnaXZlbiBhcyAwLCB0aGVuIHRoZSBiYXNlIG9mIHRoZSBzdHJpbmcgaXMgYXV0b21hdGljYWxseSBkZXRlY3RlZCB3aXRoIHRoZQorICogIGNvbnZlbnRpb25hbCBzZW1hbnRpY3MgLSBJZiBpdCBiZWdpbnMgd2l0aCAweCB0aGUgbnVtYmVyIHdpbGwgYmUgcGFyc2VkIGFzIGEKKyAqICBoZXhhZGVjaW1hbCAoY2FzZSBpbnNlbnNpdGl2ZSksIGlmIGl0IG90aGVyd2lzZSBiZWdpbnMgd2l0aCAwLCBpdCB3aWxsIGJlCisgKiAgcGFyc2VkIGFzIGFuIG9jdGFsIG51bWJlci4gT3RoZXJ3aXNlIGl0IHdpbGwgYmUgcGFyc2VkIGFzIGEgZGVjaW1hbC4KKyAqIEByZXM6IFdoZXJlIHRvIHdyaXRlIHRoZSByZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24gb24gc3VjY2Vzcy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVSQU5HRSBvbiBvdmVyZmxvdyBhbmQgLUVJTlZBTCBvbiBwYXJzaW5nIGVycm9yLgorICogVXNlZCBhcyBhIHJlcGxhY2VtZW50IGZvciB0aGUgb2Jzb2xldGUgc2ltcGxlX3N0cnRvdWxsLiBSZXR1cm4gY29kZSBtdXN0CisgKiBiZSBjaGVja2VkLgorICovCitpbnQga3N0cnRvdWxsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCB1bnNpZ25lZCBsb25nIGxvbmcgKnJlcykKK3sKKwlpZiAoc1swXSA9PSAnKycpCisJCXMrKzsKKwlyZXR1cm4gX2tzdHJ0b3VsbChzLCBiYXNlLCByZXMpOworfQorRVhQT1JUX1NZTUJPTChrc3RydG91bGwpOworCisvKioKKyAqIGtzdHJ0b2xsIC0gY29udmVydCBhIHN0cmluZyB0byBhIGxvbmcgbG9uZworICogQHM6IFRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkLCBhbmQgbWF5IGFsc28KKyAqICBpbmNsdWRlIGEgc2luZ2xlIG5ld2xpbmUgYmVmb3JlIGl0cyB0ZXJtaW5hdGluZyBudWxsLiBUaGUgZmlyc3QgY2hhcmFjdGVyCisgKiAgbWF5IGFsc28gYmUgYSBwbHVzIHNpZ24gb3IgYSBtaW51cyBzaWduLgorICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UuIFRoZSBtYXhpbXVtIHN1cHBvcnRlZCBiYXNlIGlzIDE2LiBJZiBiYXNlIGlzCisgKiAgZ2l2ZW4gYXMgMCwgdGhlbiB0aGUgYmFzZSBvZiB0aGUgc3RyaW5nIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgd2l0aCB0aGUKKyAqICBjb252ZW50aW9uYWwgc2VtYW50aWNzIC0gSWYgaXQgYmVnaW5zIHdpdGggMHggdGhlIG51bWJlciB3aWxsIGJlIHBhcnNlZCBhcyBhCisgKiAgaGV4YWRlY2ltYWwgKGNhc2UgaW5zZW5zaXRpdmUpLCBpZiBpdCBvdGhlcndpc2UgYmVnaW5zIHdpdGggMCwgaXQgd2lsbCBiZQorICogIHBhcnNlZCBhcyBhbiBvY3RhbCBudW1iZXIuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHBhcnNlZCBhcyBhIGRlY2ltYWwuCisgKiBAcmVzOiBXaGVyZSB0byB3cml0ZSB0aGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIG9uIHN1Y2Nlc3MuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FUkFOR0Ugb24gb3ZlcmZsb3cgYW5kIC1FSU5WQUwgb24gcGFyc2luZyBlcnJvci4KKyAqIFVzZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIG9ic29sZXRlIHNpbXBsZV9zdHJ0b3VsbC4gUmV0dXJuIGNvZGUgbXVzdAorICogYmUgY2hlY2tlZC4KKyAqLworaW50IGtzdHJ0b2xsKGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCBsb25nIGxvbmcgKnJlcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOworCWludCBydjsKKworCWlmIChzWzBdID09ICctJykgeworCQlydiA9IF9rc3RydG91bGwocyArIDEsIGJhc2UsICZ0bXApOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIHJ2OworCQlpZiAoKGxvbmcgbG9uZyktdG1wID4gMCkKKwkJCXJldHVybiAtRVJBTkdFOworCQkqcmVzID0gLXRtcDsKKwl9IGVsc2UgeworCQlydiA9IGtzdHJ0b3VsbChzLCBiYXNlLCAmdG1wKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKwkJaWYgKChsb25nIGxvbmcpdG1wIDwgMCkKKwkJCXJldHVybiAtRVJBTkdFOworCQkqcmVzID0gdG1wOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woa3N0cnRvbGwpOworCisvKiBJbnRlcm5hbCwgZG8gbm90IHVzZS4gKi8KK2ludCBfa3N0cnRvdWwoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgKnJlcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOworCWludCBydjsKKworCXJ2ID0ga3N0cnRvdWxsKHMsIGJhc2UsICZ0bXApOworCWlmIChydiA8IDApCisJCXJldHVybiBydjsKKwlpZiAodG1wICE9ICh1bnNpZ25lZCBsb25nIGxvbmcpKHVuc2lnbmVkIGxvbmcpdG1wKQorCQlyZXR1cm4gLUVSQU5HRTsKKwkqcmVzID0gdG1wOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChfa3N0cnRvdWwpOworCisvKiBJbnRlcm5hbCwgZG8gbm90IHVzZS4gKi8KK2ludCBfa3N0cnRvbChjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBpbnQgYmFzZSwgbG9uZyAqcmVzKQoreworCWxvbmcgbG9uZyB0bXA7CisJaW50IHJ2OworCisJcnYgPSBrc3RydG9sbChzLCBiYXNlLCAmdG1wKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisJaWYgKHRtcCAhPSAobG9uZyBsb25nKShsb25nKXRtcCkKKwkJcmV0dXJuIC1FUkFOR0U7CisJKnJlcyA9IHRtcDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX2tzdHJ0b2wpOworCisvKioKKyAqIGtzdHJ0b3VpbnQgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGludAorICogQHM6IFRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLiBUaGUgc3RyaW5nIG11c3QgYmUgbnVsbC10ZXJtaW5hdGVkLCBhbmQgbWF5IGFsc28KKyAqICBpbmNsdWRlIGEgc2luZ2xlIG5ld2xpbmUgYmVmb3JlIGl0cyB0ZXJtaW5hdGluZyBudWxsLiBUaGUgZmlyc3QgY2hhcmFjdGVyCisgKiAgbWF5IGFsc28gYmUgYSBwbHVzIHNpZ24sIGJ1dCBub3QgYSBtaW51cyBzaWduLgorICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UuIFRoZSBtYXhpbXVtIHN1cHBvcnRlZCBiYXNlIGlzIDE2LiBJZiBiYXNlIGlzCisgKiAgZ2l2ZW4gYXMgMCwgdGhlbiB0aGUgYmFzZSBvZiB0aGUgc3RyaW5nIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgd2l0aCB0aGUKKyAqICBjb252ZW50aW9uYWwgc2VtYW50aWNzIC0gSWYgaXQgYmVnaW5zIHdpdGggMHggdGhlIG51bWJlciB3aWxsIGJlIHBhcnNlZCBhcyBhCisgKiAgaGV4YWRlY2ltYWwgKGNhc2UgaW5zZW5zaXRpdmUpLCBpZiBpdCBvdGhlcndpc2UgYmVnaW5zIHdpdGggMCwgaXQgd2lsbCBiZQorICogIHBhcnNlZCBhcyBhbiBvY3RhbCBudW1iZXIuIE90aGVyd2lzZSBpdCB3aWxsIGJlIHBhcnNlZCBhcyBhIGRlY2ltYWwuCisgKiBAcmVzOiBXaGVyZSB0byB3cml0ZSB0aGUgcmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uIG9uIHN1Y2Nlc3MuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FUkFOR0Ugb24gb3ZlcmZsb3cgYW5kIC1FSU5WQUwgb24gcGFyc2luZyBlcnJvci4KKyAqIFVzZWQgYXMgYSByZXBsYWNlbWVudCBmb3IgdGhlIG9ic29sZXRlIHNpbXBsZV9zdHJ0b3VsbC4gUmV0dXJuIGNvZGUgbXVzdAorICogYmUgY2hlY2tlZC4KKyAqLworaW50IGtzdHJ0b3VpbnQoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGludCAqcmVzKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXA7CisJaW50IHJ2OworCisJcnYgPSBrc3RydG91bGwocywgYmFzZSwgJnRtcCk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIHJ2OworCWlmICh0bXAgIT0gKHVuc2lnbmVkIGxvbmcgbG9uZykodW5zaWduZWQgaW50KXRtcCkKKwkJcmV0dXJuIC1FUkFOR0U7CisJKnJlcyA9IHRtcDsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woa3N0cnRvdWludCk7CisKKy8qKgorICoga3N0cnRvaW50IC0gY29udmVydCBhIHN0cmluZyB0byBhbiBpbnQKKyAqIEBzOiBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZy4gVGhlIHN0cmluZyBtdXN0IGJlIG51bGwtdGVybWluYXRlZCwgYW5kIG1heSBhbHNvCisgKiAgaW5jbHVkZSBhIHNpbmdsZSBuZXdsaW5lIGJlZm9yZSBpdHMgdGVybWluYXRpbmcgbnVsbC4gVGhlIGZpcnN0IGNoYXJhY3RlcgorICogIG1heSBhbHNvIGJlIGEgcGx1cyBzaWduIG9yIGEgbWludXMgc2lnbi4KKyAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlLiBUaGUgbWF4aW11bSBzdXBwb3J0ZWQgYmFzZSBpcyAxNi4gSWYgYmFzZSBpcworICogIGdpdmVuIGFzIDAsIHRoZW4gdGhlIGJhc2Ugb2YgdGhlIHN0cmluZyBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIHdpdGggdGhlCisgKiAgY29udmVudGlvbmFsIHNlbWFudGljcyAtIElmIGl0IGJlZ2lucyB3aXRoIDB4IHRoZSBudW1iZXIgd2lsbCBiZSBwYXJzZWQgYXMgYQorICogIGhleGFkZWNpbWFsIChjYXNlIGluc2Vuc2l0aXZlKSwgaWYgaXQgb3RoZXJ3aXNlIGJlZ2lucyB3aXRoIDAsIGl0IHdpbGwgYmUKKyAqICBwYXJzZWQgYXMgYW4gb2N0YWwgbnVtYmVyLiBPdGhlcndpc2UgaXQgd2lsbCBiZSBwYXJzZWQgYXMgYSBkZWNpbWFsLgorICogQHJlczogV2hlcmUgdG8gd3JpdGUgdGhlIHJlc3VsdCBvZiB0aGUgY29udmVyc2lvbiBvbiBzdWNjZXNzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRVJBTkdFIG9uIG92ZXJmbG93IGFuZCAtRUlOVkFMIG9uIHBhcnNpbmcgZXJyb3IuCisgKiBVc2VkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBvYnNvbGV0ZSBzaW1wbGVfc3RydG91bGwuIFJldHVybiBjb2RlIG11c3QKKyAqIGJlIGNoZWNrZWQuCisgKi8KK2ludCBrc3RydG9pbnQoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIGludCAqcmVzKQoreworCWxvbmcgbG9uZyB0bXA7CisJaW50IHJ2OworCisJcnYgPSBrc3RydG9sbChzLCBiYXNlLCAmdG1wKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisJaWYgKHRtcCAhPSAobG9uZyBsb25nKShpbnQpdG1wKQorCQlyZXR1cm4gLUVSQU5HRTsKKwkqcmVzID0gdG1wOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChrc3RydG9pbnQpOworCitpbnQga3N0cnRvdTE2KGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCB1MTYgKnJlcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOworCWludCBydjsKKworCXJ2ID0ga3N0cnRvdWxsKHMsIGJhc2UsICZ0bXApOworCWlmIChydiA8IDApCisJCXJldHVybiBydjsKKwlpZiAodG1wICE9ICh1bnNpZ25lZCBsb25nIGxvbmcpKHUxNil0bXApCisJCXJldHVybiAtRVJBTkdFOworCSpyZXMgPSB0bXA7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGtzdHJ0b3UxNik7CisKK2ludCBrc3RydG9zMTYoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHMxNiAqcmVzKQoreworCWxvbmcgbG9uZyB0bXA7CisJaW50IHJ2OworCisJcnYgPSBrc3RydG9sbChzLCBiYXNlLCAmdG1wKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisJaWYgKHRtcCAhPSAobG9uZyBsb25nKShzMTYpdG1wKQorCQlyZXR1cm4gLUVSQU5HRTsKKwkqcmVzID0gdG1wOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChrc3RydG9zMTYpOworCitpbnQga3N0cnRvdTgoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHU4ICpyZXMpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKKwlpbnQgcnY7CisKKwlydiA9IGtzdHJ0b3VsbChzLCBiYXNlLCAmdG1wKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisJaWYgKHRtcCAhPSAodW5zaWduZWQgbG9uZyBsb25nKSh1OCl0bXApCisJCXJldHVybiAtRVJBTkdFOworCSpyZXMgPSB0bXA7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGtzdHJ0b3U4KTsKKworaW50IGtzdHJ0b3M4KGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCBiYXNlLCBzOCAqcmVzKQoreworCWxvbmcgbG9uZyB0bXA7CisJaW50IHJ2OworCisJcnYgPSBrc3RydG9sbChzLCBiYXNlLCAmdG1wKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gcnY7CisJaWYgKHRtcCAhPSAobG9uZyBsb25nKShzOCl0bXApCisJCXJldHVybiAtRVJBTkdFOworCSpyZXMgPSB0bXA7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGtzdHJ0b3M4KTsKKworLyoqCisgKiBrc3RydG9ib29sIC0gY29udmVydCBjb21tb24gdXNlciBpbnB1dHMgaW50byBib29sZWFuIHZhbHVlcworICogQHM6IGlucHV0IHN0cmluZworICogQHJlczogcmVzdWx0CisgKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgMCBpZmYgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyBvbmUgb2YgJ1l5MU5uMCcsIG9yCisgKiBbb09dW05uRmZdIGZvciAib24iIGFuZCAib2ZmIi4gT3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuIC1FSU5WQUwuICBWYWx1ZQorICogcG9pbnRlZCB0byBieSByZXMgaXMgdXBkYXRlZCB1cG9uIGZpbmRpbmcgYSBtYXRjaC4KKyAqLworaW50IGtzdHJ0b2Jvb2woY29uc3QgY2hhciAqcywgYm9vbCAqcmVzKQoreworCWlmICghcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKHNbMF0pIHsKKwljYXNlICd5JzoKKwljYXNlICdZJzoKKwljYXNlICcxJzoKKwkJKnJlcyA9IHRydWU7CisJCXJldHVybiAwOworCWNhc2UgJ24nOgorCWNhc2UgJ04nOgorCWNhc2UgJzAnOgorCQkqcmVzID0gZmFsc2U7CisJCXJldHVybiAwOworCWNhc2UgJ28nOgorCWNhc2UgJ08nOgorCQlzd2l0Y2ggKHNbMV0pIHsKKwkJY2FzZSAnbic6CisJCWNhc2UgJ04nOgorCQkJKnJlcyA9IHRydWU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnZic6CisJCWNhc2UgJ0YnOgorCQkJKnJlcyA9IGZhbHNlOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChrc3RydG9ib29sKTsKKworLyoKKyAqIFNpbmNlICJiYXNlIiB3b3VsZCBiZSBhIG5vbnNlbnNlIGFyZ3VtZW50LCB0aGlzIG9wZW4tY29kZXMgdGhlCisgKiBfZnJvbV91c2VyIGhlbHBlciBpbnN0ZWFkIG9mIHVzaW5nIHRoZSBoZWxwZXIgbWFjcm8gYmVsb3cuCisgKi8KK2ludCBrc3RydG9ib29sX2Zyb21fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqcywgc2l6ZV90IGNvdW50LCBib29sICpyZXMpCit7CisJLyogTG9uZ2VzdCBzdHJpbmcgbmVlZGVkIHRvIGRpZmZlcmVudGlhdGUsIG5ld2xpbmUsIHRlcm1pbmF0b3IgKi8KKwljaGFyIGJ1Zls0XTsKKworCWNvdW50ID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHMsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2NvdW50XSA9ICdcMCc7CisJcmV0dXJuIGtzdHJ0b2Jvb2woYnVmLCByZXMpOworfQorRVhQT1JUX1NZTUJPTChrc3RydG9ib29sX2Zyb21fdXNlcik7CisKKyNkZWZpbmUga3N0cnRvX2Zyb21fdXNlcihmLCBnLCB0eXBlKQkJCQkJXAoraW50IGYoY29uc3QgY2hhciBfX3VzZXIgKnMsIHNpemVfdCBjb3VudCwgdW5zaWduZWQgaW50IGJhc2UsIHR5cGUgKnJlcykJXAorewkJCQkJCQkJCVwKKwkvKiBzaWduLCBiYXNlIDIgcmVwcmVzZW50YXRpb24sIG5ld2xpbmUsIHRlcm1pbmF0b3IgKi8JCVwKKwljaGFyIGJ1ZlsxICsgc2l6ZW9mKHR5cGUpICogOCArIDEgKyAxXTsJCQkJXAorCQkJCQkJCQkJXAorCWNvdW50ID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOwkJCQlcCisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgcywgY291bnQpKQkJCQlcCisJCXJldHVybiAtRUZBVUxUOwkJCQkJCVwKKwlidWZbY291bnRdID0gJ1wwJzsJCQkJCQlcCisJcmV0dXJuIGcoYnVmLCBiYXNlLCByZXMpOwkJCQkJXAorfQkJCQkJCQkJCVwKK0VYUE9SVF9TWU1CT0woZikKKwora3N0cnRvX2Zyb21fdXNlcihrc3RydG91bGxfZnJvbV91c2VyLAlrc3RydG91bGwsCXVuc2lnbmVkIGxvbmcgbG9uZyk7Citrc3RydG9fZnJvbV91c2VyKGtzdHJ0b2xsX2Zyb21fdXNlciwJa3N0cnRvbGwsCWxvbmcgbG9uZyk7Citrc3RydG9fZnJvbV91c2VyKGtzdHJ0b3VsX2Zyb21fdXNlciwJa3N0cnRvdWwsCXVuc2lnbmVkIGxvbmcpOwora3N0cnRvX2Zyb21fdXNlcihrc3RydG9sX2Zyb21fdXNlciwJa3N0cnRvbCwJbG9uZyk7Citrc3RydG9fZnJvbV91c2VyKGtzdHJ0b3VpbnRfZnJvbV91c2VyLAlrc3RydG91aW50LAl1bnNpZ25lZCBpbnQpOwora3N0cnRvX2Zyb21fdXNlcihrc3RydG9pbnRfZnJvbV91c2VyLAlrc3RydG9pbnQsCWludCk7Citrc3RydG9fZnJvbV91c2VyKGtzdHJ0b3UxNl9mcm9tX3VzZXIsCWtzdHJ0b3UxNiwJdTE2KTsKK2tzdHJ0b19mcm9tX3VzZXIoa3N0cnRvczE2X2Zyb21fdXNlciwJa3N0cnRvczE2LAlzMTYpOwora3N0cnRvX2Zyb21fdXNlcihrc3RydG91OF9mcm9tX3VzZXIsCWtzdHJ0b3U4LAl1OCk7Citrc3RydG9fZnJvbV91c2VyKGtzdHJ0b3M4X2Zyb21fdXNlciwJa3N0cnRvczgsCXM4KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tzdHJ0b3guaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2tzdHJ0b3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ2MzdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIva3N0cnRveC5oCkBAIC0wLDAgKzEsOSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyNpZm5kZWYgX0xJQl9LU1RSVE9YX0gKKyNkZWZpbmUgX0xJQl9LU1RSVE9YX0gKKworI2RlZmluZSBLU1RSVE9YX09WRVJGTE9XCSgxVSA8PCAzMSkKK2NvbnN0IGNoYXIgKl9wYXJzZV9pbnRlZ2VyX2ZpeHVwX3JhZGl4KGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGludCAqYmFzZSk7Cit1bnNpZ25lZCBpbnQgX3BhcnNlX2ludGVnZXIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgaW50IGJhc2UsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcmVzKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sY20uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xjbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZDdmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sY20uYwpAQCAtMCwwICsxLDI1IEBACisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9nY2QuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9sY20uaD4KKworLyogTG93ZXN0IGNvbW1vbiBtdWx0aXBsZSAqLwordW5zaWduZWQgbG9uZyBsY20odW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIpCit7CisJaWYgKGEgJiYgYikKKwkJcmV0dXJuIChhIC8gZ2NkKGEsIGIpKSAqIGI7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxjbSk7CisKK3Vuc2lnbmVkIGxvbmcgbGNtX25vdF96ZXJvKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiKQoreworCXVuc2lnbmVkIGxvbmcgbCA9IGxjbShhLCBiKTsKKworCWlmIChsKQorCQlyZXR1cm4gbDsKKworCXJldHVybiAoYiA/IDogYSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsY21fbm90X3plcm8pOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbGliY3JjMzJjLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9saWJjcmMzMmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Zjc5NTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbGliY3JjMzJjLmMKQEAgLTAsMCArMSw4MCBAQAorLyogCisgKiBDUkMzMkMKKyAqQEFydGljbGV7Y2FzdGFnbm9saS1jcmMsCisgKiBhdXRob3IgPSAgICAgICB7IEd1eSBDYXN0YWdub2xpIGFuZCBTdGVmYW4gQnJhZXVlciBhbmQgTWFydGluIEhlcnJtYW59LAorICogdGl0bGUgPSAgICAgICAge3tPcHRpbWl6YXRpb24gb2YgQ3ljbGljIFJlZHVuZGFuY3ktQ2hlY2sgQ29kZXMgd2l0aCAyNAorICogICAgICAgICAgICAgICAgIGFuZCAzMiBQYXJpdHkgQml0c319LAorICogam91cm5hbCA9ICAgICAgSUVFRSBUcmFuc2FjdGlvbnMgb24gQ29tbXVuaWNhdGlvbiwKKyAqIHllYXIgPSAgICAgICAgIHsxOTkzfSwKKyAqIHZvbHVtZSA9ICAgICAgIHs0MX0sCisgKiBudW1iZXIgPSAgICAgICB7Nn0sCisgKiBwYWdlcyA9ICAgICAgICB7fSwKKyAqIG1vbnRoID0gICAgICAgIHtKdW5lfSwKKyAqfQorICogVXNlZCBieSB0aGUgaVNDU0kgZHJpdmVyLCBwb3NzaWJseSBvdGhlcnMsIGFuZCBkZXJpdmVkIGZyb20gdGhlCisgKiB0aGUgaXNjc2ktY3JjLmMgbW9kdWxlIG9mIHRoZSBsaW51eC1pc2NzaSBkcml2ZXIgYXQKKyAqIGh0dHA6Ly9saW51eC1pc2NzaS5zb3VyY2Vmb3JnZS5uZXQuCisgKgorICogRm9sbG93aW5nIHRoZSBleGFtcGxlIG9mIGxpYi9jcmMzMiwgdGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZQorICogZmxleGlibGUgYW5kIHVzZWZ1bCBmb3IgYWxsIHVzZXJzLiAgTW9kdWxlcyB0aGF0IGN1cnJlbnRseSBoYXZlIHRoZWlyCisgKiBvd24gY3JjMzJjLCBidXQgaG9wZWZ1bGx5IG1heSBiZSBhYmxlIHRvIHVzZSB0aGlzIG9uZSBhcmU6CisgKiAgbmV0L3NjdHAgKHBsZWFzZSBhZGQgYWxsIHlvdXIgZG9jbyB0byBoZXJlIGlmIHlvdSBjaGFuZ2UgdG8KKyAqICAgICAgICAgICAgdXNlIHRoaXMgb25lISkKKyAqICA8ZW5kb2ZsaXN0PgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBDaXNjbyBTeXN0ZW1zLCBJbmMuCisgKiAKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKKyAqIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8Y3J5cHRvL2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzJjLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY3J5cHRvX3NoYXNoICp0Zm07CisKK3UzMiBjcmMzMmModTMyIGNyYywgY29uc3Qgdm9pZCAqYWRkcmVzcywgdW5zaWduZWQgaW50IGxlbmd0aCkKK3sKKwlTSEFTSF9ERVNDX09OX1NUQUNLKHNoYXNoLCB0Zm0pOworCXUzMiByZXQsICpjdHggPSAodTMyICopc2hhc2hfZGVzY19jdHgoc2hhc2gpOworCWludCBlcnI7CisKKwlzaGFzaC0+dGZtID0gdGZtOworCXNoYXNoLT5mbGFncyA9IDA7CisJKmN0eCA9IGNyYzsKKworCWVyciA9IGNyeXB0b19zaGFzaF91cGRhdGUoc2hhc2gsIGFkZHJlc3MsIGxlbmd0aCk7CisJQlVHX09OKGVycik7CisKKwlyZXQgPSAqY3R4OworCWJhcnJpZXJfZGF0YShjdHgpOworCXJldHVybiByZXQ7Cit9CisKK0VYUE9SVF9TWU1CT0woY3JjMzJjKTsKKworc3RhdGljIGludCBfX2luaXQgbGliY3JjMzJjX21vZF9pbml0KHZvaWQpCit7CisJdGZtID0gY3J5cHRvX2FsbG9jX3NoYXNoKCJjcmMzMmMiLCAwLCAwKTsKKwlyZXR1cm4gUFRSX0VSUl9PUl9aRVJPKHRmbSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBsaWJjcmMzMmNfbW9kX2Zpbmkodm9pZCkKK3sKKwljcnlwdG9fZnJlZV9zaGFzaCh0Zm0pOworfQorCittb2R1bGVfaW5pdChsaWJjcmMzMmNfbW9kX2luaXQpOworbW9kdWxlX2V4aXQobGliY3JjMzJjX21vZF9maW5pKTsKKworTU9EVUxFX0FVVEhPUigiQ2xheSBIYWFwYWxhIDxjaGFhcGFsYUBjaXNjby5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNSQzMyYyAoQ2FzdGFnbm9saSkgY2FsY3VsYXRpb25zIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfU09GVERFUCgicHJlOiBjcmMzMmMiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xpc3RfZGVidWcuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xpc3RfZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzRkYjhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbGlzdF9kZWJ1Zy5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiwgUmVkIEhhdCwgSW5jLiwgRGF2ZSBKb25lcworICogUmVsZWFzZWQgdW5kZXIgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkuCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaW5rZWQgbGlzdCB2YWxpZGF0aW9uIGZvciBERUJVR19MSVNULgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorCisvKgorICogQ2hlY2sgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgbGlzdCBtYW5pcHVsYXRpb25zIGFyZSByZWFzb25hYmx5CisgKiB2YWxpZC4gRmFpbHVyZXMgaGVyZSBpbmRpY2F0ZSBtZW1vcnkgY29ycnVwdGlvbiAoYW5kIHBvc3NpYmx5IGFuIGV4cGxvaXQKKyAqIGF0dGVtcHQpLgorICovCisKK2Jvb2wgX19saXN0X2FkZF92YWxpZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKnByZXYsCisJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQpCit7CisJaWYgKENIRUNLX0RBVEFfQ09SUlVQVElPTihuZXh0LT5wcmV2ICE9IHByZXYsCisJCQkibGlzdF9hZGQgY29ycnVwdGlvbi4gbmV4dC0+cHJldiBzaG91bGQgYmUgcHJldiAoJXApLCBidXQgd2FzICVwLiAobmV4dD0lcCkuXG4iLAorCQkJcHJldiwgbmV4dC0+cHJldiwgbmV4dCkgfHwKKwkgICAgQ0hFQ0tfREFUQV9DT1JSVVBUSU9OKHByZXYtPm5leHQgIT0gbmV4dCwKKwkJCSJsaXN0X2FkZCBjb3JydXB0aW9uLiBwcmV2LT5uZXh0IHNob3VsZCBiZSBuZXh0ICglcCksIGJ1dCB3YXMgJXAuIChwcmV2PSVwKS5cbiIsCisJCQluZXh0LCBwcmV2LT5uZXh0LCBwcmV2KSB8fAorCSAgICBDSEVDS19EQVRBX0NPUlJVUFRJT04obmV3ID09IHByZXYgfHwgbmV3ID09IG5leHQsCisJCQkibGlzdF9hZGQgZG91YmxlIGFkZDogbmV3PSVwLCBwcmV2PSVwLCBuZXh0PSVwLlxuIiwKKwkJCW5ldywgcHJldiwgbmV4dCkpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChfX2xpc3RfYWRkX3ZhbGlkKTsKKworYm9vbCBfX2xpc3RfZGVsX2VudHJ5X3ZhbGlkKHN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5KQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnByZXYsICpuZXh0OworCisJcHJldiA9IGVudHJ5LT5wcmV2OworCW5leHQgPSBlbnRyeS0+bmV4dDsKKworCWlmIChDSEVDS19EQVRBX0NPUlJVUFRJT04obmV4dCA9PSBMSVNUX1BPSVNPTjEsCisJCQkibGlzdF9kZWwgY29ycnVwdGlvbiwgJXAtPm5leHQgaXMgTElTVF9QT0lTT04xICglcClcbiIsCisJCQllbnRyeSwgTElTVF9QT0lTT04xKSB8fAorCSAgICBDSEVDS19EQVRBX0NPUlJVUFRJT04ocHJldiA9PSBMSVNUX1BPSVNPTjIsCisJCQkibGlzdF9kZWwgY29ycnVwdGlvbiwgJXAtPnByZXYgaXMgTElTVF9QT0lTT04yICglcClcbiIsCisJCQllbnRyeSwgTElTVF9QT0lTT04yKSB8fAorCSAgICBDSEVDS19EQVRBX0NPUlJVUFRJT04ocHJldi0+bmV4dCAhPSBlbnRyeSwKKwkJCSJsaXN0X2RlbCBjb3JydXB0aW9uLiBwcmV2LT5uZXh0IHNob3VsZCBiZSAlcCwgYnV0IHdhcyAlcFxuIiwKKwkJCWVudHJ5LCBwcmV2LT5uZXh0KSB8fAorCSAgICBDSEVDS19EQVRBX0NPUlJVUFRJT04obmV4dC0+cHJldiAhPSBlbnRyeSwKKwkJCSJsaXN0X2RlbCBjb3JydXB0aW9uLiBuZXh0LT5wcmV2IHNob3VsZCBiZSAlcCwgYnV0IHdhcyAlcFxuIiwKKwkJCWVudHJ5LCBuZXh0LT5wcmV2KSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7CisKK30KK0VYUE9SVF9TWU1CT0woX19saXN0X2RlbF9lbnRyeV92YWxpZCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9saXN0X3NvcnQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xpc3Rfc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NzU5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9saXN0X3NvcnQuYwpAQCAtMCwwICsxLDE0NSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3Rfc29ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2RlZmluZSBNQVhfTElTVF9MRU5HVEhfQklUUyAyMAorCisvKgorICogUmV0dXJucyBhIGxpc3Qgb3JnYW5pemVkIGluIGFuIGludGVybWVkaWF0ZSBmb3JtYXQgc3VpdGVkCisgKiB0byBjaGFpbmluZyBvZiBtZXJnZSgpIGNhbGxzOiBudWxsLXRlcm1pbmF0ZWQsIG5vIHJlc2VydmVkIG9yCisgKiBzZW50aW5lbCBoZWFkIG5vZGUsICJwcmV2IiBsaW5rcyBub3QgbWFpbnRhaW5lZC4KKyAqLworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKm1lcmdlKHZvaWQgKnByaXYsCisJCQkJaW50ICgqY21wKSh2b2lkICpwcml2LCBzdHJ1Y3QgbGlzdF9oZWFkICphLAorCQkJCQlzdHJ1Y3QgbGlzdF9oZWFkICpiKSwKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgaGVhZCwgKnRhaWwgPSAmaGVhZDsKKworCXdoaWxlIChhICYmIGIpIHsKKwkJLyogaWYgZXF1YWwsIHRha2UgJ2EnIC0tIGltcG9ydGFudCBmb3Igc29ydCBzdGFiaWxpdHkgKi8KKwkJaWYgKCgqY21wKShwcml2LCBhLCBiKSA8PSAwKSB7CisJCQl0YWlsLT5uZXh0ID0gYTsKKwkJCWEgPSBhLT5uZXh0OworCQl9IGVsc2UgeworCQkJdGFpbC0+bmV4dCA9IGI7CisJCQliID0gYi0+bmV4dDsKKwkJfQorCQl0YWlsID0gdGFpbC0+bmV4dDsKKwl9CisJdGFpbC0+bmV4dCA9IGE/OmI7CisJcmV0dXJuIGhlYWQubmV4dDsKK30KKworLyoKKyAqIENvbWJpbmUgZmluYWwgbGlzdCBtZXJnZSB3aXRoIHJlc3RvcmF0aW9uIG9mIHN0YW5kYXJkIGRvdWJseS1saW5rZWQKKyAqIGxpc3Qgc3RydWN0dXJlLiAgVGhpcyBhcHByb2FjaCBkdXBsaWNhdGVzIGNvZGUgZnJvbSBtZXJnZSgpLCBidXQKKyAqIHJ1bnMgZmFzdGVyIHRoYW4gdGhlIHRpZGllciBhbHRlcm5hdGl2ZXMgb2YgZWl0aGVyIGEgc2VwYXJhdGUgZmluYWwKKyAqIHByZXYtbGluayByZXN0b3JhdGlvbiBwYXNzLCBvciBtYWludGFpbmluZyB0aGUgcHJldiBsaW5rcworICogdGhyb3VnaG91dC4KKyAqLworc3RhdGljIHZvaWQgbWVyZ2VfYW5kX3Jlc3RvcmVfYmFja19saW5rcyh2b2lkICpwcml2LAorCQkJCWludCAoKmNtcCkodm9pZCAqcHJpdiwgc3RydWN0IGxpc3RfaGVhZCAqYSwKKwkJCQkJc3RydWN0IGxpc3RfaGVhZCAqYiksCisJCQkJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCwKKwkJCQlzdHJ1Y3QgbGlzdF9oZWFkICphLCBzdHJ1Y3QgbGlzdF9oZWFkICpiKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWwgPSBoZWFkOworCXU4IGNvdW50ID0gMDsKKworCXdoaWxlIChhICYmIGIpIHsKKwkJLyogaWYgZXF1YWwsIHRha2UgJ2EnIC0tIGltcG9ydGFudCBmb3Igc29ydCBzdGFiaWxpdHkgKi8KKwkJaWYgKCgqY21wKShwcml2LCBhLCBiKSA8PSAwKSB7CisJCQl0YWlsLT5uZXh0ID0gYTsKKwkJCWEtPnByZXYgPSB0YWlsOworCQkJYSA9IGEtPm5leHQ7CisJCX0gZWxzZSB7CisJCQl0YWlsLT5uZXh0ID0gYjsKKwkJCWItPnByZXYgPSB0YWlsOworCQkJYiA9IGItPm5leHQ7CisJCX0KKwkJdGFpbCA9IHRhaWwtPm5leHQ7CisJfQorCXRhaWwtPm5leHQgPSBhID8gOiBiOworCisJZG8geworCQkvKgorCQkgKiBJbiB3b3JzdCBjYXNlcyB0aGlzIGxvb3AgbWF5IHJ1biBtYW55IGl0ZXJhdGlvbnMuCisJCSAqIENvbnRpbnVlIGNhbGxiYWNrcyB0byB0aGUgY2xpZW50IGV2ZW4gdGhvdWdoIG5vCisJCSAqIGVsZW1lbnQgY29tcGFyaXNvbiBpcyBuZWVkZWQsIHNvIHRoZSBjbGllbnQncyBjbXAoKQorCQkgKiByb3V0aW5lIGNhbiBpbnZva2UgY29uZF9yZXNjaGVkKCkgcGVyaW9kaWNhbGx5LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCEoKytjb3VudCkpKQorCQkJKCpjbXApKHByaXYsIHRhaWwtPm5leHQsIHRhaWwtPm5leHQpOworCisJCXRhaWwtPm5leHQtPnByZXYgPSB0YWlsOworCQl0YWlsID0gdGFpbC0+bmV4dDsKKwl9IHdoaWxlICh0YWlsLT5uZXh0KTsKKworCXRhaWwtPm5leHQgPSBoZWFkOworCWhlYWQtPnByZXYgPSB0YWlsOworfQorCisvKioKKyAqIGxpc3Rfc29ydCAtIHNvcnQgYSBsaXN0CisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhLCBvcGFxdWUgdG8gbGlzdF9zb3J0KCksIHBhc3NlZCB0byBAY21wCisgKiBAaGVhZDogdGhlIGxpc3QgdG8gc29ydAorICogQGNtcDogdGhlIGVsZW1lbnRzIGNvbXBhcmlzb24gZnVuY3Rpb24KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgIm1lcmdlIHNvcnQiLCB3aGljaCBoYXMgTyhubG9nKG4pKQorICogY29tcGxleGl0eS4KKyAqCisgKiBUaGUgY29tcGFyaXNvbiBmdW5jdGlvbiBAY21wIG11c3QgcmV0dXJuIGEgbmVnYXRpdmUgdmFsdWUgaWYgQGEKKyAqIHNob3VsZCBzb3J0IGJlZm9yZSBAYiwgYW5kIGEgcG9zaXRpdmUgdmFsdWUgaWYgQGEgc2hvdWxkIHNvcnQgYWZ0ZXIKKyAqIEBiLiBJZiBAYSBhbmQgQGIgYXJlIGVxdWl2YWxlbnQsIGFuZCB0aGVpciBvcmlnaW5hbCByZWxhdGl2ZQorICogb3JkZXJpbmcgaXMgdG8gYmUgcHJlc2VydmVkLCBAY21wIG11c3QgcmV0dXJuIDAuCisgKi8KK3ZvaWQgbGlzdF9zb3J0KHZvaWQgKnByaXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCWludCAoKmNtcCkodm9pZCAqcHJpdiwgc3RydWN0IGxpc3RfaGVhZCAqYSwKKwkJCXN0cnVjdCBsaXN0X2hlYWQgKmIpKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnBhcnRbTUFYX0xJU1RfTEVOR1RIX0JJVFMrMV07IC8qIHNvcnRlZCBwYXJ0aWFsIGxpc3RzCisJCQkJCQktLSBsYXN0IHNsb3QgaXMgYSBzZW50aW5lbCAqLworCWludCBsZXY7ICAvKiBpbmRleCBpbnRvIHBhcnRbXSAqLworCWludCBtYXhfbGV2ID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJaWYgKGxpc3RfZW1wdHkoaGVhZCkpCisJCXJldHVybjsKKworCW1lbXNldChwYXJ0LCAwLCBzaXplb2YocGFydCkpOworCisJaGVhZC0+cHJldi0+bmV4dCA9IE5VTEw7CisJbGlzdCA9IGhlYWQtPm5leHQ7CisKKwl3aGlsZSAobGlzdCkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpjdXIgPSBsaXN0OworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKwkJY3VyLT5uZXh0ID0gTlVMTDsKKworCQlmb3IgKGxldiA9IDA7IHBhcnRbbGV2XTsgbGV2KyspIHsKKwkJCWN1ciA9IG1lcmdlKHByaXYsIGNtcCwgcGFydFtsZXZdLCBjdXIpOworCQkJcGFydFtsZXZdID0gTlVMTDsKKwkJfQorCQlpZiAobGV2ID4gbWF4X2xldikgeworCQkJaWYgKHVubGlrZWx5KGxldiA+PSBBUlJBWV9TSVpFKHBhcnQpLTEpKSB7CisJCQkJcHJpbnRrX29uY2UoS0VSTl9ERUJVRyAibGlzdCB0b28gbG9uZyBmb3IgZWZmaWNpZW5jeVxuIik7CisJCQkJbGV2LS07CisJCQl9CisJCQltYXhfbGV2ID0gbGV2OworCQl9CisJCXBhcnRbbGV2XSA9IGN1cjsKKwl9CisKKwlmb3IgKGxldiA9IDA7IGxldiA8IG1heF9sZXY7IGxldisrKQorCQlpZiAocGFydFtsZXZdKQorCQkJbGlzdCA9IG1lcmdlKHByaXYsIGNtcCwgcGFydFtsZXZdLCBsaXN0KTsKKworCW1lcmdlX2FuZF9yZXN0b3JlX2JhY2tfbGlua3MocHJpdiwgY21wLCBoZWFkLCBwYXJ0W21heF9sZXZdLCBsaXN0KTsKK30KK0VYUE9SVF9TWU1CT0wobGlzdF9zb3J0KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xsaXN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTg3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sbGlzdC5jCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogTG9jay1sZXNzIE5VTEwgdGVybWluYXRlZCBzaW5nbGUgbGlua2VkIGxpc3QKKyAqCisgKiBUaGUgYmFzaWMgYXRvbWljIG9wZXJhdGlvbiBvZiB0aGlzIGxpc3QgaXMgY21weGNoZyBvbiBsb25nLiAgT24KKyAqIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYXZlIE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24sIHRoZQorICogbGlzdCBjYW4gTk9UIGJlIHVzZWQgaW4gTk1JIGhhbmRsZXJzLiAgU28gY29kZSB0aGF0IHVzZXMgdGhlIGxpc3QgaW4KKyAqIGFuIE5NSSBoYW5kbGVyIHNob3VsZCBkZXBlbmQgb24gQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHLgorICoKKyAqIENvcHlyaWdodCAyMDEwLDIwMTEgSW50ZWwgQ29ycC4KKyAqICAgQXV0aG9yOiBIdWFuZyBZaW5nIDx5aW5nLmh1YW5nQGludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uCisgKiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9sbGlzdC5oPgorCisKKy8qKgorICogbGxpc3RfYWRkX2JhdGNoIC0gYWRkIHNldmVyYWwgbGlua2VkIGVudHJpZXMgaW4gYmF0Y2gKKyAqIEBuZXdfZmlyc3Q6CWZpcnN0IGVudHJ5IGluIGJhdGNoIHRvIGJlIGFkZGVkCisgKiBAbmV3X2xhc3Q6CWxhc3QgZW50cnkgaW4gYmF0Y2ggdG8gYmUgYWRkZWQKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsb2NrLWxlc3MgbGlzdAorICoKKyAqIFJldHVybiB3aGV0aGVyIGxpc3QgaXMgZW1wdHkgYmVmb3JlIGFkZGluZy4KKyAqLworYm9vbCBsbGlzdF9hZGRfYmF0Y2goc3RydWN0IGxsaXN0X25vZGUgKm5ld19maXJzdCwgc3RydWN0IGxsaXN0X25vZGUgKm5ld19sYXN0LAorCQkgICAgIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9ub2RlICpmaXJzdDsKKworCWRvIHsKKwkJbmV3X2xhc3QtPm5leHQgPSBmaXJzdCA9IEFDQ0VTU19PTkNFKGhlYWQtPmZpcnN0KTsKKwl9IHdoaWxlIChjbXB4Y2hnKCZoZWFkLT5maXJzdCwgZmlyc3QsIG5ld19maXJzdCkgIT0gZmlyc3QpOworCisJcmV0dXJuICFmaXJzdDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxsaXN0X2FkZF9iYXRjaCk7CisKKy8qKgorICogbGxpc3RfZGVsX2ZpcnN0IC0gZGVsZXRlIHRoZSBmaXJzdCBlbnRyeSBvZiBsb2NrLWxlc3MgbGlzdAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKgorICogSWYgbGlzdCBpcyBlbXB0eSwgcmV0dXJuIE5VTEwsIG90aGVyd2lzZSwgcmV0dXJuIHRoZSBmaXJzdCBlbnRyeQorICogZGVsZXRlZCwgdGhpcyBpcyB0aGUgbmV3ZXN0IGFkZGVkIG9uZS4KKyAqCisgKiBPbmx5IG9uZSBsbGlzdF9kZWxfZmlyc3QgdXNlciBjYW4gYmUgdXNlZCBzaW11bHRhbmVvdXNseSB3aXRoCisgKiBtdWx0aXBsZSBsbGlzdF9hZGQgdXNlcnMgd2l0aG91dCBsb2NrLiAgQmVjYXVzZSBvdGhlcndpc2UKKyAqIGxsaXN0X2RlbF9maXJzdCwgbGxpc3RfYWRkLCBsbGlzdF9hZGQgKG9yIGxsaXN0X2RlbF9hbGwsIGxsaXN0X2FkZCwKKyAqIGxsaXN0X2FkZCkgc2VxdWVuY2UgaW4gYW5vdGhlciB1c2VyIG1heSBjaGFuZ2UgQGhlYWQtPmZpcnN0LT5uZXh0LAorICogYnV0IGtlZXAgQGhlYWQtPmZpcnN0LiAgSWYgbXVsdGlwbGUgY29uc3VtZXJzIGFyZSBuZWVkZWQsIHBsZWFzZQorICogdXNlIGxsaXN0X2RlbF9hbGwgb3IgdXNlIGxvY2sgYmV0d2VlbiBjb25zdW1lcnMuCisgKi8KK3N0cnVjdCBsbGlzdF9ub2RlICpsbGlzdF9kZWxfZmlyc3Qoc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxsaXN0X25vZGUgKmVudHJ5LCAqb2xkX2VudHJ5LCAqbmV4dDsKKworCWVudHJ5ID0gc21wX2xvYWRfYWNxdWlyZSgmaGVhZC0+Zmlyc3QpOworCWZvciAoOzspIHsKKwkJaWYgKGVudHJ5ID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2xkX2VudHJ5ID0gZW50cnk7CisJCW5leHQgPSBSRUFEX09OQ0UoZW50cnktPm5leHQpOworCQllbnRyeSA9IGNtcHhjaGcoJmhlYWQtPmZpcnN0LCBvbGRfZW50cnksIG5leHQpOworCQlpZiAoZW50cnkgPT0gb2xkX2VudHJ5KQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVudHJ5OworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfZGVsX2ZpcnN0KTsKKworLyoqCisgKiBsbGlzdF9yZXZlcnNlX29yZGVyIC0gcmV2ZXJzZSBvcmRlciBvZiBhIGxsaXN0IGNoYWluCisgKiBAaGVhZDoJZmlyc3QgaXRlbSBvZiB0aGUgbGlzdCB0byBiZSByZXZlcnNlZAorICoKKyAqIFJldmVyc2UgdGhlIG9yZGVyIG9mIGEgY2hhaW4gb2YgbGxpc3QgZW50cmllcyBhbmQgcmV0dXJuIHRoZQorICogbmV3IGZpcnN0IGVudHJ5LgorICovCitzdHJ1Y3QgbGxpc3Rfbm9kZSAqbGxpc3RfcmV2ZXJzZV9vcmRlcihzdHJ1Y3QgbGxpc3Rfbm9kZSAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3X2hlYWQgPSBOVUxMOworCisJd2hpbGUgKGhlYWQpIHsKKwkJc3RydWN0IGxsaXN0X25vZGUgKnRtcCA9IGhlYWQ7CisJCWhlYWQgPSBoZWFkLT5uZXh0OworCQl0bXAtPm5leHQgPSBuZXdfaGVhZDsKKwkJbmV3X2hlYWQgPSB0bXA7CisJfQorCisJcmV0dXJuIG5ld19oZWFkOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfcmV2ZXJzZV9vcmRlcik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LWhhcmRpcnEuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3QtaGFyZGlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTQ0YTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LWhhcmRpcnEuaApAQCAtMCwwICsxLDEwIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworI3VuZGVmIElSUV9ESVNBQkxFCisjdW5kZWYgSVJRX0VOQUJMRQorI3VuZGVmIElSUV9FTlRFUgorI3VuZGVmIElSUV9FWElUCisKKyNkZWZpbmUgSVJRX0VOQUJMRQkJSEFSRElSUV9FTkFCTEUKKyNkZWZpbmUgSVJRX0RJU0FCTEUJCUhBUkRJUlFfRElTQUJMRQorI2RlZmluZSBJUlFfRU5URVIJCUhBUkRJUlFfRU5URVIKKyNkZWZpbmUgSVJRX0VYSVQJCUhBUkRJUlFfRVhJVApkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1tdXRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MjZjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LW11dGV4LmgKQEAgLTAsMCArMSwxMiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyN1bmRlZiBMT0NLCisjZGVmaW5lIExPQ0sJCU1MCisKKyN1bmRlZiBVTkxPQ0sKKyNkZWZpbmUgVU5MT0NLCQlNVQorCisjdW5kZWYgUkxPQ0sKKyN1bmRlZiBXTE9DSworCisjdW5kZWYgSU5JVAorI2RlZmluZSBJTklUCQlNSQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ybG9jay1oYXJkaXJxLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLWhhcmRpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjUxN2ViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ybG9jay1oYXJkaXJxLmgKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtaGFyZGlycS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ybG9jay1zb2Z0aXJxLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLXNvZnRpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODE0NTVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ybG9jay1zb2Z0aXJxLmgKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc29mdGlycS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ybG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjY2FiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLmgKQEAgLTAsMCArMSwxNSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyN1bmRlZiBMT0NLCisjZGVmaW5lIExPQ0sJCVJMCisKKyN1bmRlZiBVTkxPQ0sKKyNkZWZpbmUgVU5MT0NLCQlSVQorCisjdW5kZWYgUkxPQ0sKKyNkZWZpbmUgUkxPQ0sJCVJMCisKKyN1bmRlZiBXTE9DSworI2RlZmluZSBXTE9DSwkJV0wKKworI3VuZGVmIElOSVQKKyNkZWZpbmUgSU5JVAkJUldJCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXJzZW0uaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3QtcnNlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NDQ4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXJzZW0uaApAQCAtMCwwICsxLDE1IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworI3VuZGVmIExPQ0sKKyNkZWZpbmUgTE9DSwkJUlNMCisKKyN1bmRlZiBVTkxPQ0sKKyNkZWZpbmUgVU5MT0NLCQlSU1UKKworI3VuZGVmIFJMT0NLCisjZGVmaW5lIFJMT0NLCQlSU0wKKworI3VuZGVmIFdMT0NLCisjZGVmaW5lIFdMT0NLCQlXU0wKKworI3VuZGVmIElOSVQKKyNkZWZpbmUgSU5JVAkJUldTSQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXJ0bXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U4NzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgKQEAgLTAsMCArMSwxMiBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyN1bmRlZiBMT0NLCisjZGVmaW5lIExPQ0sJCVJUTAorCisjdW5kZWYgVU5MT0NLCisjZGVmaW5lIFVOTE9DSwkJUlRVCisKKyN1bmRlZiBSTE9DSworI3VuZGVmIFdMT0NLCisKKyN1bmRlZiBJTklUCisjZGVmaW5lIElOSVQJCVJUSQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1zb2Z0aXJxLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXNvZnRpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRkZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1zb2Z0aXJxLmgKQEAgLTAsMCArMSwxMCBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyN1bmRlZiBJUlFfRElTQUJMRQorI3VuZGVmIElSUV9FTkFCTEUKKyN1bmRlZiBJUlFfRU5URVIKKyN1bmRlZiBJUlFfRVhJVAorCisjZGVmaW5lIElSUV9ESVNBQkxFCQlTT0ZUSVJRX0RJU0FCTEUKKyNkZWZpbmUgSVJRX0VOQUJMRQkJU09GVElSUV9FTkFCTEUKKyNkZWZpbmUgSVJRX0VOVEVSCQlTT0ZUSVJRX0VOVEVSCisjZGVmaW5lIElSUV9FWElUCQlTT0ZUSVJRX0VYSVQKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3Qtc3Bpbi1oYXJkaXJxLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXNwaW4taGFyZGlycS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MzE5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXNwaW4taGFyZGlycS5oCkBAIC0wLDAgKzEsMiBAQAorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi5oIgorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtaGFyZGlycS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC1zcGluLXNvZnRpcnEuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3Qtc3Bpbi1zb2Z0aXJxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MmUyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3Qtc3Bpbi1zb2Z0aXJxLmgKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zcGluLmgiCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zb2Z0aXJxLmgiCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3Qtc3Bpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjRkNjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaApAQCAtMCwwICsxLDEyIEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworI3VuZGVmIExPQ0sKKyNkZWZpbmUgTE9DSwkJTAorCisjdW5kZWYgVU5MT0NLCisjZGVmaW5lIFVOTE9DSwkJVQorCisjdW5kZWYgUkxPQ0sKKyN1bmRlZiBXTE9DSworCisjdW5kZWYgSU5JVAorI2RlZmluZSBJTklUCQlTSQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC13bG9jay1oYXJkaXJxLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLWhhcmRpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQyZTUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC13bG9jay1oYXJkaXJxLmgKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay5oIgorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtaGFyZGlycS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC13bG9jay1zb2Z0aXJxLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLXNvZnRpcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjgwZDFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC13bG9jay1zb2Z0aXJxLmgKQEAgLTAsMCArMSwyIEBACisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay5oIgorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc29mdGlycS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC13bG9jay5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC13bG9jay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzUxYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLmgKQEAgLTAsMCArMSwxNSBAQAorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KKyN1bmRlZiBMT0NLCisjZGVmaW5lIExPQ0sJCVdMCisKKyN1bmRlZiBVTkxPQ0sKKyNkZWZpbmUgVU5MT0NLCQlXVQorCisjdW5kZWYgUkxPQ0sKKyNkZWZpbmUgUkxPQ0sJCVJMCisKKyN1bmRlZiBXTE9DSworI2RlZmluZSBXTE9DSwkJV0wKKworI3VuZGVmIElOSVQKKyNkZWZpbmUgSU5JVAkJUldJCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXdzZW0uaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tpbmctc2VsZnRlc3Qtd3NlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjE4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LXdzZW0uaApAQCAtMCwwICsxLDE1IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworI3VuZGVmIExPQ0sKKyNkZWZpbmUgTE9DSwkJV1NMCisKKyN1bmRlZiBVTkxPQ0sKKyNkZWZpbmUgVU5MT0NLCQlXU1UKKworI3VuZGVmIFJMT0NLCisjZGVmaW5lIFJMT0NLCQlSU0wKKworI3VuZGVmIFdMT0NLCisjZGVmaW5lIFdMT0NLCQlXU0wKKworI3VuZGVmIElOSVQKKyNkZWZpbmUgSU5JVAkJUldTSQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja2luZy1zZWxmdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzEyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sb2NraW5nLXNlbGZ0ZXN0LmMKQEAgLTAsMCArMSwyMTAxIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIGxpYi9sb2NraW5nLXNlbGZ0ZXN0LmMKKyAqCisgKiBUZXN0c3VpdGUgZm9yIHZhcmlvdXMgbG9ja2luZyBBUElzOiBzcGlubG9ja3MsIHJ3bG9ja3MsCisgKiBtdXRleGVzIGFuZCBydy1zZW1hcGhvcmVzLgorICoKKyAqIEl0IGlzIGNoZWNraW5nIGJvdGggZmFsc2UgcG9zaXRpdmVzIGFuZCBmYWxzZSBuZWdhdGl2ZXMuCisgKgorICogU3RhcnRlZCBieSBJbmdvIE1vbG5hcjoKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2IFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICovCisjaW5jbHVkZSA8bGludXgvcndzZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3d3X211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bXV0ZXguaD4KKworLyoKKyAqIENoYW5nZSB0aGlzIHRvIDEgaWYgeW91IHdhbnQgdG8gc2VlIHRoZSBmYWlsdXJlIHByaW50b3V0czoKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1Z19sb2Nrc192ZXJib3NlOworCitzdGF0aWMgREVGSU5FX1dXX0NMQVNTKHd3X2xvY2tkZXApOworCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9kZWJ1Z19sb2Nrc192ZXJib3NlKGNoYXIgKnN0cikKK3sKKwlnZXRfb3B0aW9uKCZzdHIsICZkZWJ1Z19sb2Nrc192ZXJib3NlKTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJkZWJ1Z19sb2Nrc192ZXJib3NlPSIsIHNldHVwX2RlYnVnX2xvY2tzX3ZlcmJvc2UpOworCisjZGVmaW5lIEZBSUxVUkUJCTAKKyNkZWZpbmUgU1VDQ0VTUwkJMQorCisjZGVmaW5lIExPQ0tUWVBFX1NQSU4JMHgxCisjZGVmaW5lIExPQ0tUWVBFX1JXTE9DSwkweDIKKyNkZWZpbmUgTE9DS1RZUEVfTVVURVgJMHg0CisjZGVmaW5lIExPQ0tUWVBFX1JXU0VNCTB4OAorI2RlZmluZSBMT0NLVFlQRV9XVwkweDEwCisjZGVmaW5lIExPQ0tUWVBFX1JUTVVURVggMHgyMAorCitzdGF0aWMgc3RydWN0IHd3X2FjcXVpcmVfY3R4IHQsIHQyOworc3RhdGljIHN0cnVjdCB3d19tdXRleCBvLCBvMiwgbzM7CisKKy8qCisgKiBOb3JtYWwgc3RhbmRhbG9uZSBsb2NrcywgZm9yIHRoZSBjaXJjdWxhciBhbmQgaXJxLWNvbnRleHQKKyAqIGRlcGVuZGVuY3kgdGVzdHM6CisgKi8KK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxvY2tfQSk7CitzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhsb2NrX0IpOworc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sobG9ja19DKTsKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxvY2tfRCk7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ3bG9ja19BKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ3bG9ja19CKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ3bG9ja19DKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ3bG9ja19EKTsKKworc3RhdGljIERFRklORV9NVVRFWChtdXRleF9BKTsKK3N0YXRpYyBERUZJTkVfTVVURVgobXV0ZXhfQik7CitzdGF0aWMgREVGSU5FX01VVEVYKG11dGV4X0MpOworc3RhdGljIERFRklORV9NVVRFWChtdXRleF9EKTsKKworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fQSk7CitzdGF0aWMgREVDTEFSRV9SV1NFTShyd3NlbV9CKTsKK3N0YXRpYyBERUNMQVJFX1JXU0VNKHJ3c2VtX0MpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fRCk7CisKKyNpZmRlZiBDT05GSUdfUlRfTVVURVhFUworCitzdGF0aWMgREVGSU5FX1JUX01VVEVYKHJ0bXV0ZXhfQSk7CitzdGF0aWMgREVGSU5FX1JUX01VVEVYKHJ0bXV0ZXhfQik7CitzdGF0aWMgREVGSU5FX1JUX01VVEVYKHJ0bXV0ZXhfQyk7CitzdGF0aWMgREVGSU5FX1JUX01VVEVYKHJ0bXV0ZXhfRCk7CisKKyNlbmRpZgorCisvKgorICogTG9ja3MgdGhhdCB3ZSBpbml0aWFsaXplIGR5bmFtaWNhbGx5IGFzIHdlbGwgc28gdGhhdAorICogZS5nLiBYMSBhbmQgWDIgYmVjb21lcyB0d28gaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNsYXNzLAorICogYnV0IFgqIGFuZCBZKiBhcmUgZGlmZmVyZW50IGNsYXNzZXMuIFdlIGRvIHRoaXMgc28gdGhhdAorICogd2UgZG8gbm90IHRyaWdnZXIgYSByZWFsIGxvY2t1cDoKKyAqLworc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sobG9ja19YMSk7CitzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhsb2NrX1gyKTsKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxvY2tfWTEpOworc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0sobG9ja19ZMik7CitzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhsb2NrX1oxKTsKK3N0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKGxvY2tfWjIpOworCitzdGF0aWMgREVGSU5FX1JXTE9DSyhyd2xvY2tfWDEpOworc3RhdGljIERFRklORV9SV0xPQ0socndsb2NrX1gyKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ3bG9ja19ZMSk7CitzdGF0aWMgREVGSU5FX1JXTE9DSyhyd2xvY2tfWTIpOworc3RhdGljIERFRklORV9SV0xPQ0socndsb2NrX1oxKTsKK3N0YXRpYyBERUZJTkVfUldMT0NLKHJ3bG9ja19aMik7CisKK3N0YXRpYyBERUZJTkVfTVVURVgobXV0ZXhfWDEpOworc3RhdGljIERFRklORV9NVVRFWChtdXRleF9YMik7CitzdGF0aWMgREVGSU5FX01VVEVYKG11dGV4X1kxKTsKK3N0YXRpYyBERUZJTkVfTVVURVgobXV0ZXhfWTIpOworc3RhdGljIERFRklORV9NVVRFWChtdXRleF9aMSk7CitzdGF0aWMgREVGSU5FX01VVEVYKG11dGV4X1oyKTsKKworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fWDEpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fWDIpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fWTEpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fWTIpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fWjEpOworc3RhdGljIERFQ0xBUkVfUldTRU0ocndzZW1fWjIpOworCisjaWZkZWYgQ09ORklHX1JUX01VVEVYRVMKKworc3RhdGljIERFRklORV9SVF9NVVRFWChydG11dGV4X1gxKTsKK3N0YXRpYyBERUZJTkVfUlRfTVVURVgocnRtdXRleF9YMik7CitzdGF0aWMgREVGSU5FX1JUX01VVEVYKHJ0bXV0ZXhfWTEpOworc3RhdGljIERFRklORV9SVF9NVVRFWChydG11dGV4X1kyKTsKK3N0YXRpYyBERUZJTkVfUlRfTVVURVgocnRtdXRleF9aMSk7CitzdGF0aWMgREVGSU5FX1JUX01VVEVYKHJ0bXV0ZXhfWjIpOworCisjZW5kaWYKKworLyoKKyAqIG5vbi1pbmxpbmVkIHJ1bnRpbWUgaW5pdGlhbGl6ZXJzLCB0byBsZXQgc2VwYXJhdGUgbG9ja3Mgc2hhcmUKKyAqIHRoZSBzYW1lIGxvY2stY2xhc3M6CisgKi8KKyNkZWZpbmUgSU5JVF9DTEFTU19GVU5DKGNsYXNzKSAJCQkJXAorc3RhdGljIG5vaW5saW5lIHZvaWQJCQkJCVwKK2luaXRfY2xhc3NfIyNjbGFzcyhyYXdfc3BpbmxvY2tfdCAqbG9jaywgcndsb2NrX3QgKnJ3bG9jaywgXAorCXN0cnVjdCBtdXRleCAqbXV0ZXgsIHN0cnVjdCByd19zZW1hcGhvcmUgKnJ3c2VtKVwKK3sJCQkJCQkJXAorCXJhd19zcGluX2xvY2tfaW5pdChsb2NrKTsJCQlcCisJcndsb2NrX2luaXQocndsb2NrKTsJCQkJXAorCW11dGV4X2luaXQobXV0ZXgpOwkJCQlcCisJaW5pdF9yd3NlbShyd3NlbSk7CQkJCVwKK30KKworSU5JVF9DTEFTU19GVU5DKFgpCitJTklUX0NMQVNTX0ZVTkMoWSkKK0lOSVRfQ0xBU1NfRlVOQyhaKQorCitzdGF0aWMgdm9pZCBpbml0X3NoYXJlZF9jbGFzc2VzKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1JUX01VVEVYRVMKKwlzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IHJ0X1gsIHJ0X1ksIHJ0X1o7CisKKwlfX3J0X211dGV4X2luaXQoJnJ0bXV0ZXhfWDEsIF9fZnVuY19fLCAmcnRfWCk7CisJX19ydF9tdXRleF9pbml0KCZydG11dGV4X1gyLCBfX2Z1bmNfXywgJnJ0X1gpOworCV9fcnRfbXV0ZXhfaW5pdCgmcnRtdXRleF9ZMSwgX19mdW5jX18sICZydF9ZKTsKKwlfX3J0X211dGV4X2luaXQoJnJ0bXV0ZXhfWTIsIF9fZnVuY19fLCAmcnRfWSk7CisJX19ydF9tdXRleF9pbml0KCZydG11dGV4X1oxLCBfX2Z1bmNfXywgJnJ0X1opOworCV9fcnRfbXV0ZXhfaW5pdCgmcnRtdXRleF9aMiwgX19mdW5jX18sICZydF9aKTsKKyNlbmRpZgorCisJaW5pdF9jbGFzc19YKCZsb2NrX1gxLCAmcndsb2NrX1gxLCAmbXV0ZXhfWDEsICZyd3NlbV9YMSk7CisJaW5pdF9jbGFzc19YKCZsb2NrX1gyLCAmcndsb2NrX1gyLCAmbXV0ZXhfWDIsICZyd3NlbV9YMik7CisKKwlpbml0X2NsYXNzX1koJmxvY2tfWTEsICZyd2xvY2tfWTEsICZtdXRleF9ZMSwgJnJ3c2VtX1kxKTsKKwlpbml0X2NsYXNzX1koJmxvY2tfWTIsICZyd2xvY2tfWTIsICZtdXRleF9ZMiwgJnJ3c2VtX1kyKTsKKworCWluaXRfY2xhc3NfWigmbG9ja19aMSwgJnJ3bG9ja19aMSwgJm11dGV4X1oxLCAmcndzZW1fWjEpOworCWluaXRfY2xhc3NfWigmbG9ja19aMiwgJnJ3bG9ja19aMiwgJm11dGV4X1oyLCAmcndzZW1fWjIpOworfQorCisvKgorICogRm9yIHNwaW5sb2NrcyBhbmQgcndsb2NrcyB3ZSBhbHNvIGRvIGhhcmRpcnEtc2FmZSAvIHNvZnRpcnEtc2FmZSB0ZXN0cy4KKyAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHVzZSBhIGxvY2sgZnJvbSBhIHNpbXVsYXRlZCBoYXJkaXJxL3NvZnRpcnEKKyAqIGNvbnRleHQsIGNhdXNpbmcgdGhlIGxvY2tzIHRvIGJlIG1hcmtlZCBhcyBoYXJkaXJxLXNhZmUvc29mdGlycS1zYWZlOgorICovCisKKyNkZWZpbmUgSEFSRElSUV9ESVNBQkxFCQlsb2NhbF9pcnFfZGlzYWJsZQorI2RlZmluZSBIQVJESVJRX0VOQUJMRQkJbG9jYWxfaXJxX2VuYWJsZQorCisjZGVmaW5lIEhBUkRJUlFfRU5URVIoKQkJCQlcCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsJCQlcCisJX19pcnFfZW50ZXIoKTsJCQkJXAorCVdBUk5fT04oIWluX2lycSgpKTsKKworI2RlZmluZSBIQVJESVJRX0VYSVQoKQkJCQlcCisJX19pcnFfZXhpdCgpOwkJCQlcCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisjZGVmaW5lIFNPRlRJUlFfRElTQUJMRQkJbG9jYWxfYmhfZGlzYWJsZQorI2RlZmluZSBTT0ZUSVJRX0VOQUJMRQkJbG9jYWxfYmhfZW5hYmxlCisKKyNkZWZpbmUgU09GVElSUV9FTlRFUigpCQkJCVwKKwkJbG9jYWxfYmhfZGlzYWJsZSgpOwkJXAorCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwkJXAorCQlsb2NrZGVwX3NvZnRpcnFfZW50ZXIoKTsJXAorCQlXQVJOX09OKCFpbl9zb2Z0aXJxKCkpOworCisjZGVmaW5lIFNPRlRJUlFfRVhJVCgpCQkJCVwKKwkJbG9ja2RlcF9zb2Z0aXJxX2V4aXQoKTsJCVwKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOwkJXAorCQlsb2NhbF9iaF9lbmFibGUoKTsKKworLyoKKyAqIFNob3J0Y3V0cyBmb3IgbG9jay91bmxvY2sgQVBJIHZhcmlhbnRzLCB0byBrZWVwCisgKiB0aGUgdGVzdGNhc2VzIGNvbXBhY3Q6CisgKi8KKyNkZWZpbmUgTCh4KQkJCXJhd19zcGluX2xvY2soJmxvY2tfIyN4KQorI2RlZmluZSBVKHgpCQkJcmF3X3NwaW5fdW5sb2NrKCZsb2NrXyMjeCkKKyNkZWZpbmUgTFUoeCkJCQlMKHgpOyBVKHgpCisjZGVmaW5lIFNJKHgpCQkJcmF3X3NwaW5fbG9ja19pbml0KCZsb2NrXyMjeCkKKworI2RlZmluZSBXTCh4KQkJCXdyaXRlX2xvY2soJnJ3bG9ja18jI3gpCisjZGVmaW5lIFdVKHgpCQkJd3JpdGVfdW5sb2NrKCZyd2xvY2tfIyN4KQorI2RlZmluZSBXTFUoeCkJCQlXTCh4KTsgV1UoeCkKKworI2RlZmluZSBSTCh4KQkJCXJlYWRfbG9jaygmcndsb2NrXyMjeCkKKyNkZWZpbmUgUlUoeCkJCQlyZWFkX3VubG9jaygmcndsb2NrXyMjeCkKKyNkZWZpbmUgUkxVKHgpCQkJUkwoeCk7IFJVKHgpCisjZGVmaW5lIFJXSSh4KQkJCXJ3bG9ja19pbml0KCZyd2xvY2tfIyN4KQorCisjZGVmaW5lIE1MKHgpCQkJbXV0ZXhfbG9jaygmbXV0ZXhfIyN4KQorI2RlZmluZSBNVSh4KQkJCW11dGV4X3VubG9jaygmbXV0ZXhfIyN4KQorI2RlZmluZSBNSSh4KQkJCW11dGV4X2luaXQoJm11dGV4XyMjeCkKKworI2RlZmluZSBSVEwoeCkJCQlydF9tdXRleF9sb2NrKCZydG11dGV4XyMjeCkKKyNkZWZpbmUgUlRVKHgpCQkJcnRfbXV0ZXhfdW5sb2NrKCZydG11dGV4XyMjeCkKKyNkZWZpbmUgUlRJKHgpCQkJcnRfbXV0ZXhfaW5pdCgmcnRtdXRleF8jI3gpCisKKyNkZWZpbmUgV1NMKHgpCQkJZG93bl93cml0ZSgmcndzZW1fIyN4KQorI2RlZmluZSBXU1UoeCkJCQl1cF93cml0ZSgmcndzZW1fIyN4KQorCisjZGVmaW5lIFJTTCh4KQkJCWRvd25fcmVhZCgmcndzZW1fIyN4KQorI2RlZmluZSBSU1UoeCkJCQl1cF9yZWFkKCZyd3NlbV8jI3gpCisjZGVmaW5lIFJXU0koeCkJCQlpbml0X3J3c2VtKCZyd3NlbV8jI3gpCisKKyNpZm5kZWYgQ09ORklHX0RFQlVHX1dXX01VVEVYX1NMT1dQQVRICisjZGVmaW5lIFdXQUkoeCkJCQl3d19hY3F1aXJlX2luaXQoeCwgJnd3X2xvY2tkZXApCisjZWxzZQorI2RlZmluZSBXV0FJKHgpCQkJZG8geyB3d19hY3F1aXJlX2luaXQoeCwgJnd3X2xvY2tkZXApOyAoeCktPmRlYWRsb2NrX2luamVjdF9jb3VudGRvd24gPSB+MFU7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNkZWZpbmUgV1dBRCh4KQkJCXd3X2FjcXVpcmVfZG9uZSh4KQorI2RlZmluZSBXV0FGKHgpCQkJd3dfYWNxdWlyZV9maW5pKHgpCisKKyNkZWZpbmUgV1dMKHgsIGMpCQl3d19tdXRleF9sb2NrKHgsIGMpCisjZGVmaW5lIFdXVCh4KQkJCXd3X211dGV4X3RyeWxvY2soeCkKKyNkZWZpbmUgV1dMMSh4KQkJCXd3X211dGV4X2xvY2soeCwgTlVMTCkKKyNkZWZpbmUgV1dVKHgpCQkJd3dfbXV0ZXhfdW5sb2NrKHgpCisKKworI2RlZmluZSBMT0NLX1VOTE9DS18yKHgseSkJTE9DSyh4KTsgTE9DSyh5KTsgVU5MT0NLKHkpOyBVTkxPQ0soeCkKKworLyoKKyAqIEdlbmVyYXRlIGRpZmZlcmVudCBwZXJtdXRhdGlvbnMgb2YgdGhlIHNhbWUgdGVzdGNhc2UsIHVzaW5nCisgKiB0aGUgc2FtZSBiYXNpYyBsb2NrLWRlcGVuZGVuY3kvc3RhdGUgZXZlbnRzOgorICovCisKKyNkZWZpbmUgR0VORVJBVEVfVEVTVENBU0UobmFtZSkJCQlcCisJCQkJCQlcCitzdGF0aWMgdm9pZCBuYW1lKHZvaWQpIHsgRSgpOyB9CisKKyNkZWZpbmUgR0VORVJBVEVfUEVSTVVUQVRJT05TXzJfRVZFTlRTKG5hbWUpCVwKKwkJCQkJCVwKK3N0YXRpYyB2b2lkIG5hbWUjI18xMih2b2lkKSB7IEUxKCk7IEUyKCk7IH0JXAorc3RhdGljIHZvaWQgbmFtZSMjXzIxKHZvaWQpIHsgRTIoKTsgRTEoKTsgfQorCisjZGVmaW5lIEdFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhuYW1lKQkJXAorCQkJCQkJCVwKK3N0YXRpYyB2b2lkIG5hbWUjI18xMjModm9pZCkgeyBFMSgpOyBFMigpOyBFMygpOyB9CVwKK3N0YXRpYyB2b2lkIG5hbWUjI18xMzIodm9pZCkgeyBFMSgpOyBFMygpOyBFMigpOyB9CVwKK3N0YXRpYyB2b2lkIG5hbWUjI18yMTModm9pZCkgeyBFMigpOyBFMSgpOyBFMygpOyB9CVwKK3N0YXRpYyB2b2lkIG5hbWUjI18yMzEodm9pZCkgeyBFMigpOyBFMygpOyBFMSgpOyB9CVwKK3N0YXRpYyB2b2lkIG5hbWUjI18zMTIodm9pZCkgeyBFMygpOyBFMSgpOyBFMigpOyB9CVwKK3N0YXRpYyB2b2lkIG5hbWUjI18zMjEodm9pZCkgeyBFMygpOyBFMigpOyBFMSgpOyB9CisKKy8qCisgKiBBQSBkZWFkbG9jazoKKyAqLworCisjZGVmaW5lIEUoKQkJCQkJXAorCQkJCQkJXAorCUxPQ0soWDEpOwkJCQlcCisJTE9DSyhYMik7IC8qIHRoaXMgb25lIHNob3VsZCBmYWlsICovCisKKy8qCisgKiA2IHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi5oIgorR0VORVJBVEVfVEVTVENBU0UoQUFfc3BpbikKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQV93bG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQV9ybG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LW11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQV9tdXRleCkKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdzZW0uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFBX3dzZW0pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1yc2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQV9yc2VtKQorCisjaWZkZWYgQ09ORklHX1JUX01VVEVYRVMKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJ0bXV0ZXguaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFBX3J0bXV0ZXgpOworI2VuZGlmCisKKyN1bmRlZiBFCisKKy8qCisgKiBTcGVjaWFsLWNhc2UgZm9yIHJlYWQtbG9ja2luZywgdGhleSBhcmUKKyAqIGFsbG93ZWQgdG8gcmVjdXJzZSBvbiB0aGUgc2FtZSBsb2NrIGNsYXNzOgorICovCitzdGF0aWMgdm9pZCBybG9ja19BQTEodm9pZCkKK3sKKwlSTChYMSk7CisJUkwoWDEpOyAvLyB0aGlzIG9uZSBzaG91bGQgTk9UIGZhaWwKK30KKworc3RhdGljIHZvaWQgcmxvY2tfQUExQih2b2lkKQoreworCVJMKFgxKTsKKwlSTChYMik7IC8vIHRoaXMgb25lIHNob3VsZCBOT1QgZmFpbAorfQorCitzdGF0aWMgdm9pZCByc2VtX0FBMSh2b2lkKQoreworCVJTTChYMSk7CisJUlNMKFgxKTsgLy8gdGhpcyBvbmUgc2hvdWxkIGZhaWwKK30KKworc3RhdGljIHZvaWQgcnNlbV9BQTFCKHZvaWQpCit7CisJUlNMKFgxKTsKKwlSU0woWDIpOyAvLyB0aGlzIG9uZSBzaG91bGQgZmFpbAorfQorLyoKKyAqIFRoZSBtaXhpbmcgb2YgcmVhZCBhbmQgd3JpdGUgbG9ja3MgaXMgbm90IGFsbG93ZWQ6CisgKi8KK3N0YXRpYyB2b2lkIHJsb2NrX0FBMih2b2lkKQoreworCVJMKFgxKTsKKwlXTChYMik7IC8vIHRoaXMgb25lIHNob3VsZCBmYWlsCit9CisKK3N0YXRpYyB2b2lkIHJzZW1fQUEyKHZvaWQpCit7CisJUlNMKFgxKTsKKwlXU0woWDIpOyAvLyB0aGlzIG9uZSBzaG91bGQgZmFpbAorfQorCitzdGF0aWMgdm9pZCBybG9ja19BQTModm9pZCkKK3sKKwlXTChYMSk7CisJUkwoWDIpOyAvLyB0aGlzIG9uZSBzaG91bGQgZmFpbAorfQorCitzdGF0aWMgdm9pZCByc2VtX0FBMyh2b2lkKQoreworCVdTTChYMSk7CisJUlNMKFgyKTsgLy8gdGhpcyBvbmUgc2hvdWxkIGZhaWwKK30KKworLyoKKyAqIHJlYWRfbG9jayhBKQorICogc3Bpbl9sb2NrKEIpCisgKgkJc3Bpbl9sb2NrKEIpCisgKgkJd3JpdGVfbG9jayhBKQorICovCitzdGF0aWMgdm9pZCBybG9ja19BQkJBMSh2b2lkKQoreworCVJMKFgxKTsKKwlMKFkxKTsKKwlVKFkxKTsKKwlSVShYMSk7CisKKwlMKFkxKTsKKwlXTChYMSk7CisJV1UoWDEpOworCVUoWTEpOyAvLyBzaG91bGQgZmFpbAorfQorCitzdGF0aWMgdm9pZCByd3NlbV9BQkJBMSh2b2lkKQoreworCVJTTChYMSk7CisJTUwoWTEpOworCU1VKFkxKTsKKwlSU1UoWDEpOworCisJTUwoWTEpOworCVdTTChYMSk7CisJV1NVKFgxKTsKKwlNVShZMSk7IC8vIHNob3VsZCBmYWlsCit9CisKKy8qCisgKiByZWFkX2xvY2soQSkKKyAqIHNwaW5fbG9jayhCKQorICoJCXNwaW5fbG9jayhCKQorICoJCXJlYWRfbG9jayhBKQorICovCitzdGF0aWMgdm9pZCBybG9ja19BQkJBMih2b2lkKQoreworCVJMKFgxKTsKKwlMKFkxKTsKKwlVKFkxKTsKKwlSVShYMSk7CisKKwlMKFkxKTsKKwlSTChYMSk7CisJUlUoWDEpOworCVUoWTEpOyAvLyBzaG91bGQgTk9UIGZhaWwKK30KKworc3RhdGljIHZvaWQgcndzZW1fQUJCQTIodm9pZCkKK3sKKwlSU0woWDEpOworCU1MKFkxKTsKKwlNVShZMSk7CisJUlNVKFgxKTsKKworCU1MKFkxKTsKKwlSU0woWDEpOworCVJTVShYMSk7CisJTVUoWTEpOyAvLyBzaG91bGQgZmFpbAorfQorCisKKy8qCisgKiB3cml0ZV9sb2NrKEEpCisgKiBzcGluX2xvY2soQikKKyAqCQlzcGluX2xvY2soQikKKyAqCQl3cml0ZV9sb2NrKEEpCisgKi8KK3N0YXRpYyB2b2lkIHJsb2NrX0FCQkEzKHZvaWQpCit7CisJV0woWDEpOworCUwoWTEpOworCVUoWTEpOworCVdVKFgxKTsKKworCUwoWTEpOworCVdMKFgxKTsKKwlXVShYMSk7CisJVShZMSk7IC8vIHNob3VsZCBmYWlsCit9CisKK3N0YXRpYyB2b2lkIHJ3c2VtX0FCQkEzKHZvaWQpCit7CisJV1NMKFgxKTsKKwlNTChZMSk7CisJTVUoWTEpOworCVdTVShYMSk7CisKKwlNTChZMSk7CisJV1NMKFgxKTsKKwlXU1UoWDEpOworCU1VKFkxKTsgLy8gc2hvdWxkIGZhaWwKK30KKworLyoKKyAqIEFCQkEgZGVhZGxvY2s6CisgKi8KKworI2RlZmluZSBFKCkJCQkJCVwKKwkJCQkJCVwKKwlMT0NLX1VOTE9DS18yKEEsIEIpOwkJCVwKKwlMT0NLX1VOTE9DS18yKEIsIEEpOyAvKiBmYWlsICovCisKKy8qCisgKiA2IHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQV9zcGluKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd2xvY2suaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQkFfd2xvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQV9ybG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LW11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkJBX211dGV4KQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd3NlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQV93c2VtKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcnNlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQV9yc2VtKQorCisjaWZkZWYgQ09ORklHX1JUX01VVEVYRVMKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJ0bXV0ZXguaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQkFfcnRtdXRleCk7CisjZW5kaWYKKworI3VuZGVmIEUKKworLyoKKyAqIEFCIEJDIENBIGRlYWRsb2NrOgorICovCisKKyNkZWZpbmUgRSgpCQkJCQlcCisJCQkJCQlcCisJTE9DS19VTkxPQ0tfMihBLCBCKTsJCQlcCisJTE9DS19VTkxPQ0tfMihCLCBDKTsJCQlcCisJTE9DS19VTkxPQ0tfMihDLCBBKTsgLyogZmFpbCAqLworCisvKgorICogNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQkNDQV9zcGluKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd2xvY2suaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQkNDQV93bG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkJDQ0FfcmxvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQ0NBX211dGV4KQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd3NlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQ0NBX3dzZW0pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1yc2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkJDQ0FfcnNlbSkKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkJDQ0FfcnRtdXRleCk7CisjZW5kaWYKKworI3VuZGVmIEUKKworLyoKKyAqIEFCIENBIEJDIGRlYWRsb2NrOgorICovCisKKyNkZWZpbmUgRSgpCQkJCQlcCisJCQkJCQlcCisJTE9DS19VTkxPQ0tfMihBLCBCKTsJCQlcCisJTE9DS19VTkxPQ0tfMihDLCBBKTsJCQlcCisJTE9DS19VTkxPQ0tfMihCLCBDKTsgLyogZmFpbCAqLworCisvKgorICogNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQ0FCQ19zcGluKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd2xvY2suaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQ0FCQ193bG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNBQkNfcmxvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDQUJDX211dGV4KQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd3NlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDQUJDX3dzZW0pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1yc2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNBQkNfcnNlbSkKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNBQkNfcnRtdXRleCk7CisjZW5kaWYKKworI3VuZGVmIEUKKworLyoKKyAqIEFCIEJDIENEIERBIGRlYWRsb2NrOgorICovCisKKyNkZWZpbmUgRSgpCQkJCQlcCisJCQkJCQlcCisJTE9DS19VTkxPQ0tfMihBLCBCKTsJCQlcCisJTE9DS19VTkxPQ0tfMihCLCBDKTsJCQlcCisJTE9DS19VTkxPQ0tfMihDLCBEKTsJCQlcCisJTE9DS19VTkxPQ0tfMihELCBBKTsgLyogZmFpbCAqLworCisvKgorICogNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQkNDRERBX3NwaW4pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQ0NEREFfd2xvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQ0NEREFfcmxvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQ0NEREFfbXV0ZXgpCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13c2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkJDQ0REQV93c2VtKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcnNlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJCQ0NEREFfcnNlbSkKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkJDQ0REQV9ydG11dGV4KTsKKyNlbmRpZgorCisjdW5kZWYgRQorCisvKgorICogQUIgQ0QgQkQgREEgZGVhZGxvY2s6CisgKi8KKyNkZWZpbmUgRSgpCQkJCQlcCisJCQkJCQlcCisJTE9DS19VTkxPQ0tfMihBLCBCKTsJCQlcCisJTE9DS19VTkxPQ0tfMihDLCBEKTsJCQlcCisJTE9DS19VTkxPQ0tfMihCLCBEKTsJCQlcCisJTE9DS19VTkxPQ0tfMihELCBBKTsgLyogZmFpbCAqLworCisvKgorICogNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQ0RCRERBX3NwaW4pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJEREFfd2xvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJEREFfcmxvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJEREFfbXV0ZXgpCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13c2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNEQkREQV93c2VtKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcnNlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJEREFfcnNlbSkKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNEQkREQV9ydG11dGV4KTsKKyNlbmRpZgorCisjdW5kZWYgRQorCisvKgorICogQUIgQ0QgQkMgREEgZGVhZGxvY2s6CisgKi8KKyNkZWZpbmUgRSgpCQkJCQlcCisJCQkJCQlcCisJTE9DS19VTkxPQ0tfMihBLCBCKTsJCQlcCisJTE9DS19VTkxPQ0tfMihDLCBEKTsJCQlcCisJTE9DS19VTkxPQ0tfMihCLCBDKTsJCQlcCisJTE9DS19VTkxPQ0tfMihELCBBKTsgLyogZmFpbCAqLworCisvKgorICogNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKEFCQ0RCQ0RBX3NwaW4pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJDREFfd2xvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJDREFfcmxvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJDREFfbXV0ZXgpCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13c2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNEQkNEQV93c2VtKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcnNlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoQUJDREJDREFfcnNlbSkKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShBQkNEQkNEQV9ydG11dGV4KTsKKyNlbmRpZgorCisjdW5kZWYgRQorCisvKgorICogRG91YmxlIHVubG9jazoKKyAqLworI2RlZmluZSBFKCkJCQkJCVwKKwkJCQkJCVwKKwlMT0NLKEEpOwkJCQlcCisJVU5MT0NLKEEpOwkJCQlcCisJVU5MT0NLKEEpOyAvKiBmYWlsICovCisKKy8qCisgKiA2IHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi5oIgorR0VORVJBVEVfVEVTVENBU0UoZG91YmxlX3VubG9ja19zcGluKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd2xvY2suaCIKK0dFTkVSQVRFX1RFU1RDQVNFKGRvdWJsZV91bmxvY2tfd2xvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay5oIgorR0VORVJBVEVfVEVTVENBU0UoZG91YmxlX3VubG9ja19ybG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LW11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShkb3VibGVfdW5sb2NrX211dGV4KQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd3NlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoZG91YmxlX3VubG9ja193c2VtKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcnNlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoZG91YmxlX3VubG9ja19yc2VtKQorCisjaWZkZWYgQ09ORklHX1JUX01VVEVYRVMKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJ0bXV0ZXguaCIKK0dFTkVSQVRFX1RFU1RDQVNFKGRvdWJsZV91bmxvY2tfcnRtdXRleCk7CisjZW5kaWYKKworI3VuZGVmIEUKKworLyoKKyAqIGluaXRpYWxpemluZyBhIGhlbGQgbG9jazoKKyAqLworI2RlZmluZSBFKCkJCQkJCVwKKwkJCQkJCVwKKwlMT0NLKEEpOwkJCQlcCisJSU5JVChBKTsgLyogZmFpbCAqLworCisvKgorICogNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4uaCIKK0dFTkVSQVRFX1RFU1RDQVNFKGluaXRfaGVsZF9zcGluKQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd2xvY2suaCIKK0dFTkVSQVRFX1RFU1RDQVNFKGluaXRfaGVsZF93bG9jaykKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLmgiCitHRU5FUkFURV9URVNUQ0FTRShpbml0X2hlbGRfcmxvY2spCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1tdXRleC5oIgorR0VORVJBVEVfVEVTVENBU0UoaW5pdF9oZWxkX211dGV4KQorI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd3NlbS5oIgorR0VORVJBVEVfVEVTVENBU0UoaW5pdF9oZWxkX3dzZW0pCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1yc2VtLmgiCitHRU5FUkFURV9URVNUQ0FTRShpbml0X2hlbGRfcnNlbSkKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ydG11dGV4LmgiCitHRU5FUkFURV9URVNUQ0FTRShpbml0X2hlbGRfcnRtdXRleCk7CisjZW5kaWYKKworI3VuZGVmIEUKKworLyoKKyAqIGxvY2tpbmcgYW4gaXJxLXNhZmUgbG9jayB3aXRoIGlycXMgZW5hYmxlZDoKKyAqLworI2RlZmluZSBFMSgpCQkJCVwKKwkJCQkJXAorCUlSUV9FTlRFUigpOwkJCVwKKwlMT0NLKEEpOwkJCVwKKwlVTkxPQ0soQSk7CQkJXAorCUlSUV9FWElUKCk7CisKKyNkZWZpbmUgRTIoKQkJCQlcCisJCQkJCVwKKwlMT0NLKEEpOwkJCVwKKwlVTkxPQ0soQSk7CisKKy8qCisgKiBHZW5lcmF0ZSAyNCB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4taGFyZGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzJfRVZFTlRTKGlycXNhZmUxX2hhcmRfc3BpbikKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcmxvY2staGFyZGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzJfRVZFTlRTKGlycXNhZmUxX2hhcmRfcmxvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLWhhcmRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18yX0VWRU5UUyhpcnFzYWZlMV9oYXJkX3dsb2NrKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zcGluLXNvZnRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18yX0VWRU5UUyhpcnFzYWZlMV9zb2Z0X3NwaW4pCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLXNvZnRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18yX0VWRU5UUyhpcnFzYWZlMV9zb2Z0X3Jsb2NrKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfMl9FVkVOVFMoaXJxc2FmZTFfc29mdF93bG9jaykKKworI3VuZGVmIEUxCisjdW5kZWYgRTIKKworLyoKKyAqIEVuYWJsaW5nIGhhcmRpcnFzIHdpdGggYSBzb2Z0aXJxLXNhZmUgbG9jayBoZWxkOgorICovCisjZGVmaW5lIEUxKCkJCQkJXAorCQkJCQlcCisJU09GVElSUV9FTlRFUigpOwkJXAorCUxPQ0soQSk7CQkJXAorCVVOTE9DSyhBKTsJCQlcCisJU09GVElSUV9FWElUKCk7CisKKyNkZWZpbmUgRTIoKQkJCQlcCisJCQkJCVwKKwlIQVJESVJRX0RJU0FCTEUoKTsJCVwKKwlMT0NLKEEpOwkJCVwKKwlIQVJESVJRX0VOQUJMRSgpOwkJXAorCVVOTE9DSyhBKTsKKworLyoKKyAqIEdlbmVyYXRlIDEyIHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzJfRVZFTlRTKGlycXNhZmUyQV9zcGluKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzJfRVZFTlRTKGlycXNhZmUyQV93bG9jaykKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcmxvY2suaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18yX0VWRU5UUyhpcnFzYWZlMkFfcmxvY2spCisKKyN1bmRlZiBFMQorI3VuZGVmIEUyCisKKy8qCisgKiBFbmFibGluZyBpcnFzIHdpdGggYW4gaXJxLXNhZmUgbG9jayBoZWxkOgorICovCisjZGVmaW5lIEUxKCkJCQkJXAorCQkJCQlcCisJSVJRX0VOVEVSKCk7CQkJXAorCUxPQ0soQSk7CQkJXAorCVVOTE9DSyhBKTsJCQlcCisJSVJRX0VYSVQoKTsKKworI2RlZmluZSBFMigpCQkJCVwKKwkJCQkJXAorCUlSUV9ESVNBQkxFKCk7CQkJXAorCUxPQ0soQSk7CQkJXAorCUlSUV9FTkFCTEUoKTsJCQlcCisJVU5MT0NLKEEpOworCisvKgorICogR2VuZXJhdGUgMjQgdGVzdGNhc2VzOgorICovCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zcGluLWhhcmRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18yX0VWRU5UUyhpcnFzYWZlMkJfaGFyZF9zcGluKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay1oYXJkaXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfMl9FVkVOVFMoaXJxc2FmZTJCX2hhcmRfcmxvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLWhhcmRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18yX0VWRU5UUyhpcnFzYWZlMkJfaGFyZF93bG9jaykKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfMl9FVkVOVFMoaXJxc2FmZTJCX3NvZnRfc3BpbikKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcmxvY2stc29mdGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzJfRVZFTlRTKGlycXNhZmUyQl9zb2Z0X3Jsb2NrKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfMl9FVkVOVFMoaXJxc2FmZTJCX3NvZnRfd2xvY2spCisKKyN1bmRlZiBFMQorI3VuZGVmIEUyCisKKy8qCisgKiBBY3F1aXJpbmcgYSBpcnEtdW5zYWZlIGxvY2sgd2hpbGUgaG9sZGluZyBhbiBpcnEtc2FmZS1sb2NrOgorICovCisjZGVmaW5lIEUxKCkJCQkJXAorCQkJCQlcCisJTE9DSyhBKTsJCQlcCisJTE9DSyhCKTsJCQlcCisJVU5MT0NLKEIpOwkJCVwKKwlVTkxPQ0soQSk7CQkJXAorCisjZGVmaW5lIEUyKCkJCQkJXAorCQkJCQlcCisJTE9DSyhCKTsJCQlcCisJVU5MT0NLKEIpOworCisjZGVmaW5lIEUzKCkJCQkJXAorCQkJCQlcCisJSVJRX0VOVEVSKCk7CQkJXAorCUxPQ0soQSk7CQkJXAorCVVOTE9DSyhBKTsJCQlcCisJSVJRX0VYSVQoKTsKKworLyoKKyAqIEdlbmVyYXRlIDM2IHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi1oYXJkaXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxc2FmZTNfaGFyZF9zcGluKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay1oYXJkaXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxc2FmZTNfaGFyZF9ybG9jaykKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtd2xvY2staGFyZGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycXNhZmUzX2hhcmRfd2xvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4tc29mdGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycXNhZmUzX3NvZnRfc3BpbikKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcmxvY2stc29mdGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycXNhZmUzX3NvZnRfcmxvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLXNvZnRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhpcnFzYWZlM19zb2Z0X3dsb2NrKQorCisjdW5kZWYgRTEKKyN1bmRlZiBFMgorI3VuZGVmIEUzCisKKy8qCisgKiBJZiBhIGxvY2sgdHVybnMgaW50byBzb2Z0aXJxLXNhZmUsIGJ1dCBlYXJsaWVyIGl0IHRvb2sKKyAqIGEgc29mdGlycS11bnNhZmUgbG9jazoKKyAqLworCisjZGVmaW5lIEUxKCkJCQkJXAorCUlSUV9ESVNBQkxFKCk7CQkJXAorCUxPQ0soQSk7CQkJXAorCUxPQ0soQik7CQkJXAorCVVOTE9DSyhCKTsJCQlcCisJVU5MT0NLKEEpOwkJCVwKKwlJUlFfRU5BQkxFKCk7CisKKyNkZWZpbmUgRTIoKQkJCQlcCisJTE9DSyhCKTsJCQlcCisJVU5MT0NLKEIpOworCisjZGVmaW5lIEUzKCkJCQkJXAorCUlSUV9FTlRFUigpOwkJCVwKKwlMT0NLKEEpOwkJCVwKKwlVTkxPQ0soQSk7CQkJXAorCUlSUV9FWElUKCk7CisKKy8qCisgKiBHZW5lcmF0ZSAzNiB0ZXN0Y2FzZXM6CisgKi8KKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4taGFyZGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycXNhZmU0X2hhcmRfc3BpbikKKworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtcmxvY2staGFyZGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycXNhZmU0X2hhcmRfcmxvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLWhhcmRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhpcnFzYWZlNF9oYXJkX3dsb2NrKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zcGluLXNvZnRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhpcnFzYWZlNF9zb2Z0X3NwaW4pCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLXNvZnRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhpcnFzYWZlNF9zb2Z0X3Jsb2NrKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxc2FmZTRfc29mdF93bG9jaykKKworI3VuZGVmIEUxCisjdW5kZWYgRTIKKyN1bmRlZiBFMworCisvKgorICogcmVhZC1sb2NrIC8gd3JpdGUtbG9jayBpcnEgaW52ZXJzaW9uLgorICoKKyAqIERlYWRsb2NrIHNjZW5hcmlvOgorICoKKyAqIENQVSMxIGlzIGF0ICMxLCBpLmUuIGl0IGhhcyB3cml0ZS1sb2NrZWQgQSwgYnV0IGhhcyBub3QKKyAqIHRha2VuIEIgeWV0LgorICoKKyAqIENQVSMyIGlzIGF0ICMyLCBpLmUuIGl0IGhhcyBsb2NrZWQgQi4KKyAqCisgKiBIYXJkaXJxIGhpdHMgQ1BVIzIgYXQgcG9pbnQgIzIgYW5kIGlzIHRyeWluZyB0byByZWFkLWxvY2sgQS4KKyAqCisgKiBUaGUgZGVhZGxvY2sgb2NjdXJzIGJlY2F1c2UgQ1BVIzEgd2lsbCBzcGluIG9uIEIsIGFuZCBDUFUjMgorICogd2lsbCBzcGluIG9uIEEuCisgKi8KKworI2RlZmluZSBFMSgpCQkJCVwKKwkJCQkJXAorCUlSUV9ESVNBQkxFKCk7CQkJXAorCVdMKEEpOwkJCQlcCisJTE9DSyhCKTsJCQlcCisJVU5MT0NLKEIpOwkJCVwKKwlXVShBKTsJCQkJXAorCUlSUV9FTkFCTEUoKTsKKworI2RlZmluZSBFMigpCQkJCVwKKwkJCQkJXAorCUxPQ0soQik7CQkJXAorCVVOTE9DSyhCKTsKKworI2RlZmluZSBFMygpCQkJCVwKKwkJCQkJXAorCUlSUV9FTlRFUigpOwkJCVwKKwlSTChBKTsJCQkJXAorCVJVKEEpOwkJCQlcCisJSVJRX0VYSVQoKTsKKworLyoKKyAqIEdlbmVyYXRlIDM2IHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3Qtc3Bpbi1oYXJkaXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxX2ludmVyc2lvbl9oYXJkX3NwaW4pCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXJsb2NrLWhhcmRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhpcnFfaW52ZXJzaW9uX2hhcmRfcmxvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXdsb2NrLWhhcmRpcnEuaCIKK0dFTkVSQVRFX1BFUk1VVEFUSU9OU18zX0VWRU5UUyhpcnFfaW52ZXJzaW9uX2hhcmRfd2xvY2spCisKKyNpbmNsdWRlICJsb2NraW5nLXNlbGZ0ZXN0LXNwaW4tc29mdGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycV9pbnZlcnNpb25fc29mdF9zcGluKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1ybG9jay1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxX2ludmVyc2lvbl9zb2Z0X3Jsb2NrKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC13bG9jay1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxX2ludmVyc2lvbl9zb2Z0X3dsb2NrKQorCisjdW5kZWYgRTEKKyN1bmRlZiBFMgorI3VuZGVmIEUzCisKKy8qCisgKiByZWFkLWxvY2sgLyB3cml0ZS1sb2NrIHJlY3Vyc2lvbiB0aGF0IGlzIGFjdHVhbGx5IHNhZmUuCisgKi8KKworI2RlZmluZSBFMSgpCQkJCVwKKwkJCQkJXAorCUlSUV9ESVNBQkxFKCk7CQkJXAorCVdMKEEpOwkJCQlcCisJV1UoQSk7CQkJCVwKKwlJUlFfRU5BQkxFKCk7CisKKyNkZWZpbmUgRTIoKQkJCQlcCisJCQkJCVwKKwlSTChBKTsJCQkJXAorCVJVKEEpOwkJCQlcCisKKyNkZWZpbmUgRTMoKQkJCQlcCisJCQkJCVwKKwlJUlFfRU5URVIoKTsJCQlcCisJUkwoQSk7CQkJCVwKKwlMKEIpOwkJCQlcCisJVShCKTsJCQkJXAorCVJVKEEpOwkJCQlcCisJSVJRX0VYSVQoKTsKKworLyoKKyAqIEdlbmVyYXRlIDEyIHRlc3RjYXNlczoKKyAqLworI2luY2x1ZGUgImxvY2tpbmctc2VsZnRlc3QtaGFyZGlycS5oIgorR0VORVJBVEVfUEVSTVVUQVRJT05TXzNfRVZFTlRTKGlycV9yZWFkX3JlY3Vyc2lvbl9oYXJkKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zb2Z0aXJxLmgiCitHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxX3JlYWRfcmVjdXJzaW9uX3NvZnQpCisKKyN1bmRlZiBFMQorI3VuZGVmIEUyCisjdW5kZWYgRTMKKworLyoKKyAqIHJlYWQtbG9jayAvIHdyaXRlLWxvY2sgcmVjdXJzaW9uIHRoYXQgaXMgdW5zYWZlLgorICovCisKKyNkZWZpbmUgRTEoKQkJCQlcCisJCQkJCVwKKwlJUlFfRElTQUJMRSgpOwkJCVwKKwlMKEIpOwkJCQlcCisJV0woQSk7CQkJCVwKKwlXVShBKTsJCQkJXAorCVUoQik7CQkJCVwKKwlJUlFfRU5BQkxFKCk7CisKKyNkZWZpbmUgRTIoKQkJCQlcCisJCQkJCVwKKwlSTChBKTsJCQkJXAorCVJVKEEpOwkJCQlcCisKKyNkZWZpbmUgRTMoKQkJCQlcCisJCQkJCVwKKwlJUlFfRU5URVIoKTsJCQlcCisJTChCKTsJCQkJXAorCVUoQik7CQkJCVwKKwlJUlFfRVhJVCgpOworCisvKgorICogR2VuZXJhdGUgMTIgdGVzdGNhc2VzOgorICovCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1oYXJkaXJxLmgiCisvLyBHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxX3JlYWRfcmVjdXJzaW9uMl9oYXJkKQorCisjaW5jbHVkZSAibG9ja2luZy1zZWxmdGVzdC1zb2Z0aXJxLmgiCisvLyBHRU5FUkFURV9QRVJNVVRBVElPTlNfM19FVkVOVFMoaXJxX3JlYWRfcmVjdXJzaW9uMl9zb2Z0KQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MKKyMgZGVmaW5lIElfU1BJTkxPQ0soeCkJbG9ja2RlcF9yZXNldF9sb2NrKCZsb2NrXyMjeC5kZXBfbWFwKQorIyBkZWZpbmUgSV9SV0xPQ0soeCkJbG9ja2RlcF9yZXNldF9sb2NrKCZyd2xvY2tfIyN4LmRlcF9tYXApCisjIGRlZmluZSBJX01VVEVYKHgpCWxvY2tkZXBfcmVzZXRfbG9jaygmbXV0ZXhfIyN4LmRlcF9tYXApCisjIGRlZmluZSBJX1JXU0VNKHgpCWxvY2tkZXBfcmVzZXRfbG9jaygmcndzZW1fIyN4LmRlcF9tYXApCisjIGRlZmluZSBJX1dXKHgpCWxvY2tkZXBfcmVzZXRfbG9jaygmeC5kZXBfbWFwKQorI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjIGRlZmluZSBJX1JUTVVURVgoeCkJbG9ja2RlcF9yZXNldF9sb2NrKCZydG11dGV4XyMjeC5kZXBfbWFwKQorI2VuZGlmCisjZWxzZQorIyBkZWZpbmUgSV9TUElOTE9DSyh4KQorIyBkZWZpbmUgSV9SV0xPQ0soeCkKKyMgZGVmaW5lIElfTVVURVgoeCkKKyMgZGVmaW5lIElfUldTRU0oeCkKKyMgZGVmaW5lIElfV1coeCkKKyNlbmRpZgorCisjaWZuZGVmIElfUlRNVVRFWAorIyBkZWZpbmUgSV9SVE1VVEVYKHgpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjZGVmaW5lIEkyX1JUTVVURVgoeCkJcnRfbXV0ZXhfaW5pdCgmcnRtdXRleF8jI3gpCisjZWxzZQorI2RlZmluZSBJMl9SVE1VVEVYKHgpCisjZW5kaWYKKworI2RlZmluZSBJMSh4KQkJCQkJXAorCWRvIHsJCQkJCVwKKwkJSV9TUElOTE9DSyh4KTsJCQlcCisJCUlfUldMT0NLKHgpOwkJCVwKKwkJSV9NVVRFWCh4KTsJCQlcCisJCUlfUldTRU0oeCk7CQkJXAorCQlJX1JUTVVURVgoeCk7CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgSTIoeCkJCQkJCVwKKwlkbyB7CQkJCQlcCisJCXJhd19zcGluX2xvY2tfaW5pdCgmbG9ja18jI3gpOwlcCisJCXJ3bG9ja19pbml0KCZyd2xvY2tfIyN4KTsJXAorCQltdXRleF9pbml0KCZtdXRleF8jI3gpOwkJXAorCQlpbml0X3J3c2VtKCZyd3NlbV8jI3gpOwkJXAorCQlJMl9SVE1VVEVYKHgpOwkJCVwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCByZXNldF9sb2Nrcyh2b2lkKQoreworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJbG9ja2RlcF9mcmVlX2tleV9yYW5nZSgmd3dfbG9ja2RlcC5hY3F1aXJlX2tleSwgMSk7CisJbG9ja2RlcF9mcmVlX2tleV9yYW5nZSgmd3dfbG9ja2RlcC5tdXRleF9rZXksIDEpOworCisJSTEoQSk7IEkxKEIpOyBJMShDKTsgSTEoRCk7CisJSTEoWDEpOyBJMShYMik7IEkxKFkxKTsgSTEoWTIpOyBJMShaMSk7IEkxKFoyKTsKKwlJX1dXKHQpOyBJX1dXKHQyKTsgSV9XVyhvLmJhc2UpOyBJX1dXKG8yLmJhc2UpOyBJX1dXKG8zLmJhc2UpOworCWxvY2tkZXBfcmVzZXQoKTsKKwlJMihBKTsgSTIoQik7IEkyKEMpOyBJMihEKTsKKwlpbml0X3NoYXJlZF9jbGFzc2VzKCk7CisKKwl3d19tdXRleF9pbml0KCZvLCAmd3dfbG9ja2RlcCk7IHd3X211dGV4X2luaXQoJm8yLCAmd3dfbG9ja2RlcCk7IHd3X211dGV4X2luaXQoJm8zLCAmd3dfbG9ja2RlcCk7CisJbWVtc2V0KCZ0LCAwLCBzaXplb2YodCkpOyBtZW1zZXQoJnQyLCAwLCBzaXplb2YodDIpKTsKKwltZW1zZXQoJnd3X2xvY2tkZXAuYWNxdWlyZV9rZXksIDAsIHNpemVvZih3d19sb2NrZGVwLmFjcXVpcmVfa2V5KSk7CisJbWVtc2V0KCZ3d19sb2NrZGVwLm11dGV4X2tleSwgMCwgc2l6ZW9mKHd3X2xvY2tkZXAubXV0ZXhfa2V5KSk7CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCisjdW5kZWYgSQorCitzdGF0aWMgaW50IHRlc3RjYXNlX3RvdGFsOworc3RhdGljIGludCB0ZXN0Y2FzZV9zdWNjZXNzZXM7CitzdGF0aWMgaW50IGV4cGVjdGVkX3Rlc3RjYXNlX2ZhaWx1cmVzOworc3RhdGljIGludCB1bmV4cGVjdGVkX3Rlc3RjYXNlX2ZhaWx1cmVzOworCitzdGF0aWMgdm9pZCBkb3Rlc3Qodm9pZCAoKnRlc3RjYXNlX2ZuKSh2b2lkKSwgaW50IGV4cGVjdGVkLCBpbnQgbG9ja2NsYXNzX21hc2spCit7CisJdW5zaWduZWQgbG9uZyBzYXZlZF9wcmVlbXB0X2NvdW50ID0gcHJlZW1wdF9jb3VudCgpOworCisJV0FSTl9PTihpcnFzX2Rpc2FibGVkKCkpOworCisJdGVzdGNhc2VfZm4oKTsKKwkvKgorCSAqIEZpbHRlciBvdXQgZXhwZWN0ZWQgZmFpbHVyZXM6CisJICovCisjaWZuZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCisJaWYgKGV4cGVjdGVkID09IEZBSUxVUkUgJiYgZGVidWdfbG9ja3MpIHsKKwkJZXhwZWN0ZWRfdGVzdGNhc2VfZmFpbHVyZXMrKzsKKwkJcHJfY29udCgiZmFpbGVkfCIpOworCX0KKwllbHNlCisjZW5kaWYKKwlpZiAoZGVidWdfbG9ja3MgIT0gZXhwZWN0ZWQpIHsKKwkJdW5leHBlY3RlZF90ZXN0Y2FzZV9mYWlsdXJlcysrOworCQlwcl9jb250KCJGQUlMRUR8Iik7CisJfSBlbHNlIHsKKwkJdGVzdGNhc2Vfc3VjY2Vzc2VzKys7CisJCXByX2NvbnQoIiAgb2sgIHwiKTsKKwl9CisJdGVzdGNhc2VfdG90YWwrKzsKKworCWlmIChkZWJ1Z19sb2Nrc192ZXJib3NlKQorCQlwcl9jb250KCIgbG9ja2NsYXNzIG1hc2s6ICV4LCBkZWJ1Z19sb2NrczogJWQsIGV4cGVjdGVkOiAlZFxuIiwKKwkJCWxvY2tjbGFzc19tYXNrLCBkZWJ1Z19sb2NrcywgZXhwZWN0ZWQpOworCS8qCisJICogU29tZSB0ZXN0cyAoZS5nLiBkb3VibGUtdW5sb2NrKSBtaWdodCBjb3JydXB0IHRoZSBwcmVlbXB0aW9uCisJICogY291bnQsIHNvIHJlc3RvcmUgaXQ6CisJICovCisJcHJlZW1wdF9jb3VudF9zZXQoc2F2ZWRfcHJlZW1wdF9jb3VudCk7CisjaWZkZWYgQ09ORklHX1RSQUNFX0lSUUZMQUdTCisJaWYgKHNvZnRpcnFfY291bnQoKSkKKwkJY3VycmVudC0+c29mdGlycXNfZW5hYmxlZCA9IDA7CisJZWxzZQorCQljdXJyZW50LT5zb2Z0aXJxc19lbmFibGVkID0gMTsKKyNlbmRpZgorCisJcmVzZXRfbG9ja3MoKTsKK30KKworI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCisjZGVmaW5lIGRvdGVzdF9ydChmbiwgZSwgbSkJZG90ZXN0KChmbiksIChlKSwgKG0pKQorI2Vsc2UKKyNkZWZpbmUgZG90ZXN0X3J0KGZuLCBlLCBtKQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwcmludF90ZXN0bmFtZShjb25zdCBjaGFyICp0ZXN0bmFtZSkKK3sKKwlwcmludGsoIiUzM3M6IiwgdGVzdG5hbWUpOworfQorCisjZGVmaW5lIERPX1RFU1RDQVNFXzEoZGVzYywgbmFtZSwgbnIpCQkJCVwKKwlwcmludF90ZXN0bmFtZShkZXNjIi8iI25yKTsJCQkJXAorCWRvdGVzdChuYW1lIyNfIyNuciwgU1VDQ0VTUywgTE9DS1RZUEVfUldMT0NLKTsJCVwKKwlwcl9jb250KCJcbiIpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzFCKGRlc2MsIG5hbWUsIG5yKQkJCQlcCisJcHJpbnRfdGVzdG5hbWUoZGVzYyIvIiNucik7CQkJCVwKKwlkb3Rlc3QobmFtZSMjXyMjbnIsIEZBSUxVUkUsIExPQ0tUWVBFX1JXTE9DSyk7CQlcCisJcHJfY29udCgiXG4iKTsKKworI2RlZmluZSBET19URVNUQ0FTRV8zKGRlc2MsIG5hbWUsIG5yKQkJCQlcCisJcHJpbnRfdGVzdG5hbWUoZGVzYyIvIiNucik7CQkJCVwKKwlkb3Rlc3QobmFtZSMjX3NwaW5fIyNuciwgRkFJTFVSRSwgTE9DS1RZUEVfU1BJTik7CVwKKwlkb3Rlc3QobmFtZSMjX3dsb2NrXyMjbnIsIEZBSUxVUkUsIExPQ0tUWVBFX1JXTE9DSyk7CVwKKwlkb3Rlc3QobmFtZSMjX3Jsb2NrXyMjbnIsIFNVQ0NFU1MsIExPQ0tUWVBFX1JXTE9DSyk7CVwKKwlwcl9jb250KCJcbiIpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzNSVyhkZXNjLCBuYW1lLCBucikJCQkJXAorCXByaW50X3Rlc3RuYW1lKGRlc2MiLyIjbnIpOwkJCQlcCisJZG90ZXN0KG5hbWUjI19zcGluXyMjbnIsIEZBSUxVUkUsIExPQ0tUWVBFX1NQSU58TE9DS1RZUEVfUldMT0NLKTtcCisJZG90ZXN0KG5hbWUjI193bG9ja18jI25yLCBGQUlMVVJFLCBMT0NLVFlQRV9SV0xPQ0spOwlcCisJZG90ZXN0KG5hbWUjI19ybG9ja18jI25yLCBTVUNDRVNTLCBMT0NLVFlQRV9SV0xPQ0spOwlcCisJcHJfY29udCgiXG4iKTsKKworI2RlZmluZSBET19URVNUQ0FTRV82KGRlc2MsIG5hbWUpCQkJCVwKKwlwcmludF90ZXN0bmFtZShkZXNjKTsJCQkJCVwKKwlkb3Rlc3QobmFtZSMjX3NwaW4sIEZBSUxVUkUsIExPQ0tUWVBFX1NQSU4pOwkJXAorCWRvdGVzdChuYW1lIyNfd2xvY2ssIEZBSUxVUkUsIExPQ0tUWVBFX1JXTE9DSyk7CQlcCisJZG90ZXN0KG5hbWUjI19ybG9jaywgRkFJTFVSRSwgTE9DS1RZUEVfUldMT0NLKTsJCVwKKwlkb3Rlc3QobmFtZSMjX211dGV4LCBGQUlMVVJFLCBMT0NLVFlQRV9NVVRFWCk7CQlcCisJZG90ZXN0KG5hbWUjI193c2VtLCBGQUlMVVJFLCBMT0NLVFlQRV9SV1NFTSk7CQlcCisJZG90ZXN0KG5hbWUjI19yc2VtLCBGQUlMVVJFLCBMT0NLVFlQRV9SV1NFTSk7CQlcCisJZG90ZXN0X3J0KG5hbWUjI19ydG11dGV4LCBGQUlMVVJFLCBMT0NLVFlQRV9SVE1VVEVYKTsJXAorCXByX2NvbnQoIlxuIik7CisKKyNkZWZpbmUgRE9fVEVTVENBU0VfNl9TVUNDRVNTKGRlc2MsIG5hbWUpCQkJXAorCXByaW50X3Rlc3RuYW1lKGRlc2MpOwkJCQkJXAorCWRvdGVzdChuYW1lIyNfc3BpbiwgU1VDQ0VTUywgTE9DS1RZUEVfU1BJTik7CQlcCisJZG90ZXN0KG5hbWUjI193bG9jaywgU1VDQ0VTUywgTE9DS1RZUEVfUldMT0NLKTsJCVwKKwlkb3Rlc3QobmFtZSMjX3Jsb2NrLCBTVUNDRVNTLCBMT0NLVFlQRV9SV0xPQ0spOwkJXAorCWRvdGVzdChuYW1lIyNfbXV0ZXgsIFNVQ0NFU1MsIExPQ0tUWVBFX01VVEVYKTsJCVwKKwlkb3Rlc3QobmFtZSMjX3dzZW0sIFNVQ0NFU1MsIExPQ0tUWVBFX1JXU0VNKTsJCVwKKwlkb3Rlc3QobmFtZSMjX3JzZW0sIFNVQ0NFU1MsIExPQ0tUWVBFX1JXU0VNKTsJCVwKKwlkb3Rlc3RfcnQobmFtZSMjX3J0bXV0ZXgsIFNVQ0NFU1MsIExPQ0tUWVBFX1JUTVVURVgpOwlcCisJcHJfY29udCgiXG4iKTsKKworLyoKKyAqICdyZWFkJyB2YXJpYW50OiBybG9ja3MgbXVzdCBub3QgdHJpZ2dlci4KKyAqLworI2RlZmluZSBET19URVNUQ0FTRV82UihkZXNjLCBuYW1lKQkJCQlcCisJcHJpbnRfdGVzdG5hbWUoZGVzYyk7CQkJCQlcCisJZG90ZXN0KG5hbWUjI19zcGluLCBGQUlMVVJFLCBMT0NLVFlQRV9TUElOKTsJCVwKKwlkb3Rlc3QobmFtZSMjX3dsb2NrLCBGQUlMVVJFLCBMT0NLVFlQRV9SV0xPQ0spOwkJXAorCWRvdGVzdChuYW1lIyNfcmxvY2ssIFNVQ0NFU1MsIExPQ0tUWVBFX1JXTE9DSyk7CQlcCisJZG90ZXN0KG5hbWUjI19tdXRleCwgRkFJTFVSRSwgTE9DS1RZUEVfTVVURVgpOwkJXAorCWRvdGVzdChuYW1lIyNfd3NlbSwgRkFJTFVSRSwgTE9DS1RZUEVfUldTRU0pOwkJXAorCWRvdGVzdChuYW1lIyNfcnNlbSwgRkFJTFVSRSwgTE9DS1RZUEVfUldTRU0pOwkJXAorCWRvdGVzdF9ydChuYW1lIyNfcnRtdXRleCwgRkFJTFVSRSwgTE9DS1RZUEVfUlRNVVRFWCk7CVwKKwlwcl9jb250KCJcbiIpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzJJKGRlc2MsIG5hbWUsIG5yKQkJCQlcCisJRE9fVEVTVENBU0VfMSgiaGFyZC0iZGVzYywgbmFtZSMjX2hhcmQsIG5yKTsJCVwKKwlET19URVNUQ0FTRV8xKCJzb2Z0LSJkZXNjLCBuYW1lIyNfc29mdCwgbnIpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzJJQihkZXNjLCBuYW1lLCBucikJCQkJXAorCURPX1RFU1RDQVNFXzFCKCJoYXJkLSJkZXNjLCBuYW1lIyNfaGFyZCwgbnIpOwkJXAorCURPX1RFU1RDQVNFXzFCKCJzb2Z0LSJkZXNjLCBuYW1lIyNfc29mdCwgbnIpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzZJKGRlc2MsIG5hbWUsIG5yKQkJCQlcCisJRE9fVEVTVENBU0VfMygiaGFyZC0iZGVzYywgbmFtZSMjX2hhcmQsIG5yKTsJCVwKKwlET19URVNUQ0FTRV8zKCJzb2Z0LSJkZXNjLCBuYW1lIyNfc29mdCwgbnIpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzZJUlcoZGVzYywgbmFtZSwgbnIpCQkJXAorCURPX1RFU1RDQVNFXzNSVygiaGFyZC0iZGVzYywgbmFtZSMjX2hhcmQsIG5yKTsJCVwKKwlET19URVNUQ0FTRV8zUlcoInNvZnQtImRlc2MsIG5hbWUjI19zb2Z0LCBucik7CisKKyNkZWZpbmUgRE9fVEVTVENBU0VfMngzKGRlc2MsIG5hbWUpCQkJCVwKKwlET19URVNUQ0FTRV8zKGRlc2MsIG5hbWUsIDEyKTsJCQkJXAorCURPX1RFU1RDQVNFXzMoZGVzYywgbmFtZSwgMjEpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzJ4NihkZXNjLCBuYW1lKQkJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMTIpOwkJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMjEpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzZ4MihkZXNjLCBuYW1lKQkJCQlcCisJRE9fVEVTVENBU0VfMkkoZGVzYywgbmFtZSwgMTIzKTsJCQlcCisJRE9fVEVTVENBU0VfMkkoZGVzYywgbmFtZSwgMTMyKTsJCQlcCisJRE9fVEVTVENBU0VfMkkoZGVzYywgbmFtZSwgMjEzKTsJCQlcCisJRE9fVEVTVENBU0VfMkkoZGVzYywgbmFtZSwgMjMxKTsJCQlcCisJRE9fVEVTVENBU0VfMkkoZGVzYywgbmFtZSwgMzEyKTsJCQlcCisJRE9fVEVTVENBU0VfMkkoZGVzYywgbmFtZSwgMzIxKTsKKworI2RlZmluZSBET19URVNUQ0FTRV82eDJCKGRlc2MsIG5hbWUpCQkJCVwKKwlET19URVNUQ0FTRV8ySUIoZGVzYywgbmFtZSwgMTIzKTsJCQlcCisJRE9fVEVTVENBU0VfMklCKGRlc2MsIG5hbWUsIDEzMik7CQkJXAorCURPX1RFU1RDQVNFXzJJQihkZXNjLCBuYW1lLCAyMTMpOwkJCVwKKwlET19URVNUQ0FTRV8ySUIoZGVzYywgbmFtZSwgMjMxKTsJCQlcCisJRE9fVEVTVENBU0VfMklCKGRlc2MsIG5hbWUsIDMxMik7CQkJXAorCURPX1RFU1RDQVNFXzJJQihkZXNjLCBuYW1lLCAzMjEpOworCisjZGVmaW5lIERPX1RFU1RDQVNFXzZ4NihkZXNjLCBuYW1lKQkJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMTIzKTsJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMTMyKTsJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMjEzKTsJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMjMxKTsJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMzEyKTsJCQlcCisJRE9fVEVTVENBU0VfNkkoZGVzYywgbmFtZSwgMzIxKTsKKworI2RlZmluZSBET19URVNUQ0FTRV82eDZSVyhkZXNjLCBuYW1lKQkJCQlcCisJRE9fVEVTVENBU0VfNklSVyhkZXNjLCBuYW1lLCAxMjMpOwkJCVwKKwlET19URVNUQ0FTRV82SVJXKGRlc2MsIG5hbWUsIDEzMik7CQkJXAorCURPX1RFU1RDQVNFXzZJUlcoZGVzYywgbmFtZSwgMjEzKTsJCQlcCisJRE9fVEVTVENBU0VfNklSVyhkZXNjLCBuYW1lLCAyMzEpOwkJCVwKKwlET19URVNUQ0FTRV82SVJXKGRlc2MsIG5hbWUsIDMxMik7CQkJXAorCURPX1RFU1RDQVNFXzZJUlcoZGVzYywgbmFtZSwgMzIxKTsKKworc3RhdGljIHZvaWQgd3dfdGVzdF9mYWlsX2FjcXVpcmUodm9pZCkKK3sKKwlpbnQgcmV0OworCisJV1dBSSgmdCk7CisJdC5zdGFtcCsrOworCisJcmV0ID0gV1dMKCZvLCAmdCk7CisKKwlpZiAoV0FSTl9PTighby5jdHgpIHx8CisJICAgIFdBUk5fT04ocmV0KSkKKwkJcmV0dXJuOworCisJLyogTm8gbG9ja2RlcCB0ZXN0LCBwdXJlIEFQSSAqLworCXJldCA9IFdXTCgmbywgJnQpOworCVdBUk5fT04ocmV0ICE9IC1FQUxSRUFEWSk7CisKKwlyZXQgPSBXV1QoJm8pOworCVdBUk5fT04ocmV0KTsKKworCXQyID0gdDsKKwl0Mi5zdGFtcCsrOworCXJldCA9IFdXTCgmbywgJnQyKTsKKwlXQVJOX09OKHJldCAhPSAtRURFQURMSyk7CisJV1dVKCZvKTsKKworCWlmIChXV1QoJm8pKQorCQlXV1UoJm8pOworI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DCisJZWxzZQorCQlERUJVR19MT0NLU19XQVJOX09OKDEpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3Rfbm9ybWFsKHZvaWQpCit7CisJaW50IHJldDsKKworCVdXQUkoJnQpOworCisJLyoKKwkgKiBOb25lIG9mIHRoZSB3d19tdXRleCBjb2RlcGF0aHMgc2hvdWxkIGJlIHRha2VuIGluIHRoZSAnbm9ybWFsJworCSAqIG11dGV4IGNhbGxzLiBUaGUgZWFzaWVzdCB3YXkgdG8gdmVyaWZ5IHRoaXMgaXMgYnkgdXNpbmcgdGhlCisJICogbm9ybWFsIG11dGV4IGNhbGxzLCBhbmQgbWFraW5nIHN1cmUgby5jdHggaXMgdW5tb2RpZmllZC4KKwkgKi8KKworCS8qIG11dGV4X2xvY2sgKGFuZCBpbmRpcmVjdGx5LCBtdXRleF9sb2NrX25lc3RlZCkgKi8KKwlvLmN0eCA9ICh2b2lkICopfjBVTDsKKwltdXRleF9sb2NrKCZvLmJhc2UpOworCW11dGV4X3VubG9jaygmby5iYXNlKTsKKwlXQVJOX09OKG8uY3R4ICE9ICh2b2lkICopfjBVTCk7CisKKwkvKiBtdXRleF9sb2NrX2ludGVycnVwdGlibGUgKGFuZCAqX25lc3RlZCkgKi8KKwlvLmN0eCA9ICh2b2lkICopfjBVTDsKKwlyZXQgPSBtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJm8uYmFzZSk7CisJaWYgKCFyZXQpCisJCW11dGV4X3VubG9jaygmby5iYXNlKTsKKwllbHNlCisJCVdBUk5fT04oMSk7CisJV0FSTl9PTihvLmN0eCAhPSAodm9pZCAqKX4wVUwpOworCisJLyogbXV0ZXhfbG9ja19raWxsYWJsZSAoYW5kICpfbmVzdGVkKSAqLworCW8uY3R4ID0gKHZvaWQgKil+MFVMOworCXJldCA9IG11dGV4X2xvY2tfa2lsbGFibGUoJm8uYmFzZSk7CisJaWYgKCFyZXQpCisJCW11dGV4X3VubG9jaygmby5iYXNlKTsKKwllbHNlCisJCVdBUk5fT04oMSk7CisJV0FSTl9PTihvLmN0eCAhPSAodm9pZCAqKX4wVUwpOworCisJLyogdHJ5bG9jaywgc3VjY2VlZGluZyAqLworCW8uY3R4ID0gKHZvaWQgKil+MFVMOworCXJldCA9IG11dGV4X3RyeWxvY2soJm8uYmFzZSk7CisJV0FSTl9PTighcmV0KTsKKwlpZiAocmV0KQorCQltdXRleF91bmxvY2soJm8uYmFzZSk7CisJZWxzZQorCQlXQVJOX09OKDEpOworCVdBUk5fT04oby5jdHggIT0gKHZvaWQgKil+MFVMKTsKKworCS8qIHRyeWxvY2ssIGZhaWxpbmcgKi8KKwlvLmN0eCA9ICh2b2lkICopfjBVTDsKKwltdXRleF9sb2NrKCZvLmJhc2UpOworCXJldCA9IG11dGV4X3RyeWxvY2soJm8uYmFzZSk7CisJV0FSTl9PTihyZXQpOworCW11dGV4X3VubG9jaygmby5iYXNlKTsKKwlXQVJOX09OKG8uY3R4ICE9ICh2b2lkICopfjBVTCk7CisKKwkvKiBuZXN0X2xvY2sgKi8KKwlvLmN0eCA9ICh2b2lkICopfjBVTDsKKwltdXRleF9sb2NrX25lc3RfbG9jaygmby5iYXNlLCAmdCk7CisJbXV0ZXhfdW5sb2NrKCZvLmJhc2UpOworCVdBUk5fT04oby5jdHggIT0gKHZvaWQgKil+MFVMKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF90d29fY29udGV4dHModm9pZCkKK3sKKwlXV0FJKCZ0KTsKKwlXV0FJKCZ0Mik7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3RfZGlmZl9jbGFzcyh2b2lkKQoreworCVdXQUkoJnQpOworI2lmZGVmIENPTkZJR19ERUJVR19NVVRFWEVTCisJdC53d19jbGFzcyA9IE5VTEw7CisjZW5kaWYKKwlXV0woJm8sICZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9jb250ZXh0X2RvbmVfdHdpY2Uodm9pZCkKK3sKKwlXV0FJKCZ0KTsKKwlXV0FEKCZ0KTsKKwlXV0FEKCZ0KTsKKwlXV0FGKCZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9jb250ZXh0X3VubG9ja190d2ljZSh2b2lkKQoreworCVdXQUkoJnQpOworCVdXQUQoJnQpOworCVdXQUYoJnQpOworCVdXQUYoJnQpOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X2NvbnRleHRfZmluaV9lYXJseSh2b2lkKQoreworCVdXQUkoJnQpOworCVdXTCgmbywgJnQpOworCVdXQUQoJnQpOworCVdXQUYoJnQpOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X2NvbnRleHRfbG9ja19hZnRlcl9kb25lKHZvaWQpCit7CisJV1dBSSgmdCk7CisJV1dBRCgmdCk7CisJV1dMKCZvLCAmdCk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3Rfb2JqZWN0X3VubG9ja190d2ljZSh2b2lkKQoreworCVdXTDEoJm8pOworCVdXVSgmbyk7CisJV1dVKCZvKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9vYmplY3RfbG9ja191bmJhbGFuY2VkKHZvaWQpCit7CisJV1dBSSgmdCk7CisJV1dMKCZvLCAmdCk7CisJdC5hY3F1aXJlZCA9IDA7CisJV1dVKCZvKTsKKwlXV0FGKCZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9vYmplY3RfbG9ja19zdGFsZV9jb250ZXh0KHZvaWQpCit7CisJV1dBSSgmdCk7CisJby5jdHggPSAmdDI7CisJV1dMKCZvLCAmdCk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3RfZWRlYWRsa19ub3JtYWwodm9pZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbzIuYmFzZSk7CisJbzIuY3R4ID0gJnQyOworCW11dGV4X3JlbGVhc2UoJm8yLmJhc2UuZGVwX21hcCwgMSwgX1RISVNfSVBfKTsKKworCVdXQUkoJnQpOworCXQyID0gdDsKKwl0Mi5zdGFtcC0tOworCisJcmV0ID0gV1dMKCZvLCAmdCk7CisJV0FSTl9PTihyZXQpOworCisJcmV0ID0gV1dMKCZvMiwgJnQpOworCVdBUk5fT04ocmV0ICE9IC1FREVBRExLKTsKKworCW8yLmN0eCA9IE5VTEw7CisJbXV0ZXhfYWNxdWlyZSgmbzIuYmFzZS5kZXBfbWFwLCAwLCAxLCBfVEhJU19JUF8pOworCW11dGV4X3VubG9jaygmbzIuYmFzZSk7CisJV1dVKCZvKTsKKworCVdXTCgmbzIsICZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9lZGVhZGxrX25vcm1hbF9zbG93KHZvaWQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm8yLmJhc2UpOworCW11dGV4X3JlbGVhc2UoJm8yLmJhc2UuZGVwX21hcCwgMSwgX1RISVNfSVBfKTsKKwlvMi5jdHggPSAmdDI7CisKKwlXV0FJKCZ0KTsKKwl0MiA9IHQ7CisJdDIuc3RhbXAtLTsKKworCXJldCA9IFdXTCgmbywgJnQpOworCVdBUk5fT04ocmV0KTsKKworCXJldCA9IFdXTCgmbzIsICZ0KTsKKwlXQVJOX09OKHJldCAhPSAtRURFQURMSyk7CisKKwlvMi5jdHggPSBOVUxMOworCW11dGV4X2FjcXVpcmUoJm8yLmJhc2UuZGVwX21hcCwgMCwgMSwgX1RISVNfSVBfKTsKKwltdXRleF91bmxvY2soJm8yLmJhc2UpOworCVdXVSgmbyk7CisKKwl3d19tdXRleF9sb2NrX3Nsb3coJm8yLCAmdCk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3RfZWRlYWRsa19ub191bmxvY2sodm9pZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbzIuYmFzZSk7CisJbzIuY3R4ID0gJnQyOworCW11dGV4X3JlbGVhc2UoJm8yLmJhc2UuZGVwX21hcCwgMSwgX1RISVNfSVBfKTsKKworCVdXQUkoJnQpOworCXQyID0gdDsKKwl0Mi5zdGFtcC0tOworCisJcmV0ID0gV1dMKCZvLCAmdCk7CisJV0FSTl9PTihyZXQpOworCisJcmV0ID0gV1dMKCZvMiwgJnQpOworCVdBUk5fT04ocmV0ICE9IC1FREVBRExLKTsKKworCW8yLmN0eCA9IE5VTEw7CisJbXV0ZXhfYWNxdWlyZSgmbzIuYmFzZS5kZXBfbWFwLCAwLCAxLCBfVEhJU19JUF8pOworCW11dGV4X3VubG9jaygmbzIuYmFzZSk7CisKKwlXV0woJm8yLCAmdCk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3RfZWRlYWRsa19ub191bmxvY2tfc2xvdyh2b2lkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZvMi5iYXNlKTsKKwltdXRleF9yZWxlYXNlKCZvMi5iYXNlLmRlcF9tYXAsIDEsIF9USElTX0lQXyk7CisJbzIuY3R4ID0gJnQyOworCisJV1dBSSgmdCk7CisJdDIgPSB0OworCXQyLnN0YW1wLS07CisKKwlyZXQgPSBXV0woJm8sICZ0KTsKKwlXQVJOX09OKHJldCk7CisKKwlyZXQgPSBXV0woJm8yLCAmdCk7CisJV0FSTl9PTihyZXQgIT0gLUVERUFETEspOworCisJbzIuY3R4ID0gTlVMTDsKKwltdXRleF9hY3F1aXJlKCZvMi5iYXNlLmRlcF9tYXAsIDAsIDEsIF9USElTX0lQXyk7CisJbXV0ZXhfdW5sb2NrKCZvMi5iYXNlKTsKKworCXd3X211dGV4X2xvY2tfc2xvdygmbzIsICZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9lZGVhZGxrX2FjcXVpcmVfbW9yZSh2b2lkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZvMi5iYXNlKTsKKwltdXRleF9yZWxlYXNlKCZvMi5iYXNlLmRlcF9tYXAsIDEsIF9USElTX0lQXyk7CisJbzIuY3R4ID0gJnQyOworCisJV1dBSSgmdCk7CisJdDIgPSB0OworCXQyLnN0YW1wLS07CisKKwlyZXQgPSBXV0woJm8sICZ0KTsKKwlXQVJOX09OKHJldCk7CisKKwlyZXQgPSBXV0woJm8yLCAmdCk7CisJV0FSTl9PTihyZXQgIT0gLUVERUFETEspOworCisJcmV0ID0gV1dMKCZvMywgJnQpOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X2VkZWFkbGtfYWNxdWlyZV9tb3JlX3Nsb3codm9pZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbzIuYmFzZSk7CisJbXV0ZXhfcmVsZWFzZSgmbzIuYmFzZS5kZXBfbWFwLCAxLCBfVEhJU19JUF8pOworCW8yLmN0eCA9ICZ0MjsKKworCVdXQUkoJnQpOworCXQyID0gdDsKKwl0Mi5zdGFtcC0tOworCisJcmV0ID0gV1dMKCZvLCAmdCk7CisJV0FSTl9PTihyZXQpOworCisJcmV0ID0gV1dMKCZvMiwgJnQpOworCVdBUk5fT04ocmV0ICE9IC1FREVBRExLKTsKKworCXd3X211dGV4X2xvY2tfc2xvdygmbzMsICZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9lZGVhZGxrX2FjcXVpcmVfbW9yZV9lZGVhZGxrKHZvaWQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm8yLmJhc2UpOworCW11dGV4X3JlbGVhc2UoJm8yLmJhc2UuZGVwX21hcCwgMSwgX1RISVNfSVBfKTsKKwlvMi5jdHggPSAmdDI7CisKKwltdXRleF9sb2NrKCZvMy5iYXNlKTsKKwltdXRleF9yZWxlYXNlKCZvMy5iYXNlLmRlcF9tYXAsIDEsIF9USElTX0lQXyk7CisJbzMuY3R4ID0gJnQyOworCisJV1dBSSgmdCk7CisJdDIgPSB0OworCXQyLnN0YW1wLS07CisKKwlyZXQgPSBXV0woJm8sICZ0KTsKKwlXQVJOX09OKHJldCk7CisKKwlyZXQgPSBXV0woJm8yLCAmdCk7CisJV0FSTl9PTihyZXQgIT0gLUVERUFETEspOworCisJcmV0ID0gV1dMKCZvMywgJnQpOworCVdBUk5fT04ocmV0ICE9IC1FREVBRExLKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9lZGVhZGxrX2FjcXVpcmVfbW9yZV9lZGVhZGxrX3Nsb3codm9pZCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmbzIuYmFzZSk7CisJbXV0ZXhfcmVsZWFzZSgmbzIuYmFzZS5kZXBfbWFwLCAxLCBfVEhJU19JUF8pOworCW8yLmN0eCA9ICZ0MjsKKworCW11dGV4X2xvY2soJm8zLmJhc2UpOworCW11dGV4X3JlbGVhc2UoJm8zLmJhc2UuZGVwX21hcCwgMSwgX1RISVNfSVBfKTsKKwlvMy5jdHggPSAmdDI7CisKKwlXV0FJKCZ0KTsKKwl0MiA9IHQ7CisJdDIuc3RhbXAtLTsKKworCXJldCA9IFdXTCgmbywgJnQpOworCVdBUk5fT04ocmV0KTsKKworCXJldCA9IFdXTCgmbzIsICZ0KTsKKwlXQVJOX09OKHJldCAhPSAtRURFQURMSyk7CisKKwl3d19tdXRleF9sb2NrX3Nsb3coJm8zLCAmdCk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3RfZWRlYWRsa19hY3F1aXJlX3dyb25nKHZvaWQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm8yLmJhc2UpOworCW11dGV4X3JlbGVhc2UoJm8yLmJhc2UuZGVwX21hcCwgMSwgX1RISVNfSVBfKTsKKwlvMi5jdHggPSAmdDI7CisKKwlXV0FJKCZ0KTsKKwl0MiA9IHQ7CisJdDIuc3RhbXAtLTsKKworCXJldCA9IFdXTCgmbywgJnQpOworCVdBUk5fT04ocmV0KTsKKworCXJldCA9IFdXTCgmbzIsICZ0KTsKKwlXQVJOX09OKHJldCAhPSAtRURFQURMSyk7CisJaWYgKCFyZXQpCisJCVdXVSgmbzIpOworCisJV1dVKCZvKTsKKworCXJldCA9IFdXTCgmbzMsICZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9lZGVhZGxrX2FjcXVpcmVfd3Jvbmdfc2xvdyh2b2lkKQoreworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZvMi5iYXNlKTsKKwltdXRleF9yZWxlYXNlKCZvMi5iYXNlLmRlcF9tYXAsIDEsIF9USElTX0lQXyk7CisJbzIuY3R4ID0gJnQyOworCisJV1dBSSgmdCk7CisJdDIgPSB0OworCXQyLnN0YW1wLS07CisKKwlyZXQgPSBXV0woJm8sICZ0KTsKKwlXQVJOX09OKHJldCk7CisKKwlyZXQgPSBXV0woJm8yLCAmdCk7CisJV0FSTl9PTihyZXQgIT0gLUVERUFETEspOworCWlmICghcmV0KQorCQlXV1UoJm8yKTsKKworCVdXVSgmbyk7CisKKwl3d19tdXRleF9sb2NrX3Nsb3coJm8zLCAmdCk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3Rfc3Bpbl9uZXN0X3VubG9ja2VkKHZvaWQpCit7CisJcmF3X3NwaW5fbG9ja19uZXN0X2xvY2soJmxvY2tfQSwgJm8uYmFzZSk7CisJVShBKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF91bm5lZWRlZF9zbG93KHZvaWQpCit7CisJV1dBSSgmdCk7CisKKwl3d19tdXRleF9sb2NrX3Nsb3coJm8sICZ0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9jb250ZXh0X2Jsb2NrKHZvaWQpCit7CisJaW50IHJldDsKKworCVdXQUkoJnQpOworCisJcmV0ID0gV1dMKCZvLCAmdCk7CisJV0FSTl9PTihyZXQpOworCVdXTDEoJm8yKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9jb250ZXh0X3RyeSh2b2lkKQoreworCWludCByZXQ7CisKKwlXV0FJKCZ0KTsKKworCXJldCA9IFdXTCgmbywgJnQpOworCVdBUk5fT04ocmV0KTsKKworCXJldCA9IFdXVCgmbzIpOworCVdBUk5fT04oIXJldCk7CisJV1dVKCZvMik7CisJV1dVKCZvKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9jb250ZXh0X2NvbnRleHQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJV1dBSSgmdCk7CisKKwlyZXQgPSBXV0woJm8sICZ0KTsKKwlXQVJOX09OKHJldCk7CisKKwlyZXQgPSBXV0woJm8yLCAmdCk7CisJV0FSTl9PTihyZXQpOworCisJV1dVKCZvMik7CisJV1dVKCZvKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF90cnlfYmxvY2sodm9pZCkKK3sKKwlib29sIHJldDsKKworCXJldCA9IFdXVCgmbyk7CisJV0FSTl9PTighcmV0KTsKKworCVdXTDEoJm8yKTsKKwlXV1UoJm8yKTsKKwlXV1UoJm8pOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X3RyeV90cnkodm9pZCkKK3sKKwlib29sIHJldDsKKworCXJldCA9IFdXVCgmbyk7CisJV0FSTl9PTighcmV0KTsKKwlyZXQgPSBXV1QoJm8yKTsKKwlXQVJOX09OKCFyZXQpOworCVdXVSgmbzIpOworCVdXVSgmbyk7Cit9CisKK3N0YXRpYyB2b2lkIHd3X3Rlc3RfdHJ5X2NvbnRleHQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gV1dUKCZvKTsKKwlXQVJOX09OKCFyZXQpOworCisJV1dBSSgmdCk7CisKKwlyZXQgPSBXV0woJm8yLCAmdCk7CisJV0FSTl9PTihyZXQpOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X2Jsb2NrX2Jsb2NrKHZvaWQpCit7CisJV1dMMSgmbyk7CisJV1dMMSgmbzIpOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X2Jsb2NrX3RyeSh2b2lkKQoreworCWJvb2wgcmV0OworCisJV1dMMSgmbyk7CisJcmV0ID0gV1dUKCZvMik7CisJV0FSTl9PTighcmV0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9ibG9ja19jb250ZXh0KHZvaWQpCit7CisJaW50IHJldDsKKworCVdXTDEoJm8pOworCVdXQUkoJnQpOworCisJcmV0ID0gV1dMKCZvMiwgJnQpOworCVdBUk5fT04ocmV0KTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9zcGluX2Jsb2NrKHZvaWQpCit7CisJTChBKTsKKwlVKEEpOworCisJV1dMMSgmbyk7CisJTChBKTsKKwlVKEEpOworCVdXVSgmbyk7CisKKwlMKEEpOworCVdXTDEoJm8pOworCVdXVSgmbyk7CisJVShBKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdF9zcGluX3RyeSh2b2lkKQoreworCWJvb2wgcmV0OworCisJTChBKTsKKwlVKEEpOworCisJcmV0ID0gV1dUKCZvKTsKKwlXQVJOX09OKCFyZXQpOworCUwoQSk7CisJVShBKTsKKwlXV1UoJm8pOworCisJTChBKTsKKwlyZXQgPSBXV1QoJm8pOworCVdBUk5fT04oIXJldCk7CisJV1dVKCZvKTsKKwlVKEEpOworfQorCitzdGF0aWMgdm9pZCB3d190ZXN0X3NwaW5fY29udGV4dCh2b2lkKQoreworCWludCByZXQ7CisKKwlMKEEpOworCVUoQSk7CisKKwlXV0FJKCZ0KTsKKworCXJldCA9IFdXTCgmbywgJnQpOworCVdBUk5fT04ocmV0KTsKKwlMKEEpOworCVUoQSk7CisJV1dVKCZvKTsKKworCUwoQSk7CisJcmV0ID0gV1dMKCZvLCAmdCk7CisJV0FSTl9PTihyZXQpOworCVdXVSgmbyk7CisJVShBKTsKK30KKworc3RhdGljIHZvaWQgd3dfdGVzdHModm9pZCkKK3sKKwlwcmludGsoIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCXByaW50aygiICB8IFdvdW5kL3dhaXQgdGVzdHMgfFxuIik7CisJcHJpbnRrKCIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwlwcmludF90ZXN0bmFtZSgid3cgYXBpIGZhaWx1cmVzIik7CisJZG90ZXN0KHd3X3Rlc3RfZmFpbF9hY3F1aXJlLCBTVUNDRVNTLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3Rfbm9ybWFsLCBTVUNDRVNTLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3RfdW5uZWVkZWRfc2xvdywgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCXByX2NvbnQoIlxuIik7CisKKwlwcmludF90ZXN0bmFtZSgid3cgY29udGV4dHMgbWl4aW5nIik7CisJZG90ZXN0KHd3X3Rlc3RfdHdvX2NvbnRleHRzLCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3RfZGlmZl9jbGFzcywgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCXByX2NvbnQoIlxuIik7CisKKwlwcmludF90ZXN0bmFtZSgiZmluaXNoaW5nIHd3IGNvbnRleHQiKTsKKwlkb3Rlc3Qod3dfdGVzdF9jb250ZXh0X2RvbmVfdHdpY2UsIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlkb3Rlc3Qod3dfdGVzdF9jb250ZXh0X3VubG9ja190d2ljZSwgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2NvbnRleHRfZmluaV9lYXJseSwgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2NvbnRleHRfbG9ja19hZnRlcl9kb25lLCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJcHJfY29udCgiXG4iKTsKKworCXByaW50X3Rlc3RuYW1lKCJsb2NraW5nIG1pc21hdGNoZXMiKTsKKwlkb3Rlc3Qod3dfdGVzdF9vYmplY3RfdW5sb2NrX3R3aWNlLCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3Rfb2JqZWN0X2xvY2tfdW5iYWxhbmNlZCwgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X29iamVjdF9sb2NrX3N0YWxlX2NvbnRleHQsIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRfdGVzdG5hbWUoIkVERUFETEsgaGFuZGxpbmciKTsKKwlkb3Rlc3Qod3dfdGVzdF9lZGVhZGxrX25vcm1hbCwgU1VDQ0VTUywgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2VkZWFkbGtfbm9ybWFsX3Nsb3csIFNVQ0NFU1MsIExPQ0tUWVBFX1dXKTsKKwlkb3Rlc3Qod3dfdGVzdF9lZGVhZGxrX25vX3VubG9jaywgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2VkZWFkbGtfbm9fdW5sb2NrX3Nsb3csIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlkb3Rlc3Qod3dfdGVzdF9lZGVhZGxrX2FjcXVpcmVfbW9yZSwgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2VkZWFkbGtfYWNxdWlyZV9tb3JlX3Nsb3csIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlkb3Rlc3Qod3dfdGVzdF9lZGVhZGxrX2FjcXVpcmVfbW9yZV9lZGVhZGxrLCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3RfZWRlYWRsa19hY3F1aXJlX21vcmVfZWRlYWRsa19zbG93LCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3RfZWRlYWRsa19hY3F1aXJlX3dyb25nLCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3RfZWRlYWRsa19hY3F1aXJlX3dyb25nX3Nsb3csIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRfdGVzdG5hbWUoInNwaW5sb2NrIG5lc3QgdW5sb2NrZWQiKTsKKwlkb3Rlc3Qod3dfdGVzdF9zcGluX25lc3RfdW5sb2NrZWQsIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRrKCIgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGsoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxibG9jayB8IHRyeSAgfGNvbnRleHR8XG4iKTsKKwlwcmludGsoIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJcHJpbnRfdGVzdG5hbWUoImNvbnRleHQiKTsKKwlkb3Rlc3Qod3dfdGVzdF9jb250ZXh0X2Jsb2NrLCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3RfY29udGV4dF90cnksIFNVQ0NFU1MsIExPQ0tUWVBFX1dXKTsKKwlkb3Rlc3Qod3dfdGVzdF9jb250ZXh0X2NvbnRleHQsIFNVQ0NFU1MsIExPQ0tUWVBFX1dXKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRfdGVzdG5hbWUoInRyeSIpOworCWRvdGVzdCh3d190ZXN0X3RyeV9ibG9jaywgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X3RyeV90cnksIFNVQ0NFU1MsIExPQ0tUWVBFX1dXKTsKKwlkb3Rlc3Qod3dfdGVzdF90cnlfY29udGV4dCwgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCXByX2NvbnQoIlxuIik7CisKKwlwcmludF90ZXN0bmFtZSgiYmxvY2siKTsKKwlkb3Rlc3Qod3dfdGVzdF9ibG9ja19ibG9jaywgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2Jsb2NrX3RyeSwgU1VDQ0VTUywgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X2Jsb2NrX2NvbnRleHQsIEZBSUxVUkUsIExPQ0tUWVBFX1dXKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRfdGVzdG5hbWUoInNwaW5sb2NrIik7CisJZG90ZXN0KHd3X3Rlc3Rfc3Bpbl9ibG9jaywgRkFJTFVSRSwgTE9DS1RZUEVfV1cpOworCWRvdGVzdCh3d190ZXN0X3NwaW5fdHJ5LCBTVUNDRVNTLCBMT0NLVFlQRV9XVyk7CisJZG90ZXN0KHd3X3Rlc3Rfc3Bpbl9jb250ZXh0LCBGQUlMVVJFLCBMT0NLVFlQRV9XVyk7CisJcHJfY29udCgiXG4iKTsKK30KKwordm9pZCBsb2NraW5nX3NlbGZ0ZXN0KHZvaWQpCit7CisJLyoKKwkgKiBHb3QgYSBsb2NraW5nIGZhaWx1cmUgYmVmb3JlIHRoZSBzZWxmdGVzdCByYW4/CisJICovCisJaWYgKCFkZWJ1Z19sb2NrcykgeworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludGsoInwgTG9ja2luZyBBUEkgdGVzdHN1aXRlIGRpc2FibGVkIHxcbiIpOworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBSdW4gdGhlIHRlc3RzdWl0ZToKKwkgKi8KKwlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKCJ8IExvY2tpbmcgQVBJIHRlc3RzdWl0ZTpcbiIpOworCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRrKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHNwaW4gfHdsb2NrIHxybG9jayB8bXV0ZXggfCB3c2VtIHwgcnNlbSB8XG4iKTsKKwlwcmludGsoIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJaW5pdF9zaGFyZWRfY2xhc3NlcygpOworCWRlYnVnX2xvY2tzX3NpbGVudCA9ICFkZWJ1Z19sb2Nrc192ZXJib3NlOworCisJRE9fVEVTVENBU0VfNlIoIkEtQSBkZWFkbG9jayIsIEFBKTsKKwlET19URVNUQ0FTRV82UigiQS1CLUItQSBkZWFkbG9jayIsIEFCQkEpOworCURPX1RFU1RDQVNFXzZSKCJBLUItQi1DLUMtQSBkZWFkbG9jayIsIEFCQkNDQSk7CisJRE9fVEVTVENBU0VfNlIoIkEtQi1DLUEtQi1DIGRlYWRsb2NrIiwgQUJDQUJDKTsKKwlET19URVNUQ0FTRV82UigiQS1CLUItQy1DLUQtRC1BIGRlYWRsb2NrIiwgQUJCQ0NEREEpOworCURPX1RFU1RDQVNFXzZSKCJBLUItQy1ELUItRC1ELUEgZGVhZGxvY2siLCBBQkNEQkREQSk7CisJRE9fVEVTVENBU0VfNlIoIkEtQi1DLUQtQi1DLUQtQSBkZWFkbG9jayIsIEFCQ0RCQ0RBKTsKKwlET19URVNUQ0FTRV82KCJkb3VibGUgdW5sb2NrIiwgZG91YmxlX3VubG9jayk7CisJRE9fVEVTVENBU0VfNigiaW5pdGlhbGl6ZSBoZWxkIiwgaW5pdF9oZWxkKTsKKworCXByaW50aygiICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRfdGVzdG5hbWUoInJlY3Vyc2l2ZSByZWFkLWxvY2siKTsKKwlwcl9jb250KCIgICAgICAgICAgICAgfCIpOworCWRvdGVzdChybG9ja19BQTEsIFNVQ0NFU1MsIExPQ0tUWVBFX1JXTE9DSyk7CisJcHJfY29udCgiICAgICAgICAgICAgIHwiKTsKKwlkb3Rlc3QocnNlbV9BQTEsIEZBSUxVUkUsIExPQ0tUWVBFX1JXU0VNKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRfdGVzdG5hbWUoInJlY3Vyc2l2ZSByZWFkLWxvY2sgIzIiKTsKKwlwcl9jb250KCIgICAgICAgICAgICAgfCIpOworCWRvdGVzdChybG9ja19BQTFCLCBTVUNDRVNTLCBMT0NLVFlQRV9SV0xPQ0spOworCXByX2NvbnQoIiAgICAgICAgICAgICB8Iik7CisJZG90ZXN0KHJzZW1fQUExQiwgRkFJTFVSRSwgTE9DS1RZUEVfUldTRU0pOworCXByX2NvbnQoIlxuIik7CisKKwlwcmludF90ZXN0bmFtZSgibWl4ZWQgcmVhZC13cml0ZS1sb2NrIik7CisJcHJfY29udCgiICAgICAgICAgICAgIHwiKTsKKwlkb3Rlc3QocmxvY2tfQUEyLCBGQUlMVVJFLCBMT0NLVFlQRV9SV0xPQ0spOworCXByX2NvbnQoIiAgICAgICAgICAgICB8Iik7CisJZG90ZXN0KHJzZW1fQUEyLCBGQUlMVVJFLCBMT0NLVFlQRV9SV1NFTSk7CisJcHJfY29udCgiXG4iKTsKKworCXByaW50X3Rlc3RuYW1lKCJtaXhlZCB3cml0ZS1yZWFkLWxvY2siKTsKKwlwcl9jb250KCIgICAgICAgICAgICAgfCIpOworCWRvdGVzdChybG9ja19BQTMsIEZBSUxVUkUsIExPQ0tUWVBFX1JXTE9DSyk7CisJcHJfY29udCgiICAgICAgICAgICAgIHwiKTsKKwlkb3Rlc3QocnNlbV9BQTMsIEZBSUxVUkUsIExPQ0tUWVBFX1JXU0VNKTsKKwlwcl9jb250KCJcbiIpOworCisJcHJpbnRfdGVzdG5hbWUoIm1peGVkIHJlYWQtbG9jay9sb2NrLXdyaXRlIEFCQkEiKTsKKwlwcl9jb250KCIgICAgICAgICAgICAgfCIpOworCWRvdGVzdChybG9ja19BQkJBMSwgRkFJTFVSRSwgTE9DS1RZUEVfUldMT0NLKTsKKyNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORworCS8qCisJICogTG9ja2RlcCBkb2VzIGluZGVlZCBmYWlsIGhlcmUsIGJ1dCB0aGVyZSdzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0CisJICogdGhhdCBub3cuICBEb24ndCBraWxsIGxvY2tkZXAgZm9yIGl0LgorCSAqLworCXVuZXhwZWN0ZWRfdGVzdGNhc2VfZmFpbHVyZXMtLTsKKyNlbmRpZgorCisJcHJfY29udCgiICAgICAgICAgICAgIHwiKTsKKwlkb3Rlc3QocndzZW1fQUJCQTEsIEZBSUxVUkUsIExPQ0tUWVBFX1JXU0VNKTsKKworCXByaW50X3Rlc3RuYW1lKCJtaXhlZCByZWFkLWxvY2svbG9jay1yZWFkIEFCQkEiKTsKKwlwcl9jb250KCIgICAgICAgICAgICAgfCIpOworCWRvdGVzdChybG9ja19BQkJBMiwgU1VDQ0VTUywgTE9DS1RZUEVfUldMT0NLKTsKKwlwcl9jb250KCIgICAgICAgICAgICAgfCIpOworCWRvdGVzdChyd3NlbV9BQkJBMiwgRkFJTFVSRSwgTE9DS1RZUEVfUldTRU0pOworCisJcHJpbnRfdGVzdG5hbWUoIm1peGVkIHdyaXRlLWxvY2svbG9jay13cml0ZSBBQkJBIik7CisJcHJfY29udCgiICAgICAgICAgICAgIHwiKTsKKwlkb3Rlc3QocmxvY2tfQUJCQTMsIEZBSUxVUkUsIExPQ0tUWVBFX1JXTE9DSyk7CisJcHJfY29udCgiICAgICAgICAgICAgIHwiKTsKKwlkb3Rlc3QocndzZW1fQUJCQTMsIEZBSUxVUkUsIExPQ0tUWVBFX1JXU0VNKTsKKworCXByaW50aygiICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisKKwkvKgorCSAqIGlycS1jb250ZXh0IHRlc3RjYXNlczoKKwkgKi8KKwlET19URVNUQ0FTRV8yeDYoImlycXMtb24gKyBpcnEtc2FmZS1BIiwgaXJxc2FmZTEpOworCURPX1RFU1RDQVNFXzJ4Mygic2lycS1zYWZlLUEgPT4gaGlycXMtb24iLCBpcnFzYWZlMkEpOworCURPX1RFU1RDQVNFXzJ4Nigic2FmZS1BICsgaXJxcy1vbiIsIGlycXNhZmUyQik7CisJRE9fVEVTVENBU0VfNng2KCJzYWZlLUEgKyB1bnNhZmUtQiAjMSIsIGlycXNhZmUzKTsKKwlET19URVNUQ0FTRV82eDYoInNhZmUtQSArIHVuc2FmZS1CICMyIiwgaXJxc2FmZTQpOworCURPX1RFU1RDQVNFXzZ4NlJXKCJpcnEgbG9jay1pbnZlcnNpb24iLCBpcnFfaW52ZXJzaW9uKTsKKworCURPX1RFU1RDQVNFXzZ4MigiaXJxIHJlYWQtcmVjdXJzaW9uIiwgaXJxX3JlYWRfcmVjdXJzaW9uKTsKKy8vCURPX1RFU1RDQVNFXzZ4MkIoImlycSByZWFkLXJlY3Vyc2lvbiAjMiIsIGlycV9yZWFkX3JlY3Vyc2lvbjIpOworCisJd3dfdGVzdHMoKTsKKworCWlmICh1bmV4cGVjdGVkX3Rlc3RjYXNlX2ZhaWx1cmVzKSB7CisJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlkZWJ1Z19sb2NrcyA9IDA7CisJCXByaW50aygiQlVHOiAlM2QgdW5leHBlY3RlZCBmYWlsdXJlcyAob3V0IG9mICUzZCkgLSBkZWJ1Z2dpbmcgZGlzYWJsZWQhIHxcbiIsCisJCQl1bmV4cGVjdGVkX3Rlc3RjYXNlX2ZhaWx1cmVzLCB0ZXN0Y2FzZV90b3RhbCk7CisJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCX0gZWxzZSBpZiAoZXhwZWN0ZWRfdGVzdGNhc2VfZmFpbHVyZXMgJiYgdGVzdGNhc2Vfc3VjY2Vzc2VzKSB7CisJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcmludGsoIiUzZCBvdXQgb2YgJTNkIHRlc3RjYXNlcyBmYWlsZWQsIGFzIGV4cGVjdGVkLiB8XG4iLAorCQkJZXhwZWN0ZWRfdGVzdGNhc2VfZmFpbHVyZXMsIHRlc3RjYXNlX3RvdGFsKTsKKwkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJZGVidWdfbG9ja3MgPSAxOworCX0gZWxzZSBpZiAoZXhwZWN0ZWRfdGVzdGNhc2VfZmFpbHVyZXMgJiYgIXRlc3RjYXNlX3N1Y2Nlc3NlcykgeworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcHJpbnRrKCJBbGwgJTNkIHRlc3RjYXNlcyBmYWlsZWQsIGFzIGV4cGVjdGVkLiB8XG4iLAorCQkJZXhwZWN0ZWRfdGVzdGNhc2VfZmFpbHVyZXMpOworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlkZWJ1Z19sb2NrcyA9IDE7CisJfSBlbHNlIHsKKwkJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcHJpbnRrKCJHb29kLCBhbGwgJTNkIHRlc3RjYXNlcyBwYXNzZWQhIHxcbiIsCisJCQl0ZXN0Y2FzZV9zdWNjZXNzZXMpOworCQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCWRlYnVnX2xvY2tzID0gMTsKKwl9CisJZGVidWdfbG9ja3Nfc2lsZW50ID0gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tyZWYuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xvY2tyZWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzE2OWVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbG9ja3JlZi5jCkBAIC0wLDAgKzEsMTg5IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvY2tyZWYuaD4KKworI2lmIFVTRV9DTVBYQ0hHX0xPQ0tSRUYKKworLyoKKyAqIE5vdGUgdGhhdCB0aGUgImNtcHhjaGcoKSIgcmVsb2FkcyB0aGUgIm9sZCIgdmFsdWUgZm9yIHRoZQorICogZmFpbHVyZSBjYXNlLgorICovCisjZGVmaW5lIENNUFhDSEdfTE9PUChDT0RFLCBTVUNDRVNTKSBkbyB7CQkJCQlcCisJc3RydWN0IGxvY2tyZWYgb2xkOwkJCQkJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZihvbGQpICE9IDgpOwkJCQkJCVwKKwlvbGQubG9ja19jb3VudCA9IFJFQURfT05DRShsb2NrcmVmLT5sb2NrX2NvdW50KTsJCQlcCisJd2hpbGUgKGxpa2VseShhcmNoX3NwaW5fdmFsdWVfdW5sb2NrZWQob2xkLmxvY2sucmxvY2sucmF3X2xvY2spKSkgeyAgCVwKKwkJc3RydWN0IGxvY2tyZWYgbmV3ID0gb2xkLCBwcmV2ID0gb2xkOwkJCQlcCisJCUNPREUJCQkJCQkJCVwKKwkJb2xkLmxvY2tfY291bnQgPSBjbXB4Y2hnNjRfcmVsYXhlZCgmbG9ja3JlZi0+bG9ja19jb3VudCwJXAorCQkJCQkJICAgb2xkLmxvY2tfY291bnQsCQlcCisJCQkJCQkgICBuZXcubG9ja19jb3VudCk7CQlcCisJCWlmIChsaWtlbHkob2xkLmxvY2tfY291bnQgPT0gcHJldi5sb2NrX2NvdW50KSkgewkJXAorCQkJU1VDQ0VTUzsJCQkJCQlcCisJCX0JCQkJCQkJCVwKKwkJY3B1X3JlbGF4KCk7CQkJCQkJCVwKKwl9CQkJCQkJCQkJXAorfSB3aGlsZSAoMCkKKworI2Vsc2UKKworI2RlZmluZSBDTVBYQ0hHX0xPT1AoQ09ERSwgU1VDQ0VTUykgZG8geyB9IHdoaWxlICgwKQorCisjZW5kaWYKKworLyoqCisgKiBsb2NrcmVmX2dldCAtIEluY3JlbWVudHMgcmVmZXJlbmNlIGNvdW50IHVuY29uZGl0aW9uYWxseQorICogQGxvY2tyZWY6IHBvaW50ZXIgdG8gbG9ja3JlZiBzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIG9wZXJhdGlvbiBpcyBvbmx5IHZhbGlkIGlmIHlvdSBhbHJlYWR5IGhvbGQgYSByZWZlcmVuY2UKKyAqIHRvIHRoZSBvYmplY3QsIHNvIHlvdSBrbm93IHRoZSBjb3VudCBjYW5ub3QgYmUgemVyby4KKyAqLwordm9pZCBsb2NrcmVmX2dldChzdHJ1Y3QgbG9ja3JlZiAqbG9ja3JlZikKK3sKKwlDTVBYQ0hHX0xPT1AoCisJCW5ldy5jb3VudCsrOworCSwKKwkJcmV0dXJuOworCSk7CisKKwlzcGluX2xvY2soJmxvY2tyZWYtPmxvY2spOworCWxvY2tyZWYtPmNvdW50Kys7CisJc3Bpbl91bmxvY2soJmxvY2tyZWYtPmxvY2spOworfQorRVhQT1JUX1NZTUJPTChsb2NrcmVmX2dldCk7CisKKy8qKgorICogbG9ja3JlZl9nZXRfbm90X3plcm8gLSBJbmNyZW1lbnRzIGNvdW50IHVubGVzcyB0aGUgY291bnQgaXMgMCBvciBkZWFkCisgKiBAbG9ja3JlZjogcG9pbnRlciB0byBsb2NrcmVmIHN0cnVjdHVyZQorICogUmV0dXJuOiAxIGlmIGNvdW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIDAgaWYgY291bnQgd2FzIHplcm8KKyAqLworaW50IGxvY2tyZWZfZ2V0X25vdF96ZXJvKHN0cnVjdCBsb2NrcmVmICpsb2NrcmVmKQoreworCWludCByZXR2YWw7CisKKwlDTVBYQ0hHX0xPT1AoCisJCW5ldy5jb3VudCsrOworCQlpZiAob2xkLmNvdW50IDw9IDApCisJCQlyZXR1cm4gMDsKKwksCisJCXJldHVybiAxOworCSk7CisKKwlzcGluX2xvY2soJmxvY2tyZWYtPmxvY2spOworCXJldHZhbCA9IDA7CisJaWYgKGxvY2tyZWYtPmNvdW50ID4gMCkgeworCQlsb2NrcmVmLT5jb3VudCsrOworCQlyZXR2YWwgPSAxOworCX0KKwlzcGluX3VubG9jaygmbG9ja3JlZi0+bG9jayk7CisJcmV0dXJuIHJldHZhbDsKK30KK0VYUE9SVF9TWU1CT0wobG9ja3JlZl9nZXRfbm90X3plcm8pOworCisvKioKKyAqIGxvY2tyZWZfZ2V0X29yX2xvY2sgLSBJbmNyZW1lbnRzIGNvdW50IHVubGVzcyB0aGUgY291bnQgaXMgMCBvciBkZWFkCisgKiBAbG9ja3JlZjogcG9pbnRlciB0byBsb2NrcmVmIHN0cnVjdHVyZQorICogUmV0dXJuOiAxIGlmIGNvdW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIDAgaWYgY291bnQgd2FzIHplcm8KKyAqIGFuZCB3ZSBnb3QgdGhlIGxvY2sgaW5zdGVhZC4KKyAqLworaW50IGxvY2tyZWZfZ2V0X29yX2xvY2soc3RydWN0IGxvY2tyZWYgKmxvY2tyZWYpCit7CisJQ01QWENIR19MT09QKAorCQluZXcuY291bnQrKzsKKwkJaWYgKG9sZC5jb3VudCA8PSAwKQorCQkJYnJlYWs7CisJLAorCQlyZXR1cm4gMTsKKwkpOworCisJc3Bpbl9sb2NrKCZsb2NrcmVmLT5sb2NrKTsKKwlpZiAobG9ja3JlZi0+Y291bnQgPD0gMCkKKwkJcmV0dXJuIDA7CisJbG9ja3JlZi0+Y291bnQrKzsKKwlzcGluX3VubG9jaygmbG9ja3JlZi0+bG9jayk7CisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGxvY2tyZWZfZ2V0X29yX2xvY2spOworCisvKioKKyAqIGxvY2tyZWZfcHV0X3JldHVybiAtIERlY3JlbWVudCByZWZlcmVuY2UgY291bnQgaWYgcG9zc2libGUKKyAqIEBsb2NrcmVmOiBwb2ludGVyIHRvIGxvY2tyZWYgc3RydWN0dXJlCisgKgorICogRGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgYW5kIHJldHVybiB0aGUgbmV3IHZhbHVlLgorICogSWYgdGhlIGxvY2tyZWYgd2FzIGRlYWQgb3IgbG9ja2VkLCByZXR1cm4gYW4gZXJyb3IuCisgKi8KK2ludCBsb2NrcmVmX3B1dF9yZXR1cm4oc3RydWN0IGxvY2tyZWYgKmxvY2tyZWYpCit7CisJQ01QWENIR19MT09QKAorCQluZXcuY291bnQtLTsKKwkJaWYgKG9sZC5jb3VudCA8PSAwKQorCQkJcmV0dXJuIC0xOworCSwKKwkJcmV0dXJuIG5ldy5jb3VudDsKKwkpOworCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0wobG9ja3JlZl9wdXRfcmV0dXJuKTsKKworLyoqCisgKiBsb2NrcmVmX3B1dF9vcl9sb2NrIC0gZGVjcmVtZW50cyBjb3VudCB1bmxlc3MgY291bnQgPD0gMSBiZWZvcmUgZGVjcmVtZW50CisgKiBAbG9ja3JlZjogcG9pbnRlciB0byBsb2NrcmVmIHN0cnVjdHVyZQorICogUmV0dXJuOiAxIGlmIGNvdW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIDAgaWYgY291bnQgPD0gMSBhbmQgbG9jayB0YWtlbgorICovCitpbnQgbG9ja3JlZl9wdXRfb3JfbG9jayhzdHJ1Y3QgbG9ja3JlZiAqbG9ja3JlZikKK3sKKwlDTVBYQ0hHX0xPT1AoCisJCW5ldy5jb3VudC0tOworCQlpZiAob2xkLmNvdW50IDw9IDEpCisJCQlicmVhazsKKwksCisJCXJldHVybiAxOworCSk7CisKKwlzcGluX2xvY2soJmxvY2tyZWYtPmxvY2spOworCWlmIChsb2NrcmVmLT5jb3VudCA8PSAxKQorCQlyZXR1cm4gMDsKKwlsb2NrcmVmLT5jb3VudC0tOworCXNwaW5fdW5sb2NrKCZsb2NrcmVmLT5sb2NrKTsKKwlyZXR1cm4gMTsKK30KK0VYUE9SVF9TWU1CT0wobG9ja3JlZl9wdXRfb3JfbG9jayk7CisKKy8qKgorICogbG9ja3JlZl9tYXJrX2RlYWQgLSBtYXJrIGxvY2tyZWYgZGVhZAorICogQGxvY2tyZWY6IHBvaW50ZXIgdG8gbG9ja3JlZiBzdHJ1Y3R1cmUKKyAqLwordm9pZCBsb2NrcmVmX21hcmtfZGVhZChzdHJ1Y3QgbG9ja3JlZiAqbG9ja3JlZikKK3sKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmxvY2tyZWYtPmxvY2spOworCWxvY2tyZWYtPmNvdW50ID0gLTEyODsKK30KK0VYUE9SVF9TWU1CT0wobG9ja3JlZl9tYXJrX2RlYWQpOworCisvKioKKyAqIGxvY2tyZWZfZ2V0X25vdF9kZWFkIC0gSW5jcmVtZW50cyBjb3VudCB1bmxlc3MgdGhlIHJlZiBpcyBkZWFkCisgKiBAbG9ja3JlZjogcG9pbnRlciB0byBsb2NrcmVmIHN0cnVjdHVyZQorICogUmV0dXJuOiAxIGlmIGNvdW50IHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IG9yIDAgaWYgbG9ja3JlZiB3YXMgZGVhZAorICovCitpbnQgbG9ja3JlZl9nZXRfbm90X2RlYWQoc3RydWN0IGxvY2tyZWYgKmxvY2tyZWYpCit7CisJaW50IHJldHZhbDsKKworCUNNUFhDSEdfTE9PUCgKKwkJbmV3LmNvdW50Kys7CisJCWlmIChvbGQuY291bnQgPCAwKQorCQkJcmV0dXJuIDA7CisJLAorCQlyZXR1cm4gMTsKKwkpOworCisJc3Bpbl9sb2NrKCZsb2NrcmVmLT5sb2NrKTsKKwlyZXR2YWwgPSAwOworCWlmIChsb2NrcmVmLT5jb3VudCA+PSAwKSB7CisJCWxvY2tyZWYtPmNvdW50Kys7CisJCXJldHZhbCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZsb2NrcmVmLT5sb2NrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTChsb2NrcmVmX2dldF9ub3RfZGVhZCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9scnVfY2FjaGUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2xydV9jYWNoZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmE0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9scnVfY2FjaGUuYwpAQCAtMCwwICsxLDY4OCBAQAorLyoKKyAgIGxydV9jYWNoZS5jCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIERSQkQgYnkgUGhpbGlwcCBSZWlzbmVyIGFuZCBMYXJzIEVsbGVuYmVyZy4KKworICAgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDgsIExJTkJJVCBJbmZvcm1hdGlvbiBUZWNobm9sb2dpZXMgR21iSC4KKyAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA4LCBQaGlsaXBwIFJlaXNuZXIgPHBoaWxpcHAucmVpc25lckBsaW5iaXQuY29tPi4KKyAgIENvcHlyaWdodCAoQykgMjAwMy0yMDA4LCBMYXJzIEVsbGVuYmVyZyA8bGFycy5lbGxlbmJlcmdAbGluYml0LmNvbT4uCisKKyAgIGRyYmQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBkcmJkIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggZHJiZDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvCisgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIGZvciBtZW1zZXQgKi8KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPiAvKiBmb3Igc2VxX3ByaW50ZiAqLworI2luY2x1ZGUgPGxpbnV4L2xydV9jYWNoZS5oPgorCitNT0RVTEVfQVVUSE9SKCJQaGlsaXBwIFJlaXNuZXIgPHBoaWxAbGluYml0LmNvbT4sICIKKwkgICAgICAiTGFycyBFbGxlbmJlcmcgPGxhcnNAbGluYml0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigibHJ1X2NhY2hlIC0gVHJhY2sgc2V0cyBvZiBob3Qgb2JqZWN0cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiB0aGlzIGlzIGRldmVsb3BlcnMgYWlkIG9ubHkuCisgKiBpdCBjYXRjaGVzIGNvbmN1cnJlbnQgYWNjZXNzIChsYWNrIG9mIGxvY2tpbmcgb24gdGhlIHVzZXJzIHBhcnQpICovCisjZGVmaW5lIFBBUkFOT0lBX0VOVFJZKCkgZG8gewkJXAorCUJVR19PTighbGMpOwkJCVwKKwlCVUdfT04oIWxjLT5ucl9lbGVtZW50cyk7CVwKKwlCVUdfT04odGVzdF9hbmRfc2V0X2JpdChfX0xDX1BBUkFOT0lBLCAmbGMtPmZsYWdzKSk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUkVUVVJOKHguLi4pICAgICBkbyB7IFwKKwljbGVhcl9iaXRfdW5sb2NrKF9fTENfUEFSQU5PSUEsICZsYy0+ZmxhZ3MpOyBcCisJcmV0dXJuIHggOyB9IHdoaWxlICgwKQorCisvKiBCVUcoKSBpZiBlIGlzIG5vdCBvbmUgb2YgdGhlIGVsZW1lbnRzIHRyYWNrZWQgYnkgbGMgKi8KKyNkZWZpbmUgUEFSQU5PSUFfTENfRUxFTUVOVChsYywgZSkgZG8gewlcCisJc3RydWN0IGxydV9jYWNoZSAqbGNfID0gKGxjKTsJXAorCXN0cnVjdCBsY19lbGVtZW50ICplXyA9IChlKTsJXAorCXVuc2lnbmVkIGkgPSBlXy0+bGNfaW5kZXg7CVwKKwlCVUdfT04oaSA+PSBsY18tPm5yX2VsZW1lbnRzKTsJXAorCUJVR19PTihsY18tPmxjX2VsZW1lbnRbaV0gIT0gZV8pOyB9IHdoaWxlICgwKQorCisKKy8qIFdlIG5lZWQgdG8gYXRvbWljYWxseQorICogIC0gdHJ5IHRvIGdyYWIgdGhlIGxvY2sgKHNldCBMQ19MT0NLRUQpCisgKiAgLSBvbmx5IGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgdHJhbnNhY3Rpb24KKyAqICAgIChuZWl0aGVyIExDX0RJUlRZIG5vciBMQ19TVEFSVklORyBpcyBzZXQpCisgKiBCZWNhdXNlIG9mIFBBUkFOT0lBX0VOVFJZKCkgYWJvdmUgYWJ1c2luZyBsYy0+ZmxhZ3MgYXMgd2VsbCwKKyAqIGl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGp1c3Qgc2F5CisgKglyZXR1cm4gMCA9PSBjbXB4Y2hnKCZsYy0+ZmxhZ3MsIDAsIExDX0xPQ0tFRCk7CisgKi8KK2ludCBsY190cnlfbG9jayhzdHJ1Y3QgbHJ1X2NhY2hlICpsYykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlkbyB7CisJCXZhbCA9IGNtcHhjaGcoJmxjLT5mbGFncywgMCwgTENfTE9DS0VEKTsKKwl9IHdoaWxlICh1bmxpa2VseSAodmFsID09IExDX1BBUkFOT0lBKSk7CisJLyogU3BpbiB1bnRpbCBuby1vbmUgaXMgaW5zaWRlIGEgUEFSQU5PSUFfRU5UUlkoKS9SRVRVUk4oKSBzZWN0aW9uLiAqLworCXJldHVybiAwID09IHZhbDsKKyNpZiAwCisJLyogQWx0ZXJuYXRpdmUgYXBwcm9hY2gsIHNwaW4gaW4gY2FzZSBzb21lb25lIGVudGVycyBvciBsZWF2ZXMgYQorCSAqIFBBUkFOT0lBX0VOVFJZKCkvUkVUVVJOKCkgc2VjdGlvbi4gKi8KKwl1bnNpZ25lZCBsb25nIG9sZCwgbmV3LCB2YWw7CisJZG8geworCQlvbGQgPSBsYy0+ZmxhZ3MgJiBMQ19QQVJBTk9JQTsKKwkJbmV3ID0gb2xkIHwgTENfTE9DS0VEOworCQl2YWwgPSBjbXB4Y2hnKCZsYy0+ZmxhZ3MsIG9sZCwgbmV3KTsKKwl9IHdoaWxlICh1bmxpa2VseSAodmFsID09IChvbGQgXiBMQ19QQVJBTk9JQSkpKTsKKwlyZXR1cm4gb2xkID09IHZhbDsKKyNlbmRpZgorfQorCisvKioKKyAqIGxjX2NyZWF0ZSAtIHByZXBhcmVzIHRvIHRyYWNrIG9iamVjdHMgaW4gYW4gYWN0aXZlIHNldAorICogQG5hbWU6IGRlc2NyaXB0aXZlIG5hbWUgb25seSB1c2VkIGluIGxjX3NlcV9wcmludGZfc3RhdHMgYW5kIGxjX3NlcV9kdW1wX2RldGFpbHMKKyAqIEBtYXhfcGVuZGluZ19jaGFuZ2VzOiBtYXhpbXVtIGNoYW5nZXMgdG8gYWNjdW11bGF0ZSB1bnRpbCBhIHRyYW5zYWN0aW9uIGlzIHJlcXVpcmVkCisgKiBAZV9jb3VudDogbnVtYmVyIG9mIGVsZW1lbnRzIGFsbG93ZWQgdG8gYmUgYWN0aXZlIHNpbXVsdGFuZW91c2x5CisgKiBAZV9zaXplOiBzaXplIG9mIHRoZSB0cmFja2VkIG9iamVjdHMKKyAqIEBlX29mZjogb2Zmc2V0IHRvIHRoZSAmc3RydWN0IGxjX2VsZW1lbnQgbWVtYmVyIGluIGEgdHJhY2tlZCBvYmplY3QKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byBhIG5ld2x5IGluaXRpYWxpemVkIHN0cnVjdCBscnVfY2FjaGUgb24gc3VjY2VzcywKKyAqIG9yIE5VTEwgb24gKGFsbG9jYXRpb24pIGZhaWx1cmUuCisgKi8KK3N0cnVjdCBscnVfY2FjaGUgKmxjX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUsCisJCXVuc2lnbmVkIG1heF9wZW5kaW5nX2NoYW5nZXMsCisJCXVuc2lnbmVkIGVfY291bnQsIHNpemVfdCBlX3NpemUsIHNpemVfdCBlX29mZikKK3sKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqc2xvdCA9IE5VTEw7CisJc3RydWN0IGxjX2VsZW1lbnQgKiplbGVtZW50ID0gTlVMTDsKKwlzdHJ1Y3QgbHJ1X2NhY2hlICpsYzsKKwlzdHJ1Y3QgbGNfZWxlbWVudCAqZTsKKwl1bnNpZ25lZCBjYWNoZV9vYmpfc2l6ZSA9IGttZW1fY2FjaGVfc2l6ZShjYWNoZSk7CisJdW5zaWduZWQgaTsKKworCVdBUk5fT04oY2FjaGVfb2JqX3NpemUgPCBlX3NpemUpOworCWlmIChjYWNoZV9vYmpfc2l6ZSA8IGVfc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBlX2NvdW50IHRvbyBiaWc7IHdvdWxkIHByb2JhYmx5IGZhaWwgdGhlIGFsbG9jYXRpb24gYmVsb3cgYW55d2F5cy4KKwkgKiBmb3IgdHlwaWNhbCB1c2UgY2FzZXMsIGVfY291bnQgc2hvdWxkIGJlIGZldyB0aG91c2FuZCBhdCBtb3N0LiAqLworCWlmIChlX2NvdW50ID4gTENfTUFYX0FDVElWRSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzbG90ID0ga2NhbGxvYyhlX2NvdW50LCBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNsb3QpCisJCWdvdG8gb3V0X2ZhaWw7CisJZWxlbWVudCA9IGt6YWxsb2MoZV9jb3VudCAqIHNpemVvZihzdHJ1Y3QgbGNfZWxlbWVudCAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbGVtZW50KQorCQlnb3RvIG91dF9mYWlsOworCisJbGMgPSBremFsbG9jKHNpemVvZigqbGMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWxjKQorCQlnb3RvIG91dF9mYWlsOworCisJSU5JVF9MSVNUX0hFQUQoJmxjLT5pbl91c2UpOworCUlOSVRfTElTVF9IRUFEKCZsYy0+bHJ1KTsKKwlJTklUX0xJU1RfSEVBRCgmbGMtPmZyZWUpOworCUlOSVRfTElTVF9IRUFEKCZsYy0+dG9fYmVfY2hhbmdlZCk7CisKKwlsYy0+bmFtZSA9IG5hbWU7CisJbGMtPmVsZW1lbnRfc2l6ZSA9IGVfc2l6ZTsKKwlsYy0+ZWxlbWVudF9vZmYgPSBlX29mZjsKKwlsYy0+bnJfZWxlbWVudHMgPSBlX2NvdW50OworCWxjLT5tYXhfcGVuZGluZ19jaGFuZ2VzID0gbWF4X3BlbmRpbmdfY2hhbmdlczsKKwlsYy0+bGNfY2FjaGUgPSBjYWNoZTsKKwlsYy0+bGNfZWxlbWVudCA9IGVsZW1lbnQ7CisJbGMtPmxjX3Nsb3QgPSBzbG90OworCisJLyogcHJlYWxsb2NhdGUgYWxsIG9iamVjdHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZV9jb3VudDsgaSsrKSB7CisJCXZvaWQgKnAgPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwKQorCQkJYnJlYWs7CisJCW1lbXNldChwLCAwLCBsYy0+ZWxlbWVudF9zaXplKTsKKwkJZSA9IHAgKyBlX29mZjsKKwkJZS0+bGNfaW5kZXggPSBpOworCQllLT5sY19udW1iZXIgPSBMQ19GUkVFOworCQllLT5sY19uZXdfbnVtYmVyID0gTENfRlJFRTsKKwkJbGlzdF9hZGQoJmUtPmxpc3QsICZsYy0+ZnJlZSk7CisJCWVsZW1lbnRbaV0gPSBlOworCX0KKwlpZiAoaSA9PSBlX2NvdW50KQorCQlyZXR1cm4gbGM7CisKKwkvKiBlbHNlOiBjb3VsZCBub3QgYWxsb2NhdGUgYWxsIGVsZW1lbnRzLCBnaXZlIHVwICovCisJZm9yIChpLS07IGk7IGktLSkgeworCQl2b2lkICpwID0gZWxlbWVudFtpXTsKKwkJa21lbV9jYWNoZV9mcmVlKGNhY2hlLCBwIC0gZV9vZmYpOworCX0KKwlrZnJlZShsYyk7CitvdXRfZmFpbDoKKwlrZnJlZShlbGVtZW50KTsKKwlrZnJlZShzbG90KTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgbGNfZnJlZV9ieV9pbmRleChzdHJ1Y3QgbHJ1X2NhY2hlICpsYywgdW5zaWduZWQgaSkKK3sKKwl2b2lkICpwID0gbGMtPmxjX2VsZW1lbnRbaV07CisJV0FSTl9PTighcCk7CisJaWYgKHApIHsKKwkJcCAtPSBsYy0+ZWxlbWVudF9vZmY7CisJCWttZW1fY2FjaGVfZnJlZShsYy0+bGNfY2FjaGUsIHApOworCX0KK30KKworLyoqCisgKiBsY19kZXN0cm95IC0gZnJlZXMgbWVtb3J5IGFsbG9jYXRlZCBieSBsY19jcmVhdGUoKQorICogQGxjOiB0aGUgbHJ1IGNhY2hlIHRvIGRlc3Ryb3kKKyAqLwordm9pZCBsY19kZXN0cm95KHN0cnVjdCBscnVfY2FjaGUgKmxjKQoreworCXVuc2lnbmVkIGk7CisJaWYgKCFsYykKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCBsYy0+bnJfZWxlbWVudHM7IGkrKykKKwkJbGNfZnJlZV9ieV9pbmRleChsYywgaSk7CisJa2ZyZWUobGMtPmxjX2VsZW1lbnQpOworCWtmcmVlKGxjLT5sY19zbG90KTsKKwlrZnJlZShsYyk7Cit9CisKKy8qKgorICogbGNfcmVzZXQgLSBkb2VzIGEgZnVsbCByZXNldCBmb3IgQGxjIGFuZCB0aGUgaGFzaCB0YWJsZSBzbG90cy4KKyAqIEBsYzogdGhlIGxydSBjYWNoZSB0byBvcGVyYXRlIG9uCisgKgorICogSXQgaXMgcm91Z2hseSB0aGUgZXF1aXZhbGVudCBvZiByZS1hbGxvY2F0aW5nIGEgZnJlc2ggbHJ1X2NhY2hlIG9iamVjdCwKKyAqIGJhc2ljYWxseSBhIHNob3J0IGN1dCB0byBsY19kZXN0cm95KGxjKTsgbGMgPSBsY19jcmVhdGUoLi4uKTsKKyAqLwordm9pZCBsY19yZXNldChzdHJ1Y3QgbHJ1X2NhY2hlICpsYykKK3sKKwl1bnNpZ25lZCBpOworCisJSU5JVF9MSVNUX0hFQUQoJmxjLT5pbl91c2UpOworCUlOSVRfTElTVF9IRUFEKCZsYy0+bHJ1KTsKKwlJTklUX0xJU1RfSEVBRCgmbGMtPmZyZWUpOworCUlOSVRfTElTVF9IRUFEKCZsYy0+dG9fYmVfY2hhbmdlZCk7CisJbGMtPnVzZWQgPSAwOworCWxjLT5oaXRzID0gMDsKKwlsYy0+bWlzc2VzID0gMDsKKwlsYy0+c3RhcnZpbmcgPSAwOworCWxjLT5sb2NrZWQgPSAwOworCWxjLT5jaGFuZ2VkID0gMDsKKwlsYy0+cGVuZGluZ19jaGFuZ2VzID0gMDsKKwlsYy0+ZmxhZ3MgPSAwOworCW1lbXNldChsYy0+bGNfc2xvdCwgMCwgc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSAqIGxjLT5ucl9lbGVtZW50cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGMtPm5yX2VsZW1lbnRzOyBpKyspIHsKKwkJc3RydWN0IGxjX2VsZW1lbnQgKmUgPSBsYy0+bGNfZWxlbWVudFtpXTsKKwkJdm9pZCAqcCA9IGU7CisJCXAgLT0gbGMtPmVsZW1lbnRfb2ZmOworCQltZW1zZXQocCwgMCwgbGMtPmVsZW1lbnRfc2l6ZSk7CisJCS8qIHJlLWluaXQgaXQgKi8KKwkJZS0+bGNfaW5kZXggPSBpOworCQllLT5sY19udW1iZXIgPSBMQ19GUkVFOworCQllLT5sY19uZXdfbnVtYmVyID0gTENfRlJFRTsKKwkJbGlzdF9hZGQoJmUtPmxpc3QsICZsYy0+ZnJlZSk7CisJfQorfQorCisvKioKKyAqIGxjX3NlcV9wcmludGZfc3RhdHMgLSBwcmludCBzdGF0cyBhYm91dCBAbGMgaW50byBAc2VxCisgKiBAc2VxOiB0aGUgc2VxX2ZpbGUgdG8gcHJpbnQgaW50bworICogQGxjOiB0aGUgbHJ1IGNhY2hlIHRvIHByaW50IHN0YXRpc3RpY3Mgb2YKKyAqLwordm9pZCBsY19zZXFfcHJpbnRmX3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbHJ1X2NhY2hlICpsYykKK3sKKwkvKiBOT1RFOgorCSAqIHRvdGFsIGNhbGxzIHRvIGxjX2dldCBhcmUKKwkgKiAoc3RhcnZpbmcgKyBoaXRzICsgbWlzc2VzKQorCSAqIG1pc3NlcyBpbmNsdWRlICJsb2NrZWQiIGNvdW50ICh1cGRhdGUgZnJvbSBhbiBvdGhlciB0aHJlYWQgaW4KKwkgKiBwcm9ncmVzcykgYW5kICJjaGFuZ2VkIiwgd2hlbiB0aGlzIGluIGZhY3QgbGVhZCB0byBhbiBzdWNjZXNzZnVsCisJICogdXBkYXRlIG9mIHRoZSBjYWNoZS4KKwkgKi8KKwlzZXFfcHJpbnRmKHNlcSwgIlx0JXM6IHVzZWQ6JXUvJXUgaGl0czolbHUgbWlzc2VzOiVsdSBzdGFydmluZzolbHUgbG9ja2VkOiVsdSBjaGFuZ2VkOiVsdVxuIiwKKwkJICAgbGMtPm5hbWUsIGxjLT51c2VkLCBsYy0+bnJfZWxlbWVudHMsCisJCSAgIGxjLT5oaXRzLCBsYy0+bWlzc2VzLCBsYy0+c3RhcnZpbmcsIGxjLT5sb2NrZWQsIGxjLT5jaGFuZ2VkKTsKK30KKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpsY19oYXNoX3Nsb3Qoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIGludCBlbnIpCit7CisJcmV0dXJuICBsYy0+bGNfc2xvdCArIChlbnIgJSBsYy0+bnJfZWxlbWVudHMpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgbGNfZWxlbWVudCAqX19sY19maW5kKHN0cnVjdCBscnVfY2FjaGUgKmxjLCB1bnNpZ25lZCBpbnQgZW5yLAorCQlib29sIGluY2x1ZGVfY2hhbmdpbmcpCit7CisJc3RydWN0IGxjX2VsZW1lbnQgKmU7CisKKwlCVUdfT04oIWxjKTsKKwlCVUdfT04oIWxjLT5ucl9lbGVtZW50cyk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZSwgbGNfaGFzaF9zbG90KGxjLCBlbnIpLCBjb2xpc2lvbikgeworCQkvKiAiYWJvdXQgdG8gYmUgY2hhbmdlZCIgZWxlbWVudHMsIHBlbmRpbmcgdHJhbnNhY3Rpb24gY29tbWl0LAorCQkgKiBhcmUgaGFzaGVkIGJ5IHRoZWlyICJuZXcgbnVtYmVyIi4gIk5vcm1hbCIgZWxlbWVudHMgaGF2ZQorCQkgKiBsY19udW1iZXIgPT0gbGNfbmV3X251bWJlci4gKi8KKwkJaWYgKGUtPmxjX25ld19udW1iZXIgIT0gZW5yKQorCQkJY29udGludWU7CisJCWlmIChlLT5sY19uZXdfbnVtYmVyID09IGUtPmxjX251bWJlciB8fCBpbmNsdWRlX2NoYW5naW5nKQorCQkJcmV0dXJuIGU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBsY19maW5kIC0gZmluZCBlbGVtZW50IGJ5IGxhYmVsLCBpZiBwcmVzZW50IGluIHRoZSBoYXNoIHRhYmxlCisgKiBAbGM6IFRoZSBscnVfY2FjaGUgb2JqZWN0CisgKiBAZW5yOiBlbGVtZW50IG51bWJlcgorICoKKyAqIFJldHVybnMgdGhlIHBvaW50ZXIgdG8gYW4gZWxlbWVudCwgaWYgdGhlIGVsZW1lbnQgd2l0aCB0aGUgcmVxdWVzdGVkCisgKiAibGFiZWwiIG9yIGVsZW1lbnQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIGhhc2ggdGFibGUsCisgKiBvciBOVUxMIGlmIG5vdCBmb3VuZC4gRG9lcyBub3QgY2hhbmdlIHRoZSByZWZjbnQuCisgKiBJZ25vcmVzIGVsZW1lbnRzIHRoYXQgYXJlICJhYm91dCB0byBiZSB1c2VkIiwgaS5lLiBub3QgeWV0IGluIHRoZSBhY3RpdmUKKyAqIHNldCwgYnV0IHN0aWxsIHBlbmRpbmcgdHJhbnNhY3Rpb24gY29tbWl0LgorICovCitzdHJ1Y3QgbGNfZWxlbWVudCAqbGNfZmluZChzdHJ1Y3QgbHJ1X2NhY2hlICpsYywgdW5zaWduZWQgaW50IGVucikKK3sKKwlyZXR1cm4gX19sY19maW5kKGxjLCBlbnIsIDApOworfQorCisvKioKKyAqIGxjX2lzX3VzZWQgLSBmaW5kIGVsZW1lbnQgYnkgbGFiZWwKKyAqIEBsYzogVGhlIGxydV9jYWNoZSBvYmplY3QKKyAqIEBlbnI6IGVsZW1lbnQgbnVtYmVyCisgKgorICogUmV0dXJucyB0cnVlLCBpZiB0aGUgZWxlbWVudCB3aXRoIHRoZSByZXF1ZXN0ZWQgImxhYmVsIiBvciBlbGVtZW50IG51bWJlciBpcworICogcHJlc2VudCBpbiB0aGUgaGFzaCB0YWJsZSwgYW5kIGlzIHVzZWQgKHJlZmNudCA+IDApLgorICogQWxzbyBmaW5kcyBlbGVtZW50cyB0aGF0IGFyZSBub3QgX2N1cnJlbnRseV8gdXNlZCBidXQgb25seSAiYWJvdXQgdG8gYmUKKyAqIHVzZWQiLCBpLmUuIG9uIHRoZSAidG9fYmVfY2hhbmdlZCIgbGlzdCwgcGVuZGluZyB0cmFuc2FjdGlvbiBjb21taXQuCisgKi8KK2Jvb2wgbGNfaXNfdXNlZChzdHJ1Y3QgbHJ1X2NhY2hlICpsYywgdW5zaWduZWQgaW50IGVucikKK3sKKwlzdHJ1Y3QgbGNfZWxlbWVudCAqZSA9IF9fbGNfZmluZChsYywgZW5yLCAxKTsKKwlyZXR1cm4gZSAmJiBlLT5yZWZjbnQ7Cit9CisKKy8qKgorICogbGNfZGVsIC0gcmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIGNhY2hlCisgKiBAbGM6IFRoZSBscnVfY2FjaGUgb2JqZWN0CisgKiBAZTogVGhlIGVsZW1lbnQgdG8gcmVtb3ZlCisgKgorICogQGUgbXVzdCBiZSB1bnVzZWQgKHJlZmNudCA9PSAwKS4gTW92ZXMgQGUgZnJvbSAibHJ1IiB0byAiZnJlZSIgbGlzdCwKKyAqIHNldHMgQGUtPmVuciB0byAlTENfRlJFRS4KKyAqLwordm9pZCBsY19kZWwoc3RydWN0IGxydV9jYWNoZSAqbGMsIHN0cnVjdCBsY19lbGVtZW50ICplKQoreworCVBBUkFOT0lBX0VOVFJZKCk7CisJUEFSQU5PSUFfTENfRUxFTUVOVChsYywgZSk7CisJQlVHX09OKGUtPnJlZmNudCk7CisKKwllLT5sY19udW1iZXIgPSBlLT5sY19uZXdfbnVtYmVyID0gTENfRlJFRTsKKwlobGlzdF9kZWxfaW5pdCgmZS0+Y29saXNpb24pOworCWxpc3RfbW92ZSgmZS0+bGlzdCwgJmxjLT5mcmVlKTsKKwlSRVRVUk4oKTsKK30KKworc3RhdGljIHN0cnVjdCBsY19lbGVtZW50ICpsY19wcmVwYXJlX2Zvcl9jaGFuZ2Uoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIG5ld19udW1iZXIpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbjsKKwlzdHJ1Y3QgbGNfZWxlbWVudCAqZTsKKworCWlmICghbGlzdF9lbXB0eSgmbGMtPmZyZWUpKQorCQluID0gbGMtPmZyZWUubmV4dDsKKwllbHNlIGlmICghbGlzdF9lbXB0eSgmbGMtPmxydSkpCisJCW4gPSBsYy0+bHJ1LnByZXY7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCWUgPSBsaXN0X2VudHJ5KG4sIHN0cnVjdCBsY19lbGVtZW50LCBsaXN0KTsKKwlQQVJBTk9JQV9MQ19FTEVNRU5UKGxjLCBlKTsKKworCWUtPmxjX25ld19udW1iZXIgPSBuZXdfbnVtYmVyOworCWlmICghaGxpc3RfdW5oYXNoZWQoJmUtPmNvbGlzaW9uKSkKKwkJX19obGlzdF9kZWwoJmUtPmNvbGlzaW9uKTsKKwlobGlzdF9hZGRfaGVhZCgmZS0+Y29saXNpb24sIGxjX2hhc2hfc2xvdChsYywgbmV3X251bWJlcikpOworCWxpc3RfbW92ZSgmZS0+bGlzdCwgJmxjLT50b19iZV9jaGFuZ2VkKTsKKworCXJldHVybiBlOworfQorCitzdGF0aWMgaW50IGxjX3VudXNlZF9lbGVtZW50X2F2YWlsYWJsZShzdHJ1Y3QgbHJ1X2NhY2hlICpsYykKK3sKKwlpZiAoIWxpc3RfZW1wdHkoJmxjLT5mcmVlKSkKKwkJcmV0dXJuIDE7IC8qIHNvbWV0aGluZyBvbiB0aGUgZnJlZSBsaXN0ICovCisJaWYgKCFsaXN0X2VtcHR5KCZsYy0+bHJ1KSkKKwkJcmV0dXJuIDE7ICAvKiBzb21ldGhpbmcgdG8gZXZpY3QgKi8KKworCXJldHVybiAwOworfQorCisvKiB1c2VkIGFzIGludGVybmFsIGZsYWdzIHRvIF9fbGNfZ2V0ICovCitlbnVtIHsKKwlMQ19HRVRfTUFZX0NIQU5HRSA9IDEsCisJTENfR0VUX01BWV9VU0VfVU5DT01NSVRURUQgPSAyLAorfTsKKworc3RhdGljIHN0cnVjdCBsY19lbGVtZW50ICpfX2xjX2dldChzdHJ1Y3QgbHJ1X2NhY2hlICpsYywgdW5zaWduZWQgaW50IGVuciwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0cnVjdCBsY19lbGVtZW50ICplOworCisJUEFSQU5PSUFfRU5UUlkoKTsKKwlpZiAobGMtPmZsYWdzICYgTENfU1RBUlZJTkcpIHsKKwkJKytsYy0+c3RhcnZpbmc7CisJCVJFVFVSTihOVUxMKTsKKwl9CisKKwllID0gX19sY19maW5kKGxjLCBlbnIsIDEpOworCS8qIGlmIGxjX25ld19udW1iZXIgIT0gbGNfbnVtYmVyLAorCSAqIHRoaXMgZW5yIGlzIGN1cnJlbnRseSBiZWluZyBwdWxsZWQgaW4gYWxyZWFkeSwKKwkgKiBhbmQgd2lsbCBiZSBhdmFpbGFibGUgb25jZSB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbgorCSAqIGhhcyBiZWVuIGNvbW1pdHRlZC4gKi8KKwlpZiAoZSkgeworCQlpZiAoZS0+bGNfbmV3X251bWJlciAhPSBlLT5sY19udW1iZXIpIHsKKwkJCS8qIEl0IGhhcyBiZWVuIGZvdW5kIGFib3ZlLCBidXQgb24gdGhlICJ0b19iZV9jaGFuZ2VkIgorCQkJICogbGlzdCwgbm90IHlldCBjb21taXR0ZWQuICBEb24ndCBwdWxsIGl0IGluIHR3aWNlLAorCQkJICogd2FpdCBmb3IgdGhlIHRyYW5zYWN0aW9uLCB0aGVuIHRyeSBhZ2Fpbi4uLgorCQkJICovCisJCQlpZiAoIShmbGFncyAmIExDX0dFVF9NQVlfVVNFX1VOQ09NTUlUVEVEKSkKKwkJCQlSRVRVUk4oTlVMTCk7CisJCQkvKiAuLi4gdW5sZXNzIHRoZSBjYWxsZXIgaXMgYXdhcmUgb2YgdGhlIGltcGxpY2F0aW9ucywKKwkJCSAqIHByb2JhYmx5IHByZXBhcmluZyBhIGN1bXVsYXRpdmUgdHJhbnNhY3Rpb24uICovCisJCQkrK2UtPnJlZmNudDsKKwkJCSsrbGMtPmhpdHM7CisJCQlSRVRVUk4oZSk7CisJCX0KKwkJLyogZWxzZTogbGNfbmV3X251bWJlciA9PSBsY19udW1iZXI7IGEgcmVhbCBoaXQuICovCisJCSsrbGMtPmhpdHM7CisJCWlmIChlLT5yZWZjbnQrKyA9PSAwKQorCQkJbGMtPnVzZWQrKzsKKwkJbGlzdF9tb3ZlKCZlLT5saXN0LCAmbGMtPmluX3VzZSk7IC8qIE5vdCBldmljdGFibGUuLi4gKi8KKwkJUkVUVVJOKGUpOworCX0KKwkvKiBlID09IE5VTEwgKi8KKworCSsrbGMtPm1pc3NlczsKKwlpZiAoIShmbGFncyAmIExDX0dFVF9NQVlfQ0hBTkdFKSkKKwkJUkVUVVJOKE5VTEwpOworCisJLyogVG8gYXZvaWQgcmFjZXMgd2l0aCBsY190cnlfbG9jaygpLCBmaXJzdCwgbWFyayB1cyBkaXJ0eQorCSAqICh1c2luZyB0ZXN0X2FuZF9zZXRfYml0LCBhcyBpdCBpbXBsaWVzIG1lbW9yeSBiYXJyaWVycyksIC4uLiAqLworCXRlc3RfYW5kX3NldF9iaXQoX19MQ19ESVJUWSwgJmxjLT5mbGFncyk7CisKKwkvKiAuLi4gb25seSB0aGVuIGNoZWNrIGlmIGl0IGlzIGxvY2tlZCBhbnl3YXlzLiBJZiBsY191bmxvY2sgY2xlYXJzCisJICogdGhlIGRpcnR5IGJpdCBhZ2FpbiwgdGhhdCdzIG5vdCBhIHByb2JsZW0sIHdlIHdpbGwgY29tZSBoZXJlIGFnYWluLgorCSAqLworCWlmICh0ZXN0X2JpdChfX0xDX0xPQ0tFRCwgJmxjLT5mbGFncykpIHsKKwkJKytsYy0+bG9ja2VkOworCQlSRVRVUk4oTlVMTCk7CisJfQorCisJLyogSW4gY2FzZSB0aGVyZSBpcyBub3RoaW5nIGF2YWlsYWJsZSBhbmQgd2UgY2FuIG5vdCBraWNrIG91dAorCSAqIHRoZSBMUlUgZWxlbWVudCwgd2UgaGF2ZSB0byB3YWl0IC4uLgorCSAqLworCWlmICghbGNfdW51c2VkX2VsZW1lbnRfYXZhaWxhYmxlKGxjKSkgeworCQlfX3NldF9iaXQoX19MQ19TVEFSVklORywgJmxjLT5mbGFncyk7CisJCVJFVFVSTihOVUxMKTsKKwl9CisKKwkvKiBJdCB3YXMgbm90IHByZXNlbnQgaW4gdGhlIGFjdGl2ZSBzZXQuICBXZSBhcmUgZ29pbmcgdG8gcmVjeWNsZSBhbgorCSAqIHVudXNlZCAob3IgZXZlbiAiZnJlZSIpIGVsZW1lbnQsIGJ1dCB3ZSB3b24ndCBhY2N1bXVsYXRlIG1vcmUgdGhhbgorCSAqIG1heF9wZW5kaW5nX2NoYW5nZXMgY2hhbmdlcy4gICovCisJaWYgKGxjLT5wZW5kaW5nX2NoYW5nZXMgPj0gbGMtPm1heF9wZW5kaW5nX2NoYW5nZXMpCisJCVJFVFVSTihOVUxMKTsKKworCWUgPSBsY19wcmVwYXJlX2Zvcl9jaGFuZ2UobGMsIGVucik7CisJQlVHX09OKCFlKTsKKworCWNsZWFyX2JpdChfX0xDX1NUQVJWSU5HLCAmbGMtPmZsYWdzKTsKKwlCVUdfT04oKytlLT5yZWZjbnQgIT0gMSk7CisJbGMtPnVzZWQrKzsKKwlsYy0+cGVuZGluZ19jaGFuZ2VzKys7CisKKwlSRVRVUk4oZSk7Cit9CisKKy8qKgorICogbGNfZ2V0IC0gZ2V0IGVsZW1lbnQgYnkgbGFiZWwsIG1heWJlIGNoYW5nZSB0aGUgYWN0aXZlIHNldAorICogQGxjOiB0aGUgbHJ1IGNhY2hlIHRvIG9wZXJhdGUgb24KKyAqIEBlbnI6IHRoZSBsYWJlbCB0byBsb29rIHVwCisgKgorICogRmluZHMgYW4gZWxlbWVudCBpbiB0aGUgY2FjaGUsIGluY3JlYXNlcyBpdHMgdXNhZ2UgY291bnQsCisgKiAidG91Y2hlcyIgYW5kIHJldHVybnMgaXQuCisgKgorICogSW4gY2FzZSB0aGUgcmVxdWVzdGVkIG51bWJlciBpcyBub3QgcHJlc2VudCwgaXQgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlCisgKiBjYWNoZS4gVGhlcmVmb3JlIGl0IGlzIHBvc3NpYmxlIHRoYXQgYW4gb3RoZXIgZWxlbWVudCBiZWNvbWVzIGV2aWN0ZWQgZnJvbQorICogdGhlIGNhY2hlLiBJbiBlaXRoZXIgY2FzZSwgdGhlIHVzZXIgaXMgbm90aWZpZWQgc28gaGUgaXMgYWJsZSB0byBlLmcuIGtlZXAKKyAqIGEgcGVyc2lzdGVudCBsb2cgb2YgdGhlIGNhY2hlIGNoYW5nZXMsIGFuZCB0aGVyZWZvcmUgdGhlIG9iamVjdHMgaW4gdXNlLgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgTlVMTAorICogICAgIFRoZSBjYWNoZSB3YXMgbWFya2VkICVMQ19TVEFSVklORywKKyAqICAgICBvciB0aGUgcmVxdWVzdGVkIGxhYmVsIHdhcyBub3QgaW4gdGhlIGFjdGl2ZSBzZXQKKyAqICAgICBhbmQgYSBjaGFuZ2luZyB0cmFuc2FjdGlvbiBpcyBzdGlsbCBwZW5kaW5nIChAbGMgd2FzIG1hcmtlZCAlTENfRElSVFkpLgorICogICAgIE9yIG5vIHVudXNlZCBvciBmcmVlIGVsZW1lbnQgY291bGQgYmUgcmVjeWNsZWQgKEBsYyB3aWxsIGJlIG1hcmtlZCBhcworICogICAgICVMQ19TVEFSVklORywgYmxvY2tpbmcgZnVydGhlciBsY19nZXQoKSBvcGVyYXRpb25zKS4KKyAqCisgKiAgcG9pbnRlciB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSBSRVFVRVNURUQgZWxlbWVudCBudW1iZXIuCisgKiAgICAgSW4gdGhpcyBjYXNlLCBpdCBjYW4gYmUgdXNlZCByaWdodCBhd2F5CisgKgorICogIHBvaW50ZXIgdG8gYW4gVU5VU0VEIGVsZW1lbnQgd2l0aCBzb21lIGRpZmZlcmVudCBlbGVtZW50IG51bWJlciwKKyAqICAgICAgICAgIHdoZXJlIHRoYXQgZGlmZmVyZW50IG51bWJlciBtYXkgYWxzbyBiZSAlTENfRlJFRS4KKyAqCisgKiAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBjYWNoZSBpcyBtYXJrZWQgJUxDX0RJUlRZLAorICogICAgICAgICAgc28gbGNfdHJ5X2xvY2soKSB3aWxsIG5vIGxvbmdlciBzdWNjZWVkLgorICogICAgICAgICAgVGhlIHJldHVybmVkIGVsZW1lbnQgcG9pbnRlciBpcyBtb3ZlZCB0byB0aGUgInRvX2JlX2NoYW5nZWQiIGxpc3QsCisgKiAgICAgICAgICBhbmQgcmVnaXN0ZXJlZCB3aXRoIHRoZSBuZXcgZWxlbWVudCBudW1iZXIgb24gdGhlIGhhc2ggY29sbGlzaW9uIGNoYWlucywKKyAqICAgICAgICAgIHNvIGl0IGlzIHBvc3NpYmxlIHRvIHBpY2sgaXQgdXAgZnJvbSBsY19pc191c2VkKCkuCisgKiAgICAgICAgICBVcCB0byAibWF4X3BlbmRpbmdfY2hhbmdlcyIgKHNlZSBsY19jcmVhdGUoKSkgY2FuIGJlIGFjY3VtdWxhdGVkLgorICogICAgICAgICAgVGhlIHVzZXIgbm93IHNob3VsZCBkbyB3aGF0ZXZlciBob3VzZWtlZXBpbmcgaXMgbmVjZXNzYXJ5LAorICogICAgICAgICAgdHlwaWNhbGx5IHNlcmlhbGl6ZSBvbiBsY190cnlfbG9ja19mb3JfdHJhbnNhY3Rpb24oKSwgdGhlbiBjYWxsCisgKiAgICAgICAgICBsY19jb21taXR0ZWQobGMpIGFuZCBsY191bmxvY2soKSwgdG8gZmluaXNoIHRoZSBjaGFuZ2UuCisgKgorICogTk9URTogVGhlIHVzZXIgbmVlZHMgdG8gY2hlY2sgdGhlIGxjX251bWJlciBvbiBFQUNIIHVzZSwgc28gaGUgcmVjb2duaXplcworICogICAgICAgYW55IGNhY2hlIHNldCBjaGFuZ2UuCisgKi8KK3N0cnVjdCBsY19lbGVtZW50ICpsY19nZXQoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIGludCBlbnIpCit7CisJcmV0dXJuIF9fbGNfZ2V0KGxjLCBlbnIsIExDX0dFVF9NQVlfQ0hBTkdFKTsKK30KKworLyoqCisgKiBsY19nZXRfY3VtdWxhdGl2ZSAtIGxpa2UgbGNfZ2V0OyBhbHNvIGZpbmRzIHRvLWJlLWNoYW5nZWQgZWxlbWVudHMKKyAqIEBsYzogdGhlIGxydSBjYWNoZSB0byBvcGVyYXRlIG9uCisgKiBAZW5yOiB0aGUgbGFiZWwgdG8gbG9vayB1cAorICoKKyAqIFVubGlrZSBsY19nZXQgdGhpcyBhbHNvIHJldHVybnMgdGhlIGVsZW1lbnQgZm9yIEBlbnIsIGlmIGl0IGlzIGJlbG9uZ2luZyB0bworICogYSBwZW5kaW5nIHRyYW5zYWN0aW9uLCBzbyB0aGUgcmV0dXJuIHZhbHVlcyBhcmUgbGlrZSBmb3IgbGNfZ2V0KCksCisgKiBwbHVzOgorICoKKyAqIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBhbHJlYWR5IG9uIHRoZSAidG9fYmVfY2hhbmdlZCIgbGlzdC4KKyAqIAlJbiB0aGlzIGNhc2UsIHRoZSBjYWNoZSB3YXMgYWxyZWFkeSBtYXJrZWQgJUxDX0RJUlRZLgorICoKKyAqIENhbGxlciBuZWVkcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgcGVuZGluZyB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZWQsCisgKiBiZWZvcmUgcHJvY2VlZGluZyB0byBhY3R1YWxseSB1c2UgdGhpcyBlbGVtZW50LgorICovCitzdHJ1Y3QgbGNfZWxlbWVudCAqbGNfZ2V0X2N1bXVsYXRpdmUoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIGludCBlbnIpCit7CisJcmV0dXJuIF9fbGNfZ2V0KGxjLCBlbnIsIExDX0dFVF9NQVlfQ0hBTkdFfExDX0dFVF9NQVlfVVNFX1VOQ09NTUlUVEVEKTsKK30KKworLyoqCisgKiBsY190cnlfZ2V0IC0gZ2V0IGVsZW1lbnQgYnkgbGFiZWwsIGlmIHByZXNlbnQ7IGRvIG5vdCBjaGFuZ2UgdGhlIGFjdGl2ZSBzZXQKKyAqIEBsYzogdGhlIGxydSBjYWNoZSB0byBvcGVyYXRlIG9uCisgKiBAZW5yOiB0aGUgbGFiZWwgdG8gbG9vayB1cAorICoKKyAqIEZpbmRzIGFuIGVsZW1lbnQgaW4gdGhlIGNhY2hlLCBpbmNyZWFzZXMgaXRzIHVzYWdlIGNvdW50LAorICogInRvdWNoZXMiIGFuZCByZXR1cm5zIGl0LgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgTlVMTAorICogICAgIFRoZSBjYWNoZSB3YXMgbWFya2VkICVMQ19TVEFSVklORywKKyAqICAgICBvciB0aGUgcmVxdWVzdGVkIGxhYmVsIHdhcyBub3QgaW4gdGhlIGFjdGl2ZSBzZXQKKyAqCisgKiAgcG9pbnRlciB0byB0aGUgZWxlbWVudCB3aXRoIHRoZSBSRVFVRVNURUQgZWxlbWVudCBudW1iZXIuCisgKiAgICAgSW4gdGhpcyBjYXNlLCBpdCBjYW4gYmUgdXNlZCByaWdodCBhd2F5CisgKi8KK3N0cnVjdCBsY19lbGVtZW50ICpsY190cnlfZ2V0KHN0cnVjdCBscnVfY2FjaGUgKmxjLCB1bnNpZ25lZCBpbnQgZW5yKQoreworCXJldHVybiBfX2xjX2dldChsYywgZW5yLCAwKTsKK30KKworLyoqCisgKiBsY19jb21taXR0ZWQgLSB0ZWxsIEBsYyB0aGF0IHBlbmRpbmcgY2hhbmdlcyBoYXZlIGJlZW4gcmVjb3JkZWQKKyAqIEBsYzogdGhlIGxydSBjYWNoZSB0byBvcGVyYXRlIG9uCisgKgorICogVXNlciBpcyBleHBlY3RlZCB0byBzZXJpYWxpemUgb24gZXhwbGljaXQgbGNfdHJ5X2xvY2tfZm9yX3RyYW5zYWN0aW9uKCkKKyAqIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgc3RhcnRlZCwgYW5kIGxhdGVyIG5lZWRzIHRvIGxjX3VubG9jaygpIGV4cGxpY2l0bHkKKyAqIGFzIHdlbGwuCisgKi8KK3ZvaWQgbGNfY29tbWl0dGVkKHN0cnVjdCBscnVfY2FjaGUgKmxjKQoreworCXN0cnVjdCBsY19lbGVtZW50ICplLCAqdG1wOworCisJUEFSQU5PSUFfRU5UUlkoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdG1wLCAmbGMtPnRvX2JlX2NoYW5nZWQsIGxpc3QpIHsKKwkJLyogY291bnQgbnVtYmVyIG9mIGNoYW5nZXMsIG5vdCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zICovCisJCSsrbGMtPmNoYW5nZWQ7CisJCWUtPmxjX251bWJlciA9IGUtPmxjX25ld19udW1iZXI7CisJCWxpc3RfbW92ZSgmZS0+bGlzdCwgJmxjLT5pbl91c2UpOworCX0KKwlsYy0+cGVuZGluZ19jaGFuZ2VzID0gMDsKKwlSRVRVUk4oKTsKK30KKworCisvKioKKyAqIGxjX3B1dCAtIGdpdmUgdXAgcmVmY250IG9mIEBlCisgKiBAbGM6IHRoZSBscnUgY2FjaGUgdG8gb3BlcmF0ZSBvbgorICogQGU6IHRoZSBlbGVtZW50IHRvIHB1dAorICoKKyAqIElmIHJlZmNudCByZWFjaGVzIHplcm8sIHRoZSBlbGVtZW50IGlzIG1vdmVkIHRvIHRoZSBscnUgbGlzdCwKKyAqIGFuZCBhICVMQ19TVEFSVklORyAoaWYgc2V0KSBpcyBjbGVhcmVkLgorICogUmV0dXJucyB0aGUgbmV3IChwb3N0LWRlY3JlbWVudCkgcmVmY250LgorICovCit1bnNpZ25lZCBpbnQgbGNfcHV0KHN0cnVjdCBscnVfY2FjaGUgKmxjLCBzdHJ1Y3QgbGNfZWxlbWVudCAqZSkKK3sKKwlQQVJBTk9JQV9FTlRSWSgpOworCVBBUkFOT0lBX0xDX0VMRU1FTlQobGMsIGUpOworCUJVR19PTihlLT5yZWZjbnQgPT0gMCk7CisJQlVHX09OKGUtPmxjX251bWJlciAhPSBlLT5sY19uZXdfbnVtYmVyKTsKKwlpZiAoLS1lLT5yZWZjbnQgPT0gMCkgeworCQkvKiBtb3ZlIGl0IHRvIHRoZSBmcm9udCBvZiBMUlUuICovCisJCWxpc3RfbW92ZSgmZS0+bGlzdCwgJmxjLT5scnUpOworCQlsYy0+dXNlZC0tOworCQljbGVhcl9iaXRfdW5sb2NrKF9fTENfU1RBUlZJTkcsICZsYy0+ZmxhZ3MpOworCX0KKwlSRVRVUk4oZS0+cmVmY250KTsKK30KKworLyoqCisgKiBsY19lbGVtZW50X2J5X2luZGV4CisgKiBAbGM6IHRoZSBscnUgY2FjaGUgdG8gb3BlcmF0ZSBvbgorICogQGk6IHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4KKyAqLworc3RydWN0IGxjX2VsZW1lbnQgKmxjX2VsZW1lbnRfYnlfaW5kZXgoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIGkpCit7CisJQlVHX09OKGkgPj0gbGMtPm5yX2VsZW1lbnRzKTsKKwlCVUdfT04obGMtPmxjX2VsZW1lbnRbaV0gPT0gTlVMTCk7CisJQlVHX09OKGxjLT5sY19lbGVtZW50W2ldLT5sY19pbmRleCAhPSBpKTsKKwlyZXR1cm4gbGMtPmxjX2VsZW1lbnRbaV07Cit9CisKKy8qKgorICogbGNfaW5kZXhfb2YKKyAqIEBsYzogdGhlIGxydSBjYWNoZSB0byBvcGVyYXRlIG9uCisgKiBAZTogdGhlIGVsZW1lbnQgdG8gcXVlcnkgZm9yIGl0cyBpbmRleCBwb3NpdGlvbiBpbiBsYy0+ZWxlbWVudAorICovCit1bnNpZ25lZCBpbnQgbGNfaW5kZXhfb2Yoc3RydWN0IGxydV9jYWNoZSAqbGMsIHN0cnVjdCBsY19lbGVtZW50ICplKQoreworCVBBUkFOT0lBX0xDX0VMRU1FTlQobGMsIGUpOworCXJldHVybiBlLT5sY19pbmRleDsKK30KKworLyoqCisgKiBsY19zZXQgLSBhc3NvY2lhdGUgaW5kZXggd2l0aCBsYWJlbAorICogQGxjOiB0aGUgbHJ1IGNhY2hlIHRvIG9wZXJhdGUgb24KKyAqIEBlbnI6IHRoZSBsYWJlbCB0byBzZXQKKyAqIEBpbmRleDogdGhlIGVsZW1lbnQgaW5kZXggdG8gYXNzb2NpYXRlIGxhYmVsIHdpdGguCisgKgorICogVXNlZCB0byBpbml0aWFsaXplIHRoZSBhY3RpdmUgc2V0IHRvIHNvbWUgcHJldmlvdXNseSByZWNvcmRlZCBzdGF0ZS4KKyAqLwordm9pZCBsY19zZXQoc3RydWN0IGxydV9jYWNoZSAqbGMsIHVuc2lnbmVkIGludCBlbnIsIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgbGNfZWxlbWVudCAqZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaDsKKworCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGMtPm5yX2VsZW1lbnRzKQorCQlyZXR1cm47CisKKwllID0gbGNfZWxlbWVudF9ieV9pbmRleChsYywgaW5kZXgpOworCUJVR19PTihlLT5sY19udW1iZXIgIT0gZS0+bGNfbmV3X251bWJlcik7CisJQlVHX09OKGUtPnJlZmNudCAhPSAwKTsKKworCWUtPmxjX251bWJlciA9IGUtPmxjX25ld19udW1iZXIgPSBlbnI7CisJaGxpc3RfZGVsX2luaXQoJmUtPmNvbGlzaW9uKTsKKwlpZiAoZW5yID09IExDX0ZSRUUpCisJCWxoID0gJmxjLT5mcmVlOworCWVsc2UgeworCQlobGlzdF9hZGRfaGVhZCgmZS0+Y29saXNpb24sIGxjX2hhc2hfc2xvdChsYywgZW5yKSk7CisJCWxoID0gJmxjLT5scnU7CisJfQorCWxpc3RfbW92ZSgmZS0+bGlzdCwgbGgpOworfQorCisvKioKKyAqIGxjX2R1bXAgLSBEdW1wIGEgY29tcGxldGUgTFJVIGNhY2hlIHRvIHNlcSBpbiB0ZXh0dWFsIGZvcm0uCisgKiBAbGM6IHRoZSBscnUgY2FjaGUgdG8gb3BlcmF0ZSBvbgorICogQHNlcTogdGhlICZzdHJ1Y3Qgc2VxX2ZpbGUgcG9pbnRlciB0byBzZXFfcHJpbnRmIGludG8KKyAqIEB1dGV4dDogdXNlciBzdXBwbGllZCBhZGRpdGlvbmFsICJoZWFkaW5nIiBvciBvdGhlciBpbmZvCisgKiBAZGV0YWlsOiBmdW5jdGlvbiBwb2ludGVyIHRoZSB1c2VyIG1heSBwcm92aWRlIHRvIGR1bXAgZnVydGhlciBkZXRhaWxzCisgKiBvZiB0aGUgb2JqZWN0IHRoZSBsY19lbGVtZW50IGlzIGVtYmVkZGVkIGluLiBNYXkgYmUgTlVMTC4KKyAqIE5vdGU6IGEgbGVhZGluZyBzcGFjZSAnICcgYW5kIHRyYWlsaW5nIG5ld2xpbmUgJ1xuJyBpcyBpbXBsaWVkLgorICovCit2b2lkIGxjX3NlcV9kdW1wX2RldGFpbHMoc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBscnVfY2FjaGUgKmxjLCBjaGFyICp1dGV4dCwKKwkgICAgIHZvaWQgKCpkZXRhaWwpIChzdHJ1Y3Qgc2VxX2ZpbGUgKiwgc3RydWN0IGxjX2VsZW1lbnQgKikpCit7CisJdW5zaWduZWQgaW50IG5yX2VsZW1lbnRzID0gbGMtPm5yX2VsZW1lbnRzOworCXN0cnVjdCBsY19lbGVtZW50ICplOworCWludCBpOworCisJc2VxX3ByaW50ZihzZXEsICJcdG5uOiBsY19udW1iZXIgKG5ldyBucikgcmVmY250ICVzXG4gIiwgdXRleHQpOworCWZvciAoaSA9IDA7IGkgPCBucl9lbGVtZW50czsgaSsrKSB7CisJCWUgPSBsY19lbGVtZW50X2J5X2luZGV4KGxjLCBpKTsKKwkJaWYgKGUtPmxjX251bWJlciAhPSBlLT5sY19uZXdfbnVtYmVyKQorCQkJc2VxX3ByaW50ZihzZXEsICJcdCU1ZDogJTZkICU4ZCAlNmQgIiwKKwkJCQlpLCBlLT5sY19udW1iZXIsIGUtPmxjX25ld19udW1iZXIsIGUtPnJlZmNudCk7CisJCWVsc2UKKwkJCXNlcV9wcmludGYoc2VxLCAiXHQlNWQ6ICU2ZCAlLThzICU2ZCAiLAorCQkJCWksIGUtPmxjX251bWJlciwgIi1cIi0iLCBlLT5yZWZjbnQpOworCQlpZiAoZGV0YWlsKQorCQkJZGV0YWlsKHNlcSwgZSk7CisJCXNlcV9wdXRjKHNlcSwgJ1xuJyk7CisJfQorfQorCitFWFBPUlRfU1lNQk9MKGxjX2NyZWF0ZSk7CitFWFBPUlRfU1lNQk9MKGxjX3Jlc2V0KTsKK0VYUE9SVF9TWU1CT0wobGNfZGVzdHJveSk7CitFWFBPUlRfU1lNQk9MKGxjX3NldCk7CitFWFBPUlRfU1lNQk9MKGxjX2RlbCk7CitFWFBPUlRfU1lNQk9MKGxjX3RyeV9nZXQpOworRVhQT1JUX1NZTUJPTChsY19maW5kKTsKK0VYUE9SVF9TWU1CT0wobGNfZ2V0KTsKK0VYUE9SVF9TWU1CT0wobGNfcHV0KTsKK0VYUE9SVF9TWU1CT0wobGNfY29tbWl0dGVkKTsKK0VYUE9SVF9TWU1CT0wobGNfZWxlbWVudF9ieV9pbmRleCk7CitFWFBPUlRfU1lNQk9MKGxjX2luZGV4X29mKTsKK0VYUE9SVF9TWU1CT0wobGNfc2VxX3ByaW50Zl9zdGF0cyk7CitFWFBPUlRfU1lNQk9MKGxjX3NlcV9kdW1wX2RldGFpbHMpOworRVhQT1JUX1NZTUJPTChsY190cnlfbG9jayk7CitFWFBPUlRfU1lNQk9MKGxjX2lzX3VzZWQpOworRVhQT1JUX1NZTUJPTChsY19nZXRfY3VtdWxhdGl2ZSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sejQvTWFrZWZpbGUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sejQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiMTEzMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK2NjZmxhZ3MteSArPSAtTzMKKworb2JqLSQoQ09ORklHX0xaNF9DT01QUkVTUykgKz0gbHo0X2NvbXByZXNzLm8KK29iai0kKENPTkZJR19MWjRIQ19DT01QUkVTUykgKz0gbHo0aGNfY29tcHJlc3Mubworb2JqLSQoQ09ORklHX0xaNF9ERUNPTVBSRVNTKSArPSBsejRfZGVjb21wcmVzcy5vCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sejQvbHo0X2NvbXByZXNzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sejQvbHo0X2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3YjZkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9sejRfY29tcHJlc3MuYwpAQCAtMCwwICsxLDk0MCBAQAorLyoKKyAqIExaNCAtIEZhc3QgTFogY29tcHJlc3Npb24gYWxnb3JpdGhtCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgLSAyMDE2LCBZYW5uIENvbGxldC4KKyAqIEJTRCAyIC0gQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkIC0gbGljZW5zZS5waHApCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCSAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoJKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICoJLSBMWjQgaG9tZXBhZ2UgOiBodHRwOi8vd3d3Lmx6NC5vcmcKKyAqCS0gTFo0IHNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL2x6NC9sejQKKyAqCisgKglDaGFuZ2VkIGZvciBrZXJuZWwgdXNhZ2UgYnk6CisgKglTdmVuIFNjaG1pZHQgPDRzc2NobWlkQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+CisgKi8KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglEZXBlbmRlbmNpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9sejQuaD4KKyNpbmNsdWRlICJsejRkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCitzdGF0aWMgY29uc3QgaW50IExaNF9taW5MZW5ndGggPSAoTUZMSU1JVCArIDEpOworc3RhdGljIGNvbnN0IGludCBMWjRfNjRLbGltaXQgPSAoKDY0ICogS0IpICsgKE1GTElNSVQgLSAxKSk7CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQ29tcHJlc3Npb24gZnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgRk9SQ0VfSU5MSU5FIFUzMiBMWjRfaGFzaDQoCisJVTMyIHNlcXVlbmNlLAorCXRhYmxlVHlwZV90IGNvbnN0IHRhYmxlVHlwZSkKK3sKKwlpZiAodGFibGVUeXBlID09IGJ5VTE2KQorCQlyZXR1cm4gKChzZXF1ZW5jZSAqIDI2NTQ0MzU3NjFVKQorCQkJPj4gKChNSU5NQVRDSCAqIDgpIC0gKExaNF9IQVNITE9HICsgMSkpKTsKKwllbHNlCisJCXJldHVybiAoKHNlcXVlbmNlICogMjY1NDQzNTc2MVUpCisJCQk+PiAoKE1JTk1BVENIICogOCkgLSBMWjRfSEFTSExPRykpOworfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIFUzMiBMWjRfaGFzaDUoCisJVTY0IHNlcXVlbmNlLAorCXRhYmxlVHlwZV90IGNvbnN0IHRhYmxlVHlwZSkKK3sKKwljb25zdCBVMzIgaGFzaExvZyA9ICh0YWJsZVR5cGUgPT0gYnlVMTYpCisJCT8gTFo0X0hBU0hMT0cgKyAxCisJCTogTFo0X0hBU0hMT0c7CisKKyNpZiBMWjRfTElUVExFX0VORElBTgorCXN0YXRpYyBjb25zdCBVNjQgcHJpbWU1Ynl0ZXMgPSA4ODk1MjM1OTIzNzlVTEw7CisKKwlyZXR1cm4gKFUzMikoKChzZXF1ZW5jZSA8PCAyNCkgKiBwcmltZTVieXRlcykgPj4gKDY0IC0gaGFzaExvZykpOworI2Vsc2UKKwlzdGF0aWMgY29uc3QgVTY0IHByaW1lOGJ5dGVzID0gMTE0MDA3MTQ3ODUwNzQ2OTQ3OTFVTEw7CisKKwlyZXR1cm4gKFUzMikoKChzZXF1ZW5jZSA+PiAyNCkgKiBwcmltZThieXRlcykgPj4gKDY0IC0gaGFzaExvZykpOworI2VuZGlmCit9CisKK3N0YXRpYyBGT1JDRV9JTkxJTkUgVTMyIExaNF9oYXNoUG9zaXRpb24oCisJY29uc3Qgdm9pZCAqcCwKKwl0YWJsZVR5cGVfdCBjb25zdCB0YWJsZVR5cGUpCit7CisjaWYgTFo0X0FSQ0g2NAorCWlmICh0YWJsZVR5cGUgPT0gYnlVMzIpCisJCXJldHVybiBMWjRfaGFzaDUoTFo0X3JlYWRfQVJDSChwKSwgdGFibGVUeXBlKTsKKyNlbmRpZgorCisJcmV0dXJuIExaNF9oYXNoNChMWjRfcmVhZDMyKHApLCB0YWJsZVR5cGUpOworfQorCitzdGF0aWMgdm9pZCBMWjRfcHV0UG9zaXRpb25Pbkhhc2goCisJY29uc3QgQllURSAqcCwKKwlVMzIgaCwKKwl2b2lkICp0YWJsZUJhc2UsCisJdGFibGVUeXBlX3QgY29uc3QgdGFibGVUeXBlLAorCWNvbnN0IEJZVEUgKnNyY0Jhc2UpCit7CisJc3dpdGNoICh0YWJsZVR5cGUpIHsKKwljYXNlIGJ5UHRyOgorCXsKKwkJY29uc3QgQllURSAqKmhhc2hUYWJsZSA9IChjb25zdCBCWVRFICoqKXRhYmxlQmFzZTsKKworCQloYXNoVGFibGVbaF0gPSBwOworCQlyZXR1cm47CisJfQorCWNhc2UgYnlVMzI6CisJeworCQlVMzIgKmhhc2hUYWJsZSA9IChVMzIgKikgdGFibGVCYXNlOworCisJCWhhc2hUYWJsZVtoXSA9IChVMzIpKHAgLSBzcmNCYXNlKTsKKwkJcmV0dXJuOworCX0KKwljYXNlIGJ5VTE2OgorCXsKKwkJVTE2ICpoYXNoVGFibGUgPSAoVTE2ICopIHRhYmxlQmFzZTsKKworCQloYXNoVGFibGVbaF0gPSAoVTE2KShwIC0gc3JjQmFzZSk7CisJCXJldHVybjsKKwl9CisJfQorfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIHZvaWQgTFo0X3B1dFBvc2l0aW9uKAorCWNvbnN0IEJZVEUgKnAsCisJdm9pZCAqdGFibGVCYXNlLAorCXRhYmxlVHlwZV90IHRhYmxlVHlwZSwKKwljb25zdCBCWVRFICpzcmNCYXNlKQoreworCVUzMiBjb25zdCBoID0gTFo0X2hhc2hQb3NpdGlvbihwLCB0YWJsZVR5cGUpOworCisJTFo0X3B1dFBvc2l0aW9uT25IYXNoKHAsIGgsIHRhYmxlQmFzZSwgdGFibGVUeXBlLCBzcmNCYXNlKTsKK30KKworc3RhdGljIGNvbnN0IEJZVEUgKkxaNF9nZXRQb3NpdGlvbk9uSGFzaCgKKwlVMzIgaCwKKwl2b2lkICp0YWJsZUJhc2UsCisJdGFibGVUeXBlX3QgdGFibGVUeXBlLAorCWNvbnN0IEJZVEUgKnNyY0Jhc2UpCit7CisJaWYgKHRhYmxlVHlwZSA9PSBieVB0cikgeworCQljb25zdCBCWVRFICoqaGFzaFRhYmxlID0gKGNvbnN0IEJZVEUgKiopIHRhYmxlQmFzZTsKKworCQlyZXR1cm4gaGFzaFRhYmxlW2hdOworCX0KKworCWlmICh0YWJsZVR5cGUgPT0gYnlVMzIpIHsKKwkJY29uc3QgVTMyICogY29uc3QgaGFzaFRhYmxlID0gKFUzMiAqKSB0YWJsZUJhc2U7CisKKwkJcmV0dXJuIGhhc2hUYWJsZVtoXSArIHNyY0Jhc2U7CisJfQorCisJeworCQkvKiBkZWZhdWx0LCB0byBlbnN1cmUgYSByZXR1cm4gKi8KKwkJY29uc3QgVTE2ICogY29uc3QgaGFzaFRhYmxlID0gKFUxNiAqKSB0YWJsZUJhc2U7CisKKwkJcmV0dXJuIGhhc2hUYWJsZVtoXSArIHNyY0Jhc2U7CisJfQorfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIGNvbnN0IEJZVEUgKkxaNF9nZXRQb3NpdGlvbigKKwljb25zdCBCWVRFICpwLAorCXZvaWQgKnRhYmxlQmFzZSwKKwl0YWJsZVR5cGVfdCB0YWJsZVR5cGUsCisJY29uc3QgQllURSAqc3JjQmFzZSkKK3sKKwlVMzIgY29uc3QgaCA9IExaNF9oYXNoUG9zaXRpb24ocCwgdGFibGVUeXBlKTsKKworCXJldHVybiBMWjRfZ2V0UG9zaXRpb25Pbkhhc2goaCwgdGFibGVCYXNlLCB0YWJsZVR5cGUsIHNyY0Jhc2UpOworfQorCisKKy8qCisgKiBMWjRfY29tcHJlc3NfZ2VuZXJpYygpIDoKKyAqIGlubGluZWQsIHRvIGVuc3VyZSBicmFuY2hlcyBhcmUgZGVjaWRlZCBhdCBjb21waWxhdGlvbiB0aW1lCisgKi8KK3N0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExaNF9jb21wcmVzc19nZW5lcmljKAorCUxaNF9zdHJlYW1fdF9pbnRlcm5hbCAqIGNvbnN0IGRpY3RQdHIsCisJY29uc3QgY2hhciAqIGNvbnN0IHNvdXJjZSwKKwljaGFyICogY29uc3QgZGVzdCwKKwljb25zdCBpbnQgaW5wdXRTaXplLAorCWNvbnN0IGludCBtYXhPdXRwdXRTaXplLAorCWNvbnN0IGxpbWl0ZWRPdXRwdXRfZGlyZWN0aXZlIG91dHB1dExpbWl0ZWQsCisJY29uc3QgdGFibGVUeXBlX3QgdGFibGVUeXBlLAorCWNvbnN0IGRpY3RfZGlyZWN0aXZlIGRpY3QsCisJY29uc3QgZGljdElzc3VlX2RpcmVjdGl2ZSBkaWN0SXNzdWUsCisJY29uc3QgVTMyIGFjY2VsZXJhdGlvbikKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopIHNvdXJjZTsKKwljb25zdCBCWVRFICpiYXNlOworCWNvbnN0IEJZVEUgKmxvd0xpbWl0OworCWNvbnN0IEJZVEUgKiBjb25zdCBsb3dSZWZMaW1pdCA9IGlwIC0gZGljdFB0ci0+ZGljdFNpemU7CisJY29uc3QgQllURSAqIGNvbnN0IGRpY3Rpb25hcnkgPSBkaWN0UHRyLT5kaWN0aW9uYXJ5OworCWNvbnN0IEJZVEUgKiBjb25zdCBkaWN0RW5kID0gZGljdGlvbmFyeSArIGRpY3RQdHItPmRpY3RTaXplOworCWNvbnN0IHNpemVfdCBkaWN0RGVsdGEgPSBkaWN0RW5kIC0gKGNvbnN0IEJZVEUgKilzb3VyY2U7CisJY29uc3QgQllURSAqYW5jaG9yID0gKGNvbnN0IEJZVEUgKikgc291cmNlOworCWNvbnN0IEJZVEUgKiBjb25zdCBpZW5kID0gaXAgKyBpbnB1dFNpemU7CisJY29uc3QgQllURSAqIGNvbnN0IG1mbGltaXQgPSBpZW5kIC0gTUZMSU1JVDsKKwljb25zdCBCWVRFICogY29uc3QgbWF0Y2hsaW1pdCA9IGllbmQgLSBMQVNUTElURVJBTFM7CisKKwlCWVRFICpvcCA9IChCWVRFICopIGRlc3Q7CisJQllURSAqIGNvbnN0IG9saW1pdCA9IG9wICsgbWF4T3V0cHV0U2l6ZTsKKworCVUzMiBmb3J3YXJkSDsKKwlzaXplX3QgcmVmRGVsdGEgPSAwOworCisJLyogSW5pdCBjb25kaXRpb25zICovCisJaWYgKChVMzIpaW5wdXRTaXplID4gKFUzMilMWjRfTUFYX0lOUFVUX1NJWkUpIHsKKwkJLyogVW5zdXBwb3J0ZWQgaW5wdXRTaXplLCB0b28gbGFyZ2UgKG9yIG5lZ2F0aXZlKSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGRpY3QpIHsKKwljYXNlIG5vRGljdDoKKwlkZWZhdWx0OgorCQliYXNlID0gKGNvbnN0IEJZVEUgKilzb3VyY2U7CisJCWxvd0xpbWl0ID0gKGNvbnN0IEJZVEUgKilzb3VyY2U7CisJCWJyZWFrOworCWNhc2Ugd2l0aFByZWZpeDY0azoKKwkJYmFzZSA9IChjb25zdCBCWVRFICopc291cmNlIC0gZGljdFB0ci0+Y3VycmVudE9mZnNldDsKKwkJbG93TGltaXQgPSAoY29uc3QgQllURSAqKXNvdXJjZSAtIGRpY3RQdHItPmRpY3RTaXplOworCQlicmVhazsKKwljYXNlIHVzaW5nRXh0RGljdDoKKwkJYmFzZSA9IChjb25zdCBCWVRFICopc291cmNlIC0gZGljdFB0ci0+Y3VycmVudE9mZnNldDsKKwkJbG93TGltaXQgPSAoY29uc3QgQllURSAqKXNvdXJjZTsKKwkJYnJlYWs7CisJfQorCisJaWYgKCh0YWJsZVR5cGUgPT0gYnlVMTYpCisJCSYmIChpbnB1dFNpemUgPj0gTFo0XzY0S2xpbWl0KSkgeworCQkvKiBTaXplIHRvbyBsYXJnZSAobm90IHdpdGhpbiA2NEsgbGltaXQpICovCisJCXJldHVybiAwOworCX0KKworCWlmIChpbnB1dFNpemUgPCBMWjRfbWluTGVuZ3RoKSB7CisJCS8qIElucHV0IHRvbyBzbWFsbCwgbm8gY29tcHJlc3Npb24gKGFsbCBsaXRlcmFscykgKi8KKwkJZ290byBfbGFzdF9saXRlcmFsczsKKwl9CisKKwkvKiBGaXJzdCBCeXRlICovCisJTFo0X3B1dFBvc2l0aW9uKGlwLCBkaWN0UHRyLT5oYXNoVGFibGUsIHRhYmxlVHlwZSwgYmFzZSk7CisJaXArKzsKKwlmb3J3YXJkSCA9IExaNF9oYXNoUG9zaXRpb24oaXAsIHRhYmxlVHlwZSk7CisKKwkvKiBNYWluIExvb3AgKi8KKwlmb3IgKCA7IDsgKSB7CisJCWNvbnN0IEJZVEUgKm1hdGNoOworCQlCWVRFICp0b2tlbjsKKworCQkvKiBGaW5kIGEgbWF0Y2ggKi8KKwkJeworCQkJY29uc3QgQllURSAqZm9yd2FyZElwID0gaXA7CisJCQl1bnNpZ25lZCBpbnQgc3RlcCA9IDE7CisJCQl1bnNpZ25lZCBpbnQgc2VhcmNoTWF0Y2hOYiA9IGFjY2VsZXJhdGlvbiA8PCBMWjRfU0tJUFRSSUdHRVI7CisKKwkJCWRvIHsKKwkJCQlVMzIgY29uc3QgaCA9IGZvcndhcmRIOworCisJCQkJaXAgPSBmb3J3YXJkSXA7CisJCQkJZm9yd2FyZElwICs9IHN0ZXA7CisJCQkJc3RlcCA9IChzZWFyY2hNYXRjaE5iKysgPj4gTFo0X1NLSVBUUklHR0VSKTsKKworCQkJCWlmICh1bmxpa2VseShmb3J3YXJkSXAgPiBtZmxpbWl0KSkKKwkJCQkJZ290byBfbGFzdF9saXRlcmFsczsKKworCQkJCW1hdGNoID0gTFo0X2dldFBvc2l0aW9uT25IYXNoKGgsCisJCQkJCWRpY3RQdHItPmhhc2hUYWJsZSwKKwkJCQkJdGFibGVUeXBlLCBiYXNlKTsKKworCQkJCWlmIChkaWN0ID09IHVzaW5nRXh0RGljdCkgeworCQkJCQlpZiAobWF0Y2ggPCAoY29uc3QgQllURSAqKXNvdXJjZSkgeworCQkJCQkJcmVmRGVsdGEgPSBkaWN0RGVsdGE7CisJCQkJCQlsb3dMaW1pdCA9IGRpY3Rpb25hcnk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyZWZEZWx0YSA9IDA7CisJCQkJCQlsb3dMaW1pdCA9IChjb25zdCBCWVRFICopc291cmNlOworCQkJCX0JIH0KKworCQkJCWZvcndhcmRIID0gTFo0X2hhc2hQb3NpdGlvbihmb3J3YXJkSXAsCisJCQkJCXRhYmxlVHlwZSk7CisKKwkJCQlMWjRfcHV0UG9zaXRpb25Pbkhhc2goaXAsIGgsIGRpY3RQdHItPmhhc2hUYWJsZSwKKwkJCQkJdGFibGVUeXBlLCBiYXNlKTsKKwkJCX0gd2hpbGUgKCgoZGljdElzc3VlID09IGRpY3RTbWFsbCkKKwkJCQkJPyAobWF0Y2ggPCBsb3dSZWZMaW1pdCkKKwkJCQkJOiAwKQorCQkJCXx8ICgodGFibGVUeXBlID09IGJ5VTE2KQorCQkJCQk/IDAKKwkJCQkJOiAobWF0Y2ggKyBNQVhfRElTVEFOQ0UgPCBpcCkpCisJCQkJfHwgKExaNF9yZWFkMzIobWF0Y2ggKyByZWZEZWx0YSkKKwkJCQkJIT0gTFo0X3JlYWQzMihpcCkpKTsKKwkJfQorCisJCS8qIENhdGNoIHVwICovCisJCXdoaWxlICgoKGlwID4gYW5jaG9yKSAmIChtYXRjaCArIHJlZkRlbHRhID4gbG93TGltaXQpKQorCQkJCSYmICh1bmxpa2VseShpcFstMV0gPT0gbWF0Y2hbcmVmRGVsdGEgLSAxXSkpKSB7CisJCQlpcC0tOworCQkJbWF0Y2gtLTsKKwkJfQorCisJCS8qIEVuY29kZSBMaXRlcmFscyAqLworCQl7CisJCQl1bnNpZ25lZCBjb25zdCBpbnQgbGl0TGVuZ3RoID0gKHVuc2lnbmVkIGludCkoaXAgLSBhbmNob3IpOworCisJCQl0b2tlbiA9IG9wKys7CisKKwkJCWlmICgob3V0cHV0TGltaXRlZCkgJiYKKwkJCQkvKiBDaGVjayBvdXRwdXQgYnVmZmVyIG92ZXJmbG93ICovCisJCQkJKHVubGlrZWx5KG9wICsgbGl0TGVuZ3RoICsKKwkJCQkJKDIgKyAxICsgTEFTVExJVEVSQUxTKSArCisJCQkJCShsaXRMZW5ndGggLyAyNTUpID4gb2xpbWl0KSkpCisJCQkJcmV0dXJuIDA7CisKKwkJCWlmIChsaXRMZW5ndGggPj0gUlVOX01BU0spIHsKKwkJCQlpbnQgbGVuID0gKGludClsaXRMZW5ndGggLSBSVU5fTUFTSzsKKworCQkJCSp0b2tlbiA9IChSVU5fTUFTSyA8PCBNTF9CSVRTKTsKKworCQkJCWZvciAoOyBsZW4gPj0gMjU1OyBsZW4gLT0gMjU1KQorCQkJCQkqb3ArKyA9IDI1NTsKKwkJCQkqb3ArKyA9IChCWVRFKWxlbjsKKwkJCX0gZWxzZQorCQkJCSp0b2tlbiA9IChCWVRFKShsaXRMZW5ndGggPDwgTUxfQklUUyk7CisKKwkJCS8qIENvcHkgTGl0ZXJhbHMgKi8KKwkJCUxaNF93aWxkQ29weShvcCwgYW5jaG9yLCBvcCArIGxpdExlbmd0aCk7CisJCQlvcCArPSBsaXRMZW5ndGg7CisJCX0KKworX25leHRfbWF0Y2g6CisJCS8qIEVuY29kZSBPZmZzZXQgKi8KKwkJTFo0X3dyaXRlTEUxNihvcCwgKFUxNikoaXAgLSBtYXRjaCkpOworCQlvcCArPSAyOworCisJCS8qIEVuY29kZSBNYXRjaExlbmd0aCAqLworCQl7CisJCQl1bnNpZ25lZCBpbnQgbWF0Y2hDb2RlOworCisJCQlpZiAoKGRpY3QgPT0gdXNpbmdFeHREaWN0KQorCQkJCSYmIChsb3dMaW1pdCA9PSBkaWN0aW9uYXJ5KSkgeworCQkJCWNvbnN0IEJZVEUgKmxpbWl0OworCisJCQkJbWF0Y2ggKz0gcmVmRGVsdGE7CisJCQkJbGltaXQgPSBpcCArIChkaWN0RW5kIC0gbWF0Y2gpOworCisJCQkJaWYgKGxpbWl0ID4gbWF0Y2hsaW1pdCkKKwkJCQkJbGltaXQgPSBtYXRjaGxpbWl0OworCisJCQkJbWF0Y2hDb2RlID0gTFo0X2NvdW50KGlwICsgTUlOTUFUQ0gsCisJCQkJCW1hdGNoICsgTUlOTUFUQ0gsIGxpbWl0KTsKKworCQkJCWlwICs9IE1JTk1BVENIICsgbWF0Y2hDb2RlOworCisJCQkJaWYgKGlwID09IGxpbWl0KSB7CisJCQkJCXVuc2lnbmVkIGNvbnN0IGludCBtb3JlID0gTFo0X2NvdW50KGlwLAorCQkJCQkJKGNvbnN0IEJZVEUgKilzb3VyY2UsCisJCQkJCQltYXRjaGxpbWl0KTsKKworCQkJCQltYXRjaENvZGUgKz0gbW9yZTsKKwkJCQkJaXAgKz0gbW9yZTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1hdGNoQ29kZSA9IExaNF9jb3VudChpcCArIE1JTk1BVENILAorCQkJCQltYXRjaCArIE1JTk1BVENILCBtYXRjaGxpbWl0KTsKKwkJCQlpcCArPSBNSU5NQVRDSCArIG1hdGNoQ29kZTsKKwkJCX0KKworCQkJaWYgKG91dHB1dExpbWl0ZWQgJiYKKwkJCQkvKiBDaGVjayBvdXRwdXQgYnVmZmVyIG92ZXJmbG93ICovCisJCQkJKHVubGlrZWx5KG9wICsKKwkJCQkJKDEgKyBMQVNUTElURVJBTFMpICsKKwkJCQkJKG1hdGNoQ29kZSA+PiA4KSA+IG9saW1pdCkpKQorCQkJCXJldHVybiAwOworCisJCQlpZiAobWF0Y2hDb2RlID49IE1MX01BU0spIHsKKwkJCQkqdG9rZW4gKz0gTUxfTUFTSzsKKwkJCQltYXRjaENvZGUgLT0gTUxfTUFTSzsKKwkJCQlMWjRfd3JpdGUzMihvcCwgMHhGRkZGRkZGRik7CisKKwkJCQl3aGlsZSAobWF0Y2hDb2RlID49IDQgKiAyNTUpIHsKKwkJCQkJb3AgKz0gNDsKKwkJCQkJTFo0X3dyaXRlMzIob3AsIDB4RkZGRkZGRkYpOworCQkJCQltYXRjaENvZGUgLT0gNCAqIDI1NTsKKwkJCQl9CisKKwkJCQlvcCArPSBtYXRjaENvZGUgLyAyNTU7CisJCQkJKm9wKysgPSAoQllURSkobWF0Y2hDb2RlICUgMjU1KTsKKwkJCX0gZWxzZQorCQkJCSp0b2tlbiArPSAoQllURSkobWF0Y2hDb2RlKTsKKwkJfQorCisJCWFuY2hvciA9IGlwOworCisJCS8qIFRlc3QgZW5kIG9mIGNodW5rICovCisJCWlmIChpcCA+IG1mbGltaXQpCisJCQlicmVhazsKKworCQkvKiBGaWxsIHRhYmxlICovCisJCUxaNF9wdXRQb3NpdGlvbihpcCAtIDIsIGRpY3RQdHItPmhhc2hUYWJsZSwgdGFibGVUeXBlLCBiYXNlKTsKKworCQkvKiBUZXN0IG5leHQgcG9zaXRpb24gKi8KKwkJbWF0Y2ggPSBMWjRfZ2V0UG9zaXRpb24oaXAsIGRpY3RQdHItPmhhc2hUYWJsZSwKKwkJCXRhYmxlVHlwZSwgYmFzZSk7CisKKwkJaWYgKGRpY3QgPT0gdXNpbmdFeHREaWN0KSB7CisJCQlpZiAobWF0Y2ggPCAoY29uc3QgQllURSAqKXNvdXJjZSkgeworCQkJCXJlZkRlbHRhID0gZGljdERlbHRhOworCQkJCWxvd0xpbWl0ID0gZGljdGlvbmFyeTsKKwkJCX0gZWxzZSB7CisJCQkJcmVmRGVsdGEgPSAwOworCQkJCWxvd0xpbWl0ID0gKGNvbnN0IEJZVEUgKilzb3VyY2U7CisJCQl9CisJCX0KKworCQlMWjRfcHV0UG9zaXRpb24oaXAsIGRpY3RQdHItPmhhc2hUYWJsZSwgdGFibGVUeXBlLCBiYXNlKTsKKworCQlpZiAoKChkaWN0SXNzdWUgPT0gZGljdFNtYWxsKSA/IChtYXRjaCA+PSBsb3dSZWZMaW1pdCkgOiAxKQorCQkJJiYgKG1hdGNoICsgTUFYX0RJU1RBTkNFID49IGlwKQorCQkJJiYgKExaNF9yZWFkMzIobWF0Y2ggKyByZWZEZWx0YSkgPT0gTFo0X3JlYWQzMihpcCkpKSB7CisJCQl0b2tlbiA9IG9wKys7CisJCQkqdG9rZW4gPSAwOworCQkJZ290byBfbmV4dF9tYXRjaDsKKwkJfQorCisJCS8qIFByZXBhcmUgbmV4dCBsb29wICovCisJCWZvcndhcmRIID0gTFo0X2hhc2hQb3NpdGlvbigrK2lwLCB0YWJsZVR5cGUpOworCX0KKworX2xhc3RfbGl0ZXJhbHM6CisJLyogRW5jb2RlIExhc3QgTGl0ZXJhbHMgKi8KKwl7CisJCXNpemVfdCBjb25zdCBsYXN0UnVuID0gKHNpemVfdCkoaWVuZCAtIGFuY2hvcik7CisKKwkJaWYgKChvdXRwdXRMaW1pdGVkKSAmJgorCQkJLyogQ2hlY2sgb3V0cHV0IGJ1ZmZlciBvdmVyZmxvdyAqLworCQkJKChvcCAtIChCWVRFICopZGVzdCkgKyBsYXN0UnVuICsgMSArCisJCQkoKGxhc3RSdW4gKyAyNTUgLSBSVU5fTUFTSykgLyAyNTUpID4gKFUzMiltYXhPdXRwdXRTaXplKSkKKwkJCXJldHVybiAwOworCisJCWlmIChsYXN0UnVuID49IFJVTl9NQVNLKSB7CisJCQlzaXplX3QgYWNjdW11bGF0b3IgPSBsYXN0UnVuIC0gUlVOX01BU0s7CisJCQkqb3ArKyA9IFJVTl9NQVNLIDw8IE1MX0JJVFM7CisJCQlmb3IgKDsgYWNjdW11bGF0b3IgPj0gMjU1OyBhY2N1bXVsYXRvciAtPSAyNTUpCisJCQkJKm9wKysgPSAyNTU7CisJCQkqb3ArKyA9IChCWVRFKSBhY2N1bXVsYXRvcjsKKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKEJZVEUpKGxhc3RSdW4gPDwgTUxfQklUUyk7CisJCX0KKworCQltZW1jcHkob3AsIGFuY2hvciwgbGFzdFJ1bik7CisKKwkJb3AgKz0gbGFzdFJ1bjsKKwl9CisKKwkvKiBFbmQgKi8KKwlyZXR1cm4gKGludCkgKCgoY2hhciAqKW9wKSAtIGRlc3QpOworfQorCitzdGF0aWMgaW50IExaNF9jb21wcmVzc19mYXN0X2V4dFN0YXRlKAorCXZvaWQgKnN0YXRlLAorCWNvbnN0IGNoYXIgKnNvdXJjZSwKKwljaGFyICpkZXN0LAorCWludCBpbnB1dFNpemUsCisJaW50IG1heE91dHB1dFNpemUsCisJaW50IGFjY2VsZXJhdGlvbikKK3sKKwlMWjRfc3RyZWFtX3RfaW50ZXJuYWwgKmN0eCA9ICYoKExaNF9zdHJlYW1fdCAqKXN0YXRlKS0+aW50ZXJuYWxfZG9ub3R1c2U7CisjaWYgTFo0X0FSQ0g2NAorCWNvbnN0IHRhYmxlVHlwZV90IHRhYmxlVHlwZSA9IGJ5VTMyOworI2Vsc2UKKwljb25zdCB0YWJsZVR5cGVfdCB0YWJsZVR5cGUgPSBieVB0cjsKKyNlbmRpZgorCisJTFo0X3Jlc2V0U3RyZWFtKChMWjRfc3RyZWFtX3QgKilzdGF0ZSk7CisKKwlpZiAoYWNjZWxlcmF0aW9uIDwgMSkKKwkJYWNjZWxlcmF0aW9uID0gTFo0X0FDQ0VMRVJBVElPTl9ERUZBVUxUOworCisJaWYgKG1heE91dHB1dFNpemUgPj0gTFo0X0NPTVBSRVNTQk9VTkQoaW5wdXRTaXplKSkgeworCQlpZiAoaW5wdXRTaXplIDwgTFo0XzY0S2xpbWl0KQorCQkJcmV0dXJuIExaNF9jb21wcmVzc19nZW5lcmljKGN0eCwgc291cmNlLAorCQkJCWRlc3QsIGlucHV0U2l6ZSwgMCwKKwkJCQlub0xpbWl0LCBieVUxNiwgbm9EaWN0LAorCQkJCW5vRGljdElzc3VlLCBhY2NlbGVyYXRpb24pOworCQllbHNlCisJCQlyZXR1cm4gTFo0X2NvbXByZXNzX2dlbmVyaWMoY3R4LCBzb3VyY2UsCisJCQkJZGVzdCwgaW5wdXRTaXplLCAwLAorCQkJCW5vTGltaXQsIHRhYmxlVHlwZSwgbm9EaWN0LAorCQkJCW5vRGljdElzc3VlLCBhY2NlbGVyYXRpb24pOworCX0gZWxzZSB7CisJCWlmIChpbnB1dFNpemUgPCBMWjRfNjRLbGltaXQpCisJCQlyZXR1cm4gTFo0X2NvbXByZXNzX2dlbmVyaWMoY3R4LCBzb3VyY2UsCisJCQkJZGVzdCwgaW5wdXRTaXplLAorCQkJCW1heE91dHB1dFNpemUsIGxpbWl0ZWRPdXRwdXQsIGJ5VTE2LCBub0RpY3QsCisJCQkJbm9EaWN0SXNzdWUsIGFjY2VsZXJhdGlvbik7CisJCWVsc2UKKwkJCXJldHVybiBMWjRfY29tcHJlc3NfZ2VuZXJpYyhjdHgsIHNvdXJjZSwKKwkJCQlkZXN0LCBpbnB1dFNpemUsCisJCQkJbWF4T3V0cHV0U2l6ZSwgbGltaXRlZE91dHB1dCwgdGFibGVUeXBlLCBub0RpY3QsCisJCQkJbm9EaWN0SXNzdWUsIGFjY2VsZXJhdGlvbik7CisJfQorfQorCitpbnQgTFo0X2NvbXByZXNzX2Zhc3QoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICpkZXN0LCBpbnQgaW5wdXRTaXplLAorCWludCBtYXhPdXRwdXRTaXplLCBpbnQgYWNjZWxlcmF0aW9uLCB2b2lkICp3cmttZW0pCit7CisJcmV0dXJuIExaNF9jb21wcmVzc19mYXN0X2V4dFN0YXRlKHdya21lbSwgc291cmNlLCBkZXN0LCBpbnB1dFNpemUsCisJCW1heE91dHB1dFNpemUsIGFjY2VsZXJhdGlvbik7Cit9CitFWFBPUlRfU1lNQk9MKExaNF9jb21wcmVzc19mYXN0KTsKKworaW50IExaNF9jb21wcmVzc19kZWZhdWx0KGNvbnN0IGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCwgaW50IGlucHV0U2l6ZSwKKwlpbnQgbWF4T3V0cHV0U2l6ZSwgdm9pZCAqd3JrbWVtKQoreworCXJldHVybiBMWjRfY29tcHJlc3NfZmFzdChzb3VyY2UsIGRlc3QsIGlucHV0U2l6ZSwKKwkJbWF4T3V0cHV0U2l6ZSwgTFo0X0FDQ0VMRVJBVElPTl9ERUZBVUxULCB3cmttZW0pOworfQorRVhQT1JUX1NZTUJPTChMWjRfY29tcHJlc3NfZGVmYXVsdCk7CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJKl9kZXN0U2l6ZSgpIHZhcmlhbnQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgTFo0X2NvbXByZXNzX2Rlc3RTaXplX2dlbmVyaWMoCisJTFo0X3N0cmVhbV90X2ludGVybmFsICogY29uc3QgY3R4LAorCWNvbnN0IGNoYXIgKiBjb25zdCBzcmMsCisJY2hhciAqIGNvbnN0IGRzdCwKKwlpbnQgKiBjb25zdCBzcmNTaXplUHRyLAorCWNvbnN0IGludCB0YXJnZXREc3RTaXplLAorCWNvbnN0IHRhYmxlVHlwZV90IHRhYmxlVHlwZSkKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopIHNyYzsKKwljb25zdCBCWVRFICpiYXNlID0gKGNvbnN0IEJZVEUgKikgc3JjOworCWNvbnN0IEJZVEUgKmxvd0xpbWl0ID0gKGNvbnN0IEJZVEUgKikgc3JjOworCWNvbnN0IEJZVEUgKmFuY2hvciA9IGlwOworCWNvbnN0IEJZVEUgKiBjb25zdCBpZW5kID0gaXAgKyAqc3JjU2l6ZVB0cjsKKwljb25zdCBCWVRFICogY29uc3QgbWZsaW1pdCA9IGllbmQgLSBNRkxJTUlUOworCWNvbnN0IEJZVEUgKiBjb25zdCBtYXRjaGxpbWl0ID0gaWVuZCAtIExBU1RMSVRFUkFMUzsKKworCUJZVEUgKm9wID0gKEJZVEUgKikgZHN0OworCUJZVEUgKiBjb25zdCBvZW5kID0gb3AgKyB0YXJnZXREc3RTaXplOworCUJZVEUgKiBjb25zdCBvTWF4TGl0ID0gb3AgKyB0YXJnZXREc3RTaXplIC0gMiAvKiBvZmZzZXQgKi8KKwkJLSA4IC8qIGJlY2F1c2UgOCArIE1JTk1BVENIID09IE1GTElNSVQgKi8gLSAxIC8qIHRva2VuICovOworCUJZVEUgKiBjb25zdCBvTWF4TWF0Y2ggPSBvcCArIHRhcmdldERzdFNpemUKKwkJLSAoTEFTVExJVEVSQUxTICsgMSAvKiB0b2tlbiAqLyk7CisJQllURSAqIGNvbnN0IG9NYXhTZXEgPSBvTWF4TGl0IC0gMSAvKiB0b2tlbiAqLzsKKworCVUzMiBmb3J3YXJkSDsKKworCS8qIEluaXQgY29uZGl0aW9ucyAqLworCS8qIEltcG9zc2libGUgdG8gc3RvcmUgYW55dGhpbmcgKi8KKwlpZiAodGFyZ2V0RHN0U2l6ZSA8IDEpCisJCXJldHVybiAwOworCS8qIFVuc3VwcG9ydGVkIGlucHV0IHNpemUsIHRvbyBsYXJnZSAob3IgbmVnYXRpdmUpICovCisJaWYgKChVMzIpKnNyY1NpemVQdHIgPiAoVTMyKUxaNF9NQVhfSU5QVVRfU0laRSkKKwkJcmV0dXJuIDA7CisJLyogU2l6ZSB0b28gbGFyZ2UgKG5vdCB3aXRoaW4gNjRLIGxpbWl0KSAqLworCWlmICgodGFibGVUeXBlID09IGJ5VTE2KSAmJiAoKnNyY1NpemVQdHIgPj0gTFo0XzY0S2xpbWl0KSkKKwkJcmV0dXJuIDA7CisJLyogSW5wdXQgdG9vIHNtYWxsLCBubyBjb21wcmVzc2lvbiAoYWxsIGxpdGVyYWxzKSAqLworCWlmICgqc3JjU2l6ZVB0ciA8IExaNF9taW5MZW5ndGgpCisJCWdvdG8gX2xhc3RfbGl0ZXJhbHM7CisKKwkvKiBGaXJzdCBCeXRlICovCisJKnNyY1NpemVQdHIgPSAwOworCUxaNF9wdXRQb3NpdGlvbihpcCwgY3R4LT5oYXNoVGFibGUsIHRhYmxlVHlwZSwgYmFzZSk7CisJaXArKzsgZm9yd2FyZEggPSBMWjRfaGFzaFBvc2l0aW9uKGlwLCB0YWJsZVR5cGUpOworCisJLyogTWFpbiBMb29wICovCisJZm9yICggOyA7ICkgeworCQljb25zdCBCWVRFICptYXRjaDsKKwkJQllURSAqdG9rZW47CisKKwkJLyogRmluZCBhIG1hdGNoICovCisJCXsKKwkJCWNvbnN0IEJZVEUgKmZvcndhcmRJcCA9IGlwOworCQkJdW5zaWduZWQgaW50IHN0ZXAgPSAxOworCQkJdW5zaWduZWQgaW50IHNlYXJjaE1hdGNoTmIgPSAxIDw8IExaNF9TS0lQVFJJR0dFUjsKKworCQkJZG8geworCQkJCVUzMiBoID0gZm9yd2FyZEg7CisKKwkJCQlpcCA9IGZvcndhcmRJcDsKKwkJCQlmb3J3YXJkSXAgKz0gc3RlcDsKKwkJCQlzdGVwID0gKHNlYXJjaE1hdGNoTmIrKyA+PiBMWjRfU0tJUFRSSUdHRVIpOworCisJCQkJaWYgKHVubGlrZWx5KGZvcndhcmRJcCA+IG1mbGltaXQpKQorCQkJCQlnb3RvIF9sYXN0X2xpdGVyYWxzOworCisJCQkJbWF0Y2ggPSBMWjRfZ2V0UG9zaXRpb25Pbkhhc2goaCwgY3R4LT5oYXNoVGFibGUsCisJCQkJCXRhYmxlVHlwZSwgYmFzZSk7CisJCQkJZm9yd2FyZEggPSBMWjRfaGFzaFBvc2l0aW9uKGZvcndhcmRJcCwKKwkJCQkJdGFibGVUeXBlKTsKKwkJCQlMWjRfcHV0UG9zaXRpb25Pbkhhc2goaXAsIGgsCisJCQkJCWN0eC0+aGFzaFRhYmxlLCB0YWJsZVR5cGUsCisJCQkJCWJhc2UpOworCisJCQl9IHdoaWxlICgoKHRhYmxlVHlwZSA9PSBieVUxNikKKwkJCQk/IDAKKwkJCQk6IChtYXRjaCArIE1BWF9ESVNUQU5DRSA8IGlwKSkKKwkJCQl8fCAoTFo0X3JlYWQzMihtYXRjaCkgIT0gTFo0X3JlYWQzMihpcCkpKTsKKwkJfQorCisJCS8qIENhdGNoIHVwICovCisJCXdoaWxlICgoaXAgPiBhbmNob3IpCisJCQkmJiAobWF0Y2ggPiBsb3dMaW1pdCkKKwkJCSYmICh1bmxpa2VseShpcFstMV0gPT0gbWF0Y2hbLTFdKSkpIHsKKwkJCWlwLS07CisJCQltYXRjaC0tOworCQl9CisKKwkJLyogRW5jb2RlIExpdGVyYWwgbGVuZ3RoICovCisJCXsKKwkJCXVuc2lnbmVkIGludCBsaXRMZW5ndGggPSAodW5zaWduZWQgaW50KShpcCAtIGFuY2hvcik7CisKKwkJCXRva2VuID0gb3ArKzsKKwkJCWlmIChvcCArICgobGl0TGVuZ3RoICsgMjQwKSAvIDI1NSkKKwkJCQkrIGxpdExlbmd0aCA+IG9NYXhMaXQpIHsKKwkJCQkvKiBOb3QgZW5vdWdoIHNwYWNlIGZvciBhIGxhc3QgbWF0Y2ggKi8KKwkJCQlvcC0tOworCQkJCWdvdG8gX2xhc3RfbGl0ZXJhbHM7CisJCQl9CisJCQlpZiAobGl0TGVuZ3RoID49IFJVTl9NQVNLKSB7CisJCQkJdW5zaWduZWQgaW50IGxlbiA9IGxpdExlbmd0aCAtIFJVTl9NQVNLOworCQkJCSp0b2tlbiA9IChSVU5fTUFTSzw8TUxfQklUUyk7CisJCQkJZm9yICg7IGxlbiA+PSAyNTU7IGxlbiAtPSAyNTUpCisJCQkJCSpvcCsrID0gMjU1OworCQkJCSpvcCsrID0gKEJZVEUpbGVuOworCQkJfSBlbHNlCisJCQkJKnRva2VuID0gKEJZVEUpKGxpdExlbmd0aCA8PCBNTF9CSVRTKTsKKworCQkJLyogQ29weSBMaXRlcmFscyAqLworCQkJTFo0X3dpbGRDb3B5KG9wLCBhbmNob3IsIG9wICsgbGl0TGVuZ3RoKTsKKwkJCW9wICs9IGxpdExlbmd0aDsKKwkJfQorCitfbmV4dF9tYXRjaDoKKwkJLyogRW5jb2RlIE9mZnNldCAqLworCQlMWjRfd3JpdGVMRTE2KG9wLCAoVTE2KShpcCAtIG1hdGNoKSk7IG9wICs9IDI7CisKKwkJLyogRW5jb2RlIE1hdGNoTGVuZ3RoICovCisJCXsKKwkJCXNpemVfdCBtYXRjaExlbmd0aCA9IExaNF9jb3VudChpcCArIE1JTk1BVENILAorCQkJbWF0Y2ggKyBNSU5NQVRDSCwgbWF0Y2hsaW1pdCk7CisKKwkJCWlmIChvcCArICgobWF0Y2hMZW5ndGggKyAyNDApLzI1NSkgPiBvTWF4TWF0Y2gpIHsKKwkJCQkvKiBNYXRjaCBkZXNjcmlwdGlvbiB0b28gbG9uZyA6IHJlZHVjZSBpdCAqLworCQkJCW1hdGNoTGVuZ3RoID0gKDE1IC0gMSkgKyAob01heE1hdGNoIC0gb3ApICogMjU1OworCQkJfQorCQkJaXAgKz0gTUlOTUFUQ0ggKyBtYXRjaExlbmd0aDsKKworCQkJaWYgKG1hdGNoTGVuZ3RoID49IE1MX01BU0spIHsKKwkJCQkqdG9rZW4gKz0gTUxfTUFTSzsKKwkJCQltYXRjaExlbmd0aCAtPSBNTF9NQVNLOworCQkJCXdoaWxlIChtYXRjaExlbmd0aCA+PSAyNTUpIHsKKwkJCQkJbWF0Y2hMZW5ndGggLT0gMjU1OworCQkJCQkqb3ArKyA9IDI1NTsKKwkJCQl9CisJCQkJKm9wKysgPSAoQllURSltYXRjaExlbmd0aDsKKwkJCX0gZWxzZQorCQkJCSp0b2tlbiArPSAoQllURSkobWF0Y2hMZW5ndGgpOworCQl9CisKKwkJYW5jaG9yID0gaXA7CisKKwkJLyogVGVzdCBlbmQgb2YgYmxvY2sgKi8KKwkJaWYgKGlwID4gbWZsaW1pdCkKKwkJCWJyZWFrOworCQlpZiAob3AgPiBvTWF4U2VxKQorCQkJYnJlYWs7CisKKwkJLyogRmlsbCB0YWJsZSAqLworCQlMWjRfcHV0UG9zaXRpb24oaXAgLSAyLCBjdHgtPmhhc2hUYWJsZSwgdGFibGVUeXBlLCBiYXNlKTsKKworCQkvKiBUZXN0IG5leHQgcG9zaXRpb24gKi8KKwkJbWF0Y2ggPSBMWjRfZ2V0UG9zaXRpb24oaXAsIGN0eC0+aGFzaFRhYmxlLCB0YWJsZVR5cGUsIGJhc2UpOworCQlMWjRfcHV0UG9zaXRpb24oaXAsIGN0eC0+aGFzaFRhYmxlLCB0YWJsZVR5cGUsIGJhc2UpOworCisJCWlmICgobWF0Y2ggKyBNQVhfRElTVEFOQ0UgPj0gaXApCisJCQkmJiAoTFo0X3JlYWQzMihtYXRjaCkgPT0gTFo0X3JlYWQzMihpcCkpKSB7CisJCQl0b2tlbiA9IG9wKys7ICp0b2tlbiA9IDA7CisJCQlnb3RvIF9uZXh0X21hdGNoOworCQl9CisKKwkJLyogUHJlcGFyZSBuZXh0IGxvb3AgKi8KKwkJZm9yd2FyZEggPSBMWjRfaGFzaFBvc2l0aW9uKCsraXAsIHRhYmxlVHlwZSk7CisJfQorCitfbGFzdF9saXRlcmFsczoKKwkvKiBFbmNvZGUgTGFzdCBMaXRlcmFscyAqLworCXsKKwkJc2l6ZV90IGxhc3RSdW5TaXplID0gKHNpemVfdCkoaWVuZCAtIGFuY2hvcik7CisKKwkJaWYgKG9wICsgMSAvKiB0b2tlbiAqLworCQkJKyAoKGxhc3RSdW5TaXplICsgMjQwKSAvIDI1NSkgLyogbGl0TGVuZ3RoICovCisJCQkrIGxhc3RSdW5TaXplIC8qIGxpdGVyYWxzICovID4gb2VuZCkgeworCQkJLyogYWRhcHQgbGFzdFJ1blNpemUgdG8gZmlsbCAnZHN0JyAqLworCQkJbGFzdFJ1blNpemUJPSAob2VuZCAtIG9wKSAtIDE7CisJCQlsYXN0UnVuU2l6ZSAtPSAobGFzdFJ1blNpemUgKyAyNDApIC8gMjU1OworCQl9CisJCWlwID0gYW5jaG9yICsgbGFzdFJ1blNpemU7CisKKwkJaWYgKGxhc3RSdW5TaXplID49IFJVTl9NQVNLKSB7CisJCQlzaXplX3QgYWNjdW11bGF0b3IgPSBsYXN0UnVuU2l6ZSAtIFJVTl9NQVNLOworCisJCQkqb3ArKyA9IFJVTl9NQVNLIDw8IE1MX0JJVFM7CisJCQlmb3IgKDsgYWNjdW11bGF0b3IgPj0gMjU1OyBhY2N1bXVsYXRvciAtPSAyNTUpCisJCQkJKm9wKysgPSAyNTU7CisJCQkqb3ArKyA9IChCWVRFKSBhY2N1bXVsYXRvcjsKKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKEJZVEUpKGxhc3RSdW5TaXplPDxNTF9CSVRTKTsKKwkJfQorCQltZW1jcHkob3AsIGFuY2hvciwgbGFzdFJ1blNpemUpOworCQlvcCArPSBsYXN0UnVuU2l6ZTsKKwl9CisKKwkvKiBFbmQgKi8KKwkqc3JjU2l6ZVB0ciA9IChpbnQpICgoKGNvbnN0IGNoYXIgKilpcCkgLSBzcmMpOworCXJldHVybiAoaW50KSAoKChjaGFyICopb3ApIC0gZHN0KTsKK30KKworc3RhdGljIGludCBMWjRfY29tcHJlc3NfZGVzdFNpemVfZXh0U3RhdGUoCisJTFo0X3N0cmVhbV90ICpzdGF0ZSwKKwljb25zdCBjaGFyICpzcmMsCisJY2hhciAqZHN0LAorCWludCAqc3JjU2l6ZVB0ciwKKwlpbnQgdGFyZ2V0RHN0U2l6ZSkKK3sKKyNpZiBMWjRfQVJDSDY0CisJY29uc3QgdGFibGVUeXBlX3QgdGFibGVUeXBlID0gYnlVMzI7CisjZWxzZQorCWNvbnN0IHRhYmxlVHlwZV90IHRhYmxlVHlwZSA9IGJ5UHRyOworI2VuZGlmCisKKwlMWjRfcmVzZXRTdHJlYW0oc3RhdGUpOworCisJaWYgKHRhcmdldERzdFNpemUgPj0gTFo0X0NPTVBSRVNTQk9VTkQoKnNyY1NpemVQdHIpKSB7CisJCS8qIGNvbXByZXNzaW9uIHN1Y2Nlc3MgaXMgZ3VhcmFudGVlZCAqLworCQlyZXR1cm4gTFo0X2NvbXByZXNzX2Zhc3RfZXh0U3RhdGUoCisJCQlzdGF0ZSwgc3JjLCBkc3QsICpzcmNTaXplUHRyLAorCQkJdGFyZ2V0RHN0U2l6ZSwgMSk7CisJfSBlbHNlIHsKKwkJaWYgKCpzcmNTaXplUHRyIDwgTFo0XzY0S2xpbWl0KQorCQkJcmV0dXJuIExaNF9jb21wcmVzc19kZXN0U2l6ZV9nZW5lcmljKAorCQkJCSZzdGF0ZS0+aW50ZXJuYWxfZG9ub3R1c2UsCisJCQkJc3JjLCBkc3QsIHNyY1NpemVQdHIsCisJCQkJdGFyZ2V0RHN0U2l6ZSwgYnlVMTYpOworCQllbHNlCisJCQlyZXR1cm4gTFo0X2NvbXByZXNzX2Rlc3RTaXplX2dlbmVyaWMoCisJCQkJJnN0YXRlLT5pbnRlcm5hbF9kb25vdHVzZSwKKwkJCQlzcmMsIGRzdCwgc3JjU2l6ZVB0ciwKKwkJCQl0YXJnZXREc3RTaXplLCB0YWJsZVR5cGUpOworCX0KK30KKworCitpbnQgTFo0X2NvbXByZXNzX2Rlc3RTaXplKAorCWNvbnN0IGNoYXIgKnNyYywKKwljaGFyICpkc3QsCisJaW50ICpzcmNTaXplUHRyLAorCWludCB0YXJnZXREc3RTaXplLAorCXZvaWQgKndya21lbSkKK3sKKwlyZXR1cm4gTFo0X2NvbXByZXNzX2Rlc3RTaXplX2V4dFN0YXRlKHdya21lbSwgc3JjLCBkc3QsIHNyY1NpemVQdHIsCisJCXRhcmdldERzdFNpemUpOworfQorRVhQT1JUX1NZTUJPTChMWjRfY29tcHJlc3NfZGVzdFNpemUpOworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVN0cmVhbWluZyBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFo0X3Jlc2V0U3RyZWFtKExaNF9zdHJlYW1fdCAqTFo0X3N0cmVhbSkKK3sKKwltZW1zZXQoTFo0X3N0cmVhbSwgMCwgc2l6ZW9mKExaNF9zdHJlYW1fdCkpOworfQorCitpbnQgTFo0X2xvYWREaWN0KExaNF9zdHJlYW1fdCAqTFo0X2RpY3QsCisJY29uc3QgY2hhciAqZGljdGlvbmFyeSwgaW50IGRpY3RTaXplKQoreworCUxaNF9zdHJlYW1fdF9pbnRlcm5hbCAqZGljdCA9ICZMWjRfZGljdC0+aW50ZXJuYWxfZG9ub3R1c2U7CisJY29uc3QgQllURSAqcCA9IChjb25zdCBCWVRFICopZGljdGlvbmFyeTsKKwljb25zdCBCWVRFICogY29uc3QgZGljdEVuZCA9IHAgKyBkaWN0U2l6ZTsKKwljb25zdCBCWVRFICpiYXNlOworCisJaWYgKChkaWN0LT5pbml0Q2hlY2spCisJCXx8IChkaWN0LT5jdXJyZW50T2Zmc2V0ID4gMSAqIEdCKSkgeworCQkvKiBVbmluaXRpYWxpemVkIHN0cnVjdHVyZSwgb3IgcmV1c2Ugb3ZlcmZsb3cgKi8KKwkJTFo0X3Jlc2V0U3RyZWFtKExaNF9kaWN0KTsKKwl9CisKKwlpZiAoZGljdFNpemUgPCAoaW50KUhBU0hfVU5JVCkgeworCQlkaWN0LT5kaWN0aW9uYXJ5ID0gTlVMTDsKKwkJZGljdC0+ZGljdFNpemUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGRpY3RFbmQgLSBwKSA+IDY0ICogS0IpCisJCXAgPSBkaWN0RW5kIC0gNjQgKiBLQjsKKwlkaWN0LT5jdXJyZW50T2Zmc2V0ICs9IDY0ICogS0I7CisJYmFzZSA9IHAgLSBkaWN0LT5jdXJyZW50T2Zmc2V0OworCWRpY3QtPmRpY3Rpb25hcnkgPSBwOworCWRpY3QtPmRpY3RTaXplID0gKFUzMikoZGljdEVuZCAtIHApOworCWRpY3QtPmN1cnJlbnRPZmZzZXQgKz0gZGljdC0+ZGljdFNpemU7CisKKwl3aGlsZSAocCA8PSBkaWN0RW5kIC0gSEFTSF9VTklUKSB7CisJCUxaNF9wdXRQb3NpdGlvbihwLCBkaWN0LT5oYXNoVGFibGUsIGJ5VTMyLCBiYXNlKTsKKwkJcCArPSAzOworCX0KKworCXJldHVybiBkaWN0LT5kaWN0U2l6ZTsKK30KK0VYUE9SVF9TWU1CT0woTFo0X2xvYWREaWN0KTsKKworc3RhdGljIHZvaWQgTFo0X3Jlbm9ybURpY3RUKExaNF9zdHJlYW1fdF9pbnRlcm5hbCAqTFo0X2RpY3QsCisJY29uc3QgQllURSAqc3JjKQoreworCWlmICgoTFo0X2RpY3QtPmN1cnJlbnRPZmZzZXQgPiAweDgwMDAwMDAwKSB8fAorCQkoKHVwdHJ2YWwpTFo0X2RpY3QtPmN1cnJlbnRPZmZzZXQgPiAodXB0cnZhbClzcmMpKSB7CisJCS8qIGFkZHJlc3Mgc3BhY2Ugb3ZlcmZsb3cgKi8KKwkJLyogcmVzY2FsZSBoYXNoIHRhYmxlICovCisJCVUzMiBjb25zdCBkZWx0YSA9IExaNF9kaWN0LT5jdXJyZW50T2Zmc2V0IC0gNjQgKiBLQjsKKwkJY29uc3QgQllURSAqZGljdEVuZCA9IExaNF9kaWN0LT5kaWN0aW9uYXJ5ICsgTFo0X2RpY3QtPmRpY3RTaXplOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgTFo0X0hBU0hfU0laRV9VMzI7IGkrKykgeworCQkJaWYgKExaNF9kaWN0LT5oYXNoVGFibGVbaV0gPCBkZWx0YSkKKwkJCQlMWjRfZGljdC0+aGFzaFRhYmxlW2ldID0gMDsKKwkJCWVsc2UKKwkJCQlMWjRfZGljdC0+aGFzaFRhYmxlW2ldIC09IGRlbHRhOworCQl9CisJCUxaNF9kaWN0LT5jdXJyZW50T2Zmc2V0ID0gNjQgKiBLQjsKKwkJaWYgKExaNF9kaWN0LT5kaWN0U2l6ZSA+IDY0ICogS0IpCisJCQlMWjRfZGljdC0+ZGljdFNpemUgPSA2NCAqIEtCOworCQlMWjRfZGljdC0+ZGljdGlvbmFyeSA9IGRpY3RFbmQgLSBMWjRfZGljdC0+ZGljdFNpemU7CisJfQorfQorCitpbnQgTFo0X3NhdmVEaWN0KExaNF9zdHJlYW1fdCAqTFo0X2RpY3QsIGNoYXIgKnNhZmVCdWZmZXIsIGludCBkaWN0U2l6ZSkKK3sKKwlMWjRfc3RyZWFtX3RfaW50ZXJuYWwgKiBjb25zdCBkaWN0ID0gJkxaNF9kaWN0LT5pbnRlcm5hbF9kb25vdHVzZTsKKwljb25zdCBCWVRFICogY29uc3QgcHJldmlvdXNEaWN0RW5kID0gZGljdC0+ZGljdGlvbmFyeSArIGRpY3QtPmRpY3RTaXplOworCisJaWYgKChVMzIpZGljdFNpemUgPiA2NCAqIEtCKSB7CisJCS8qIHVzZWxlc3MgdG8gZGVmaW5lIGEgZGljdGlvbmFyeSA+IDY0ICogS0IgKi8KKwkJZGljdFNpemUgPSA2NCAqIEtCOworCX0KKwlpZiAoKFUzMilkaWN0U2l6ZSA+IGRpY3QtPmRpY3RTaXplKQorCQlkaWN0U2l6ZSA9IGRpY3QtPmRpY3RTaXplOworCisJbWVtbW92ZShzYWZlQnVmZmVyLCBwcmV2aW91c0RpY3RFbmQgLSBkaWN0U2l6ZSwgZGljdFNpemUpOworCisJZGljdC0+ZGljdGlvbmFyeSA9IChjb25zdCBCWVRFICopc2FmZUJ1ZmZlcjsKKwlkaWN0LT5kaWN0U2l6ZSA9IChVMzIpZGljdFNpemU7CisKKwlyZXR1cm4gZGljdFNpemU7Cit9CitFWFBPUlRfU1lNQk9MKExaNF9zYXZlRGljdCk7CisKK2ludCBMWjRfY29tcHJlc3NfZmFzdF9jb250aW51ZShMWjRfc3RyZWFtX3QgKkxaNF9zdHJlYW0sIGNvbnN0IGNoYXIgKnNvdXJjZSwKKwljaGFyICpkZXN0LCBpbnQgaW5wdXRTaXplLCBpbnQgbWF4T3V0cHV0U2l6ZSwgaW50IGFjY2VsZXJhdGlvbikKK3sKKwlMWjRfc3RyZWFtX3RfaW50ZXJuYWwgKnN0cmVhbVB0ciA9ICZMWjRfc3RyZWFtLT5pbnRlcm5hbF9kb25vdHVzZTsKKwljb25zdCBCWVRFICogY29uc3QgZGljdEVuZCA9IHN0cmVhbVB0ci0+ZGljdGlvbmFyeQorCQkrIHN0cmVhbVB0ci0+ZGljdFNpemU7CisKKwljb25zdCBCWVRFICpzbWFsbGVzdCA9IChjb25zdCBCWVRFICopIHNvdXJjZTsKKworCWlmIChzdHJlYW1QdHItPmluaXRDaGVjaykgeworCQkvKiBVbmluaXRpYWxpemVkIHN0cnVjdHVyZSBkZXRlY3RlZCAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKHN0cmVhbVB0ci0+ZGljdFNpemUgPiAwKSAmJiAoc21hbGxlc3QgPiBkaWN0RW5kKSkKKwkJc21hbGxlc3QgPSBkaWN0RW5kOworCisJTFo0X3Jlbm9ybURpY3RUKHN0cmVhbVB0ciwgc21hbGxlc3QpOworCisJaWYgKGFjY2VsZXJhdGlvbiA8IDEpCisJCWFjY2VsZXJhdGlvbiA9IExaNF9BQ0NFTEVSQVRJT05fREVGQVVMVDsKKworCS8qIENoZWNrIG92ZXJsYXBwaW5nIGlucHV0L2RpY3Rpb25hcnkgc3BhY2UgKi8KKwl7CisJCWNvbnN0IEJZVEUgKnNvdXJjZUVuZCA9IChjb25zdCBCWVRFICopIHNvdXJjZSArIGlucHV0U2l6ZTsKKworCQlpZiAoKHNvdXJjZUVuZCA+IHN0cmVhbVB0ci0+ZGljdGlvbmFyeSkKKwkJCSYmIChzb3VyY2VFbmQgPCBkaWN0RW5kKSkgeworCQkJc3RyZWFtUHRyLT5kaWN0U2l6ZSA9IChVMzIpKGRpY3RFbmQgLSBzb3VyY2VFbmQpOworCQkJaWYgKHN0cmVhbVB0ci0+ZGljdFNpemUgPiA2NCAqIEtCKQorCQkJCXN0cmVhbVB0ci0+ZGljdFNpemUgPSA2NCAqIEtCOworCQkJaWYgKHN0cmVhbVB0ci0+ZGljdFNpemUgPCA0KQorCQkJCXN0cmVhbVB0ci0+ZGljdFNpemUgPSAwOworCQkJc3RyZWFtUHRyLT5kaWN0aW9uYXJ5ID0gZGljdEVuZCAtIHN0cmVhbVB0ci0+ZGljdFNpemU7CisJCX0KKwl9CisKKwkvKiBwcmVmaXggbW9kZSA6IHNvdXJjZSBkYXRhIGZvbGxvd3MgZGljdGlvbmFyeSAqLworCWlmIChkaWN0RW5kID09IChjb25zdCBCWVRFICopc291cmNlKSB7CisJCWludCByZXN1bHQ7CisKKwkJaWYgKChzdHJlYW1QdHItPmRpY3RTaXplIDwgNjQgKiBLQikgJiYKKwkJCShzdHJlYW1QdHItPmRpY3RTaXplIDwgc3RyZWFtUHRyLT5jdXJyZW50T2Zmc2V0KSkgeworCQkJcmVzdWx0ID0gTFo0X2NvbXByZXNzX2dlbmVyaWMoCisJCQkJc3RyZWFtUHRyLCBzb3VyY2UsIGRlc3QsIGlucHV0U2l6ZSwKKwkJCQltYXhPdXRwdXRTaXplLCBsaW1pdGVkT3V0cHV0LCBieVUzMiwKKwkJCQl3aXRoUHJlZml4NjRrLCBkaWN0U21hbGwsIGFjY2VsZXJhdGlvbik7CisJCX0gZWxzZSB7CisJCQlyZXN1bHQgPSBMWjRfY29tcHJlc3NfZ2VuZXJpYygKKwkJCQlzdHJlYW1QdHIsIHNvdXJjZSwgZGVzdCwgaW5wdXRTaXplLAorCQkJCW1heE91dHB1dFNpemUsIGxpbWl0ZWRPdXRwdXQsIGJ5VTMyLAorCQkJCXdpdGhQcmVmaXg2NGssIG5vRGljdElzc3VlLCBhY2NlbGVyYXRpb24pOworCQl9CisJCXN0cmVhbVB0ci0+ZGljdFNpemUgKz0gKFUzMilpbnB1dFNpemU7CisJCXN0cmVhbVB0ci0+Y3VycmVudE9mZnNldCArPSAoVTMyKWlucHV0U2l6ZTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKiBleHRlcm5hbCBkaWN0aW9uYXJ5IG1vZGUgKi8KKwl7CisJCWludCByZXN1bHQ7CisKKwkJaWYgKChzdHJlYW1QdHItPmRpY3RTaXplIDwgNjQgKiBLQikgJiYKKwkJCShzdHJlYW1QdHItPmRpY3RTaXplIDwgc3RyZWFtUHRyLT5jdXJyZW50T2Zmc2V0KSkgeworCQkJcmVzdWx0ID0gTFo0X2NvbXByZXNzX2dlbmVyaWMoCisJCQkJc3RyZWFtUHRyLCBzb3VyY2UsIGRlc3QsIGlucHV0U2l6ZSwKKwkJCQltYXhPdXRwdXRTaXplLCBsaW1pdGVkT3V0cHV0LCBieVUzMiwKKwkJCQl1c2luZ0V4dERpY3QsIGRpY3RTbWFsbCwgYWNjZWxlcmF0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXJlc3VsdCA9IExaNF9jb21wcmVzc19nZW5lcmljKAorCQkJCXN0cmVhbVB0ciwgc291cmNlLCBkZXN0LCBpbnB1dFNpemUsCisJCQkJbWF4T3V0cHV0U2l6ZSwgbGltaXRlZE91dHB1dCwgYnlVMzIsCisJCQkJdXNpbmdFeHREaWN0LCBub0RpY3RJc3N1ZSwgYWNjZWxlcmF0aW9uKTsKKwkJfQorCQlzdHJlYW1QdHItPmRpY3Rpb25hcnkgPSAoY29uc3QgQllURSAqKXNvdXJjZTsKKwkJc3RyZWFtUHRyLT5kaWN0U2l6ZSA9IChVMzIpaW5wdXRTaXplOworCQlzdHJlYW1QdHItPmN1cnJlbnRPZmZzZXQgKz0gKFUzMilpbnB1dFNpemU7CisJCXJldHVybiByZXN1bHQ7CisJfQorfQorRVhQT1JUX1NZTUJPTChMWjRfY29tcHJlc3NfZmFzdF9jb250aW51ZSk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFo0IGNvbXByZXNzb3IiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9sejRfZGVjb21wcmVzcy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbHo0L2x6NF9kZWNvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQxNzM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9sejRfZGVjb21wcmVzcy5jCkBAIC0wLDAgKzEsNTA4IEBACisvKgorICogTFo0IC0gRmFzdCBMWiBjb21wcmVzc2lvbiBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMjAxMSAtIDIwMTYsIFlhbm4gQ29sbGV0LgorICogQlNEIDIgLSBDbGF1c2UgTGljZW5zZSAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QgLSBsaWNlbnNlLnBocCkKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoJKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICoJICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgkqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKgktIExaNCBob21lcGFnZSA6IGh0dHA6Ly93d3cubHo0Lm9yZworICoJLSBMWjQgc291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dpdGh1Yi5jb20vbHo0L2x6NAorICoKKyAqCUNoYW5nZWQgZm9yIGtlcm5lbCB1c2FnZSBieToKKyAqCVN2ZW4gU2NobWlkdCA8NHNzY2htaWRAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT4KKyAqLworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCURlcGVuZGVuY2llcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2x6NC5oPgorI2luY2x1ZGUgImx6NGRlZnMuaCIKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJRGVjb21wcmVzc2lvbiBmdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTFo0X2RlY29tcHJlc3NfZ2VuZXJpYygpIDoKKyAqIFRoaXMgZ2VuZXJpYyBkZWNvbXByZXNzaW9uIGZ1bmN0aW9uIGNvdmVyIGFsbCB1c2UgY2FzZXMuCisgKiBJdCBzaGFsbCBiZSBpbnN0YW50aWF0ZWQgc2V2ZXJhbCB0aW1lcywgdXNpbmcgZGlmZmVyZW50IHNldHMgb2YgZGlyZWN0aXZlcworICogTm90ZSB0aGF0IGl0IGlzIGltcG9ydGFudCB0aGlzIGdlbmVyaWMgZnVuY3Rpb24gaXMgcmVhbGx5IGlubGluZWQsCisgKiBpbiBvcmRlciB0byByZW1vdmUgdXNlbGVzcyBicmFuY2hlcyBkdXJpbmcgY29tcGlsYXRpb24gb3B0aW1pemF0aW9uLgorICovCitzdGF0aWMgRk9SQ0VfSU5MSU5FIGludCBMWjRfZGVjb21wcmVzc19nZW5lcmljKAorCSBjb25zdCBjaGFyICogY29uc3Qgc291cmNlLAorCSBjaGFyICogY29uc3QgZGVzdCwKKwkgaW50IGlucHV0U2l6ZSwKKwkJLyoKKwkJICogSWYgZW5kT25JbnB1dCA9PSBlbmRPbklucHV0U2l6ZSwKKwkJICogdGhpcyB2YWx1ZSBpcyB0aGUgbWF4IHNpemUgb2YgT3V0cHV0IEJ1ZmZlci4KKwkJICovCisJIGludCBvdXRwdXRTaXplLAorCSAvKiBlbmRPbk91dHB1dFNpemUsIGVuZE9uSW5wdXRTaXplICovCisJIGludCBlbmRPbklucHV0LAorCSAvKiBmdWxsLCBwYXJ0aWFsICovCisJIGludCBwYXJ0aWFsRGVjb2RpbmcsCisJIC8qIG9ubHkgdXNlZCBpZiBwYXJ0aWFsRGVjb2RpbmcgPT0gcGFydGlhbCAqLworCSBpbnQgdGFyZ2V0T3V0cHV0U2l6ZSwKKwkgLyogbm9EaWN0LCB3aXRoUHJlZml4NjRrLCB1c2luZ0V4dERpY3QgKi8KKwkgaW50IGRpY3QsCisJIC8qID09IGRlc3Qgd2hlbiBubyBwcmVmaXggKi8KKwkgY29uc3QgQllURSAqIGNvbnN0IGxvd1ByZWZpeCwKKwkgLyogb25seSBpZiBkaWN0ID09IHVzaW5nRXh0RGljdCAqLworCSBjb25zdCBCWVRFICogY29uc3QgZGljdFN0YXJ0LAorCSAvKiBub3RlIDogPSAwIGlmIG5vRGljdCAqLworCSBjb25zdCBzaXplX3QgZGljdFNpemUKKwkgKQoreworCS8qIExvY2FsIFZhcmlhYmxlcyAqLworCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKikgc291cmNlOworCWNvbnN0IEJZVEUgKiBjb25zdCBpZW5kID0gaXAgKyBpbnB1dFNpemU7CisKKwlCWVRFICpvcCA9IChCWVRFICopIGRlc3Q7CisJQllURSAqIGNvbnN0IG9lbmQgPSBvcCArIG91dHB1dFNpemU7CisJQllURSAqY3B5OworCUJZVEUgKm9leGl0ID0gb3AgKyB0YXJnZXRPdXRwdXRTaXplOworCWNvbnN0IEJZVEUgKiBjb25zdCBsb3dMaW1pdCA9IGxvd1ByZWZpeCAtIGRpY3RTaXplOworCisJY29uc3QgQllURSAqIGNvbnN0IGRpY3RFbmQgPSAoY29uc3QgQllURSAqKWRpY3RTdGFydCArIGRpY3RTaXplOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZGVjMzJ0YWJsZVtdID0geyAwLCAxLCAyLCAxLCA0LCA0LCA0LCA0IH07CisJc3RhdGljIGNvbnN0IGludCBkZWM2NHRhYmxlW10gPSB7IDAsIDAsIDAsIC0xLCAwLCAxLCAyLCAzIH07CisKKwljb25zdCBpbnQgc2FmZURlY29kZSA9IChlbmRPbklucHV0ID09IGVuZE9uSW5wdXRTaXplKTsKKwljb25zdCBpbnQgY2hlY2tPZmZzZXQgPSAoKHNhZmVEZWNvZGUpICYmIChkaWN0U2l6ZSA8IChpbnQpKDY0ICogS0IpKSk7CisKKwkvKiBTcGVjaWFsIGNhc2VzICovCisJLyogdGFyZ2V0T3V0cHV0U2l6ZSB0b28gaGlnaCA9PiBkZWNvZGUgZXZlcnl0aGluZyAqLworCWlmICgocGFydGlhbERlY29kaW5nKSAmJiAob2V4aXQgPiBvZW5kIC0gTUZMSU1JVCkpCisJCW9leGl0ID0gb2VuZCAtIE1GTElNSVQ7CisKKwkvKiBFbXB0eSBvdXRwdXQgYnVmZmVyICovCisJaWYgKChlbmRPbklucHV0KSAmJiAodW5saWtlbHkob3V0cHV0U2l6ZSA9PSAwKSkpCisJCXJldHVybiAoKGlucHV0U2l6ZSA9PSAxKSAmJiAoKmlwID09IDApKSA/IDAgOiAtMTsKKworCWlmICgoIWVuZE9uSW5wdXQpICYmICh1bmxpa2VseShvdXRwdXRTaXplID09IDApKSkKKwkJcmV0dXJuICgqaXAgPT0gMCA/IDEgOiAtMSk7CisKKwkvKiBNYWluIExvb3AgOiBkZWNvZGUgc2VxdWVuY2VzICovCisJd2hpbGUgKDEpIHsKKwkJc2l6ZV90IGxlbmd0aDsKKwkJY29uc3QgQllURSAqbWF0Y2g7CisJCXNpemVfdCBvZmZzZXQ7CisKKwkJLyogZ2V0IGxpdGVyYWwgbGVuZ3RoICovCisJCXVuc2lnbmVkIGludCBjb25zdCB0b2tlbiA9ICppcCsrOworCisJCWxlbmd0aCA9IHRva2VuPj5NTF9CSVRTOworCisJCWlmIChsZW5ndGggPT0gUlVOX01BU0spIHsKKwkJCXVuc2lnbmVkIGludCBzOworCisJCQlkbyB7CisJCQkJcyA9ICppcCsrOworCQkJCWxlbmd0aCArPSBzOworCQkJfSB3aGlsZSAobGlrZWx5KGVuZE9uSW5wdXQKKwkJCQk/IGlwIDwgaWVuZCAtIFJVTl9NQVNLCisJCQkJOiAxKSAmIChzID09IDI1NSkpOworCisJCQlpZiAoKHNhZmVEZWNvZGUpCisJCQkJJiYgdW5saWtlbHkoCisJCQkJCShzaXplX3QpKG9wICsgbGVuZ3RoKSA8IChzaXplX3QpKG9wKSkpIHsKKwkJCQkvKiBvdmVyZmxvdyBkZXRlY3Rpb24gKi8KKwkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7CisJCQl9CisJCQlpZiAoKHNhZmVEZWNvZGUpCisJCQkJJiYgdW5saWtlbHkoCisJCQkJCShzaXplX3QpKGlwICsgbGVuZ3RoKSA8IChzaXplX3QpKGlwKSkpIHsKKwkJCQkvKiBvdmVyZmxvdyBkZXRlY3Rpb24gKi8KKwkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7CisJCQl9CisJCX0KKworCQkvKiBjb3B5IGxpdGVyYWxzICovCisJCWNweSA9IG9wICsgbGVuZ3RoOworCQlpZiAoKChlbmRPbklucHV0KSAmJiAoKGNweSA+IChwYXJ0aWFsRGVjb2RpbmcgPyBvZXhpdCA6IG9lbmQgLSBNRkxJTUlUKSkKKwkJCXx8IChpcCArIGxlbmd0aCA+IGllbmQgLSAoMiArIDEgKyBMQVNUTElURVJBTFMpKSkpCisJCQl8fCAoKCFlbmRPbklucHV0KSAmJiAoY3B5ID4gb2VuZCAtIFdJTERDT1BZTEVOR1RIKSkpIHsKKwkJCWlmIChwYXJ0aWFsRGVjb2RpbmcpIHsKKwkJCQlpZiAoY3B5ID4gb2VuZCkgeworCQkJCQkvKgorCQkJCQkgKiBFcnJvciA6CisJCQkJCSAqIHdyaXRlIGF0dGVtcHQgYmV5b25kIGVuZCBvZiBvdXRwdXQgYnVmZmVyCisJCQkJCSAqLworCQkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7CisJCQkJfQorCQkJCWlmICgoZW5kT25JbnB1dCkKKwkJCQkJJiYgKGlwICsgbGVuZ3RoID4gaWVuZCkpIHsKKwkJCQkJLyoKKwkJCQkJICogRXJyb3IgOgorCQkJCQkgKiByZWFkIGF0dGVtcHQgYmV5b25kCisJCQkJCSAqIGVuZCBvZiBpbnB1dCBidWZmZXIKKwkJCQkJICovCisJCQkJCWdvdG8gX291dHB1dF9lcnJvcjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmICgoIWVuZE9uSW5wdXQpCisJCQkJCSYmIChjcHkgIT0gb2VuZCkpIHsKKwkJCQkJLyoKKwkJCQkJICogRXJyb3IgOgorCQkJCQkgKiBibG9jayBkZWNvZGluZyBtdXN0CisJCQkJCSAqIHN0b3AgZXhhY3RseSB0aGVyZQorCQkJCQkgKi8KKwkJCQkJZ290byBfb3V0cHV0X2Vycm9yOworCQkJCX0KKwkJCQlpZiAoKGVuZE9uSW5wdXQpCisJCQkJCSYmICgoaXAgKyBsZW5ndGggIT0gaWVuZCkKKwkJCQkJfHwgKGNweSA+IG9lbmQpKSkgeworCQkJCQkvKgorCQkJCQkgKiBFcnJvciA6CisJCQkJCSAqIGlucHV0IG11c3QgYmUgY29uc3VtZWQKKwkJCQkJICovCisJCQkJCWdvdG8gX291dHB1dF9lcnJvcjsKKwkJCQl9CisJCQl9CisKKwkJCW1lbWNweShvcCwgaXAsIGxlbmd0aCk7CisJCQlpcCArPSBsZW5ndGg7CisJCQlvcCArPSBsZW5ndGg7CisJCQkvKiBOZWNlc3NhcmlseSBFT0YsIGR1ZSB0byBwYXJzaW5nIHJlc3RyaWN0aW9ucyAqLworCQkJYnJlYWs7CisJCX0KKworCQlMWjRfd2lsZENvcHkob3AsIGlwLCBjcHkpOworCQlpcCArPSBsZW5ndGg7CisJCW9wID0gY3B5OworCisJCS8qIGdldCBvZmZzZXQgKi8KKwkJb2Zmc2V0ID0gTFo0X3JlYWRMRTE2KGlwKTsKKwkJaXAgKz0gMjsKKwkJbWF0Y2ggPSBvcCAtIG9mZnNldDsKKworCQlpZiAoKGNoZWNrT2Zmc2V0KSAmJiAodW5saWtlbHkobWF0Y2ggPCBsb3dMaW1pdCkpKSB7CisJCQkvKiBFcnJvciA6IG9mZnNldCBvdXRzaWRlIGJ1ZmZlcnMgKi8KKwkJCWdvdG8gX291dHB1dF9lcnJvcjsKKwkJfQorCisJCS8qIGNvc3RzIH4xJTsgc2lsZW5jZSBhbiBtc2FuIHdhcm5pbmcgd2hlbiBvZmZzZXQgPT0gMCAqLworCQlMWjRfd3JpdGUzMihvcCwgKFUzMilvZmZzZXQpOworCisJCS8qIGdldCBtYXRjaGxlbmd0aCAqLworCQlsZW5ndGggPSB0b2tlbiAmIE1MX01BU0s7CisJCWlmIChsZW5ndGggPT0gTUxfTUFTSykgeworCQkJdW5zaWduZWQgaW50IHM7CisKKwkJCWRvIHsKKwkJCQlzID0gKmlwKys7CisKKwkJCQlpZiAoKGVuZE9uSW5wdXQpICYmIChpcCA+IGllbmQgLSBMQVNUTElURVJBTFMpKQorCQkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7CisKKwkJCQlsZW5ndGggKz0gczsKKwkJCX0gd2hpbGUgKHMgPT0gMjU1KTsKKworCQkJaWYgKChzYWZlRGVjb2RlKQorCQkJCSYmIHVubGlrZWx5KAorCQkJCQkoc2l6ZV90KShvcCArIGxlbmd0aCkgPCAoc2l6ZV90KW9wKSkgeworCQkJCS8qIG92ZXJmbG93IGRldGVjdGlvbiAqLworCQkJCWdvdG8gX291dHB1dF9lcnJvcjsKKwkJCX0KKwkJfQorCisJCWxlbmd0aCArPSBNSU5NQVRDSDsKKworCQkvKiBjaGVjayBleHRlcm5hbCBkaWN0aW9uYXJ5ICovCisJCWlmICgoZGljdCA9PSB1c2luZ0V4dERpY3QpICYmIChtYXRjaCA8IGxvd1ByZWZpeCkpIHsKKwkJCWlmICh1bmxpa2VseShvcCArIGxlbmd0aCA+IG9lbmQgLSBMQVNUTElURVJBTFMpKSB7CisJCQkJLyogZG9lc24ndCByZXNwZWN0IHBhcnNpbmcgcmVzdHJpY3Rpb24gKi8KKwkJCQlnb3RvIF9vdXRwdXRfZXJyb3I7CisJCQl9CisKKwkJCWlmIChsZW5ndGggPD0gKHNpemVfdCkobG93UHJlZml4IC0gbWF0Y2gpKSB7CisJCQkJLyoKKwkJCQkgKiBtYXRjaCBjYW4gYmUgY29waWVkIGFzIGEgc2luZ2xlIHNlZ21lbnQKKwkJCQkgKiBmcm9tIGV4dGVybmFsIGRpY3Rpb25hcnkKKwkJCQkgKi8KKwkJCQltZW1tb3ZlKG9wLCBkaWN0RW5kIC0gKGxvd1ByZWZpeCAtIG1hdGNoKSwKKwkJCQkJbGVuZ3RoKTsKKwkJCQlvcCArPSBsZW5ndGg7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogbWF0Y2ggZW5jb21wYXNzIGV4dGVybmFsCisJCQkJICogZGljdGlvbmFyeSBhbmQgY3VycmVudCBibG9jaworCQkJCSAqLworCQkJCXNpemVfdCBjb25zdCBjb3B5U2l6ZSA9IChzaXplX3QpKGxvd1ByZWZpeCAtIG1hdGNoKTsKKwkJCQlzaXplX3QgY29uc3QgcmVzdFNpemUgPSBsZW5ndGggLSBjb3B5U2l6ZTsKKworCQkJCW1lbWNweShvcCwgZGljdEVuZCAtIGNvcHlTaXplLCBjb3B5U2l6ZSk7CisJCQkJb3AgKz0gY29weVNpemU7CisKKwkJCQlpZiAocmVzdFNpemUgPiAoc2l6ZV90KShvcCAtIGxvd1ByZWZpeCkpIHsKKwkJCQkJLyogb3ZlcmxhcCBjb3B5ICovCisJCQkJCUJZVEUgKiBjb25zdCBlbmRPZk1hdGNoID0gb3AgKyByZXN0U2l6ZTsKKwkJCQkJY29uc3QgQllURSAqY29weUZyb20gPSBsb3dQcmVmaXg7CisKKwkJCQkJd2hpbGUgKG9wIDwgZW5kT2ZNYXRjaCkKKwkJCQkJCSpvcCsrID0gKmNvcHlGcm9tKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVtY3B5KG9wLCBsb3dQcmVmaXgsIHJlc3RTaXplKTsKKwkJCQkJb3AgKz0gcmVzdFNpemU7CisJCQkJfQorCQkJfQorCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGNvcHkgbWF0Y2ggd2l0aGluIGJsb2NrICovCisJCWNweSA9IG9wICsgbGVuZ3RoOworCisJCWlmICh1bmxpa2VseShvZmZzZXQgPCA4KSkgeworCQkJY29uc3QgaW50IGRlYzY0ID0gZGVjNjR0YWJsZVtvZmZzZXRdOworCisJCQlvcFswXSA9IG1hdGNoWzBdOworCQkJb3BbMV0gPSBtYXRjaFsxXTsKKwkJCW9wWzJdID0gbWF0Y2hbMl07CisJCQlvcFszXSA9IG1hdGNoWzNdOworCQkJbWF0Y2ggKz0gZGVjMzJ0YWJsZVtvZmZzZXRdOworCQkJbWVtY3B5KG9wICsgNCwgbWF0Y2gsIDQpOworCQkJbWF0Y2ggLT0gZGVjNjQ7CisJCX0gZWxzZSB7CisJCQlMWjRfY29weTgob3AsIG1hdGNoKTsKKwkJCW1hdGNoICs9IDg7CisJCX0KKworCQlvcCArPSA4OworCisJCWlmICh1bmxpa2VseShjcHkgPiBvZW5kIC0gMTIpKSB7CisJCQlCWVRFICogY29uc3Qgb0NvcHlMaW1pdCA9IG9lbmQgLSAoV0lMRENPUFlMRU5HVEggLSAxKTsKKworCQkJaWYgKGNweSA+IG9lbmQgLSBMQVNUTElURVJBTFMpIHsKKwkJCQkvKgorCQkJCSAqIEVycm9yIDogbGFzdCBMQVNUTElURVJBTFMgYnl0ZXMKKwkJCQkgKiBtdXN0IGJlIGxpdGVyYWxzICh1bmNvbXByZXNzZWQpCisJCQkJICovCisJCQkJZ290byBfb3V0cHV0X2Vycm9yOworCQkJfQorCisJCQlpZiAob3AgPCBvQ29weUxpbWl0KSB7CisJCQkJTFo0X3dpbGRDb3B5KG9wLCBtYXRjaCwgb0NvcHlMaW1pdCk7CisJCQkJbWF0Y2ggKz0gb0NvcHlMaW1pdCAtIG9wOworCQkJCW9wID0gb0NvcHlMaW1pdDsKKwkJCX0KKworCQkJd2hpbGUgKG9wIDwgY3B5KQorCQkJCSpvcCsrID0gKm1hdGNoKys7CisJCX0gZWxzZSB7CisJCQlMWjRfY29weTgob3AsIG1hdGNoKTsKKworCQkJaWYgKGxlbmd0aCA+IDE2KQorCQkJCUxaNF93aWxkQ29weShvcCArIDgsIG1hdGNoICsgOCwgY3B5KTsKKwkJfQorCisJCW9wID0gY3B5OyAvKiBjb3JyZWN0aW9uICovCisJfQorCisJLyogZW5kIG9mIGRlY29kaW5nICovCisJaWYgKGVuZE9uSW5wdXQpIHsKKwkJLyogTmIgb2Ygb3V0cHV0IGJ5dGVzIGRlY29kZWQgKi8KKwkJcmV0dXJuIChpbnQpICgoKGNoYXIgKilvcCkgLSBkZXN0KTsKKwl9IGVsc2UgeworCQkvKiBOYiBvZiBpbnB1dCBieXRlcyByZWFkICovCisJCXJldHVybiAoaW50KSAoKChjb25zdCBjaGFyICopaXApIC0gc291cmNlKTsKKwl9CisKKwkvKiBPdmVyZmxvdyBlcnJvciBkZXRlY3RlZCAqLworX291dHB1dF9lcnJvcjoKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBMWjRfZGVjb21wcmVzc19zYWZlKGNvbnN0IGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCwKKwlpbnQgY29tcHJlc3NlZFNpemUsIGludCBtYXhEZWNvbXByZXNzZWRTaXplKQoreworCXJldHVybiBMWjRfZGVjb21wcmVzc19nZW5lcmljKHNvdXJjZSwgZGVzdCwgY29tcHJlc3NlZFNpemUsCisJCW1heERlY29tcHJlc3NlZFNpemUsIGVuZE9uSW5wdXRTaXplLCBmdWxsLCAwLAorCQlub0RpY3QsIChCWVRFICopZGVzdCwgTlVMTCwgMCk7Cit9CisKK2ludCBMWjRfZGVjb21wcmVzc19zYWZlX3BhcnRpYWwoY29uc3QgY2hhciAqc291cmNlLCBjaGFyICpkZXN0LAorCWludCBjb21wcmVzc2VkU2l6ZSwgaW50IHRhcmdldE91dHB1dFNpemUsIGludCBtYXhEZWNvbXByZXNzZWRTaXplKQoreworCXJldHVybiBMWjRfZGVjb21wcmVzc19nZW5lcmljKHNvdXJjZSwgZGVzdCwgY29tcHJlc3NlZFNpemUsCisJCW1heERlY29tcHJlc3NlZFNpemUsIGVuZE9uSW5wdXRTaXplLCBwYXJ0aWFsLAorCQl0YXJnZXRPdXRwdXRTaXplLCBub0RpY3QsIChCWVRFICopZGVzdCwgTlVMTCwgMCk7Cit9CisKK2ludCBMWjRfZGVjb21wcmVzc19mYXN0KGNvbnN0IGNoYXIgKnNvdXJjZSwgY2hhciAqZGVzdCwgaW50IG9yaWdpbmFsU2l6ZSkKK3sKKwlyZXR1cm4gTFo0X2RlY29tcHJlc3NfZ2VuZXJpYyhzb3VyY2UsIGRlc3QsIDAsIG9yaWdpbmFsU2l6ZSwKKwkJZW5kT25PdXRwdXRTaXplLCBmdWxsLCAwLCB3aXRoUHJlZml4NjRrLAorCQkoQllURSAqKShkZXN0IC0gNjQgKiBLQiksIE5VTEwsIDY0ICogS0IpOworfQorCitpbnQgTFo0X3NldFN0cmVhbURlY29kZShMWjRfc3RyZWFtRGVjb2RlX3QgKkxaNF9zdHJlYW1EZWNvZGUsCisJY29uc3QgY2hhciAqZGljdGlvbmFyeSwgaW50IGRpY3RTaXplKQoreworCUxaNF9zdHJlYW1EZWNvZGVfdF9pbnRlcm5hbCAqbHo0c2QgPSAoTFo0X3N0cmVhbURlY29kZV90X2ludGVybmFsICopIExaNF9zdHJlYW1EZWNvZGU7CisKKwlsejRzZC0+cHJlZml4U2l6ZSA9IChzaXplX3QpIGRpY3RTaXplOworCWx6NHNkLT5wcmVmaXhFbmQgPSAoY29uc3QgQllURSAqKSBkaWN0aW9uYXJ5ICsgZGljdFNpemU7CisJbHo0c2QtPmV4dGVybmFsRGljdCA9IE5VTEw7CisJbHo0c2QtPmV4dERpY3RTaXplCT0gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqICpfY29udGludWUoKSA6CisgKiBUaGVzZSBkZWNvZGluZyBmdW5jdGlvbnMgYWxsb3cgZGVjb21wcmVzc2lvbiBvZiBtdWx0aXBsZSBibG9ja3MKKyAqIGluICJzdHJlYW1pbmciIG1vZGUuCisgKiBQcmV2aW91c2x5IGRlY29kZWQgYmxvY2tzIG11c3Qgc3RpbGwgYmUgYXZhaWxhYmxlIGF0IHRoZSBtZW1vcnkKKyAqIHBvc2l0aW9uIHdoZXJlIHRoZXkgd2VyZSBkZWNvZGVkLgorICogSWYgaXQncyBub3QgcG9zc2libGUsIHNhdmUgdGhlIHJlbGV2YW50IHBhcnQgb2YKKyAqIGRlY29kZWQgZGF0YSBpbnRvIGEgc2FmZSBidWZmZXIsCisgKiBhbmQgaW5kaWNhdGUgd2hlcmUgaXQgc3RhbmRzIHVzaW5nIExaNF9zZXRTdHJlYW1EZWNvZGUoKQorICovCitpbnQgTFo0X2RlY29tcHJlc3Nfc2FmZV9jb250aW51ZShMWjRfc3RyZWFtRGVjb2RlX3QgKkxaNF9zdHJlYW1EZWNvZGUsCisJY29uc3QgY2hhciAqc291cmNlLCBjaGFyICpkZXN0LCBpbnQgY29tcHJlc3NlZFNpemUsIGludCBtYXhPdXRwdXRTaXplKQoreworCUxaNF9zdHJlYW1EZWNvZGVfdF9pbnRlcm5hbCAqbHo0c2QgPSAmTFo0X3N0cmVhbURlY29kZS0+aW50ZXJuYWxfZG9ub3R1c2U7CisJaW50IHJlc3VsdDsKKworCWlmIChsejRzZC0+cHJlZml4RW5kID09IChCWVRFICopZGVzdCkgeworCQlyZXN1bHQgPSBMWjRfZGVjb21wcmVzc19nZW5lcmljKHNvdXJjZSwgZGVzdCwKKwkJCWNvbXByZXNzZWRTaXplLAorCQkJbWF4T3V0cHV0U2l6ZSwKKwkJCWVuZE9uSW5wdXRTaXplLCBmdWxsLCAwLAorCQkJdXNpbmdFeHREaWN0LCBsejRzZC0+cHJlZml4RW5kIC0gbHo0c2QtPnByZWZpeFNpemUsCisJCQlsejRzZC0+ZXh0ZXJuYWxEaWN0LAorCQkJbHo0c2QtPmV4dERpY3RTaXplKTsKKworCQlpZiAocmVzdWx0IDw9IDApCisJCQlyZXR1cm4gcmVzdWx0OworCisJCWx6NHNkLT5wcmVmaXhTaXplICs9IHJlc3VsdDsKKwkJbHo0c2QtPnByZWZpeEVuZAkrPSByZXN1bHQ7CisJfSBlbHNlIHsKKwkJbHo0c2QtPmV4dERpY3RTaXplID0gbHo0c2QtPnByZWZpeFNpemU7CisJCWx6NHNkLT5leHRlcm5hbERpY3QgPSBsejRzZC0+cHJlZml4RW5kIC0gbHo0c2QtPmV4dERpY3RTaXplOworCQlyZXN1bHQgPSBMWjRfZGVjb21wcmVzc19nZW5lcmljKHNvdXJjZSwgZGVzdCwKKwkJCWNvbXByZXNzZWRTaXplLCBtYXhPdXRwdXRTaXplLAorCQkJZW5kT25JbnB1dFNpemUsIGZ1bGwsIDAsCisJCQl1c2luZ0V4dERpY3QsIChCWVRFICopZGVzdCwKKwkJCWx6NHNkLT5leHRlcm5hbERpY3QsIGx6NHNkLT5leHREaWN0U2l6ZSk7CisJCWlmIChyZXN1bHQgPD0gMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWx6NHNkLT5wcmVmaXhTaXplID0gcmVzdWx0OworCQlsejRzZC0+cHJlZml4RW5kCT0gKEJZVEUgKilkZXN0ICsgcmVzdWx0OworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKK2ludCBMWjRfZGVjb21wcmVzc19mYXN0X2NvbnRpbnVlKExaNF9zdHJlYW1EZWNvZGVfdCAqTFo0X3N0cmVhbURlY29kZSwKKwljb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmRlc3QsIGludCBvcmlnaW5hbFNpemUpCit7CisJTFo0X3N0cmVhbURlY29kZV90X2ludGVybmFsICpsejRzZCA9ICZMWjRfc3RyZWFtRGVjb2RlLT5pbnRlcm5hbF9kb25vdHVzZTsKKwlpbnQgcmVzdWx0OworCisJaWYgKGx6NHNkLT5wcmVmaXhFbmQgPT0gKEJZVEUgKilkZXN0KSB7CisJCXJlc3VsdCA9IExaNF9kZWNvbXByZXNzX2dlbmVyaWMoc291cmNlLCBkZXN0LCAwLCBvcmlnaW5hbFNpemUsCisJCQllbmRPbk91dHB1dFNpemUsIGZ1bGwsIDAsCisJCQl1c2luZ0V4dERpY3QsCisJCQlsejRzZC0+cHJlZml4RW5kIC0gbHo0c2QtPnByZWZpeFNpemUsCisJCQlsejRzZC0+ZXh0ZXJuYWxEaWN0LCBsejRzZC0+ZXh0RGljdFNpemUpOworCisJCWlmIChyZXN1bHQgPD0gMCkKKwkJCXJldHVybiByZXN1bHQ7CisKKwkJbHo0c2QtPnByZWZpeFNpemUgKz0gb3JpZ2luYWxTaXplOworCQlsejRzZC0+cHJlZml4RW5kCSs9IG9yaWdpbmFsU2l6ZTsKKwl9IGVsc2UgeworCQlsejRzZC0+ZXh0RGljdFNpemUgPSBsejRzZC0+cHJlZml4U2l6ZTsKKwkJbHo0c2QtPmV4dGVybmFsRGljdCA9IGx6NHNkLT5wcmVmaXhFbmQgLSBsejRzZC0+ZXh0RGljdFNpemU7CisJCXJlc3VsdCA9IExaNF9kZWNvbXByZXNzX2dlbmVyaWMoc291cmNlLCBkZXN0LCAwLCBvcmlnaW5hbFNpemUsCisJCQllbmRPbk91dHB1dFNpemUsIGZ1bGwsIDAsCisJCQl1c2luZ0V4dERpY3QsIChCWVRFICopZGVzdCwKKwkJCWx6NHNkLT5leHRlcm5hbERpY3QsIGx6NHNkLT5leHREaWN0U2l6ZSk7CisJCWlmIChyZXN1bHQgPD0gMCkKKwkJCXJldHVybiByZXN1bHQ7CisJCWx6NHNkLT5wcmVmaXhTaXplID0gb3JpZ2luYWxTaXplOworCQlsejRzZC0+cHJlZml4RW5kCT0gKEJZVEUgKilkZXN0ICsgb3JpZ2luYWxTaXplOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qCisgKiBBZHZhbmNlZCBkZWNvZGluZyBmdW5jdGlvbnMgOgorICogKl91c2luZ0RpY3QoKSA6CisgKiBUaGVzZSBkZWNvZGluZyBmdW5jdGlvbnMgd29yayB0aGUgc2FtZSBhcyAiX2NvbnRpbnVlIiBvbmVzLAorICogdGhlIGRpY3Rpb25hcnkgbXVzdCBiZSBleHBsaWNpdGx5IHByb3ZpZGVkIHdpdGhpbiBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExaNF9kZWNvbXByZXNzX3VzaW5nRGljdF9nZW5lcmljKGNvbnN0IGNoYXIgKnNvdXJjZSwKKwljaGFyICpkZXN0LCBpbnQgY29tcHJlc3NlZFNpemUsIGludCBtYXhPdXRwdXRTaXplLCBpbnQgc2FmZSwKKwljb25zdCBjaGFyICpkaWN0U3RhcnQsIGludCBkaWN0U2l6ZSkKK3sKKwlpZiAoZGljdFNpemUgPT0gMCkKKwkJcmV0dXJuIExaNF9kZWNvbXByZXNzX2dlbmVyaWMoc291cmNlLCBkZXN0LAorCQkJY29tcHJlc3NlZFNpemUsIG1heE91dHB1dFNpemUsIHNhZmUsIGZ1bGwsIDAsCisJCQlub0RpY3QsIChCWVRFICopZGVzdCwgTlVMTCwgMCk7CisJaWYgKGRpY3RTdGFydCArIGRpY3RTaXplID09IGRlc3QpIHsKKwkJaWYgKGRpY3RTaXplID49IChpbnQpKDY0ICogS0IgLSAxKSkKKwkJCXJldHVybiBMWjRfZGVjb21wcmVzc19nZW5lcmljKHNvdXJjZSwgZGVzdCwKKwkJCQljb21wcmVzc2VkU2l6ZSwgbWF4T3V0cHV0U2l6ZSwgc2FmZSwgZnVsbCwgMCwKKwkJCQl3aXRoUHJlZml4NjRrLCAoQllURSAqKWRlc3QgLSA2NCAqIEtCLCBOVUxMLCAwKTsKKwkJcmV0dXJuIExaNF9kZWNvbXByZXNzX2dlbmVyaWMoc291cmNlLCBkZXN0LCBjb21wcmVzc2VkU2l6ZSwKKwkJCW1heE91dHB1dFNpemUsIHNhZmUsIGZ1bGwsIDAsIG5vRGljdCwKKwkJCShCWVRFICopZGVzdCAtIGRpY3RTaXplLCBOVUxMLCAwKTsKKwl9CisJcmV0dXJuIExaNF9kZWNvbXByZXNzX2dlbmVyaWMoc291cmNlLCBkZXN0LCBjb21wcmVzc2VkU2l6ZSwKKwkJbWF4T3V0cHV0U2l6ZSwgc2FmZSwgZnVsbCwgMCwgdXNpbmdFeHREaWN0LAorCQkoQllURSAqKWRlc3QsIChjb25zdCBCWVRFICopZGljdFN0YXJ0LCBkaWN0U2l6ZSk7Cit9CisKK2ludCBMWjRfZGVjb21wcmVzc19zYWZlX3VzaW5nRGljdChjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmRlc3QsCisJaW50IGNvbXByZXNzZWRTaXplLCBpbnQgbWF4T3V0cHV0U2l6ZSwKKwljb25zdCBjaGFyICpkaWN0U3RhcnQsIGludCBkaWN0U2l6ZSkKK3sKKwlyZXR1cm4gTFo0X2RlY29tcHJlc3NfdXNpbmdEaWN0X2dlbmVyaWMoc291cmNlLCBkZXN0LAorCQljb21wcmVzc2VkU2l6ZSwgbWF4T3V0cHV0U2l6ZSwgMSwgZGljdFN0YXJ0LCBkaWN0U2l6ZSk7Cit9CisKK2ludCBMWjRfZGVjb21wcmVzc19mYXN0X3VzaW5nRGljdChjb25zdCBjaGFyICpzb3VyY2UsIGNoYXIgKmRlc3QsCisJaW50IG9yaWdpbmFsU2l6ZSwgY29uc3QgY2hhciAqZGljdFN0YXJ0LCBpbnQgZGljdFNpemUpCit7CisJcmV0dXJuIExaNF9kZWNvbXByZXNzX3VzaW5nRGljdF9nZW5lcmljKHNvdXJjZSwgZGVzdCwgMCwKKwkJb3JpZ2luYWxTaXplLCAwLCBkaWN0U3RhcnQsIGRpY3RTaXplKTsKK30KKworI2lmbmRlZiBTVEFUSUMKK0VYUE9SVF9TWU1CT0woTFo0X2RlY29tcHJlc3Nfc2FmZSk7CitFWFBPUlRfU1lNQk9MKExaNF9kZWNvbXByZXNzX3NhZmVfcGFydGlhbCk7CitFWFBPUlRfU1lNQk9MKExaNF9kZWNvbXByZXNzX2Zhc3QpOworRVhQT1JUX1NZTUJPTChMWjRfc2V0U3RyZWFtRGVjb2RlKTsKK0VYUE9SVF9TWU1CT0woTFo0X2RlY29tcHJlc3Nfc2FmZV9jb250aW51ZSk7CitFWFBPUlRfU1lNQk9MKExaNF9kZWNvbXByZXNzX2Zhc3RfY29udGludWUpOworRVhQT1JUX1NZTUJPTChMWjRfZGVjb21wcmVzc19zYWZlX3VzaW5nRGljdCk7CitFWFBPUlRfU1lNQk9MKExaNF9kZWNvbXByZXNzX2Zhc3RfdXNpbmdEaWN0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJMWjQgZGVjb21wcmVzc29yIik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9sejRkZWZzLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sejQvbHo0ZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYTBiNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sejQvbHo0ZGVmcy5oCkBAIC0wLDAgKzEsMjI3IEBACisjaWZuZGVmIF9fTFo0REVGU19IX18KKyNkZWZpbmUgX19MWjRERUZTX0hfXworCisvKgorICogbHo0ZGVmcy5oIC0tIGNvbW1vbiBhbmQgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGRlZmluZXMgZm9yIHRoZSBrZXJuZWwgdXNhZ2UKKworICogTFo0IC0gRmFzdCBMWiBjb21wcmVzc2lvbiBhbGdvcml0aG0KKyAqIENvcHlyaWdodCAoQykgMjAxMS0yMDE2LCBZYW5uIENvbGxldC4KKyAqIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoJKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICoJICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgkqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKgktIExaNCBob21lcGFnZSA6IGh0dHA6Ly93d3cubHo0Lm9yZworICoJLSBMWjQgc291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dpdGh1Yi5jb20vbHo0L2x6NAorICoKKyAqCUNoYW5nZWQgZm9yIGtlcm5lbCB1c2FnZSBieToKKyAqCVN2ZW4gU2NobWlkdCA8NHNzY2htaWRAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT4KKyAqLworCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgkgLyogbWVtc2V0LCBtZW1jcHkgKi8KKworI2RlZmluZSBGT1JDRV9JTkxJTkUgX19hbHdheXNfaW5saW5lCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJQmFzaWMgVHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCit0eXBlZGVmCXVpbnQ4X3QgQllURTsKK3R5cGVkZWYgdWludDE2X3QgVTE2OwordHlwZWRlZiB1aW50MzJfdCBVMzI7Cit0eXBlZGVmCWludDMyX3QgUzMyOwordHlwZWRlZiB1aW50NjRfdCBVNjQ7Cit0eXBlZGVmIHVpbnRwdHJfdCB1cHRydmFsOworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUFyY2hpdGVjdHVyZSBzcGVjaWZpY3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKENPTkZJR182NEJJVCkKKyNkZWZpbmUgTFo0X0FSQ0g2NCAxCisjZWxzZQorI2RlZmluZSBMWjRfQVJDSDY0IDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisjZGVmaW5lIExaNF9MSVRUTEVfRU5ESUFOIDEKKyNlbHNlCisjZGVmaW5lIExaNF9MSVRUTEVfRU5ESUFOIDAKKyNlbmRpZgorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUNvbnN0YW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNSU5NQVRDSCA0CisKKyNkZWZpbmUgV0lMRENPUFlMRU5HVEggOAorI2RlZmluZSBMQVNUTElURVJBTFMgNQorI2RlZmluZSBNRkxJTUlUIChXSUxEQ09QWUxFTkdUSCArIE1JTk1BVENIKQorCisvKiBJbmNyZWFzZSB0aGlzIHZhbHVlID09PiBjb21wcmVzc2lvbiBydW4gc2xvd2VyIG9uIGluY29tcHJlc3NpYmxlIGRhdGEgKi8KKyNkZWZpbmUgTFo0X1NLSVBUUklHR0VSIDYKKworI2RlZmluZSBIQVNIX1VOSVQgc2l6ZW9mKHNpemVfdCkKKworI2RlZmluZSBLQiAoMSA8PCAxMCkKKyNkZWZpbmUgTUIgKDEgPDwgMjApCisjZGVmaW5lIEdCICgxVSA8PCAzMCkKKworI2RlZmluZSBNQVhEX0xPRyAxNgorI2RlZmluZSBNQVhfRElTVEFOQ0UgKCgxIDw8IE1BWERfTE9HKSAtIDEpCisjZGVmaW5lIFNURVBTSVpFIHNpemVvZihzaXplX3QpCisKKyNkZWZpbmUgTUxfQklUUwk0CisjZGVmaW5lIE1MX01BU0sJKCgxVSA8PCBNTF9CSVRTKSAtIDEpCisjZGVmaW5lIFJVTl9CSVRTICg4IC0gTUxfQklUUykKKyNkZWZpbmUgUlVOX01BU0sgKCgxVSA8PCBSVU5fQklUUykgLSAxKQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCVJlYWRpbmcgYW5kIHdyaXRpbmcgaW50byBtZW1vcnkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGT1JDRV9JTkxJTkUgVTE2IExaNF9yZWFkMTYoY29uc3Qgdm9pZCAqcHRyKQoreworCXJldHVybiBnZXRfdW5hbGlnbmVkKChjb25zdCBVMTYgKilwdHIpOworfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIFUzMiBMWjRfcmVhZDMyKGNvbnN0IHZvaWQgKnB0cikKK3sKKwlyZXR1cm4gZ2V0X3VuYWxpZ25lZCgoY29uc3QgVTMyICopcHRyKTsKK30KKworc3RhdGljIEZPUkNFX0lOTElORSBzaXplX3QgTFo0X3JlYWRfQVJDSChjb25zdCB2b2lkICpwdHIpCit7CisJcmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IHNpemVfdCAqKXB0cik7Cit9CisKK3N0YXRpYyBGT1JDRV9JTkxJTkUgdm9pZCBMWjRfd3JpdGUxNih2b2lkICptZW1QdHIsIFUxNiB2YWx1ZSkKK3sKKwlwdXRfdW5hbGlnbmVkKHZhbHVlLCAoVTE2ICopbWVtUHRyKTsKK30KKworc3RhdGljIEZPUkNFX0lOTElORSB2b2lkIExaNF93cml0ZTMyKHZvaWQgKm1lbVB0ciwgVTMyIHZhbHVlKQoreworCXB1dF91bmFsaWduZWQodmFsdWUsIChVMzIgKiltZW1QdHIpOworfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIFUxNiBMWjRfcmVhZExFMTYoY29uc3Qgdm9pZCAqbWVtUHRyKQoreworCXJldHVybiBnZXRfdW5hbGlnbmVkX2xlMTYobWVtUHRyKTsKK30KKworc3RhdGljIEZPUkNFX0lOTElORSB2b2lkIExaNF93cml0ZUxFMTYodm9pZCAqbWVtUHRyLCBVMTYgdmFsdWUpCit7CisJcmV0dXJuIHB1dF91bmFsaWduZWRfbGUxNih2YWx1ZSwgbWVtUHRyKTsKK30KKworc3RhdGljIEZPUkNFX0lOTElORSB2b2lkIExaNF9jb3B5OCh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYykKK3sKKyNpZiBMWjRfQVJDSDY0CisJVTY0IGEgPSBnZXRfdW5hbGlnbmVkKChjb25zdCBVNjQgKilzcmMpOworCisJcHV0X3VuYWxpZ25lZChhLCAoVTY0ICopZHN0KTsKKyNlbHNlCisJVTMyIGEgPSBnZXRfdW5hbGlnbmVkKChjb25zdCBVMzIgKilzcmMpOworCVUzMiBiID0gZ2V0X3VuYWxpZ25lZCgoY29uc3QgVTMyICopc3JjICsgMSk7CisKKwlwdXRfdW5hbGlnbmVkKGEsIChVMzIgKilkc3QpOworCXB1dF91bmFsaWduZWQoYiwgKFUzMiAqKWRzdCArIDEpOworI2VuZGlmCit9CisKKy8qCisgKiBjdXN0b21pemVkIHZhcmlhbnQgb2YgbWVtY3B5LAorICogd2hpY2ggY2FuIG92ZXJ3cml0ZSB1cCB0byA3IGJ5dGVzIGJleW9uZCBkc3RFbmQKKyAqLworc3RhdGljIEZPUkNFX0lOTElORSB2b2lkIExaNF93aWxkQ29weSh2b2lkICpkc3RQdHIsCisJY29uc3Qgdm9pZCAqc3JjUHRyLCB2b2lkICpkc3RFbmQpCit7CisJQllURSAqZCA9IChCWVRFICopZHN0UHRyOworCWNvbnN0IEJZVEUgKnMgPSAoY29uc3QgQllURSAqKXNyY1B0cjsKKwlCWVRFICpjb25zdCBlID0gKEJZVEUgKilkc3RFbmQ7CisKKwlkbyB7CisJCUxaNF9jb3B5OChkLCBzKTsKKwkJZCArPSA4OworCQlzICs9IDg7CisJfSB3aGlsZSAoZCA8IGUpOworfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIHVuc2lnbmVkIGludCBMWjRfTmJDb21tb25CeXRlcyhyZWdpc3RlciBzaXplX3QgdmFsKQoreworI2lmIExaNF9MSVRUTEVfRU5ESUFOCisJcmV0dXJuIF9fZmZzKHZhbCkgPj4gMzsKKyNlbHNlCisJcmV0dXJuIChCSVRTX1BFUl9MT05HIC0gMSAtIF9fZmxzKHZhbCkpID4+IDM7CisjZW5kaWYKK30KKworc3RhdGljIEZPUkNFX0lOTElORSB1bnNpZ25lZCBpbnQgTFo0X2NvdW50KAorCWNvbnN0IEJZVEUgKnBJbiwKKwljb25zdCBCWVRFICpwTWF0Y2gsCisJY29uc3QgQllURSAqcEluTGltaXQpCit7CisJY29uc3QgQllURSAqY29uc3QgcFN0YXJ0ID0gcEluOworCisJd2hpbGUgKGxpa2VseShwSW4gPCBwSW5MaW1pdCAtIChTVEVQU0laRSAtIDEpKSkgeworCQlzaXplX3QgY29uc3QgZGlmZiA9IExaNF9yZWFkX0FSQ0gocE1hdGNoKSBeIExaNF9yZWFkX0FSQ0gocEluKTsKKworCQlpZiAoIWRpZmYpIHsKKwkJCXBJbiArPSBTVEVQU0laRTsKKwkJCXBNYXRjaCArPSBTVEVQU0laRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcEluICs9IExaNF9OYkNvbW1vbkJ5dGVzKGRpZmYpOworCisJCXJldHVybiAodW5zaWduZWQgaW50KShwSW4gLSBwU3RhcnQpOworCX0KKworI2lmIExaNF9BUkNINjQKKwlpZiAoKHBJbiA8IChwSW5MaW1pdCAtIDMpKQorCQkmJiAoTFo0X3JlYWQzMihwTWF0Y2gpID09IExaNF9yZWFkMzIocEluKSkpIHsKKwkJcEluICs9IDQ7CisJCXBNYXRjaCArPSA0OworCX0KKyNlbmRpZgorCisJaWYgKChwSW4gPCAocEluTGltaXQgLSAxKSkKKwkJJiYgKExaNF9yZWFkMTYocE1hdGNoKSA9PSBMWjRfcmVhZDE2KHBJbikpKSB7CisJCXBJbiArPSAyOworCQlwTWF0Y2ggKz0gMjsKKwl9CisKKwlpZiAoKHBJbiA8IHBJbkxpbWl0KSAmJiAoKnBNYXRjaCA9PSAqcEluKSkKKwkJcEluKys7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkocEluIC0gcFN0YXJ0KTsKK30KKwordHlwZWRlZiBlbnVtIHsgbm9MaW1pdCA9IDAsIGxpbWl0ZWRPdXRwdXQgPSAxIH0gbGltaXRlZE91dHB1dF9kaXJlY3RpdmU7Cit0eXBlZGVmIGVudW0geyBieVB0ciwgYnlVMzIsIGJ5VTE2IH0gdGFibGVUeXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7IG5vRGljdCA9IDAsIHdpdGhQcmVmaXg2NGssIHVzaW5nRXh0RGljdCB9IGRpY3RfZGlyZWN0aXZlOwordHlwZWRlZiBlbnVtIHsgbm9EaWN0SXNzdWUgPSAwLCBkaWN0U21hbGwgfSBkaWN0SXNzdWVfZGlyZWN0aXZlOworCit0eXBlZGVmIGVudW0geyBlbmRPbk91dHB1dFNpemUgPSAwLCBlbmRPbklucHV0U2l6ZSA9IDEgfSBlbmRDb25kaXRpb25fZGlyZWN0aXZlOwordHlwZWRlZiBlbnVtIHsgZnVsbCA9IDAsIHBhcnRpYWwgPSAxIH0gZWFybHlFbmRfZGlyZWN0aXZlOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9sejRoY19jb21wcmVzcy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbHo0L2x6NGhjX2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2ZjAzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6NC9sejRoY19jb21wcmVzcy5jCkBAIC0wLDAgKzEsNzY5IEBACisvKgorICogTFo0IEhDIC0gSGlnaCBDb21wcmVzc2lvbiBNb2RlIG9mIExaNAorICogQ29weXJpZ2h0IChDKSAyMDExLTIwMTUsIFlhbm4gQ29sbGV0LgorICoKKyAqIEJTRCAyIC0gQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkIC0gbGljZW5zZS5waHApCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCSogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqCSAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoJKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICogWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICoJLSBMWjQgaG9tZXBhZ2UgOiBodHRwOi8vd3d3Lmx6NC5vcmcKKyAqCS0gTFo0IHNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL2x6NC9sejQKKyAqCisgKglDaGFuZ2VkIGZvciBrZXJuZWwgdXNhZ2UgYnk6CisgKglTdmVuIFNjaG1pZHQgPDRzc2NobWlkQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+CisgKi8KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglEZXBlbmRlbmNpZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9sejQuaD4KKyNpbmNsdWRlICJsejRkZWZzLmgiCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIG1lbXNldCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglMb2NhbCBDb25zdGFudHMgYW5kIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9QVElNQUxfTUwgKGludCkoKE1MX01BU0sgLSAxKSArIE1JTk1BVENIKQorCisjZGVmaW5lIEhBU0hfRlVOQ1RJT04oaSkJKCgoaSkgKiAyNjU0NDM1NzYxVSkgXAorCT4+ICgoTUlOTUFUQ0gqOCkgLSBMWjRIQ19IQVNIX0xPRykpCisjZGVmaW5lIERFTFRBTkVYVFUxNihwKQljaGFpblRhYmxlWyhVMTYpKHApXSAvKiBmYXN0ZXIgKi8KKworc3RhdGljIFUzMiBMWjRIQ19oYXNoUHRyKGNvbnN0IHZvaWQgKnB0cikKK3sKKwlyZXR1cm4gSEFTSF9GVU5DVElPTihMWjRfcmVhZDMyKHB0cikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCUhDIENvbXByZXNzaW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBMWjRIQ19pbml0KExaNEhDX0NDdHhfaW50ZXJuYWwgKmhjNCwgY29uc3QgQllURSAqc3RhcnQpCit7CisJbWVtc2V0KCh2b2lkICopaGM0LT5oYXNoVGFibGUsIDAsIHNpemVvZihoYzQtPmhhc2hUYWJsZSkpOworCW1lbXNldChoYzQtPmNoYWluVGFibGUsIDB4RkYsIHNpemVvZihoYzQtPmNoYWluVGFibGUpKTsKKwloYzQtPm5leHRUb1VwZGF0ZSA9IDY0ICogS0I7CisJaGM0LT5iYXNlID0gc3RhcnQgLSA2NCAqIEtCOworCWhjNC0+ZW5kID0gc3RhcnQ7CisJaGM0LT5kaWN0QmFzZSA9IHN0YXJ0IC0gNjQgKiBLQjsKKwloYzQtPmRpY3RMaW1pdCA9IDY0ICogS0I7CisJaGM0LT5sb3dMaW1pdCA9IDY0ICogS0I7Cit9CisKKy8qIFVwZGF0ZSBjaGFpbnMgdXAgdG8gaXAgKGV4Y2x1ZGVkKSAqLworc3RhdGljIEZPUkNFX0lOTElORSB2b2lkIExaNEhDX0luc2VydChMWjRIQ19DQ3R4X2ludGVybmFsICpoYzQsCisJY29uc3QgQllURSAqaXApCit7CisJVTE2ICogY29uc3QgY2hhaW5UYWJsZSA9IGhjNC0+Y2hhaW5UYWJsZTsKKwlVMzIgKiBjb25zdCBoYXNoVGFibGUJPSBoYzQtPmhhc2hUYWJsZTsKKwljb25zdCBCWVRFICogY29uc3QgYmFzZSA9IGhjNC0+YmFzZTsKKwlVMzIgY29uc3QgdGFyZ2V0ID0gKFUzMikoaXAgLSBiYXNlKTsKKwlVMzIgaWR4ID0gaGM0LT5uZXh0VG9VcGRhdGU7CisKKwl3aGlsZSAoaWR4IDwgdGFyZ2V0KSB7CisJCVUzMiBjb25zdCBoID0gTFo0SENfaGFzaFB0cihiYXNlICsgaWR4KTsKKwkJc2l6ZV90IGRlbHRhID0gaWR4IC0gaGFzaFRhYmxlW2hdOworCisJCWlmIChkZWx0YSA+IE1BWF9ESVNUQU5DRSkKKwkJCWRlbHRhID0gTUFYX0RJU1RBTkNFOworCisJCURFTFRBTkVYVFUxNihpZHgpID0gKFUxNilkZWx0YTsKKworCQloYXNoVGFibGVbaF0gPSBpZHg7CisJCWlkeCsrOworCX0KKworCWhjNC0+bmV4dFRvVXBkYXRlID0gdGFyZ2V0OworfQorCitzdGF0aWMgRk9SQ0VfSU5MSU5FIGludCBMWjRIQ19JbnNlcnRBbmRGaW5kQmVzdE1hdGNoKAorCUxaNEhDX0NDdHhfaW50ZXJuYWwgKmhjNCwgLyogSW5kZXggdGFibGUgd2lsbCBiZSB1cGRhdGVkICovCisJY29uc3QgQllURSAqaXAsCisJY29uc3QgQllURSAqIGNvbnN0IGlMaW1pdCwKKwljb25zdCBCWVRFICoqbWF0Y2hwb3MsCisJY29uc3QgaW50IG1heE5iQXR0ZW1wdHMpCit7CisJVTE2ICogY29uc3QgY2hhaW5UYWJsZSA9IGhjNC0+Y2hhaW5UYWJsZTsKKwlVMzIgKiBjb25zdCBIYXNoVGFibGUgPSBoYzQtPmhhc2hUYWJsZTsKKwljb25zdCBCWVRFICogY29uc3QgYmFzZSA9IGhjNC0+YmFzZTsKKwljb25zdCBCWVRFICogY29uc3QgZGljdEJhc2UgPSBoYzQtPmRpY3RCYXNlOworCWNvbnN0IFUzMiBkaWN0TGltaXQgPSBoYzQtPmRpY3RMaW1pdDsKKwljb25zdCBVMzIgbG93TGltaXQgPSAoaGM0LT5sb3dMaW1pdCArIDY0ICogS0IgPiAoVTMyKShpcCAtIGJhc2UpKQorCQk/IGhjNC0+bG93TGltaXQKKwkJOiAoVTMyKShpcCAtIGJhc2UpIC0gKDY0ICogS0IgLSAxKTsKKwlVMzIgbWF0Y2hJbmRleDsKKwlpbnQgbmJBdHRlbXB0cyA9IG1heE5iQXR0ZW1wdHM7CisJc2l6ZV90IG1sID0gMDsKKworCS8qIEhDNCBtYXRjaCBmaW5kZXIgKi8KKwlMWjRIQ19JbnNlcnQoaGM0LCBpcCk7CisJbWF0Y2hJbmRleCA9IEhhc2hUYWJsZVtMWjRIQ19oYXNoUHRyKGlwKV07CisKKwl3aGlsZSAoKG1hdGNoSW5kZXggPj0gbG93TGltaXQpCisJCSYmIChuYkF0dGVtcHRzKSkgeworCQluYkF0dGVtcHRzLS07CisJCWlmIChtYXRjaEluZGV4ID49IGRpY3RMaW1pdCkgeworCQkJY29uc3QgQllURSAqIGNvbnN0IG1hdGNoID0gYmFzZSArIG1hdGNoSW5kZXg7CisKKwkJCWlmICgqKG1hdGNoICsgbWwpID09ICooaXAgKyBtbCkKKwkJCQkmJiAoTFo0X3JlYWQzMihtYXRjaCkgPT0gTFo0X3JlYWQzMihpcCkpKSB7CisJCQkJc2l6ZV90IGNvbnN0IG1sdCA9IExaNF9jb3VudChpcCArIE1JTk1BVENILAorCQkJCQltYXRjaCArIE1JTk1BVENILCBpTGltaXQpICsgTUlOTUFUQ0g7CisKKwkJCQlpZiAobWx0ID4gbWwpIHsKKwkJCQkJbWwgPSBtbHQ7CisJCQkJCSptYXRjaHBvcyA9IG1hdGNoOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWNvbnN0IEJZVEUgKiBjb25zdCBtYXRjaCA9IGRpY3RCYXNlICsgbWF0Y2hJbmRleDsKKworCQkJaWYgKExaNF9yZWFkMzIobWF0Y2gpID09IExaNF9yZWFkMzIoaXApKSB7CisJCQkJc2l6ZV90IG1sdDsKKwkJCQljb25zdCBCWVRFICp2TGltaXQgPSBpcAorCQkJCQkrIChkaWN0TGltaXQgLSBtYXRjaEluZGV4KTsKKworCQkJCWlmICh2TGltaXQgPiBpTGltaXQpCisJCQkJCXZMaW1pdCA9IGlMaW1pdDsKKwkJCQltbHQgPSBMWjRfY291bnQoaXAgKyBNSU5NQVRDSCwKKwkJCQkJbWF0Y2ggKyBNSU5NQVRDSCwgdkxpbWl0KSArIE1JTk1BVENIOworCQkJCWlmICgoaXAgKyBtbHQgPT0gdkxpbWl0KQorCQkJCQkmJiAodkxpbWl0IDwgaUxpbWl0KSkKKwkJCQkJbWx0ICs9IExaNF9jb3VudChpcCArIG1sdCwKKwkJCQkJCWJhc2UgKyBkaWN0TGltaXQsCisJCQkJCQlpTGltaXQpOworCQkJCWlmIChtbHQgPiBtbCkgeworCQkJCQkvKiB2aXJ0dWFsIG1hdGNocG9zICovCisJCQkJCW1sID0gbWx0OworCQkJCQkqbWF0Y2hwb3MgPSBiYXNlICsgbWF0Y2hJbmRleDsKKwkJCQl9CisJCQl9CisJCX0KKwkJbWF0Y2hJbmRleCAtPSBERUxUQU5FWFRVMTYobWF0Y2hJbmRleCk7CisJfQorCisJcmV0dXJuIChpbnQpbWw7Cit9CisKK3N0YXRpYyBGT1JDRV9JTkxJTkUgaW50IExaNEhDX0luc2VydEFuZEdldFdpZGVyTWF0Y2goCisJTFo0SENfQ0N0eF9pbnRlcm5hbCAqaGM0LAorCWNvbnN0IEJZVEUgKiBjb25zdCBpcCwKKwljb25zdCBCWVRFICogY29uc3QgaUxvd0xpbWl0LAorCWNvbnN0IEJZVEUgKiBjb25zdCBpSGlnaExpbWl0LAorCWludCBsb25nZXN0LAorCWNvbnN0IEJZVEUgKiptYXRjaHBvcywKKwljb25zdCBCWVRFICoqc3RhcnRwb3MsCisJY29uc3QgaW50IG1heE5iQXR0ZW1wdHMpCit7CisJVTE2ICogY29uc3QgY2hhaW5UYWJsZSA9IGhjNC0+Y2hhaW5UYWJsZTsKKwlVMzIgKiBjb25zdCBIYXNoVGFibGUgPSBoYzQtPmhhc2hUYWJsZTsKKwljb25zdCBCWVRFICogY29uc3QgYmFzZSA9IGhjNC0+YmFzZTsKKwljb25zdCBVMzIgZGljdExpbWl0ID0gaGM0LT5kaWN0TGltaXQ7CisJY29uc3QgQllURSAqIGNvbnN0IGxvd1ByZWZpeFB0ciA9IGJhc2UgKyBkaWN0TGltaXQ7CisJY29uc3QgVTMyIGxvd0xpbWl0ID0gKGhjNC0+bG93TGltaXQgKyA2NCAqIEtCID4gKFUzMikoaXAgLSBiYXNlKSkKKwkJPyBoYzQtPmxvd0xpbWl0CisJCTogKFUzMikoaXAgLSBiYXNlKSAtICg2NCAqIEtCIC0gMSk7CisJY29uc3QgQllURSAqIGNvbnN0IGRpY3RCYXNlID0gaGM0LT5kaWN0QmFzZTsKKwlVMzIgbWF0Y2hJbmRleDsKKwlpbnQgbmJBdHRlbXB0cyA9IG1heE5iQXR0ZW1wdHM7CisJaW50IGRlbHRhID0gKGludCkoaXAgLSBpTG93TGltaXQpOworCisJLyogRmlyc3QgTWF0Y2ggKi8KKwlMWjRIQ19JbnNlcnQoaGM0LCBpcCk7CisJbWF0Y2hJbmRleCA9IEhhc2hUYWJsZVtMWjRIQ19oYXNoUHRyKGlwKV07CisKKwl3aGlsZSAoKG1hdGNoSW5kZXggPj0gbG93TGltaXQpCisJCSYmIChuYkF0dGVtcHRzKSkgeworCQluYkF0dGVtcHRzLS07CisJCWlmIChtYXRjaEluZGV4ID49IGRpY3RMaW1pdCkgeworCQkJY29uc3QgQllURSAqbWF0Y2hQdHIgPSBiYXNlICsgbWF0Y2hJbmRleDsKKworCQkJaWYgKCooaUxvd0xpbWl0ICsgbG9uZ2VzdCkKKwkJCQk9PSAqKG1hdGNoUHRyIC0gZGVsdGEgKyBsb25nZXN0KSkgeworCQkJCWlmIChMWjRfcmVhZDMyKG1hdGNoUHRyKSA9PSBMWjRfcmVhZDMyKGlwKSkgeworCQkJCQlpbnQgbWx0ID0gTUlOTUFUQ0ggKyBMWjRfY291bnQoCisJCQkJCQlpcCArIE1JTk1BVENILAorCQkJCQkJbWF0Y2hQdHIgKyBNSU5NQVRDSCwKKwkJCQkJCWlIaWdoTGltaXQpOworCQkJCQlpbnQgYmFjayA9IDA7CisKKwkJCQkJd2hpbGUgKChpcCArIGJhY2sgPiBpTG93TGltaXQpCisJCQkJCQkmJiAobWF0Y2hQdHIgKyBiYWNrID4gbG93UHJlZml4UHRyKQorCQkJCQkJJiYgKGlwW2JhY2sgLSAxXSA9PSBtYXRjaFB0cltiYWNrIC0gMV0pKQorCQkJCQkJYmFjay0tOworCisJCQkJCW1sdCAtPSBiYWNrOworCisJCQkJCWlmIChtbHQgPiBsb25nZXN0KSB7CisJCQkJCQlsb25nZXN0ID0gKGludCltbHQ7CisJCQkJCQkqbWF0Y2hwb3MgPSBtYXRjaFB0ciArIGJhY2s7CisJCQkJCQkqc3RhcnRwb3MgPSBpcCArIGJhY2s7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQljb25zdCBCWVRFICogY29uc3QgbWF0Y2hQdHIgPSBkaWN0QmFzZSArIG1hdGNoSW5kZXg7CisKKwkJCWlmIChMWjRfcmVhZDMyKG1hdGNoUHRyKSA9PSBMWjRfcmVhZDMyKGlwKSkgeworCQkJCXNpemVfdCBtbHQ7CisJCQkJaW50IGJhY2sgPSAwOworCQkJCWNvbnN0IEJZVEUgKnZMaW1pdCA9IGlwICsgKGRpY3RMaW1pdCAtIG1hdGNoSW5kZXgpOworCisJCQkJaWYgKHZMaW1pdCA+IGlIaWdoTGltaXQpCisJCQkJCXZMaW1pdCA9IGlIaWdoTGltaXQ7CisKKwkJCQltbHQgPSBMWjRfY291bnQoaXAgKyBNSU5NQVRDSCwKKwkJCQkJbWF0Y2hQdHIgKyBNSU5NQVRDSCwgdkxpbWl0KSArIE1JTk1BVENIOworCisJCQkJaWYgKChpcCArIG1sdCA9PSB2TGltaXQpICYmICh2TGltaXQgPCBpSGlnaExpbWl0KSkKKwkJCQkJbWx0ICs9IExaNF9jb3VudChpcCArIG1sdCwgYmFzZSArIGRpY3RMaW1pdCwKKwkJCQkJCWlIaWdoTGltaXQpOworCQkJCXdoaWxlICgoaXAgKyBiYWNrID4gaUxvd0xpbWl0KQorCQkJCQkmJiAobWF0Y2hJbmRleCArIGJhY2sgPiBsb3dMaW1pdCkKKwkJCQkJJiYgKGlwW2JhY2sgLSAxXSA9PSBtYXRjaFB0cltiYWNrIC0gMV0pKQorCQkJCQliYWNrLS07CisKKwkJCQltbHQgLT0gYmFjazsKKworCQkJCWlmICgoaW50KW1sdCA+IGxvbmdlc3QpIHsKKwkJCQkJbG9uZ2VzdCA9IChpbnQpbWx0OworCQkJCQkqbWF0Y2hwb3MgPSBiYXNlICsgbWF0Y2hJbmRleCArIGJhY2s7CisJCQkJCSpzdGFydHBvcyA9IGlwICsgYmFjazsKKwkJCQl9CisJCQl9CisJCX0KKworCQltYXRjaEluZGV4IC09IERFTFRBTkVYVFUxNihtYXRjaEluZGV4KTsKKwl9CisKKwlyZXR1cm4gbG9uZ2VzdDsKK30KKworc3RhdGljIEZPUkNFX0lOTElORSBpbnQgTFo0SENfZW5jb2RlU2VxdWVuY2UoCisJY29uc3QgQllURSAqKmlwLAorCUJZVEUgKipvcCwKKwljb25zdCBCWVRFICoqYW5jaG9yLAorCWludCBtYXRjaExlbmd0aCwKKwljb25zdCBCWVRFICogY29uc3QgbWF0Y2gsCisJbGltaXRlZE91dHB1dF9kaXJlY3RpdmUgbGltaXRlZE91dHB1dEJ1ZmZlciwKKwlCWVRFICpvZW5kKQoreworCWludCBsZW5ndGg7CisJQllURSAqdG9rZW47CisKKwkvKiBFbmNvZGUgTGl0ZXJhbCBsZW5ndGggKi8KKwlsZW5ndGggPSAoaW50KSgqaXAgLSAqYW5jaG9yKTsKKwl0b2tlbiA9ICgqb3ApKys7CisKKwlpZiAoKGxpbWl0ZWRPdXRwdXRCdWZmZXIpCisJCSYmICgoKm9wICsgKGxlbmd0aD4+OCkKKwkJCSsgbGVuZ3RoICsgKDIgKyAxICsgTEFTVExJVEVSQUxTKSkgPiBvZW5kKSkgeworCQkvKiBDaGVjayBvdXRwdXQgbGltaXQgKi8KKwkJcmV0dXJuIDE7CisJfQorCWlmIChsZW5ndGggPj0gKGludClSVU5fTUFTSykgeworCQlpbnQgbGVuOworCisJCSp0b2tlbiA9IChSVU5fTUFTSzw8TUxfQklUUyk7CisJCWxlbiA9IGxlbmd0aCAtIFJVTl9NQVNLOworCQlmb3IgKDsgbGVuID4gMjU0IDsgbGVuIC09IDI1NSkKKwkJCSooKm9wKSsrID0gMjU1OworCQkqKCpvcCkrKyA9IChCWVRFKWxlbjsKKwl9IGVsc2UKKwkJKnRva2VuID0gKEJZVEUpKGxlbmd0aDw8TUxfQklUUyk7CisKKwkvKiBDb3B5IExpdGVyYWxzICovCisJTFo0X3dpbGRDb3B5KCpvcCwgKmFuY2hvciwgKCpvcCkgKyBsZW5ndGgpOworCSpvcCArPSBsZW5ndGg7CisKKwkvKiBFbmNvZGUgT2Zmc2V0ICovCisJTFo0X3dyaXRlTEUxNigqb3AsIChVMTYpKCppcCAtIG1hdGNoKSk7CisJKm9wICs9IDI7CisKKwkvKiBFbmNvZGUgTWF0Y2hMZW5ndGggKi8KKwlsZW5ndGggPSAoaW50KShtYXRjaExlbmd0aCAtIE1JTk1BVENIKTsKKworCWlmICgobGltaXRlZE91dHB1dEJ1ZmZlcikKKwkJJiYgKCpvcCArIChsZW5ndGg+PjgpCisJCQkrICgxICsgTEFTVExJVEVSQUxTKSA+IG9lbmQpKSB7CisJCS8qIENoZWNrIG91dHB1dCBsaW1pdCAqLworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobGVuZ3RoID49IChpbnQpTUxfTUFTSykgeworCQkqdG9rZW4gKz0gTUxfTUFTSzsKKwkJbGVuZ3RoIC09IE1MX01BU0s7CisKKwkJZm9yICg7IGxlbmd0aCA+IDUwOSA7IGxlbmd0aCAtPSA1MTApIHsKKwkJCSooKm9wKSsrID0gMjU1OworCQkJKigqb3ApKysgPSAyNTU7CisJCX0KKworCQlpZiAobGVuZ3RoID4gMjU0KSB7CisJCQlsZW5ndGggLT0gMjU1OworCQkJKigqb3ApKysgPSAyNTU7CisJCX0KKworCQkqKCpvcCkrKyA9IChCWVRFKWxlbmd0aDsKKwl9IGVsc2UKKwkJKnRva2VuICs9IChCWVRFKShsZW5ndGgpOworCisJLyogUHJlcGFyZSBuZXh0IGxvb3AgKi8KKwkqaXAgKz0gbWF0Y2hMZW5ndGg7CisJKmFuY2hvciA9ICppcDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IExaNEhDX2NvbXByZXNzX2dlbmVyaWMoCisJTFo0SENfQ0N0eF9pbnRlcm5hbCAqY29uc3QgY3R4LAorCWNvbnN0IGNoYXIgKiBjb25zdCBzb3VyY2UsCisJY2hhciAqIGNvbnN0IGRlc3QsCisJaW50IGNvbnN0IGlucHV0U2l6ZSwKKwlpbnQgY29uc3QgbWF4T3V0cHV0U2l6ZSwKKwlpbnQgY29tcHJlc3Npb25MZXZlbCwKKwlsaW1pdGVkT3V0cHV0X2RpcmVjdGl2ZSBsaW1pdAorCSkKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopIHNvdXJjZTsKKwljb25zdCBCWVRFICphbmNob3IgPSBpcDsKKwljb25zdCBCWVRFICogY29uc3QgaWVuZCA9IGlwICsgaW5wdXRTaXplOworCWNvbnN0IEJZVEUgKiBjb25zdCBtZmxpbWl0ID0gaWVuZCAtIE1GTElNSVQ7CisJY29uc3QgQllURSAqIGNvbnN0IG1hdGNobGltaXQgPSAoaWVuZCAtIExBU1RMSVRFUkFMUyk7CisKKwlCWVRFICpvcCA9IChCWVRFICopIGRlc3Q7CisJQllURSAqIGNvbnN0IG9lbmQgPSBvcCArIG1heE91dHB1dFNpemU7CisKKwl1bnNpZ25lZCBpbnQgbWF4TmJBdHRlbXB0czsKKwlpbnQgbWwsIG1sMiwgbWwzLCBtbDA7CisJY29uc3QgQllURSAqcmVmID0gTlVMTDsKKwljb25zdCBCWVRFICpzdGFydDIgPSBOVUxMOworCWNvbnN0IEJZVEUgKnJlZjIgPSBOVUxMOworCWNvbnN0IEJZVEUgKnN0YXJ0MyA9IE5VTEw7CisJY29uc3QgQllURSAqcmVmMyA9IE5VTEw7CisJY29uc3QgQllURSAqc3RhcnQwOworCWNvbnN0IEJZVEUgKnJlZjA7CisKKwkvKiBpbml0ICovCisJaWYgKGNvbXByZXNzaW9uTGV2ZWwgPiBMWjRIQ19NQVhfQ0xFVkVMKQorCQljb21wcmVzc2lvbkxldmVsID0gTFo0SENfTUFYX0NMRVZFTDsKKwlpZiAoY29tcHJlc3Npb25MZXZlbCA8IDEpCisJCWNvbXByZXNzaW9uTGV2ZWwgPSBMWjRIQ19ERUZBVUxUX0NMRVZFTDsKKwltYXhOYkF0dGVtcHRzID0gMSA8PCAoY29tcHJlc3Npb25MZXZlbCAtIDEpOworCWN0eC0+ZW5kICs9IGlucHV0U2l6ZTsKKworCWlwKys7CisKKwkvKiBNYWluIExvb3AgKi8KKwl3aGlsZSAoaXAgPCBtZmxpbWl0KSB7CisJCW1sID0gTFo0SENfSW5zZXJ0QW5kRmluZEJlc3RNYXRjaChjdHgsIGlwLAorCQkJbWF0Y2hsaW1pdCwgKCZyZWYpLCBtYXhOYkF0dGVtcHRzKTsKKwkJaWYgKCFtbCkgeworCQkJaXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc2F2ZWQsIGluIGNhc2Ugd2Ugd291bGQgc2tpcCB0b28gbXVjaCAqLworCQlzdGFydDAgPSBpcDsKKwkJcmVmMCA9IHJlZjsKKwkJbWwwID0gbWw7CisKK19TZWFyY2gyOgorCQlpZiAoaXAgKyBtbCA8IG1mbGltaXQpCisJCQltbDIgPSBMWjRIQ19JbnNlcnRBbmRHZXRXaWRlck1hdGNoKGN0eCwKKwkJCQlpcCArIG1sIC0gMiwgaXAgKyAwLAorCQkJCW1hdGNobGltaXQsIG1sLCAmcmVmMiwKKwkJCQkmc3RhcnQyLCBtYXhOYkF0dGVtcHRzKTsKKwkJZWxzZQorCQkJbWwyID0gbWw7CisKKwkJaWYgKG1sMiA9PSBtbCkgeworCQkJLyogTm8gYmV0dGVyIG1hdGNoICovCisJCQlpZiAoTFo0SENfZW5jb2RlU2VxdWVuY2UoJmlwLCAmb3AsCisJCQkJJmFuY2hvciwgbWwsIHJlZiwgbGltaXQsIG9lbmQpKQorCQkJCXJldHVybiAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhcnQwIDwgaXApIHsKKwkJCWlmIChzdGFydDIgPCBpcCArIG1sMCkgeworCQkJCS8qIGVtcGlyaWNhbCAqLworCQkJCWlwID0gc3RhcnQwOworCQkJCXJlZiA9IHJlZjA7CisJCQkJbWwgPSBtbDA7CisJCQl9CisJCX0KKworCQkvKiBIZXJlLCBzdGFydDAgPT0gaXAgKi8KKwkJaWYgKChzdGFydDIgLSBpcCkgPCAzKSB7CisJCQkvKiBGaXJzdCBNYXRjaCB0b28gc21hbGwgOiByZW1vdmVkICovCisJCQltbCA9IG1sMjsKKwkJCWlwID0gc3RhcnQyOworCQkJcmVmID0gcmVmMjsKKwkJCWdvdG8gX1NlYXJjaDI7CisJCX0KKworX1NlYXJjaDM6CisJCS8qCisJCSogQ3VycmVudGx5IHdlIGhhdmUgOgorCQkqIG1sMiA+IG1sMSwgYW5kCisJCSogaXAxICsgMyA8PSBpcDIgKHVzdWFsbHkgPCBpcDEgKyBtbDEpCisJCSovCisJCWlmICgoc3RhcnQyIC0gaXApIDwgT1BUSU1BTF9NTCkgeworCQkJaW50IGNvcnJlY3Rpb247CisJCQlpbnQgbmV3X21sID0gbWw7CisKKwkJCWlmIChuZXdfbWwgPiBPUFRJTUFMX01MKQorCQkJCW5ld19tbCA9IE9QVElNQUxfTUw7CisJCQlpZiAoaXAgKyBuZXdfbWwgPiBzdGFydDIgKyBtbDIgLSBNSU5NQVRDSCkKKwkJCQluZXdfbWwgPSAoaW50KShzdGFydDIgLSBpcCkgKyBtbDIgLSBNSU5NQVRDSDsKKworCQkJY29ycmVjdGlvbiA9IG5ld19tbCAtIChpbnQpKHN0YXJ0MiAtIGlwKTsKKworCQkJaWYgKGNvcnJlY3Rpb24gPiAwKSB7CisJCQkJc3RhcnQyICs9IGNvcnJlY3Rpb247CisJCQkJcmVmMiArPSBjb3JyZWN0aW9uOworCQkJCW1sMiAtPSBjb3JyZWN0aW9uOworCQkJfQorCQl9CisJCS8qCisJCSAqIE5vdywgd2UgaGF2ZSBzdGFydDIgPSBpcCArIG5ld19tbCwKKwkJICogd2l0aCBuZXdfbWwgPSBtaW4obWwsIE9QVElNQUxfTUwgPSAxOCkKKwkJICovCisKKwkJaWYgKHN0YXJ0MiArIG1sMiA8IG1mbGltaXQpCisJCQltbDMgPSBMWjRIQ19JbnNlcnRBbmRHZXRXaWRlck1hdGNoKGN0eCwKKwkJCQlzdGFydDIgKyBtbDIgLSAzLCBzdGFydDIsCisJCQkJbWF0Y2hsaW1pdCwgbWwyLCAmcmVmMywgJnN0YXJ0MywKKwkJCQltYXhOYkF0dGVtcHRzKTsKKwkJZWxzZQorCQkJbWwzID0gbWwyOworCisJCWlmIChtbDMgPT0gbWwyKSB7CisJCQkvKiBObyBiZXR0ZXIgbWF0Y2ggOiAyIHNlcXVlbmNlcyB0byBlbmNvZGUgKi8KKwkJCS8qIGlwICYgcmVmIGFyZSBrbm93bjsgTm93IGZvciBtbCAqLworCQkJaWYgKHN0YXJ0MiA8IGlwICsgbWwpCisJCQkJbWwgPSAoaW50KShzdGFydDIgLSBpcCk7CisJCQkvKiBOb3csIGVuY29kZSAyIHNlcXVlbmNlcyAqLworCQkJaWYgKExaNEhDX2VuY29kZVNlcXVlbmNlKCZpcCwgJm9wLCAmYW5jaG9yLAorCQkJCW1sLCByZWYsIGxpbWl0LCBvZW5kKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlwID0gc3RhcnQyOworCQkJaWYgKExaNEhDX2VuY29kZVNlcXVlbmNlKCZpcCwgJm9wLCAmYW5jaG9yLAorCQkJCW1sMiwgcmVmMiwgbGltaXQsIG9lbmQpKQorCQkJCXJldHVybiAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RhcnQzIDwgaXAgKyBtbCArIDMpIHsKKwkJCS8qIE5vdCBlbm91Z2ggc3BhY2UgZm9yIG1hdGNoIDIgOiByZW1vdmUgaXQgKi8KKwkJCWlmIChzdGFydDMgPj0gKGlwICsgbWwpKSB7CisJCQkJLyogY2FuIHdyaXRlIFNlcTEgaW1tZWRpYXRlbHkKKwkJCQkgKiA9PT4gU2VxMiBpcyByZW1vdmVkLAorCQkJCSAqIHNvIFNlcTMgYmVjb21lcyBTZXExCisJCQkJICovCisJCQkJaWYgKHN0YXJ0MiA8IGlwICsgbWwpIHsKKwkJCQkJaW50IGNvcnJlY3Rpb24gPSAoaW50KShpcCArIG1sIC0gc3RhcnQyKTsKKworCQkJCQlzdGFydDIgKz0gY29ycmVjdGlvbjsKKwkJCQkJcmVmMiArPSBjb3JyZWN0aW9uOworCQkJCQltbDIgLT0gY29ycmVjdGlvbjsKKwkJCQkJaWYgKG1sMiA8IE1JTk1BVENIKSB7CisJCQkJCQlzdGFydDIgPSBzdGFydDM7CisJCQkJCQlyZWYyID0gcmVmMzsKKwkJCQkJCW1sMiA9IG1sMzsKKwkJCQkJfQorCQkJCX0KKworCQkJCWlmIChMWjRIQ19lbmNvZGVTZXF1ZW5jZSgmaXAsICZvcCwgJmFuY2hvciwKKwkJCQkJbWwsIHJlZiwgbGltaXQsIG9lbmQpKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlpcCA9IHN0YXJ0MzsKKwkJCQlyZWYgPSByZWYzOworCQkJCW1sID0gbWwzOworCisJCQkJc3RhcnQwID0gc3RhcnQyOworCQkJCXJlZjAgPSByZWYyOworCQkJCW1sMCA9IG1sMjsKKwkJCQlnb3RvIF9TZWFyY2gyOworCQkJfQorCisJCQlzdGFydDIgPSBzdGFydDM7CisJCQlyZWYyID0gcmVmMzsKKwkJCW1sMiA9IG1sMzsKKwkJCWdvdG8gX1NlYXJjaDM7CisJCX0KKworCQkvKgorCQkqIE9LLCBub3cgd2UgaGF2ZSAzIGFzY2VuZGluZyBtYXRjaGVzOworCQkqIGxldCdzIHdyaXRlIGF0IGxlYXN0IHRoZSBmaXJzdCBvbmUKKwkJKiBpcCAmIHJlZiBhcmUga25vd247IE5vdyBmb3IgbWwKKwkJKi8KKwkJaWYgKHN0YXJ0MiA8IGlwICsgbWwpIHsKKwkJCWlmICgoc3RhcnQyIC0gaXApIDwgKGludClNTF9NQVNLKSB7CisJCQkJaW50IGNvcnJlY3Rpb247CisKKwkJCQlpZiAobWwgPiBPUFRJTUFMX01MKQorCQkJCQltbCA9IE9QVElNQUxfTUw7CisJCQkJaWYgKGlwICsgbWwgPiBzdGFydDIgKyBtbDIgLSBNSU5NQVRDSCkKKwkJCQkJbWwgPSAoaW50KShzdGFydDIgLSBpcCkgKyBtbDIgLSBNSU5NQVRDSDsKKwkJCQljb3JyZWN0aW9uID0gbWwgLSAoaW50KShzdGFydDIgLSBpcCk7CisJCQkJaWYgKGNvcnJlY3Rpb24gPiAwKSB7CisJCQkJCXN0YXJ0MiArPSBjb3JyZWN0aW9uOworCQkJCQlyZWYyICs9IGNvcnJlY3Rpb247CisJCQkJCW1sMiAtPSBjb3JyZWN0aW9uOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCW1sID0gKGludCkoc3RhcnQyIC0gaXApOworCQl9CisJCWlmIChMWjRIQ19lbmNvZGVTZXF1ZW5jZSgmaXAsICZvcCwgJmFuY2hvciwgbWwsCisJCQlyZWYsIGxpbWl0LCBvZW5kKSkKKwkJCXJldHVybiAwOworCisJCWlwID0gc3RhcnQyOworCQlyZWYgPSByZWYyOworCQltbCA9IG1sMjsKKworCQlzdGFydDIgPSBzdGFydDM7CisJCXJlZjIgPSByZWYzOworCQltbDIgPSBtbDM7CisKKwkJZ290byBfU2VhcmNoMzsKKwl9CisKKwkvKiBFbmNvZGUgTGFzdCBMaXRlcmFscyAqLworCXsKKwkJaW50IGxhc3RSdW4gPSAoaW50KShpZW5kIC0gYW5jaG9yKTsKKworCQlpZiAoKGxpbWl0KQorCQkJJiYgKCgoY2hhciAqKW9wIC0gZGVzdCkgKyBsYXN0UnVuICsgMQorCQkJCSsgKChsYXN0UnVuICsgMjU1IC0gUlVOX01BU0spLzI1NSkKKwkJCQkJPiAoVTMyKW1heE91dHB1dFNpemUpKSB7CisJCQkvKiBDaGVjayBvdXRwdXQgbGltaXQgKi8KKwkJCXJldHVybiAwOworCQl9CisJCWlmIChsYXN0UnVuID49IChpbnQpUlVOX01BU0spIHsKKwkJCSpvcCsrID0gKFJVTl9NQVNLPDxNTF9CSVRTKTsKKwkJCWxhc3RSdW4gLT0gUlVOX01BU0s7CisJCQlmb3IgKDsgbGFzdFJ1biA+IDI1NCA7IGxhc3RSdW4gLT0gMjU1KQorCQkJCSpvcCsrID0gMjU1OworCQkJKm9wKysgPSAoQllURSkgbGFzdFJ1bjsKKwkJfSBlbHNlCisJCQkqb3ArKyA9IChCWVRFKShsYXN0UnVuPDxNTF9CSVRTKTsKKwkJbWVtY3B5KG9wLCBhbmNob3IsIGllbmQgLSBhbmNob3IpOworCQlvcCArPSBpZW5kIC0gYW5jaG9yOworCX0KKworCS8qIEVuZCAqLworCXJldHVybiAoaW50KSAoKChjaGFyICopb3ApIC0gZGVzdCk7Cit9CisKK3N0YXRpYyBpbnQgTFo0X2NvbXByZXNzX0hDX2V4dFN0YXRlSEMoCisJdm9pZCAqc3RhdGUsCisJY29uc3QgY2hhciAqc3JjLAorCWNoYXIgKmRzdCwKKwlpbnQgc3JjU2l6ZSwKKwlpbnQgbWF4RHN0U2l6ZSwKKwlpbnQgY29tcHJlc3Npb25MZXZlbCkKK3sKKwlMWjRIQ19DQ3R4X2ludGVybmFsICpjdHggPSAmKChMWjRfc3RyZWFtSENfdCAqKXN0YXRlKS0+aW50ZXJuYWxfZG9ub3R1c2U7CisKKwlpZiAoKChzaXplX3QpKHN0YXRlKSYoc2l6ZW9mKHZvaWQgKikgLSAxKSkgIT0gMCkgeworCQkvKiBFcnJvciA6IHN0YXRlIGlzIG5vdCBhbGlnbmVkCisJCSAqIGZvciBwb2ludGVycyAoMzIgb3IgNjQgYml0cykKKwkJICovCisJCXJldHVybiAwOworCX0KKworCUxaNEhDX2luaXQoY3R4LCAoY29uc3QgQllURSAqKXNyYyk7CisKKwlpZiAobWF4RHN0U2l6ZSA8IExaNF9jb21wcmVzc0JvdW5kKHNyY1NpemUpKQorCQlyZXR1cm4gTFo0SENfY29tcHJlc3NfZ2VuZXJpYyhjdHgsIHNyYywgZHN0LAorCQkJc3JjU2l6ZSwgbWF4RHN0U2l6ZSwgY29tcHJlc3Npb25MZXZlbCwgbGltaXRlZE91dHB1dCk7CisJZWxzZQorCQlyZXR1cm4gTFo0SENfY29tcHJlc3NfZ2VuZXJpYyhjdHgsIHNyYywgZHN0LAorCQkJc3JjU2l6ZSwgbWF4RHN0U2l6ZSwgY29tcHJlc3Npb25MZXZlbCwgbm9MaW1pdCk7Cit9CisKK2ludCBMWjRfY29tcHJlc3NfSEMoY29uc3QgY2hhciAqc3JjLCBjaGFyICpkc3QsIGludCBzcmNTaXplLAorCWludCBtYXhEc3RTaXplLCBpbnQgY29tcHJlc3Npb25MZXZlbCwgdm9pZCAqd3JrbWVtKQoreworCXJldHVybiBMWjRfY29tcHJlc3NfSENfZXh0U3RhdGVIQyh3cmttZW0sIHNyYywgZHN0LAorCQlzcmNTaXplLCBtYXhEc3RTaXplLCBjb21wcmVzc2lvbkxldmVsKTsKK30KK0VYUE9SVF9TWU1CT0woTFo0X2NvbXByZXNzX0hDKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKglTdHJlYW1pbmcgRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExaNF9yZXNldFN0cmVhbUhDKExaNF9zdHJlYW1IQ190ICpMWjRfc3RyZWFtSENQdHIsIGludCBjb21wcmVzc2lvbkxldmVsKQoreworCUxaNF9zdHJlYW1IQ1B0ci0+aW50ZXJuYWxfZG9ub3R1c2UuYmFzZSA9IE5VTEw7CisJTFo0X3N0cmVhbUhDUHRyLT5pbnRlcm5hbF9kb25vdHVzZS5jb21wcmVzc2lvbkxldmVsID0gKHVuc2lnbmVkIGludCljb21wcmVzc2lvbkxldmVsOworfQorCitpbnQgTFo0X2xvYWREaWN0SEMoTFo0X3N0cmVhbUhDX3QgKkxaNF9zdHJlYW1IQ1B0ciwKKwljb25zdCBjaGFyICpkaWN0aW9uYXJ5LAorCWludCBkaWN0U2l6ZSkKK3sKKwlMWjRIQ19DQ3R4X2ludGVybmFsICpjdHhQdHIgPSAmTFo0X3N0cmVhbUhDUHRyLT5pbnRlcm5hbF9kb25vdHVzZTsKKworCWlmIChkaWN0U2l6ZSA+IDY0ICogS0IpIHsKKwkJZGljdGlvbmFyeSArPSBkaWN0U2l6ZSAtIDY0ICogS0I7CisJCWRpY3RTaXplID0gNjQgKiBLQjsKKwl9CisJTFo0SENfaW5pdChjdHhQdHIsIChjb25zdCBCWVRFICopZGljdGlvbmFyeSk7CisJaWYgKGRpY3RTaXplID49IDQpCisJCUxaNEhDX0luc2VydChjdHhQdHIsIChjb25zdCBCWVRFICopZGljdGlvbmFyeSArIChkaWN0U2l6ZSAtIDMpKTsKKwljdHhQdHItPmVuZCA9IChjb25zdCBCWVRFICopZGljdGlvbmFyeSArIGRpY3RTaXplOworCXJldHVybiBkaWN0U2l6ZTsKK30KK0VYUE9SVF9TWU1CT0woTFo0X2xvYWREaWN0SEMpOworCisvKiBjb21wcmVzc2lvbiAqLworCitzdGF0aWMgdm9pZCBMWjRIQ19zZXRFeHRlcm5hbERpY3QoCisJTFo0SENfQ0N0eF9pbnRlcm5hbCAqY3R4UHRyLAorCWNvbnN0IEJZVEUgKm5ld0Jsb2NrKQoreworCWlmIChjdHhQdHItPmVuZCA+PSBjdHhQdHItPmJhc2UgKyA0KSB7CisJCS8qIFJlZmVyZW5jaW5nIHJlbWFpbmluZyBkaWN0aW9uYXJ5IGNvbnRlbnQgKi8KKwkJTFo0SENfSW5zZXJ0KGN0eFB0ciwgY3R4UHRyLT5lbmQgLSAzKTsKKwl9CisKKwkvKgorCSAqIE9ubHkgb25lIG1lbW9yeSBzZWdtZW50IGZvciBleHREaWN0LAorCSAqIHNvIGFueSBwcmV2aW91cyBleHREaWN0IGlzIGxvc3QgYXQgdGhpcyBzdGFnZQorCSAqLworCWN0eFB0ci0+bG93TGltaXQJPSBjdHhQdHItPmRpY3RMaW1pdDsKKwljdHhQdHItPmRpY3RMaW1pdCA9IChVMzIpKGN0eFB0ci0+ZW5kIC0gY3R4UHRyLT5iYXNlKTsKKwljdHhQdHItPmRpY3RCYXNlCT0gY3R4UHRyLT5iYXNlOworCWN0eFB0ci0+YmFzZSA9IG5ld0Jsb2NrIC0gY3R4UHRyLT5kaWN0TGltaXQ7CisJY3R4UHRyLT5lbmQJPSBuZXdCbG9jazsKKwkvKiBtYXRjaCByZWZlcmVuY2luZyB3aWxsIHJlc3VtZSBmcm9tIHRoZXJlICovCisJY3R4UHRyLT5uZXh0VG9VcGRhdGUgPSBjdHhQdHItPmRpY3RMaW1pdDsKK30KK0VYUE9SVF9TWU1CT0woTFo0SENfc2V0RXh0ZXJuYWxEaWN0KTsKKworc3RhdGljIGludCBMWjRfY29tcHJlc3NIQ19jb250aW51ZV9nZW5lcmljKAorCUxaNF9zdHJlYW1IQ190ICpMWjRfc3RyZWFtSENQdHIsCisJY29uc3QgY2hhciAqc291cmNlLAorCWNoYXIgKmRlc3QsCisJaW50IGlucHV0U2l6ZSwKKwlpbnQgbWF4T3V0cHV0U2l6ZSwKKwlsaW1pdGVkT3V0cHV0X2RpcmVjdGl2ZSBsaW1pdCkKK3sKKwlMWjRIQ19DQ3R4X2ludGVybmFsICpjdHhQdHIgPSAmTFo0X3N0cmVhbUhDUHRyLT5pbnRlcm5hbF9kb25vdHVzZTsKKworCS8qIGF1dG8gLSBpbml0IGlmIGZvcmdvdHRlbiAqLworCWlmIChjdHhQdHItPmJhc2UgPT0gTlVMTCkKKwkJTFo0SENfaW5pdChjdHhQdHIsIChjb25zdCBCWVRFICopIHNvdXJjZSk7CisKKwkvKiBDaGVjayBvdmVyZmxvdyAqLworCWlmICgoc2l6ZV90KShjdHhQdHItPmVuZCAtIGN0eFB0ci0+YmFzZSkgPiAyICogR0IpIHsKKwkJc2l6ZV90IGRpY3RTaXplID0gKHNpemVfdCkoY3R4UHRyLT5lbmQgLSBjdHhQdHItPmJhc2UpCisJCQktIGN0eFB0ci0+ZGljdExpbWl0OworCQlpZiAoZGljdFNpemUgPiA2NCAqIEtCKQorCQkJZGljdFNpemUgPSA2NCAqIEtCOworCQlMWjRfbG9hZERpY3RIQyhMWjRfc3RyZWFtSENQdHIsCisJCQkoY29uc3QgY2hhciAqKShjdHhQdHItPmVuZCkgLSBkaWN0U2l6ZSwgKGludClkaWN0U2l6ZSk7CisJfQorCisJLyogQ2hlY2sgaWYgYmxvY2tzIGZvbGxvdyBlYWNoIG90aGVyICovCisJaWYgKChjb25zdCBCWVRFICopc291cmNlICE9IGN0eFB0ci0+ZW5kKQorCQlMWjRIQ19zZXRFeHRlcm5hbERpY3QoY3R4UHRyLCAoY29uc3QgQllURSAqKXNvdXJjZSk7CisKKwkvKiBDaGVjayBvdmVybGFwcGluZyBpbnB1dC9kaWN0aW9uYXJ5IHNwYWNlICovCisJeworCQljb25zdCBCWVRFICpzb3VyY2VFbmQgPSAoY29uc3QgQllURSAqKSBzb3VyY2UgKyBpbnB1dFNpemU7CisJCWNvbnN0IEJZVEUgKiBjb25zdCBkaWN0QmVnaW4gPSBjdHhQdHItPmRpY3RCYXNlICsgY3R4UHRyLT5sb3dMaW1pdDsKKwkJY29uc3QgQllURSAqIGNvbnN0IGRpY3RFbmQgPSBjdHhQdHItPmRpY3RCYXNlICsgY3R4UHRyLT5kaWN0TGltaXQ7CisKKwkJaWYgKChzb3VyY2VFbmQgPiBkaWN0QmVnaW4pCisJCQkmJiAoKGNvbnN0IEJZVEUgKilzb3VyY2UgPCBkaWN0RW5kKSkgeworCQkJaWYgKHNvdXJjZUVuZCA+IGRpY3RFbmQpCisJCQkJc291cmNlRW5kID0gZGljdEVuZDsKKwkJCWN0eFB0ci0+bG93TGltaXQgPSAoVTMyKShzb3VyY2VFbmQgLSBjdHhQdHItPmRpY3RCYXNlKTsKKworCQkJaWYgKGN0eFB0ci0+ZGljdExpbWl0IC0gY3R4UHRyLT5sb3dMaW1pdCA8IDQpCisJCQkJY3R4UHRyLT5sb3dMaW1pdCA9IGN0eFB0ci0+ZGljdExpbWl0OworCQl9CisJfQorCisJcmV0dXJuIExaNEhDX2NvbXByZXNzX2dlbmVyaWMoY3R4UHRyLCBzb3VyY2UsIGRlc3QsCisJCWlucHV0U2l6ZSwgbWF4T3V0cHV0U2l6ZSwgY3R4UHRyLT5jb21wcmVzc2lvbkxldmVsLCBsaW1pdCk7Cit9CisKK2ludCBMWjRfY29tcHJlc3NfSENfY29udGludWUoCisJTFo0X3N0cmVhbUhDX3QgKkxaNF9zdHJlYW1IQ1B0ciwKKwljb25zdCBjaGFyICpzb3VyY2UsCisJY2hhciAqZGVzdCwKKwlpbnQgaW5wdXRTaXplLAorCWludCBtYXhPdXRwdXRTaXplKQoreworCWlmIChtYXhPdXRwdXRTaXplIDwgTFo0X2NvbXByZXNzQm91bmQoaW5wdXRTaXplKSkKKwkJcmV0dXJuIExaNF9jb21wcmVzc0hDX2NvbnRpbnVlX2dlbmVyaWMoTFo0X3N0cmVhbUhDUHRyLAorCQkJc291cmNlLCBkZXN0LCBpbnB1dFNpemUsIG1heE91dHB1dFNpemUsIGxpbWl0ZWRPdXRwdXQpOworCWVsc2UKKwkJcmV0dXJuIExaNF9jb21wcmVzc0hDX2NvbnRpbnVlX2dlbmVyaWMoTFo0X3N0cmVhbUhDUHRyLAorCQkJc291cmNlLCBkZXN0LCBpbnB1dFNpemUsIG1heE91dHB1dFNpemUsIG5vTGltaXQpOworfQorRVhQT1JUX1NZTUJPTChMWjRfY29tcHJlc3NfSENfY29udGludWUpOworCisvKiBkaWN0aW9uYXJ5IHNhdmluZyAqLworCitpbnQgTFo0X3NhdmVEaWN0SEMoCisJTFo0X3N0cmVhbUhDX3QgKkxaNF9zdHJlYW1IQ1B0ciwKKwljaGFyICpzYWZlQnVmZmVyLAorCWludCBkaWN0U2l6ZSkKK3sKKwlMWjRIQ19DQ3R4X2ludGVybmFsICpjb25zdCBzdHJlYW1QdHIgPSAmTFo0X3N0cmVhbUhDUHRyLT5pbnRlcm5hbF9kb25vdHVzZTsKKwlpbnQgY29uc3QgcHJlZml4U2l6ZSA9IChpbnQpKHN0cmVhbVB0ci0+ZW5kCisJCS0gKHN0cmVhbVB0ci0+YmFzZSArIHN0cmVhbVB0ci0+ZGljdExpbWl0KSk7CisKKwlpZiAoZGljdFNpemUgPiA2NCAqIEtCKQorCQlkaWN0U2l6ZSA9IDY0ICogS0I7CisJaWYgKGRpY3RTaXplIDwgNCkKKwkJZGljdFNpemUgPSAwOworCWlmIChkaWN0U2l6ZSA+IHByZWZpeFNpemUpCisJCWRpY3RTaXplID0gcHJlZml4U2l6ZTsKKworCW1lbW1vdmUoc2FmZUJ1ZmZlciwgc3RyZWFtUHRyLT5lbmQgLSBkaWN0U2l6ZSwgZGljdFNpemUpOworCisJeworCQlVMzIgY29uc3QgZW5kSW5kZXggPSAoVTMyKShzdHJlYW1QdHItPmVuZCAtIHN0cmVhbVB0ci0+YmFzZSk7CisKKwkJc3RyZWFtUHRyLT5lbmQgPSAoY29uc3QgQllURSAqKXNhZmVCdWZmZXIgKyBkaWN0U2l6ZTsKKwkJc3RyZWFtUHRyLT5iYXNlID0gc3RyZWFtUHRyLT5lbmQgLSBlbmRJbmRleDsKKwkJc3RyZWFtUHRyLT5kaWN0TGltaXQgPSBlbmRJbmRleCAtIGRpY3RTaXplOworCQlzdHJlYW1QdHItPmxvd0xpbWl0ID0gZW5kSW5kZXggLSBkaWN0U2l6ZTsKKworCQlpZiAoc3RyZWFtUHRyLT5uZXh0VG9VcGRhdGUgPCBzdHJlYW1QdHItPmRpY3RMaW1pdCkKKwkJCXN0cmVhbVB0ci0+bmV4dFRvVXBkYXRlID0gc3RyZWFtUHRyLT5kaWN0TGltaXQ7CisJfQorCXJldHVybiBkaWN0U2l6ZTsKK30KK0VYUE9SVF9TWU1CT0woTFo0X3NhdmVEaWN0SEMpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxaNCBIQyBjb21wcmVzc29yIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vTWFrZWZpbGUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBmN2Q3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6by9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK2x6b19jb21wcmVzcy1vYmpzIDo9IGx6bzF4X2NvbXByZXNzLm8KK2x6b19kZWNvbXByZXNzLW9ianMgOj0gbHpvMXhfZGVjb21wcmVzc19zYWZlLm8KKworb2JqLSQoQ09ORklHX0xaT19DT01QUkVTUykgKz0gbHpvX2NvbXByZXNzLm8KK29iai0kKENPTkZJR19MWk9fREVDT01QUkVTUykgKz0gbHpvX2RlY29tcHJlc3MubwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbHpvL2x6bzF4X2NvbXByZXNzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vbHpvMXhfY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzZlYjIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbHpvL2x6bzF4X2NvbXByZXNzLmMKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiAgTFpPMVggQ29tcHJlc3NvciBmcm9tIExaTworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxMiBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgKgorICogIFRoZSBmdWxsIExaTyBwYWNrYWdlIGNhbiBiZSBmb3VuZCBhdDoKKyAqICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisgKgorICogIENoYW5nZWQgZm9yIExpbnV4IGtlcm5lbCB1c2UgYnk6CisgKiAgTml0aW4gR3VwdGEgPG5pdGluZ3VwdGE5MTBAZ21haWwuY29tPgorICogIFJpY2hhcmQgUHVyZGllIDxycHVyZGllQG9wZW5lZGhhbmQuY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8bGludXgvbHpvLmg+CisjaW5jbHVkZSAibHpvZGVmcy5oIgorCitzdGF0aWMgbm9pbmxpbmUgc2l6ZV90Citsem8xeF8xX2RvX2NvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmluLCBzaXplX3QgaW5fbGVuLAorCQkgICAgdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKm91dF9sZW4sCisJCSAgICBzaXplX3QgdGksIHZvaWQgKndya21lbSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICppcDsKKwl1bnNpZ25lZCBjaGFyICpvcDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICogY29uc3QgaW5fZW5kID0gaW4gKyBpbl9sZW47CisJY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IGlwX2VuZCA9IGluICsgaW5fbGVuIC0gMjA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqaWk7CisJbHpvX2RpY3RfdCAqIGNvbnN0IGRpY3QgPSAobHpvX2RpY3RfdCAqKSB3cmttZW07CisKKwlvcCA9IG91dDsKKwlpcCA9IGluOworCWlpID0gaXA7CisJaXAgKz0gdGkgPCA0ID8gNCAtIHRpIDogMDsKKworCWZvciAoOzspIHsKKwkJY29uc3QgdW5zaWduZWQgY2hhciAqbV9wb3M7CisJCXNpemVfdCB0LCBtX2xlbiwgbV9vZmY7CisJCXUzMiBkdjsKK2xpdGVyYWw6CisJCWlwICs9IDEgKyAoKGlwIC0gaWkpID4+IDUpOworbmV4dDoKKwkJaWYgKHVubGlrZWx5KGlwID49IGlwX2VuZCkpCisJCQlicmVhazsKKwkJZHYgPSBnZXRfdW5hbGlnbmVkX2xlMzIoaXApOworCQl0ID0gKChkdiAqIDB4MTgyNDQyOWQpID4+ICgzMiAtIERfQklUUykpICYgRF9NQVNLOworCQltX3BvcyA9IGluICsgZGljdFt0XTsKKwkJZGljdFt0XSA9IChsem9fZGljdF90KSAoaXAgLSBpbik7CisJCWlmICh1bmxpa2VseShkdiAhPSBnZXRfdW5hbGlnbmVkX2xlMzIobV9wb3MpKSkKKwkJCWdvdG8gbGl0ZXJhbDsKKworCQlpaSAtPSB0aTsKKwkJdGkgPSAwOworCQl0ID0gaXAgLSBpaTsKKwkJaWYgKHQgIT0gMCkgeworCQkJaWYgKHQgPD0gMykgeworCQkJCW9wWy0yXSB8PSB0OworCQkJCUNPUFk0KG9wLCBpaSk7CisJCQkJb3AgKz0gdDsKKwkJCX0gZWxzZSBpZiAodCA8PSAxNikgeworCQkJCSpvcCsrID0gKHQgLSAzKTsKKwkJCQlDT1BZOChvcCwgaWkpOworCQkJCUNPUFk4KG9wICsgOCwgaWkgKyA4KTsKKwkJCQlvcCArPSB0OworCQkJfSBlbHNlIHsKKwkJCQlpZiAodCA8PSAxOCkgeworCQkJCQkqb3ArKyA9ICh0IC0gMyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJc2l6ZV90IHR0ID0gdCAtIDE4OworCQkJCQkqb3ArKyA9IDA7CisJCQkJCXdoaWxlICh1bmxpa2VseSh0dCA+IDI1NSkpIHsKKwkJCQkJCXR0IC09IDI1NTsKKwkJCQkJCSpvcCsrID0gMDsKKwkJCQkJfQorCQkJCQkqb3ArKyA9IHR0OworCQkJCX0KKwkJCQlkbyB7CisJCQkJCUNPUFk4KG9wLCBpaSk7CisJCQkJCUNPUFk4KG9wICsgOCwgaWkgKyA4KTsKKwkJCQkJb3AgKz0gMTY7CisJCQkJCWlpICs9IDE2OworCQkJCQl0IC09IDE2OworCQkJCX0gd2hpbGUgKHQgPj0gMTYpOworCQkJCWlmICh0ID4gMCkgZG8geworCQkJCQkqb3ArKyA9ICppaSsrOworCQkJCX0gd2hpbGUgKC0tdCA+IDApOworCQkJfQorCQl9CisKKwkJbV9sZW4gPSA0OworCQl7CisjaWYgZGVmaW5lZChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUykgJiYgZGVmaW5lZChMWk9fVVNFX0NUWjY0KQorCQl1NjQgdjsKKwkJdiA9IGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKSAoaXAgKyBtX2xlbikpIF4KKwkJICAgIGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKSAobV9wb3MgKyBtX2xlbikpOworCQlpZiAodW5saWtlbHkodiA9PSAwKSkgeworCQkJZG8geworCQkJCW1fbGVuICs9IDg7CisJCQkJdiA9IGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKSAoaXAgKyBtX2xlbikpIF4KKwkJCQkgICAgZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTY0ICopIChtX3BvcyArIG1fbGVuKSk7CisJCQkJaWYgKHVubGlrZWx5KGlwICsgbV9sZW4gPj0gaXBfZW5kKSkKKwkJCQkJZ290byBtX2xlbl9kb25lOworCQkJfSB3aGlsZSAodiA9PSAwKTsKKwkJfQorIyAgaWYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCisJCW1fbGVuICs9ICh1bnNpZ25lZCkgX19idWlsdGluX2N0emxsKHYpIC8gODsKKyMgIGVsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJCW1fbGVuICs9ICh1bnNpZ25lZCkgX19idWlsdGluX2NsemxsKHYpIC8gODsKKyMgIGVsc2UKKyMgICAgZXJyb3IgIm1pc3NpbmcgZW5kaWFuIGRlZmluaXRpb24iCisjICBlbmRpZgorI2VsaWYgZGVmaW5lZChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUykgJiYgZGVmaW5lZChMWk9fVVNFX0NUWjMyKQorCQl1MzIgdjsKKwkJdiA9IGdldF91bmFsaWduZWQoKGNvbnN0IHUzMiAqKSAoaXAgKyBtX2xlbikpIF4KKwkJICAgIGdldF91bmFsaWduZWQoKGNvbnN0IHUzMiAqKSAobV9wb3MgKyBtX2xlbikpOworCQlpZiAodW5saWtlbHkodiA9PSAwKSkgeworCQkJZG8geworCQkJCW1fbGVuICs9IDQ7CisJCQkJdiA9IGdldF91bmFsaWduZWQoKGNvbnN0IHUzMiAqKSAoaXAgKyBtX2xlbikpIF4KKwkJCQkgICAgZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTMyICopIChtX3BvcyArIG1fbGVuKSk7CisJCQkJaWYgKHYgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJbV9sZW4gKz0gNDsKKwkJCQl2ID0gZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTMyICopIChpcCArIG1fbGVuKSkgXgorCQkJCSAgICBnZXRfdW5hbGlnbmVkKChjb25zdCB1MzIgKikgKG1fcG9zICsgbV9sZW4pKTsKKwkJCQlpZiAodW5saWtlbHkoaXAgKyBtX2xlbiA+PSBpcF9lbmQpKQorCQkJCQlnb3RvIG1fbGVuX2RvbmU7CisJCQl9IHdoaWxlICh2ID09IDApOworCQl9CisjICBpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKwkJbV9sZW4gKz0gKHVuc2lnbmVkKSBfX2J1aWx0aW5fY3R6KHYpIC8gODsKKyMgIGVsaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pCisJCW1fbGVuICs9ICh1bnNpZ25lZCkgX19idWlsdGluX2Nseih2KSAvIDg7CisjICBlbHNlCisjICAgIGVycm9yICJtaXNzaW5nIGVuZGlhbiBkZWZpbml0aW9uIgorIyAgZW5kaWYKKyNlbHNlCisJCWlmICh1bmxpa2VseShpcFttX2xlbl0gPT0gbV9wb3NbbV9sZW5dKSkgeworCQkJZG8geworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKGlwW21fbGVuXSAhPSBtX3Bvc1ttX2xlbl0pCisJCQkJCWJyZWFrOworCQkJCW1fbGVuICs9IDE7CisJCQkJaWYgKHVubGlrZWx5KGlwICsgbV9sZW4gPj0gaXBfZW5kKSkKKwkJCQkJZ290byBtX2xlbl9kb25lOworCQkJfSB3aGlsZSAoaXBbbV9sZW5dID09IG1fcG9zW21fbGVuXSk7CisJCX0KKyNlbmRpZgorCQl9CittX2xlbl9kb25lOgorCisJCW1fb2ZmID0gaXAgLSBtX3BvczsKKwkJaXAgKz0gbV9sZW47CisJCWlpID0gaXA7CisJCWlmIChtX2xlbiA8PSBNMl9NQVhfTEVOICYmIG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpIHsKKwkJCW1fb2ZmIC09IDE7CisJCQkqb3ArKyA9ICgoKG1fbGVuIC0gMSkgPDwgNSkgfCAoKG1fb2ZmICYgNykgPDwgMikpOworCQkJKm9wKysgPSAobV9vZmYgPj4gMyk7CisJCX0gZWxzZSBpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQkJbV9vZmYgLT0gMTsKKwkJCWlmIChtX2xlbiA8PSBNM19NQVhfTEVOKQorCQkJCSpvcCsrID0gKE0zX01BUktFUiB8IChtX2xlbiAtIDIpKTsKKwkJCWVsc2UgeworCQkJCW1fbGVuIC09IE0zX01BWF9MRU47CisJCQkJKm9wKysgPSBNM19NQVJLRVIgfCAwOworCQkJCXdoaWxlICh1bmxpa2VseShtX2xlbiA+IDI1NSkpIHsKKwkJCQkJbV9sZW4gLT0gMjU1OworCQkJCQkqb3ArKyA9IDA7CisJCQkJfQorCQkJCSpvcCsrID0gKG1fbGVuKTsKKwkJCX0KKwkJCSpvcCsrID0gKG1fb2ZmIDw8IDIpOworCQkJKm9wKysgPSAobV9vZmYgPj4gNik7CisJCX0gZWxzZSB7CisJCQltX29mZiAtPSAweDQwMDA7CisJCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCQkqb3ArKyA9IChNNF9NQVJLRVIgfCAoKG1fb2ZmID4+IDExKSAmIDgpCisJCQkJCQl8IChtX2xlbiAtIDIpKTsKKwkJCWVsc2UgeworCQkJCW1fbGVuIC09IE00X01BWF9MRU47CisJCQkJKm9wKysgPSAoTTRfTUFSS0VSIHwgKChtX29mZiA+PiAxMSkgJiA4KSk7CisJCQkJd2hpbGUgKHVubGlrZWx5KG1fbGVuID4gMjU1KSkgeworCQkJCQltX2xlbiAtPSAyNTU7CisJCQkJCSpvcCsrID0gMDsKKwkJCQl9CisJCQkJKm9wKysgPSAobV9sZW4pOworCQkJfQorCQkJKm9wKysgPSAobV9vZmYgPDwgMik7CisJCQkqb3ArKyA9IChtX29mZiA+PiA2KTsKKwkJfQorCQlnb3RvIG5leHQ7CisJfQorCSpvdXRfbGVuID0gb3AgLSBvdXQ7CisJcmV0dXJuIGluX2VuZCAtIChpaSAtIHRpKTsKK30KKworaW50IGx6bzF4XzFfY29tcHJlc3MoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbl9sZW4sCisJCSAgICAgdW5zaWduZWQgY2hhciAqb3V0LCBzaXplX3QgKm91dF9sZW4sCisJCSAgICAgdm9pZCAqd3JrbWVtKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwID0gaW47CisJdW5zaWduZWQgY2hhciAqb3AgPSBvdXQ7CisJc2l6ZV90IGwgPSBpbl9sZW47CisJc2l6ZV90IHQgPSAwOworCisJd2hpbGUgKGwgPiAyMCkgeworCQlzaXplX3QgbGwgPSBsIDw9IChNNF9NQVhfT0ZGU0VUICsgMSkgPyBsIDogKE00X01BWF9PRkZTRVQgKyAxKTsKKwkJdWludHB0cl90IGxsX2VuZCA9ICh1aW50cHRyX3QpIGlwICsgbGw7CisJCWlmICgobGxfZW5kICsgKCh0ICsgbGwpID4+IDUpKSA8PSBsbF9lbmQpCisJCQlicmVhazsKKwkJQlVJTERfQlVHX09OKERfU0laRSAqIHNpemVvZihsem9fZGljdF90KSA+IExaTzFYXzFfTUVNX0NPTVBSRVNTKTsKKwkJbWVtc2V0KHdya21lbSwgMCwgRF9TSVpFICogc2l6ZW9mKGx6b19kaWN0X3QpKTsKKwkJdCA9IGx6bzF4XzFfZG9fY29tcHJlc3MoaXAsIGxsLCBvcCwgb3V0X2xlbiwgdCwgd3JrbWVtKTsKKwkJaXAgKz0gbGw7CisJCW9wICs9ICpvdXRfbGVuOworCQlsICAtPSBsbDsKKwl9CisJdCArPSBsOworCisJaWYgKHQgPiAwKSB7CisJCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmlpID0gaW4gKyBpbl9sZW4gLSB0OworCisJCWlmIChvcCA9PSBvdXQgJiYgdCA8PSAyMzgpIHsKKwkJCSpvcCsrID0gKDE3ICsgdCk7CisJCX0gZWxzZSBpZiAodCA8PSAzKSB7CisJCQlvcFstMl0gfD0gdDsKKwkJfSBlbHNlIGlmICh0IDw9IDE4KSB7CisJCQkqb3ArKyA9ICh0IC0gMyk7CisJCX0gZWxzZSB7CisJCQlzaXplX3QgdHQgPSB0IC0gMTg7CisJCQkqb3ArKyA9IDA7CisJCQl3aGlsZSAodHQgPiAyNTUpIHsKKwkJCQl0dCAtPSAyNTU7CisJCQkJKm9wKysgPSAwOworCQkJfQorCQkJKm9wKysgPSB0dDsKKwkJfQorCQlpZiAodCA+PSAxNikgZG8geworCQkJQ09QWTgob3AsIGlpKTsKKwkJCUNPUFk4KG9wICsgOCwgaWkgKyA4KTsKKwkJCW9wICs9IDE2OworCQkJaWkgKz0gMTY7CisJCQl0IC09IDE2OworCQl9IHdoaWxlICh0ID49IDE2KTsKKwkJaWYgKHQgPiAwKSBkbyB7CisJCQkqb3ArKyA9ICppaSsrOworCQl9IHdoaWxlICgtLXQgPiAwKTsKKwl9CisKKwkqb3ArKyA9IE00X01BUktFUiB8IDE7CisJKm9wKysgPSAwOworCSpvcCsrID0gMDsKKworCSpvdXRfbGVuID0gb3AgLSBvdXQ7CisJcmV0dXJuIExaT19FX09LOworfQorRVhQT1JUX1NZTUJPTF9HUEwobHpvMXhfMV9jb21wcmVzcyk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTFpPMVgtMSBDb21wcmVzc29yIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vbHpvMXhfZGVjb21wcmVzc19zYWZlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vbHpvMXhfZGVjb21wcmVzc19zYWZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjMzg3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6by9sem8xeF9kZWNvbXByZXNzX3NhZmUuYwpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqICBMWk8xWCBEZWNvbXByZXNzb3IgZnJvbSBMWk8KKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk2LTIwMTIgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICoKKyAqICBUaGUgZnVsbCBMWk8gcGFja2FnZSBjYW4gYmUgZm91bmQgYXQ6CisgKiAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworICoKKyAqICBDaGFuZ2VkIGZvciBMaW51eCBrZXJuZWwgdXNlIGJ5OgorICogIE5pdGluIEd1cHRhIDxuaXRpbmd1cHRhOTEwQGdtYWlsLmNvbT4KKyAqICBSaWNoYXJkIFB1cmRpZSA8cnB1cmRpZUBvcGVuZWRoYW5kLmNvbT4KKyAqLworCisjaWZuZGVmIFNUQVRJQworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2VuZGlmCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L2x6by5oPgorI2luY2x1ZGUgImx6b2RlZnMuaCIKKworI2RlZmluZSBIQVZFX0lQKHgpICAgICAgKChzaXplX3QpKGlwX2VuZCAtIGlwKSA+PSAoc2l6ZV90KSh4KSkKKyNkZWZpbmUgSEFWRV9PUCh4KSAgICAgICgoc2l6ZV90KShvcF9lbmQgLSBvcCkgPj0gKHNpemVfdCkoeCkpCisjZGVmaW5lIE5FRURfSVAoeCkgICAgICBpZiAoIUhBVkVfSVAoeCkpIGdvdG8gaW5wdXRfb3ZlcnJ1bgorI2RlZmluZSBORUVEX09QKHgpICAgICAgaWYgKCFIQVZFX09QKHgpKSBnb3RvIG91dHB1dF9vdmVycnVuCisjZGVmaW5lIFRFU1RfTEIobV9wb3MpICBpZiAoKG1fcG9zKSA8IG91dCkgZ290byBsb29rYmVoaW5kX292ZXJydW4KKworLyogVGhpcyBNQVhfMjU1X0NPVU5UIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB3ZSBjYW4gYWRkIDI1NSB0byBhIGJhc2UKKyAqIGNvdW50IHdpdGhvdXQgb3ZlcmZsb3dpbmcgYW4gaW50ZWdlci4gVGhlIG11bHRpcGx5IHdpbGwgb3ZlcmZsb3cgd2hlbgorICogbXVsdGlwbHlpbmcgMjU1IGJ5IG1vcmUgdGhhbiBNQVhJTlQvMjU1LiBUaGUgc3VtIHdpbGwgb3ZlcmZsb3cgZWFybGllcgorICogZGVwZW5kaW5nIG9uIHRoZSBiYXNlIGNvdW50LiBTaW5jZSB0aGUgYmFzZSBjb3VudCBpcyB0YWtlbiBmcm9tIGEgdTgKKyAqIGFuZCBhIGZldyBiaXRzLCBpdCBpcyBzYWZlIHRvIGFzc3VtZSB0aGF0IGl0IHdpbGwgYWx3YXlzIGJlIGxvd2VyIHRoYW4KKyAqIG9yIGVxdWFsIHRvIDIqMjU1LCB0aHVzIHdlIGNhbiBhbHdheXMgcHJldmVudCBhbnkgb3ZlcmZsb3cgYnkgYWNjZXB0aW5nCisgKiB0d28gbGVzcyAyNTUgc3RlcHMuIFNlZSBEb2N1bWVudGF0aW9uL2x6by50eHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgTUFYXzI1NV9DT1VOVCAgICAgICgoKChzaXplX3QpfjApIC8gMjU1KSAtIDIpCisKK2ludCBsem8xeF9kZWNvbXByZXNzX3NhZmUoY29uc3QgdW5zaWduZWQgY2hhciAqaW4sIHNpemVfdCBpbl9sZW4sCisJCQkgIHVuc2lnbmVkIGNoYXIgKm91dCwgc2l6ZV90ICpvdXRfbGVuKQoreworCXVuc2lnbmVkIGNoYXIgKm9wOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmlwOworCXNpemVfdCB0LCBuZXh0OworCXNpemVfdCBzdGF0ZSA9IDA7CisJY29uc3QgdW5zaWduZWQgY2hhciAqbV9wb3M7CisJY29uc3QgdW5zaWduZWQgY2hhciAqIGNvbnN0IGlwX2VuZCA9IGluICsgaW5fbGVuOworCXVuc2lnbmVkIGNoYXIgKiBjb25zdCBvcF9lbmQgPSBvdXQgKyAqb3V0X2xlbjsKKworCW9wID0gb3V0OworCWlwID0gaW47CisKKwlpZiAodW5saWtlbHkoaW5fbGVuIDwgMykpCisJCWdvdG8gaW5wdXRfb3ZlcnJ1bjsKKwlpZiAoKmlwID4gMTcpIHsKKwkJdCA9ICppcCsrIC0gMTc7CisJCWlmICh0IDwgNCkgeworCQkJbmV4dCA9IHQ7CisJCQlnb3RvIG1hdGNoX25leHQ7CisJCX0KKwkJZ290byBjb3B5X2xpdGVyYWxfcnVuOworCX0KKworCWZvciAoOzspIHsKKwkJdCA9ICppcCsrOworCQlpZiAodCA8IDE2KSB7CisJCQlpZiAobGlrZWx5KHN0YXRlID09IDApKSB7CisJCQkJaWYgKHVubGlrZWx5KHQgPT0gMCkpIHsKKwkJCQkJc2l6ZV90IG9mZnNldDsKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaXBfbGFzdCA9IGlwOworCisJCQkJCXdoaWxlICh1bmxpa2VseSgqaXAgPT0gMCkpIHsKKwkJCQkJCWlwKys7CisJCQkJCQlORUVEX0lQKDEpOworCQkJCQl9CisJCQkJCW9mZnNldCA9IGlwIC0gaXBfbGFzdDsKKwkJCQkJaWYgKHVubGlrZWx5KG9mZnNldCA+IE1BWF8yNTVfQ09VTlQpKQorCQkJCQkJcmV0dXJuIExaT19FX0VSUk9SOworCisJCQkJCW9mZnNldCA9IChvZmZzZXQgPDwgOCkgLSBvZmZzZXQ7CisJCQkJCXQgKz0gb2Zmc2V0ICsgMTUgKyAqaXArKzsKKwkJCQl9CisJCQkJdCArPSAzOworY29weV9saXRlcmFsX3J1bjoKKyNpZiBkZWZpbmVkKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTKQorCQkJCWlmIChsaWtlbHkoSEFWRV9JUCh0ICsgMTUpICYmIEhBVkVfT1AodCArIDE1KSkpIHsKKwkJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaWUgPSBpcCArIHQ7CisJCQkJCXVuc2lnbmVkIGNoYXIgKm9lID0gb3AgKyB0OworCQkJCQlkbyB7CisJCQkJCQlDT1BZOChvcCwgaXApOworCQkJCQkJb3AgKz0gODsKKwkJCQkJCWlwICs9IDg7CisJCQkJCQlDT1BZOChvcCwgaXApOworCQkJCQkJb3AgKz0gODsKKwkJCQkJCWlwICs9IDg7CisJCQkJCX0gd2hpbGUgKGlwIDwgaWUpOworCQkJCQlpcCA9IGllOworCQkJCQlvcCA9IG9lOworCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJeworCQkJCQlORUVEX09QKHQpOworCQkJCQlORUVEX0lQKHQgKyAzKTsKKwkJCQkJZG8geworCQkJCQkJKm9wKysgPSAqaXArKzsKKwkJCQkJfSB3aGlsZSAoLS10ID4gMCk7CisJCQkJfQorCQkJCXN0YXRlID0gNDsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAoc3RhdGUgIT0gNCkgeworCQkJCW5leHQgPSB0ICYgMzsKKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSB0ID4+IDI7CisJCQkJbV9wb3MgLT0gKmlwKysgPDwgMjsKKwkJCQlURVNUX0xCKG1fcG9zKTsKKwkJCQlORUVEX09QKDIpOworCQkJCW9wWzBdID0gbV9wb3NbMF07CisJCQkJb3BbMV0gPSBtX3Bvc1sxXTsKKwkJCQlvcCArPSAyOworCQkJCWdvdG8gbWF0Y2hfbmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJbmV4dCA9IHQgJiAzOworCQkJCW1fcG9zID0gb3AgLSAoMSArIE0yX01BWF9PRkZTRVQpOworCQkJCW1fcG9zIC09IHQgPj4gMjsKKwkJCQltX3BvcyAtPSAqaXArKyA8PCAyOworCQkJCXQgPSAzOworCQkJfQorCQl9IGVsc2UgaWYgKHQgPj0gNjQpIHsKKwkJCW5leHQgPSB0ICYgMzsKKwkJCW1fcG9zID0gb3AgLSAxOworCQkJbV9wb3MgLT0gKHQgPj4gMikgJiA3OworCQkJbV9wb3MgLT0gKmlwKysgPDwgMzsKKwkJCXQgPSAodCA+PiA1KSAtIDEgKyAoMyAtIDEpOworCQl9IGVsc2UgaWYgKHQgPj0gMzIpIHsKKwkJCXQgPSAodCAmIDMxKSArICgzIC0gMSk7CisJCQlpZiAodW5saWtlbHkodCA9PSAyKSkgeworCQkJCXNpemVfdCBvZmZzZXQ7CisJCQkJY29uc3QgdW5zaWduZWQgY2hhciAqaXBfbGFzdCA9IGlwOworCisJCQkJd2hpbGUgKHVubGlrZWx5KCppcCA9PSAwKSkgeworCQkJCQlpcCsrOworCQkJCQlORUVEX0lQKDEpOworCQkJCX0KKwkJCQlvZmZzZXQgPSBpcCAtIGlwX2xhc3Q7CisJCQkJaWYgKHVubGlrZWx5KG9mZnNldCA+IE1BWF8yNTVfQ09VTlQpKQorCQkJCQlyZXR1cm4gTFpPX0VfRVJST1I7CisKKwkJCQlvZmZzZXQgPSAob2Zmc2V0IDw8IDgpIC0gb2Zmc2V0OworCQkJCXQgKz0gb2Zmc2V0ICsgMzEgKyAqaXArKzsKKwkJCQlORUVEX0lQKDIpOworCQkJfQorCQkJbV9wb3MgPSBvcCAtIDE7CisJCQluZXh0ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KGlwKTsKKwkJCWlwICs9IDI7CisJCQltX3BvcyAtPSBuZXh0ID4+IDI7CisJCQluZXh0ICY9IDM7CisJCX0gZWxzZSB7CisJCQltX3BvcyA9IG9wOworCQkJbV9wb3MgLT0gKHQgJiA4KSA8PCAxMTsKKwkJCXQgPSAodCAmIDcpICsgKDMgLSAxKTsKKwkJCWlmICh1bmxpa2VseSh0ID09IDIpKSB7CisJCQkJc2l6ZV90IG9mZnNldDsKKwkJCQljb25zdCB1bnNpZ25lZCBjaGFyICppcF9sYXN0ID0gaXA7CisKKwkJCQl3aGlsZSAodW5saWtlbHkoKmlwID09IDApKSB7CisJCQkJCWlwKys7CisJCQkJCU5FRURfSVAoMSk7CisJCQkJfQorCQkJCW9mZnNldCA9IGlwIC0gaXBfbGFzdDsKKwkJCQlpZiAodW5saWtlbHkob2Zmc2V0ID4gTUFYXzI1NV9DT1VOVCkpCisJCQkJCXJldHVybiBMWk9fRV9FUlJPUjsKKworCQkJCW9mZnNldCA9IChvZmZzZXQgPDwgOCkgLSBvZmZzZXQ7CisJCQkJdCArPSBvZmZzZXQgKyA3ICsgKmlwKys7CisJCQkJTkVFRF9JUCgyKTsKKwkJCX0KKwkJCW5leHQgPSBnZXRfdW5hbGlnbmVkX2xlMTYoaXApOworCQkJaXAgKz0gMjsKKwkJCW1fcG9zIC09IG5leHQgPj4gMjsKKwkJCW5leHQgJj0gMzsKKwkJCWlmIChtX3BvcyA9PSBvcCkKKwkJCQlnb3RvIGVvZl9mb3VuZDsKKwkJCW1fcG9zIC09IDB4NDAwMDsKKwkJfQorCQlURVNUX0xCKG1fcG9zKTsKKyNpZiBkZWZpbmVkKENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTKQorCQlpZiAob3AgLSBtX3BvcyA+PSA4KSB7CisJCQl1bnNpZ25lZCBjaGFyICpvZSA9IG9wICsgdDsKKwkJCWlmIChsaWtlbHkoSEFWRV9PUCh0ICsgMTUpKSkgeworCQkJCWRvIHsKKwkJCQkJQ09QWTgob3AsIG1fcG9zKTsKKwkJCQkJb3AgKz0gODsKKwkJCQkJbV9wb3MgKz0gODsKKwkJCQkJQ09QWTgob3AsIG1fcG9zKTsKKwkJCQkJb3AgKz0gODsKKwkJCQkJbV9wb3MgKz0gODsKKwkJCQl9IHdoaWxlIChvcCA8IG9lKTsKKwkJCQlvcCA9IG9lOworCQkJCWlmIChIQVZFX0lQKDYpKSB7CisJCQkJCXN0YXRlID0gbmV4dDsKKwkJCQkJQ09QWTQob3AsIGlwKTsKKwkJCQkJb3AgKz0gbmV4dDsKKwkJCQkJaXAgKz0gbmV4dDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlORUVEX09QKHQpOworCQkJCWRvIHsKKwkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQl9IHdoaWxlIChvcCA8IG9lKTsKKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJdW5zaWduZWQgY2hhciAqb2UgPSBvcCArIHQ7CisJCQlORUVEX09QKHQpOworCQkJb3BbMF0gPSBtX3Bvc1swXTsKKwkJCW9wWzFdID0gbV9wb3NbMV07CisJCQlvcCArPSAyOworCQkJbV9wb3MgKz0gMjsKKwkJCWRvIHsKKwkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJfSB3aGlsZSAob3AgPCBvZSk7CisJCX0KK21hdGNoX25leHQ6CisJCXN0YXRlID0gbmV4dDsKKwkJdCA9IG5leHQ7CisjaWYgZGVmaW5lZChDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUykKKwkJaWYgKGxpa2VseShIQVZFX0lQKDYpICYmIEhBVkVfT1AoNCkpKSB7CisJCQlDT1BZNChvcCwgaXApOworCQkJb3AgKz0gdDsKKwkJCWlwICs9IHQ7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCU5FRURfSVAodCArIDMpOworCQkJTkVFRF9PUCh0KTsKKwkJCXdoaWxlICh0ID4gMCkgeworCQkJCSpvcCsrID0gKmlwKys7CisJCQkJdC0tOworCQkJfQorCQl9CisJfQorCitlb2ZfZm91bmQ6CisJKm91dF9sZW4gPSBvcCAtIG91dDsKKwlyZXR1cm4gKHQgIT0gMyAgICAgICA/IExaT19FX0VSUk9SIDoKKwkJaXAgPT0gaXBfZW5kID8gTFpPX0VfT0sgOgorCQlpcCA8ICBpcF9lbmQgPyBMWk9fRV9JTlBVVF9OT1RfQ09OU1VNRUQgOiBMWk9fRV9JTlBVVF9PVkVSUlVOKTsKKworaW5wdXRfb3ZlcnJ1bjoKKwkqb3V0X2xlbiA9IG9wIC0gb3V0OworCXJldHVybiBMWk9fRV9JTlBVVF9PVkVSUlVOOworCitvdXRwdXRfb3ZlcnJ1bjoKKwkqb3V0X2xlbiA9IG9wIC0gb3V0OworCXJldHVybiBMWk9fRV9PVVRQVVRfT1ZFUlJVTjsKKworbG9va2JlaGluZF9vdmVycnVuOgorCSpvdXRfbGVuID0gb3AgLSBvdXQ7CisJcmV0dXJuIExaT19FX0xPT0tCRUhJTkRfT1ZFUlJVTjsKK30KKyNpZm5kZWYgU1RBVElDCitFWFBPUlRfU1lNQk9MX0dQTChsem8xeF9kZWNvbXByZXNzX3NhZmUpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxaTzFYIERlY29tcHJlc3NvciIpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL2x6by9sem9kZWZzLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vbHpvZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZGVmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9sem8vbHpvZGVmcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKgorICogIGx6b2RlZnMuaCAtLSBhcmNoaXRlY3R1cmUsIE9TIGFuZCBjb21waWxlciBzcGVjaWZpYyBkZWZpbmVzCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ni0yMDEyIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAqCisgKiAgVGhlIGZ1bGwgTFpPIHBhY2thZ2UgY2FuIGJlIGZvdW5kIGF0OgorICogIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKyAqCisgKiAgQ2hhbmdlZCBmb3IgTGludXgga2VybmVsIHVzZSBieToKKyAqICBOaXRpbiBHdXB0YSA8bml0aW5ndXB0YTkxMEBnbWFpbC5jb20+CisgKiAgUmljaGFyZCBQdXJkaWUgPHJwdXJkaWVAb3BlbmVkaGFuZC5jb20+CisgKi8KKworCisjZGVmaW5lIENPUFk0KGRzdCwgc3JjKQlcCisJCXB1dF91bmFsaWduZWQoZ2V0X3VuYWxpZ25lZCgoY29uc3QgdTMyICopKHNyYykpLCAodTMyICopKGRzdCkpCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBDT1BZOChkc3QsIHNyYykJXAorCQlwdXRfdW5hbGlnbmVkKGdldF91bmFsaWduZWQoKGNvbnN0IHU2NCAqKShzcmMpKSwgKHU2NCAqKShkc3QpKQorI2Vsc2UKKyNkZWZpbmUgQ09QWTgoZHN0LCBzcmMpCVwKKwkJQ09QWTQoZHN0LCBzcmMpOyBDT1BZNCgoZHN0KSArIDQsIChzcmMpICsgNCkKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0JJR19FTkRJQU4pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOKQorI2Vycm9yICJjb25mbGljdGluZyBlbmRpYW4gZGVmaW5pdGlvbnMiCisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pCisjZGVmaW5lIExaT19VU0VfQ1RaNjQJMQorI2RlZmluZSBMWk9fVVNFX0NUWjMyCTEKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19wb3dlcnBjX18pCisjZGVmaW5lIExaT19VU0VfQ1RaMzIJMQorI2VsaWYgZGVmaW5lZChfX2FybV9fKSAmJiAoX19MSU5VWF9BUk1fQVJDSF9fID49IDUpCisjZGVmaW5lIExaT19VU0VfQ1RaMzIJMQorI2VuZGlmCisKKyNkZWZpbmUgTTFfTUFYX09GRlNFVAkweDA0MDAKKyNkZWZpbmUgTTJfTUFYX09GRlNFVAkweDA4MDAKKyNkZWZpbmUgTTNfTUFYX09GRlNFVAkweDQwMDAKKyNkZWZpbmUgTTRfTUFYX09GRlNFVAkweGJmZmYKKworI2RlZmluZSBNMV9NSU5fTEVOCTIKKyNkZWZpbmUgTTFfTUFYX0xFTgkyCisjZGVmaW5lIE0yX01JTl9MRU4JMworI2RlZmluZSBNMl9NQVhfTEVOCTgKKyNkZWZpbmUgTTNfTUlOX0xFTgkzCisjZGVmaW5lIE0zX01BWF9MRU4JMzMKKyNkZWZpbmUgTTRfTUlOX0xFTgkzCisjZGVmaW5lIE00X01BWF9MRU4JOQorCisjZGVmaW5lIE0xX01BUktFUgkwCisjZGVmaW5lIE0yX01BUktFUgk2NAorI2RlZmluZSBNM19NQVJLRVIJMzIKKyNkZWZpbmUgTTRfTUFSS0VSCTE2CisKKyNkZWZpbmUgbHpvX2RpY3RfdCAgICAgIHVuc2lnbmVkIHNob3J0CisjZGVmaW5lIERfQklUUwkJMTMKKyNkZWZpbmUgRF9TSVpFCQkoMXUgPDwgRF9CSVRTKQorI2RlZmluZSBEX01BU0sJCShEX1NJWkUgLSAxKQorI2RlZmluZSBEX0hJR0gJCSgoRF9NQVNLID4+IDEpICsgMSkKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21lbW9yeS1ub3RpZmllci1lcnJvci1pbmplY3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21lbW9yeS1ub3RpZmllci1lcnJvci1pbmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjIzOWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbWVtb3J5LW5vdGlmaWVyLWVycm9yLWluamVjdC5jCkBAIC0wLDAgKzEsNDggQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1vcnkuaD4KKworI2luY2x1ZGUgIm5vdGlmaWVyLWVycm9yLWluamVjdC5oIgorCitzdGF0aWMgaW50IHByaW9yaXR5OworbW9kdWxlX3BhcmFtKHByaW9yaXR5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmlvcml0eSwgInNwZWNpZnkgbWVtb3J5IG5vdGlmaWVyIHByaW9yaXR5Iik7CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfZXJyX2luamVjdCBtZW1vcnlfbm90aWZpZXJfZXJyX2luamVjdCA9IHsKKwkuYWN0aW9ucyA9IHsKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihNRU1fR09JTkdfT05MSU5FKSB9LAorCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKE1FTV9HT0lOR19PRkZMSU5FKSB9LAorCQl7fQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkaXI7CisKK3N0YXRpYyBpbnQgZXJyX2luamVjdF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWRpciA9IG5vdGlmaWVyX2Vycl9pbmplY3RfaW5pdCgibWVtb3J5Iiwgbm90aWZpZXJfZXJyX2luamVjdF9kaXIsCisJCQkJCSZtZW1vcnlfbm90aWZpZXJfZXJyX2luamVjdCwgcHJpb3JpdHkpOworCWlmIChJU19FUlIoZGlyKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlyKTsKKworCWVyciA9IHJlZ2lzdGVyX21lbW9yeV9ub3RpZmllcigmbWVtb3J5X25vdGlmaWVyX2Vycl9pbmplY3QubmIpOworCWlmIChlcnIpCisJCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkaXIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZXJyX2luamVjdF9leGl0KHZvaWQpCit7CisJdW5yZWdpc3Rlcl9tZW1vcnlfbm90aWZpZXIoJm1lbW9yeV9ub3RpZmllcl9lcnJfaW5qZWN0Lm5iKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKK30KKworbW9kdWxlX2luaXQoZXJyX2luamVjdF9pbml0KTsKK21vZHVsZV9leGl0KGVycl9pbmplY3RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigibWVtb3J5IG5vdGlmaWVyIGVycm9yIGluamVjdGlvbiBtb2R1bGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkFraW5vYnUgTWl0YSA8YWtpbm9idS5taXRhQGdtYWlsLmNvbT4iKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21lbXdlaWdodC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbWVtd2VpZ2h0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkZDcyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21lbXdlaWdodC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisKKy8qKgorICogbWVtd2VpZ2h0IC0gY291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBiaXRzIHNldCBpbiBtZW1vcnkgYXJlYQorICogQHB0cjogcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGFyZWEKKyAqIEBieXRlczogdGhlIHNpemUgb2YgdGhlIGFyZWEKKyAqLworc2l6ZV90IG1lbXdlaWdodChjb25zdCB2b2lkICpwdHIsIHNpemVfdCBieXRlcykKK3sKKwlzaXplX3QgcmV0ID0gMDsKKwlzaXplX3QgbG9uZ3M7CisJY29uc3QgdW5zaWduZWQgY2hhciAqYml0bWFwID0gcHRyOworCisJZm9yICg7IGJ5dGVzID4gMCAmJiAoKHVuc2lnbmVkIGxvbmcpYml0bWFwKSAlIHNpemVvZihsb25nKTsKKwkJCWJ5dGVzLS0sIGJpdG1hcCsrKQorCQlyZXQgKz0gaHdlaWdodDgoKmJpdG1hcCk7CisKKwlsb25ncyA9IGJ5dGVzIC8gc2l6ZW9mKGxvbmcpOworCWlmIChsb25ncykgeworCQlCVUdfT04obG9uZ3MgPj0gSU5UX01BWCAvIEJJVFNfUEVSX0xPTkcpOworCQlyZXQgKz0gYml0bWFwX3dlaWdodCgodW5zaWduZWQgbG9uZyAqKWJpdG1hcCwKKwkJCQlsb25ncyAqIEJJVFNfUEVSX0xPTkcpOworCQlieXRlcyAtPSBsb25ncyAqIHNpemVvZihsb25nKTsKKwkJYml0bWFwICs9IGxvbmdzICogc2l6ZW9mKGxvbmcpOworCX0KKwkvKgorCSAqIFRoZSByZWFzb24gdGhhdCB0aGlzIGxhc3QgbG9vcCBpcyBkaXN0aW5jdCBmcm9tIHRoZSBwcmVjZWRpbmcKKwkgKiBiaXRtYXBfd2VpZ2h0KCkgY2FsbCBpcyB0byBjb21wdXRlIDEtYml0cyBpbiB0aGUgbGFzdCByZWdpb24gc21hbGxlcgorCSAqIHRoYW4gc2l6ZW9mKGxvbmcpIHByb3Blcmx5IG9uIGJpZy1lbmRpYW4gc3lzdGVtcy4KKwkgKi8KKwlmb3IgKDsgYnl0ZXMgPiAwOyBieXRlcy0tLCBiaXRtYXArKykKKwkJcmV0ICs9IGh3ZWlnaHQ4KCpiaXRtYXApOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wobWVtd2VpZ2h0KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9NYWtlZmlsZSBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg3NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyMKKyMgTVBJIG11bHRpcHJlY2lzaW9uIG1hdGhzIGxpYnJhcnkgKGZyb20gZ3BnKQorIworCitvYmotJChDT05GSUdfTVBJTElCKSA9IG1waS5vCisKK21waS15ID0gXAorCWdlbmVyaWNfbXBpaC1sc2hpZnQubwkJXAorCWdlbmVyaWNfbXBpaC1tdWwxLm8JCVwKKwlnZW5lcmljX21waWgtbXVsMi5vCQlcCisJZ2VuZXJpY19tcGloLW11bDMubwkJXAorCWdlbmVyaWNfbXBpaC1yc2hpZnQubwkJXAorCWdlbmVyaWNfbXBpaC1zdWIxLm8JCVwKKwlnZW5lcmljX21waWgtYWRkMS5vCQlcCisJbXBpY29kZXIubwkJCVwKKwltcGktYml0Lm8JCQlcCisJbXBpLWNtcC5vCQkJXAorCW1waWgtY21wLm8JCQlcCisJbXBpaC1kaXYubwkJCVwKKwltcGloLW11bC5vCQkJXAorCW1waS1wb3cubwkJCVwKKwltcGl1dGlsLm8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtYWRkMS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2dlbmVyaWNfbXBpaC1hZGQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0YzdkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtYWRkMS5jCkBAIC0wLDAgKzEsNjEgQEAKKy8qIG1waWhlbHAtYWRkXzEuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5NywgMTk5OCwKKyAqICAgICAgICAgICAgICAgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHbnVQRy4KKyAqCisgKiBHbnVQRyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR251UEcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqCSBUaGUgR05VIE1QIExpYnJhcnkgaXRzZWxmIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgTEdQTDsKKyAqCSBob3dldmVyIEkgZGVjaWRlZCB0byBwdWJsaXNoIHRoaXMgY29kZSB1bmRlciB0aGUgcGxhaW4gR1BMLgorICovCisKKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcGlfbGltYl90CittcGloZWxwX2FkZF9uKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLAorCSAgICAgIG1waV9wdHJfdCBzMl9wdHIsIG1waV9zaXplX3Qgc2l6ZSkKK3sKKwltcGlfbGltYl90IHgsIHksIGN5OworCW1waV9zaXplX3QgajsKKworCS8qIFRoZSBsb29wIGNvdW50ZXIgYW5kIGluZGV4IEogZ29lcyBmcm9tIC1TSVpFIHRvIC0xLiAgVGhpcyB3YXkKKwkgICB0aGUgbG9vcCBiZWNvbWVzIGZhc3Rlci4gICovCisJaiA9IC1zaXplOworCisJLyogT2Zmc2V0IHRoZSBiYXNlIHBvaW50ZXJzIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZWdhdGl2ZSBpbmRpY2VzLiAqLworCXMxX3B0ciAtPSBqOworCXMyX3B0ciAtPSBqOworCXJlc19wdHIgLT0gajsKKworCWN5ID0gMDsKKwlkbyB7CisJCXkgPSBzMl9wdHJbal07CisJCXggPSBzMV9wdHJbal07CisJCXkgKz0gY3k7CS8qIGFkZCBwcmV2aW91cyBjYXJyeSB0byBvbmUgYWRkZW5kICovCisJCWN5ID0geSA8IGN5OwkvKiBnZXQgb3V0IGNhcnJ5IGZyb20gdGhhdCBhZGRpdGlvbiAqLworCQl5ICs9IHg7CQkvKiBhZGQgb3RoZXIgYWRkZW5kICovCisJCWN5ICs9IHkgPCB4OwkvKiBnZXQgb3V0IGNhcnJ5IGZyb20gdGhhdCBhZGQsIGNvbWJpbmUgKi8KKwkJcmVzX3B0cltqXSA9IHk7CisJfSB3aGlsZSAoKytqKTsKKworCXJldHVybiBjeTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtbHNoaWZ0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLWxzaGlmdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MzE4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLWxzaGlmdC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qIG1waWhlbHAtbHNoaWZ0LmMgIC0JTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5OCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHbnVQRy4KKyAqCisgKiBHbnVQRyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR251UEcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqCSBUaGUgR05VIE1QIExpYnJhcnkgaXRzZWxmIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgTEdQTDsKKyAqCSBob3dldmVyIEkgZGVjaWRlZCB0byBwdWJsaXNoIHRoaXMgY29kZSB1bmRlciB0aGUgcGxhaW4gR1BMLgorICovCisKKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKworLyogU2hpZnQgVSAocG9pbnRlZCB0byBieSBVUCBhbmQgVVNJWkUgZGlnaXRzIGxvbmcpIENOVCBiaXRzIHRvIHRoZSBsZWZ0CisgKiBhbmQgc3RvcmUgdGhlIFVTSVpFIGxlYXN0IHNpZ25pZmljYW50IGRpZ2l0cyBvZiB0aGUgcmVzdWx0IGF0IFdQLgorICogUmV0dXJuIHRoZSBiaXRzIHNoaWZ0ZWQgb3V0IGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgZGlnaXQuCisgKgorICogQXJndW1lbnQgY29uc3RyYWludHM6CisgKiAxLiAwIDwgQ05UIDwgQklUU19QRVJfTVBfTElNQgorICogMi4gSWYgdGhlIHJlc3VsdCBpcyB0byBiZSB3cml0dGVuIG92ZXIgdGhlIGlucHV0LCBXUCBtdXN0IGJlID49IFVQLgorICovCisKK21waV9saW1iX3QKK21waWhlbHBfbHNoaWZ0KG1waV9wdHJfdCB3cCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLCB1bnNpZ25lZCBpbnQgY250KQoreworCW1waV9saW1iX3QgaGlnaF9saW1iLCBsb3dfbGltYjsKKwl1bnNpZ25lZCBzaF8xLCBzaF8yOworCW1waV9zaXplX3QgaTsKKwltcGlfbGltYl90IHJldHZhbDsKKworCXNoXzEgPSBjbnQ7CisJd3AgKz0gMTsKKwlzaF8yID0gQklUU19QRVJfTVBJX0xJTUIgLSBzaF8xOworCWkgPSB1c2l6ZSAtIDE7CisJbG93X2xpbWIgPSB1cFtpXTsKKwlyZXR2YWwgPSBsb3dfbGltYiA+PiBzaF8yOworCWhpZ2hfbGltYiA9IGxvd19saW1iOworCXdoaWxlICgtLWkgPj0gMCkgeworCQlsb3dfbGltYiA9IHVwW2ldOworCQl3cFtpXSA9IChoaWdoX2xpbWIgPDwgc2hfMSkgfCAobG93X2xpbWIgPj4gc2hfMik7CisJCWhpZ2hfbGltYiA9IGxvd19saW1iOworCX0KKwl3cFtpXSA9IGhpZ2hfbGltYiA8PCBzaF8xOworCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtbXVsMS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2dlbmVyaWNfbXBpaC1tdWwxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY2OGRmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtbXVsMS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8qIG1waWhlbHAtbXVsXzEuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5NywgMTk5OCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHbnVQRy4KKyAqCisgKiBHbnVQRyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR251UEcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqCSBUaGUgR05VIE1QIExpYnJhcnkgaXRzZWxmIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgTEdQTDsKKyAqCSBob3dldmVyIEkgZGVjaWRlZCB0byBwdWJsaXNoIHRoaXMgY29kZSB1bmRlciB0aGUgcGxhaW4gR1BMLgorICovCisKKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCittcGlfbGltYl90CittcGloZWxwX211bF8xKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLCBtcGlfc2l6ZV90IHMxX3NpemUsCisJICAgICAgbXBpX2xpbWJfdCBzMl9saW1iKQoreworCW1waV9saW1iX3QgY3lfbGltYjsKKwltcGlfc2l6ZV90IGo7CisJbXBpX2xpbWJfdCBwcm9kX2hpZ2gsIHByb2RfbG93OworCisJLyogVGhlIGxvb3AgY291bnRlciBhbmQgaW5kZXggSiBnb2VzIGZyb20gLVMxX1NJWkUgdG8gLTEuICBUaGlzIHdheQorCSAqIHRoZSBsb29wIGJlY29tZXMgZmFzdGVyLiAgKi8KKwlqID0gLXMxX3NpemU7CisKKwkvKiBPZmZzZXQgdGhlIGJhc2UgcG9pbnRlcnMgdG8gY29tcGVuc2F0ZSBmb3IgdGhlIG5lZ2F0aXZlIGluZGljZXMuICAqLworCXMxX3B0ciAtPSBqOworCXJlc19wdHIgLT0gajsKKworCWN5X2xpbWIgPSAwOworCWRvIHsKKwkJdW11bF9wcG1tKHByb2RfaGlnaCwgcHJvZF9sb3csIHMxX3B0cltqXSwgczJfbGltYik7CisJCXByb2RfbG93ICs9IGN5X2xpbWI7CisJCWN5X2xpbWIgPSAocHJvZF9sb3cgPCBjeV9saW1iID8gMSA6IDApICsgcHJvZF9oaWdoOworCQlyZXNfcHRyW2pdID0gcHJvZF9sb3c7CisJfSB3aGlsZSAoKytqKTsKKworCXJldHVybiBjeV9saW1iOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2dlbmVyaWNfbXBpaC1tdWwyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLW11bDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTdiMjllCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2dlbmVyaWNfbXBpaC1tdWwyLmMKQEAgLTAsMCArMSw2MCBAQAorLyogbXBpaGVscC1tdWxfMi5jICAtICBNUEkgaGVscGVyIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICoJIFRoZSBHTlUgTVAgTGlicmFyeSBpdHNlbGYgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSBMR1BMOworICoJIGhvd2V2ZXIgSSBkZWNpZGVkIHRvIHB1Ymxpc2ggdGhpcyBjb2RlIHVuZGVyIHRoZSBwbGFpbiBHUEwuCisgKi8KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKK21waV9saW1iX3QKK21waWhlbHBfYWRkbXVsXzEobXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsCisJCSBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYikKK3sKKwltcGlfbGltYl90IGN5X2xpbWI7CisJbXBpX3NpemVfdCBqOworCW1waV9saW1iX3QgcHJvZF9oaWdoLCBwcm9kX2xvdzsKKwltcGlfbGltYl90IHg7CisKKwkvKiBUaGUgbG9vcCBjb3VudGVyIGFuZCBpbmRleCBKIGdvZXMgZnJvbSAtU0laRSB0byAtMS4gIFRoaXMgd2F5CisJICogdGhlIGxvb3AgYmVjb21lcyBmYXN0ZXIuICAqLworCWogPSAtczFfc2l6ZTsKKwlyZXNfcHRyIC09IGo7CisJczFfcHRyIC09IGo7CisKKwljeV9saW1iID0gMDsKKwlkbyB7CisJCXVtdWxfcHBtbShwcm9kX2hpZ2gsIHByb2RfbG93LCBzMV9wdHJbal0sIHMyX2xpbWIpOworCisJCXByb2RfbG93ICs9IGN5X2xpbWI7CisJCWN5X2xpbWIgPSAocHJvZF9sb3cgPCBjeV9saW1iID8gMSA6IDApICsgcHJvZF9oaWdoOworCisJCXggPSByZXNfcHRyW2pdOworCQlwcm9kX2xvdyA9IHggKyBwcm9kX2xvdzsKKwkJY3lfbGltYiArPSBwcm9kX2xvdyA8IHggPyAxIDogMDsKKwkJcmVzX3B0cltqXSA9IHByb2RfbG93OworCX0gd2hpbGUgKCsraik7CisJcmV0dXJuIGN5X2xpbWI7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLW11bDMuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtbXVsMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NmRmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLW11bDMuYwpAQCAtMCwwICsxLDYxIEBACisvKiBtcGloZWxwLW11bF8zLmMgIC0gIE1QSSBoZWxwZXIgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR251UEcuCisgKgorICogR251UEcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdudVBHIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKgkgVGhlIEdOVSBNUCBMaWJyYXJ5IGl0c2VsZiBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIExHUEw7CisgKgkgaG93ZXZlciBJIGRlY2lkZWQgdG8gcHVibGlzaCB0aGlzIGNvZGUgdW5kZXIgdGhlIHBsYWluIEdQTC4KKyAqLworCisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworbXBpX2xpbWJfdAorbXBpaGVscF9zdWJtdWxfMShtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJIG1waV9zaXplX3QgczFfc2l6ZSwgbXBpX2xpbWJfdCBzMl9saW1iKQoreworCW1waV9saW1iX3QgY3lfbGltYjsKKwltcGlfc2l6ZV90IGo7CisJbXBpX2xpbWJfdCBwcm9kX2hpZ2gsIHByb2RfbG93OworCW1waV9saW1iX3QgeDsKKworCS8qIFRoZSBsb29wIGNvdW50ZXIgYW5kIGluZGV4IEogZ29lcyBmcm9tIC1TSVpFIHRvIC0xLiAgVGhpcyB3YXkKKwkgKiB0aGUgbG9vcCBiZWNvbWVzIGZhc3Rlci4gICovCisJaiA9IC1zMV9zaXplOworCXJlc19wdHIgLT0gajsKKwlzMV9wdHIgLT0gajsKKworCWN5X2xpbWIgPSAwOworCWRvIHsKKwkJdW11bF9wcG1tKHByb2RfaGlnaCwgcHJvZF9sb3csIHMxX3B0cltqXSwgczJfbGltYik7CisKKwkJcHJvZF9sb3cgKz0gY3lfbGltYjsKKwkJY3lfbGltYiA9IChwcm9kX2xvdyA8IGN5X2xpbWIgPyAxIDogMCkgKyBwcm9kX2hpZ2g7CisKKwkJeCA9IHJlc19wdHJbal07CisJCXByb2RfbG93ID0geCAtIHByb2RfbG93OworCQljeV9saW1iICs9IHByb2RfbG93ID4geCA/IDEgOiAwOworCQlyZXNfcHRyW2pdID0gcHJvZF9sb3c7CisJfSB3aGlsZSAoKytqKTsKKworCXJldHVybiBjeV9saW1iOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2dlbmVyaWNfbXBpaC1yc2hpZnQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtcnNoaWZ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZhMzI4OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtcnNoaWZ0LmMKQEAgLTAsMCArMSw2MyBAQAorLyogbXBpaC1yc2hpZnQuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5OCwgMTk5OSwKKyAqICAgICAgICAgICAgICAgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlVQRworICoKKyAqIEdOVVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHTlVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICoJIFRoZSBHTlUgTVAgTGlicmFyeSBpdHNlbGYgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSBMR1BMOworICoJIGhvd2V2ZXIgSSBkZWNpZGVkIHRvIHB1Ymxpc2ggdGhpcyBjb2RlIHVuZGVyIHRoZSBwbGFpbiBHUEwuCisgKi8KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCisvKiBTaGlmdCBVIChwb2ludGVkIHRvIGJ5IFVQIGFuZCBVU0laRSBsaW1icyBsb25nKSBDTlQgYml0cyB0byB0aGUgcmlnaHQKKyAqIGFuZCBzdG9yZSB0aGUgVVNJWkUgbGVhc3Qgc2lnbmlmaWNhbnQgbGltYnMgb2YgdGhlIHJlc3VsdCBhdCBXUC4KKyAqIFRoZSBiaXRzIHNoaWZ0ZWQgb3V0IHRvIHRoZSByaWdodCBhcmUgcmV0dXJuZWQuCisgKgorICogQXJndW1lbnQgY29uc3RyYWludHM6CisgKiAxLiAwIDwgQ05UIDwgQklUU19QRVJfTVBfTElNQgorICogMi4gSWYgdGhlIHJlc3VsdCBpcyB0byBiZSB3cml0dGVuIG92ZXIgdGhlIGlucHV0LCBXUCBtdXN0IGJlIDw9IFVQLgorICovCisKK21waV9saW1iX3QKK21waWhlbHBfcnNoaWZ0KG1waV9wdHJfdCB3cCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLCB1bnNpZ25lZCBjbnQpCit7CisJbXBpX2xpbWJfdCBoaWdoX2xpbWIsIGxvd19saW1iOworCXVuc2lnbmVkIHNoXzEsIHNoXzI7CisJbXBpX3NpemVfdCBpOworCW1waV9saW1iX3QgcmV0dmFsOworCisJc2hfMSA9IGNudDsKKwl3cCAtPSAxOworCXNoXzIgPSBCSVRTX1BFUl9NUElfTElNQiAtIHNoXzE7CisJaGlnaF9saW1iID0gdXBbMF07CisJcmV0dmFsID0gaGlnaF9saW1iIDw8IHNoXzI7CisJbG93X2xpbWIgPSBoaWdoX2xpbWI7CisJZm9yIChpID0gMTsgaSA8IHVzaXplOyBpKyspIHsKKwkJaGlnaF9saW1iID0gdXBbaV07CisJCXdwW2ldID0gKGxvd19saW1iID4+IHNoXzEpIHwgKGhpZ2hfbGltYiA8PCBzaF8yKTsKKwkJbG93X2xpbWIgPSBoaWdoX2xpbWI7CisJfQorCXdwW2ldID0gbG93X2xpbWIgPj4gc2hfMTsKKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLXN1YjEuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9nZW5lcmljX21waWgtc3ViMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOThhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvZ2VuZXJpY19tcGloLXN1YjEuYwpAQCAtMCwwICsxLDYwIEBACisvKiBtcGloZWxwLWFkZF8yLmMgIC0gIE1QSSBoZWxwZXIgZnVuY3Rpb25zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQsIDE5OTYsIDE5OTcsIDE5OTgsIDIwMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR251UEcuCisgKgorICogR251UEcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdudVBHIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqCisgKiBOb3RlOiBUaGlzIGNvZGUgaXMgaGVhdmlseSBiYXNlZCBvbiB0aGUgR05VIE1QIExpYnJhcnkuCisgKgkgQWN0dWFsbHkgaXQncyB0aGUgc2FtZSBjb2RlIHdpdGggb25seSBtaW5vciBjaGFuZ2VzIGluIHRoZQorICoJIHdheSB0aGUgZGF0YSBpcyBzdG9yZWQ7IHRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYWJzdHJhY3Rpb24KKyAqCSBvZiBhbiBvcHRpb25hbCBzZWN1cmUgbWVtb3J5IGFsbG9jYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQKKyAqCSB0byBhdm9pZCByZXZlYWxpbmcgb2Ygc2Vuc2l0aXZlIGRhdGEgZHVlIHRvIHBhZ2luZyBldGMuCisgKgkgVGhlIEdOVSBNUCBMaWJyYXJ5IGl0c2VsZiBpcyBwdWJsaXNoZWQgdW5kZXIgdGhlIExHUEw7CisgKgkgaG93ZXZlciBJIGRlY2lkZWQgdG8gcHVibGlzaCB0aGlzIGNvZGUgdW5kZXIgdGhlIHBsYWluIEdQTC4KKyAqLworCisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworbXBpX2xpbWJfdAorbXBpaGVscF9zdWJfbihtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkgICAgICBtcGlfcHRyX3QgczJfcHRyLCBtcGlfc2l6ZV90IHNpemUpCit7CisJbXBpX2xpbWJfdCB4LCB5LCBjeTsKKwltcGlfc2l6ZV90IGo7CisKKwkvKiBUaGUgbG9vcCBjb3VudGVyIGFuZCBpbmRleCBKIGdvZXMgZnJvbSAtU0laRSB0byAtMS4gIFRoaXMgd2F5CisJICAgdGhlIGxvb3AgYmVjb21lcyBmYXN0ZXIuICAqLworCWogPSAtc2l6ZTsKKworCS8qIE9mZnNldCB0aGUgYmFzZSBwb2ludGVycyB0byBjb21wZW5zYXRlIGZvciB0aGUgbmVnYXRpdmUgaW5kaWNlcy4gICovCisJczFfcHRyIC09IGo7CisJczJfcHRyIC09IGo7CisJcmVzX3B0ciAtPSBqOworCisJY3kgPSAwOworCWRvIHsKKwkJeSA9IHMyX3B0cltqXTsKKwkJeCA9IHMxX3B0cltqXTsKKwkJeSArPSBjeTsJLyogYWRkIHByZXZpb3VzIGNhcnJ5IHRvIHN1YnRyYWhlbmQgKi8KKwkJY3kgPSB5IDwgY3k7CS8qIGdldCBvdXQgY2FycnkgZnJvbSB0aGF0IGFkZGl0aW9uICovCisJCXkgPSB4IC0geTsJLyogbWFpbiBzdWJ0cmFjdCAqLworCQljeSArPSB5ID4geDsJLyogZ2V0IG91dCBjYXJyeSBmcm9tIHRoZSBzdWJ0cmFjdCwgY29tYmluZSAqLworCQlyZXNfcHRyW2pdID0geTsKKwl9IHdoaWxlICgrK2opOworCisJcmV0dXJuIGN5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2xvbmdsb25nLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbG9uZ2xvbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzUyMjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL2xvbmdsb25nLmgKQEAgLTAsMCArMSwxMzk1IEBACisvKiBsb25nbG9uZy5oIC0tIGRlZmluaXRpb25zIGZvciBtaXhlZCBzaXplIDMyLzY0IGJpdCBhcml0aG1ldGljLgorICogTm90ZTogSSBhZGRlZCBzb21lIHN0dWZmIGZvciB1c2Ugd2l0aCBnbnVwZworICoKKyAqIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NiwgMTk5OCwKKyAqCTIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCisgKiBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgZmlsZTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3LCBVU0EuICovCisKKyNpbmNsdWRlIDxsaW51eC9jb3VudF96ZXJvcy5oPgorCisvKiBZb3UgaGF2ZSB0byBkZWZpbmUgdGhlIGZvbGxvd2luZyBiZWZvcmUgaW5jbHVkaW5nIHRoaXMgZmlsZToKKyAqCisgKiBVV3R5cGUgLS0gQW4gdW5zaWduZWQgdHlwZSwgZGVmYXVsdCB0eXBlIGZvciBvcGVyYXRpb25zICh0eXBpY2FsbHkgYSAid29yZCIpCisgKiBVSFd0eXBlIC0tIEFuIHVuc2lnbmVkIHR5cGUsIGF0IGxlYXN0IGhhbGYgdGhlIHNpemUgb2YgVVd0eXBlLgorICogVURXdHlwZSAtLSBBbiB1bnNpZ25lZCB0eXBlLCBhdCBsZWFzdCB0d2ljZSBhcyBsYXJnZSBhIFVXdHlwZQorICogV19UWVBFX1NJWkUgLS0gc2l6ZSBpbiBiaXRzIG9mIFVXdHlwZQorICoKKyAqIFNJdHlwZSwgVVNJdHlwZSAtLSBTaWduZWQgYW5kIHVuc2lnbmVkIDMyIGJpdCB0eXBlcy4KKyAqIERJdHlwZSwgVURJdHlwZSAtLSBTaWduZWQgYW5kIHVuc2lnbmVkIDY0IGJpdCB0eXBlcy4KKyAqCisgKiBPbiBhIDMyIGJpdCBtYWNoaW5lIFVXdHlwZSBzaG91bGQgdHlwaWNhbGx5IGJlIFVTSXR5cGU7CisgKiBvbiBhIDY0IGJpdCBtYWNoaW5lLCBVV3R5cGUgc2hvdWxkIHR5cGljYWxseSBiZSBVREl0eXBlLgorKi8KKworI2RlZmluZSBfX0JJVFM0IChXX1RZUEVfU0laRSAvIDQpCisjZGVmaW5lIF9fbGxfQiAoKFVXdHlwZSkgMSA8PCAoV19UWVBFX1NJWkUgLyAyKSkKKyNkZWZpbmUgX19sbF9sb3dwYXJ0KHQpICgoVVd0eXBlKSAodCkgJiAoX19sbF9CIC0gMSkpCisjZGVmaW5lIF9fbGxfaGlnaHBhcnQodCkgKChVV3R5cGUpICh0KSA+PiAoV19UWVBFX1NJWkUgLyAyKSkKKworLyogVGhpcyBpcyB1c2VkIHRvIG1ha2Ugc3VyZSBubyB1bmRlc2lyYWJsZSBzaGFyaW5nIGJldHdlZW4gZGlmZmVyZW50IGxpYnJhcmllcworCXRoYXQgdXNlIHRoaXMgZmlsZSB0YWtlcyBwbGFjZS4gICovCisjaWZuZGVmIF9fTVBOCisjZGVmaW5lIF9fTVBOKHgpIF9fIyN4CisjZW5kaWYKKworLyogRGVmaW5lIGF1eGlsaWFyeSBhc20gbWFjcm9zLgorICoKKyAqIDEpIHVtdWxfcHBtbShoaWdoX3Byb2QsIGxvd19wcm9kLCBtdWx0aXBsZXIsIG11bHRpcGxpY2FuZCkgbXVsdGlwbGllcyB0d28KKyAqIFVXdHlwZSBpbnRlZ2VycyBNVUxUSVBMRVIgYW5kIE1VTFRJUExJQ0FORCwgYW5kIGdlbmVyYXRlcyBhIHR3byBVV3R5cGUKKyAqIHdvcmQgcHJvZHVjdCBpbiBISUdIX1BST0QgYW5kIExPV19QUk9ELgorICoKKyAqIDIpIF9fdW11bHNpZGkzKGEsYikgbXVsdGlwbGllcyB0d28gVVd0eXBlIGludGVnZXJzIEEgYW5kIEIsIGFuZCByZXR1cm5zIGEKKyAqIFVEV3R5cGUgcHJvZHVjdC4gIFRoaXMgaXMganVzdCBhIHZhcmlhbnQgb2YgdW11bF9wcG1tLgorCisgKiAzKSB1ZGl2X3Fybm5kKHF1b3RpZW50LCByZW1haW5kZXIsIGhpZ2hfbnVtZXJhdG9yLCBsb3dfbnVtZXJhdG9yLAorICogZGVub21pbmF0b3IpIGRpdmlkZXMgYSBVRFd0eXBlLCBjb21wb3NlZCBieSB0aGUgVVd0eXBlIGludGVnZXJzCisgKiBISUdIX05VTUVSQVRPUiBhbmQgTE9XX05VTUVSQVRPUiwgYnkgREVOT01JTkFUT1IgYW5kIHBsYWNlcyB0aGUgcXVvdGllbnQKKyAqIGluIFFVT1RJRU5UIGFuZCB0aGUgcmVtYWluZGVyIGluIFJFTUFJTkRFUi4JSElHSF9OVU1FUkFUT1IgbXVzdCBiZSBsZXNzCisgKiB0aGFuIERFTk9NSU5BVE9SIGZvciBjb3JyZWN0IG9wZXJhdGlvbi4gIElmLCBpbiBhZGRpdGlvbiwgdGhlIG1vc3QKKyAqIHNpZ25pZmljYW50IGJpdCBvZiBERU5PTUlOQVRPUiBtdXN0IGJlIDEsIHRoZW4gdGhlIHByZS1wcm9jZXNzb3Igc3ltYm9sCisgKiBVRElWX05FRURTX05PUk1BTElaQVRJT04gaXMgZGVmaW5lZCB0byAxLgorICogNCkgc2Rpdl9xcm5uZChxdW90aWVudCwgcmVtYWluZGVyLCBoaWdoX251bWVyYXRvciwgbG93X251bWVyYXRvciwKKyAqIGRlbm9taW5hdG9yKS4gIExpa2UgdWRpdl9xcm5uZCBidXQgdGhlIG51bWJlcnMgYXJlIHNpZ25lZC4gIFRoZSBxdW90aWVudAorICogaXMgcm91bmRlZCB0b3dhcmRzIDAuCisgKgorICogNSkgY291bnRfbGVhZGluZ196ZXJvcyhjb3VudCwgeCkgY291bnRzIHRoZSBudW1iZXIgb2YgemVyby1iaXRzIGZyb20gdGhlCisgKiBtc2IgdG8gdGhlIGZpcnN0IG5vbi16ZXJvIGJpdCBpbiB0aGUgVVd0eXBlIFguICBUaGlzIGlzIHRoZSBudW1iZXIgb2YKKyAqIHN0ZXBzIFggbmVlZHMgdG8gYmUgc2hpZnRlZCBsZWZ0IHRvIHNldCB0aGUgbXNiLiAgVW5kZWZpbmVkIGZvciBYID09IDAsCisgKiB1bmxlc3MgdGhlIHN5bWJvbCBDT1VOVF9MRUFESU5HX1pFUk9TXzAgaXMgZGVmaW5lZCB0byBzb21lIHZhbHVlLgorICoKKyAqIDYpIGNvdW50X3RyYWlsaW5nX3plcm9zKGNvdW50LCB4KSBsaWtlIGNvdW50X2xlYWRpbmdfemVyb3MsIGJ1dCBjb3VudHMKKyAqIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGVuZC4KKyAqCisgKiA3KSBhZGRfc3NhYWFhKGhpZ2hfc3VtLCBsb3dfc3VtLCBoaWdoX2FkZGVuZF8xLCBsb3dfYWRkZW5kXzEsCisgKiBoaWdoX2FkZGVuZF8yLCBsb3dfYWRkZW5kXzIpIGFkZHMgdHdvIFVXdHlwZSBpbnRlZ2VycywgY29tcG9zZWQgYnkKKyAqIEhJR0hfQURERU5EXzEgYW5kIExPV19BRERFTkRfMSwgYW5kIEhJR0hfQURERU5EXzIgYW5kIExPV19BRERFTkRfMgorICogcmVzcGVjdGl2ZWx5LiAgVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gSElHSF9TVU0gYW5kIExPV19TVU0uICBPdmVyZmxvdworICogKGkuZS4gY2Fycnkgb3V0KSBpcyBub3Qgc3RvcmVkIGFueXdoZXJlLCBhbmQgaXMgbG9zdC4KKyAqCisgKiA4KSBzdWJfZGRtbXNzKGhpZ2hfZGlmZmVyZW5jZSwgbG93X2RpZmZlcmVuY2UsIGhpZ2hfbWludWVuZCwgbG93X21pbnVlbmQsCisgKiBoaWdoX3N1YnRyYWhlbmQsIGxvd19zdWJ0cmFoZW5kKSBzdWJ0cmFjdHMgdHdvIHR3by13b3JkIFVXdHlwZSBpbnRlZ2VycywKKyAqIGNvbXBvc2VkIGJ5IEhJR0hfTUlOVUVORF8xIGFuZCBMT1dfTUlOVUVORF8xLCBhbmQgSElHSF9TVUJUUkFIRU5EXzIgYW5kCisgKiBMT1dfU1VCVFJBSEVORF8yIHJlc3BlY3RpdmVseS4gIFRoZSByZXN1bHQgaXMgcGxhY2VkIGluIEhJR0hfRElGRkVSRU5DRQorICogYW5kIExPV19ESUZGRVJFTkNFLglPdmVyZmxvdyAoaS5lLiBjYXJyeSBvdXQpIGlzIG5vdCBzdG9yZWQgYW55d2hlcmUsCisgKiBhbmQgaXMgbG9zdC4KKyAqCisgKiBJZiBhbnkgb2YgdGhlc2UgbWFjcm9zIGFyZSBsZWZ0IHVuZGVmaW5lZCBmb3IgYSBwYXJ0aWN1bGFyIENQVSwKKyAqIEMgbWFjcm9zIGFyZSB1c2VkLiAgKi8KKworLyogVGhlIENQVXMgY29tZSBpbiBhbHBoYWJldGljYWwgb3JkZXIgYmVsb3cuCisgKgorICogUGxlYXNlIGFkZCBzdXBwb3J0IGZvciBtb3JlIENQVXMgaGVyZSwgb3IgaW1wcm92ZSB0aGUgY3VycmVudCBzdXBwb3J0CisgKiBmb3IgdGhlIENQVXMgYmVsb3chCSovCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChOT19BU00pCisKKy8qIFdlIHNvbWV0aW1lcyBuZWVkIHRvIGNsb2JiZXIgImNjIiB3aXRoIGdjYzIsIGJ1dCB0aGF0IHdvdWxkIG5vdCBiZQorCXVuZGVyc3Rvb2QgYnkgZ2NjMS4JVXNlIGNwcCB0byBhdm9pZCBtYWpvciBjb2RlIGR1cGxpY2F0aW9uLiAgKi8KKyNpZiBfX0dOVUNfXyA8IDIKKyNkZWZpbmUgX19DTE9CQkVSX0NDCisjZGVmaW5lIF9fQU5EX0NMT0JCRVJfQ0MKKyNlbHNlIC8qIF9fR05VQ19fID49IDIgKi8KKyNkZWZpbmUgX19DTE9CQkVSX0NDIDogImNjIgorI2RlZmluZSBfX0FORF9DTE9CQkVSX0NDICwgImNjIgorI2VuZGlmIC8qIF9fR05VQ19fIDwgMiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIEEyOUsgICoqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIChkZWZpbmVkKF9fYTI5a19fKSB8fCBkZWZpbmVkKF9BTTI5SykpICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJhZGQgJTEsJTQsJTVcbiIgXAorCQkiYWRkYyAlMCwlMiwlMyIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkJIj0mciIgKChVU0l0eXBlKShzbCkpIFwKKwk6ICIlciIgKChVU0l0eXBlKShhaCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShiaCkpLCBcCisJCSIlciIgKChVU0l0eXBlKShhbCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3ViICUxLCU0LCU1XG4iIFwKKwkJInN1YmMgJTAsJTIsJTMiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShzaCkpLCBcCisJCSI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiciIgKChVU0l0eXBlKShhaCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShiaCkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkJInJJIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorZG8geyBcCisJCVVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOyBcCisJCV9fYXNtX18gKCJtdWx0aXBsdSAlMCwlMSwlMiIgXAorCQk6ICI9ciIgKChVU0l0eXBlKSh4bCkpIFwKKwkJOiAiciIgKF9fbTApLCBcCisJCQkiciIgKF9fbTEpKTsgXAorCQlfX2FzbV9fICgibXVsdG11ICUwLCUxLCUyIiBcCisJCTogIj1yIiAoKFVTSXR5cGUpKHhoKSkgXAorCQk6ICJyIiAoX19tMCksIFwKKwkJCSJyIiAoX19tMSkpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorCV9fYXNtX18gKCJkaXZpZHUgJTAsJTMsJTQiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShxKSksIFwKKwkJIj1xIiAoKFVTSXR5cGUpKHIpKSBcCisJOiAiMSIgKChVU0l0eXBlKShuMSkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKG4wKSksIFwKKwkJInIiICgoVVNJdHlwZSkoZCkpKQorI2VuZGlmIC8qIF9fYTI5a19fICovCisKKyNpZiBkZWZpbmVkKF9fYWxwaGEpICYmIFdfVFlQRV9TSVpFID09IDY0CisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkJCQlcCitkbyB7CQkJCQkJCVwKKwlVREl0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsJCVwKKwkocGgpID0gX19idWlsdGluX2FscGhhX3VtdWxoKF9fbTAsIF9fbTEpOwlcCisJKHBsKSA9IF9fbTAgKiBfX20xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVU1VTF9USU1FIDQ2CisjaWZuZGVmIExPTkdMT05HX1NUQU5EQUxPTkUKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKK2RvIHsgVURJdHlwZSBfX3I7IFwKKwkocSkgPSBfX3VkaXZfcXJubmQoJl9fciwgKG4xKSwgKG4wKSwgKGQpKTsgXAorCShyKSA9IF9fcjsgXAorfSB3aGlsZSAoMCkKK2V4dGVybiBVREl0eXBlIF9fdWRpdl9xcm5uZChVREl0eXBlICosIFVESXR5cGUsIFVESXR5cGUsIFVESXR5cGUpOworI2RlZmluZSBVRElWX1RJTUUgMjIwCisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2VuZGlmIC8qIF9fYWxwaGEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBBUk0gICoqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJhZGRzICUxLCAlNCwgJTVcbiIgXAorCQkiYWRjICAlMCwgJTIsICUzIiBcCisJOiAiPXIiIChzaCksIFwKKwkJIj0mciIgKHNsKSBcCisJOiAiJXIiICgoVVNJdHlwZSkoYWgpKSwgXAorCQkickkiICgoVVNJdHlwZSkoYmgpKSwgXAorCQkiJXIiICgoVVNJdHlwZSkoYWwpKSwgXAorCQkickkiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoInN1YnMgJTEsICU0LCAlNVxuIiBcCisJCSJzYmMgICUwLCAlMiwgJTMiIFwKKwk6ICI9ciIgKHNoKSwgXAorCQkiPSZyIiAoc2wpIFwKKwk6ICJyIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkJInJJIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkJInIiICgoVVNJdHlwZSkoYWwpKSwgXAorCQkickkiICgoVVNJdHlwZSkoYmwpKSkKKyNpZiBkZWZpbmVkIF9fQVJNX0FSQ0hfMl9fIHx8IGRlZmluZWQgX19BUk1fQVJDSF8zX18KKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAorCV9fYXNtX18gKCJAIElubGluZWQgdW11bF9wcG1tXG4iIFwKKwkJIm1vdgklfHIwLCAlMiwgbHNyICMxNgkJQCBBQUFBXG4iIFwKKwkJIm1vdgklfHIyLCAlMywgbHNyICMxNgkJQCBCQkJCXG4iIFwKKwkJImJpYwklfHIxLCAlMiwgJXxyMCwgbHNsICMxNgkJQCBhYWFhXG4iIFwKKwkJImJpYwklMCwgJTMsICV8cjIsIGxzbCAjMTYJCUAgYmJiYlxuIiBcCisJCSJtdWwJJTEsICV8cjEsICV8cjIJCQlAIGFhYWEgKiBCQkJCXG4iIFwKKwkJIm11bAklfHIyLCAlfHIwLCAlfHIyCQlAIEFBQUEgKiBCQkJCXG4iIFwKKwkJIm11bAklfHIxLCAlMCwgJXxyMQkJCUAgYWFhYSAqIGJiYmJcbiIgXAorCQkibXVsCSUwLCAlfHIwLCAlMAkJCUAgQUFBQSAqIGJiYmJcbiIgXAorCQkiYWRkcwklfHIwLCAlMSwgJTAJCQlAIGNlbnRyYWwgc3VtXG4iIFwKKwkJImFkZGNzCSV8cjIsICV8cjIsICM2NTUzNlxuIiBcCisJCSJhZGRzCSUxLCAlfHIxLCAlfHIwLCBsc2wgIzE2XG4iIFwKKwkJImFkYwklMCwgJXxyMiwgJXxyMCwgbHNyICMxNiIgXAorCTogIj0mciIgKHhoKSwgXAorCQkiPXIiICh4bCkgXAorCTogInIiICgoVVNJdHlwZSkoYSkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKGIpKSBcCisJOiAicjAiLCAicjEiLCAicjIiKQorI2Vsc2UKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAorCV9fYXNtX18gKCJAIElubGluZWQgdW11bF9wcG1tXG4iIFwKKwkJInVtdWxsICUxLCAlMCwgJTIsICUzIiBcCisJOiAiPSZyIiAoeGgpLCBcCisJCSI9JnIiICh4bCkgXAorCTogInIiICgoVVNJdHlwZSkoYSkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKGIpKSBcCisJOiAicjAiLCAicjEiKQorI2VuZGlmCisjZGVmaW5lIFVNVUxfVElNRSAyMAorI2RlZmluZSBVRElWX1RJTUUgMTAwCisjZW5kaWYgLyogX19hcm1fXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIENMSVBQRVIgICoqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19jbGlwcGVyX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKwkoe3VuaW9uIHtVREl0eXBlIF9fbGw7IFwKKwkJc3RydWN0IHtVU0l0eXBlIF9fbCwgX19oOyB9IF9faTsgXAorCX0gX194eDsgXAorCV9fYXNtX18gKCJtdWx3dXggJTIsJTAiIFwKKwk6ICI9ciIgKF9feHguX19sbCkgXAorCTogIiUwIiAoKFVTSXR5cGUpKHUpKSwgXAorCQkiciIgKChVU0l0eXBlKSh2KSkpOyBcCisJKHcxKSA9IF9feHguX19pLl9faDsgKHcwKSA9IF9feHguX19pLl9fbDsgfSkKKyNkZWZpbmUgc211bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorCSh7dW5pb24ge0RJdHlwZSBfX2xsOyBcCisJCXN0cnVjdCB7U0l0eXBlIF9fbCwgX19oOyB9IF9faTsgXAorCX0gX194eDsgXAorCV9fYXNtX18gKCJtdWx3eCAlMiwlMCIgXAorCTogIj1yIiAoX194eC5fX2xsKSBcCisJOiAiJTAiICgoU0l0eXBlKSh1KSksIFwKKwkJInIiICgoU0l0eXBlKSh2KSkpOyBcCisJKHcxKSA9IF9feHguX19pLl9faDsgKHcwKSA9IF9feHguX19pLl9fbDsgfSkKKyNkZWZpbmUgX191bXVsc2lkaTModSwgdikgXAorCSh7VURJdHlwZSBfX3c7IFwKKwlfX2FzbV9fICgibXVsd3V4ICUyLCUwIiBcCisJOiAiPXIiIChfX3cpIFwKKwk6ICIlMCIgKChVU0l0eXBlKSh1KSksIFwKKwkJInIiICgoVVNJdHlwZSkodikpKTsgXAorCV9fdzsgfSkKKyNlbmRpZiAvKiBfX2NsaXBwZXJfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIEdNSUNSTyAgKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19nbWljcm9fXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoImFkZC53ICU1LCUxXG4iIFwKKwkJImFkZHggJTMsJTAiIFwKKwk6ICI9ZyIgKChVU0l0eXBlKShzaCkpLCBcCisJCSI9JmciICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgXAorCQkiZyIgKChVU0l0eXBlKShiaCkpLCBcCisJCSIlMSIgKChVU0l0eXBlKShhbCkpLCBcCisJCSJnIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJzdWIudyAlNSwlMVxuIiBcCisJCSJzdWJ4ICUzLCUwIiBcCisJOiAiPWciICgoVVNJdHlwZSkoc2gpKSwgXAorCQkiPSZnIiAoKFVTSXR5cGUpKHNsKSkgXAorCTogIjAiICgoVVNJdHlwZSkoYWgpKSwgXAorCQkiZyIgKChVU0l0eXBlKShiaCkpLCBcCisJCSIxIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkJImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHBoLCBwbCwgbTAsIG0xKSBcCisJX19hc21fXyAoIm11bHggJTMsJTAsJTEiIFwKKwk6ICI9ZyIgKChVU0l0eXBlKShwaCkpLCBcCisJCSI9ciIgKChVU0l0eXBlKShwbCkpIFwKKwk6ICIlMCIgKChVU0l0eXBlKShtMCkpLCBcCisJCSJnIiAoKFVTSXR5cGUpKG0xKSkpCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbmgsIG5sLCBkKSBcCisJX19hc21fXyAoImRpdnggJTQsJTAsJTEiIFwKKwk6ICI9ZyIgKChVU0l0eXBlKShxKSksIFwKKwkJIj1yIiAoKFVTSXR5cGUpKHIpKSBcCisJOiAiMSIgKChVU0l0eXBlKShuaCkpLCBcCisJCSIwIiAoKFVTSXR5cGUpKG5sKSksIFwKKwkJImciICgoVVNJdHlwZSkoZCkpKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKiAgSFBQQSAgKioqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfX2hwcGEpICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJhZGQgJTQsJTUsJTFcbiIgXAorCQkgICAiYWRkYyAlMiwlMywlMCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiJXJNIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkgICAgICJyTSIgKChVU0l0eXBlKShiaCkpLCBcCisJICAgICAiJXJNIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkgICAgICJyTSIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3ViICU0LCU1LCUxXG4iIFwKKwkgICAic3ViYiAlMiwlMywlMCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAick0iICgoVVNJdHlwZSkoYWgpKSwgXAorCSAgICAgInJNIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkgICAgICJyTSIgKChVU0l0eXBlKShhbCkpLCBcCisJICAgICAick0iICgoVVNJdHlwZSkoYmwpKSkKKyNpZiAwICYmIGRlZmluZWQoX1BBX1JJU0MxXzEpCisvKiB4bXB5dSB1c2VzIGZsb2F0aW5nIHBvaW50IHJlZ2lzdGVyIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIExpbnV4IGtlcm5lbC4gKi8KKyNkZWZpbmUgdW11bF9wcG1tKHdoLCB3bCwgdSwgdikgXAorZG8geyBcCisJdW5pb24ge1VESXR5cGUgX19sbDsgXAorCXN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDsgfSBfX2k7IFwKKwl9IF9feHg7IFwKKwlfX2FzbV9fICgieG1weXUgJTEsJTIsJTAiIFwKKwk6ICI9KmYiIChfX3h4Ll9fbGwpIFwKKwk6ICIqZiIgKChVU0l0eXBlKSh1KSksIFwKKwkgICAgICAgIipmIiAoKFVTSXR5cGUpKHYpKSk7IFwKKwkod2gpID0gX194eC5fX2kuX19oOyBcCisJKHdsKSA9IF9feHguX19pLl9fbDsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgVU1VTF9USU1FIDgKKyNkZWZpbmUgVURJVl9USU1FIDYwCisjZWxzZQorI2RlZmluZSBVTVVMX1RJTUUgNDAKKyNkZWZpbmUgVURJVl9USU1FIDgwCisjZW5kaWYKKyNpZiAwIC8qICNpZm5kZWYgTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorZG8geyBVU0l0eXBlIF9fcjsgXAorCShxKSA9IF9fdWRpdl9xcm5uZCgmX19yLCAobjEpLCAobjApLCAoZCkpOyBcCisJKHIpID0gX19yOyBcCit9IHdoaWxlICgwKQorZXh0ZXJuIFVTSXR5cGUgX191ZGl2X3Fybm5kKCk7CisjZW5kaWYgLyogTE9OR0xPTkdfU1RBTkRBTE9ORSAqLworI2VuZGlmIC8qIGhwcGEgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBJMzcwICAqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZChfX2kzNzBfXykgfHwgZGVmaW5lZChfX212c19fKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgbTAsIG0xKSBcCitkbyB7IFwKKwl1bmlvbiB7VURJdHlwZSBfX2xsOyBcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sOyB9IF9faTsgXAorCX0gX194eDsgXAorCVVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOyBcCisJX19hc21fXyAoIm1yICUwLCUzIiBcCisJOiAiPXIiIChfX3h4Ll9faS5fX2gpLCBcCisJICAgICAgICI9ciIgKF9feHguX19pLl9fbCkgXAorCTogIiUxIiAoX19tMCksIFwKKwkgICAgICAgInIiIChfX20xKSk7IFwKKwkoeGgpID0gX194eC5fX2kuX19oOyAoeGwpID0gX194eC5fX2kuX19sOyBcCisJKHhoKSArPSAoKCgoU0l0eXBlKSBfX20wID4+IDMxKSAmIF9fbTEpIFwKKwkgICAgICsgKCgoU0l0eXBlKSBfX20xID4+IDMxKSAmIF9fbTApKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgc211bF9wcG1tKHhoLCB4bCwgbTAsIG0xKSBcCitkbyB7IFwKKwl1bmlvbiB7REl0eXBlIF9fbGw7IFwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7IH0gX19pOyBcCisJfSBfX3h4OyBcCisJX19hc21fXyAoIm1yICUwLCUzIiBcCisJOiAiPXIiIChfX3h4Ll9faS5fX2gpLCBcCisJICAgICAgICI9ciIgKF9feHguX19pLl9fbCkgXAorCTogIiUxIiAobTApLCBcCisJICAgICAgICJyIiAobTEpKTsgXAorCSh4aCkgPSBfX3h4Ll9faS5fX2g7ICh4bCkgPSBfX3h4Ll9faS5fX2w7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIHNkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCitkbyB7IFwKKwl1bmlvbiB7REl0eXBlIF9fbGw7IFwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19oLCBfX2w7IH0gX19pOyBcCisJfSBfX3h4OyBcCisJX194eC5fX2kuX19oID0gbjE7IF9feHguX19pLl9fbCA9IG4wOyBcCisJX19hc21fXyAoImRyICUwLCUyIiBcCisJOiAiPXIiIChfX3h4Ll9fbGwpIFwKKwk6ICIwIiAoX194eC5fX2xsKSwgInIiIChkKSk7IFwKKwkocSkgPSBfX3h4Ll9faS5fX2w7IChyKSA9IF9feHguX19pLl9faDsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIEkzODYgICoqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI3VuZGVmIF9faTM4Nl9fCisjaWYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19pNDg2X18pKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgiYWRkbCAlNSwlMVxuIiBcCisJICAgImFkY2wgJTMsJTAiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShzaCkpLCBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgXAorCTogIiUwIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkgICAgICJnIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3VibCAlNSwlMVxuIiBcCisJICAgInNiYmwgJTMsJTAiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShzaCkpLCBcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHNsKSkgXAorCTogIjAiICgoVVNJdHlwZSkoYWgpKSwgXAorCSAgICAgImciICgoVVNJdHlwZSkoYmgpKSwgXAorCSAgICAgIjEiICgoVVNJdHlwZSkoYWwpKSwgXAorCSAgICAgImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorCV9fYXNtX18gKCJtdWxsICUzIiBcCisJOiAiPWEiICgoVVNJdHlwZSkodzApKSwgXAorCSAgICAgIj1kIiAoKFVTSXR5cGUpKHcxKSkgXAorCTogIiUwIiAoKFVTSXR5cGUpKHUpKSwgXAorCSAgICAgInJtIiAoKFVTSXR5cGUpKHYpKSkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKwlfX2FzbV9fICgiZGl2bCAlNCIgXAorCTogIj1hIiAoKFVTSXR5cGUpKHEpKSwgXAorCSAgICAgIj1kIiAoKFVTSXR5cGUpKHIpKSBcCisJOiAiMCIgKChVU0l0eXBlKShuMCkpLCBcCisJICAgICAiMSIgKChVU0l0eXBlKShuMSkpLCBcCisJICAgICAicm0iICgoVVNJdHlwZSkoZCkpKQorI2lmbmRlZiBVTVVMX1RJTUUKKyNkZWZpbmUgVU1VTF9USU1FIDQwCisjZW5kaWYKKyNpZm5kZWYgVURJVl9USU1FCisjZGVmaW5lIFVESVZfVElNRSA0MAorI2VuZGlmCisjZW5kaWYgLyogODB4ODYgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBJODYwICAqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9faTg2MF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSByc2hpZnRfcmhsYyhyLCBoLCBsLCBjKSBcCisJX19hc21fXyAoInNociAlMyxyMCxyMFxuIiBcCisJInNocmQgJTEsJTIsJTAiIFwKKwkgICAiPXIiIChyKSA6ICJyIiAoaCksICJyIiAobCksICJybiIgKGMpKQorI2VuZGlmIC8qIGk4NjAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBJOTYwICAqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9faTk2MF9fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgiY21wbyAxLDBcbiIgXAorCSJhZGRjICU1LCU0LCUxXG4iIFwKKwkiYWRkYyAlMywlMiwlMCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiJWRJIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKShiaCkpLCBcCisJICAgICAiJWRJIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgiY21wbyAwLDBcbiIgXAorCSJzdWJjICU1LCU0LCUxXG4iIFwKKwkic3ViYyAlMywlMiwlMCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiZEkiICgoVVNJdHlwZSkoYWgpKSwgXAorCSAgICAgImRJIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKShhbCkpLCBcCisJICAgICAiZEkiICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorCSh7dW5pb24ge1VESXR5cGUgX19sbDsgXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDsgfSBfX2k7IFwKKwl9IF9feHg7IFwKKwlfX2FzbV9fICgiZW11bCAgICAgICAgJTIsJTEsJTAiIFwKKwk6ICI9ZCIgKF9feHguX19sbCkgXAorCTogIiVkSSIgKChVU0l0eXBlKSh1KSksIFwKKwkgICAgICJkSSIgKChVU0l0eXBlKSh2KSkpOyBcCisJKHcxKSA9IF9feHguX19pLl9faDsgKHcwKSA9IF9feHguX19pLl9fbDsgfSkKKyNkZWZpbmUgX191bXVsc2lkaTModSwgdikgXAorCSh7VURJdHlwZSBfX3c7IFwKKwlfX2FzbV9fICgiZW11bCAgICAgICUyLCUxLCUwIiBcCisJOiAiPWQiIChfX3cpIFwKKwk6ICIlZEkiICgoVVNJdHlwZSkodSkpLCBcCisJICAgICAgICJkSSIgKChVU0l0eXBlKSh2KSkpOyBcCisJX193OyB9KQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG5oLCBubCwgZCkgXAorZG8geyBcCisJdW5pb24ge1VESXR5cGUgX19sbDsgXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDsgfSBfX2k7IFwKKwl9IF9fbm47IFwKKwlfX25uLl9faS5fX2ggPSAobmgpOyBfX25uLl9faS5fX2wgPSAobmwpOyBcCisJX19hc21fXyAoImVkaXYgJWQsJW4sJTAiIFwKKwk6ICI9ZCIgKF9fcnEuX19sbCkgXAorCTogImRJIiAoX19ubi5fX2xsKSwgXAorCSAgICAgImRJIiAoKFVTSXR5cGUpKGQpKSk7IFwKKwkocikgPSBfX3JxLl9faS5fX2w7IChxKSA9IF9fcnEuX19pLl9faDsgXAorfSB3aGlsZSAoMCkKKyNpZiBkZWZpbmVkKF9faTk2MG14KQkJLyogd2hhdCBpcyB0aGUgcHJvcGVyIHN5bWJvbCB0byB0ZXN0Pz8/ICovCisjZGVmaW5lIHJzaGlmdF9yaGxjKHIsIGgsIGwsIGMpIFwKK2RvIHsgXAorCXVuaW9uIHtVREl0eXBlIF9fbGw7IFwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7IH0gX19pOyBcCisJfSBfX25uOyBcCisJX19ubi5fX2kuX19oID0gKGgpOyBfX25uLl9faS5fX2wgPSAobCk7IFwKKwlfX2FzbV9fICgic2hyZSAlMiwlMSwlMCIgXAorCTogIj1kIiAocikgOiAiZEkiIChfX25uLl9fbGwpLCAiZEkiIChjKSk7IFwKK30KKyNlbmRpZiAvKiBpOTYwbXggKi8KKyNlbmRpZiAvKiBpOTYwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKiAgNjgwMDAJKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZChfX21jNjgwMDBfXykgfHwgZGVmaW5lZChfX21jNjgwMjBfXykgfHwgZGVmaW5lZChfX05lWFRfXykgfHwgZGVmaW5lZChtYzY4MDIwKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoImFkZCUubCAlNSwlMVxuIiBcCisJICAgImFkZHglLmwgJTMsJTAiIFwKKwk6ICI9ZCIgKChVU0l0eXBlKShzaCkpLCBcCisJICAgICAiPSZkIiAoKFVTSXR5cGUpKHNsKSkgXAorCTogIiUwIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkgICAgICJkIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkgICAgICIlMSIgKChVU0l0eXBlKShhbCkpLCBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3ViJS5sICU1LCUxXG4iIFwKKwkgICAic3VieCUubCAlMywlMCIgXAorCTogIj1kIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkgICAgICI9JmQiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiMCIgKChVU0l0eXBlKShhaCkpLCBcCisJICAgICAiZCIgKChVU0l0eXBlKShiaCkpLCBcCisJICAgICAiMSIgKChVU0l0eXBlKShhbCkpLCBcCisJICAgICAiZyIgKChVU0l0eXBlKShibCkpKQorI2lmIChkZWZpbmVkKF9fbWM2ODAyMF9fKSB8fCBkZWZpbmVkKF9fTmVYVF9fKSB8fCBkZWZpbmVkKG1jNjgwMjApKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoIm11bHUlLmwgJTMsJTE6JTAiIFwKKwk6ICI9ZCIgKChVU0l0eXBlKSh3MCkpLCBcCisJICAgICAiPWQiICgoVVNJdHlwZSkodzEpKSBcCisJOiAiJTAiICgoVVNJdHlwZSkodSkpLCBcCisJICAgICAiZG1pIiAoKFVTSXR5cGUpKHYpKSkKKyNkZWZpbmUgVU1VTF9USU1FIDQ1CisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisJX19hc21fXyAoImRpdnUlLmwgJTQsJTE6JTAiIFwKKwk6ICI9ZCIgKChVU0l0eXBlKShxKSksIFwKKwkgICAgICI9ZCIgKChVU0l0eXBlKShyKSkgXAorCTogIjAiICgoVVNJdHlwZSkobjApKSwgXAorCSAgICAgIjEiICgoVVNJdHlwZSkobjEpKSwgXAorCSAgICAgImRtaSIgKChVU0l0eXBlKShkKSkpCisjZGVmaW5lIFVESVZfVElNRSA5MAorI2RlZmluZSBzZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorCV9fYXNtX18gKCJkaXZzJS5sICU0LCUxOiUwIiBcCisJOiAiPWQiICgoVVNJdHlwZSkocSkpLCBcCisJICAgICAiPWQiICgoVVNJdHlwZSkocikpIFwKKwk6ICIwIiAoKFVTSXR5cGUpKG4wKSksIFwKKwkgICAgICIxIiAoKFVTSXR5cGUpKG4xKSksIFwKKwkgICAgICJkbWkiICgoVVNJdHlwZSkoZCkpKQorI2Vsc2UgLyogbm90IG1jNjgwMjAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgYSwgYikgXAorZG8geyBVU0l0eXBlIF9fdW11bF90bXAxLCBfX3VtdWxfdG1wMjsgXAorCV9fYXNtX18gKCJ8IElubGluZWQgdW11bF9wcG1tXG4iIFwKKwkibW92ZSUubCAlNSwlM1xuIiBcCisJIm1vdmUlLmwgJTIsJTBcbiIgXAorCSJtb3ZlJS53ICUzLCUxXG4iIFwKKwkic3dhcAklM1xuIiBcCisJInN3YXAJJTBcbiIgXAorCSJtdWx1CSUyLCUxXG4iIFwKKwkibXVsdQklMywlMFxuIiBcCisJIm11bHUJJTIsJTNcbiIgXAorCSJzd2FwCSUyXG4iIFwKKwkibXVsdQklNSwlMlxuIiBcCisJImFkZCUubAklMywlMlxuIiBcCisJImpjYwkxZlxuIiBcCisJImFkZCUubAklIzB4MTAwMDAsJTBcbiIgXAorCSIxOgltb3ZlJS5sICUyLCUzXG4iIFwKKwkiY2xyJS53CSUyXG4iIFwKKwkic3dhcAklMlxuIiBcCisJInN3YXAJJTNcbiIgXAorCSJjbHIlLncJJTNcbiIgXAorCSJhZGQlLmwJJTMsJTFcbiIgXAorCSJhZGR4JS5sICUyLCUwXG4iIFwKKwkifCBFbmQgaW5saW5lZCB1bXVsX3BwbW0iIFwKKwk6ICI9JmQiICgoVVNJdHlwZSkoeGgpKSwgIj0mZCIgKChVU0l0eXBlKSh4bCkpLCBcCisJCSI9ZCIgKF9fdW11bF90bXAxKSwgIj0mZCIgKF9fdW11bF90bXAyKSBcCisJOiAiJTIiICgoVVNJdHlwZSkoYSkpLCAiZCIgKChVU0l0eXBlKShiKSkpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgMTAwCisjZGVmaW5lIFVESVZfVElNRSA0MDAKKyNlbmRpZiAvKiBub3QgbWM2ODAyMCAqLworI2VuZGlmIC8qIG1jNjgwMDAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICA4ODAwMAkqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19tODgwMDBfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoImFkZHUuY28gJTEsJXI0LCVyNVxuIiBcCisJICAgImFkZHUuY2kgJTAsJXIyLCVyMyIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkgICAgICI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiJXJKIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkgICAgICJySiIgKChVU0l0eXBlKShiaCkpLCBcCisJICAgICAiJXJKIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkgICAgICJySiIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3VidS5jbyAlMSwlcjQsJXI1XG4iIFwKKwkgICAic3VidS5jaSAlMCwlcjIsJXIzIiBcCisJOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgXAorCSAgICAgIj0mciIgKChVU0l0eXBlKShzbCkpIFwKKwk6ICJySiIgKChVU0l0eXBlKShhaCkpLCBcCisJICAgICAickoiICgoVVNJdHlwZSkoYmgpKSwgXAorCSAgICAgInJKIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkgICAgICJySiIgKChVU0l0eXBlKShibCkpKQorI2lmIGRlZmluZWQoX19tODgxMTBfXykKKyNkZWZpbmUgdW11bF9wcG1tKHdoLCB3bCwgdSwgdikgXAorZG8geyBcCisJdW5pb24ge1VESXR5cGUgX19sbDsgXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2gsIF9fbDsgfSBfX2k7IFwKKwl9IF9feDsgXAorCV9fYXNtX18gKCJtdWx1LmQgJTAsJTEsJTIiIDogIj1yIiAoX194Ll9fbGwpIDogInIiICh1KSwgInIiICh2KSk7IFwKKwkod2gpID0gX194Ll9faS5fX2g7IFwKKwkod2wpID0gX194Ll9faS5fX2w7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisJKHt1bmlvbiB7VURJdHlwZSBfX2xsOyBcCisJICAgc3RydWN0IHtVU0l0eXBlIF9faCwgX19sOyB9IF9faTsgXAorCX0gX194LCBfX3E7IFwKKwlfX3guX19pLl9faCA9IChuMSk7IF9feC5fX2kuX19sID0gKG4wKTsgXAorCV9fYXNtX18gKCJkaXZ1LmQgJTAsJTEsJTIiIFwKKwk6ICI9ciIgKF9fcS5fX2xsKSA6ICJyIiAoX194Ll9fbGwpLCAiciIgKGQpKTsgXAorCShyKSA9IChuMCkgLSBfX3EuX19sICogKGQpOyAocSkgPSBfX3EuX19sOyB9KQorI2RlZmluZSBVTVVMX1RJTUUgNQorI2RlZmluZSBVRElWX1RJTUUgMjUKKyNlbHNlCisjZGVmaW5lIFVNVUxfVElNRSAxNworI2RlZmluZSBVRElWX1RJTUUgMTUwCisjZW5kaWYgLyogX19tODgxMTBfXyAqLworI2VuZGlmIC8qIF9fbTg4MDAwX18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBNSVBTICAqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9fbWlwc19fKSAmJiBXX1RZUEVfU0laRSA9PSAzMgorI2lmIChfX0dOVUNfXyA+PSA1KSB8fCAoX19HTlVDX18gPj0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KQkJCVwKK2RvIHsJCQkJCQlcCisJVURJdHlwZSBfX2xsID0gKFVESXR5cGUpKHUpICogKHYpOwlcCisJdzEgPSBfX2xsID4+IDMyOwkJCVwKKwl3MCA9IF9fbGw7CQkJCVwKK30gd2hpbGUgKDApCisjZWxpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gNworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoIm11bHR1ICUyLCUzIiBcCisJOiAiPWwiICgoVVNJdHlwZSkodzApKSwgXAorCSAgICAgIj1oIiAoKFVTSXR5cGUpKHcxKSkgXAorCTogImQiICgoVVNJdHlwZSkodSkpLCBcCisJICAgICAiZCIgKChVU0l0eXBlKSh2KSkpCisjZWxzZQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoIm11bHR1ICUyLCUzXG4iIFwKKwkgICAibWZsbyAlMFxuIiBcCisJICAgIm1maGkgJTEiIFwKKwk6ICI9ZCIgKChVU0l0eXBlKSh3MCkpLCBcCisJICAgICAiPWQiICgoVVNJdHlwZSkodzEpKSBcCisJOiAiZCIgKChVU0l0eXBlKSh1KSksIFwKKwkgICAgICJkIiAoKFVTSXR5cGUpKHYpKSkKKyNlbmRpZgorI2RlZmluZSBVTVVMX1RJTUUgMTAKKyNkZWZpbmUgVURJVl9USU1FIDEwMAorI2VuZGlmIC8qIF9fbWlwc19fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKiAgTUlQUy82NCAgKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgKGRlZmluZWQoX19taXBzKSAmJiBfX21pcHMgPj0gMykgJiYgV19UWVBFX1NJWkUgPT0gNjQKKyNpZiBkZWZpbmVkKF9fbWlwc19pc2FfcmV2KSAmJiBfX21pcHNfaXNhX3JldiA+PSA2ICYmIGRlZmluZWQoQ09ORklHX0NDX0lTX0dDQykKKy8qCisgKiBHQ0MgZW5kcyB1cCBlbWl0dGluZyBhIF9fbXVsdGkzIGludHJpbnNpYyBjYWxsIGZvciBNSVBTNjRyNiB3aXRoIHRoZSBwbGFpbiBDCisgKiBjb2RlIGJlbG93LCBzbyB3ZSBzcGVjaWFsIGNhc2UgTUlQUzY0cjYgdW50aWwgdGhlIGNvbXBpbGVyIGNhbiBkbyBiZXR0ZXIuCisgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCV9fYXNtX18gKCJkbXVsdSAlMCwlMSwlMiIJCQkJCVwKKwkJIDogIj1kIiAoKFVESXR5cGUpKHcwKSkJCQkJCVwKKwkJIDogImQiICgoVURJdHlwZSkodSkpLAkJCQkJXAorCQkgICAiZCIgKChVREl0eXBlKSh2KSkpOwkJCQkJXAorCV9fYXNtX18gKCJkbXVodSAlMCwlMSwlMiIJCQkJCVwKKwkJIDogIj1kIiAoKFVESXR5cGUpKHcxKSkJCQkJCVwKKwkJIDogImQiICgoVURJdHlwZSkodSkpLAkJCQkJXAorCQkgICAiZCIgKChVREl0eXBlKSh2KSkpOwkJCQkJXAorfSB3aGlsZSAoMCkKKyNlbGlmIChfX0dOVUNfXyA+PSA1KSB8fCAoX19HTlVDX18gPj0gNCAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCitkbyB7CQkJCQkJCQkJXAorCXR5cGVkZWYgdW5zaWduZWQgaW50IF9fbGxfVVRJdHlwZSBfX2F0dHJpYnV0ZV9fKChtb2RlKFRJKSkpOwlcCisJX19sbF9VVEl0eXBlIF9fbGwgPSAoX19sbF9VVEl0eXBlKSh1KSAqICh2KTsJCQlcCisJdzEgPSBfX2xsID4+IDY0OwkJCQkJCVwKKwl3MCA9IF9fbGw7CQkJCQkJCVwKK30gd2hpbGUgKDApCisjZWxpZiBfX0dOVUNfXyA+IDIgfHwgX19HTlVDX01JTk9SX18gPj0gNworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoImRtdWx0dSAlMiwlMyIgXAorCTogIj1sIiAoKFVESXR5cGUpKHcwKSksIFwKKwkgICAgICI9aCIgKChVREl0eXBlKSh3MSkpIFwKKwk6ICJkIiAoKFVESXR5cGUpKHUpKSwgXAorCSAgICAgImQiICgoVURJdHlwZSkodikpKQorI2Vsc2UKKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorCV9fYXNtX18gKCJkbXVsdHUgJTIsJTNcbiIgXAorCSAgICJtZmxvICUwXG4iIFwKKwkgICAibWZoaSAlMSIgXAorCTogIj1kIiAoKFVESXR5cGUpKHcwKSksIFwKKwkgICAgICI9ZCIgKChVREl0eXBlKSh3MSkpIFwKKwk6ICJkIiAoKFVESXR5cGUpKHUpKSwgXAorCSAgICAgImQiICgoVURJdHlwZSkodikpKQorI2VuZGlmCisjZGVmaW5lIFVNVUxfVElNRSAyMAorI2RlZmluZSBVRElWX1RJTUUgMTQwCisjZW5kaWYgLyogX19taXBzX18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICAzMjAwMAkqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19uczMyMDAwX18pICYmIFdfVFlQRV9TSVpFID09IDMyCisjZGVmaW5lIHVtdWxfcHBtbSh3MSwgdzAsIHUsIHYpIFwKKwkoe3VuaW9uIHtVREl0eXBlIF9fbGw7IFwKKwkgICBzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7IH0gX19pOyBcCisJfSBfX3h4OyBcCisJX19hc21fXyAoIm1laWQgJTIsJTAiIFwKKwk6ICI9ZyIgKF9feHguX19sbCkgXAorCTogIiUwIiAoKFVTSXR5cGUpKHUpKSwgXAorCSAgICAgImciICgoVVNJdHlwZSkodikpKTsgXAorCSh3MSkgPSBfX3h4Ll9faS5fX2g7ICh3MCkgPSBfX3h4Ll9faS5fX2w7IH0pCisjZGVmaW5lIF9fdW11bHNpZGkzKHUsIHYpIFwKKwkoe1VESXR5cGUgX193OyBcCisJX19hc21fXyAoIm1laWQgJTIsJTAiIFwKKwk6ICI9ZyIgKF9fdykgXAorCTogIiUwIiAoKFVTSXR5cGUpKHUpKSwgXAorCSAgICAgICAiZyIgKChVU0l0eXBlKSh2KSkpOyBcCisJX193OyB9KQorI2RlZmluZSB1ZGl2X3Fybm5kKHEsIHIsIG4xLCBuMCwgZCkgXAorCSh7dW5pb24ge1VESXR5cGUgX19sbDsgXAorCSAgIHN0cnVjdCB7VVNJdHlwZSBfX2wsIF9faDsgfSBfX2k7IFwKKwl9IF9feHg7IFwKKwlfX3h4Ll9faS5fX2ggPSAobjEpOyBfX3h4Ll9faS5fX2wgPSAobjApOyBcCisJX19hc21fXyAoImRlaWQgJTIsJTAiIFwKKwk6ICI9ZyIgKF9feHguX19sbCkgXAorCTogIjAiIChfX3h4Ll9fbGwpLCBcCisJICAgICAiZyIgKChVU0l0eXBlKShkKSkpOyBcCisJKHIpID0gX194eC5fX2kuX19sOyAocSkgPSBfX3h4Ll9faS5fX2g7IH0pCisjZW5kaWYgLyogX19uczMyMDAwX18gKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBQUEMgICoqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZChfQVJDSF9QUEMpIHx8IGRlZmluZWQoX0lCTVIyKSkgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCitkbyB7IFwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoYmgpICYmIChiaCkgPT0gMCkgXAorCQlfX2FzbV9fICgie2ElSTR8YWRkJUk0Y30gJTEsJTMsJTRcblx0e2F6ZXxhZGR6ZX0gJTAsJTIiIFwKKwkJOiAiPXIiIChzaCksIFwKKwkJIj0mciIgKHNsKSBcCisJCTogIiVyIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkJIiVyIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkJInJJIiAoKFVTSXR5cGUpKGJsKSkpOyBcCisJZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AoYmgpICYmIChiaCkgPT0gfihVU0l0eXBlKSAwKSBcCisJCV9fYXNtX18gKCJ7YSVJNHxhZGQlSTRjfSAlMSwlMywlNFxuXHR7YW1lfGFkZG1lfSAlMCwlMiIgXAorCQk6ICI9ciIgKHNoKSwgXAorCQkiPSZyIiAoc2wpIFwKKwkJOiAiJXIiICgoVVNJdHlwZSkoYWgpKSwgXAorCQkiJXIiICgoVVNJdHlwZSkoYWwpKSwgXAorCQkickkiICgoVVNJdHlwZSkoYmwpKSk7IFwKKwllbHNlIFwKKwkJX19hc21fXyAoInthJUk1fGFkZCVJNWN9ICUxLCU0LCU1XG5cdHthZXxhZGRlfSAlMCwlMiwlMyIgXAorCQk6ICI9ciIgKHNoKSwgXAorCQkiPSZyIiAoc2wpIFwKKwkJOiAiJXIiICgoVVNJdHlwZSkoYWgpKSwgXAorCQkiciIgKChVU0l0eXBlKShiaCkpLCBcCisJCSIlciIgKChVU0l0eXBlKShhbCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShibCkpKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCitkbyB7IFwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoYWgpICYmIChhaCkgPT0gMCkgXAorCQlfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7c2Z6ZXxzdWJmemV9ICUwLCUyIiBcCisJCTogIj1yIiAoc2gpLCBcCisJCSI9JnIiIChzbCkgXAorCQk6ICJyIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkJInJJIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkJInIiICgoVVNJdHlwZSkoYmwpKSk7IFwKKwllbHNlIGlmIChfX2J1aWx0aW5fY29uc3RhbnRfcChhaCkgJiYgKGFoKSA9PSB+KFVTSXR5cGUpIDApIFwKKwkJX19hc21fXyAoIntzZiVJM3xzdWJmJUkzY30gJTEsJTQsJTNcblx0e3NmbWV8c3ViZm1lfSAlMCwlMiIgXAorCQk6ICI9ciIgKHNoKSwgXAorCQkiPSZyIiAoc2wpIFwKKwkJOiAiciIgKChVU0l0eXBlKShiaCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShhbCkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKGJsKSkpOyBcCisJZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AoYmgpICYmIChiaCkgPT0gMCkgXAorCQlfX2FzbV9fICgie3NmJUkzfHN1YmYlSTNjfSAlMSwlNCwlM1xuXHR7YW1lfGFkZG1lfSAlMCwlMiIgXAorCQk6ICI9ciIgKHNoKSwgXAorCQkiPSZyIiAoc2wpIFwKKwkJOiAiciIgKChVU0l0eXBlKShhaCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShhbCkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKGJsKSkpOyBcCisJZWxzZSBpZiAoX19idWlsdGluX2NvbnN0YW50X3AoYmgpICYmIChiaCkgPT0gfihVU0l0eXBlKSAwKSBcCisJCV9fYXNtX18gKCJ7c2YlSTN8c3ViZiVJM2N9ICUxLCU0LCUzXG5cdHthemV8YWRkemV9ICUwLCUyIiBcCisJCTogIj1yIiAoc2gpLCBcCisJCSI9JnIiIChzbCkgXAorCQk6ICJyIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkJInJJIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkJInIiICgoVVNJdHlwZSkoYmwpKSk7IFwKKwllbHNlIFwKKwkJX19hc21fXyAoIntzZiVJNHxzdWJmJUk0Y30gJTEsJTUsJTRcblx0e3NmZXxzdWJmZX0gJTAsJTMsJTIiIFwKKwkJOiAiPXIiIChzaCksIFwKKwkJIj0mciIgKHNsKSBcCisJCTogInIiICgoVVNJdHlwZSkoYWgpKSwgXAorCQkiciIgKChVU0l0eXBlKShiaCkpLCBcCisJCSJySSIgKChVU0l0eXBlKShhbCkpLCBcCisJCSJyIiAoKFVTSXR5cGUpKGJsKSkpOyBcCit9IHdoaWxlICgwKQorI2lmIGRlZmluZWQoX0FSQ0hfUFBDKQorI2RlZmluZSB1bXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKK2RvIHsgXAorCVVTSXR5cGUgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOyBcCisJX19hc21fXyAoIm11bGh3dSAlMCwlMSwlMiIgXAorCTogIj1yIiAocGgpIFwKKwk6ICIlciIgKF9fbTApLCBcCisJInIiIChfX20xKSk7IFwKKwkocGwpID0gX19tMCAqIF9fbTE7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFVNVUxfVElNRSAxNQorI2RlZmluZSBzbXVsX3BwbW0ocGgsIHBsLCBtMCwgbTEpIFwKK2RvIHsgXAorCVNJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7IFwKKwlfX2FzbV9fICgibXVsaHcgJTAsJTEsJTIiIFwKKwk6ICI9ciIgKChTSXR5cGUpIHBoKSBcCisJOiAiJXIiIChfX20wKSwgXAorCSJyIiAoX19tMSkpOyBcCisJKHBsKSA9IF9fbTAgKiBfX20xOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTTVVMX1RJTUUgMTQKKyNkZWZpbmUgVURJVl9USU1FIDEyMAorI2Vsc2UKKyNkZWZpbmUgdW11bF9wcG1tKHhoLCB4bCwgbTAsIG0xKSBcCitkbyB7IFwKKwlVU0l0eXBlIF9fbTAgPSAobTApLCBfX20xID0gKG0xKTsgXAorCV9fYXNtX18gKCJtdWwgJTAsJTIsJTMiIFwKKwk6ICI9ciIgKChVU0l0eXBlKSh4aCkpLCBcCisJIj1xIiAoKFVTSXR5cGUpKHhsKSkgXAorCTogInIiIChfX20wKSwgXAorCSJyIiAoX19tMSkpOyBcCisJKHhoKSArPSAoKCgoU0l0eXBlKSBfX20wID4+IDMxKSAmIF9fbTEpIFwKKwkrICgoKFNJdHlwZSkgX19tMSA+PiAzMSkgJiBfX20wKSk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFVNVUxfVElNRSA4CisjZGVmaW5lIHNtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorCV9fYXNtX18gKCJtdWwgJTAsJTIsJTMiIFwKKwk6ICI9ciIgKChTSXR5cGUpKHhoKSksIFwKKwkiPXEiICgoU0l0eXBlKSh4bCkpIFwKKwk6ICJyIiAobTApLCBcCisJInIiIChtMSkpCisjZGVmaW5lIFNNVUxfVElNRSA0CisjZGVmaW5lIHNkaXZfcXJubmQocSwgciwgbmgsIG5sLCBkKSBcCisJX19hc21fXyAoImRpdiAlMCwlMiwlNCIgXAorCTogIj1yIiAoKFNJdHlwZSkocSkpLCAiPXEiICgoU0l0eXBlKShyKSkgXAorCTogInIiICgoU0l0eXBlKShuaCkpLCAiMSIgKChTSXR5cGUpKG5sKSksICJyIiAoKFNJdHlwZSkoZCkpKQorI2RlZmluZSBVRElWX1RJTUUgMTAwCisjZW5kaWYKKyNlbmRpZiAvKiBQb3dlciBhcmNoaXRlY3R1cmUgdmFyaWFudHMuICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIFBZUiAgKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19weXJfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoImFkZHcgICAgICAgICU1LCUxXG4iIFwKKwkiYWRkd2MJJTMsJTAiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShzaCkpLCBcCisJIj0mciIgKChVU0l0eXBlKShzbCkpIFwKKwk6ICIlMCIgKChVU0l0eXBlKShhaCkpLCBcCisJImciICgoVVNJdHlwZSkoYmgpKSwgXAorCSIlMSIgKChVU0l0eXBlKShhbCkpLCBcCisJImciICgoVVNJdHlwZSkoYmwpKSkKKyNkZWZpbmUgc3ViX2RkbW1zcyhzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoInN1YncgICAgICAgICU1LCUxXG4iIFwKKwkic3Vid2IJJTMsJTAiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShzaCkpLCBcCisJIj0mciIgKChVU0l0eXBlKShzbCkpIFwKKwk6ICIwIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkiZyIgKChVU0l0eXBlKShiaCkpLCBcCisJIjEiICgoVVNJdHlwZSkoYWwpKSwgXAorCSJnIiAoKFVTSXR5cGUpKGJsKSkpCisJLyogVGhpcyBpbnNuIHdvcmtzIG9uIFB5cmFtaWRzIHdpdGggQVAsIFhQLCBvciBNSSBDUFVzLCBidXQgbm90IHdpdGggU1AuICAqLworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJKHt1bmlvbiB7VURJdHlwZSBfX2xsOyBcCisJc3RydWN0IHtVU0l0eXBlIF9faCwgX19sOyB9IF9faTsgXAorCX0gX194eDsgXAorCV9fYXNtX18gKCJtb3Z3ICUxLCVSMFxuIiBcCisJInVlbXVsICUyLCUwIiBcCisJOiAiPSZyIiAoX194eC5fX2xsKSBcCisJOiAiZyIgKChVU0l0eXBlKSAodSkpLCBcCisJImciICgoVVNJdHlwZSkodikpKTsgXAorCSh3MSkgPSBfX3h4Ll9faS5fX2g7ICh3MCkgPSBfX3h4Ll9faS5fX2w7IH0pCisjZW5kaWYgLyogX19weXJfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIFJUL1JPTVAgICoqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19pYm0wMzJfXykgLyogUlQvUk9NUCAqLwkmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgiYSAlMSwlNVxuIiBcCisJImFlICUwLCUzIiBcCisJOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgXAorCSI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiJTAiICgoVVNJdHlwZSkoYWgpKSwgXAorCSJyIiAoKFVTSXR5cGUpKGJoKSksIFwKKwkiJTEiICgoVVNJdHlwZSkoYWwpKSwgXAorCSJyIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJzICUxLCU1XG4iIFwKKwkic2UgJTAsJTMiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShzaCkpLCBcCisJIj0mciIgKChVU0l0eXBlKShzbCkpIFwKKwk6ICIwIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkiciIgKChVU0l0eXBlKShiaCkpLCBcCisJIjEiICgoVVNJdHlwZSkoYWwpKSwgXAorCSJyIiAoKFVTSXR5cGUpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAorZG8geyBcCisJVVNJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7IFwKKwlfX2FzbV9fICggXAorCSJzICAgICAgIHIyLHIyXG4iIFwKKwkibXRzCXIxMCwlMlxuIiBcCisJIm0JcjIsJTNcbiIgXAorCSJtCXIyLCUzXG4iIFwKKwkibQlyMiwlM1xuIiBcCisJIm0JcjIsJTNcbiIgXAorCSJtCXIyLCUzXG4iIFwKKwkibQlyMiwlM1xuIiBcCisJIm0JcjIsJTNcbiIgXAorCSJtCXIyLCUzXG4iIFwKKwkibQlyMiwlM1xuIiBcCisJIm0JcjIsJTNcbiIgXAorCSJtCXIyLCUzXG4iIFwKKwkibQlyMiwlM1xuIiBcCisJIm0JcjIsJTNcbiIgXAorCSJtCXIyLCUzXG4iIFwKKwkibQlyMiwlM1xuIiBcCisJIm0JcjIsJTNcbiIgXAorCSJjYXMJJTAscjIscjBcbiIgXAorCSJtZnMJcjEwLCUxIiBcCisJOiAiPXIiICgoVVNJdHlwZSkocGgpKSwgXAorCSI9ciIgKChVU0l0eXBlKShwbCkpIFwKKwk6ICIlciIgKF9fbTApLCBcCisJInIiIChfX20xKSBcCisJOiAicjIiKTsgXAorCShwaCkgKz0gKCgoKFNJdHlwZSkgX19tMCA+PiAzMSkgJiBfX20xKSBcCisJKyAoKChTSXR5cGUpIF9fbTEgPj4gMzEpICYgX19tMCkpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBVTVVMX1RJTUUgMjAKKyNkZWZpbmUgVURJVl9USU1FIDIwMAorI2VuZGlmIC8qIFJUL1JPTVAgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqICBTSDIgICoqKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAoZGVmaW5lZChfX3NoMl9fKSB8fCBkZWZpbmVkKF9fc2gzX18pIHx8IGRlZmluZWQoX19TSDRfXykpIFwKKwkmJiBXX1RZUEVfU0laRSA9PSAzMgorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoIFwKKwkiZG11bHUubCAlMiwlM1xuIiBcCisJInN0cwltYWNsLCUxXG4iIFwKKwkic3RzCW1hY2gsJTAiIFwKKwk6ICI9ciIgKChVU0l0eXBlKSh3MSkpLCBcCisJIj1yIiAoKFVTSXR5cGUpKHcwKSkgXAorCTogInIiICgoVVNJdHlwZSkodSkpLCBcCisJInIiICgoVVNJdHlwZSkodikpIFwKKwk6ICJtYWNsIiwgIm1hY2giKQorI2RlZmluZSBVTVVMX1RJTUUgNQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKiAgU1BBUkMJKioqKioqKioqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiBkZWZpbmVkKF9fc3BhcmNfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoImFkZGNjICVyNCwlNSwlMVxuIiBcCisJImFkZHggJXIyLCUzLCUwIiBcCisJOiAiPXIiICgoVVNJdHlwZSkoc2gpKSwgXAorCSI9JnIiICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiJXJKIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkickkiICgoVVNJdHlwZSkoYmgpKSwgXAorCSIlckoiICgoVVNJdHlwZSkoYWwpKSwgXAorCSJySSIgKChVU0l0eXBlKShibCkpIFwKKwlfX0NMT0JCRVJfQ0MpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJzdWJjYyAlcjQsJTUsJTFcbiIgXAorCSJzdWJ4ICVyMiwlMywlMCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkiPSZyIiAoKFVTSXR5cGUpKHNsKSkgXAorCTogInJKIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkickkiICgoVVNJdHlwZSkoYmgpKSwgXAorCSJySiIgKChVU0l0eXBlKShhbCkpLCBcCisJInJJIiAoKFVTSXR5cGUpKGJsKSkgXAorCV9fQ0xPQkJFUl9DQykKKyNpZiBkZWZpbmVkKF9fc3BhcmNfdjhfXykKKy8qIERvbid0IG1hdGNoIGltbWVkaWF0ZSByYW5nZSBiZWNhdXNlLCAxKSBpdCBpcyBub3Qgb2Z0ZW4gdXNlZnVsLAorCTIpIHRoZSAnSScgZmxhZyB0aGlua3Mgb2YgdGhlIHJhbmdlIGFzIGEgMTMgYml0IHNpZ25lZCBpbnRlcnZhbCwKKwl3aGlsZSB3ZSB3YW50IHRvIG1hdGNoIGEgMTMgYml0IGludGVydmFsLCBzaWduIGV4dGVuZGVkIHRvIDMyIGJpdHMsCisJYnV0IElOVEVSUFJFVEVEIEFTIFVOU0lHTkVELiAgKi8KKyNkZWZpbmUgdW11bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorCV9fYXNtX18gKCJ1bXVsICUyLCUzLCUxO3JkICUleSwlMCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHcxKSksIFwKKwkiPXIiICgoVVNJdHlwZSkodzApKSBcCisJOiAiciIgKChVU0l0eXBlKSh1KSksIFwKKwkiciIgKChVU0l0eXBlKSh2KSkpCisjZGVmaW5lIFVNVUxfVElNRSA1CisjaWZuZGVmIFNVUEVSU1BBUkMJCS8qIFN1cGVyU1BBUkMncyB1ZGl2IG9ubHkgaGFuZGxlcyA1MyBiaXQgZGl2aWRlbmRzICovCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCitkbyB7IFwKKwlVU0l0eXBlIF9fcTsgXAorCV9fYXNtX18gKCJtb3YgJTEsJSV5O25vcDtub3A7bm9wO3VkaXYgJTIsJTMsJTAiIFwKKwk6ICI9ciIgKChVU0l0eXBlKShfX3EpKSBcCisJOiAiciIgKChVU0l0eXBlKShuMSkpLCBcCisJInIiICgoVVNJdHlwZSkobjApKSwgXAorCSJyIiAoKFVTSXR5cGUpKGQpKSk7IFwKKwkocikgPSAobjApIC0gX19xICogKGQpOyBcCisJKHEpID0gX19xOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBVRElWX1RJTUUgMjUKKyNlbmRpZiAvKiBTVVBFUlNQQVJDICovCisjZWxzZSAvKiAhIF9fc3BhcmNfdjhfXyAqLworI2lmIGRlZmluZWQoX19zcGFyY2xpdGVfXykKKy8qIFRoaXMgaGFzIGhhcmR3YXJlIG11bHRpcGx5IGJ1dCBub3QgZGl2aWRlLiAgSXQgYWxzbyBoYXMgdHdvIGFkZGl0aW9uYWwKKwlpbnN0cnVjdGlvbnMgc2NhbiAoZmZzIGZyb20gaGlnaCBiaXQpIGFuZCBkaXZzY2MuICAqLworI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoInVtdWwgJTIsJTMsJTE7cmQgJSV5LCUwIiBcCisJOiAiPXIiICgoVVNJdHlwZSkodzEpKSwgXAorCSI9ciIgKChVU0l0eXBlKSh3MCkpIFwKKwk6ICJyIiAoKFVTSXR5cGUpKHUpKSwgXAorCSJyIiAoKFVTSXR5cGUpKHYpKSkKKyNkZWZpbmUgVU1VTF9USU1FIDUKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuMSwgbjAsIGQpIFwKKwlfX2FzbV9fICgiISBJbmxpbmVkIHVkaXZfcXJubmRcbiIgXAorCSJ3cgklJWcwLCUyLCUleQkhIE5vdCBhIGRlbGF5ZWQgd3JpdGUgZm9yIHNwYXJjbGl0ZVxuIiBcCisJInRzdAklJWcwXG4iIFwKKwkiZGl2c2NjCSUzLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlJWcxXG4iIFwKKwkiZGl2c2NjCSUlZzEsJTQsJSVnMVxuIiBcCisJImRpdnNjYwklJWcxLCU0LCUlZzFcbiIgXAorCSJkaXZzY2MJJSVnMSwlNCwlMFxuIiBcCisJInJkCSUleSwlMVxuIiBcCisJImJsLGEgMWZcbiIgXAorCSJhZGQJJTEsJTQsJTFcbiIgXAorCSIxOgkhIEVuZCBvZiBpbmxpbmUgdWRpdl9xcm5uZCIgXAorCTogIj1yIiAoKFVTSXR5cGUpKHEpKSwgXAorCSI9ciIgKChVU0l0eXBlKShyKSkgXAorCTogInIiICgoVVNJdHlwZSkobjEpKSwgXAorCSJyIiAoKFVTSXR5cGUpKG4wKSksIFwKKwkickkiICgoVVNJdHlwZSkoZCkpIFwKKwk6ICIlZzEiIF9fQU5EX0NMT0JCRVJfQ0MpCisjZGVmaW5lIFVESVZfVElNRSAzNworI2VuZGlmIC8qIF9fc3BhcmNsaXRlX18gKi8KKyNlbmRpZiAvKiBfX3NwYXJjX3Y4X18gKi8KKwkvKiBEZWZhdWx0IHRvIHNwYXJjIHY3IHZlcnNpb25zIG9mIHVtdWxfcHBtbSBhbmQgdWRpdl9xcm5uZC4gICovCisjaWZuZGVmIHVtdWxfcHBtbQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCisJX19hc21fXyAoIiEgSW5saW5lZCB1bXVsX3BwbW1cbiIgXAorCSJ3cgklJWcwLCUyLCUleQkhIFNQQVJDIGhhcyAwLTMgZGVsYXkgaW5zbiBhZnRlciBhIHdyXG4iIFwKKwkic3JhCSUzLDMxLCUlZzIJISBEb24ndCBtb3ZlIHRoaXMgaW5zblxuIiBcCisJImFuZAklMiwlJWcyLCUlZzIJISBEb24ndCBtb3ZlIHRoaXMgaW5zblxuIiBcCisJImFuZGNjCSUlZzAsMCwlJWcxCSEgRG9uJ3QgbW92ZSB0aGlzIGluc25cbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLCUzLCUlZzFcbiIgXAorCSJtdWxzY2MJJSVnMSwlMywlJWcxXG4iIFwKKwkibXVsc2NjCSUlZzEsJTMsJSVnMVxuIiBcCisJIm11bHNjYwklJWcxLDAsJSVnMVxuIiBcCisJImFkZAklJWcxLCUlZzIsJTBcbiIgXAorCSJyZAklJXksJTEiIFwKKwk6ICI9ciIgKChVU0l0eXBlKSh3MSkpLCBcCisJIj1yIiAoKFVTSXR5cGUpKHcwKSkgXAorCTogIiVySSIgKChVU0l0eXBlKSh1KSksIFwKKwkiciIgKChVU0l0eXBlKSh2KSkgXAorCTogIiVnMSIsICIlZzIiIF9fQU5EX0NMT0JCRVJfQ0MpCisjZGVmaW5lIFVNVUxfVElNRSAzOQkJLyogMzkgaW5zdHJ1Y3Rpb25zICovCisvKiBJdCdzIHF1aXRlIG5lY2Vzc2FyeSB0byBhZGQgdGhpcyBtdWNoIGFzc2VtYmxlciBmb3IgdGhlIHNwYXJjLgorICAgVGhlIGRlZmF1bHQgdWRpdl9xcm5uZCAoaW4gQykgaXMgbW9yZSB0aGFuIDEwIHRpbWVzIHNsb3dlciEgICovCisjZGVmaW5lIHVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCisgIF9fYXNtX18gKCIhIElubGluZWQgdWRpdl9xcm5uZFxuXHQiCQkJCQlcCisJICAgIm1vdgkzMiwlJWcxXG5cdCIJCQkJCQlcCisJICAgInN1YmNjCSUxLCUyLCUlZzBcblx0IgkJCQkJXAorCSAgICIxOgliY3MJNWZcblx0IgkJCQkJCVwKKwkgICAiYWRkeGNjICUwLCUwLCUwCSEgc2hpZnQgbjFuMCBhbmQgYSBxLWJpdCBpbiBsc2Jcblx0IglcCisJICAgInN1YgklMSwlMiwlMQkhIHRoaXMga2lsbHMgbXNiIG9mIG5cblx0IgkJXAorCSAgICJhZGR4CSUxLCUxLCUxCSEgc28gdGhpcyBjYW4ndCBnaXZlIGNhcnJ5XG5cdCIJXAorCSAgICJzdWJjYwklJWcxLDEsJSVnMVxuXHQiCQkJCVwKKwkgICAiMjoJYm5lCTFiXG5cdCIJCQkJCQlcCisJICAgInN1YmNjCSUxLCUyLCUlZzBcblx0IgkJCQkJXAorCSAgICJiY3MJM2Zcblx0IgkJCQkJCQlcCisJICAgImFkZHhjYyAlMCwlMCwlMAkhIHNoaWZ0IG4xbjAgYW5kIGEgcS1iaXQgaW4gbHNiXG5cdCIJXAorCSAgICJiCQkzZlxuXHQiCQkJCQkJXAorCSAgICJzdWIJJTEsJTIsJTEJISB0aGlzIGtpbGxzIG1zYiBvZiBuXG5cdCIJCVwKKwkgICAiNDoJc3ViCSUxLCUyLCUxXG5cdCIJCQkJCVwKKwkgICAiNToJYWRkeGNjCSUxLCUxLCUxXG5cdCIJCQkJCVwKKwkgICAiYmNjCTJiXG5cdCIJCQkJCQkJXAorCSAgICJzdWJjYwklJWcxLDEsJSVnMVxuXHQiCQkJCVwKKwkgICAiISBHb3QgY2FycnkgZnJvbSBuLiAgU3VidHJhY3QgbmV4dCBzdGVwIHRvIGNhbmNlbCB0aGlzIGNhcnJ5LlxuXHQiIFwKKwkgICAiYm5lCTRiXG5cdCIJCQkJCQkJXAorCSAgICJhZGRjYwklMCwlMCwlMAkhIHNoaWZ0IG4xbjAgYW5kIGEgMC1iaXQgaW4gbHNiXG5cdCIgXAorCSAgICJzdWIJJTEsJTIsJTFcblx0IgkJCQkJCVwKKwkgICAiMzoJeG5vcgklMCwwLCUwXG5cdCIJCQkJCVwKKwkgICAiISBFbmQgb2YgaW5saW5lIHVkaXZfcXJubmRcbiIJCQkJXAorCSAgIDogIj0mciIgKChVU0l0eXBlKShxKSksCQkJCQlcCisJICAgICAiPSZyIiAoKFVTSXR5cGUpKHIpKQkJCQkJXAorCSAgIDogInIiICgoVVNJdHlwZSkoZCkpLAkJCQkJXAorCSAgICAgIjEiICgoVVNJdHlwZSkobjEpKSwJCQkJCVwKKwkgICAgICIwIiAoKFVTSXR5cGUpKG4wKSkgOiAiJWcxIiwgImNjIikKKyNkZWZpbmUgVURJVl9USU1FICgzKzcqMzIpICAgICAgLyogNyBpbnN0cnVjdGlvbnMvaXRlcmF0aW9uLiAzMiBpdGVyYXRpb25zLiAgKi8KKyNlbmRpZgorI2VuZGlmIC8qIF9fc3BhcmNfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIFZBWCAgKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX192YXhfXykgJiYgV19UWVBFX1NJWkUgPT0gMzIKKyNkZWZpbmUgYWRkX3NzYWFhYShzaCwgc2wsIGFoLCBhbCwgYmgsIGJsKSBcCisJX19hc21fXyAoImFkZGwyICU1LCUxXG4iIFwKKwkiYWR3YyAlMywlMCIgXAorCTogIj1nIiAoKFVTSXR5cGUpKHNoKSksIFwKKwkiPSZnIiAoKFVTSXR5cGUpKHNsKSkgXAorCTogIiUwIiAoKFVTSXR5cGUpKGFoKSksIFwKKwkiZyIgKChVU0l0eXBlKShiaCkpLCBcCisJIiUxIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3VibDIgJTUsJTFcbiIgXAorCSJzYndjICUzLCUwIiBcCisJOiAiPWciICgoVVNJdHlwZSkoc2gpKSwgXAorCSI9JmciICgoVVNJdHlwZSkoc2wpKSBcCisJOiAiMCIgKChVU0l0eXBlKShhaCkpLCBcCisJImciICgoVVNJdHlwZSkoYmgpKSwgXAorCSIxIiAoKFVTSXR5cGUpKGFsKSksIFwKKwkiZyIgKChVU0l0eXBlKShibCkpKQorI2RlZmluZSB1bXVsX3BwbW0oeGgsIHhsLCBtMCwgbTEpIFwKK2RvIHsgXAorCXVuaW9uIHtVREl0eXBlIF9fbGw7IFwKKwlzdHJ1Y3Qge1VTSXR5cGUgX19sLCBfX2g7IH0gX19pOyBcCisJfSBfX3h4OyBcCisJVVNJdHlwZSBfX20wID0gKG0wKSwgX19tMSA9IChtMSk7IFwKKwlfX2FzbV9fICgiZW11bCAlMSwlMiwkMCwlMCIgXAorCTogIj1nIiAoX194eC5fX2xsKSBcCisJOiAiZyIgKF9fbTApLCBcCisJImciIChfX20xKSk7IFwKKwkoeGgpID0gX194eC5fX2kuX19oOyAoeGwpID0gX194eC5fX2kuX19sOyBcCisJKHhoKSArPSAoKCgoU0l0eXBlKSBfX20wID4+IDMxKSAmIF9fbTEpIFwKKwkrICgoKFNJdHlwZSkgX19tMSA+PiAzMSkgJiBfX20wKSk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIHNkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkKSBcCitkbyB7IFwKKwl1bmlvbiB7REl0eXBlIF9fbGw7IFwKKwlzdHJ1Y3Qge1NJdHlwZSBfX2wsIF9faDsgfSBfX2k7IFwKKwl9IF9feHg7IFwKKwlfX3h4Ll9faS5fX2ggPSBuMTsgX194eC5fX2kuX19sID0gbjA7IFwKKwlfX2FzbV9fICgiZWRpdiAlMywlMiwlMCwlMSIgXAorCTogIj1nIiAocSksICI9ZyIgKHIpIFwKKwk6ICJnIiAoX194eC5fX2xsKSwgImciIChkKSk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYgLyogX192YXhfXyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJKioqKioqKioqKioqKiogIFo4MDAwCSoqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWYgZGVmaW5lZChfX3o4MDAwX18pICYmIFdfVFlQRV9TSVpFID09IDE2CisjZGVmaW5lIGFkZF9zc2FhYWEoc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorCV9fYXNtX18gKCJhZGQgJUgxLCVINVxuXHRhZGMgICVIMCwlSDMiIFwKKwk6ICI9ciIgKCh1bnNpZ25lZCBpbnQpKHNoKSksIFwKKwkiPSZyIiAoKHVuc2lnbmVkIGludCkoc2wpKSBcCisJOiAiJTAiICgodW5zaWduZWQgaW50KShhaCkpLCBcCisJInIiICgodW5zaWduZWQgaW50KShiaCkpLCBcCisJIiUxIiAoKHVuc2lnbmVkIGludCkoYWwpKSwgXAorCSJyUVIiICgodW5zaWduZWQgaW50KShibCkpKQorI2RlZmluZSBzdWJfZGRtbXNzKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKKwlfX2FzbV9fICgic3ViICVIMSwlSDVcblx0c2JjICAlSDAsJUgzIiBcCisJOiAiPXIiICgodW5zaWduZWQgaW50KShzaCkpLCBcCisJIj0mciIgKCh1bnNpZ25lZCBpbnQpKHNsKSkgXAorCTogIjAiICgodW5zaWduZWQgaW50KShhaCkpLCBcCisJInIiICgodW5zaWduZWQgaW50KShiaCkpLCBcCisJIjEiICgodW5zaWduZWQgaW50KShhbCkpLCBcCisJInJRUiIgKCh1bnNpZ25lZCBpbnQpKGJsKSkpCisjZGVmaW5lIHVtdWxfcHBtbSh4aCwgeGwsIG0wLCBtMSkgXAorZG8geyBcCisJdW5pb24ge2xvbmcgaW50IF9fbGw7IFwKKwlzdHJ1Y3Qge3Vuc2lnbmVkIGludCBfX2gsIF9fbDsgfSBfX2k7IFwKKwl9IF9feHg7IFwKKwl1bnNpZ25lZCBpbnQgX19tMCA9IChtMCksIF9fbTEgPSAobTEpOyBcCisJX19hc21fXyAoIm11bHQgICAgICAlUzAsJUgzIiBcCisJOiAiPXIiIChfX3h4Ll9faS5fX2gpLCBcCisJIj1yIiAoX194eC5fX2kuX19sKSBcCisJOiAiJTEiIChfX20wKSwgXAorCSJyUVIiIChfX20xKSk7IFwKKwkoeGgpID0gX194eC5fX2kuX19oOyAoeGwpID0gX194eC5fX2kuX19sOyBcCisJKHhoKSArPSAoKCgoc2lnbmVkIGludCkgX19tMCA+PiAxNSkgJiBfX20xKSBcCisJKyAoKChzaWduZWQgaW50KSBfX20xID4+IDE1KSAmIF9fbTApKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBfX3o4MDAwX18gKi8KKworI2VuZGlmIC8qIF9fR05VQ19fICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkqKioqKioqKioqKiAgR2VuZXJpYyBWZXJzaW9ucwkqKioqKioqKgorCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZiAhZGVmaW5lZCh1bXVsX3BwbW0pICYmIGRlZmluZWQoX191bXVsc2lkaTMpCisjZGVmaW5lIHVtdWxfcHBtbShwaCwgcGwsIG0wLCBtMSkgXAoreyBcCisJVURXdHlwZSBfX2xsID0gX191bXVsc2lkaTMobTAsIG0xKTsgXAorCXBoID0gKFVXdHlwZSkgKF9fbGwgPj4gV19UWVBFX1NJWkUpOyBcCisJcGwgPSAoVVd0eXBlKSBfX2xsOyBcCit9CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fdW11bHNpZGkzKQorI2RlZmluZSBfX3VtdWxzaWRpMyh1LCB2KSBcCisJKHtVV3R5cGUgX19oaSwgX19sbzsgXAorCXVtdWxfcHBtbShfX2hpLCBfX2xvLCB1LCB2KTsgXAorCSgoVURXdHlwZSkgX19oaSA8PCBXX1RZUEVfU0laRSkgfCBfX2xvOyB9KQorI2VuZGlmCisKKwkvKiBJZiB0aGlzIG1hY2hpbmUgaGFzIG5vIGlubGluZSBhc3NlbWJsZXIsIHVzZSBDIG1hY3Jvcy4gICovCisKKyNpZiAhZGVmaW5lZChhZGRfc3NhYWFhKQorI2RlZmluZSBhZGRfc3NhYWFhKHNoLCBzbCwgYWgsIGFsLCBiaCwgYmwpIFwKK2RvIHsgXAorCVVXdHlwZSBfX3g7IFwKKwlfX3ggPSAoYWwpICsgKGJsKTsgXAorCShzaCkgPSAoYWgpICsgKGJoKSArIChfX3ggPCAoYWwpKTsgXAorCShzbCkgPSBfX3g7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkKHN1Yl9kZG1tc3MpCisjZGVmaW5lIHN1Yl9kZG1tc3Moc2gsIHNsLCBhaCwgYWwsIGJoLCBibCkgXAorZG8geyBcCisJVVd0eXBlIF9feDsgXAorCV9feCA9IChhbCkgLSAoYmwpOyBcCisJKHNoKSA9IChhaCkgLSAoYmgpIC0gKF9feCA+IChhbCkpOyBcCisJKHNsKSA9IF9feDsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQodW11bF9wcG1tKQorI2RlZmluZSB1bXVsX3BwbW0odzEsIHcwLCB1LCB2KSBcCitkbyB7IFwKKwlVV3R5cGUgX194MCwgX194MSwgX194MiwgX194MzsgXAorCVVIV3R5cGUgX191bCwgX192bCwgX191aCwgX192aDsgXAorCVVXdHlwZSBfX3UgPSAodSksIF9fdiA9ICh2KTsgXAorCVwKKwlfX3VsID0gX19sbF9sb3dwYXJ0KF9fdSk7IFwKKwlfX3VoID0gX19sbF9oaWdocGFydChfX3UpOyBcCisJX192bCA9IF9fbGxfbG93cGFydChfX3YpOyBcCisJX192aCA9IF9fbGxfaGlnaHBhcnQoX192KTsgXAorCVwKKwlfX3gwID0gKFVXdHlwZSkgX191bCAqIF9fdmw7IFwKKwlfX3gxID0gKFVXdHlwZSkgX191bCAqIF9fdmg7IFwKKwlfX3gyID0gKFVXdHlwZSkgX191aCAqIF9fdmw7IFwKKwlfX3gzID0gKFVXdHlwZSkgX191aCAqIF9fdmg7IFwKKwlcCisJX194MSArPSBfX2xsX2hpZ2hwYXJ0KF9feDApOy8qIHRoaXMgY2FuJ3QgZ2l2ZSBjYXJyeSAqLyBcCisJX194MSArPSBfX3gyOwkJLyogYnV0IHRoaXMgaW5kZWVkIGNhbiAqLyBcCisJaWYgKF9feDEgPCBfX3gyKQkJLyogZGlkIHdlIGdldCBpdD8gKi8gXAorCV9feDMgKz0gX19sbF9COwkJLyogeWVzLCBhZGQgaXQgaW4gdGhlIHByb3BlciBwb3MuICovIFwKKwlcCisJKHcxKSA9IF9feDMgKyBfX2xsX2hpZ2hwYXJ0KF9feDEpOyBcCisJKHcwKSA9IChfX2xsX2xvd3BhcnQoX194MSkgPDwgV19UWVBFX1NJWkUvMikgKyBfX2xsX2xvd3BhcnQoX194MCk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworI2lmICFkZWZpbmVkKHVtdWxfcHBtbSkKKyNkZWZpbmUgc211bF9wcG1tKHcxLCB3MCwgdSwgdikgXAorZG8geyBcCisJVVd0eXBlIF9fdzE7IFwKKwlVV3R5cGUgX19tMCA9ICh1KSwgX19tMSA9ICh2KTsgXAorCXVtdWxfcHBtbShfX3cxLCB3MCwgX19tMCwgX19tMSk7IFwKKwkodzEpID0gX193MSAtICgtKF9fbTAgPj4gKFdfVFlQRV9TSVpFIC0gMSkpICYgX19tMSkgXAorCS0gKC0oX19tMSA+PiAoV19UWVBFX1NJWkUgLSAxKSkgJiBfX20wKTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisJLyogRGVmaW5lIHRoaXMgdW5jb25kaXRpb25hbGx5LCBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgZGVidWdnaW5nLiAgKi8KKyNkZWZpbmUgX191ZGl2X3Fybm5kX2MocSwgciwgbjEsIG4wLCBkKSBcCitkbyB7IFwKKwlVV3R5cGUgX19kMSwgX19kMCwgX19xMSwgX19xMCwgX19yMSwgX19yMCwgX19tOyBcCisJX19kMSA9IF9fbGxfaGlnaHBhcnQoZCk7IFwKKwlfX2QwID0gX19sbF9sb3dwYXJ0KGQpOyBcCisJXAorCV9fcjEgPSAobjEpICUgX19kMTsgXAorCV9fcTEgPSAobjEpIC8gX19kMTsgXAorCV9fbSA9IChVV3R5cGUpIF9fcTEgKiBfX2QwOyBcCisJX19yMSA9IF9fcjEgKiBfX2xsX0IgfCBfX2xsX2hpZ2hwYXJ0KG4wKTsgXAorCWlmIChfX3IxIDwgX19tKSB7IFwKKwkJX19xMS0tLCBfX3IxICs9IChkKTsgXAorCQlpZiAoX19yMSA+PSAoZCkpIC8qIGkuZS4gd2UgZGlkbid0IGdldCBjYXJyeSB3aGVuIGFkZGluZyB0byBfX3IxICovIFwKKwkJaWYgKF9fcjEgPCBfX20pIFwKKwkJCV9fcTEtLSwgX19yMSArPSAoZCk7IFwKKwl9IFwKKwlfX3IxIC09IF9fbTsgXAorCVwKKwlfX3IwID0gX19yMSAlIF9fZDE7IFwKKwlfX3EwID0gX19yMSAvIF9fZDE7IFwKKwlfX20gPSAoVVd0eXBlKSBfX3EwICogX19kMDsgXAorCV9fcjAgPSBfX3IwICogX19sbF9CIHwgX19sbF9sb3dwYXJ0KG4wKTsgXAorCWlmIChfX3IwIDwgX19tKSB7IFwKKwkJX19xMC0tLCBfX3IwICs9IChkKTsgXAorCQlpZiAoX19yMCA+PSAoZCkpIFwKKwkJCWlmIChfX3IwIDwgX19tKSBcCisJCQkJX19xMC0tLCBfX3IwICs9IChkKTsgXAorCX0gXAorCV9fcjAgLT0gX19tOyBcCisJXAorCShxKSA9IChVV3R5cGUpIF9fcTEgKiBfX2xsX0IgfCBfX3EwOyBcCisJKHIpID0gX19yMDsgXAorfSB3aGlsZSAoMCkKKworLyogSWYgdGhlIHByb2Nlc3NvciBoYXMgbm8gdWRpdl9xcm5uZCBidXQgc2Rpdl9xcm5uZCwgZ28gdGhyb3VnaAorCV9fdWRpdl93X3NkaXYgKGRlZmluZWQgaW4gbGliZ2NjIG9yIGVsc2V3aGVyZSkuICAqLworI2lmICFkZWZpbmVkKHVkaXZfcXJubmQpICYmIGRlZmluZWQoc2Rpdl9xcm5uZCkKKyNkZWZpbmUgdWRpdl9xcm5uZChxLCByLCBuaCwgbmwsIGQpIFwKK2RvIHsgXAorCVVXdHlwZSBfX3I7IFwKKwkocSkgPSBfX01QTih1ZGl2X3dfc2RpdikgKCZfX3IsIG5oLCBubCwgZCk7IFwKKwkocikgPSBfX3I7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworCS8qIElmIHVkaXZfcXJubmQgd2FzIG5vdCBkZWZpbmVkIGZvciB0aGlzIHByb2Nlc3NvciwgdXNlIF9fdWRpdl9xcm5uZF9jLiAgKi8KKyNpZiAhZGVmaW5lZCh1ZGl2X3Fybm5kKQorI2RlZmluZSBVRElWX05FRURTX05PUk1BTElaQVRJT04gMQorI2RlZmluZSB1ZGl2X3Fybm5kIF9fdWRpdl9xcm5uZF9jCisjZW5kaWYKKworI2lmbmRlZiBVRElWX05FRURTX05PUk1BTElaQVRJT04KKyNkZWZpbmUgVURJVl9ORUVEU19OT1JNQUxJWkFUSU9OIDAKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waS1iaXQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktYml0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAzNTM3ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktYml0LmMKQEAgLTAsMCArMSw1NiBAQAorLyogbXBpLWJpdC5jICAtICBNUEkgYml0IGxldmVsIGZ1Y250aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNkZWZpbmUgQV9MSU1CXzEgKChtcGlfbGltYl90KSAxKQorCisvKioqKioqKioqKioqKioqKgorICogU29tZXRpbWVzIHdlIGhhdmUgTVNMIChtb3N0IHNpZ25pZmljYW50IGxpbWJzKSB3aGljaCBhcmUgMDsKKyAqIHRoaXMgaXMgZm9yIHNvbWUgcmVhc29ucyBub3QgZ29vZCwgc28gdGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZW0uCisgKi8KK3ZvaWQgbXBpX25vcm1hbGl6ZShNUEkgYSkKK3sKKwlmb3IgKDsgYS0+bmxpbWJzICYmICFhLT5kW2EtPm5saW1icyAtIDFdOyBhLT5ubGltYnMtLSkKKwkJOworfQorCisvKioqKioqKioqKioqKioqKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBBLgorICovCit1bnNpZ25lZCBtcGlfZ2V0X25iaXRzKE1QSSBhKQoreworCXVuc2lnbmVkIG47CisKKwltcGlfbm9ybWFsaXplKGEpOworCisJaWYgKGEtPm5saW1icykgeworCQltcGlfbGltYl90IGFsaW1iID0gYS0+ZFthLT5ubGltYnMgLSAxXTsKKwkJaWYgKGFsaW1iKQorCQkJbiA9IGNvdW50X2xlYWRpbmdfemVyb3MoYWxpbWIpOworCQllbHNlCisJCQluID0gQklUU19QRVJfTVBJX0xJTUI7CisJCW4gPSBCSVRTX1BFUl9NUElfTElNQiAtIG4gKyAoYS0+bmxpbWJzIC0gMSkgKiBCSVRTX1BFUl9NUElfTElNQjsKKwl9IGVsc2UKKwkJbiA9IDA7CisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtcGlfZ2V0X25iaXRzKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktY21wLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpLWNtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNWU5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpLWNtcC5jCkBAIC0wLDAgKzEsNjggQEAKKy8qIG1waS1jbXAuYyAgLSAgTVBJIGZ1bmN0aW9ucworICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCitpbnQgbXBpX2NtcF91aShNUEkgdSwgdW5zaWduZWQgbG9uZyB2KQoreworCW1waV9saW1iX3QgbGltYiA9IHY7CisKKwltcGlfbm9ybWFsaXplKHUpOworCWlmICghdS0+bmxpbWJzICYmICFsaW1iKQorCQlyZXR1cm4gMDsKKwlpZiAodS0+c2lnbikKKwkJcmV0dXJuIC0xOworCWlmICh1LT5ubGltYnMgPiAxKQorCQlyZXR1cm4gMTsKKworCWlmICh1LT5kWzBdID09IGxpbWIpCisJCXJldHVybiAwOworCWVsc2UgaWYgKHUtPmRbMF0gPiBsaW1iKQorCQlyZXR1cm4gMTsKKwllbHNlCisJCXJldHVybiAtMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1waV9jbXBfdWkpOworCitpbnQgbXBpX2NtcChNUEkgdSwgTVBJIHYpCit7CisJbXBpX3NpemVfdCB1c2l6ZSwgdnNpemU7CisJaW50IGNtcDsKKworCW1waV9ub3JtYWxpemUodSk7CisJbXBpX25vcm1hbGl6ZSh2KTsKKwl1c2l6ZSA9IHUtPm5saW1iczsKKwl2c2l6ZSA9IHYtPm5saW1iczsKKwlpZiAoIXUtPnNpZ24gJiYgdi0+c2lnbikKKwkJcmV0dXJuIDE7CisJaWYgKHUtPnNpZ24gJiYgIXYtPnNpZ24pCisJCXJldHVybiAtMTsKKwlpZiAodXNpemUgIT0gdnNpemUgJiYgIXUtPnNpZ24gJiYgIXYtPnNpZ24pCisJCXJldHVybiB1c2l6ZSAtIHZzaXplOworCWlmICh1c2l6ZSAhPSB2c2l6ZSAmJiB1LT5zaWduICYmIHYtPnNpZ24pCisJCXJldHVybiB2c2l6ZSAtIHVzaXplOworCWlmICghdXNpemUpCisJCXJldHVybiAwOworCWNtcCA9IG1waWhlbHBfY21wKHUtPmQsIHYtPmQsIHVzaXplKTsKKwlpZiAodS0+c2lnbikKKwkJcmV0dXJuIC1jbXA7CisJcmV0dXJuIGNtcDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1waV9jbXApOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waS1pbmxpbmUuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktaW5saW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0NWVhMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktaW5saW5lLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qIG1waS1pbmxpbmUuaCAgLSAgSW50ZXJuYWwgdG8gdGhlIE11bHRpIFByZWNpc2lvbiBJbnRlZ2VycworICoJQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICoJIFRoZSBHTlUgTVAgTGlicmFyeSBpdHNlbGYgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSBMR1BMOworICoJIGhvd2V2ZXIgSSBkZWNpZGVkIHRvIHB1Ymxpc2ggdGhpcyBjb2RlIHVuZGVyIHRoZSBwbGFpbiBHUEwuCisgKi8KKworI2lmbmRlZiBHMTBfTVBJX0lOTElORV9ICisjZGVmaW5lIEcxMF9NUElfSU5MSU5FX0gKKworI2lmbmRlZiBHMTBfTVBJX0lOTElORV9ERUNMCisjZGVmaW5lIEcxMF9NUElfSU5MSU5FX0RFQ0wgIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCitHMTBfTVBJX0lOTElORV9ERUNMIG1waV9saW1iX3QKK21waWhlbHBfYWRkXzEobXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsCisJICAgICAgbXBpX3NpemVfdCBzMV9zaXplLCBtcGlfbGltYl90IHMyX2xpbWIpCit7CisJbXBpX2xpbWJfdCB4OworCisJeCA9ICpzMV9wdHIrKzsKKwlzMl9saW1iICs9IHg7CisJKnJlc19wdHIrKyA9IHMyX2xpbWI7CisJaWYgKHMyX2xpbWIgPCB4KSB7CS8qIHN1bSBpcyBsZXNzIHRoYW4gdGhlIGxlZnQgb3BlcmFuZDogaGFuZGxlIGNhcnJ5ICovCisJCXdoaWxlICgtLXMxX3NpemUpIHsKKwkJCXggPSAqczFfcHRyKysgKyAxOwkvKiBhZGQgY2FycnkgKi8KKwkJCSpyZXNfcHRyKysgPSB4OwkvKiBhbmQgc3RvcmUgKi8KKwkJCWlmICh4KQkvKiBub3QgMCAobm8gb3ZlcmZsb3cpOiB3ZSBjYW4gc3RvcCAqLworCQkJCWdvdG8gbGVhdmU7CisJCX0KKwkJcmV0dXJuIDE7CS8qIHJldHVybiBjYXJyeSAoc2l6ZSBvZiBzMSB0byBzbWFsbCkgKi8KKwl9CisKK2xlYXZlOgorCWlmIChyZXNfcHRyICE9IHMxX3B0cikgewkvKiBub3QgdGhlIHNhbWUgdmFyaWFibGUgKi8KKwkJbXBpX3NpemVfdCBpOwkvKiBjb3B5IHRoZSByZXN0ICovCisJCWZvciAoaSA9IDA7IGkgPCBzMV9zaXplIC0gMTsgaSsrKQorCQkJcmVzX3B0cltpXSA9IHMxX3B0cltpXTsKKwl9CisJcmV0dXJuIDA7CQkvKiBubyBjYXJyeSAqLworfQorCitHMTBfTVBJX0lOTElORV9ERUNMIG1waV9saW1iX3QKK21waWhlbHBfYWRkKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLCBtcGlfc2l6ZV90IHMxX3NpemUsCisJICAgIG1waV9wdHJfdCBzMl9wdHIsIG1waV9zaXplX3QgczJfc2l6ZSkKK3sKKwltcGlfbGltYl90IGN5ID0gMDsKKworCWlmIChzMl9zaXplKQorCQljeSA9IG1waWhlbHBfYWRkX24ocmVzX3B0ciwgczFfcHRyLCBzMl9wdHIsIHMyX3NpemUpOworCisJaWYgKHMxX3NpemUgLSBzMl9zaXplKQorCQljeSA9IG1waWhlbHBfYWRkXzEocmVzX3B0ciArIHMyX3NpemUsIHMxX3B0ciArIHMyX3NpemUsCisJCQkJICAgczFfc2l6ZSAtIHMyX3NpemUsIGN5KTsKKwlyZXR1cm4gY3k7Cit9CisKK0cxMF9NUElfSU5MSU5FX0RFQ0wgbXBpX2xpbWJfdAorbXBpaGVscF9zdWJfMShtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkgICAgICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYikKK3sKKwltcGlfbGltYl90IHg7CisKKwl4ID0gKnMxX3B0cisrOworCXMyX2xpbWIgPSB4IC0gczJfbGltYjsKKwkqcmVzX3B0cisrID0gczJfbGltYjsKKwlpZiAoczJfbGltYiA+IHgpIHsKKwkJd2hpbGUgKC0tczFfc2l6ZSkgeworCQkJeCA9ICpzMV9wdHIrKzsKKwkJCSpyZXNfcHRyKysgPSB4IC0gMTsKKwkJCWlmICh4KQorCQkJCWdvdG8gbGVhdmU7CisJCX0KKwkJcmV0dXJuIDE7CisJfQorCitsZWF2ZToKKwlpZiAocmVzX3B0ciAhPSBzMV9wdHIpIHsKKwkJbXBpX3NpemVfdCBpOworCQlmb3IgKGkgPSAwOyBpIDwgczFfc2l6ZSAtIDE7IGkrKykKKwkJCXJlc19wdHJbaV0gPSBzMV9wdHJbaV07CisJfQorCXJldHVybiAwOworfQorCitHMTBfTVBJX0lOTElORV9ERUNMIG1waV9saW1iX3QKK21waWhlbHBfc3ViKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLCBtcGlfc2l6ZV90IHMxX3NpemUsCisJICAgIG1waV9wdHJfdCBzMl9wdHIsIG1waV9zaXplX3QgczJfc2l6ZSkKK3sKKwltcGlfbGltYl90IGN5ID0gMDsKKworCWlmIChzMl9zaXplKQorCQljeSA9IG1waWhlbHBfc3ViX24ocmVzX3B0ciwgczFfcHRyLCBzMl9wdHIsIHMyX3NpemUpOworCisJaWYgKHMxX3NpemUgLSBzMl9zaXplKQorCQljeSA9IG1waWhlbHBfc3ViXzEocmVzX3B0ciArIHMyX3NpemUsIHMxX3B0ciArIHMyX3NpemUsCisJCQkJICAgczFfc2l6ZSAtIHMyX3NpemUsIGN5KTsKKwlyZXR1cm4gY3k7Cit9CisKKyNlbmRpZiAvKkcxMF9NUElfSU5MSU5FX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktaW50ZXJuYWwuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWNlZWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waS1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjU3IEBACisvKiBtcGktaW50ZXJuYWwuaCAgLSAgSW50ZXJuYWwgdG8gdGhlIE11bHRpIFByZWNpc2lvbiBJbnRlZ2VycworICoJQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoJQ29weXJpZ2h0IChDKSAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICoJIFRoZSBHTlUgTVAgTGlicmFyeSBpdHNlbGYgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSBMR1BMOworICoJIGhvd2V2ZXIgSSBkZWNpZGVkIHRvIHB1Ymxpc2ggdGhpcyBjb2RlIHVuZGVyIHRoZSBwbGFpbiBHUEwuCisgKi8KKworI2lmbmRlZiBHMTBfTVBJX0lOVEVSTkFMX0gKKyNkZWZpbmUgRzEwX01QSV9JTlRFUk5BTF9ICisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvbXBpLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2RlZmluZSBsb2dfZGVidWcgcHJpbnRrCisjZGVmaW5lIGxvZ19idWcgcHJpbnRrCisKKyNkZWZpbmUgYXNzZXJ0KHgpIFwKKwlkbyB7IFwKKwkJaWYgKCF4KSBcCisJCQlsb2dfYnVnKCJmYWlsZWQgYXNzZXJ0aW9uXG4iKTsgXAorCX0gd2hpbGUgKDApOworCisvKiBJZiBLQVJBVFNVQkFfVEhSRVNIT0xEIGlzIG5vdCBhbHJlYWR5IGRlZmluZWQsIGRlZmluZSBpdCB0byBhCisgKiB2YWx1ZSB3aGljaCBpcyBnb29kIG9uIG1vc3QgbWFjaGluZXMuICAqLworCisvKiB0ZXN0ZWQgNCwgMTYsIDMyIGFuZCA2NCwgd2hlcmUgMTYgZ2F2ZSB0aGUgYmVzdCBwZXJmb3JtYW5jZSB3aGVuCisgKiBjaGVja2luZyBhIDc2OCBhbmQgYSAxMDI0IGJpdCBFbEdhbWFsIHNpZ25hdHVyZS4KKyAqICh3ayAyMi4xMi45NykgKi8KKyNpZm5kZWYgS0FSQVRTVUJBX1RIUkVTSE9MRAorI2RlZmluZSBLQVJBVFNVQkFfVEhSRVNIT0xEIDE2CisjZW5kaWYKKworLyogVGhlIGNvZGUgY2FuJ3QgaGFuZGxlIEtBUkFUU1VCQV9USFJFU0hPTEQgc21hbGxlciB0aGFuIDIuICAqLworI2lmIEtBUkFUU1VCQV9USFJFU0hPTEQgPCAyCisjdW5kZWYgS0FSQVRTVUJBX1RIUkVTSE9MRAorI2RlZmluZSBLQVJBVFNVQkFfVEhSRVNIT0xEIDIKKyNlbmRpZgorCit0eXBlZGVmIG1waV9saW1iX3QgKm1waV9wdHJfdDsJLyogcG9pbnRlciB0byBhIGxpbWIgKi8KK3R5cGVkZWYgaW50IG1waV9zaXplX3Q7CQkvKiAobXVzdCBiZSBhIHNpZ25lZCB0eXBlKSAqLworCitzdGF0aWMgaW5saW5lIGludCBSRVNJWkVfSUZfTkVFREVEKE1QSSBhLCB1bnNpZ25lZCBiKQoreworCWlmIChhLT5hbGxvY2VkIDwgYikKKwkJcmV0dXJuIG1waV9yZXNpemUoYSwgYik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENvcHkgTiBsaW1icyBmcm9tIFMgdG8gRC4gICovCisjZGVmaW5lIE1QTl9DT1BZKGQsIHMsIG4pIFwKKwlkbyB7CQkJCQlcCisJCW1waV9zaXplX3QgX2k7CQkJXAorCQlmb3IgKF9pID0gMDsgX2kgPCAobik7IF9pKyspCVwKKwkJCShkKVtfaV0gPSAocylbX2ldOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBNUE5fQ09QWV9JTkNSKGQsIHMsIG4pIFwKKwlkbyB7CQkJCQlcCisJCW1waV9zaXplX3QgX2k7CQkJXAorCQlmb3IgKF9pID0gMDsgX2kgPCAobik7IF9pKyspCVwKKwkJCShkKVtfaV0gPSAocylbX2ldOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBNUE5fQ09QWV9ERUNSKGQsIHMsIG4pIFwKKwlkbyB7CQkJCQlcCisJCW1waV9zaXplX3QgX2k7CQkJXAorCQlmb3IgKF9pID0gKG4pLTE7IF9pID49IDA7IF9pLS0pIFwKKwkJCShkKVtfaV0gPSAocylbX2ldOwlcCisJfSB3aGlsZSAoMCkKKworLyogWmVybyBOIGxpbWJzIGF0IEQgKi8KKyNkZWZpbmUgTVBOX1pFUk8oZCwgbikgXAorCWRvIHsJCQkJCVwKKwkJaW50ICBfaTsJCQlcCisJCWZvciAoX2kgPSAwOyBfaSA8IChuKTsgX2krKykJXAorCQkJKGQpW19pXSA9IDA7CQlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBNUE5fTk9STUFMSVpFKGQsIG4pICBcCisJZG8gewkJCQkJXAorCQl3aGlsZSAoKG4pID4gMCkgewkJXAorCQkJaWYgKChkKVsobiktMV0pCQlcCisJCQkJYnJlYWs7CQlcCisJCQkobiktLTsJCQlcCisJCX0JCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBOX05PUk1BTElaRV9OT1RfWkVSTyhkLCBuKSBcCisJZG8gewkJCQlcCisJCWZvciAoOzspIHsJCVwKKwkJCWlmICgoZClbKG4pLTFdKQlcCisJCQkJYnJlYWs7CVwKKwkJCShuKS0tOwkJXAorCQl9CQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgTVBOX01VTF9OX1JFQ1VSU0UocHJvZHAsIHVwLCB2cCwgc2l6ZSwgdHNwYWNlKSBcCisJZG8gewkJCQkJCQlcCisJCWlmICgoc2l6ZSkgPCBLQVJBVFNVQkFfVEhSRVNIT0xEKQkJXAorCQkJbXVsX25fYmFzZWNhc2UocHJvZHAsIHVwLCB2cCwgc2l6ZSk7CVwKKwkJZWxzZQkJCQkJCVwKKwkJCW11bF9uKHByb2RwLCB1cCwgdnAsIHNpemUsIHRzcGFjZSk7CVwKKwl9IHdoaWxlICgwKTsKKworLyogRGl2aWRlIHRoZSB0d28tbGltYiBudW1iZXIgaW4gKE5ILCxOTCkgYnkgRCwgd2l0aCBESSBiZWluZyB0aGUgbGFyZ2VzdAorICogbGltYiBub3QgbGFyZ2VyIHRoYW4gKDIqKigyKkJJVFNfUEVSX01QX0xJTUIpKS9EIC0gKDIqKkJJVFNfUEVSX01QX0xJTUIpLgorICogSWYgdGhpcyB3b3VsZCB5aWVsZCBvdmVyZmxvdywgREkgc2hvdWxkIGJlIHRoZSBsYXJnZXN0IHBvc3NpYmxlIG51bWJlcgorICogKGkuZS4sIG9ubHkgb25lcykuICBGb3IgY29ycmVjdCBvcGVyYXRpb24sIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiBECisgKiBoYXMgdG8gYmUgc2V0LiAgUHV0IHRoZSBxdW90aWVudCBpbiBRIGFuZCB0aGUgcmVtYWluZGVyIGluIFIuCisgKi8KKyNkZWZpbmUgVURJVl9RUk5ORF9QUkVJTlYocSwgciwgbmgsIG5sLCBkLCBkaSkgXAorCWRvIHsJCQkJCQkJCVwKKwkJbXBpX2xpbWJfdCBfcSwgX3FsLCBfcjsJCQkJCVwKKwkJbXBpX2xpbWJfdCBfeGgsIF94bDsJCQkJCVwKKwkJdW11bF9wcG1tKF9xLCBfcWwsIChuaCksIChkaSkpOwkJCQlcCisJCV9xICs9IChuaCk7CS8qIERJIGlzIDIqKkJJVFNfUEVSX01QSV9MSU1CIHRvbyBzbWFsbCAqLyBcCisJCXVtdWxfcHBtbShfeGgsIF94bCwgX3EsIChkKSk7CQkJCVwKKwkJc3ViX2RkbW1zcyhfeGgsIF9yLCAobmgpLCAobmwpLCBfeGgsIF94bCk7CQlcCisJCWlmIChfeGgpIHsJCQkJCQlcCisJCQlzdWJfZGRtbXNzKF94aCwgX3IsIF94aCwgX3IsIDAsIChkKSk7CQlcCisJCQlfcSsrOwkJCQkJCVwKKwkJCWlmIChfeGgpIHsJCQkJCVwKKwkJCQlzdWJfZGRtbXNzKF94aCwgX3IsIF94aCwgX3IsIDAsIChkKSk7CVwKKwkJCQlfcSsrOwkJCQkJXAorCQkJfQkJCQkJCVwKKwkJfQkJCQkJCQlcCisJCWlmIChfciA+PSAoZCkpIHsJCQkJCVwKKwkJCV9yIC09IChkKTsJCQkJCVwKKwkJCV9xKys7CQkJCQkJXAorCQl9CQkJCQkJCVwKKwkJKHIpID0gX3I7CQkJCQkJXAorCQkocSkgPSBfcTsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworLyotLSBtcGl1dGlsLmMgLS0qLworbXBpX3B0cl90IG1waV9hbGxvY19saW1iX3NwYWNlKHVuc2lnbmVkIG5saW1icyk7Cit2b2lkIG1waV9mcmVlX2xpbWJfc3BhY2UobXBpX3B0cl90IGEpOwordm9pZCBtcGlfYXNzaWduX2xpbWJfc3BhY2UoTVBJIGEsIG1waV9wdHJfdCBhcCwgdW5zaWduZWQgbmxpbWJzKTsKKworLyotLSBtcGktYml0LmMgLS0qLwordm9pZCBtcGlfcnNoaWZ0X2xpbWJzKE1QSSBhLCB1bnNpZ25lZCBpbnQgY291bnQpOworaW50IG1waV9sc2hpZnRfbGltYnMoTVBJIGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisKKy8qLS0gbXBpaGVscC1hZGQuYyAtLSovCitzdGF0aWMgaW5saW5lIG1waV9saW1iX3QgbXBpaGVscF9hZGRfMShtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJCSBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYik7CittcGlfbGltYl90IG1waWhlbHBfYWRkX24obXBpX3B0cl90IHJlc19wdHIsIG1waV9wdHJfdCBzMV9wdHIsCisJCQkgbXBpX3B0cl90IHMyX3B0ciwgbXBpX3NpemVfdCBzaXplKTsKK3N0YXRpYyBpbmxpbmUgbXBpX2xpbWJfdCBtcGloZWxwX2FkZChtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwgbXBpX3NpemVfdCBzMV9zaXplLAorCQkgICAgICAgbXBpX3B0cl90IHMyX3B0ciwgbXBpX3NpemVfdCBzMl9zaXplKTsKKworLyotLSBtcGloZWxwLXN1Yi5jIC0tKi8KK3N0YXRpYyBpbmxpbmUgbXBpX2xpbWJfdCBtcGloZWxwX3N1Yl8xKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLAorCQkJIG1waV9zaXplX3QgczFfc2l6ZSwgbXBpX2xpbWJfdCBzMl9saW1iKTsKK21waV9saW1iX3QgbXBpaGVscF9zdWJfbihtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJCSBtcGlfcHRyX3QgczJfcHRyLCBtcGlfc2l6ZV90IHNpemUpOworc3RhdGljIGlubGluZSBtcGlfbGltYl90IG1waWhlbHBfc3ViKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLCBtcGlfc2l6ZV90IHMxX3NpemUsCisJCSAgICAgICBtcGlfcHRyX3QgczJfcHRyLCBtcGlfc2l6ZV90IHMyX3NpemUpOworCisvKi0tIG1waWhlbHAtY21wLmMgLS0qLworaW50IG1waWhlbHBfY21wKG1waV9wdHJfdCBvcDFfcHRyLCBtcGlfcHRyX3Qgb3AyX3B0ciwgbXBpX3NpemVfdCBzaXplKTsKKworLyotLSBtcGloZWxwLW11bC5jIC0tKi8KKworc3RydWN0IGthcmF0c3ViYV9jdHggeworCXN0cnVjdCBrYXJhdHN1YmFfY3R4ICpuZXh0OworCW1waV9wdHJfdCB0c3BhY2U7CisJbXBpX3NpemVfdCB0c3BhY2Vfc2l6ZTsKKwltcGlfcHRyX3QgdHA7CisJbXBpX3NpemVfdCB0cF9zaXplOworfTsKKwordm9pZCBtcGloZWxwX3JlbGVhc2Vfa2FyYXRzdWJhX2N0eChzdHJ1Y3Qga2FyYXRzdWJhX2N0eCAqY3R4KTsKKworbXBpX2xpbWJfdCBtcGloZWxwX2FkZG11bF8xKG1waV9wdHJfdCByZXNfcHRyLCBtcGlfcHRyX3QgczFfcHRyLAorCQkJICAgIG1waV9zaXplX3QgczFfc2l6ZSwgbXBpX2xpbWJfdCBzMl9saW1iKTsKK21waV9saW1iX3QgbXBpaGVscF9zdWJtdWxfMShtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJCSAgICBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYik7CitpbnQgbXBpaGVscF9tdWxfbihtcGlfcHRyX3QgcHJvZHAsIG1waV9wdHJfdCB1cCwgbXBpX3B0cl90IHZwLCBtcGlfc2l6ZV90IHNpemUpOworaW50IG1waWhlbHBfbXVsKG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLAorCQltcGlfcHRyX3QgdnAsIG1waV9zaXplX3QgdnNpemUsIG1waV9saW1iX3QgKl9yZXN1bHQpOwordm9pZCBtcGloX3Nxcl9uX2Jhc2VjYXNlKG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHNpemUpOwordm9pZCBtcGloX3Nxcl9uKG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHNpemUsCisJCW1waV9wdHJfdCB0c3BhY2UpOworCitpbnQgbXBpaGVscF9tdWxfa2FyYXRzdWJhX2Nhc2UobXBpX3B0cl90IHByb2RwLAorCQkJICAgICAgIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCB1c2l6ZSwKKwkJCSAgICAgICBtcGlfcHRyX3QgdnAsIG1waV9zaXplX3QgdnNpemUsCisJCQkgICAgICAgc3RydWN0IGthcmF0c3ViYV9jdHggKmN0eCk7CisKKy8qLS0gbXBpaGVscC1tdWxfMS5jIChvciB4eHgvY3B1LyAqLlMpIC0tKi8KK21waV9saW1iX3QgbXBpaGVscF9tdWxfMShtcGlfcHRyX3QgcmVzX3B0ciwgbXBpX3B0cl90IHMxX3B0ciwKKwkJCSBtcGlfc2l6ZV90IHMxX3NpemUsIG1waV9saW1iX3QgczJfbGltYik7CisKKy8qLS0gbXBpaGVscC1kaXYuYyAtLSovCittcGlfbGltYl90IG1waWhlbHBfbW9kXzEobXBpX3B0cl90IGRpdmlkZW5kX3B0ciwgbXBpX3NpemVfdCBkaXZpZGVuZF9zaXplLAorCQkJIG1waV9saW1iX3QgZGl2aXNvcl9saW1iKTsKK21waV9saW1iX3QgbXBpaGVscF9kaXZyZW0obXBpX3B0cl90IHFwLCBtcGlfc2l6ZV90IHFleHRyYV9saW1icywKKwkJCSAgbXBpX3B0cl90IG5wLCBtcGlfc2l6ZV90IG5zaXplLAorCQkJICBtcGlfcHRyX3QgZHAsIG1waV9zaXplX3QgZHNpemUpOworbXBpX2xpbWJfdCBtcGloZWxwX2Rpdm1vZF8xKG1waV9wdHJfdCBxdW90X3B0ciwKKwkJCSAgICBtcGlfcHRyX3QgZGl2aWRlbmRfcHRyLCBtcGlfc2l6ZV90IGRpdmlkZW5kX3NpemUsCisJCQkgICAgbXBpX2xpbWJfdCBkaXZpc29yX2xpbWIpOworCisvKi0tIG1waWhlbHAtc2hpZnQuYyAtLSovCittcGlfbGltYl90IG1waWhlbHBfbHNoaWZ0KG1waV9wdHJfdCB3cCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHVzaXplLAorCQkJICB1bnNpZ25lZCBjbnQpOworbXBpX2xpbWJfdCBtcGloZWxwX3JzaGlmdChtcGlfcHRyX3Qgd3AsIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCB1c2l6ZSwKKwkJCSAgdW5zaWduZWQgY250KTsKKworLyogRGVmaW5lIHN0dWZmIGZvciBsb25nbG9uZy5oLiAgKi8KKyNkZWZpbmUgV19UWVBFX1NJWkUgQklUU19QRVJfTVBJX0xJTUIKK3R5cGVkZWYgbXBpX2xpbWJfdCBVV3R5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBVSFd0eXBlOworI2lmIGRlZmluZWQoX19HTlVDX18pCit0eXBlZGVmIHVuc2lnbmVkIGludCBVUUl0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlKFFJKSkpOwordHlwZWRlZiBpbnQgU0l0eXBlIF9fYXR0cmlidXRlX18gKChtb2RlKFNJKSkpOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVVNJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZShTSSkpKTsKK3R5cGVkZWYgaW50IERJdHlwZSBfX2F0dHJpYnV0ZV9fICgobW9kZShESSkpKTsKK3R5cGVkZWYgdW5zaWduZWQgaW50IFVESXR5cGUgX19hdHRyaWJ1dGVfXyAoKG1vZGUoREkpKSk7CisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFVRSXR5cGU7Cit0eXBlZGVmIGxvbmcgU0l0eXBlOwordHlwZWRlZiB1bnNpZ25lZCBsb25nIFVTSXR5cGU7CisjZW5kaWYKKworI2lmZGVmIF9fR05VQ19fCisjaW5jbHVkZSAibXBpLWlubGluZS5oIgorI2VuZGlmCisKKyNlbmRpZiAvKkcxMF9NUElfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waS1wb3cuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktcG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRmMzQ1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGktcG93LmMKQEAgLTAsMCArMSwzMjggQEAKKy8qIG1waS1wb3cuYyAgLSAgTVBJIGZ1bmN0aW9ucworICoJQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2LCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICoJIFRoZSBHTlUgTVAgTGlicmFyeSBpdHNlbGYgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSBMR1BMOworICoJIGhvd2V2ZXIgSSBkZWNpZGVkIHRvIHB1Ymxpc2ggdGhpcyBjb2RlIHVuZGVyIHRoZSBwbGFpbiBHUEwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisjaW5jbHVkZSAibG9uZ2xvbmcuaCIKKworLyoqKioqKioqKioqKioqKioKKyAqIFJFUyA9IEJBU0UgXiBFWFAgbW9kIE1PRAorICovCitpbnQgbXBpX3Bvd20oTVBJIHJlcywgTVBJIGJhc2UsIE1QSSBleHAsIE1QSSBtb2QpCit7CisJbXBpX3B0cl90IG1wX21hcmtlciA9IE5VTEwsIGJwX21hcmtlciA9IE5VTEwsIGVwX21hcmtlciA9IE5VTEw7CisJc3RydWN0IGthcmF0c3ViYV9jdHgga2FyYWN0eCA9IHt9OworCW1waV9wdHJfdCB4cF9tYXJrZXIgPSBOVUxMOworCW1waV9wdHJfdCB0c3BhY2UgPSBOVUxMOworCW1waV9wdHJfdCBycCwgZXAsIG1wLCBicDsKKwltcGlfc2l6ZV90IGVzaXplLCBtc2l6ZSwgYnNpemUsIHJzaXplOworCWludCBlc2lnbiwgbXNpZ24sIGJzaWduLCByc2lnbjsKKwltcGlfc2l6ZV90IHNpemU7CisJaW50IG1vZF9zaGlmdF9jbnQ7CisJaW50IG5lZ2F0aXZlX3Jlc3VsdDsKKwlpbnQgYXNzaWduX3JwID0gMDsKKwltcGlfc2l6ZV90IHRzaXplID0gMDsJLyogdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZyAqLworCS8qIGZpeG1lOiB3ZSBzaG91bGQgY2hlY2sgdGhhdCB0aGUgd2FybmluZyBpcyB2b2lkICovCisJaW50IHJjID0gLUVOT01FTTsKKworCWVzaXplID0gZXhwLT5ubGltYnM7CisJbXNpemUgPSBtb2QtPm5saW1iczsKKwlzaXplID0gMiAqIG1zaXplOworCWVzaWduID0gZXhwLT5zaWduOworCW1zaWduID0gbW9kLT5zaWduOworCisJcnAgPSByZXMtPmQ7CisJZXAgPSBleHAtPmQ7CisKKwlpZiAoIW1zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghZXNpemUpIHsKKwkJLyogRXhwb25lbnQgaXMgemVybywgcmVzdWx0IGlzIDEgbW9kIE1PRCwgaS5lLiwgMSBvciAwCisJCSAqIGRlcGVuZGluZyBvbiBpZiBNT0QgZXF1YWxzIDEuICAqLworCQlyZXMtPm5saW1icyA9IChtc2l6ZSA9PSAxICYmIG1vZC0+ZFswXSA9PSAxKSA/IDAgOiAxOworCQlpZiAocmVzLT5ubGltYnMpIHsKKwkJCWlmIChtcGlfcmVzaXplKHJlcywgMSkgPCAwKQorCQkJCWdvdG8gZW5vbWVtOworCQkJcnAgPSByZXMtPmQ7CisJCQlycFswXSA9IDE7CisJCX0KKwkJcmVzLT5zaWduID0gMDsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwkvKiBOb3JtYWxpemUgTU9EIChpLmUuIG1ha2UgaXRzIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCkgYXMgcmVxdWlyZWQgYnkKKwkgKiBtcG5fZGl2cmVtLiAgVGhpcyB3aWxsIG1ha2UgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMgaW4gdGhlIGNhbGN1bGF0aW9uCisJICogc2xpZ2h0bHkgbGFyZ2VyLCBidXQgdGhlIGNvcnJlY3QgcmVzdWx0IGlzIG9idGFpbmVkIGFmdGVyIGEgZmluYWwKKwkgKiByZWR1Y3Rpb24gdXNpbmcgdGhlIG9yaWdpbmFsIE1PRCB2YWx1ZS4gICovCisJbXAgPSBtcF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZShtc2l6ZSk7CisJaWYgKCFtcCkKKwkJZ290byBlbm9tZW07CisJbW9kX3NoaWZ0X2NudCA9IGNvdW50X2xlYWRpbmdfemVyb3MobW9kLT5kW21zaXplIC0gMV0pOworCWlmIChtb2Rfc2hpZnRfY250KQorCQltcGloZWxwX2xzaGlmdChtcCwgbW9kLT5kLCBtc2l6ZSwgbW9kX3NoaWZ0X2NudCk7CisJZWxzZQorCQlNUE5fQ09QWShtcCwgbW9kLT5kLCBtc2l6ZSk7CisKKwlic2l6ZSA9IGJhc2UtPm5saW1iczsKKwlic2lnbiA9IGJhc2UtPnNpZ247CisJaWYgKGJzaXplID4gbXNpemUpIHsJLyogVGhlIGJhc2UgaXMgbGFyZ2VyIHRoYW4gdGhlIG1vZHVsZS4gUmVkdWNlIGl0LiAqLworCQkvKiBBbGxvY2F0ZSAoQlNJWkUgKyAxKSB3aXRoIHNwYWNlIGZvciByZW1haW5kZXIgYW5kIHF1b3RpZW50LgorCQkgKiAoVGhlIHF1b3RpZW50IGlzIChic2l6ZSAtIG1zaXplICsgMSkgbGltYnMuKSAgKi8KKwkJYnAgPSBicF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZShic2l6ZSArIDEpOworCQlpZiAoIWJwKQorCQkJZ290byBlbm9tZW07CisJCU1QTl9DT1BZKGJwLCBiYXNlLT5kLCBic2l6ZSk7CisJCS8qIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHF1b3RpZW50LCBzdG9yZSBpdCBhYm92ZSB0aGUgcmVtYWluZGVyLAorCQkgKiBhdCBCUCArIE1TSVpFLiAgKi8KKwkJbXBpaGVscF9kaXZyZW0oYnAgKyBtc2l6ZSwgMCwgYnAsIGJzaXplLCBtcCwgbXNpemUpOworCQlic2l6ZSA9IG1zaXplOworCQkvKiBDYW5vbmljYWxpemUgdGhlIGJhc2UsIHNpbmNlIHdlIGFyZSBnb2luZyB0byBtdWx0aXBseSB3aXRoIGl0CisJCSAqIHF1aXRlIGEgZmV3IHRpbWVzLiAgKi8KKwkJTVBOX05PUk1BTElaRShicCwgYnNpemUpOworCX0gZWxzZQorCQlicCA9IGJhc2UtPmQ7CisKKwlpZiAoIWJzaXplKSB7CisJCXJlcy0+bmxpbWJzID0gMDsKKwkJcmVzLT5zaWduID0gMDsKKwkJZ290byBsZWF2ZTsKKwl9CisKKwlpZiAocmVzLT5hbGxvY2VkIDwgc2l6ZSkgeworCQkvKiBXZSBoYXZlIHRvIGFsbG9jYXRlIG1vcmUgc3BhY2UgZm9yIFJFUy4gIElmIGFueSBvZiB0aGUgaW5wdXQKKwkJICogcGFyYW1ldGVycyBhcmUgaWRlbnRpY2FsIHRvIFJFUywgZGVmZXIgZGVhbGxvY2F0aW9uIG9mIHRoZSBvbGQKKwkJICogc3BhY2UuICAqLworCQlpZiAocnAgPT0gZXAgfHwgcnAgPT0gbXAgfHwgcnAgPT0gYnApIHsKKwkJCXJwID0gbXBpX2FsbG9jX2xpbWJfc3BhY2Uoc2l6ZSk7CisJCQlpZiAoIXJwKQorCQkJCWdvdG8gZW5vbWVtOworCQkJYXNzaWduX3JwID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChtcGlfcmVzaXplKHJlcywgc2l6ZSkgPCAwKQorCQkJCWdvdG8gZW5vbWVtOworCQkJcnAgPSByZXMtPmQ7CisJCX0KKwl9IGVsc2UgewkJLyogTWFrZSBCQVNFLCBFWFAgYW5kIE1PRCBub3Qgb3ZlcmxhcCB3aXRoIFJFUy4gICovCisJCWlmIChycCA9PSBicCkgeworCQkJLyogUkVTIGFuZCBCQVNFIGFyZSBpZGVudGljYWwuICBBbGxvY2F0ZSB0ZW1wLiBzcGFjZSBmb3IgQkFTRS4gICovCisJCQlCVUdfT04oYnBfbWFya2VyKTsKKwkJCWJwID0gYnBfbWFya2VyID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UoYnNpemUpOworCQkJaWYgKCFicCkKKwkJCQlnb3RvIGVub21lbTsKKwkJCU1QTl9DT1BZKGJwLCBycCwgYnNpemUpOworCQl9CisJCWlmIChycCA9PSBlcCkgeworCQkJLyogUkVTIGFuZCBFWFAgYXJlIGlkZW50aWNhbC4gIEFsbG9jYXRlIHRlbXAuIHNwYWNlIGZvciBFWFAuICAqLworCQkJZXAgPSBlcF9tYXJrZXIgPSBtcGlfYWxsb2NfbGltYl9zcGFjZShlc2l6ZSk7CisJCQlpZiAoIWVwKQorCQkJCWdvdG8gZW5vbWVtOworCQkJTVBOX0NPUFkoZXAsIHJwLCBlc2l6ZSk7CisJCX0KKwkJaWYgKHJwID09IG1wKSB7CisJCQkvKiBSRVMgYW5kIE1PRCBhcmUgaWRlbnRpY2FsLiAgQWxsb2NhdGUgdGVtcG9yYXJ5IHNwYWNlIGZvciBNT0QuICovCisJCQlCVUdfT04obXBfbWFya2VyKTsKKwkJCW1wID0gbXBfbWFya2VyID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UobXNpemUpOworCQkJaWYgKCFtcCkKKwkJCQlnb3RvIGVub21lbTsKKwkJCU1QTl9DT1BZKG1wLCBycCwgbXNpemUpOworCQl9CisJfQorCisJTVBOX0NPUFkocnAsIGJwLCBic2l6ZSk7CisJcnNpemUgPSBic2l6ZTsKKwlyc2lnbiA9IGJzaWduOworCisJeworCQltcGlfc2l6ZV90IGk7CisJCW1waV9wdHJfdCB4cDsKKwkJaW50IGM7CisJCW1waV9saW1iX3QgZTsKKwkJbXBpX2xpbWJfdCBjYXJyeV9saW1iOworCisJCXhwID0geHBfbWFya2VyID0gbXBpX2FsbG9jX2xpbWJfc3BhY2UoMiAqIChtc2l6ZSArIDEpKTsKKwkJaWYgKCF4cCkKKwkJCWdvdG8gZW5vbWVtOworCisJCW5lZ2F0aXZlX3Jlc3VsdCA9IChlcFswXSAmIDEpICYmIGJhc2UtPnNpZ247CisKKwkJaSA9IGVzaXplIC0gMTsKKwkJZSA9IGVwW2ldOworCQljID0gY291bnRfbGVhZGluZ196ZXJvcyhlKTsKKwkJZSA9IChlIDw8IGMpIDw8IDE7CS8qIHNoaWZ0IHRoZSBleHAgYml0cyB0byB0aGUgbGVmdCwgbG9zZSBtc2IgKi8KKwkJYyA9IEJJVFNfUEVSX01QSV9MSU1CIC0gMSAtIGM7CisKKwkJLyogTWFpbiBsb29wLgorCQkgKgorCQkgKiBNYWtlIHRoZSByZXN1bHQgYmUgcG9pbnRlZCB0byBhbHRlcm5hdGVseSBieSBYUCBhbmQgUlAuICBUaGlzCisJCSAqIGhlbHBzIHVzIGF2b2lkIGJsb2NrIGNvcHlpbmcsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBuZWNlc3NhcnkKKwkJICogd2l0aCB0aGUgb3ZlcmxhcCByZXN0cmljdGlvbnMgb2YgbXBpaGVscF9kaXZtb2QuIFdpdGggNTAlIHByb2JhYmlsaXR5CisJCSAqIHRoZSByZXN1bHQgYWZ0ZXIgdGhpcyBsb29wIHdpbGwgYmUgaW4gdGhlIGFyZWEgb3JpZ2luYWxseSBwb2ludGVkCisJCSAqIGJ5IFJQICg9PVJFUy0+ZCksIGFuZCB3aXRoIDUwJSBwcm9iYWJpbGl0eSBpbiB0aGUgYXJlYSBvcmlnaW5hbGx5CisJCSAqIHBvaW50ZWQgdG8gYnkgWFAuCisJCSAqLworCisJCWZvciAoOzspIHsKKwkJCXdoaWxlIChjKSB7CisJCQkJbXBpX3B0cl90IHRwOworCQkJCW1waV9zaXplX3QgeHNpemU7CisKKwkJCQkvKmlmIChtcGloZWxwX211bF9uKHhwLCBycCwgcnAsIHJzaXplKSA8IDApIGdvdG8gZW5vbWVtICovCisJCQkJaWYgKHJzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCkKKwkJCQkJbXBpaF9zcXJfbl9iYXNlY2FzZSh4cCwgcnAsIHJzaXplKTsKKwkJCQllbHNlIHsKKwkJCQkJaWYgKCF0c3BhY2UpIHsKKwkJCQkJCXRzaXplID0gMiAqIHJzaXplOworCQkJCQkJdHNwYWNlID0KKwkJCQkJCSAgICBtcGlfYWxsb2NfbGltYl9zcGFjZSh0c2l6ZSk7CisJCQkJCQlpZiAoIXRzcGFjZSkKKwkJCQkJCQlnb3RvIGVub21lbTsKKwkJCQkJfSBlbHNlIGlmICh0c2l6ZSA8ICgyICogcnNpemUpKSB7CisJCQkJCQltcGlfZnJlZV9saW1iX3NwYWNlKHRzcGFjZSk7CisJCQkJCQl0c2l6ZSA9IDIgKiByc2l6ZTsKKwkJCQkJCXRzcGFjZSA9CisJCQkJCQkgICAgbXBpX2FsbG9jX2xpbWJfc3BhY2UodHNpemUpOworCQkJCQkJaWYgKCF0c3BhY2UpCisJCQkJCQkJZ290byBlbm9tZW07CisJCQkJCX0KKwkJCQkJbXBpaF9zcXJfbih4cCwgcnAsIHJzaXplLCB0c3BhY2UpOworCQkJCX0KKworCQkJCXhzaXplID0gMiAqIHJzaXplOworCQkJCWlmICh4c2l6ZSA+IG1zaXplKSB7CisJCQkJCW1waWhlbHBfZGl2cmVtKHhwICsgbXNpemUsIDAsIHhwLCB4c2l6ZSwKKwkJCQkJCSAgICAgICBtcCwgbXNpemUpOworCQkJCQl4c2l6ZSA9IG1zaXplOworCQkJCX0KKworCQkJCXRwID0gcnA7CisJCQkJcnAgPSB4cDsKKwkJCQl4cCA9IHRwOworCQkJCXJzaXplID0geHNpemU7CisKKwkJCQlpZiAoKG1waV9saW1iX3NpZ25lZF90KSBlIDwgMCkgeworCQkJCQkvKm1waWhlbHBfbXVsKCB4cCwgcnAsIHJzaXplLCBicCwgYnNpemUgKTsgKi8KKwkJCQkJaWYgKGJzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCkgeworCQkJCQkJbXBpX2xpbWJfdCB0bXA7CisJCQkJCQlpZiAobXBpaGVscF9tdWwKKwkJCQkJCSAgICAoeHAsIHJwLCByc2l6ZSwgYnAsIGJzaXplLAorCQkJCQkJICAgICAmdG1wKSA8IDApCisJCQkJCQkJZ290byBlbm9tZW07CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAobXBpaGVscF9tdWxfa2FyYXRzdWJhX2Nhc2UKKwkJCQkJCSAgICAoeHAsIHJwLCByc2l6ZSwgYnAsIGJzaXplLAorCQkJCQkJICAgICAma2FyYWN0eCkgPCAwKQorCQkJCQkJCWdvdG8gZW5vbWVtOworCQkJCQl9CisKKwkJCQkJeHNpemUgPSByc2l6ZSArIGJzaXplOworCQkJCQlpZiAoeHNpemUgPiBtc2l6ZSkgeworCQkJCQkJbXBpaGVscF9kaXZyZW0oeHAgKyBtc2l6ZSwgMCwKKwkJCQkJCQkgICAgICAgeHAsIHhzaXplLCBtcCwKKwkJCQkJCQkgICAgICAgbXNpemUpOworCQkJCQkJeHNpemUgPSBtc2l6ZTsKKwkJCQkJfQorCisJCQkJCXRwID0gcnA7CisJCQkJCXJwID0geHA7CisJCQkJCXhwID0gdHA7CisJCQkJCXJzaXplID0geHNpemU7CisJCQkJfQorCQkJCWUgPDw9IDE7CisJCQkJYy0tOworCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJfQorCisJCQlpLS07CisJCQlpZiAoaSA8IDApCisJCQkJYnJlYWs7CisJCQllID0gZXBbaV07CisJCQljID0gQklUU19QRVJfTVBJX0xJTUI7CisJCX0KKworCQkvKiBXZSBzaGlmdGVkIE1PRCwgdGhlIG1vZHVsbyByZWR1Y3Rpb24gYXJndW1lbnQsIGxlZnQgTU9EX1NISUZUX0NOVAorCQkgKiBzdGVwcy4gIEFkanVzdCB0aGUgcmVzdWx0IGJ5IHJlZHVjaW5nIGl0IHdpdGggdGhlIG9yaWdpbmFsIE1PRC4KKwkJICoKKwkJICogQWxzbyBtYWtlIHN1cmUgdGhlIHJlc3VsdCBpcyBwdXQgaW4gUkVTLT5kICh3aGVyZSBpdCBhbHJlYWR5CisJCSAqIG1pZ2h0IGJlLCBzZWUgYWJvdmUpLgorCQkgKi8KKwkJaWYgKG1vZF9zaGlmdF9jbnQpIHsKKwkJCWNhcnJ5X2xpbWIgPQorCQkJICAgIG1waWhlbHBfbHNoaWZ0KHJlcy0+ZCwgcnAsIHJzaXplLCBtb2Rfc2hpZnRfY250KTsKKwkJCXJwID0gcmVzLT5kOworCQkJaWYgKGNhcnJ5X2xpbWIpIHsKKwkJCQlycFtyc2l6ZV0gPSBjYXJyeV9saW1iOworCQkJCXJzaXplKys7CisJCQl9CisJCX0gZWxzZSB7CisJCQlNUE5fQ09QWShyZXMtPmQsIHJwLCByc2l6ZSk7CisJCQlycCA9IHJlcy0+ZDsKKwkJfQorCisJCWlmIChyc2l6ZSA+PSBtc2l6ZSkgeworCQkJbXBpaGVscF9kaXZyZW0ocnAgKyBtc2l6ZSwgMCwgcnAsIHJzaXplLCBtcCwgbXNpemUpOworCQkJcnNpemUgPSBtc2l6ZTsKKwkJfQorCisJCS8qIFJlbW92ZSBhbnkgbGVhZGluZyB6ZXJvIHdvcmRzIGZyb20gdGhlIHJlc3VsdC4gICovCisJCWlmIChtb2Rfc2hpZnRfY250KQorCQkJbXBpaGVscF9yc2hpZnQocnAsIHJwLCByc2l6ZSwgbW9kX3NoaWZ0X2NudCk7CisJCU1QTl9OT1JNQUxJWkUocnAsIHJzaXplKTsKKwl9CisKKwlpZiAobmVnYXRpdmVfcmVzdWx0ICYmIHJzaXplKSB7CisJCWlmIChtb2Rfc2hpZnRfY250KQorCQkJbXBpaGVscF9yc2hpZnQobXAsIG1wLCBtc2l6ZSwgbW9kX3NoaWZ0X2NudCk7CisJCW1waWhlbHBfc3ViKHJwLCBtcCwgbXNpemUsIHJwLCByc2l6ZSk7CisJCXJzaXplID0gbXNpemU7CisJCXJzaWduID0gbXNpZ247CisJCU1QTl9OT1JNQUxJWkUocnAsIHJzaXplKTsKKwl9CisJcmVzLT5ubGltYnMgPSByc2l6ZTsKKwlyZXMtPnNpZ24gPSByc2lnbjsKKworbGVhdmU6CisJcmMgPSAwOworZW5vbWVtOgorCW1waWhlbHBfcmVsZWFzZV9rYXJhdHN1YmFfY3R4KCZrYXJhY3R4KTsKKwlpZiAoYXNzaWduX3JwKQorCQltcGlfYXNzaWduX2xpbWJfc3BhY2UocmVzLCBycCwgc2l6ZSk7CisJaWYgKG1wX21hcmtlcikKKwkJbXBpX2ZyZWVfbGltYl9zcGFjZShtcF9tYXJrZXIpOworCWlmIChicF9tYXJrZXIpCisJCW1waV9mcmVlX2xpbWJfc3BhY2UoYnBfbWFya2VyKTsKKwlpZiAoZXBfbWFya2VyKQorCQltcGlfZnJlZV9saW1iX3NwYWNlKGVwX21hcmtlcik7CisJaWYgKHhwX21hcmtlcikKKwkJbXBpX2ZyZWVfbGltYl9zcGFjZSh4cF9tYXJrZXIpOworCWlmICh0c3BhY2UpCisJCW1waV9mcmVlX2xpbWJfc3BhY2UodHNwYWNlKTsKKwlyZXR1cm4gcmM7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtcGlfcG93bSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpY29kZXIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGljb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWQ0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpY29kZXIuYwpAQCAtMCwwICsxLDQxNSBAQAorLyogbXBpY29kZXIuYyAgLSAgQ29kZXIgZm9yIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBNUElzCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR251UEcuCisgKgorICogR251UEcgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdudVBHIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY291bnRfemVyb3MuaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSAibXBpLWludGVybmFsLmgiCisKKyNkZWZpbmUgTUFYX0VYVEVSTl9NUElfQklUUyAxNjM4NAorCisvKioKKyAqIG1waV9yZWFkX3Jhd19kYXRhIC0gUmVhZCBhIHJhdyBieXRlIHN0cmVhbSBhcyBhIHBvc2l0aXZlIGludGVnZXIKKyAqIEB4YnVmZmVyOiBUaGUgZGF0YSB0byByZWFkCisgKiBAbmJ5dGVzOiBUaGUgYW1vdW50IG9mIGRhdGEgdG8gcmVhZAorICovCitNUEkgbXBpX3JlYWRfcmF3X2RhdGEoY29uc3Qgdm9pZCAqeGJ1ZmZlciwgc2l6ZV90IG5ieXRlcykKK3sKKwljb25zdCB1aW50OF90ICpidWZmZXIgPSB4YnVmZmVyOworCWludCBpLCBqOworCXVuc2lnbmVkIG5iaXRzLCBubGltYnM7CisJbXBpX2xpbWJfdCBhOworCU1QSSB2YWwgPSBOVUxMOworCisJd2hpbGUgKG5ieXRlcyA+IDAgJiYgYnVmZmVyWzBdID09IDApIHsKKwkJYnVmZmVyKys7CisJCW5ieXRlcy0tOworCX0KKworCW5iaXRzID0gbmJ5dGVzICogODsKKwlpZiAobmJpdHMgPiBNQVhfRVhURVJOX01QSV9CSVRTKSB7CisJCXByX2luZm8oIk1QSTogbXBpIHRvbyBsYXJnZSAoJXUgYml0cylcbiIsIG5iaXRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChuYnl0ZXMgPiAwKQorCQluYml0cyAtPSBjb3VudF9sZWFkaW5nX3plcm9zKGJ1ZmZlclswXSkgLSAoQklUU19QRVJfTE9ORyAtIDgpOworCisJbmxpbWJzID0gRElWX1JPVU5EX1VQKG5ieXRlcywgQllURVNfUEVSX01QSV9MSU1CKTsKKwl2YWwgPSBtcGlfYWxsb2MobmxpbWJzKTsKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIE5VTEw7CisJdmFsLT5uYml0cyA9IG5iaXRzOworCXZhbC0+c2lnbiA9IDA7CisJdmFsLT5ubGltYnMgPSBubGltYnM7CisKKwlpZiAobmJ5dGVzID4gMCkgeworCQlpID0gQllURVNfUEVSX01QSV9MSU1CIC0gbmJ5dGVzICUgQllURVNfUEVSX01QSV9MSU1COworCQlpICU9IEJZVEVTX1BFUl9NUElfTElNQjsKKwkJZm9yIChqID0gbmxpbWJzOyBqID4gMDsgai0tKSB7CisJCQlhID0gMDsKKwkJCWZvciAoOyBpIDwgQllURVNfUEVSX01QSV9MSU1COyBpKyspIHsKKwkJCQlhIDw8PSA4OworCQkJCWEgfD0gKmJ1ZmZlcisrOworCQkJfQorCQkJaSA9IDA7CisJCQl2YWwtPmRbaiAtIDFdID0gYTsKKwkJfQorCX0KKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwobXBpX3JlYWRfcmF3X2RhdGEpOworCitNUEkgbXBpX3JlYWRfZnJvbV9idWZmZXIoY29uc3Qgdm9pZCAqeGJ1ZmZlciwgdW5zaWduZWQgKnJldF9ucmVhZCkKK3sKKwljb25zdCB1aW50OF90ICpidWZmZXIgPSB4YnVmZmVyOworCXVuc2lnbmVkIGludCBuYml0cywgbmJ5dGVzOworCU1QSSB2YWw7CisKKwlpZiAoKnJldF9ucmVhZCA8IDIpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCW5iaXRzID0gYnVmZmVyWzBdIDw8IDggfCBidWZmZXJbMV07CisKKwlpZiAobmJpdHMgPiBNQVhfRVhURVJOX01QSV9CSVRTKSB7CisJCXByX2luZm8oIk1QSTogbXBpIHRvbyBsYXJnZSAoJXUgYml0cylcbiIsIG5iaXRzKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJbmJ5dGVzID0gRElWX1JPVU5EX1VQKG5iaXRzLCA4KTsKKwlpZiAobmJ5dGVzICsgMiA+ICpyZXRfbnJlYWQpIHsKKwkJcHJfaW5mbygiTVBJOiBtcGkgbGFyZ2VyIHRoYW4gYnVmZmVyIG5ieXRlcz0ldSByZXRfbnJlYWQ9JXVcbiIsCisJCQkJbmJ5dGVzLCAqcmV0X25yZWFkKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJdmFsID0gbXBpX3JlYWRfcmF3X2RhdGEoYnVmZmVyICsgMiwgbmJ5dGVzKTsKKwlpZiAoIXZhbCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkqcmV0X25yZWFkID0gbmJ5dGVzICsgMjsKKwlyZXR1cm4gdmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwobXBpX3JlYWRfZnJvbV9idWZmZXIpOworCitzdGF0aWMgaW50IGNvdW50X2x6ZXJvcyhNUEkgYSkKK3sKKwltcGlfbGltYl90IGFsaW1iOworCWludCBpLCBsemVyb3MgPSAwOworCisJZm9yIChpID0gYS0+bmxpbWJzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJYWxpbWIgPSBhLT5kW2ldOworCQlpZiAoYWxpbWIgPT0gMCkgeworCQkJbHplcm9zICs9IHNpemVvZihtcGlfbGltYl90KTsKKwkJfSBlbHNlIHsKKwkJCWx6ZXJvcyArPSBjb3VudF9sZWFkaW5nX3plcm9zKGFsaW1iKSAvIDg7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gbHplcm9zOworfQorCisvKioKKyAqIG1waV9yZWFkX2J1ZmZlcigpIC0gcmVhZCBNUEkgdG8gYSBidWZlciBwcm92aWRlZCBieSB1c2VyIChtc2IgZmlyc3QpCisgKgorICogQGE6CQlhIG11bHRpIHByZWNpc2lvbiBpbnRlZ2VyCisgKiBAYnVmOglidWZlciB0byB3aGljaCB0aGUgb3V0cHV0IHdpbGwgYmUgd3JpdHRlbiB0by4gTmVlZHMgdG8gYmUgYXQKKyAqCQlsZWFzZXQgbXBpX2dldF9zaXplKGEpIGxvbmcuCisgKiBAYnVmX2xlbjoJc2l6ZSBvZiB0aGUgYnVmLgorICogQG5ieXRlczoJcmVjZWl2ZXMgdGhlIGFjdHVhbCBsZW5ndGggb2YgdGhlIGRhdGEgd3JpdHRlbiBvbiBzdWNjZXNzIGFuZAorICoJCXRoZSBkYXRhIHRvLWJlLXdyaXR0ZW4gb24gLUVPVkVSRkxPVyBpbiBjYXNlIGJ1Zl9sZW4gd2FzIHRvbworICoJCXNtYWxsLgorICogQHNpZ246CWlmIG5vdCBOVUxMLCBpdCB3aWxsIGJlIHNldCB0byB0aGUgc2lnbiBvZiBhLgorICoKKyAqIFJldHVybjoJMCBvbiBzdWNjZXNzIG9yIGVycm9yIGNvZGUgaW4gY2FzZSBvZiBlcnJvcgorICovCitpbnQgbXBpX3JlYWRfYnVmZmVyKE1QSSBhLCB1aW50OF90ICpidWYsIHVuc2lnbmVkIGJ1Zl9sZW4sIHVuc2lnbmVkICpuYnl0ZXMsCisJCSAgICBpbnQgKnNpZ24pCit7CisJdWludDhfdCAqcDsKKyNpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gNAorCV9fYmUzMiBhbGltYjsKKyNlbGlmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA4CisJX19iZTY0IGFsaW1iOworI2Vsc2UKKyNlcnJvciBwbGVhc2UgaW1wbGVtZW50IGZvciB0aGlzIGxpbWIgc2l6ZS4KKyNlbmRpZgorCXVuc2lnbmVkIGludCBuID0gbXBpX2dldF9zaXplKGEpOworCWludCBpLCBsemVyb3M7CisKKwlpZiAoIWJ1ZiB8fCAhbmJ5dGVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChzaWduKQorCQkqc2lnbiA9IGEtPnNpZ247CisKKwlsemVyb3MgPSBjb3VudF9semVyb3MoYSk7CisKKwlpZiAoYnVmX2xlbiA8IG4gLSBsemVyb3MpIHsKKwkJKm5ieXRlcyA9IG4gLSBsemVyb3M7CisJCXJldHVybiAtRU9WRVJGTE9XOworCX0KKworCXAgPSBidWY7CisJKm5ieXRlcyA9IG4gLSBsemVyb3M7CisKKwlmb3IgKGkgPSBhLT5ubGltYnMgLSAxIC0gbHplcm9zIC8gQllURVNfUEVSX01QSV9MSU1CLAorCQkJbHplcm9zICU9IEJZVEVTX1BFUl9NUElfTElNQjsKKwkJaSA+PSAwOyBpLS0pIHsKKyNpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gNAorCQlhbGltYiA9IGNwdV90b19iZTMyKGEtPmRbaV0pOworI2VsaWYgQllURVNfUEVSX01QSV9MSU1CID09IDgKKwkJYWxpbWIgPSBjcHVfdG9fYmU2NChhLT5kW2ldKTsKKyNlbHNlCisjZXJyb3IgcGxlYXNlIGltcGxlbWVudCBmb3IgdGhpcyBsaW1iIHNpemUuCisjZW5kaWYKKwkJbWVtY3B5KHAsICh1OCAqKSZhbGltYiArIGx6ZXJvcywgQllURVNfUEVSX01QSV9MSU1CIC0gbHplcm9zKTsKKwkJcCArPSBCWVRFU19QRVJfTVBJX0xJTUIgLSBsemVyb3M7CisJCWx6ZXJvcyA9IDA7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwobXBpX3JlYWRfYnVmZmVyKTsKKworLyoKKyAqIG1waV9nZXRfYnVmZmVyKCkgLSBSZXR1cm5zIGFuIGFsbG9jYXRlZCBidWZmZXIgd2l0aCB0aGUgTVBJIChtc2IgZmlyc3QpLgorICogQ2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuIHN0cmluZy4KKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyByZXR1cm4gYSAwIGJ5dGUgYnVmZmVyIHdpdGggbmJ5dGVzIHNldCB0byB6ZXJvIGlmIHRoZQorICogdmFsdWUgb2YgQSBpcyB6ZXJvLgorICoKKyAqIEBhOgkJYSBtdWx0aSBwcmVjaXNpb24gaW50ZWdlci4KKyAqIEBuYnl0ZXM6CXJlY2VpdmVzIHRoZSBsZW5ndGggb2YgdGhpcyBidWZmZXIuCisgKiBAc2lnbjoJaWYgbm90IE5VTEwsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBzaWduIG9mIHRoZSBhLgorICoKKyAqIFJldHVybjoJUG9pbnRlciB0byBNUEkgYnVmZmVyIG9yIE5VTEwgb24gZXJyb3IKKyAqLwordm9pZCAqbXBpX2dldF9idWZmZXIoTVBJIGEsIHVuc2lnbmVkICpuYnl0ZXMsIGludCAqc2lnbikKK3sKKwl1aW50OF90ICpidWY7CisJdW5zaWduZWQgaW50IG47CisJaW50IHJldDsKKworCWlmICghbmJ5dGVzKQorCQlyZXR1cm4gTlVMTDsKKworCW4gPSBtcGlfZ2V0X3NpemUoYSk7CisKKwlpZiAoIW4pCisJCW4rKzsKKworCWJ1ZiA9IGttYWxsb2MobiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBtcGlfcmVhZF9idWZmZXIoYSwgYnVmLCBuLCBuYnl0ZXMsIHNpZ24pOworCisJaWYgKHJldCkgeworCQlrZnJlZShidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1waV9nZXRfYnVmZmVyKTsKKworLyoqCisgKiBtcGlfd3JpdGVfdG9fc2dsKCkgLSBGdW5uY3Rpb24gZXhwb3J0cyBNUEkgdG8gYW4gc2dsIChtc2IgZmlyc3QpCisgKgorICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG1waV9yZWFkX2J1ZmZlciwgYnV0IGl0CisgKiB0YWtlcyBhbiBzZ2wgaW5zdGVhZCBvZiB1OCAqIGJ1Zi4KKyAqCisgKiBAYToJCWEgbXVsdGkgcHJlY2lzaW9uIGludGVnZXIKKyAqIEBzZ2w6CXNjYXR0ZXJsaXN0IHRvIHdyaXRlIHRvLiBOZWVkcyB0byBiZSBhdCBsZWFzdAorICoJCW1waV9nZXRfc2l6ZShhKSBsb25nLgorICogQG5ieXRlczoJdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4gIExlYWRpbmcgYnl0ZXMgd2lsbCBiZQorICoJCWZpbGxlZCB3aXRoIHplcm8uCisgKiBAc2lnbjoJaWYgbm90IE5VTEwsIGl0IHdpbGwgYmUgc2V0IHRvIHRoZSBzaWduIG9mIGEuCisgKgorICogUmV0dXJuOgkwIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZSBpbiBjYXNlIG9mIGVycm9yCisgKi8KK2ludCBtcGlfd3JpdGVfdG9fc2dsKE1QSSBhLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgbmJ5dGVzLAorCQkgICAgIGludCAqc2lnbikKK3sKKwl1OCAqcCwgKnAyOworI2lmIEJZVEVTX1BFUl9NUElfTElNQiA9PSA0CisJX19iZTMyIGFsaW1iOworI2VsaWYgQllURVNfUEVSX01QSV9MSU1CID09IDgKKwlfX2JlNjQgYWxpbWI7CisjZWxzZQorI2Vycm9yIHBsZWFzZSBpbXBsZW1lbnQgZm9yIHRoaXMgbGltYiBzaXplLgorI2VuZGlmCisJdW5zaWduZWQgaW50IG4gPSBtcGlfZ2V0X3NpemUoYSk7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBtaXRlcjsKKwlpbnQgaSwgeCwgYnVmX2xlbjsKKwlpbnQgbmVudHM7CisKKwlpZiAoc2lnbikKKwkJKnNpZ24gPSBhLT5zaWduOworCisJaWYgKG5ieXRlcyA8IG4pCisJCXJldHVybiAtRU9WRVJGTE9XOworCisJbmVudHMgPSBzZ19uZW50c19mb3JfbGVuKHNnbCwgbmJ5dGVzKTsKKwlpZiAobmVudHMgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNnX21pdGVyX3N0YXJ0KCZtaXRlciwgc2dsLCBuZW50cywgU0dfTUlURVJfQVRPTUlDIHwgU0dfTUlURVJfVE9fU0cpOworCXNnX21pdGVyX25leHQoJm1pdGVyKTsKKwlidWZfbGVuID0gbWl0ZXIubGVuZ3RoOworCXAyID0gbWl0ZXIuYWRkcjsKKworCXdoaWxlIChuYnl0ZXMgPiBuKSB7CisJCWkgPSBtaW5fdCh1bnNpZ25lZCwgbmJ5dGVzIC0gbiwgYnVmX2xlbik7CisJCW1lbXNldChwMiwgMCwgaSk7CisJCXAyICs9IGk7CisJCW5ieXRlcyAtPSBpOworCisJCWJ1Zl9sZW4gLT0gaTsKKwkJaWYgKCFidWZfbGVuKSB7CisJCQlzZ19taXRlcl9uZXh0KCZtaXRlcik7CisJCQlidWZfbGVuID0gbWl0ZXIubGVuZ3RoOworCQkJcDIgPSBtaXRlci5hZGRyOworCQl9CisJfQorCisJZm9yIChpID0gYS0+bmxpbWJzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyNpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gNAorCQlhbGltYiA9IGEtPmRbaV0gPyBjcHVfdG9fYmUzMihhLT5kW2ldKSA6IDA7CisjZWxpZiBCWVRFU19QRVJfTVBJX0xJTUIgPT0gOAorCQlhbGltYiA9IGEtPmRbaV0gPyBjcHVfdG9fYmU2NChhLT5kW2ldKSA6IDA7CisjZWxzZQorI2Vycm9yIHBsZWFzZSBpbXBsZW1lbnQgZm9yIHRoaXMgbGltYiBzaXplLgorI2VuZGlmCisJCXAgPSAodTggKikmYWxpbWI7CisKKwkJZm9yICh4ID0gMDsgeCA8IHNpemVvZihhbGltYik7IHgrKykgeworCQkJKnAyKysgPSAqcCsrOworCQkJaWYgKCEtLWJ1Zl9sZW4pIHsKKwkJCQlzZ19taXRlcl9uZXh0KCZtaXRlcik7CisJCQkJYnVmX2xlbiA9IG1pdGVyLmxlbmd0aDsKKwkJCQlwMiA9IG1pdGVyLmFkZHI7CisJCQl9CisJCX0KKwl9CisKKwlzZ19taXRlcl9zdG9wKCZtaXRlcik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtcGlfd3JpdGVfdG9fc2dsKTsKKworLyoKKyAqIG1waV9yZWFkX3Jhd19mcm9tX3NnbCgpIC0gRnVuY3Rpb24gYWxsb2NhdGVzIGFuIE1QSSBhbmQgcG9wdWxhdGVzIGl0IHdpdGgKKyAqCQkJICAgICBkYXRhIGZyb20gdGhlIHNnbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gd29ya3MgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSBtcGlfcmVhZF9yYXdfZGF0YSwgYnV0IGl0CisgKiB0YWtlcyBhbiBzZ2wgaW5zdGVhZCBvZiB2b2lkICogYnVmZmVyLiBpLmUuIGl0IGFsbG9jYXRlcworICogYSBuZXcgTVBJIGFuZCByZWFkcyB0aGUgY29udGVudCBvZiB0aGUgc2dsIHRvIHRoZSBNUEkuCisgKgorICogQHNnbDoJc2NhdHRlcmxpc3QgdG8gcmVhZCBmcm9tCisgKiBAbmJ5dGVzOgludW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAorICoKKyAqIFJldHVybjoJUG9pbnRlciB0byBhIG5ldyBNUEkgb3IgTlVMTCBvbiBlcnJvcgorICovCitNUEkgbXBpX3JlYWRfcmF3X2Zyb21fc2dsKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKQoreworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgbWl0ZXI7CisJdW5zaWduZWQgaW50IG5iaXRzLCBubGltYnM7CisJaW50IHgsIGosIHosIGx6ZXJvcywgZW50czsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWNvbnN0IHU4ICpidWZmOworCW1waV9saW1iX3QgYTsKKwlNUEkgdmFsID0gTlVMTDsKKworCWVudHMgPSBzZ19uZW50c19mb3JfbGVuKHNnbCwgbmJ5dGVzKTsKKwlpZiAoZW50cyA8IDApCisJCXJldHVybiBOVUxMOworCisJc2dfbWl0ZXJfc3RhcnQoJm1pdGVyLCBzZ2wsIGVudHMsIFNHX01JVEVSX0FUT01JQyB8IFNHX01JVEVSX0ZST01fU0cpOworCisJbHplcm9zID0gMDsKKwlsZW4gPSAwOworCXdoaWxlIChuYnl0ZXMgPiAwKSB7CisJCXdoaWxlIChsZW4gJiYgISpidWZmKSB7CisJCQlsemVyb3MrKzsKKwkJCWxlbi0tOworCQkJYnVmZisrOworCQl9CisKKwkJaWYgKGxlbiAmJiAqYnVmZikKKwkJCWJyZWFrOworCisJCXNnX21pdGVyX25leHQoJm1pdGVyKTsKKwkJYnVmZiA9IG1pdGVyLmFkZHI7CisJCWxlbiA9IG1pdGVyLmxlbmd0aDsKKworCQluYnl0ZXMgLT0gbHplcm9zOworCQlsemVyb3MgPSAwOworCX0KKworCW1pdGVyLmNvbnN1bWVkID0gbHplcm9zOworCisJbmJ5dGVzIC09IGx6ZXJvczsKKwluYml0cyA9IG5ieXRlcyAqIDg7CisJaWYgKG5iaXRzID4gTUFYX0VYVEVSTl9NUElfQklUUykgeworCQlzZ19taXRlcl9zdG9wKCZtaXRlcik7CisJCXByX2luZm8oIk1QSTogbXBpIHRvbyBsYXJnZSAoJXUgYml0cylcbiIsIG5iaXRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKG5ieXRlcyA+IDApCisJCW5iaXRzIC09IGNvdW50X2xlYWRpbmdfemVyb3MoKmJ1ZmYpIC0gKEJJVFNfUEVSX0xPTkcgLSA4KTsKKworCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKKworCW5saW1icyA9IERJVl9ST1VORF9VUChuYnl0ZXMsIEJZVEVTX1BFUl9NUElfTElNQik7CisJdmFsID0gbXBpX2FsbG9jKG5saW1icyk7CisJaWYgKCF2YWwpCisJCXJldHVybiBOVUxMOworCisJdmFsLT5uYml0cyA9IG5iaXRzOworCXZhbC0+c2lnbiA9IDA7CisJdmFsLT5ubGltYnMgPSBubGltYnM7CisKKwlpZiAobmJ5dGVzID09IDApCisJCXJldHVybiB2YWw7CisKKwlqID0gbmxpbWJzIC0gMTsKKwlhID0gMDsKKwl6ID0gQllURVNfUEVSX01QSV9MSU1CIC0gbmJ5dGVzICUgQllURVNfUEVSX01QSV9MSU1COworCXogJT0gQllURVNfUEVSX01QSV9MSU1COworCisJd2hpbGUgKHNnX21pdGVyX25leHQoJm1pdGVyKSkgeworCQlidWZmID0gbWl0ZXIuYWRkcjsKKwkJbGVuID0gbWl0ZXIubGVuZ3RoOworCisJCWZvciAoeCA9IDA7IHggPCBsZW47IHgrKykgeworCQkJYSA8PD0gODsKKwkJCWEgfD0gKmJ1ZmYrKzsKKwkJCWlmICgoKHogKyB4ICsgMSkgJSBCWVRFU19QRVJfTVBJX0xJTUIpID09IDApIHsKKwkJCQl2YWwtPmRbai0tXSA9IGE7CisJCQkJYSA9IDA7CisJCQl9CisJCX0KKwkJeiArPSB4OworCX0KKworCXJldHVybiB2YWw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtcGlfcmVhZF9yYXdfZnJvbV9zZ2wpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waWgtY21wLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpaC1jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmZkMzk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waWgtY21wLmMKQEAgLTAsMCArMSw1NiBAQAorLyogbXBpaGVscC1zdWIuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqCUNvcHlyaWdodCAoQykgMTk5NCwgMTk5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCUNvcHlyaWdodCAoQykgMTk5OCwgMTk5OSwgMjAwMCwgMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHbnVQRy4KKyAqCisgKiBHbnVQRyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR251UEcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqCSBUaGUgR05VIE1QIExpYnJhcnkgaXRzZWxmIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgTEdQTDsKKyAqCSBob3dldmVyIEkgZGVjaWRlZCB0byBwdWJsaXNoIHRoaXMgY29kZSB1bmRlciB0aGUgcGxhaW4gR1BMLgorICovCisKKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKworLyoqKioqKioqKioqKioqKioKKyAqIENvbXBhcmUgT1AxX1BUUi9PUDFfU0laRSB3aXRoIE9QMl9QVFIvT1AyX1NJWkUuCisgKiBUaGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSByZWxhdGl2ZSBzaXplcyBvZgorICogdGhlIHR3byBhcmd1bWVudHMuCisgKiBSZXR1cm4gMSBpZiBPUDEgPiBPUDIsIDAgaWYgdGhleSBhcmUgZXF1YWwsIGFuZCAtMSBpZiBPUDEgPCBPUDIuCisgKi8KK2ludCBtcGloZWxwX2NtcChtcGlfcHRyX3Qgb3AxX3B0ciwgbXBpX3B0cl90IG9wMl9wdHIsIG1waV9zaXplX3Qgc2l6ZSkKK3sKKwltcGlfc2l6ZV90IGk7CisJbXBpX2xpbWJfdCBvcDFfd29yZCwgb3AyX3dvcmQ7CisKKwlmb3IgKGkgPSBzaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJb3AxX3dvcmQgPSBvcDFfcHRyW2ldOworCQlvcDJfd29yZCA9IG9wMl9wdHJbaV07CisJCWlmIChvcDFfd29yZCAhPSBvcDJfd29yZCkKKwkJCWdvdG8gZGlmZjsKKwl9CisJcmV0dXJuIDA7CisKK2RpZmY6CisJLyogVGhpcyBjYW4gKm5vdCogYmUgc2ltcGxpZmllZCB0bworCSAqICAgb3AyX3dvcmQgLSBvcDJfd29yZAorCSAqIHNpbmNlIHRoYXQgZXhwcmVzc2lvbiBtaWdodCBnaXZlIHNpZ25lZCBvdmVyZmxvdy4gICovCisJcmV0dXJuIChvcDFfd29yZCA+IG9wMl93b3JkKSA/IDEgOiAtMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGloLWRpdi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waWgtZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3ZDFkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGloLWRpdi5jCkBAIC0wLDAgKzEsMjM2IEBACisvKiBtcGloZWxwLWRpdi5jICAtICBNUEkgaGVscGVyIGZ1bmN0aW9ucworICoJQ29weXJpZ2h0IChDKSAxOTk0LCAxOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoJQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKgorICogTm90ZTogVGhpcyBjb2RlIGlzIGhlYXZpbHkgYmFzZWQgb24gdGhlIEdOVSBNUCBMaWJyYXJ5LgorICoJIEFjdHVhbGx5IGl0J3MgdGhlIHNhbWUgY29kZSB3aXRoIG9ubHkgbWlub3IgY2hhbmdlcyBpbiB0aGUKKyAqCSB3YXkgdGhlIGRhdGEgaXMgc3RvcmVkOyB0aGlzIGlzIHRvIHN1cHBvcnQgdGhlIGFic3RyYWN0aW9uCisgKgkgb2YgYW4gb3B0aW9uYWwgc2VjdXJlIG1lbW9yeSBhbGxvY2F0aW9uIHdoaWNoIG1heSBiZSB1c2VkCisgKgkgdG8gYXZvaWQgcmV2ZWFsaW5nIG9mIHNlbnNpdGl2ZSBkYXRhIGR1ZSB0byBwYWdpbmcgZXRjLgorICoJIFRoZSBHTlUgTVAgTGlicmFyeSBpdHNlbGYgaXMgcHVibGlzaGVkIHVuZGVyIHRoZSBMR1BMOworICoJIGhvd2V2ZXIgSSBkZWNpZGVkIHRvIHB1Ymxpc2ggdGhpcyBjb2RlIHVuZGVyIHRoZSBwbGFpbiBHUEwuCisgKi8KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorI2luY2x1ZGUgImxvbmdsb25nLmgiCisKKyNpZm5kZWYgVU1VTF9USU1FCisjZGVmaW5lIFVNVUxfVElNRSAxCisjZW5kaWYKKyNpZm5kZWYgVURJVl9USU1FCisjZGVmaW5lIFVESVZfVElNRSBVTVVMX1RJTUUKKyNlbmRpZgorCisvKiBEaXZpZGUgbnVtIChOUC9OU0laRSkgYnkgZGVuIChEUC9EU0laRSkgYW5kIHdyaXRlCisgKiB0aGUgTlNJWkUtRFNJWkUgbGVhc3Qgc2lnbmlmaWNhbnQgcXVvdGllbnQgbGltYnMgYXQgUVAKKyAqIGFuZCB0aGUgRFNJWkUgbG9uZyByZW1haW5kZXIgYXQgTlAuCUlmIFFFWFRSQV9MSU1CUyBpcworICogbm9uLXplcm8sIGdlbmVyYXRlIHRoYXQgbWFueSBmcmFjdGlvbiBiaXRzIGFuZCBhcHBlbmQgdGhlbSBhZnRlciB0aGUKKyAqIG90aGVyIHF1b3RpZW50IGxpbWJzLgorICogUmV0dXJuIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgdGhlIHF1b3RpZW50LCB0aGlzIGlzIGFsd2F5cyAwIG9yIDEuCisgKgorICogUHJlY29uZGl0aW9uczoKKyAqIDAuIE5TSVpFID49IERTSVpFLgorICogMS4gVGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBkaXZpc29yIG11c3QgYmUgc2V0LgorICogMi4gUVAgbXVzdCBlaXRoZXIgbm90IG92ZXJsYXAgd2l0aCB0aGUgaW5wdXQgb3BlcmFuZHMgYXQgYWxsLCBvcgorICogICAgUVAgKyBEU0laRSA+PSBOUCBtdXN0IGhvbGQgdHJ1ZS4JKFRoaXMgbWVhbnMgdGhhdCBpdCdzCisgKiAgICBwb3NzaWJsZSB0byBwdXQgdGhlIHF1b3RpZW50IGluIHRoZSBoaWdoIHBhcnQgb2YgTlVNLCByaWdodCBhZnRlciB0aGUKKyAqICAgIHJlbWFpbmRlciBpbiBOVU0uCisgKiAzLiBOU0laRSA+PSBEU0laRSwgZXZlbiBpZiBRRVhUUkFfTElNQlMgaXMgbm9uLXplcm8uCisgKi8KKworbXBpX2xpbWJfdAorbXBpaGVscF9kaXZyZW0obXBpX3B0cl90IHFwLCBtcGlfc2l6ZV90IHFleHRyYV9saW1icywKKwkgICAgICAgbXBpX3B0cl90IG5wLCBtcGlfc2l6ZV90IG5zaXplLCBtcGlfcHRyX3QgZHAsIG1waV9zaXplX3QgZHNpemUpCit7CisJbXBpX2xpbWJfdCBtb3N0X3NpZ25pZmljYW50X3FfbGltYiA9IDA7CisKKwlzd2l0Y2ggKGRzaXplKSB7CisJY2FzZSAwOgorCQkvKiBXZSBhcmUgYXNrZWQgdG8gZGl2aWRlIGJ5IHplcm8sIHNvIGdvIGFoZWFkIGFuZCBkbyBpdCEgIChUbyBtYWtlCisJCSAgIHRoZSBjb21waWxlciBub3QgcmVtb3ZlIHRoaXMgc3RhdGVtZW50LCByZXR1cm4gdGhlIHZhbHVlLikgICovCisJCS8qCisJCSAqIGV4aXN0aW5nIGNsaWVudHMgb2YgdGhpcyBmdW5jdGlvbiBoYXZlIGJlZW4gbW9kaWZpZWQKKwkJICogbm90IHRvIGNhbGwgaXQgd2l0aCBkc2l6ZSA9PSAwLCBzbyB0aGlzIHNob3VsZCBub3QgaGFwcGVuCisJCSAqLworCQlyZXR1cm4gMSAvIGRzaXplOworCisJY2FzZSAxOgorCQl7CisJCQltcGlfc2l6ZV90IGk7CisJCQltcGlfbGltYl90IG4xOworCQkJbXBpX2xpbWJfdCBkOworCisJCQlkID0gZHBbMF07CisJCQluMSA9IG5wW25zaXplIC0gMV07CisKKwkJCWlmIChuMSA+PSBkKSB7CisJCQkJbjEgLT0gZDsKKwkJCQltb3N0X3NpZ25pZmljYW50X3FfbGltYiA9IDE7CisJCQl9CisKKwkJCXFwICs9IHFleHRyYV9saW1iczsKKwkJCWZvciAoaSA9IG5zaXplIC0gMjsgaSA+PSAwOyBpLS0pCisJCQkJdWRpdl9xcm5uZChxcFtpXSwgbjEsIG4xLCBucFtpXSwgZCk7CisJCQlxcCAtPSBxZXh0cmFfbGltYnM7CisKKwkJCWZvciAoaSA9IHFleHRyYV9saW1icyAtIDE7IGkgPj0gMDsgaS0tKQorCQkJCXVkaXZfcXJubmQocXBbaV0sIG4xLCBuMSwgMCwgZCk7CisKKwkJCW5wWzBdID0gbjE7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIDI6CisJCXsKKwkJCW1waV9zaXplX3QgaTsKKwkJCW1waV9saW1iX3QgbjEsIG4wLCBuMjsKKwkJCW1waV9saW1iX3QgZDEsIGQwOworCisJCQlucCArPSBuc2l6ZSAtIDI7CisJCQlkMSA9IGRwWzFdOworCQkJZDAgPSBkcFswXTsKKwkJCW4xID0gbnBbMV07CisJCQluMCA9IG5wWzBdOworCisJCQlpZiAobjEgPj0gZDEgJiYgKG4xID4gZDEgfHwgbjAgPj0gZDApKSB7CisJCQkJc3ViX2RkbW1zcyhuMSwgbjAsIG4xLCBuMCwgZDEsIGQwKTsKKwkJCQltb3N0X3NpZ25pZmljYW50X3FfbGltYiA9IDE7CisJCQl9CisKKwkJCWZvciAoaSA9IHFleHRyYV9saW1icyArIG5zaXplIC0gMiAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJbXBpX2xpbWJfdCBxOworCQkJCW1waV9saW1iX3QgcjsKKworCQkJCWlmIChpID49IHFleHRyYV9saW1icykKKwkJCQkJbnAtLTsKKwkJCQllbHNlCisJCQkJCW5wWzBdID0gMDsKKworCQkJCWlmIChuMSA9PSBkMSkgeworCQkJCQkvKiBRIHNob3VsZCBiZSBlaXRoZXIgMTExLi4xMTEgb3IgMTExLi4xMTAuICBOZWVkIHNwZWNpYWwKKwkJCQkJICogdHJlYXRtZW50IG9mIHRoaXMgcmFyZSBjYXNlIGFzIG5vcm1hbCBkaXZpc2lvbiB3b3VsZAorCQkJCQkgKiBnaXZlIG92ZXJmbG93LiAgKi8KKwkJCQkJcSA9IH4obXBpX2xpbWJfdCkgMDsKKworCQkJCQlyID0gbjAgKyBkMTsKKwkJCQkJaWYgKHIgPCBkMSkgewkvKiBDYXJyeSBpbiB0aGUgYWRkaXRpb24/ICovCisJCQkJCQlhZGRfc3NhYWFhKG4xLCBuMCwgciAtIGQwLAorCQkJCQkJCSAgIG5wWzBdLCAwLCBkMCk7CisJCQkJCQlxcFtpXSA9IHE7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQluMSA9IGQwIC0gKGQwICE9IDAgPyAxIDogMCk7CisJCQkJCW4wID0gLWQwOworCQkJCX0gZWxzZSB7CisJCQkJCXVkaXZfcXJubmQocSwgciwgbjEsIG4wLCBkMSk7CisJCQkJCXVtdWxfcHBtbShuMSwgbjAsIGQwLCBxKTsKKwkJCQl9CisKKwkJCQluMiA9IG5wWzBdOworcV90ZXN0OgorCQkJCWlmIChuMSA+IHIgfHwgKG4xID09IHIgJiYgbjAgPiBuMikpIHsKKwkJCQkJLyogVGhlIGVzdGltYXRlZCBRIHdhcyB0b28gbGFyZ2UuICAqLworCQkJCQlxLS07CisJCQkJCXN1Yl9kZG1tc3MobjEsIG4wLCBuMSwgbjAsIDAsIGQwKTsKKwkJCQkJciArPSBkMTsKKwkJCQkJaWYgKHIgPj0gZDEpCS8qIElmIG5vdCBjYXJyeSwgdGVzdCBRIGFnYWluLiAgKi8KKwkJCQkJCWdvdG8gcV90ZXN0OworCQkJCX0KKworCQkJCXFwW2ldID0gcTsKKwkJCQlzdWJfZGRtbXNzKG4xLCBuMCwgciwgbjIsIG4xLCBuMCk7CisJCQl9CisJCQlucFsxXSA9IG4xOworCQkJbnBbMF0gPSBuMDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXsKKwkJCW1waV9zaXplX3QgaTsKKwkJCW1waV9saW1iX3QgZFgsIGQxLCBuMDsKKworCQkJbnAgKz0gbnNpemUgLSBkc2l6ZTsKKwkJCWRYID0gZHBbZHNpemUgLSAxXTsKKwkJCWQxID0gZHBbZHNpemUgLSAyXTsKKwkJCW4wID0gbnBbZHNpemUgLSAxXTsKKworCQkJaWYgKG4wID49IGRYKSB7CisJCQkJaWYgKG4wID4gZFgKKwkJCQkgICAgfHwgbXBpaGVscF9jbXAobnAsIGRwLCBkc2l6ZSAtIDEpID49IDApIHsKKwkJCQkJbXBpaGVscF9zdWJfbihucCwgbnAsIGRwLCBkc2l6ZSk7CisJCQkJCW4wID0gbnBbZHNpemUgLSAxXTsKKwkJCQkJbW9zdF9zaWduaWZpY2FudF9xX2xpbWIgPSAxOworCQkJCX0KKwkJCX0KKworCQkJZm9yIChpID0gcWV4dHJhX2xpbWJzICsgbnNpemUgLSBkc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQkJbXBpX2xpbWJfdCBxOworCQkJCW1waV9saW1iX3QgbjEsIG4yOworCQkJCW1waV9saW1iX3QgY3lfbGltYjsKKworCQkJCWlmIChpID49IHFleHRyYV9saW1icykgeworCQkJCQlucC0tOworCQkJCQluMiA9IG5wW2RzaXplXTsKKwkJCQl9IGVsc2UgeworCQkJCQluMiA9IG5wW2RzaXplIC0gMV07CisJCQkJCU1QTl9DT1BZX0RFQ1IobnAgKyAxLCBucCwgZHNpemUgLSAxKTsKKwkJCQkJbnBbMF0gPSAwOworCQkJCX0KKworCQkJCWlmIChuMCA9PSBkWCkgeworCQkJCQkvKiBUaGlzIG1pZ2h0IG92ZXItZXN0aW1hdGUgcSwgYnV0IGl0J3MgcHJvYmFibHkgbm90IHdvcnRoCisJCQkJCSAqIHRoZSBleHRyYSBjb2RlIGhlcmUgdG8gZmluZCBvdXQuICAqLworCQkJCQlxID0gfihtcGlfbGltYl90KSAwOworCQkJCX0gZWxzZSB7CisJCQkJCW1waV9saW1iX3QgcjsKKworCQkJCQl1ZGl2X3Fybm5kKHEsIHIsIG4wLCBucFtkc2l6ZSAtIDFdLCBkWCk7CisJCQkJCXVtdWxfcHBtbShuMSwgbjAsIGQxLCBxKTsKKworCQkJCQl3aGlsZSAobjEgPiByCisJCQkJCSAgICAgICB8fCAobjEgPT0gcgorCQkJCQkJICAgJiYgbjAgPiBucFtkc2l6ZSAtIDJdKSkgeworCQkJCQkJcS0tOworCQkJCQkJciArPSBkWDsKKwkJCQkJCWlmIChyIDwgZFgpCS8qIEkuZS4gImNhcnJ5IGluIHByZXZpb3VzIGFkZGl0aW9uPyIgKi8KKwkJCQkJCQlicmVhazsKKwkJCQkJCW4xIC09IG4wIDwgZDE7CisJCQkJCQluMCAtPSBkMTsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIFBvc3NpYmxlIG9wdGltaXphdGlvbjogV2UgYWxyZWFkeSBoYXZlIChxICogbjApIGFuZCAoMSAqIG4xKQorCQkJCSAqIGFmdGVyIHRoZSBjYWxjdWxhdGlvbiBvZiBxLiAgVGFraW5nIGFkdmFudGFnZSBvZiB0aGF0LCB3ZQorCQkJCSAqIGNvdWxkIG1ha2UgdGhpcyBsb29wIG1ha2UgdHdvIGl0ZXJhdGlvbnMgbGVzcy4gICovCisJCQkJY3lfbGltYiA9IG1waWhlbHBfc3VibXVsXzEobnAsIGRwLCBkc2l6ZSwgcSk7CisKKwkJCQlpZiAobjIgIT0gY3lfbGltYikgeworCQkJCQltcGloZWxwX2FkZF9uKG5wLCBucCwgZHAsIGRzaXplKTsKKwkJCQkJcS0tOworCQkJCX0KKworCQkJCXFwW2ldID0gcTsKKwkJCQluMCA9IG5wW2RzaXplIC0gMV07CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gbW9zdF9zaWduaWZpY2FudF9xX2xpbWI7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpaC1tdWwuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL21waS9tcGloLW11bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODQxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpaC1tdWwuYwpAQCAtMCwwICsxLDQ5NyBAQAorLyogbXBpaGVscC1tdWwuYyAgLSAgTVBJIGhlbHBlciBmdW5jdGlvbnMKKyAqIENvcHlyaWdodCAoQykgMTk5NCwgMTk5NiwgMTk5OCwgMTk5OSwKKyAqICAgICAgICAgICAgICAgMjAwMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBHbnVQRy4KKyAqCisgKiBHbnVQRyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR251UEcgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQQorICoKKyAqIE5vdGU6IFRoaXMgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBHTlUgTVAgTGlicmFyeS4KKyAqCSBBY3R1YWxseSBpdCdzIHRoZSBzYW1lIGNvZGUgd2l0aCBvbmx5IG1pbm9yIGNoYW5nZXMgaW4gdGhlCisgKgkgd2F5IHRoZSBkYXRhIGlzIHN0b3JlZDsgdGhpcyBpcyB0byBzdXBwb3J0IHRoZSBhYnN0cmFjdGlvbgorICoJIG9mIGFuIG9wdGlvbmFsIHNlY3VyZSBtZW1vcnkgYWxsb2NhdGlvbiB3aGljaCBtYXkgYmUgdXNlZAorICoJIHRvIGF2b2lkIHJldmVhbGluZyBvZiBzZW5zaXRpdmUgZGF0YSBkdWUgdG8gcGFnaW5nIGV0Yy4KKyAqCSBUaGUgR05VIE1QIExpYnJhcnkgaXRzZWxmIGlzIHB1Ymxpc2hlZCB1bmRlciB0aGUgTEdQTDsKKyAqCSBob3dldmVyIEkgZGVjaWRlZCB0byBwdWJsaXNoIHRoaXMgY29kZSB1bmRlciB0aGUgcGxhaW4gR1BMLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlICJtcGktaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJsb25nbG9uZy5oIgorCisjZGVmaW5lIE1QTl9NVUxfTl9SRUNVUlNFKHByb2RwLCB1cCwgdnAsIHNpemUsIHRzcGFjZSkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJaWYgKChzaXplKSA8IEtBUkFUU1VCQV9USFJFU0hPTEQpCQlcCisJCQltdWxfbl9iYXNlY2FzZShwcm9kcCwgdXAsIHZwLCBzaXplKTsJXAorCQllbHNlCQkJCQkJXAorCQkJbXVsX24ocHJvZHAsIHVwLCB2cCwgc2l6ZSwgdHNwYWNlKTsJXAorCX0gd2hpbGUgKDApOworCisjZGVmaW5lIE1QTl9TUVJfTl9SRUNVUlNFKHByb2RwLCB1cCwgc2l6ZSwgdHNwYWNlKQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoKHNpemUpIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCkJCVwKKwkJCW1waWhfc3FyX25fYmFzZWNhc2UocHJvZHAsIHVwLCBzaXplKTsJXAorCQllbHNlCQkJCQkJXAorCQkJbXBpaF9zcXJfbihwcm9kcCwgdXAsIHNpemUsIHRzcGFjZSk7CVwKKwl9IHdoaWxlICgwKTsKKworLyogTXVsdGlwbHkgdGhlIG5hdHVyYWwgbnVtYmVycyB1IChwb2ludGVkIHRvIGJ5IFVQKSBhbmQgdiAocG9pbnRlZCB0byBieSBWUCksCisgKiBib3RoIHdpdGggU0laRSBsaW1icywgYW5kIHN0b3JlIHRoZSByZXN1bHQgYXQgUFJPRFAuICAyICogU0laRSBsaW1icyBhcmUKKyAqIGFsd2F5cyBzdG9yZWQuICBSZXR1cm4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbGltYi4KKyAqCisgKiBBcmd1bWVudCBjb25zdHJhaW50czoKKyAqIDEuIFBST0RQICE9IFVQIGFuZCBQUk9EUCAhPSBWUCwgaS5lLiB0aGUgZGVzdGluYXRpb24KKyAqICAgIG11c3QgYmUgZGlzdGluY3QgZnJvbSB0aGUgbXVsdGlwbGllciBhbmQgdGhlIG11bHRpcGxpY2FuZC4KKyAqCisgKgorICogSGFuZGxlIHNpbXBsZSBjYXNlcyB3aXRoIHRyYWRpdGlvbmFsIG11bHRpcGxpY2F0aW9uLgorICoKKyAqIFRoaXMgaXMgdGhlIG1vc3QgY3JpdGljYWwgY29kZSBvZiBtdWx0aXBsaWNhdGlvbi4gIEFsbCBtdWx0aXBsaWVzIHJlbHkKKyAqIG9uIHRoaXMsIGJvdGggc21hbGwgYW5kIGh1Z2UuICBTbWFsbCBvbmVzIGFycml2ZSBoZXJlIGltbWVkaWF0ZWx5LiAgSHVnZQorICogb25lcyBhcnJpdmUgaGVyZSBhcyB0aGlzIGlzIHRoZSBiYXNlIGNhc2UgZm9yIEthcmF0c3ViYSdzIHJlY3Vyc2l2ZQorICogYWxnb3JpdGhtIGJlbG93LgorICovCisKK3N0YXRpYyBtcGlfbGltYl90CittdWxfbl9iYXNlY2FzZShtcGlfcHRyX3QgcHJvZHAsIG1waV9wdHJfdCB1cCwgbXBpX3B0cl90IHZwLCBtcGlfc2l6ZV90IHNpemUpCit7CisJbXBpX3NpemVfdCBpOworCW1waV9saW1iX3QgY3k7CisJbXBpX2xpbWJfdCB2X2xpbWI7CisKKwkvKiBNdWx0aXBseSBieSB0aGUgZmlyc3QgbGltYiBpbiBWIHNlcGFyYXRlbHksIGFzIHRoZSByZXN1bHQgY2FuIGJlCisJICogc3RvcmVkIChub3QgYWRkZWQpIHRvIFBST0QuICBXZSBhbHNvIGF2b2lkIGEgbG9vcCBmb3IgemVyb2luZy4gICovCisJdl9saW1iID0gdnBbMF07CisJaWYgKHZfbGltYiA8PSAxKSB7CisJCWlmICh2X2xpbWIgPT0gMSkKKwkJCU1QTl9DT1BZKHByb2RwLCB1cCwgc2l6ZSk7CisJCWVsc2UKKwkJCU1QTl9aRVJPKHByb2RwLCBzaXplKTsKKwkJY3kgPSAwOworCX0gZWxzZQorCQljeSA9IG1waWhlbHBfbXVsXzEocHJvZHAsIHVwLCBzaXplLCB2X2xpbWIpOworCisJcHJvZHBbc2l6ZV0gPSBjeTsKKwlwcm9kcCsrOworCisJLyogRm9yIGVhY2ggaXRlcmF0aW9uIGluIHRoZSBvdXRlciBsb29wLCBtdWx0aXBseSBvbmUgbGltYiBmcm9tCisJICogVSB3aXRoIG9uZSBsaW1iIGZyb20gViwgYW5kIGFkZCBpdCB0byBQUk9ELiAgKi8KKwlmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXZfbGltYiA9IHZwW2ldOworCQlpZiAodl9saW1iIDw9IDEpIHsKKwkJCWN5ID0gMDsKKwkJCWlmICh2X2xpbWIgPT0gMSkKKwkJCQljeSA9IG1waWhlbHBfYWRkX24ocHJvZHAsIHByb2RwLCB1cCwgc2l6ZSk7CisJCX0gZWxzZQorCQkJY3kgPSBtcGloZWxwX2FkZG11bF8xKHByb2RwLCB1cCwgc2l6ZSwgdl9saW1iKTsKKworCQlwcm9kcFtzaXplXSA9IGN5OworCQlwcm9kcCsrOworCX0KKworCXJldHVybiBjeTsKK30KKworc3RhdGljIHZvaWQKK211bF9uKG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfcHRyX3QgdnAsCisJCW1waV9zaXplX3Qgc2l6ZSwgbXBpX3B0cl90IHRzcGFjZSkKK3sKKwlpZiAoc2l6ZSAmIDEpIHsKKwkJLyogVGhlIHNpemUgaXMgb2RkLCBhbmQgdGhlIGNvZGUgYmVsb3cgZG9lc24ndCBoYW5kbGUgdGhhdC4KKwkJICogTXVsdGlwbHkgdGhlIGxlYXN0IHNpZ25pZmljYW50IChzaXplIC0gMSkgbGltYnMgd2l0aCBhIHJlY3Vyc2l2ZQorCQkgKiBjYWxsLCBhbmQgaGFuZGxlIHRoZSBtb3N0IHNpZ25pZmljYW50IGxpbWIgb2YgUzEgYW5kIFMyCisJCSAqIHNlcGFyYXRlbHkuCisJCSAqIEEgc2xpZ2h0bHkgZmFzdGVyIHdheSB0byBkbyB0aGlzIHdvdWxkIGJlIHRvIG1ha2UgdGhlIEthcmF0c3ViYQorCQkgKiBjb2RlIGJlbG93IGJlaGF2ZSBhcyBpZiB0aGUgc2l6ZSB3ZXJlIGV2ZW4sIGFuZCBsZXQgaXQgY2hlY2sgZm9yCisJCSAqIG9kZCBzaXplIGluIHRoZSBlbmQuICBJLmUuLCBpbiBlc3NlbmNlIG1vdmUgdGhpcyBjb2RlIHRvIHRoZSBlbmQuCisJCSAqIERvaW5nIHNvIHdvdWxkIHNhdmUgdXMgYSByZWN1cnNpdmUgY2FsbCwgYW5kIHBvdGVudGlhbGx5IG1ha2UgdGhlCisJCSAqIHN0YWNrIGdyb3cgYSBsb3QgbGVzcy4KKwkJICovCisJCW1waV9zaXplX3QgZXNpemUgPSBzaXplIC0gMTsJLyogZXZlbiBzaXplICovCisJCW1waV9saW1iX3QgY3lfbGltYjsKKworCQlNUE5fTVVMX05fUkVDVVJTRShwcm9kcCwgdXAsIHZwLCBlc2l6ZSwgdHNwYWNlKTsKKwkJY3lfbGltYiA9IG1waWhlbHBfYWRkbXVsXzEocHJvZHAgKyBlc2l6ZSwgdXAsIGVzaXplLCB2cFtlc2l6ZV0pOworCQlwcm9kcFtlc2l6ZSArIGVzaXplXSA9IGN5X2xpbWI7CisJCWN5X2xpbWIgPSBtcGloZWxwX2FkZG11bF8xKHByb2RwICsgZXNpemUsIHZwLCBzaXplLCB1cFtlc2l6ZV0pOworCQlwcm9kcFtlc2l6ZSArIHNpemVdID0gY3lfbGltYjsKKwl9IGVsc2UgeworCQkvKiBBbmF0b2xpaiBBbGVrc2VldmljaCBLYXJhdHN1YmEncyBkaXZpZGUtYW5kLWNvbnF1ZXIgYWxnb3JpdGhtLgorCQkgKgorCQkgKiBTcGxpdCBVIGluIHR3byBwaWVjZXMsIFUxIGFuZCBVMCwgc3VjaCB0aGF0CisJCSAqIFUgPSBVMCArIFUxKihCKipuKSwKKwkJICogYW5kIFYgaW4gVjEgYW5kIFYwLCBzdWNoIHRoYXQKKwkJICogViA9IFYwICsgVjEqKEIqKm4pLgorCQkgKgorCQkgKiBVViBpcyB0aGVuIGNvbXB1dGVkIHJlY3Vyc2l2ZWx5IHVzaW5nIHRoZSBpZGVudGl0eQorCQkgKgorCQkgKiAgICAgICAgMm4gICBuICAgICAgICAgIG4gICAgICAgICAgICAgICAgICAgICBuCisJCSAqIFVWID0gKEIgICsgQiApVSBWICArICBCIChVIC1VICkoViAtViApICArICAoQiArIDEpVSBWCisJCSAqICAgICAgICAgICAgICAgIDEgMSAgICAgICAgMSAgMCAgIDAgIDEgICAgICAgICAgICAgIDAgMAorCQkgKgorCQkgKiBXaGVyZSBCID0gMioqQklUU19QRVJfTVBfTElNQi4KKwkJICovCisJCW1waV9zaXplX3QgaHNpemUgPSBzaXplID4+IDE7CisJCW1waV9saW1iX3QgY3k7CisJCWludCBuZWdmbGc7CisKKwkJLyogUHJvZHVjdCBILiAgICAgIF9fX19fX19fX19fX19fX18gIF9fX19fX19fX19fX19fX18KKwkJICogICAgICAgICAgICAgICAgfF9fX19fVTEgeCBWMV9fX198fF9fX19VMCB4IFYwX19fX198CisJCSAqIFB1dCByZXN1bHQgaW4gdXBwZXIgcGFydCBvZiBQUk9EIGFuZCBwYXNzIGxvdyBwYXJ0IG9mIFRTUEFDRQorCQkgKiBhcyBuZXcgVFNQQUNFLgorCQkgKi8KKwkJTVBOX01VTF9OX1JFQ1VSU0UocHJvZHAgKyBzaXplLCB1cCArIGhzaXplLCB2cCArIGhzaXplLCBoc2l6ZSwKKwkJCQkgIHRzcGFjZSk7CisKKwkJLyogUHJvZHVjdCBNLiAgICAgIF9fX19fX19fX19fX19fX18KKwkJICogICAgICAgICAgICAgICAgfF8oVTEtVTApKFYwLVYxKV98CisJCSAqLworCQlpZiAobXBpaGVscF9jbXAodXAgKyBoc2l6ZSwgdXAsIGhzaXplKSA+PSAwKSB7CisJCQltcGloZWxwX3N1Yl9uKHByb2RwLCB1cCArIGhzaXplLCB1cCwgaHNpemUpOworCQkJbmVnZmxnID0gMDsKKwkJfSBlbHNlIHsKKwkJCW1waWhlbHBfc3ViX24ocHJvZHAsIHVwLCB1cCArIGhzaXplLCBoc2l6ZSk7CisJCQluZWdmbGcgPSAxOworCQl9CisJCWlmIChtcGloZWxwX2NtcCh2cCArIGhzaXplLCB2cCwgaHNpemUpID49IDApIHsKKwkJCW1waWhlbHBfc3ViX24ocHJvZHAgKyBoc2l6ZSwgdnAgKyBoc2l6ZSwgdnAsIGhzaXplKTsKKwkJCW5lZ2ZsZyBePSAxOworCQl9IGVsc2UgeworCQkJbXBpaGVscF9zdWJfbihwcm9kcCArIGhzaXplLCB2cCwgdnAgKyBoc2l6ZSwgaHNpemUpOworCQkJLyogTm8gY2hhbmdlIG9mIE5FR0ZMRy4gICovCisJCX0KKwkJLyogUmVhZCB0ZW1wb3Jhcnkgb3BlcmFuZHMgZnJvbSBsb3cgcGFydCBvZiBQUk9ELgorCQkgKiBQdXQgcmVzdWx0IGluIGxvdyBwYXJ0IG9mIFRTUEFDRSB1c2luZyB1cHBlciBwYXJ0IG9mIFRTUEFDRQorCQkgKiBhcyBuZXcgVFNQQUNFLgorCQkgKi8KKwkJTVBOX01VTF9OX1JFQ1VSU0UodHNwYWNlLCBwcm9kcCwgcHJvZHAgKyBoc2l6ZSwgaHNpemUsCisJCQkJICB0c3BhY2UgKyBzaXplKTsKKworCQkvKiBBZGQvY29weSBwcm9kdWN0IEguICovCisJCU1QTl9DT1BZKHByb2RwICsgaHNpemUsIHByb2RwICsgc2l6ZSwgaHNpemUpOworCQljeSA9IG1waWhlbHBfYWRkX24ocHJvZHAgKyBzaXplLCBwcm9kcCArIHNpemUsCisJCQkJICAgcHJvZHAgKyBzaXplICsgaHNpemUsIGhzaXplKTsKKworCQkvKiBBZGQgcHJvZHVjdCBNIChpZiBORUdGTEcgTSBpcyBhIG5lZ2F0aXZlIG51bWJlcikgKi8KKwkJaWYgKG5lZ2ZsZykKKwkJCWN5IC09CisJCQkgICAgbXBpaGVscF9zdWJfbihwcm9kcCArIGhzaXplLCBwcm9kcCArIGhzaXplLCB0c3BhY2UsCisJCQkJCSAgc2l6ZSk7CisJCWVsc2UKKwkJCWN5ICs9CisJCQkgICAgbXBpaGVscF9hZGRfbihwcm9kcCArIGhzaXplLCBwcm9kcCArIGhzaXplLCB0c3BhY2UsCisJCQkJCSAgc2l6ZSk7CisKKwkJLyogUHJvZHVjdCBMLiAgICAgIF9fX19fX19fX19fX19fX18gIF9fX19fX19fX19fX19fX18KKwkJICogICAgICAgICAgICAgICAgfF9fX19fX19fX19fX19fX198fF9fX19VMCB4IFYwX19fX198CisJCSAqIFJlYWQgdGVtcG9yYXJ5IG9wZXJhbmRzIGZyb20gbG93IHBhcnQgb2YgUFJPRC4KKwkJICogUHV0IHJlc3VsdCBpbiBsb3cgcGFydCBvZiBUU1BBQ0UgdXNpbmcgdXBwZXIgcGFydCBvZiBUU1BBQ0UKKwkJICogYXMgbmV3IFRTUEFDRS4KKwkJICovCisJCU1QTl9NVUxfTl9SRUNVUlNFKHRzcGFjZSwgdXAsIHZwLCBoc2l6ZSwgdHNwYWNlICsgc2l6ZSk7CisKKwkJLyogQWRkL2NvcHkgUHJvZHVjdCBMICh0d2ljZSkgKi8KKworCQljeSArPSBtcGloZWxwX2FkZF9uKHByb2RwICsgaHNpemUsIHByb2RwICsgaHNpemUsIHRzcGFjZSwgc2l6ZSk7CisJCWlmIChjeSkKKwkJCW1waWhlbHBfYWRkXzEocHJvZHAgKyBoc2l6ZSArIHNpemUsCisJCQkJICAgICAgcHJvZHAgKyBoc2l6ZSArIHNpemUsIGhzaXplLCBjeSk7CisKKwkJTVBOX0NPUFkocHJvZHAsIHRzcGFjZSwgaHNpemUpOworCQljeSA9IG1waWhlbHBfYWRkX24ocHJvZHAgKyBoc2l6ZSwgcHJvZHAgKyBoc2l6ZSwgdHNwYWNlICsgaHNpemUsCisJCQkJICAgaHNpemUpOworCQlpZiAoY3kpCisJCQltcGloZWxwX2FkZF8xKHByb2RwICsgc2l6ZSwgcHJvZHAgKyBzaXplLCBzaXplLCAxKTsKKwl9Cit9CisKK3ZvaWQgbXBpaF9zcXJfbl9iYXNlY2FzZShtcGlfcHRyX3QgcHJvZHAsIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCBzaXplKQoreworCW1waV9zaXplX3QgaTsKKwltcGlfbGltYl90IGN5X2xpbWI7CisJbXBpX2xpbWJfdCB2X2xpbWI7CisKKwkvKiBNdWx0aXBseSBieSB0aGUgZmlyc3QgbGltYiBpbiBWIHNlcGFyYXRlbHksIGFzIHRoZSByZXN1bHQgY2FuIGJlCisJICogc3RvcmVkIChub3QgYWRkZWQpIHRvIFBST0QuICBXZSBhbHNvIGF2b2lkIGEgbG9vcCBmb3IgemVyb2luZy4gICovCisJdl9saW1iID0gdXBbMF07CisJaWYgKHZfbGltYiA8PSAxKSB7CisJCWlmICh2X2xpbWIgPT0gMSkKKwkJCU1QTl9DT1BZKHByb2RwLCB1cCwgc2l6ZSk7CisJCWVsc2UKKwkJCU1QTl9aRVJPKHByb2RwLCBzaXplKTsKKwkJY3lfbGltYiA9IDA7CisJfSBlbHNlCisJCWN5X2xpbWIgPSBtcGloZWxwX211bF8xKHByb2RwLCB1cCwgc2l6ZSwgdl9saW1iKTsKKworCXByb2RwW3NpemVdID0gY3lfbGltYjsKKwlwcm9kcCsrOworCisJLyogRm9yIGVhY2ggaXRlcmF0aW9uIGluIHRoZSBvdXRlciBsb29wLCBtdWx0aXBseSBvbmUgbGltYiBmcm9tCisJICogVSB3aXRoIG9uZSBsaW1iIGZyb20gViwgYW5kIGFkZCBpdCB0byBQUk9ELiAgKi8KKwlmb3IgKGkgPSAxOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXZfbGltYiA9IHVwW2ldOworCQlpZiAodl9saW1iIDw9IDEpIHsKKwkJCWN5X2xpbWIgPSAwOworCQkJaWYgKHZfbGltYiA9PSAxKQorCQkJCWN5X2xpbWIgPSBtcGloZWxwX2FkZF9uKHByb2RwLCBwcm9kcCwgdXAsIHNpemUpOworCQl9IGVsc2UKKwkJCWN5X2xpbWIgPSBtcGloZWxwX2FkZG11bF8xKHByb2RwLCB1cCwgc2l6ZSwgdl9saW1iKTsKKworCQlwcm9kcFtzaXplXSA9IGN5X2xpbWI7CisJCXByb2RwKys7CisJfQorfQorCit2b2lkCittcGloX3Nxcl9uKG1waV9wdHJfdCBwcm9kcCwgbXBpX3B0cl90IHVwLCBtcGlfc2l6ZV90IHNpemUsIG1waV9wdHJfdCB0c3BhY2UpCit7CisJaWYgKHNpemUgJiAxKSB7CisJCS8qIFRoZSBzaXplIGlzIG9kZCwgYW5kIHRoZSBjb2RlIGJlbG93IGRvZXNuJ3QgaGFuZGxlIHRoYXQuCisJCSAqIE11bHRpcGx5IHRoZSBsZWFzdCBzaWduaWZpY2FudCAoc2l6ZSAtIDEpIGxpbWJzIHdpdGggYSByZWN1cnNpdmUKKwkJICogY2FsbCwgYW5kIGhhbmRsZSB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIFMxIGFuZCBTMgorCQkgKiBzZXBhcmF0ZWx5LgorCQkgKiBBIHNsaWdodGx5IGZhc3RlciB3YXkgdG8gZG8gdGhpcyB3b3VsZCBiZSB0byBtYWtlIHRoZSBLYXJhdHN1YmEKKwkJICogY29kZSBiZWxvdyBiZWhhdmUgYXMgaWYgdGhlIHNpemUgd2VyZSBldmVuLCBhbmQgbGV0IGl0IGNoZWNrIGZvcgorCQkgKiBvZGQgc2l6ZSBpbiB0aGUgZW5kLiAgSS5lLiwgaW4gZXNzZW5jZSBtb3ZlIHRoaXMgY29kZSB0byB0aGUgZW5kLgorCQkgKiBEb2luZyBzbyB3b3VsZCBzYXZlIHVzIGEgcmVjdXJzaXZlIGNhbGwsIGFuZCBwb3RlbnRpYWxseSBtYWtlIHRoZQorCQkgKiBzdGFjayBncm93IGEgbG90IGxlc3MuCisJCSAqLworCQltcGlfc2l6ZV90IGVzaXplID0gc2l6ZSAtIDE7CS8qIGV2ZW4gc2l6ZSAqLworCQltcGlfbGltYl90IGN5X2xpbWI7CisKKwkJTVBOX1NRUl9OX1JFQ1VSU0UocHJvZHAsIHVwLCBlc2l6ZSwgdHNwYWNlKTsKKwkJY3lfbGltYiA9IG1waWhlbHBfYWRkbXVsXzEocHJvZHAgKyBlc2l6ZSwgdXAsIGVzaXplLCB1cFtlc2l6ZV0pOworCQlwcm9kcFtlc2l6ZSArIGVzaXplXSA9IGN5X2xpbWI7CisJCWN5X2xpbWIgPSBtcGloZWxwX2FkZG11bF8xKHByb2RwICsgZXNpemUsIHVwLCBzaXplLCB1cFtlc2l6ZV0pOworCisJCXByb2RwW2VzaXplICsgc2l6ZV0gPSBjeV9saW1iOworCX0gZWxzZSB7CisJCW1waV9zaXplX3QgaHNpemUgPSBzaXplID4+IDE7CisJCW1waV9saW1iX3QgY3k7CisKKwkJLyogUHJvZHVjdCBILiAgICAgIF9fX19fX19fX19fX19fX18gIF9fX19fX19fX19fX19fX18KKwkJICogICAgICAgICAgICAgICAgfF9fX19fVTEgeCBVMV9fX198fF9fX19VMCB4IFUwX19fX198CisJCSAqIFB1dCByZXN1bHQgaW4gdXBwZXIgcGFydCBvZiBQUk9EIGFuZCBwYXNzIGxvdyBwYXJ0IG9mIFRTUEFDRQorCQkgKiBhcyBuZXcgVFNQQUNFLgorCQkgKi8KKwkJTVBOX1NRUl9OX1JFQ1VSU0UocHJvZHAgKyBzaXplLCB1cCArIGhzaXplLCBoc2l6ZSwgdHNwYWNlKTsKKworCQkvKiBQcm9kdWN0IE0uICAgICAgX19fX19fX19fX19fX19fXworCQkgKiAgICAgICAgICAgICAgICB8XyhVMS1VMCkoVTAtVTEpX3wKKwkJICovCisJCWlmIChtcGloZWxwX2NtcCh1cCArIGhzaXplLCB1cCwgaHNpemUpID49IDApCisJCQltcGloZWxwX3N1Yl9uKHByb2RwLCB1cCArIGhzaXplLCB1cCwgaHNpemUpOworCQllbHNlCisJCQltcGloZWxwX3N1Yl9uKHByb2RwLCB1cCwgdXAgKyBoc2l6ZSwgaHNpemUpOworCisJCS8qIFJlYWQgdGVtcG9yYXJ5IG9wZXJhbmRzIGZyb20gbG93IHBhcnQgb2YgUFJPRC4KKwkJICogUHV0IHJlc3VsdCBpbiBsb3cgcGFydCBvZiBUU1BBQ0UgdXNpbmcgdXBwZXIgcGFydCBvZiBUU1BBQ0UKKwkJICogYXMgbmV3IFRTUEFDRS4gICovCisJCU1QTl9TUVJfTl9SRUNVUlNFKHRzcGFjZSwgcHJvZHAsIGhzaXplLCB0c3BhY2UgKyBzaXplKTsKKworCQkvKiBBZGQvY29weSBwcm9kdWN0IEggICovCisJCU1QTl9DT1BZKHByb2RwICsgaHNpemUsIHByb2RwICsgc2l6ZSwgaHNpemUpOworCQljeSA9IG1waWhlbHBfYWRkX24ocHJvZHAgKyBzaXplLCBwcm9kcCArIHNpemUsCisJCQkJICAgcHJvZHAgKyBzaXplICsgaHNpemUsIGhzaXplKTsKKworCQkvKiBBZGQgcHJvZHVjdCBNIChpZiBORUdGTEcgTSBpcyBhIG5lZ2F0aXZlIG51bWJlcikuICAqLworCQljeSAtPSBtcGloZWxwX3N1Yl9uKHByb2RwICsgaHNpemUsIHByb2RwICsgaHNpemUsIHRzcGFjZSwgc2l6ZSk7CisKKwkJLyogUHJvZHVjdCBMLiAgICAgIF9fX19fX19fX19fX19fX18gIF9fX19fX19fX19fX19fX18KKwkJICogICAgICAgICAgICAgICAgfF9fX19fX19fX19fX19fX198fF9fX19VMCB4IFUwX19fX198CisJCSAqIFJlYWQgdGVtcG9yYXJ5IG9wZXJhbmRzIGZyb20gbG93IHBhcnQgb2YgUFJPRC4KKwkJICogUHV0IHJlc3VsdCBpbiBsb3cgcGFydCBvZiBUU1BBQ0UgdXNpbmcgdXBwZXIgcGFydCBvZiBUU1BBQ0UKKwkJICogYXMgbmV3IFRTUEFDRS4gICovCisJCU1QTl9TUVJfTl9SRUNVUlNFKHRzcGFjZSwgdXAsIGhzaXplLCB0c3BhY2UgKyBzaXplKTsKKworCQkvKiBBZGQvY29weSBQcm9kdWN0IEwgKHR3aWNlKS4gICovCisJCWN5ICs9IG1waWhlbHBfYWRkX24ocHJvZHAgKyBoc2l6ZSwgcHJvZHAgKyBoc2l6ZSwgdHNwYWNlLCBzaXplKTsKKwkJaWYgKGN5KQorCQkJbXBpaGVscF9hZGRfMShwcm9kcCArIGhzaXplICsgc2l6ZSwKKwkJCQkgICAgICBwcm9kcCArIGhzaXplICsgc2l6ZSwgaHNpemUsIGN5KTsKKworCQlNUE5fQ09QWShwcm9kcCwgdHNwYWNlLCBoc2l6ZSk7CisJCWN5ID0gbXBpaGVscF9hZGRfbihwcm9kcCArIGhzaXplLCBwcm9kcCArIGhzaXplLCB0c3BhY2UgKyBoc2l6ZSwKKwkJCQkgICBoc2l6ZSk7CisJCWlmIChjeSkKKwkJCW1waWhlbHBfYWRkXzEocHJvZHAgKyBzaXplLCBwcm9kcCArIHNpemUsIHNpemUsIDEpOworCX0KK30KKworaW50CittcGloZWxwX211bF9rYXJhdHN1YmFfY2FzZShtcGlfcHRyX3QgcHJvZHAsCisJCQkgICBtcGlfcHRyX3QgdXAsIG1waV9zaXplX3QgdXNpemUsCisJCQkgICBtcGlfcHRyX3QgdnAsIG1waV9zaXplX3QgdnNpemUsCisJCQkgICBzdHJ1Y3Qga2FyYXRzdWJhX2N0eCAqY3R4KQoreworCW1waV9saW1iX3QgY3k7CisKKwlpZiAoIWN0eC0+dHNwYWNlIHx8IGN0eC0+dHNwYWNlX3NpemUgPCB2c2l6ZSkgeworCQlpZiAoY3R4LT50c3BhY2UpCisJCQltcGlfZnJlZV9saW1iX3NwYWNlKGN0eC0+dHNwYWNlKTsKKwkJY3R4LT50c3BhY2UgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSgyICogdnNpemUpOworCQlpZiAoIWN0eC0+dHNwYWNlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWN0eC0+dHNwYWNlX3NpemUgPSB2c2l6ZTsKKwl9CisKKwlNUE5fTVVMX05fUkVDVVJTRShwcm9kcCwgdXAsIHZwLCB2c2l6ZSwgY3R4LT50c3BhY2UpOworCisJcHJvZHAgKz0gdnNpemU7CisJdXAgKz0gdnNpemU7CisJdXNpemUgLT0gdnNpemU7CisJaWYgKHVzaXplID49IHZzaXplKSB7CisJCWlmICghY3R4LT50cCB8fCBjdHgtPnRwX3NpemUgPCB2c2l6ZSkgeworCQkJaWYgKGN0eC0+dHApCisJCQkJbXBpX2ZyZWVfbGltYl9zcGFjZShjdHgtPnRwKTsKKwkJCWN0eC0+dHAgPSBtcGlfYWxsb2NfbGltYl9zcGFjZSgyICogdnNpemUpOworCQkJaWYgKCFjdHgtPnRwKSB7CisJCQkJaWYgKGN0eC0+dHNwYWNlKQorCQkJCQltcGlfZnJlZV9saW1iX3NwYWNlKGN0eC0+dHNwYWNlKTsKKwkJCQljdHgtPnRzcGFjZSA9IE5VTEw7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQljdHgtPnRwX3NpemUgPSB2c2l6ZTsKKwkJfQorCisJCWRvIHsKKwkJCU1QTl9NVUxfTl9SRUNVUlNFKGN0eC0+dHAsIHVwLCB2cCwgdnNpemUsIGN0eC0+dHNwYWNlKTsKKwkJCWN5ID0gbXBpaGVscF9hZGRfbihwcm9kcCwgcHJvZHAsIGN0eC0+dHAsIHZzaXplKTsKKwkJCW1waWhlbHBfYWRkXzEocHJvZHAgKyB2c2l6ZSwgY3R4LT50cCArIHZzaXplLCB2c2l6ZSwKKwkJCQkgICAgICBjeSk7CisJCQlwcm9kcCArPSB2c2l6ZTsKKwkJCXVwICs9IHZzaXplOworCQkJdXNpemUgLT0gdnNpemU7CisJCX0gd2hpbGUgKHVzaXplID49IHZzaXplKTsKKwl9CisKKwlpZiAodXNpemUpIHsKKwkJaWYgKHVzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCkgeworCQkJbXBpX2xpbWJfdCB0bXA7CisJCQlpZiAobXBpaGVscF9tdWwoY3R4LT50c3BhY2UsIHZwLCB2c2l6ZSwgdXAsIHVzaXplLCAmdG1wKQorCQkJICAgIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJfSBlbHNlIHsKKwkJCWlmICghY3R4LT5uZXh0KSB7CisJCQkJY3R4LT5uZXh0ID0ga3phbGxvYyhzaXplb2YgKmN0eCwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKCFjdHgtPm5leHQpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJfQorCQkJaWYgKG1waWhlbHBfbXVsX2thcmF0c3ViYV9jYXNlKGN0eC0+dHNwYWNlLAorCQkJCQkJICAgICAgIHZwLCB2c2l6ZSwKKwkJCQkJCSAgICAgICB1cCwgdXNpemUsCisJCQkJCQkgICAgICAgY3R4LT5uZXh0KSA8IDApCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKworCQljeSA9IG1waWhlbHBfYWRkX24ocHJvZHAsIHByb2RwLCBjdHgtPnRzcGFjZSwgdnNpemUpOworCQltcGloZWxwX2FkZF8xKHByb2RwICsgdnNpemUsIGN0eC0+dHNwYWNlICsgdnNpemUsIHVzaXplLCBjeSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXBpaGVscF9yZWxlYXNlX2thcmF0c3ViYV9jdHgoc3RydWN0IGthcmF0c3ViYV9jdHggKmN0eCkKK3sKKwlzdHJ1Y3Qga2FyYXRzdWJhX2N0eCAqY3R4MjsKKworCWlmIChjdHgtPnRwKQorCQltcGlfZnJlZV9saW1iX3NwYWNlKGN0eC0+dHApOworCWlmIChjdHgtPnRzcGFjZSkKKwkJbXBpX2ZyZWVfbGltYl9zcGFjZShjdHgtPnRzcGFjZSk7CisJZm9yIChjdHggPSBjdHgtPm5leHQ7IGN0eDsgY3R4ID0gY3R4MikgeworCQljdHgyID0gY3R4LT5uZXh0OworCQlpZiAoY3R4LT50cCkKKwkJCW1waV9mcmVlX2xpbWJfc3BhY2UoY3R4LT50cCk7CisJCWlmIChjdHgtPnRzcGFjZSkKKwkJCW1waV9mcmVlX2xpbWJfc3BhY2UoY3R4LT50c3BhY2UpOworCQlrZnJlZShjdHgpOworCX0KK30KKworLyogTXVsdGlwbHkgdGhlIG5hdHVyYWwgbnVtYmVycyB1IChwb2ludGVkIHRvIGJ5IFVQLCB3aXRoIFVTSVpFIGxpbWJzKQorICogYW5kIHYgKHBvaW50ZWQgdG8gYnkgVlAsIHdpdGggVlNJWkUgbGltYnMpLCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBhdAorICogUFJPRFAuICBVU0laRSArIFZTSVpFIGxpbWJzIGFyZSBhbHdheXMgc3RvcmVkLCBidXQgaWYgdGhlIGlucHV0CisgKiBvcGVyYW5kcyBhcmUgbm9ybWFsaXplZC4gIFJldHVybiB0aGUgbW9zdCBzaWduaWZpY2FudCBsaW1iIG9mIHRoZQorICogcmVzdWx0LgorICoKKyAqIE5PVEU6IFRoZSBzcGFjZSBwb2ludGVkIHRvIGJ5IFBST0RQIGlzIG92ZXJ3cml0dGVuIGJlZm9yZSBmaW5pc2hlZAorICogd2l0aCBVIGFuZCBWLCBzbyBvdmVybGFwIGlzIGFuIGVycm9yLgorICoKKyAqIEFyZ3VtZW50IGNvbnN0cmFpbnRzOgorICogMS4gVVNJWkUgPj0gVlNJWkUuCisgKiAyLiBQUk9EUCAhPSBVUCBhbmQgUFJPRFAgIT0gVlAsIGkuZS4gdGhlIGRlc3RpbmF0aW9uCisgKiAgICBtdXN0IGJlIGRpc3RpbmN0IGZyb20gdGhlIG11bHRpcGxpZXIgYW5kIHRoZSBtdWx0aXBsaWNhbmQuCisgKi8KKworaW50CittcGloZWxwX211bChtcGlfcHRyX3QgcHJvZHAsIG1waV9wdHJfdCB1cCwgbXBpX3NpemVfdCB1c2l6ZSwKKwkgICAgbXBpX3B0cl90IHZwLCBtcGlfc2l6ZV90IHZzaXplLCBtcGlfbGltYl90ICpfcmVzdWx0KQoreworCW1waV9wdHJfdCBwcm9kX2VuZHAgPSBwcm9kcCArIHVzaXplICsgdnNpemUgLSAxOworCW1waV9saW1iX3QgY3k7CisJc3RydWN0IGthcmF0c3ViYV9jdHggY3R4OworCisJaWYgKHZzaXplIDwgS0FSQVRTVUJBX1RIUkVTSE9MRCkgeworCQltcGlfc2l6ZV90IGk7CisJCW1waV9saW1iX3Qgdl9saW1iOworCisJCWlmICghdnNpemUpIHsKKwkJCSpfcmVzdWx0ID0gMDsKKwkJCXJldHVybiAwOworCQl9CisKKwkJLyogTXVsdGlwbHkgYnkgdGhlIGZpcnN0IGxpbWIgaW4gViBzZXBhcmF0ZWx5LCBhcyB0aGUgcmVzdWx0IGNhbiBiZQorCQkgKiBzdG9yZWQgKG5vdCBhZGRlZCkgdG8gUFJPRC4gIFdlIGFsc28gYXZvaWQgYSBsb29wIGZvciB6ZXJvaW5nLiAgKi8KKwkJdl9saW1iID0gdnBbMF07CisJCWlmICh2X2xpbWIgPD0gMSkgeworCQkJaWYgKHZfbGltYiA9PSAxKQorCQkJCU1QTl9DT1BZKHByb2RwLCB1cCwgdXNpemUpOworCQkJZWxzZQorCQkJCU1QTl9aRVJPKHByb2RwLCB1c2l6ZSk7CisJCQljeSA9IDA7CisJCX0gZWxzZQorCQkJY3kgPSBtcGloZWxwX211bF8xKHByb2RwLCB1cCwgdXNpemUsIHZfbGltYik7CisKKwkJcHJvZHBbdXNpemVdID0gY3k7CisJCXByb2RwKys7CisKKwkJLyogRm9yIGVhY2ggaXRlcmF0aW9uIGluIHRoZSBvdXRlciBsb29wLCBtdWx0aXBseSBvbmUgbGltYiBmcm9tCisJCSAqIFUgd2l0aCBvbmUgbGltYiBmcm9tIFYsIGFuZCBhZGQgaXQgdG8gUFJPRC4gICovCisJCWZvciAoaSA9IDE7IGkgPCB2c2l6ZTsgaSsrKSB7CisJCQl2X2xpbWIgPSB2cFtpXTsKKwkJCWlmICh2X2xpbWIgPD0gMSkgeworCQkJCWN5ID0gMDsKKwkJCQlpZiAodl9saW1iID09IDEpCisJCQkJCWN5ID0gbXBpaGVscF9hZGRfbihwcm9kcCwgcHJvZHAsIHVwLAorCQkJCQkJCSAgIHVzaXplKTsKKwkJCX0gZWxzZQorCQkJCWN5ID0gbXBpaGVscF9hZGRtdWxfMShwcm9kcCwgdXAsIHVzaXplLCB2X2xpbWIpOworCisJCQlwcm9kcFt1c2l6ZV0gPSBjeTsKKwkJCXByb2RwKys7CisJCX0KKworCQkqX3Jlc3VsdCA9IGN5OworCQlyZXR1cm4gMDsKKwl9CisKKwltZW1zZXQoJmN0eCwgMCwgc2l6ZW9mIGN0eCk7CisJaWYgKG1waWhlbHBfbXVsX2thcmF0c3ViYV9jYXNlKHByb2RwLCB1cCwgdXNpemUsIHZwLCB2c2l6ZSwgJmN0eCkgPCAwKQorCQlyZXR1cm4gLUVOT01FTTsKKwltcGloZWxwX3JlbGVhc2Vfa2FyYXRzdWJhX2N0eCgmY3R4KTsKKwkqX3Jlc3VsdCA9ICpwcm9kX2VuZHA7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9tcGkvbXBpdXRpbC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waXV0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRmNGRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbXBpL21waXV0aWwuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogbXBpdXRpbC5hYyAgLSAgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIE1QSQorICogQ29weXJpZ2h0IChDKSAxOTk4LCAxOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdudVBHLgorICoKKyAqIEdudVBHIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBHbnVQRyBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgKi8KKworI2luY2x1ZGUgIm1waS1pbnRlcm5hbC5oIgorCisvKioqKioqKioqKioqKioqKgorICogTm90ZTogIEl0IHdhcyBhIGJhZCBpZGVhIHRvIHVzZSB0aGUgbnVtYmVyIG9mIGxpbWJzIHRvIGFsbG9jYXRlCisgKgkgIGJlY2F1c2Ugb24gYSBhbHBoYSB0aGUgbGltYnMgYXJlIGxhcmdlIGJ1dCB3ZSBub3JtYWxseSBuZWVkCisgKgkgIGludGVnZXJzIG9mIG4gYml0cyAtIFNvIHdlIHNob3VsZCBjaG5hZ2UgdGhpcyB0byBiaXRzIChvciBieXRlcykuCisgKgorICoJICBCdXQgbXBpX2FsbG9jIGlzIHVzZWQgaW4gYSBsb3Qgb2YgcGxhY2VzIDotKQorICovCitNUEkgbXBpX2FsbG9jKHVuc2lnbmVkIG5saW1icykKK3sKKwlNUEkgYTsKKworCWEgPSBrbWFsbG9jKHNpemVvZiAqYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhKQorCQlyZXR1cm4gYTsKKworCWlmIChubGltYnMpIHsKKwkJYS0+ZCA9IG1waV9hbGxvY19saW1iX3NwYWNlKG5saW1icyk7CisJCWlmICghYS0+ZCkgeworCQkJa2ZyZWUoYSk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0gZWxzZSB7CisJCWEtPmQgPSBOVUxMOworCX0KKworCWEtPmFsbG9jZWQgPSBubGltYnM7CisJYS0+bmxpbWJzID0gMDsKKwlhLT5zaWduID0gMDsKKwlhLT5mbGFncyA9IDA7CisJYS0+bmJpdHMgPSAwOworCXJldHVybiBhOworfQorRVhQT1JUX1NZTUJPTF9HUEwobXBpX2FsbG9jKTsKKworbXBpX3B0cl90IG1waV9hbGxvY19saW1iX3NwYWNlKHVuc2lnbmVkIG5saW1icykKK3sKKwlzaXplX3QgbGVuID0gbmxpbWJzICogc2l6ZW9mKG1waV9saW1iX3QpOworCisJaWYgKCFsZW4pCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGttYWxsb2MobGVuLCBHRlBfS0VSTkVMKTsKK30KKwordm9pZCBtcGlfZnJlZV9saW1iX3NwYWNlKG1waV9wdHJfdCBhKQoreworCWlmICghYSkKKwkJcmV0dXJuOworCisJa3pmcmVlKGEpOworfQorCit2b2lkIG1waV9hc3NpZ25fbGltYl9zcGFjZShNUEkgYSwgbXBpX3B0cl90IGFwLCB1bnNpZ25lZCBubGltYnMpCit7CisJbXBpX2ZyZWVfbGltYl9zcGFjZShhLT5kKTsKKwlhLT5kID0gYXA7CisJYS0+YWxsb2NlZCA9IG5saW1iczsKK30KKworLyoqKioqKioqKioqKioqKioKKyAqIFJlc2l6ZSB0aGUgYXJyYXkgb2YgQSB0byBOTElNQlMuIHRoZSBhZGRpdGlvbmFsIHNwYWNlIGlzIGNsZWFyZWQKKyAqIChzZXQgdG8gMCkgW2RvbmUgYnkgbV9yZWFsbG9jKCldCisgKi8KK2ludCBtcGlfcmVzaXplKE1QSSBhLCB1bnNpZ25lZCBubGltYnMpCit7CisJdm9pZCAqcDsKKworCWlmIChubGltYnMgPD0gYS0+YWxsb2NlZCkKKwkJcmV0dXJuIDA7CS8qIG5vIG5lZWQgdG8gZG8gaXQgKi8KKworCWlmIChhLT5kKSB7CisJCXAgPSBrbWFsbG9jKG5saW1icyAqIHNpemVvZihtcGlfbGltYl90KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcCkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1jcHkocCwgYS0+ZCwgYS0+YWxsb2NlZCAqIHNpemVvZihtcGlfbGltYl90KSk7CisJCWt6ZnJlZShhLT5kKTsKKwkJYS0+ZCA9IHA7CisJfSBlbHNlIHsKKwkJYS0+ZCA9IGt6YWxsb2MobmxpbWJzICogc2l6ZW9mKG1waV9saW1iX3QpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFhLT5kKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCWEtPmFsbG9jZWQgPSBubGltYnM7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgbXBpX2ZyZWUoTVBJIGEpCit7CisJaWYgKCFhKQorCQlyZXR1cm47CisKKwlpZiAoYS0+ZmxhZ3MgJiA0KQorCQlremZyZWUoYS0+ZCk7CisJZWxzZQorCQltcGlfZnJlZV9saW1iX3NwYWNlKGEtPmQpOworCisJaWYgKGEtPmZsYWdzICYgfjcpCisJCXByX2luZm8oImludmFsaWQgZmxhZyB2YWx1ZSBpbiBtcGlcbiIpOworCWtmcmVlKGEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobXBpX2ZyZWUpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk11bHRpcHJlY2lzaW9uIG1hdGhzIGxpYnJhcnkiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25ldF91dGlscy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbmV0X3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1MjUzNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25ldF91dGlscy5jCkBAIC0wLDAgKzEsMjcgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCitib29sIG1hY19wdG9uKGNvbnN0IGNoYXIgKnMsIHU4ICptYWMpCit7CisJaW50IGk7CisKKwkvKiBYWDpYWDpYWDpYWDpYWDpYWCAqLworCWlmIChzdHJsZW4ocykgPCAzICogRVRIX0FMRU4gLSAxKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBEb24ndCBkaXJ0eSByZXN1bHQgdW5sZXNzIHN0cmluZyBpcyB2YWxpZCBNQUMuICovCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKKwkJaWYgKCFpc3hkaWdpdChzW2kgKiAzXSkgfHwgIWlzeGRpZ2l0KHNbaSAqIDMgKyAxXSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlmIChpICE9IEVUSF9BTEVOIC0gMSAmJiBzW2kgKiAzICsgMl0gIT0gJzonKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgeworCQltYWNbaV0gPSAoaGV4X3RvX2JpbihzW2kgKiAzXSkgPDwgNCkgfCBoZXhfdG9fYmluKHNbaSAqIDMgKyAxXSk7CisJfQorCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChtYWNfcHRvbik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9uZXRkZXYtbm90aWZpZXItZXJyb3ItaW5qZWN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9uZXRkZXYtbm90aWZpZXItZXJyb3ItaW5qZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlOWM2MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25ldGRldi1ub3RpZmllci1lcnJvci1pbmplY3QuYwpAQCAtMCwwICsxLDU1IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisKKyNpbmNsdWRlICJub3RpZmllci1lcnJvci1pbmplY3QuaCIKKworc3RhdGljIGludCBwcmlvcml0eTsKK21vZHVsZV9wYXJhbShwcmlvcml0eSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHJpb3JpdHksICJzcGVjaWZ5IG5ldGRldmljZSBub3RpZmllciBwcmlvcml0eSIpOworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3QgbmV0ZGV2X25vdGlmaWVyX2Vycl9pbmplY3QgPSB7CisJLmFjdGlvbnMgPSB7CisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oTkVUREVWX1JFR0lTVEVSKSB9LAorCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKE5FVERFVl9DSEFOR0VNVFUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oTkVUREVWX0NIQU5HRU5BTUUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oTkVUREVWX1BSRV9VUCkgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihORVRERVZfUFJFX1RZUEVfQ0hBTkdFKSB9LAorCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKE5FVERFVl9QT1NUX0lOSVQpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oTkVUREVWX1BSRUNIQU5HRU1UVSkgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihORVRERVZfUFJFQ0hBTkdFVVBQRVIpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oTkVUREVWX0NIQU5HRVVQUEVSKSB9LAorCQl7fQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkaXI7CisKK3N0YXRpYyBpbnQgbmV0ZGV2X2Vycl9pbmplY3RfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlkaXIgPSBub3RpZmllcl9lcnJfaW5qZWN0X2luaXQoIm5ldGRldiIsIG5vdGlmaWVyX2Vycl9pbmplY3RfZGlyLAorCQkJCSAgICAgICAmbmV0ZGV2X25vdGlmaWVyX2Vycl9pbmplY3QsIHByaW9yaXR5KTsKKwlpZiAoSVNfRVJSKGRpcikpCisJCXJldHVybiBQVFJfRVJSKGRpcik7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5ldGRldl9ub3RpZmllcl9lcnJfaW5qZWN0Lm5iKTsKKwlpZiAoZXJyKQorCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIG5ldGRldl9lcnJfaW5qZWN0X2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbmV0ZGV2X25vdGlmaWVyX2Vycl9pbmplY3QubmIpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkaXIpOworfQorCittb2R1bGVfaW5pdChuZXRkZXZfZXJyX2luamVjdF9pbml0KTsKK21vZHVsZV9leGl0KG5ldGRldl9lcnJfaW5qZWN0X2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk5ldGRldmljZSBub3RpZmllciBlcnJvciBpbmplY3Rpb24gbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJOaWtvbGF5IEFsZWtzYW5kcm92IDxyYXpvckBibGFja3dhbGwub3JnPiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbmxhdHRyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9ubGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDgyOTVjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbmxhdHRyLmMKQEAgLTAsMCArMSw2NzQgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogTkVUTElOSyAgICAgIE5ldGxpbmsgYXR0cmlidXRlcworICoKKyAqIAkJQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKiAJCQkJQWxleGV5IEt1em5ldHNvdiA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKworc3RhdGljIGNvbnN0IHU4IG5sYV9hdHRyX21pbmxlbltOTEFfVFlQRV9NQVgrMV0gPSB7CisJW05MQV9VOF0JPSBzaXplb2YodTgpLAorCVtOTEFfVTE2XQk9IHNpemVvZih1MTYpLAorCVtOTEFfVTMyXQk9IHNpemVvZih1MzIpLAorCVtOTEFfVTY0XQk9IHNpemVvZih1NjQpLAorCVtOTEFfTVNFQ1NdCT0gc2l6ZW9mKHU2NCksCisJW05MQV9ORVNURURdCT0gTkxBX0hEUkxFTiwKKwlbTkxBX1M4XQk9IHNpemVvZihzOCksCisJW05MQV9TMTZdCT0gc2l6ZW9mKHMxNiksCisJW05MQV9TMzJdCT0gc2l6ZW9mKHMzMiksCisJW05MQV9TNjRdCT0gc2l6ZW9mKHM2NCksCit9OworCitzdGF0aWMgaW50IHZhbGlkYXRlX25sYV9iaXRmaWVsZDMyKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwKKwkJCQkgICB1MzIgKnZhbGlkX2ZsYWdzX2FsbG93ZWQpCit7CisJY29uc3Qgc3RydWN0IG5sYV9iaXRmaWVsZDMyICpiZiA9IG5sYV9kYXRhKG5sYSk7CisJdTMyICp2YWxpZF9mbGFnc19tYXNrID0gdmFsaWRfZmxhZ3NfYWxsb3dlZDsKKworCWlmICghdmFsaWRfZmxhZ3NfYWxsb3dlZCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKmRpc2FsbG93IGludmFsaWQgYml0IHNlbGVjdG9yICovCisJaWYgKGJmLT5zZWxlY3RvciAmIH4qdmFsaWRfZmxhZ3NfbWFzaykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKmRpc2FsbG93IGludmFsaWQgYml0IHZhbHVlcyAqLworCWlmIChiZi0+dmFsdWUgJiB+KnZhbGlkX2ZsYWdzX21hc2spCisJCXJldHVybiAtRUlOVkFMOworCisJLypkaXNhbGxvdyB2YWxpZCBiaXQgdmFsdWVzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZCovCisJaWYgKGJmLT52YWx1ZSAmIH5iZi0+c2VsZWN0b3IpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfbmxhKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwgaW50IG1heHR5cGUsCisJCQljb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSAqcG9saWN5KQoreworCWNvbnN0IHN0cnVjdCBubGFfcG9saWN5ICpwdDsKKwlpbnQgbWlubGVuID0gMCwgYXR0cmxlbiA9IG5sYV9sZW4obmxhKSwgdHlwZSA9IG5sYV90eXBlKG5sYSk7CisKKwlpZiAodHlwZSA8PSAwIHx8IHR5cGUgPiBtYXh0eXBlKQorCQlyZXR1cm4gMDsKKworCXB0ID0gJnBvbGljeVt0eXBlXTsKKworCUJVR19PTihwdC0+dHlwZSA+IE5MQV9UWVBFX01BWCk7CisKKwlzd2l0Y2ggKHB0LT50eXBlKSB7CisJY2FzZSBOTEFfRkxBRzoKKwkJaWYgKGF0dHJsZW4gPiAwKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCWJyZWFrOworCisJY2FzZSBOTEFfQklURklFTEQzMjoKKwkJaWYgKGF0dHJsZW4gIT0gc2l6ZW9mKHN0cnVjdCBubGFfYml0ZmllbGQzMikpCisJCQlyZXR1cm4gLUVSQU5HRTsKKworCQlyZXR1cm4gdmFsaWRhdGVfbmxhX2JpdGZpZWxkMzIobmxhLCBwdC0+dmFsaWRhdGlvbl9kYXRhKTsKKworCWNhc2UgTkxBX05VTF9TVFJJTkc6CisJCWlmIChwdC0+bGVuKQorCQkJbWlubGVuID0gbWluX3QoaW50LCBhdHRybGVuLCBwdC0+bGVuICsgMSk7CisJCWVsc2UKKwkJCW1pbmxlbiA9IGF0dHJsZW47CisKKwkJaWYgKCFtaW5sZW4gfHwgbWVtY2hyKG5sYV9kYXRhKG5sYSksICdcMCcsIG1pbmxlbikgPT0gTlVMTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCWNhc2UgTkxBX1NUUklORzoKKwkJaWYgKGF0dHJsZW4gPCAxKQorCQkJcmV0dXJuIC1FUkFOR0U7CisKKwkJaWYgKHB0LT5sZW4pIHsKKwkJCWNoYXIgKmJ1ZiA9IG5sYV9kYXRhKG5sYSk7CisKKwkJCWlmIChidWZbYXR0cmxlbiAtIDFdID09ICdcMCcpCisJCQkJYXR0cmxlbi0tOworCisJCQlpZiAoYXR0cmxlbiA+IHB0LT5sZW4pCisJCQkJcmV0dXJuIC1FUkFOR0U7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE5MQV9CSU5BUlk6CisJCWlmIChwdC0+bGVuICYmIGF0dHJsZW4gPiBwdC0+bGVuKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCWJyZWFrOworCisJY2FzZSBOTEFfTkVTVEVEX0NPTVBBVDoKKwkJaWYgKGF0dHJsZW4gPCBwdC0+bGVuKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJCWlmIChhdHRybGVuIDwgTkxBX0FMSUdOKHB0LT5sZW4pKQorCQkJYnJlYWs7CisJCWlmIChhdHRybGVuIDwgTkxBX0FMSUdOKHB0LT5sZW4pICsgTkxBX0hEUkxFTikKKwkJCXJldHVybiAtRVJBTkdFOworCQlubGEgPSBubGFfZGF0YShubGEpICsgTkxBX0FMSUdOKHB0LT5sZW4pOworCQlpZiAoYXR0cmxlbiA8IE5MQV9BTElHTihwdC0+bGVuKSArIE5MQV9IRFJMRU4gKyBubGFfbGVuKG5sYSkpCisJCQlyZXR1cm4gLUVSQU5HRTsKKwkJYnJlYWs7CisJY2FzZSBOTEFfTkVTVEVEOgorCQkvKiBhIG5lc3RlZCBhdHRyaWJ1dGVzIGlzIGFsbG93ZWQgdG8gYmUgZW1wdHk7IGlmIGl0cyBub3QsCisJCSAqIGl0IG11c3QgaGF2ZSBhIHNpemUgb2YgYXQgbGVhc3QgTkxBX0hEUkxFTi4KKwkJICovCisJCWlmIChhdHRybGVuID09IDApCisJCQlicmVhazsKKwlkZWZhdWx0OgorCQlpZiAocHQtPmxlbikKKwkJCW1pbmxlbiA9IHB0LT5sZW47CisJCWVsc2UgaWYgKHB0LT50eXBlICE9IE5MQV9VTlNQRUMpCisJCQltaW5sZW4gPSBubGFfYXR0cl9taW5sZW5bcHQtPnR5cGVdOworCisJCWlmIChhdHRybGVuIDwgbWlubGVuKQorCQkJcmV0dXJuIC1FUkFOR0U7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogbmxhX3ZhbGlkYXRlIC0gVmFsaWRhdGUgYSBzdHJlYW0gb2YgYXR0cmlidXRlcworICogQGhlYWQ6IGhlYWQgb2YgYXR0cmlidXRlIHN0cmVhbQorICogQGxlbjogbGVuZ3RoIG9mIGF0dHJpYnV0ZSBzdHJlYW0KKyAqIEBtYXh0eXBlOiBtYXhpbXVtIGF0dHJpYnV0ZSB0eXBlIHRvIGJlIGV4cGVjdGVkCisgKiBAcG9saWN5OiB2YWxpZGF0aW9uIHBvbGljeQorICogQGV4dGFjazogZXh0ZW5kZWQgQUNLIHJlcG9ydCBzdHJ1Y3QKKyAqCisgKiBWYWxpZGF0ZXMgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgc3RyZWFtIGFnYWluc3QgdGhlCisgKiBzcGVjaWZpZWQgcG9saWN5LiBBdHRyaWJ1dGVzIHdpdGggYSB0eXBlIGV4Y2VlZGluZyBtYXh0eXBlIHdpbGwgYmUKKyAqIGlnbm9yZWQuIFNlZSBkb2N1bWVuYXRpb24gb2Ygc3RydWN0IG5sYV9wb2xpY3kgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludCBubGFfdmFsaWRhdGUoY29uc3Qgc3RydWN0IG5sYXR0ciAqaGVhZCwgaW50IGxlbiwgaW50IG1heHR5cGUsCisJCSBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSAqcG9saWN5LAorCQkgc3RydWN0IG5ldGxpbmtfZXh0X2FjayAqZXh0YWNrKQoreworCWNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYTsKKwlpbnQgcmVtOworCisJbmxhX2Zvcl9lYWNoX2F0dHIobmxhLCBoZWFkLCBsZW4sIHJlbSkgeworCQlpbnQgZXJyID0gdmFsaWRhdGVfbmxhKG5sYSwgbWF4dHlwZSwgcG9saWN5KTsKKworCQlpZiAoZXJyIDwgMCkgeworCQkJaWYgKGV4dGFjaykKKwkJCQlleHRhY2stPmJhZF9hdHRyID0gbmxhOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChubGFfdmFsaWRhdGUpOworCisvKioKKyAqIG5sYV9wb2xpY3lfbGVuIC0gRGV0ZXJtaW4gdGhlIG1heC4gbGVuZ3RoIG9mIGEgcG9saWN5CisgKiBAcG9saWN5OiBwb2xpY3kgdG8gdXNlCisgKiBAbjogbnVtYmVyIG9mIHBvbGljaWVzCisgKgorICogRGV0ZXJtaW5lcyB0aGUgbWF4LiBsZW5ndGggb2YgdGhlIHBvbGljeS4gIEl0IGlzIGN1cnJlbnRseSB1c2VkCisgKiB0byBhbGxvY2F0ZWQgTmV0bGluayBidWZmZXJzIHJvdWdobHkgdGhlIHNpemUgb2YgdGhlIGFjdHVhbAorICogbWVzc2FnZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK2ludAorbmxhX3BvbGljeV9sZW4oY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgKnAsIGludCBuKQoreworCWludCBpLCBsZW4gPSAwOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKywgcCsrKSB7CisJCWlmIChwLT5sZW4pCisJCQlsZW4gKz0gbmxhX3RvdGFsX3NpemUocC0+bGVuKTsKKwkJZWxzZSBpZiAobmxhX2F0dHJfbWlubGVuW3AtPnR5cGVdKQorCQkJbGVuICs9IG5sYV90b3RhbF9zaXplKG5sYV9hdHRyX21pbmxlbltwLT50eXBlXSk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KK0VYUE9SVF9TWU1CT0wobmxhX3BvbGljeV9sZW4pOworCisvKioKKyAqIG5sYV9wYXJzZSAtIFBhcnNlIGEgc3RyZWFtIG9mIGF0dHJpYnV0ZXMgaW50byBhIHRiIGJ1ZmZlcgorICogQHRiOiBkZXN0aW5hdGlvbiBhcnJheSB3aXRoIG1heHR5cGUrMSBlbGVtZW50cworICogQG1heHR5cGU6IG1heGltdW0gYXR0cmlidXRlIHR5cGUgdG8gYmUgZXhwZWN0ZWQKKyAqIEBoZWFkOiBoZWFkIG9mIGF0dHJpYnV0ZSBzdHJlYW0KKyAqIEBsZW46IGxlbmd0aCBvZiBhdHRyaWJ1dGUgc3RyZWFtCisgKiBAcG9saWN5OiB2YWxpZGF0aW9uIHBvbGljeQorICoKKyAqIFBhcnNlcyBhIHN0cmVhbSBvZiBhdHRyaWJ1dGVzIGFuZCBzdG9yZXMgYSBwb2ludGVyIHRvIGVhY2ggYXR0cmlidXRlIGluCisgKiB0aGUgdGIgYXJyYXkgYWNjZXNzaWJsZSB2aWEgdGhlIGF0dHJpYnV0ZSB0eXBlLiBBdHRyaWJ1dGVzIHdpdGggYSB0eXBlCisgKiBleGNlZWRpbmcgbWF4dHlwZSB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgKiByZWFzb25zLiBwb2xpY3kgbWF5IGJlIHNldCB0byBOVUxMIGlmIG5vIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitpbnQgbmxhX3BhcnNlKHN0cnVjdCBubGF0dHIgKip0YiwgaW50IG1heHR5cGUsIGNvbnN0IHN0cnVjdCBubGF0dHIgKmhlYWQsCisJICAgICAgaW50IGxlbiwgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgKnBvbGljeSwKKwkgICAgICBzdHJ1Y3QgbmV0bGlua19leHRfYWNrICpleHRhY2spCit7CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhOworCWludCByZW0sIGVycjsKKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHN0cnVjdCBubGF0dHIgKikgKiAobWF4dHlwZSArIDEpKTsKKworCW5sYV9mb3JfZWFjaF9hdHRyKG5sYSwgaGVhZCwgbGVuLCByZW0pIHsKKwkJdTE2IHR5cGUgPSBubGFfdHlwZShubGEpOworCisJCWlmICh0eXBlID4gMCAmJiB0eXBlIDw9IG1heHR5cGUpIHsKKwkJCWlmIChwb2xpY3kpIHsKKwkJCQllcnIgPSB2YWxpZGF0ZV9ubGEobmxhLCBtYXh0eXBlLCBwb2xpY3kpOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWlmIChleHRhY2spCisJCQkJCQlleHRhY2stPmJhZF9hdHRyID0gbmxhOworCQkJCQlnb3RvIGVycm91dDsKKwkJCQl9CisJCQl9CisKKwkJCXRiW3R5cGVdID0gKHN0cnVjdCBubGF0dHIgKilubGE7CisJCX0KKwl9CisKKwlpZiAodW5saWtlbHkocmVtID4gMCkpCisJCXByX3dhcm5fcmF0ZWxpbWl0ZWQoIm5ldGxpbms6ICVkIGJ5dGVzIGxlZnRvdmVyIGFmdGVyIHBhcnNpbmcgYXR0cmlidXRlcyBpbiBwcm9jZXNzIGAlcycuXG4iLAorCQkJCSAgICByZW0sIGN1cnJlbnQtPmNvbW0pOworCisJZXJyID0gMDsKK2Vycm91dDoKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChubGFfcGFyc2UpOworCisvKioKKyAqIG5sYV9maW5kIC0gRmluZCBhIHNwZWNpZmljIGF0dHJpYnV0ZSBpbiBhIHN0cmVhbSBvZiBhdHRyaWJ1dGVzCisgKiBAaGVhZDogaGVhZCBvZiBhdHRyaWJ1dGUgc3RyZWFtCisgKiBAbGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHN0cmVhbQorICogQGF0dHJ0eXBlOiB0eXBlIG9mIGF0dHJpYnV0ZSB0byBsb29rIGZvcgorICoKKyAqIFJldHVybnMgdGhlIGZpcnN0IGF0dHJpYnV0ZSBpbiB0aGUgc3RyZWFtIG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAqLworc3RydWN0IG5sYXR0ciAqbmxhX2ZpbmQoY29uc3Qgc3RydWN0IG5sYXR0ciAqaGVhZCwgaW50IGxlbiwgaW50IGF0dHJ0eXBlKQoreworCWNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYTsKKwlpbnQgcmVtOworCisJbmxhX2Zvcl9lYWNoX2F0dHIobmxhLCBoZWFkLCBsZW4sIHJlbSkKKwkJaWYgKG5sYV90eXBlKG5sYSkgPT0gYXR0cnR5cGUpCisJCQlyZXR1cm4gKHN0cnVjdCBubGF0dHIgKilubGE7CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobmxhX2ZpbmQpOworCisvKioKKyAqIG5sYV9zdHJsY3B5IC0gQ29weSBzdHJpbmcgYXR0cmlidXRlIHBheWxvYWQgaW50byBhIHNpemVkIGJ1ZmZlcgorICogQGRzdDogd2hlcmUgdG8gY29weSB0aGUgc3RyaW5nIHRvCisgKiBAbmxhOiBhdHRyaWJ1dGUgdG8gY29weSB0aGUgc3RyaW5nIGZyb20KKyAqIEBkc3RzaXplOiBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIENvcGllcyBhdCBtb3N0IGRzdHNpemUgLSAxIGJ5dGVzIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqIFRoZSByZXN1bHQgaXMgYWx3YXlzIGEgdmFsaWQgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLiBVbmxpa2UKKyAqIHN0cmxjcHkgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBpcyBhbHdheXMgcGFkZGVkIG91dC4KKyAqCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKi8KK3NpemVfdCBubGFfc3RybGNweShjaGFyICpkc3QsIGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwgc2l6ZV90IGRzdHNpemUpCit7CisJc2l6ZV90IHNyY2xlbiA9IG5sYV9sZW4obmxhKTsKKwljaGFyICpzcmMgPSBubGFfZGF0YShubGEpOworCisJaWYgKHNyY2xlbiA+IDAgJiYgc3JjW3NyY2xlbiAtIDFdID09ICdcMCcpCisJCXNyY2xlbi0tOworCisJaWYgKGRzdHNpemUgPiAwKSB7CisJCXNpemVfdCBsZW4gPSAoc3JjbGVuID49IGRzdHNpemUpID8gZHN0c2l6ZSAtIDEgOiBzcmNsZW47CisKKwkJbWVtc2V0KGRzdCwgMCwgZHN0c2l6ZSk7CisJCW1lbWNweShkc3QsIHNyYywgbGVuKTsKKwl9CisKKwlyZXR1cm4gc3JjbGVuOworfQorRVhQT1JUX1NZTUJPTChubGFfc3RybGNweSk7CisKKy8qKgorICogbmxhX3N0cmR1cCAtIENvcHkgc3RyaW5nIGF0dHJpYnV0ZSBwYXlsb2FkIGludG8gYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyCisgKiBAbmxhOiBhdHRyaWJ1dGUgdG8gY29weSB0aGUgc3RyaW5nIGZyb20KKyAqIEBmbGFnczogdGhlIHR5cGUgb2YgbWVtb3J5IHRvIGFsbG9jYXRlIChzZWUga21hbGxvYykuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIgb3IgTlVMTCBvbiBlcnJvci4KKyAqLworY2hhciAqbmxhX3N0cmR1cChjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEsIGdmcF90IGZsYWdzKQoreworCXNpemVfdCBzcmNsZW4gPSBubGFfbGVuKG5sYSk7CisJY2hhciAqc3JjID0gbmxhX2RhdGEobmxhKSwgKmRzdDsKKworCWlmIChzcmNsZW4gPiAwICYmIHNyY1tzcmNsZW4gLSAxXSA9PSAnXDAnKQorCQlzcmNsZW4tLTsKKworCWRzdCA9IGttYWxsb2Moc3JjbGVuICsgMSwgZmxhZ3MpOworCWlmIChkc3QgIT0gTlVMTCkgeworCQltZW1jcHkoZHN0LCBzcmMsIHNyY2xlbik7CisJCWRzdFtzcmNsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIGRzdDsKK30KK0VYUE9SVF9TWU1CT0wobmxhX3N0cmR1cCk7CisKKy8qKgorICogbmxhX21lbWNweSAtIENvcHkgYSBuZXRsaW5rIGF0dHJpYnV0ZSBpbnRvIGFub3RoZXIgbWVtb3J5IGFyZWEKKyAqIEBkZXN0OiB3aGVyZSB0byBjb3B5IHRvIG1lbWNweQorICogQHNyYzogbmV0bGluayBhdHRyaWJ1dGUgdG8gY29weSBmcm9tCisgKiBAY291bnQ6IHNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGFyZWEKKyAqCisgKiBOb3RlOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpcyBsaW1pdGVkIGJ5IHRoZSBsZW5ndGggb2YKKyAqICAgICAgIGF0dHJpYnV0ZSdzIHBheWxvYWQuIG1lbWNweQorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQuCisgKi8KK2ludCBubGFfbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHN0cnVjdCBubGF0dHIgKnNyYywgaW50IGNvdW50KQoreworCWludCBtaW5sZW4gPSBtaW5fdChpbnQsIGNvdW50LCBubGFfbGVuKHNyYykpOworCisJbWVtY3B5KGRlc3QsIG5sYV9kYXRhKHNyYyksIG1pbmxlbik7CisJaWYgKGNvdW50ID4gbWlubGVuKQorCQltZW1zZXQoZGVzdCArIG1pbmxlbiwgMCwgY291bnQgLSBtaW5sZW4pOworCisJcmV0dXJuIG1pbmxlbjsKK30KK0VYUE9SVF9TWU1CT0wobmxhX21lbWNweSk7CisKKy8qKgorICogbmxhX21lbWNtcCAtIENvbXBhcmUgYW4gYXR0cmlidXRlIHdpdGggc2l6ZWQgbWVtb3J5IGFyZWEKKyAqIEBubGE6IG5ldGxpbmsgYXR0cmlidXRlCisgKiBAZGF0YTogbWVtb3J5IGFyZWEKKyAqIEBzaXplOiBzaXplIG9mIG1lbW9yeSBhcmVhCisgKi8KK2ludCBubGFfbWVtY21wKGNvbnN0IHN0cnVjdCBubGF0dHIgKm5sYSwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgICAgc2l6ZV90IHNpemUpCit7CisJaW50IGQgPSBubGFfbGVuKG5sYSkgLSBzaXplOworCisJaWYgKGQgPT0gMCkKKwkJZCA9IG1lbWNtcChubGFfZGF0YShubGEpLCBkYXRhLCBzaXplKTsKKworCXJldHVybiBkOworfQorRVhQT1JUX1NZTUJPTChubGFfbWVtY21wKTsKKworLyoqCisgKiBubGFfc3RyY21wIC0gQ29tcGFyZSBhIHN0cmluZyBhdHRyaWJ1dGUgYWdhaW5zdCBhIHN0cmluZworICogQG5sYTogbmV0bGluayBzdHJpbmcgYXR0cmlidXRlCisgKiBAc3RyOiBhbm90aGVyIHN0cmluZworICovCitpbnQgbmxhX3N0cmNtcChjb25zdCBzdHJ1Y3QgbmxhdHRyICpubGEsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cik7CisJY2hhciAqYnVmID0gbmxhX2RhdGEobmxhKTsKKwlpbnQgYXR0cmxlbiA9IG5sYV9sZW4obmxhKTsKKwlpbnQgZDsKKworCWlmIChhdHRybGVuID4gMCAmJiBidWZbYXR0cmxlbiAtIDFdID09ICdcMCcpCisJCWF0dHJsZW4tLTsKKworCWQgPSBhdHRybGVuIC0gbGVuOworCWlmIChkID09IDApCisJCWQgPSBtZW1jbXAobmxhX2RhdGEobmxhKSwgc3RyLCBsZW4pOworCisJcmV0dXJuIGQ7Cit9CitFWFBPUlRfU1lNQk9MKG5sYV9zdHJjbXApOworCisjaWZkZWYgQ09ORklHX05FVAorLyoqCisgKiBfX25sYV9yZXNlcnZlIC0gcmVzZXJ2ZSByb29tIGZvciBhdHRyaWJ1dGUgb24gdGhlIHNrYgorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byByZXNlcnZlIHJvb20gb24KKyAqIEBhdHRydHlwZTogYXR0cmlidXRlIHR5cGUKKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqCisgKiBBZGRzIGEgbmV0bGluayBhdHRyaWJ1dGUgaGVhZGVyIHRvIGEgc29ja2V0IGJ1ZmZlciBhbmQgcmVzZXJ2ZXMKKyAqIHJvb20gZm9yIHRoZSBwYXlsb2FkIGJ1dCBkb2VzIG5vdCBjb3B5IGl0LgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZW5zdXJlIHRoYXQgdGhlIHNrYiBwcm92aWRlcyBlbm91Z2gKKyAqIHRhaWxyb29tIGZvciB0aGUgYXR0cmlidXRlIGhlYWRlciBhbmQgcGF5bG9hZC4KKyAqLworc3RydWN0IG5sYXR0ciAqX19ubGFfcmVzZXJ2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cnR5cGUsIGludCBhdHRybGVuKQoreworCXN0cnVjdCBubGF0dHIgKm5sYTsKKworCW5sYSA9IHNrYl9wdXQoc2tiLCBubGFfdG90YWxfc2l6ZShhdHRybGVuKSk7CisJbmxhLT5ubGFfdHlwZSA9IGF0dHJ0eXBlOworCW5sYS0+bmxhX2xlbiA9IG5sYV9hdHRyX3NpemUoYXR0cmxlbik7CisKKwltZW1zZXQoKHVuc2lnbmVkIGNoYXIgKikgbmxhICsgbmxhLT5ubGFfbGVuLCAwLCBubGFfcGFkbGVuKGF0dHJsZW4pKTsKKworCXJldHVybiBubGE7Cit9CitFWFBPUlRfU1lNQk9MKF9fbmxhX3Jlc2VydmUpOworCisvKioKKyAqIF9fbmxhX3Jlc2VydmVfNjRiaXQgLSByZXNlcnZlIHJvb20gZm9yIGF0dHJpYnV0ZSBvbiB0aGUgc2tiIGFuZCBhbGlnbiBpdAorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byByZXNlcnZlIHJvb20gb24KKyAqIEBhdHRydHlwZTogYXR0cmlidXRlIHR5cGUKKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqIEBwYWRhdHRyOiBhdHRyaWJ1dGUgdHlwZSBmb3IgdGhlIHBhZGRpbmcKKyAqCisgKiBBZGRzIGEgbmV0bGluayBhdHRyaWJ1dGUgaGVhZGVyIHRvIGEgc29ja2V0IGJ1ZmZlciBhbmQgcmVzZXJ2ZXMKKyAqIHJvb20gZm9yIHRoZSBwYXlsb2FkIGJ1dCBkb2VzIG5vdCBjb3B5IGl0LiBJdCBhbHNvIGVuc3VyZSB0aGF0IHRoaXMKKyAqIGF0dHJpYnV0ZSB3aWxsIGhhdmUgYSA2NC1iaXQgYWxpZ25lZCBubGFfZGF0YSgpIGFyZWEuCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBlbnN1cmUgdGhhdCB0aGUgc2tiIHByb3ZpZGVzIGVub3VnaAorICogdGFpbHJvb20gZm9yIHRoZSBhdHRyaWJ1dGUgaGVhZGVyIGFuZCBwYXlsb2FkLgorICovCitzdHJ1Y3QgbmxhdHRyICpfX25sYV9yZXNlcnZlXzY0Yml0KHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwKKwkJCQkgICBpbnQgYXR0cmxlbiwgaW50IHBhZGF0dHIpCit7CisJaWYgKG5sYV9uZWVkX3BhZGRpbmdfZm9yXzY0Yml0KHNrYikpCisJCW5sYV9hbGlnbl82NGJpdChza2IsIHBhZGF0dHIpOworCisJcmV0dXJuIF9fbmxhX3Jlc2VydmUoc2tiLCBhdHRydHlwZSwgYXR0cmxlbik7Cit9CitFWFBPUlRfU1lNQk9MKF9fbmxhX3Jlc2VydmVfNjRiaXQpOworCisvKioKKyAqIF9fbmxhX3Jlc2VydmVfbm9oZHIgLSByZXNlcnZlIHJvb20gZm9yIGF0dHJpYnV0ZSB3aXRob3V0IGhlYWRlcgorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byByZXNlcnZlIHJvb20gb24KKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqCisgKiBSZXNlcnZlcyByb29tIGZvciBhdHRyaWJ1dGUgcGF5bG9hZCB3aXRob3V0IGEgaGVhZGVyLgorICoKKyAqIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgdG8gZW5zdXJlIHRoYXQgdGhlIHNrYiBwcm92aWRlcyBlbm91Z2gKKyAqIHRhaWxyb29tIGZvciB0aGUgcGF5bG9hZC4KKyAqLwordm9pZCAqX19ubGFfcmVzZXJ2ZV9ub2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cmxlbikKK3sKKwlyZXR1cm4gc2tiX3B1dF96ZXJvKHNrYiwgTkxBX0FMSUdOKGF0dHJsZW4pKTsKK30KK0VYUE9SVF9TWU1CT0woX19ubGFfcmVzZXJ2ZV9ub2hkcik7CisKKy8qKgorICogbmxhX3Jlc2VydmUgLSByZXNlcnZlIHJvb20gZm9yIGF0dHJpYnV0ZSBvbiB0aGUgc2tiCisgKiBAc2tiOiBzb2NrZXQgYnVmZmVyIHRvIHJlc2VydmUgcm9vbSBvbgorICogQGF0dHJ0eXBlOiBhdHRyaWJ1dGUgdHlwZQorICogQGF0dHJsZW46IGxlbmd0aCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICoKKyAqIEFkZHMgYSBuZXRsaW5rIGF0dHJpYnV0ZSBoZWFkZXIgdG8gYSBzb2NrZXQgYnVmZmVyIGFuZCByZXNlcnZlcworICogcm9vbSBmb3IgdGhlIHBheWxvYWQgYnV0IGRvZXMgbm90IGNvcHkgaXQuCisgKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSB0YWlscm9vbSBvZiB0aGUgc2tiIGlzIGluc3VmZmljaWVudCB0byBzdG9yZQorICogdGhlIGF0dHJpYnV0ZSBoZWFkZXIgYW5kIHBheWxvYWQuCisgKi8KK3N0cnVjdCBubGF0dHIgKm5sYV9yZXNlcnZlKHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4pCit7CisJaWYgKHVubGlrZWx5KHNrYl90YWlscm9vbShza2IpIDwgbmxhX3RvdGFsX3NpemUoYXR0cmxlbikpKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBfX25sYV9yZXNlcnZlKHNrYiwgYXR0cnR5cGUsIGF0dHJsZW4pOworfQorRVhQT1JUX1NZTUJPTChubGFfcmVzZXJ2ZSk7CisKKy8qKgorICogbmxhX3Jlc2VydmVfNjRiaXQgLSByZXNlcnZlIHJvb20gZm9yIGF0dHJpYnV0ZSBvbiB0aGUgc2tiIGFuZCBhbGlnbiBpdAorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byByZXNlcnZlIHJvb20gb24KKyAqIEBhdHRydHlwZTogYXR0cmlidXRlIHR5cGUKKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqIEBwYWRhdHRyOiBhdHRyaWJ1dGUgdHlwZSBmb3IgdGhlIHBhZGRpbmcKKyAqCisgKiBBZGRzIGEgbmV0bGluayBhdHRyaWJ1dGUgaGVhZGVyIHRvIGEgc29ja2V0IGJ1ZmZlciBhbmQgcmVzZXJ2ZXMKKyAqIHJvb20gZm9yIHRoZSBwYXlsb2FkIGJ1dCBkb2VzIG5vdCBjb3B5IGl0LiBJdCBhbHNvIGVuc3VyZSB0aGF0IHRoaXMKKyAqIGF0dHJpYnV0ZSB3aWxsIGhhdmUgYSA2NC1iaXQgYWxpZ25lZCBubGFfZGF0YSgpIGFyZWEuCisgKgorICogUmV0dXJucyBOVUxMIGlmIHRoZSB0YWlscm9vbSBvZiB0aGUgc2tiIGlzIGluc3VmZmljaWVudCB0byBzdG9yZQorICogdGhlIGF0dHJpYnV0ZSBoZWFkZXIgYW5kIHBheWxvYWQuCisgKi8KK3N0cnVjdCBubGF0dHIgKm5sYV9yZXNlcnZlXzY0Yml0KHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4sCisJCQkJIGludCBwYWRhdHRyKQoreworCXNpemVfdCBsZW47CisKKwlpZiAobmxhX25lZWRfcGFkZGluZ19mb3JfNjRiaXQoc2tiKSkKKwkJbGVuID0gbmxhX3RvdGFsX3NpemVfNjRiaXQoYXR0cmxlbik7CisJZWxzZQorCQlsZW4gPSBubGFfdG90YWxfc2l6ZShhdHRybGVuKTsKKwlpZiAodW5saWtlbHkoc2tiX3RhaWxyb29tKHNrYikgPCBsZW4pKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBfX25sYV9yZXNlcnZlXzY0Yml0KHNrYiwgYXR0cnR5cGUsIGF0dHJsZW4sIHBhZGF0dHIpOworfQorRVhQT1JUX1NZTUJPTChubGFfcmVzZXJ2ZV82NGJpdCk7CisKKy8qKgorICogbmxhX3Jlc2VydmVfbm9oZHIgLSByZXNlcnZlIHJvb20gZm9yIGF0dHJpYnV0ZSB3aXRob3V0IGhlYWRlcgorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byByZXNlcnZlIHJvb20gb24KKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqCisgKiBSZXNlcnZlcyByb29tIGZvciBhdHRyaWJ1dGUgcGF5bG9hZCB3aXRob3V0IGEgaGVhZGVyLgorICoKKyAqIFJldHVybnMgTlVMTCBpZiB0aGUgdGFpbHJvb20gb2YgdGhlIHNrYiBpcyBpbnN1ZmZpY2llbnQgdG8gc3RvcmUKKyAqIHRoZSBhdHRyaWJ1dGUgcGF5bG9hZC4KKyAqLwordm9pZCAqbmxhX3Jlc2VydmVfbm9oZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHJsZW4pCit7CisJaWYgKHVubGlrZWx5KHNrYl90YWlscm9vbShza2IpIDwgTkxBX0FMSUdOKGF0dHJsZW4pKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gX19ubGFfcmVzZXJ2ZV9ub2hkcihza2IsIGF0dHJsZW4pOworfQorRVhQT1JUX1NZTUJPTChubGFfcmVzZXJ2ZV9ub2hkcik7CisKKy8qKgorICogX19ubGFfcHV0IC0gQWRkIGEgbmV0bGluayBhdHRyaWJ1dGUgdG8gYSBzb2NrZXQgYnVmZmVyCisgKiBAc2tiOiBzb2NrZXQgYnVmZmVyIHRvIGFkZCBhdHRyaWJ1dGUgdG8KKyAqIEBhdHRydHlwZTogYXR0cmlidXRlIHR5cGUKKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqIEBkYXRhOiBoZWFkIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCisgKgorICogVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBlbnN1cmUgdGhhdCB0aGUgc2tiIHByb3ZpZGVzIGVub3VnaAorICogdGFpbHJvb20gZm9yIHRoZSBhdHRyaWJ1dGUgaGVhZGVyIGFuZCBwYXlsb2FkLgorICovCit2b2lkIF9fbmxhX3B1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cnR5cGUsIGludCBhdHRybGVuLAorCQkJICAgICBjb25zdCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBubGF0dHIgKm5sYTsKKworCW5sYSA9IF9fbmxhX3Jlc2VydmUoc2tiLCBhdHRydHlwZSwgYXR0cmxlbik7CisJbWVtY3B5KG5sYV9kYXRhKG5sYSksIGRhdGEsIGF0dHJsZW4pOworfQorRVhQT1JUX1NZTUJPTChfX25sYV9wdXQpOworCisvKioKKyAqIF9fbmxhX3B1dF82NGJpdCAtIEFkZCBhIG5ldGxpbmsgYXR0cmlidXRlIHRvIGEgc29ja2V0IGJ1ZmZlciBhbmQgYWxpZ24gaXQKKyAqIEBza2I6IHNvY2tldCBidWZmZXIgdG8gYWRkIGF0dHJpYnV0ZSB0bworICogQGF0dHJ0eXBlOiBhdHRyaWJ1dGUgdHlwZQorICogQGF0dHJsZW46IGxlbmd0aCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICogQGRhdGE6IGhlYWQgb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqIEBwYWRhdHRyOiBhdHRyaWJ1dGUgdHlwZSBmb3IgdGhlIHBhZGRpbmcKKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGVuc3VyZSB0aGF0IHRoZSBza2IgcHJvdmlkZXMgZW5vdWdoCisgKiB0YWlscm9vbSBmb3IgdGhlIGF0dHJpYnV0ZSBoZWFkZXIgYW5kIHBheWxvYWQuCisgKi8KK3ZvaWQgX19ubGFfcHV0XzY0Yml0KHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4sCisJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IHBhZGF0dHIpCit7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gX19ubGFfcmVzZXJ2ZV82NGJpdChza2IsIGF0dHJ0eXBlLCBhdHRybGVuLCBwYWRhdHRyKTsKKwltZW1jcHkobmxhX2RhdGEobmxhKSwgZGF0YSwgYXR0cmxlbik7Cit9CitFWFBPUlRfU1lNQk9MKF9fbmxhX3B1dF82NGJpdCk7CisKKy8qKgorICogX19ubGFfcHV0X25vaGRyIC0gQWRkIGEgbmV0bGluayBhdHRyaWJ1dGUgd2l0aG91dCBoZWFkZXIKKyAqIEBza2I6IHNvY2tldCBidWZmZXIgdG8gYWRkIGF0dHJpYnV0ZSB0bworICogQGF0dHJsZW46IGxlbmd0aCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICogQGRhdGE6IGhlYWQgb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqCisgKiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGVuc3VyZSB0aGF0IHRoZSBza2IgcHJvdmlkZXMgZW5vdWdoCisgKiB0YWlscm9vbSBmb3IgdGhlIGF0dHJpYnV0ZSBwYXlsb2FkLgorICovCit2b2lkIF9fbmxhX3B1dF9ub2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cmxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwl2b2lkICpzdGFydDsKKworCXN0YXJ0ID0gX19ubGFfcmVzZXJ2ZV9ub2hkcihza2IsIGF0dHJsZW4pOworCW1lbWNweShzdGFydCwgZGF0YSwgYXR0cmxlbik7Cit9CitFWFBPUlRfU1lNQk9MKF9fbmxhX3B1dF9ub2hkcik7CisKKy8qKgorICogbmxhX3B1dCAtIEFkZCBhIG5ldGxpbmsgYXR0cmlidXRlIHRvIGEgc29ja2V0IGJ1ZmZlcgorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byBhZGQgYXR0cmlidXRlIHRvCisgKiBAYXR0cnR5cGU6IGF0dHJpYnV0ZSB0eXBlCisgKiBAYXR0cmxlbjogbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCisgKiBAZGF0YTogaGVhZCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICoKKyAqIFJldHVybnMgLUVNU0dTSVpFIGlmIHRoZSB0YWlscm9vbSBvZiB0aGUgc2tiIGlzIGluc3VmZmljaWVudCB0byBzdG9yZQorICogdGhlIGF0dHJpYnV0ZSBoZWFkZXIgYW5kIHBheWxvYWQuCisgKi8KK2ludCBubGFfcHV0KHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4sIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJaWYgKHVubGlrZWx5KHNrYl90YWlscm9vbShza2IpIDwgbmxhX3RvdGFsX3NpemUoYXR0cmxlbikpKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJX19ubGFfcHV0KHNrYiwgYXR0cnR5cGUsIGF0dHJsZW4sIGRhdGEpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChubGFfcHV0KTsKKworLyoqCisgKiBubGFfcHV0XzY0Yml0IC0gQWRkIGEgbmV0bGluayBhdHRyaWJ1dGUgdG8gYSBzb2NrZXQgYnVmZmVyIGFuZCBhbGlnbiBpdAorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byBhZGQgYXR0cmlidXRlIHRvCisgKiBAYXR0cnR5cGU6IGF0dHJpYnV0ZSB0eXBlCisgKiBAYXR0cmxlbjogbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCisgKiBAZGF0YTogaGVhZCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICogQHBhZGF0dHI6IGF0dHJpYnV0ZSB0eXBlIGZvciB0aGUgcGFkZGluZworICoKKyAqIFJldHVybnMgLUVNU0dTSVpFIGlmIHRoZSB0YWlscm9vbSBvZiB0aGUgc2tiIGlzIGluc3VmZmljaWVudCB0byBzdG9yZQorICogdGhlIGF0dHJpYnV0ZSBoZWFkZXIgYW5kIHBheWxvYWQuCisgKi8KK2ludCBubGFfcHV0XzY0Yml0KHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSwgaW50IGF0dHJsZW4sCisJCSAgY29uc3Qgdm9pZCAqZGF0YSwgaW50IHBhZGF0dHIpCit7CisJc2l6ZV90IGxlbjsKKworCWlmIChubGFfbmVlZF9wYWRkaW5nX2Zvcl82NGJpdChza2IpKQorCQlsZW4gPSBubGFfdG90YWxfc2l6ZV82NGJpdChhdHRybGVuKTsKKwllbHNlCisJCWxlbiA9IG5sYV90b3RhbF9zaXplKGF0dHJsZW4pOworCWlmICh1bmxpa2VseShza2JfdGFpbHJvb20oc2tiKSA8IGxlbikpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlfX25sYV9wdXRfNjRiaXQoc2tiLCBhdHRydHlwZSwgYXR0cmxlbiwgZGF0YSwgcGFkYXR0cik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG5sYV9wdXRfNjRiaXQpOworCisvKioKKyAqIG5sYV9wdXRfbm9oZHIgLSBBZGQgYSBuZXRsaW5rIGF0dHJpYnV0ZSB3aXRob3V0IGhlYWRlcgorICogQHNrYjogc29ja2V0IGJ1ZmZlciB0byBhZGQgYXR0cmlidXRlIHRvCisgKiBAYXR0cmxlbjogbGVuZ3RoIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCisgKiBAZGF0YTogaGVhZCBvZiBhdHRyaWJ1dGUgcGF5bG9hZAorICoKKyAqIFJldHVybnMgLUVNU0dTSVpFIGlmIHRoZSB0YWlscm9vbSBvZiB0aGUgc2tiIGlzIGluc3VmZmljaWVudCB0byBzdG9yZQorICogdGhlIGF0dHJpYnV0ZSBwYXlsb2FkLgorICovCitpbnQgbmxhX3B1dF9ub2hkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgYXR0cmxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlpZiAodW5saWtlbHkoc2tiX3RhaWxyb29tKHNrYikgPCBOTEFfQUxJR04oYXR0cmxlbikpKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJX19ubGFfcHV0X25vaGRyKHNrYiwgYXR0cmxlbiwgZGF0YSk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKG5sYV9wdXRfbm9oZHIpOworCisvKioKKyAqIG5sYV9hcHBlbmQgLSBBZGQgYSBuZXRsaW5rIGF0dHJpYnV0ZSB3aXRob3V0IGhlYWRlciBvciBwYWRkaW5nCisgKiBAc2tiOiBzb2NrZXQgYnVmZmVyIHRvIGFkZCBhdHRyaWJ1dGUgdG8KKyAqIEBhdHRybGVuOiBsZW5ndGggb2YgYXR0cmlidXRlIHBheWxvYWQKKyAqIEBkYXRhOiBoZWFkIG9mIGF0dHJpYnV0ZSBwYXlsb2FkCisgKgorICogUmV0dXJucyAtRU1TR1NJWkUgaWYgdGhlIHRhaWxyb29tIG9mIHRoZSBza2IgaXMgaW5zdWZmaWNpZW50IHRvIHN0b3JlCisgKiB0aGUgYXR0cmlidXRlIHBheWxvYWQuCisgKi8KK2ludCBubGFfYXBwZW5kKHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRybGVuLCBjb25zdCB2b2lkICpkYXRhKQoreworCWlmICh1bmxpa2VseShza2JfdGFpbHJvb20oc2tiKSA8IE5MQV9BTElHTihhdHRybGVuKSkpCisJCXJldHVybiAtRU1TR1NJWkU7CisKKwlza2JfcHV0X2RhdGEoc2tiLCBkYXRhLCBhdHRybGVuKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wobmxhX2FwcGVuZCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25taV9iYWNrdHJhY2UuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25taV9iYWNrdHJhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGIxZjlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbm1pX2JhY2t0cmFjZS5jCkBAIC0wLDAgKzEsMTEwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqICBOTUkgYmFja3RyYWNlIHN1cHBvcnQKKyAqCisgKiBHcmF0dWl0b3VzbHkgY29waWVkIGZyb20gYXJjaC94ODYva2VybmVsL2FwaWMvaHdfbm1pLmMgYnkgUnVzc2VsbCBLaW5nLAorICogd2l0aCB0aGUgZm9sbG93aW5nIGhlYWRlcjoKKyAqCisgKiAgSFcgTk1JIHdhdGNoZG9nIHN1cHBvcnQKKyAqCisgKiAgc3RhcnRlZCBieSBEb24gWmlja3VzLCBDb3B5cmlnaHQgKEMpIDIwMTAgUmVkIEhhdCwgSW5jLgorICoKKyAqICBBcmNoIHNwZWNpZmljIGNhbGxzIHRvIHN1cHBvcnQgTk1JIHdhdGNoZG9nCisgKgorICogIEJpdHMgY29waWVkIGZyb20gb3JpZ2luYWwgbm1pLmMgZmlsZQorICovCisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkL2RlYnVnLmg+CisKKyNpZmRlZiBhcmNoX3RyaWdnZXJfY3B1bWFza19iYWNrdHJhY2UKKy8qIEZvciByZWxpYWJpbGl0eSwgd2UncmUgcHJlcGFyZWQgdG8gd2FzdGUgYml0cyBoZXJlLiAqLworc3RhdGljIERFQ0xBUkVfQklUTUFQKGJhY2t0cmFjZV9tYXNrLCBOUl9DUFVTKSBfX3JlYWRfbW9zdGx5OworCisvKiAiaW4gcHJvZ3Jlc3MiIGZsYWcgb2YgYXJjaF90cmlnZ2VyX2NwdW1hc2tfYmFja3RyYWNlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBiYWNrdHJhY2VfZmxhZzsKKworLyoKKyAqIFdoZW4gcmFpc2UoKSBpcyBjYWxsZWQgaXQgd2lsbCBiZSBwYXNzZWQgYSBwb2ludGVyIHRvIHRoZQorICogYmFja3RyYWNlX21hc2suIEFyY2hpdGVjdHVyZXMgdGhhdCBjYWxsIG5taV9jcHVfYmFja3RyYWNlKCkKKyAqIGRpcmVjdGx5IGZyb20gdGhlaXIgcmFpc2UoKSBmdW5jdGlvbnMgbWF5IHJlbHkgb24gdGhlIG1hc2sKKyAqIHRoZXkgYXJlIHBhc3NlZCBiZWluZyB1cGRhdGVkIGFzIGEgc2lkZSBlZmZlY3Qgb2YgdGhpcyBjYWxsLgorICovCit2b2lkIG5taV90cmlnZ2VyX2NwdW1hc2tfYmFja3RyYWNlKGNvbnN0IGNwdW1hc2tfdCAqbWFzaywKKwkJCQkgICBib29sIGV4Y2x1ZGVfc2VsZiwKKwkJCQkgICB2b2lkICgqcmFpc2UpKGNwdW1hc2tfdCAqbWFzaykpCit7CisJaW50IGksIHRoaXNfY3B1ID0gZ2V0X2NwdSgpOworCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJmJhY2t0cmFjZV9mbGFnKSkgeworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgdHJpZ2dlcl9hbGxfY3B1X2JhY2t0cmFjZSgpIGluIHByb2dyZXNzCisJCSAqIChiYWNrdHJhY2VfZmxhZyA9PSAxKSwgZG9uJ3Qgb3V0cHV0IGRvdWJsZSBjcHUgZHVtcCBpbmZvcy4KKwkJICovCisJCXB1dF9jcHUoKTsKKwkJcmV0dXJuOworCX0KKworCWNwdW1hc2tfY29weSh0b19jcHVtYXNrKGJhY2t0cmFjZV9tYXNrKSwgbWFzayk7CisJaWYgKGV4Y2x1ZGVfc2VsZikKKwkJY3B1bWFza19jbGVhcl9jcHUodGhpc19jcHUsIHRvX2NwdW1hc2soYmFja3RyYWNlX21hc2spKTsKKworCS8qCisJICogRG9uJ3QgdHJ5IHRvIHNlbmQgYW4gTk1JIHRvIHRoaXMgY3B1OyBpdCBtYXkgd29yayBvbiBzb21lCisJICogYXJjaGl0ZWN0dXJlcywgYnV0IG9uIG90aGVycyBpdCBtYXkgbm90LCBhbmQgd2UnbGwgZ2V0CisJICogaW5mb3JtYXRpb24gYXQgbGVhc3QgYXMgdXNlZnVsIGp1c3QgYnkgZG9pbmcgYSBkdW1wX3N0YWNrKCkgaGVyZS4KKwkgKiBOb3RlIHRoYXQgbm1pX2NwdV9iYWNrdHJhY2UoTlVMTCkgd2lsbCBjbGVhciB0aGUgY3B1IGJpdC4KKwkgKi8KKwlpZiAoY3B1bWFza190ZXN0X2NwdSh0aGlzX2NwdSwgdG9fY3B1bWFzayhiYWNrdHJhY2VfbWFzaykpKQorCQlubWlfY3B1X2JhY2t0cmFjZShOVUxMKTsKKworCWlmICghY3B1bWFza19lbXB0eSh0b19jcHVtYXNrKGJhY2t0cmFjZV9tYXNrKSkpIHsKKwkJcHJfaW5mbygiU2VuZGluZyBOTUkgZnJvbSBDUFUgJWQgdG8gQ1BVcyAlKnBibDpcbiIsCisJCQl0aGlzX2NwdSwgbnJfY3B1bWFza19iaXRzLCB0b19jcHVtYXNrKGJhY2t0cmFjZV9tYXNrKSk7CisJCXJhaXNlKHRvX2NwdW1hc2soYmFja3RyYWNlX21hc2spKTsKKwl9CisKKwkvKiBXYWl0IGZvciB1cCB0byAxMCBzZWNvbmRzIGZvciBhbGwgQ1BVcyB0byBkbyB0aGUgYmFja3RyYWNlICovCisJZm9yIChpID0gMDsgaSA8IDEwICogMTAwMDsgaSsrKSB7CisJCWlmIChjcHVtYXNrX2VtcHR5KHRvX2NwdW1hc2soYmFja3RyYWNlX21hc2spKSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwl9CisKKwkvKgorCSAqIEZvcmNlIGZsdXNoIGFueSByZW1vdGUgYnVmZmVycyB0aGF0IG1pZ2h0IGJlIHN0dWNrIGluIElSUSBjb250ZXh0CisJICogYW5kIHRoZXJlZm9yZSBjb3VsZCBub3QgcnVuIHRoZWlyIGlycV93b3JrLgorCSAqLworCXByaW50a19zYWZlX2ZsdXNoKCk7CisKKwljbGVhcl9iaXRfdW5sb2NrKDAsICZiYWNrdHJhY2VfZmxhZyk7CisJcHV0X2NwdSgpOworfQorCitib29sIG5taV9jcHVfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIHRvX2NwdW1hc2soYmFja3RyYWNlX21hc2spKSkgeworCQlpZiAocmVncyAmJiBjcHVfaW5faWRsZShpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKSkgeworCQkJcHJfd2FybigiTk1JIGJhY2t0cmFjZSBmb3IgY3B1ICVkIHNraXBwZWQ6IGlkbGluZyBhdCBwYyAlI2x4XG4iLAorCQkJCWNwdSwgaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKSk7CisJCX0gZWxzZSB7CisJCQlwcl93YXJuKCJOTUkgYmFja3RyYWNlIGZvciBjcHUgJWRcbiIsIGNwdSk7CisJCQlpZiAocmVncykKKwkJCQlzaG93X3JlZ3MocmVncyk7CisJCQllbHNlCisJCQkJZHVtcF9zdGFjaygpOworCQl9CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgdG9fY3B1bWFzayhiYWNrdHJhY2VfbWFzaykpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CitOT0tQUk9CRV9TWU1CT0wobm1pX2NwdV9iYWNrdHJhY2UpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9ub2RlbWFzay5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbm9kZW1hc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWE0NTRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvbm9kZW1hc2suYwpAQCAtMCwwICsxLDMxIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L25vZGVtYXNrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKK2ludCBfX25leHRfbm9kZV9pbihpbnQgbm9kZSwgY29uc3Qgbm9kZW1hc2tfdCAqc3JjcCkKK3sKKwlpbnQgcmV0ID0gX19uZXh0X25vZGUobm9kZSwgc3JjcCk7CisKKwlpZiAocmV0ID09IE1BWF9OVU1OT0RFUykKKwkJcmV0ID0gX19maXJzdF9ub2RlKHNyY3ApOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKF9fbmV4dF9ub2RlX2luKTsKKworI2lmZGVmIENPTkZJR19OVU1BCisvKgorICogUmV0dXJuIHRoZSBiaXQgbnVtYmVyIG9mIGEgcmFuZG9tIGJpdCBzZXQgaW4gdGhlIG5vZGVtYXNrLgorICogKHJldHVybnMgTlVNQV9OT19OT0RFIGlmIG5vZGVtYXNrIGlzIGVtcHR5KQorICovCitpbnQgbm9kZV9yYW5kb20oY29uc3Qgbm9kZW1hc2tfdCAqbWFza3ApCit7CisJaW50IHcsIGJpdCA9IE5VTUFfTk9fTk9ERTsKKworCXcgPSBub2Rlc193ZWlnaHQoKm1hc2twKTsKKwlpZiAodykKKwkJYml0ID0gYml0bWFwX29yZF90b19wb3MobWFza3AtPmJpdHMsCisJCQlnZXRfcmFuZG9tX2ludCgpICUgdywgTUFYX05VTU5PREVTKTsKKwlyZXR1cm4gYml0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9ub3RpZmllci1lcnJvci1pbmplY3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25vdGlmaWVyLWVycm9yLWluamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGEwNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9ub3RpZmllci1lcnJvci1pbmplY3QuYwpAQCAtMCwwICsxLDExMiBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAibm90aWZpZXItZXJyb3ItaW5qZWN0LmgiCisKK3N0YXRpYyBpbnQgZGVidWdmc19lcnJub19zZXQodm9pZCAqZGF0YSwgdTY0IHZhbCkKK3sKKwkqKGludCAqKWRhdGEgPSBjbGFtcF90KGludCwgdmFsLCAtTUFYX0VSUk5PLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZWJ1Z2ZzX2Vycm5vX2dldCh2b2lkICpkYXRhLCB1NjQgKnZhbCkKK3sKKwkqdmFsID0gKihpbnQgKilkYXRhOworCXJldHVybiAwOworfQorCitERUZJTkVfU0lNUExFX0FUVFJJQlVURShmb3BzX2Vycm5vLCBkZWJ1Z2ZzX2Vycm5vX2dldCwgZGVidWdmc19lcnJub19zZXQsCisJCQkiJWxsZFxuIik7CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2NyZWF0ZV9lcnJubyhjb25zdCBjaGFyICpuYW1lLCB1bW9kZV90IG1vZGUsCisJCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50LCBpbnQgKnZhbHVlKQoreworCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX2Vycm5vKTsKK30KKworc3RhdGljIGludCBub3RpZmllcl9lcnJfaW5qZWN0X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKnApCit7CisJaW50IGVyciA9IDA7CisJc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3QgKmVycl9pbmplY3QgPQorCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBub3RpZmllcl9lcnJfaW5qZWN0LCBuYik7CisJc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3RfYWN0aW9uICphY3Rpb247CisKKwlmb3IgKGFjdGlvbiA9IGVycl9pbmplY3QtPmFjdGlvbnM7IGFjdGlvbi0+bmFtZTsgYWN0aW9uKyspIHsKKwkJaWYgKGFjdGlvbi0+dmFsID09IHZhbCkgeworCQkJZXJyID0gYWN0aW9uLT5lcnJvcjsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChlcnIpCisJCXByX2luZm8oIkluamVjdGluZyBlcnJvciAoJWQpIHRvICVzXG4iLCBlcnIsIGFjdGlvbi0+bmFtZSk7CisKKwlyZXR1cm4gbm90aWZpZXJfZnJvbV9lcnJubyhlcnIpOworfQorCitzdHJ1Y3QgZGVudHJ5ICpub3RpZmllcl9lcnJfaW5qZWN0X2RpcjsKK0VYUE9SVF9TWU1CT0xfR1BMKG5vdGlmaWVyX2Vycl9pbmplY3RfZGlyKTsKKworc3RydWN0IGRlbnRyeSAqbm90aWZpZXJfZXJyX2luamVjdF9pbml0KGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBkZW50cnkgKnBhcmVudCwKKwkJCXN0cnVjdCBub3RpZmllcl9lcnJfaW5qZWN0ICplcnJfaW5qZWN0LCBpbnQgcHJpb3JpdHkpCit7CisJc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3RfYWN0aW9uICphY3Rpb247CisJdW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOworCXN0cnVjdCBkZW50cnkgKmRpcjsKKwlzdHJ1Y3QgZGVudHJ5ICphY3Rpb25zX2RpcjsKKworCWVycl9pbmplY3QtPm5iLm5vdGlmaWVyX2NhbGwgPSBub3RpZmllcl9lcnJfaW5qZWN0X2NhbGxiYWNrOworCWVycl9pbmplY3QtPm5iLnByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlhY3Rpb25zX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcigiYWN0aW9ucyIsIGRpcik7CisJaWYgKCFhY3Rpb25zX2RpcikKKwkJZ290byBmYWlsOworCisJZm9yIChhY3Rpb24gPSBlcnJfaW5qZWN0LT5hY3Rpb25zOyBhY3Rpb24tPm5hbWU7IGFjdGlvbisrKSB7CisJCXN0cnVjdCBkZW50cnkgKmFjdGlvbl9kaXI7CisKKwkJYWN0aW9uX2RpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihhY3Rpb24tPm5hbWUsIGFjdGlvbnNfZGlyKTsKKwkJaWYgKCFhY3Rpb25fZGlyKQorCQkJZ290byBmYWlsOworCisJCS8qCisJCSAqIENyZWF0ZSBkZWJ1Z2ZzIHIvdyBmaWxlIGNvbnRhaW5pbmcgYWN0aW9uLT5lcnJvci4gSWYKKwkJICogbm90aWZpZXIgY2FsbCBjaGFpbiBpcyBjYWxsZWQgd2l0aCBhY3Rpb24tPnZhbCwgaXQgd2lsbAorCQkgKiBmYWlsIHdpdGggdGhlIGVycm9yIGNvZGUKKwkJICovCisJCWlmICghZGVidWdmc19jcmVhdGVfZXJybm8oImVycm9yIiwgbW9kZSwgYWN0aW9uX2RpciwKKwkJCQkJJmFjdGlvbi0+ZXJyb3IpKQorCQkJZ290byBmYWlsOworCX0KKwlyZXR1cm4gZGlyOworZmFpbDoKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKKwlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5vdGlmaWVyX2Vycl9pbmplY3RfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGVycl9pbmplY3RfaW5pdCh2b2lkKQoreworCW5vdGlmaWVyX2Vycl9pbmplY3RfZGlyID0KKwkJZGVidWdmc19jcmVhdGVfZGlyKCJub3RpZmllci1lcnJvci1pbmplY3QiLCBOVUxMKTsKKworCWlmICghbm90aWZpZXJfZXJyX2luamVjdF9kaXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlcnJfaW5qZWN0X2V4aXQodm9pZCkKK3sKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUobm90aWZpZXJfZXJyX2luamVjdF9kaXIpOworfQorCittb2R1bGVfaW5pdChlcnJfaW5qZWN0X2luaXQpOworbW9kdWxlX2V4aXQoZXJyX2luamVjdF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJOb3RpZmllciBlcnJvciBpbmplY3Rpb24gbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBa2lub2J1IE1pdGEgPGFraW5vYnUubWl0YUBnbWFpbC5jb20+Iik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9ub3RpZmllci1lcnJvci1pbmplY3QuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL25vdGlmaWVyLWVycm9yLWluamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZmZmNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9ub3RpZmllci1lcnJvci1pbmplY3QuaApAQCAtMCwwICsxLDI1IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorCitzdHJ1Y3Qgbm90aWZpZXJfZXJyX2luamVjdF9hY3Rpb24geworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBlcnJvcjsKKwljb25zdCBjaGFyICpuYW1lOworfTsKKworI2RlZmluZSBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihhY3Rpb24pCVwKKwkubmFtZSA9ICNhY3Rpb24sIC52YWwgPSAoYWN0aW9uKSwKKworc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3QgeworCXN0cnVjdCBub3RpZmllcl9ibG9jayBuYjsKKwlzdHJ1Y3Qgbm90aWZpZXJfZXJyX2luamVjdF9hY3Rpb24gYWN0aW9uc1tdOworCS8qIFRoZSBsYXN0IHNsb3QgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggemVybyBzZW50aW5lbCAqLworfTsKKworZXh0ZXJuIHN0cnVjdCBkZW50cnkgKm5vdGlmaWVyX2Vycl9pbmplY3RfZGlyOworCitleHRlcm4gc3RydWN0IGRlbnRyeSAqbm90aWZpZXJfZXJyX2luamVjdF9pbml0KGNvbnN0IGNoYXIgKm5hbWUsCisJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IG5vdGlmaWVyX2Vycl9pbmplY3QgKmVycl9pbmplY3QsCisJCWludCBwcmlvcml0eSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9vZi1yZWNvbmZpZy1ub3RpZmllci1lcnJvci1pbmplY3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL29mLXJlY29uZmlnLW5vdGlmaWVyLWVycm9yLWluamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzc5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9vZi1yZWNvbmZpZy1ub3RpZmllci1lcnJvci1pbmplY3QuYwpAQCAtMCwwICsxLDUxIEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKworI2luY2x1ZGUgIm5vdGlmaWVyLWVycm9yLWluamVjdC5oIgorCitzdGF0aWMgaW50IHByaW9yaXR5OworbW9kdWxlX3BhcmFtKHByaW9yaXR5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmlvcml0eSwgInNwZWNpZnkgT0YgcmVjb25maWcgbm90aWZpZXIgcHJpb3JpdHkiKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9lcnJfaW5qZWN0IHJlY29uZmlnX2Vycl9pbmplY3QgPSB7CisJLmFjdGlvbnMgPSB7CisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oT0ZfUkVDT05GSUdfQVRUQUNIX05PREUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oT0ZfUkVDT05GSUdfREVUQUNIX05PREUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oT0ZfUkVDT05GSUdfQUREX1BST1BFUlRZKSB9LAorCQl7IE5PVElGSUVSX0VSUl9JTkpFQ1RfQUNUSU9OKE9GX1JFQ09ORklHX1JFTU9WRV9QUk9QRVJUWSkgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihPRl9SRUNPTkZJR19VUERBVEVfUFJPUEVSVFkpIH0sCisJCXt9CisJfQorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmRpcjsKKworc3RhdGljIGludCBlcnJfaW5qZWN0X2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZGlyID0gbm90aWZpZXJfZXJyX2luamVjdF9pbml0KCJPRi1yZWNvbmZpZyIsCisJCW5vdGlmaWVyX2Vycl9pbmplY3RfZGlyLCAmcmVjb25maWdfZXJyX2luamVjdCwgcHJpb3JpdHkpOworCWlmIChJU19FUlIoZGlyKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGlyKTsKKworCWVyciA9IG9mX3JlY29uZmlnX25vdGlmaWVyX3JlZ2lzdGVyKCZyZWNvbmZpZ19lcnJfaW5qZWN0Lm5iKTsKKwlpZiAoZXJyKQorCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGVycl9pbmplY3RfZXhpdCh2b2lkKQoreworCW9mX3JlY29uZmlnX25vdGlmaWVyX3VucmVnaXN0ZXIoJnJlY29uZmlnX2Vycl9pbmplY3QubmIpOworCWRlYnVnZnNfcmVtb3ZlX3JlY3Vyc2l2ZShkaXIpOworfQorCittb2R1bGVfaW5pdChlcnJfaW5qZWN0X2luaXQpOworbW9kdWxlX2V4aXQoZXJyX2luamVjdF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPRiByZWNvbmZpZyBub3RpZmllciBlcnJvciBpbmplY3Rpb24gbW9kdWxlIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBa2lub2J1IE1pdGEgPGFraW5vYnUubWl0YUBnbWFpbC5jb20+Iik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9vaWRfcmVnaXN0cnkuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL29pZF9yZWdpc3RyeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjdkOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9vaWRfcmVnaXN0cnkuYwpAQCAtMCwwICsxLDE3OSBAQAorLyogQVNOLjEgT2JqZWN0IGlkZW50aWZpZXIgKE9JRCkgcmVnaXN0cnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgUmVkIEhhdCwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogV3JpdHRlbiBieSBEYXZpZCBIb3dlbGxzIChkaG93ZWxsc0ByZWRoYXQuY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbmNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2VuY2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L29pZF9yZWdpc3RyeS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSAib2lkX3JlZ2lzdHJ5X2RhdGEuYyIKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPSUQgUmVnaXN0cnkiKTsKK01PRFVMRV9BVVRIT1IoIlJlZCBIYXQsIEluYy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoqCisgKiBsb29rX3VwX09JRCAtIEZpbmQgYW4gT0lEIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBkYXRhCisgKiBAZGF0YTogQmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBPSUQKKyAqIEBkYXRhc2l6ZTogU2l6ZSBvZiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uCisgKi8KK2VudW0gT0lEIGxvb2tfdXBfT0lEKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhc2l6ZSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpvY3RldHMgPSBkYXRhOworCWVudW0gT0lEIG9pZDsKKwl1bnNpZ25lZCBjaGFyIHhoYXNoOworCXVuc2lnbmVkIGksIGosIGssIGhhc2g7CisJc2l6ZV90IGxlbjsKKworCS8qIEhhc2ggdGhlIE9JRCBkYXRhICovCisJaGFzaCA9IGRhdGFzaXplIC0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBkYXRhc2l6ZTsgaSsrKQorCQloYXNoICs9IG9jdGV0c1tpXSAqIDMzOworCWhhc2ggPSAoaGFzaCA+PiAyNCkgXiAoaGFzaCA+PiAxNikgXiAoaGFzaCA+PiA4KSBeIGhhc2g7CisJaGFzaCAmPSAweGZmOworCisJLyogQmluYXJ5IHNlYXJjaCB0aGUgT0lEIHJlZ2lzdHJ5LiAgT0lEcyBhcmUgc3RvcmVkIGluIGFzY2VuZGluZyBvcmRlcgorCSAqIG9mIGhhc2ggdmFsdWUgdGhlbiBhc2NlbmRpbmcgb3JkZXIgb2Ygc2l6ZSBhbmQgdGhlbiBpbiBhc2NlbmRpbmcKKwkgKiBvcmRlciBvZiByZXZlcnNlIHZhbHVlLgorCSAqLworCWkgPSAwOworCWsgPSBPSURfX05SOworCXdoaWxlIChpIDwgaykgeworCQlqID0gKGkgKyBrKSAvIDI7CisKKwkJeGhhc2ggPSBvaWRfc2VhcmNoX3RhYmxlW2pdLmhhc2g7CisJCWlmICh4aGFzaCA+IGhhc2gpIHsKKwkJCWsgPSBqOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHhoYXNoIDwgaGFzaCkgeworCQkJaSA9IGogKyAxOworCQkJY29udGludWU7CisJCX0KKworCQlvaWQgPSBvaWRfc2VhcmNoX3RhYmxlW2pdLm9pZDsKKwkJbGVuID0gb2lkX2luZGV4W29pZCArIDFdIC0gb2lkX2luZGV4W29pZF07CisJCWlmIChsZW4gPiBkYXRhc2l6ZSkgeworCQkJayA9IGo7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGVuIDwgZGF0YXNpemUpIHsKKwkJCWkgPSBqICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogVmFyaWF0aW9uIGlzIG1vc3QgbGlrZWx5IHRvIGJlIGF0IHRoZSB0YWlsIGVuZCBvZiB0aGUKKwkJICogT0lELCBzbyBkbyB0aGUgY29tcGFyaXNvbiBpbiByZXZlcnNlLgorCQkgKi8KKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCXVuc2lnbmVkIGNoYXIgYSA9IG9pZF9kYXRhW29pZF9pbmRleFtvaWRdICsgLS1sZW5dOworCQkJdW5zaWduZWQgY2hhciBiID0gb2N0ZXRzW2xlbl07CisJCQlpZiAoYSA+IGIpIHsKKwkJCQlrID0gajsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCQlpZiAoYSA8IGIpIHsKKwkJCQlpID0gaiArIDE7CisJCQkJZ290byBuZXh0OworCQkJfQorCQl9CisJCXJldHVybiBvaWQ7CisJbmV4dDoKKwkJOworCX0KKworCXJldHVybiBPSURfX05SOworfQorRVhQT1JUX1NZTUJPTF9HUEwobG9va191cF9PSUQpOworCisvKgorICogc3ByaW50X09JRCAtIFByaW50IGFuIE9iamVjdCBJZGVudGlmaWVyIGludG8gYSBidWZmZXIKKyAqIEBkYXRhOiBUaGUgZW5jb2RlZCBPSUQgdG8gcHJpbnQKKyAqIEBkYXRhc2l6ZTogVGhlIHNpemUgb2YgdGhlIGVuY29kZWQgT0lECisgKiBAYnVmZmVyOiBUaGUgYnVmZmVyIHRvIHJlbmRlciBpbnRvCisgKiBAYnVmc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFRoZSBPSUQgaXMgcmVuZGVyZWQgaW50byB0aGUgYnVmZmVyIGluICJhLmIuYy5kIiBmb3JtYXQgYW5kIHRoZSBudW1iZXIgb2YKKyAqIGJ5dGVzIGlzIHJldHVybmVkLiAgLUVCQURNU0cgaXMgcmV0dXJuZWQgaWYgdGhlIGRhdGEgY291bGQgbm90IGJlIGludGVwcmV0ZWQKKyAqIGFuZCAtRU5PQlVGUyBpZiB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwuCisgKi8KK2ludCBzcHJpbnRfb2lkKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBkYXRhc2l6ZSwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmc2l6ZSkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICp2ID0gZGF0YSwgKmVuZCA9IHYgKyBkYXRhc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG51bTsKKwl1bnNpZ25lZCBjaGFyIG47CisJc2l6ZV90IHJldDsKKwlpbnQgY291bnQ7CisKKwlpZiAodiA+PSBlbmQpCisJCWdvdG8gYmFkOworCisJbiA9ICp2Kys7CisJcmV0ID0gY291bnQgPSBzbnByaW50ZihidWZmZXIsIGJ1ZnNpemUsICIldS4ldSIsIG4gLyA0MCwgbiAlIDQwKTsKKwlidWZmZXIgKz0gY291bnQ7CisJYnVmc2l6ZSAtPSBjb3VudDsKKwlpZiAoYnVmc2l6ZSA9PSAwKQorCQlyZXR1cm4gLUVOT0JVRlM7CisKKwl3aGlsZSAodiA8IGVuZCkgeworCQludW0gPSAwOworCQluID0gKnYrKzsKKwkJaWYgKCEobiAmIDB4ODApKSB7CisJCQludW0gPSBuOworCQl9IGVsc2UgeworCQkJbnVtID0gbiAmIDB4N2Y7CisJCQlkbyB7CisJCQkJaWYgKHYgPj0gZW5kKQorCQkJCQlnb3RvIGJhZDsKKwkJCQluID0gKnYrKzsKKwkJCQludW0gPDw9IDc7CisJCQkJbnVtIHw9IG4gJiAweDdmOworCQkJfSB3aGlsZSAobiAmIDB4ODApOworCQl9CisJCXJldCArPSBjb3VudCA9IHNucHJpbnRmKGJ1ZmZlciwgYnVmc2l6ZSwgIi4lbHUiLCBudW0pOworCQlidWZmZXIgKz0gY291bnQ7CisJCWlmIChidWZzaXplIDw9IGNvdW50KQorCQkJcmV0dXJuIC1FTk9CVUZTOworCQlidWZzaXplIC09IGNvdW50OworCX0KKworCXJldHVybiByZXQ7CisKK2JhZDoKKwlzbnByaW50ZihidWZmZXIsIGJ1ZnNpemUsICIoYmFkKSIpOworCXJldHVybiAtRUJBRE1TRzsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNwcmludF9vaWQpOworCisvKioKKyAqIHNwcmludF9PSUQgLSBQcmludCBhbiBPYmplY3QgSWRlbnRpZmllciBpbnRvIGEgYnVmZmVyCisgKiBAb2lkOiBUaGUgT0lEIHRvIHByaW50CisgKiBAYnVmZmVyOiBUaGUgYnVmZmVyIHRvIHJlbmRlciBpbnRvCisgKiBAYnVmc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlcgorICoKKyAqIFRoZSBPSUQgaXMgcmVuZGVyZWQgaW50byB0aGUgYnVmZmVyIGluICJhLmIuYy5kIiBmb3JtYXQgYW5kIHRoZSBudW1iZXIgb2YKKyAqIGJ5dGVzIGlzIHJldHVybmVkLgorICovCitpbnQgc3ByaW50X09JRChlbnVtIE9JRCBvaWQsIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUpCit7CisJaW50IHJldDsKKworCUJVR19PTihvaWQgPj0gT0lEX19OUik7CisKKwlyZXQgPSBzcHJpbnRfb2lkKG9pZF9kYXRhICsgb2lkX2luZGV4W29pZF0sCisJCQkgb2lkX2luZGV4W29pZCArIDFdIC0gb2lkX2luZGV4W29pZF0sCisJCQkgYnVmZmVyLCBidWZzaXplKTsKKwlCVUdfT04ocmV0ID09IC1FQkFETVNHKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3ByaW50X09JRCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9vbmNlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9vbmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiNzQyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL29uY2UuYwpAQCAtMCwwICsxLDYzIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L29uY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworc3RydWN0IG9uY2Vfd29yayB7CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CisJc3RydWN0IHN0YXRpY19rZXkgKmtleTsKK307CisKK3N0YXRpYyB2b2lkIG9uY2VfZGVmZXJyZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3KQoreworCXN0cnVjdCBvbmNlX3dvcmsgKndvcms7CisKKwl3b3JrID0gY29udGFpbmVyX29mKHcsIHN0cnVjdCBvbmNlX3dvcmssIHdvcmspOworCUJVR19PTighc3RhdGljX2tleV9lbmFibGVkKHdvcmstPmtleSkpOworCXN0YXRpY19rZXlfc2xvd19kZWMod29yay0+a2V5KTsKKwlrZnJlZSh3b3JrKTsKK30KKworc3RhdGljIHZvaWQgb25jZV9kaXNhYmxlX2p1bXAoc3RydWN0IHN0YXRpY19rZXkgKmtleSkKK3sKKwlzdHJ1Y3Qgb25jZV93b3JrICp3OworCisJdyA9IGttYWxsb2Moc2l6ZW9mKCp3KSwgR0ZQX0FUT01JQyk7CisJaWYgKCF3KQorCQlyZXR1cm47CisKKwlJTklUX1dPUksoJnctPndvcmssIG9uY2VfZGVmZXJyZWQpOworCXctPmtleSA9IGtleTsKKwlzY2hlZHVsZV93b3JrKCZ3LT53b3JrKTsKK30KKworc3RhdGljIERFRklORV9TUElOTE9DSyhvbmNlX2xvY2spOworCitib29sIF9fZG9fb25jZV9zdGFydChib29sICpkb25lLCB1bnNpZ25lZCBsb25nICpmbGFncykKKwlfX2FjcXVpcmVzKG9uY2VfbG9jaykKK3sKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb25jZV9sb2NrLCAqZmxhZ3MpOworCWlmICgqZG9uZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvbmNlX2xvY2ssICpmbGFncyk7CisJCS8qIEtlZXAgc3BhcnNlIGhhcHB5IGJ5IHJlc3RvcmluZyBhbiBldmVuIGxvY2sgY291bnQgb24KKwkJICogdGhpcyBsb2NrLiBJbiBjYXNlIHdlIHJldHVybiBoZXJlLCB3ZSBkb24ndCBjYWxsIGludG8KKwkJICogX19kb19vbmNlX2RvbmUgYnV0IHJldHVybiBlYXJseSBpbiB0aGUgRE9fT05DRSgpIG1hY3JvLgorCQkgKi8KKwkJX19hY3F1aXJlKG9uY2VfbG9jayk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0woX19kb19vbmNlX3N0YXJ0KTsKKwordm9pZCBfX2RvX29uY2VfZG9uZShib29sICpkb25lLCBzdHJ1Y3Qgc3RhdGljX2tleSAqb25jZV9rZXksCisJCSAgICB1bnNpZ25lZCBsb25nICpmbGFncykKKwlfX3JlbGVhc2VzKG9uY2VfbG9jaykKK3sKKwkqZG9uZSA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb25jZV9sb2NrLCAqZmxhZ3MpOworCW9uY2VfZGlzYWJsZV9qdW1wKG9uY2Vfa2V5KTsKK30KK0VYUE9SVF9TWU1CT0woX19kb19vbmNlX2RvbmUpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGFybWFuLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wYXJtYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmU0MmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGFybWFuLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qCisgKiBsaWIvcGFybWFuLmMgLSBNYW5hZ2VyIGZvciBsaW5lYXIgcHJpb3JpdHkgYXJyYXkgYXJlYXMKKyAqIENvcHlyaWdodCAoYykgMjAxNyBNZWxsYW5veCBUZWNobm9sb2dpZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgSmlyaSBQaXJrbyA8amlyaUBtZWxsYW5veC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lcyBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIEFsdGVybmF0aXZlbHksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L3Bhcm1hbi5oPgorCitzdHJ1Y3QgcGFybWFuX2FsZ28geworCWludCAoKml0ZW1fYWRkKShzdHJ1Y3QgcGFybWFuICpwYXJtYW4sIHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbywKKwkJCXN0cnVjdCBwYXJtYW5faXRlbSAqaXRlbSk7CisJdm9pZCAoKml0ZW1fcmVtb3ZlKShzdHJ1Y3QgcGFybWFuICpwYXJtYW4sIHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbywKKwkJCSAgICBzdHJ1Y3QgcGFybWFuX2l0ZW0gKml0ZW0pOworfTsKKworc3RydWN0IHBhcm1hbiB7CisJY29uc3Qgc3RydWN0IHBhcm1hbl9vcHMgKm9wczsKKwl2b2lkICpwcml2OworCWNvbnN0IHN0cnVjdCBwYXJtYW5fYWxnbyAqYWxnbzsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCXVuc2lnbmVkIGxvbmcgbGltaXRfY291bnQ7CisJc3RydWN0IGxpc3RfaGVhZCBwcmlvX2xpc3Q7Cit9OworCitzdGF0aWMgaW50IHBhcm1hbl9lbmxhcmdlKHN0cnVjdCBwYXJtYW4gKnBhcm1hbikKK3sKKwl1bnNpZ25lZCBsb25nIG5ld19jb3VudCA9IHBhcm1hbi0+bGltaXRfY291bnQgKworCQkJCSAgcGFybWFuLT5vcHMtPnJlc2l6ZV9zdGVwOworCWludCBlcnI7CisKKwllcnIgPSBwYXJtYW4tPm9wcy0+cmVzaXplKHBhcm1hbi0+cHJpdiwgbmV3X2NvdW50KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXBhcm1hbi0+bGltaXRfY291bnQgPSBuZXdfY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFybWFuX3NocmluayhzdHJ1Y3QgcGFybWFuICpwYXJtYW4pCit7CisJdW5zaWduZWQgbG9uZyBuZXdfY291bnQgPSBwYXJtYW4tPmxpbWl0X2NvdW50IC0KKwkJCQkgIHBhcm1hbi0+b3BzLT5yZXNpemVfc3RlcDsKKwlpbnQgZXJyOworCisJaWYgKG5ld19jb3VudCA8IHBhcm1hbi0+b3BzLT5iYXNlX2NvdW50KQorCQlyZXR1cm4gMDsKKwllcnIgPSBwYXJtYW4tPm9wcy0+cmVzaXplKHBhcm1hbi0+cHJpdiwgbmV3X2NvdW50KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCXBhcm1hbi0+bGltaXRfY291bnQgPSBuZXdfY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIHBhcm1hbl9wcmlvX3VzZWQoc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvKQorCit7CisJcmV0dXJuICFsaXN0X2VtcHR5KCZwcmlvLT5pdGVtX2xpc3QpOworfQorCitzdGF0aWMgc3RydWN0IHBhcm1hbl9pdGVtICpwYXJtYW5fcHJpb19maXJzdF9pdGVtKHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbykKK3sKKwlyZXR1cm4gbGlzdF9maXJzdF9lbnRyeSgmcHJpby0+aXRlbV9saXN0LAorCQkJCXR5cGVvZihzdHJ1Y3QgcGFybWFuX2l0ZW0pLCBsaXN0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFybWFuX3ByaW9fZmlyc3RfaW5kZXgoc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvKQoreworCXJldHVybiBwYXJtYW5fcHJpb19maXJzdF9pdGVtKHByaW8pLT5pbmRleDsKK30KKworc3RhdGljIHN0cnVjdCBwYXJtYW5faXRlbSAqcGFybWFuX3ByaW9fbGFzdF9pdGVtKHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbykKK3sKKwlyZXR1cm4gbGlzdF9sYXN0X2VudHJ5KCZwcmlvLT5pdGVtX2xpc3QsCisJCQkgICAgICAgdHlwZW9mKHN0cnVjdCBwYXJtYW5faXRlbSksIGxpc3QpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJtYW5fcHJpb19sYXN0X2luZGV4KHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbykKK3sKKwlyZXR1cm4gcGFybWFuX3ByaW9fbGFzdF9pdGVtKHByaW8pLT5pbmRleDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFybWFuX2xzb3J0X25ld19pbmRleF9maW5kKHN0cnVjdCBwYXJtYW4gKnBhcm1hbiwKKwkJCQkJCSBzdHJ1Y3QgcGFybWFuX3ByaW8gKnByaW8pCit7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tX3JldmVyc2UocHJpbywgJnBhcm1hbi0+cHJpb19saXN0LCBsaXN0KSB7CisJCWlmICghcGFybWFuX3ByaW9fdXNlZChwcmlvKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gcGFybWFuX3ByaW9fbGFzdF9pbmRleChwcmlvKSArIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3Bhcm1hbl9wcmlvX21vdmUoc3RydWN0IHBhcm1hbiAqcGFybWFuLCBzdHJ1Y3QgcGFybWFuX3ByaW8gKnByaW8sCisJCQkgICAgICAgc3RydWN0IHBhcm1hbl9pdGVtICppdGVtLCB1bnNpZ25lZCBsb25nIHRvX2luZGV4LAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpCit7CisJcGFybWFuLT5vcHMtPm1vdmUocGFybWFuLT5wcml2LCBpdGVtLT5pbmRleCwgdG9faW5kZXgsIGNvdW50KTsKK30KKworc3RhdGljIHZvaWQgcGFybWFuX3ByaW9fc2hpZnRfZG93bihzdHJ1Y3QgcGFybWFuICpwYXJtYW4sCisJCQkJICAgc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvKQoreworCXN0cnVjdCBwYXJtYW5faXRlbSAqaXRlbTsKKwl1bnNpZ25lZCBsb25nIHRvX2luZGV4OworCisJaWYgKCFwYXJtYW5fcHJpb191c2VkKHByaW8pKQorCQlyZXR1cm47CisJaXRlbSA9IHBhcm1hbl9wcmlvX2ZpcnN0X2l0ZW0ocHJpbyk7CisJdG9faW5kZXggPSBwYXJtYW5fcHJpb19sYXN0X2luZGV4KHByaW8pICsgMTsKKwlfX3Bhcm1hbl9wcmlvX21vdmUocGFybWFuLCBwcmlvLCBpdGVtLCB0b19pbmRleCwgMSk7CisJbGlzdF9tb3ZlX3RhaWwoJml0ZW0tPmxpc3QsICZwcmlvLT5pdGVtX2xpc3QpOworCWl0ZW0tPmluZGV4ID0gdG9faW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHBhcm1hbl9wcmlvX3NoaWZ0X3VwKHN0cnVjdCBwYXJtYW4gKnBhcm1hbiwKKwkJCQkgc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvKQoreworCXN0cnVjdCBwYXJtYW5faXRlbSAqaXRlbTsKKwl1bnNpZ25lZCBsb25nIHRvX2luZGV4OworCisJaWYgKCFwYXJtYW5fcHJpb191c2VkKHByaW8pKQorCQlyZXR1cm47CisJaXRlbSA9IHBhcm1hbl9wcmlvX2xhc3RfaXRlbShwcmlvKTsKKwl0b19pbmRleCA9IHBhcm1hbl9wcmlvX2ZpcnN0X2luZGV4KHByaW8pIC0gMTsKKwlfX3Bhcm1hbl9wcmlvX21vdmUocGFybWFuLCBwcmlvLCBpdGVtLCB0b19pbmRleCwgMSk7CisJbGlzdF9tb3ZlKCZpdGVtLT5saXN0LCAmcHJpby0+aXRlbV9saXN0KTsKKwlpdGVtLT5pbmRleCA9IHRvX2luZGV4OworfQorCitzdGF0aWMgdm9pZCBwYXJtYW5fcHJpb19pdGVtX3JlbW92ZShzdHJ1Y3QgcGFybWFuICpwYXJtYW4sCisJCQkJICAgIHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbywKKwkJCQkgICAgc3RydWN0IHBhcm1hbl9pdGVtICppdGVtKQoreworCXN0cnVjdCBwYXJtYW5faXRlbSAqbGFzdF9pdGVtOworCXVuc2lnbmVkIGxvbmcgdG9faW5kZXg7CisKKwlsYXN0X2l0ZW0gPSBwYXJtYW5fcHJpb19sYXN0X2l0ZW0ocHJpbyk7CisJaWYgKGxhc3RfaXRlbSA9PSBpdGVtKSB7CisJCWxpc3RfZGVsKCZpdGVtLT5saXN0KTsKKwkJcmV0dXJuOworCX0KKwl0b19pbmRleCA9IGl0ZW0tPmluZGV4OworCV9fcGFybWFuX3ByaW9fbW92ZShwYXJtYW4sIHByaW8sIGxhc3RfaXRlbSwgdG9faW5kZXgsIDEpOworCWxpc3RfZGVsKCZsYXN0X2l0ZW0tPmxpc3QpOworCWxpc3RfcmVwbGFjZSgmaXRlbS0+bGlzdCwgJmxhc3RfaXRlbS0+bGlzdCk7CisJbGFzdF9pdGVtLT5pbmRleCA9IHRvX2luZGV4OworfQorCitzdGF0aWMgaW50IHBhcm1hbl9sc29ydF9pdGVtX2FkZChzdHJ1Y3QgcGFybWFuICpwYXJtYW4sCisJCQkJIHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbywKKwkJCQkgc3RydWN0IHBhcm1hbl9pdGVtICppdGVtKQoreworCXN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbzI7CisJdW5zaWduZWQgbG9uZyBuZXdfaW5kZXg7CisJaW50IGVycjsKKworCWlmIChwYXJtYW4tPmNvdW50ICsgMSA+IHBhcm1hbi0+bGltaXRfY291bnQpIHsKKwkJZXJyID0gcGFybWFuX2VubGFyZ2UocGFybWFuKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJbmV3X2luZGV4ID0gcGFybWFuX2xzb3J0X25ld19pbmRleF9maW5kKHBhcm1hbiwgcHJpbyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKHByaW8yLCAmcGFybWFuLT5wcmlvX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHByaW8yID09IHByaW8pCisJCQlicmVhazsKKwkJcGFybWFuX3ByaW9fc2hpZnRfZG93bihwYXJtYW4sIHByaW8yKTsKKwl9CisJaXRlbS0+aW5kZXggPSBuZXdfaW5kZXg7CisJbGlzdF9hZGRfdGFpbCgmaXRlbS0+bGlzdCwgJnByaW8tPml0ZW1fbGlzdCk7CisJcGFybWFuLT5jb3VudCsrOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwYXJtYW5fbHNvcnRfaXRlbV9yZW1vdmUoc3RydWN0IHBhcm1hbiAqcGFybWFuLAorCQkJCSAgICAgc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvLAorCQkJCSAgICAgc3RydWN0IHBhcm1hbl9pdGVtICppdGVtKQoreworCXBhcm1hbl9wcmlvX2l0ZW1fcmVtb3ZlKHBhcm1hbiwgcHJpbywgaXRlbSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZShwcmlvLCAmcGFybWFuLT5wcmlvX2xpc3QsIGxpc3QpCisJCXBhcm1hbl9wcmlvX3NoaWZ0X3VwKHBhcm1hbiwgcHJpbyk7CisJcGFybWFuLT5jb3VudC0tOworCWlmIChwYXJtYW4tPmxpbWl0X2NvdW50IC0gcGFybWFuLT5jb3VudCA+PSBwYXJtYW4tPm9wcy0+cmVzaXplX3N0ZXApCisJCXBhcm1hbl9zaHJpbmsocGFybWFuKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJtYW5fYWxnbyBwYXJtYW5fbHNvcnQgPSB7CisJLml0ZW1fYWRkCT0gcGFybWFuX2xzb3J0X2l0ZW1fYWRkLAorCS5pdGVtX3JlbW92ZQk9IHBhcm1hbl9sc29ydF9pdGVtX3JlbW92ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFybWFuX2FsZ28gKnBhcm1hbl9hbGdvc1tdID0geworCSZwYXJtYW5fbHNvcnQsCit9OworCisvKioKKyAqIHBhcm1hbl9jcmVhdGUgLSBjcmVhdGVzIGEgbmV3IHBhcm1hbiBpbnN0YW5jZQorICogQG9wczoJY2FsbGVyLXNwZWNpZmljIGNhbGxiYWNrcworICogQHByaXY6CXBvaW50ZXIgdG8gYSBwcml2YXRlIGRhdGEgcGFzc2VkIHRvIHRoZSBvcHMKKyAqCisgKiBOb3RlOiBhbGwgbG9ja2luZyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogRWFjaCBwYXJtYW4gaW5zdGFuY2UgbWFuYWdlcyBhbiBhcnJheSBhcmVhIHdpdGggY2h1bmtzIG9mIGVudHJpZXMKKyAqIHdpdGggdGhlIHNhbWUgcHJpb3JpdHkuIENvbnNpZGVyIGZvbGxvd2luZyBleGFtcGxlOgorICoKKyAqIGl0ZW0gMSB3aXRoIHByaW8gMTAKKyAqIGl0ZW0gMiB3aXRoIHByaW8gMTAKKyAqIGl0ZW0gMyB3aXRoIHByaW8gMTAKKyAqIGl0ZW0gNCB3aXRoIHByaW8gMjAKKyAqIGl0ZW0gNSB3aXRoIHByaW8gMjAKKyAqIGl0ZW0gNiB3aXRoIHByaW8gMzAKKyAqIGl0ZW0gNyB3aXRoIHByaW8gMzAKKyAqIGl0ZW0gOCB3aXRoIHByaW8gMzAKKyAqCisgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZXJlIGFyZSAzIHByaW9yaXR5IGNodW5rcy4gVGhlIG9yZGVyIG9mIHRoZSBwcmlvcml0aWVzCisgKiBtYXR0ZXJzLCBob3dldmVyIHRoZSBvcmRlciBvZiBpdGVtcyB3aXRoaW4gYSBzaW5nbGUgcHJpb3JpdHkgY2h1bmsgZG9lcyBub3QKKyAqIG1hdHRlci4gU28gdGhlIHNhbWUgYXJyYXkgY291bGQgYmUgb3JkZXJlZCBhcyBmb2xsb3dzOgorICoKKyAqIGl0ZW0gMiB3aXRoIHByaW8gMTAKKyAqIGl0ZW0gMyB3aXRoIHByaW8gMTAKKyAqIGl0ZW0gMSB3aXRoIHByaW8gMTAKKyAqIGl0ZW0gNSB3aXRoIHByaW8gMjAKKyAqIGl0ZW0gNCB3aXRoIHByaW8gMjAKKyAqIGl0ZW0gNyB3aXRoIHByaW8gMzAKKyAqIGl0ZW0gOCB3aXRoIHByaW8gMzAKKyAqIGl0ZW0gNiB3aXRoIHByaW8gMzAKKyAqCisgKiBUaGUgZ29hbCBvZiBwYXJtYW4gaXMgdG8gbWFpbnRhaW4gdGhlIHByaW9yaXR5IG9yZGVyaW5nLiBUaGUgY2FsbGVyCisgKiBwcm92aWRlcyBAb3BzIHdpdGggY2FsbGJhY2tzIHBhcm1hbiB1c2VzIHRvIG1vdmUgdGhlIGl0ZW1zCisgKiBhbmQgcmVzaXplIHRoZSBhcnJheSBhcmVhLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIG5ld2x5IGNyZWF0ZWQgcGFybWFuIGluc3RhbmNlIGluIGNhc2Ugb2Ygc3VjY2VzcywKKyAqIG90aGVyd2lzZSBpdCByZXR1cm5zIE5VTEwuCisgKi8KK3N0cnVjdCBwYXJtYW4gKnBhcm1hbl9jcmVhdGUoY29uc3Qgc3RydWN0IHBhcm1hbl9vcHMgKm9wcywgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgcGFybWFuICpwYXJtYW47CisKKwlwYXJtYW4gPSBremFsbG9jKHNpemVvZigqcGFybWFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXJtYW4pCisJCXJldHVybiBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZwYXJtYW4tPnByaW9fbGlzdCk7CisJcGFybWFuLT5vcHMgPSBvcHM7CisJcGFybWFuLT5wcml2ID0gcHJpdjsKKwlwYXJtYW4tPmxpbWl0X2NvdW50ID0gb3BzLT5iYXNlX2NvdW50OworCXBhcm1hbi0+YWxnbyA9IHBhcm1hbl9hbGdvc1tvcHMtPmFsZ29dOworCXJldHVybiBwYXJtYW47Cit9CitFWFBPUlRfU1lNQk9MKHBhcm1hbl9jcmVhdGUpOworCisvKioKKyAqIHBhcm1hbl9kZXN0cm95IC0gZGVzdHJveXMgZXhpc3RpbmcgcGFybWFuIGluc3RhbmNlCisgKiBAcGFybWFuOglwYXJtYW4gaW5zdGFuY2UKKyAqCisgKiBOb3RlOiBhbGwgbG9ja2luZyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3ZvaWQgcGFybWFuX2Rlc3Ryb3koc3RydWN0IHBhcm1hbiAqcGFybWFuKQoreworCVdBUk5fT04oIWxpc3RfZW1wdHkoJnBhcm1hbi0+cHJpb19saXN0KSk7CisJa2ZyZWUocGFybWFuKTsKK30KK0VYUE9SVF9TWU1CT0wocGFybWFuX2Rlc3Ryb3kpOworCisvKioKKyAqIHBhcm1hbl9wcmlvX2luaXQgLSBpbml0aWFsaXplcyBhIHBhcm1hbiBwcmlvcml0eSBjaHVuaworICogQHBhcm1hbjoJcGFybWFuIGluc3RhbmNlCisgKiBAcHJpbzoJcGFybWFuIHByaW8gc3RydWN0dXJlIHRvIGJlIGluaXRpYWxpemVkCisgKiBAcHJvcml0eToJZGVzaXJlZCBwcmlvcml0eSBvZiB0aGUgY2h1bmsKKyAqCisgKiBOb3RlOiBhbGwgbG9ja2luZyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogQmVmb3JlIGNhbGxlciBjb3VsZCBhZGQgYW4gaXRlbSB3aXRoIGNlcnRhaW4gcHJpb3JpdHksIGhlIGhhcyB0bworICogaW5pdGlhbGl6ZSBhIHByaW9yaXR5IGNodW5rIGZvciBpdCB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICovCit2b2lkIHBhcm1hbl9wcmlvX2luaXQoc3RydWN0IHBhcm1hbiAqcGFybWFuLCBzdHJ1Y3QgcGFybWFuX3ByaW8gKnByaW8sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgcHJpb3JpdHkpCit7CisJc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvMjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpwb3M7CisKKwlJTklUX0xJU1RfSEVBRCgmcHJpby0+aXRlbV9saXN0KTsKKwlwcmlvLT5wcmlvcml0eSA9IHByaW9yaXR5OworCisJLyogUG9zaXRpb24gaW5zaWRlIHRoZSBsaXN0IGFjY29yZGluZyB0byBwcmlvcml0eSAqLworCWxpc3RfZm9yX2VhY2gocG9zLCAmcGFybWFuLT5wcmlvX2xpc3QpIHsKKwkJcHJpbzIgPSBsaXN0X2VudHJ5KHBvcywgdHlwZW9mKCpwcmlvMiksIGxpc3QpOworCQlpZiAocHJpbzItPnByaW9yaXR5ID4gcHJpby0+cHJpb3JpdHkpCisJCQlicmVhazsKKwl9CisJbGlzdF9hZGRfdGFpbCgmcHJpby0+bGlzdCwgcG9zKTsKK30KK0VYUE9SVF9TWU1CT0wocGFybWFuX3ByaW9faW5pdCk7CisKKy8qKgorICogcGFybWFuX3ByaW9fZmluaSAtIGZpbmFsaXplcyB1c2Ugb2YgcGFybWFuIHByaW9yaXR5IGNodW5rCisgKiBAcHJpbzoJcGFybWFuIHByaW8gc3RydWN0dXJlCisgKgorICogTm90ZTogYWxsIGxvY2tpbmcgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgorICovCit2b2lkIHBhcm1hbl9wcmlvX2Zpbmkoc3RydWN0IHBhcm1hbl9wcmlvICpwcmlvKQoreworCVdBUk5fT04ocGFybWFuX3ByaW9fdXNlZChwcmlvKSk7CisJbGlzdF9kZWwoJnByaW8tPmxpc3QpOworfQorRVhQT1JUX1NZTUJPTChwYXJtYW5fcHJpb19maW5pKTsKKworLyoqCisgKiBwYXJtYW5faXRlbV9hZGQgLSBhZGRzIGEgcGFybWFuIGl0ZW0gdW5kZXIgZGVmaW5lZCBwcmlvcml0eQorICogQHBhcm1hbjoJcGFybWFuIGluc3RhbmNlCisgKiBAcHJpbzoJcGFybWFuIHByaW8gaW5zdGFuY2UgdG8gYWRkIHRoZSBpdGVtIHRvCisgKiBAaXRlbToJcGFybWFuIGl0ZW0gaW5zdGFuY2UKKyAqCisgKiBOb3RlOiBhbGwgbG9ja2luZyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIuCisgKgorICogQWRkcyBpdGVtIHRvIGEgYXJyYXkgbWFuYWdlZCBieSBwYXJtYW4gaW5zdGFuY2UgdW5kZXIgdGhlIHNwZWNpZmllZCBwcmlvcml0eS4KKyAqCisgKiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBzdWNjZXNzLCBuZWdhdGl2ZSBudW1iZXIgdG8gaW5kaWNhdGUgYW4gZXJyb3IuCisgKi8KK2ludCBwYXJtYW5faXRlbV9hZGQoc3RydWN0IHBhcm1hbiAqcGFybWFuLCBzdHJ1Y3QgcGFybWFuX3ByaW8gKnByaW8sCisJCSAgICBzdHJ1Y3QgcGFybWFuX2l0ZW0gKml0ZW0pCit7CisJcmV0dXJuIHBhcm1hbi0+YWxnby0+aXRlbV9hZGQocGFybWFuLCBwcmlvLCBpdGVtKTsKK30KK0VYUE9SVF9TWU1CT0wocGFybWFuX2l0ZW1fYWRkKTsKKworLyoqCisgKiBwYXJtYW5faXRlbV9kZWwgLSBkZWxldGVzIHBhcm1hbiBpdGVtCisgKiBAcGFybWFuOglwYXJtYW4gaW5zdGFuY2UKKyAqIEBwcmlvOglwYXJtYW4gcHJpbyBpbnN0YW5jZSB0byBkZWxldGUgdGhlIGl0ZW0gZnJvbQorICogQGl0ZW06CXBhcm1hbiBpdGVtIGluc3RhbmNlCisgKgorICogTm90ZTogYWxsIGxvY2tpbmcgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY2FsbGVyLgorICovCit2b2lkIHBhcm1hbl9pdGVtX3JlbW92ZShzdHJ1Y3QgcGFybWFuICpwYXJtYW4sIHN0cnVjdCBwYXJtYW5fcHJpbyAqcHJpbywKKwkJCXN0cnVjdCBwYXJtYW5faXRlbSAqaXRlbSkKK3sKKwlwYXJtYW4tPmFsZ28tPml0ZW1fcmVtb3ZlKHBhcm1hbiwgcHJpbywgaXRlbSk7Cit9CitFWFBPUlRfU1lNQk9MKHBhcm1hbl9pdGVtX3JlbW92ZSk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BVVRIT1IoIkppcmkgUGlya28gPGppcmlAbWVsbGFub3guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJQcmlvcml0eS1iYXNlZCBhcnJheSBtYW5hZ2VyIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wYXJzZXIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNzg5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wYXJzZXIuYwpAQCAtMCwwICsxLDMzNiBAQAorLyoKKyAqIGxpYi9wYXJzZXIuYyAtIHNpbXBsZSBwYXJzZXIgZm9yIG1vdW50LCBldGMuIG9wdGlvbnMuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiBWZXJzaW9uIDIuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisvKioKKyAqIG1hdGNoX29uZTogLSBEZXRlcm1pbmVzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSBzaW1wbGUgcGF0dGVybgorICogQHM6IHRoZSBzdHJpbmcgdG8gZXhhbWluZSBmb3IgcHJlc2VuY2Ugb2YgdGhlIHBhdHRlcm4KKyAqIEBwOiB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHBhdHRlcm4KKyAqIEBhcmdzOiBhcnJheSBvZiAlTUFYX09QVF9BUkdTICZzdWJzdHJpbmdfdCBlbGVtZW50cy4gVXNlZCB0byByZXR1cm4gbWF0Y2gKKyAqIGxvY2F0aW9ucy4KKyAqCisgKiBEZXNjcmlwdGlvbjogRGV0ZXJtaW5lcyBpZiB0aGUgcGF0dGVybiBAcCBpcyBwcmVzZW50IGluIHN0cmluZyBAcy4gQ2FuIG9ubHkKKyAqIG1hdGNoIGV4dHJlbWVseSBzaW1wbGUgdG9rZW49YXJnIHN0eWxlIHBhdHRlcm5zLiBJZiB0aGUgcGF0dGVybiBpcyBmb3VuZCwKKyAqIHRoZSBsb2NhdGlvbihzKSBvZiB0aGUgYXJndW1lbnRzIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIEBhcmdzIGFycmF5LgorICovCitzdGF0aWMgaW50IG1hdGNoX29uZShjaGFyICpzLCBjb25zdCBjaGFyICpwLCBzdWJzdHJpbmdfdCBhcmdzW10pCit7CisJY2hhciAqbWV0YTsKKwlpbnQgYXJnYyA9IDA7CisKKwlpZiAoIXApCisJCXJldHVybiAxOworCisJd2hpbGUoMSkgeworCQlpbnQgbGVuID0gLTE7CisJCW1ldGEgPSBzdHJjaHIocCwgJyUnKTsKKwkJaWYgKCFtZXRhKQorCQkJcmV0dXJuIHN0cmNtcChwLCBzKSA9PSAwOworCisJCWlmIChzdHJuY21wKHAsIHMsIG1ldGEtcCkpCisJCQlyZXR1cm4gMDsKKworCQlzICs9IG1ldGEgLSBwOworCQlwID0gbWV0YSArIDE7CisKKwkJaWYgKGlzZGlnaXQoKnApKQorCQkJbGVuID0gc2ltcGxlX3N0cnRvdWwocCwgKGNoYXIgKiopICZwLCAxMCk7CisJCWVsc2UgaWYgKCpwID09ICclJykgeworCQkJaWYgKCpzKysgIT0gJyUnKQorCQkJCXJldHVybiAwOworCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYXJnYyA+PSBNQVhfT1BUX0FSR1MpCisJCQlyZXR1cm4gMDsKKworCQlhcmdzW2FyZ2NdLmZyb20gPSBzOworCQlzd2l0Y2ggKCpwKyspIHsKKwkJY2FzZSAncyc6IHsKKwkJCXNpemVfdCBzdHJfbGVuID0gc3RybGVuKHMpOworCisJCQlpZiAoc3RyX2xlbiA9PSAwKQorCQkJCXJldHVybiAwOworCQkJaWYgKGxlbiA9PSAtMSB8fCBsZW4gPiBzdHJfbGVuKQorCQkJCWxlbiA9IHN0cl9sZW47CisJCQlhcmdzW2FyZ2NdLnRvID0gcyArIGxlbjsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ2QnOgorCQkJc2ltcGxlX3N0cnRvbChzLCAmYXJnc1thcmdjXS50bywgMCk7CisJCQlnb3RvIG51bTsKKwkJY2FzZSAndSc6CisJCQlzaW1wbGVfc3RydG91bChzLCAmYXJnc1thcmdjXS50bywgMCk7CisJCQlnb3RvIG51bTsKKwkJY2FzZSAnbyc6CisJCQlzaW1wbGVfc3RydG91bChzLCAmYXJnc1thcmdjXS50bywgOCk7CisJCQlnb3RvIG51bTsKKwkJY2FzZSAneCc6CisJCQlzaW1wbGVfc3RydG91bChzLCAmYXJnc1thcmdjXS50bywgMTYpOworCQludW06CisJCQlpZiAoYXJnc1thcmdjXS50byA9PSBhcmdzW2FyZ2NdLmZyb20pCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCQl9CisJCXMgPSBhcmdzW2FyZ2NdLnRvOworCQlhcmdjKys7CisJfQorfQorCisvKioKKyAqIG1hdGNoX3Rva2VuOiAtIEZpbmQgYSB0b2tlbiAoYW5kIG9wdGlvbmFsIGFyZ3MpIGluIGEgc3RyaW5nCisgKiBAczogdGhlIHN0cmluZyB0byBleGFtaW5lIGZvciB0b2tlbi9hcmd1bWVudCBwYWlycworICogQHRhYmxlOiBtYXRjaF90YWJsZV90IGRlc2NyaWJpbmcgdGhlIHNldCBvZiBhbGxvd2VkIG9wdGlvbiB0b2tlbnMgYW5kIHRoZQorICogYXJndW1lbnRzIHRoYXQgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiBNdXN0IGJlIHRlcm1pbmF0ZWQgd2l0aCBhCisgKiAmc3RydWN0IG1hdGNoX3Rva2VuIHdob3NlIHBhdHRlcm4gaXMgc2V0IHRvIHRoZSBOVUxMIHBvaW50ZXIuCisgKiBAYXJnczogYXJyYXkgb2YgJU1BWF9PUFRfQVJHUyAmc3Vic3RyaW5nX3QgZWxlbWVudHMuIFVzZWQgdG8gcmV0dXJuIG1hdGNoCisgKiBsb2NhdGlvbnMuCisgKgorICogRGVzY3JpcHRpb246IERldGVjdHMgd2hpY2ggaWYgYW55IG9mIGEgc2V0IG9mIHRva2VuIHN0cmluZ3MgaGFzIGJlZW4gcGFzc2VkCisgKiB0byBpdC4gVG9rZW5zIGNhbiBpbmNsdWRlIHVwIHRvIE1BWF9PUFRfQVJHUyBpbnN0YW5jZXMgb2YgYmFzaWMgYy1zdHlsZQorICogZm9ybWF0IGlkZW50aWZpZXJzIHdoaWNoIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gbWF0Y2hpbmcgdGhlCisgKiB0b2tlbnMsIGFuZCB3aG9zZSBsb2NhdGlvbnMgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgQGFyZ3MgYXJyYXkuCisgKi8KK2ludCBtYXRjaF90b2tlbihjaGFyICpzLCBjb25zdCBtYXRjaF90YWJsZV90IHRhYmxlLCBzdWJzdHJpbmdfdCBhcmdzW10pCit7CisJY29uc3Qgc3RydWN0IG1hdGNoX3Rva2VuICpwOworCisJZm9yIChwID0gdGFibGU7ICFtYXRjaF9vbmUocywgcC0+cGF0dGVybiwgYXJncykgOyBwKyspCisJCTsKKworCXJldHVybiBwLT50b2tlbjsKK30KK0VYUE9SVF9TWU1CT0wobWF0Y2hfdG9rZW4pOworCisvKioKKyAqIG1hdGNoX251bWJlcjogc2NhbiBhIG51bWJlciBpbiB0aGUgZ2l2ZW4gYmFzZSBmcm9tIGEgc3Vic3RyaW5nX3QKKyAqIEBzOiBzdWJzdHJpbmcgdG8gYmUgc2Nhbm5lZAorICogQHJlc3VsdDogcmVzdWx0aW5nIGludGVnZXIgb24gc3VjY2VzcworICogQGJhc2U6IGJhc2UgdG8gdXNlIHdoZW4gY29udmVydGluZyBzdHJpbmcKKyAqCisgKiBEZXNjcmlwdGlvbjogR2l2ZW4gYSAmc3Vic3RyaW5nX3QgYW5kIGEgYmFzZSwgYXR0ZW1wdHMgdG8gcGFyc2UgdGhlIHN1YnN0cmluZworICogYXMgYSBudW1iZXIgaW4gdGhhdCBiYXNlLiBPbiBzdWNjZXNzLCBzZXRzIEByZXN1bHQgdG8gdGhlIGludGVnZXIgcmVwcmVzZW50ZWQKKyAqIGJ5IHRoZSBzdHJpbmcgYW5kIHJldHVybnMgMC4gUmV0dXJucyAtRU5PTUVNLCAtRUlOVkFMLCBvciAtRVJBTkdFIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgbWF0Y2hfbnVtYmVyKHN1YnN0cmluZ190ICpzLCBpbnQgKnJlc3VsdCwgaW50IGJhc2UpCit7CisJY2hhciAqZW5kcDsKKwljaGFyICpidWY7CisJaW50IHJldDsKKwlsb25nIHZhbDsKKwlzaXplX3QgbGVuID0gcy0+dG8gLSBzLT5mcm9tOworCisJYnVmID0ga21hbGxvYyhsZW4gKyAxLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJbWVtY3B5KGJ1Ziwgcy0+ZnJvbSwgbGVuKTsKKwlidWZbbGVuXSA9ICdcMCc7CisKKwlyZXQgPSAwOworCXZhbCA9IHNpbXBsZV9zdHJ0b2woYnVmLCAmZW5kcCwgYmFzZSk7CisJaWYgKGVuZHAgPT0gYnVmKQorCQlyZXQgPSAtRUlOVkFMOworCWVsc2UgaWYgKHZhbCA8IChsb25nKUlOVF9NSU4gfHwgdmFsID4gKGxvbmcpSU5UX01BWCkKKwkJcmV0ID0gLUVSQU5HRTsKKwllbHNlCisJCSpyZXN1bHQgPSAoaW50KSB2YWw7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIG1hdGNoX3U2NGludDogc2NhbiBhIG51bWJlciBpbiB0aGUgZ2l2ZW4gYmFzZSBmcm9tIGEgc3Vic3RyaW5nX3QKKyAqIEBzOiBzdWJzdHJpbmcgdG8gYmUgc2Nhbm5lZAorICogQHJlc3VsdDogcmVzdWx0aW5nIHU2NCBvbiBzdWNjZXNzCisgKiBAYmFzZTogYmFzZSB0byB1c2Ugd2hlbiBjb252ZXJ0aW5nIHN0cmluZworICoKKyAqIERlc2NyaXB0aW9uOiBHaXZlbiBhICZzdWJzdHJpbmdfdCBhbmQgYSBiYXNlLCBhdHRlbXB0cyB0byBwYXJzZSB0aGUgc3Vic3RyaW5nCisgKiBhcyBhIG51bWJlciBpbiB0aGF0IGJhc2UuIE9uIHN1Y2Nlc3MsIHNldHMgQHJlc3VsdCB0byB0aGUgaW50ZWdlciByZXByZXNlbnRlZAorICogYnkgdGhlIHN0cmluZyBhbmQgcmV0dXJucyAwLiBSZXR1cm5zIC1FTk9NRU0sIC1FSU5WQUwsIG9yIC1FUkFOR0Ugb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBtYXRjaF91NjRpbnQoc3Vic3RyaW5nX3QgKnMsIHU2NCAqcmVzdWx0LCBpbnQgYmFzZSkKK3sKKwljaGFyICpidWY7CisJaW50IHJldDsKKwl1NjQgdmFsOworCXNpemVfdCBsZW4gPSBzLT50byAtIHMtPmZyb207CisKKwlidWYgPSBrbWFsbG9jKGxlbiArIDEsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1jcHkoYnVmLCBzLT5mcm9tLCBsZW4pOworCWJ1ZltsZW5dID0gJ1wwJzsKKworCXJldCA9IGtzdHJ0b3VsbChidWYsIGJhc2UsICZ2YWwpOworCWlmICghcmV0KQorCQkqcmVzdWx0ID0gdmFsOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBtYXRjaF9pbnQ6IC0gc2NhbiBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmcm9tIGEgc3Vic3RyaW5nX3QKKyAqIEBzOiBzdWJzdHJpbmdfdCB0byBiZSBzY2FubmVkCisgKiBAcmVzdWx0OiByZXN1bHRpbmcgaW50ZWdlciBvbiBzdWNjZXNzCisgKgorICogRGVzY3JpcHRpb246IEF0dGVtcHRzIHRvIHBhcnNlIHRoZSAmc3Vic3RyaW5nX3QgQHMgYXMgYSBkZWNpbWFsIGludGVnZXIuIE9uCisgKiBzdWNjZXNzLCBzZXRzIEByZXN1bHQgdG8gdGhlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBhbmQgcmV0dXJucyAwLgorICogUmV0dXJucyAtRU5PTUVNLCAtRUlOVkFMLCBvciAtRVJBTkdFIG9uIGZhaWx1cmUuCisgKi8KK2ludCBtYXRjaF9pbnQoc3Vic3RyaW5nX3QgKnMsIGludCAqcmVzdWx0KQoreworCXJldHVybiBtYXRjaF9udW1iZXIocywgcmVzdWx0LCAwKTsKK30KK0VYUE9SVF9TWU1CT0wobWF0Y2hfaW50KTsKKworLyoqCisgKiBtYXRjaF91NjQ6IC0gc2NhbiBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgYSB1NjQgZnJvbQorICogICAgICAgICAgICAgICAgICBhIHN1YnN0cmluZ190CisgKiBAczogc3Vic3RyaW5nX3QgdG8gYmUgc2Nhbm5lZAorICogQHJlc3VsdDogcmVzdWx0aW5nIHVuc2lnbmVkIGxvbmcgbG9uZyBvbiBzdWNjZXNzCisgKgorICogRGVzY3JpcHRpb246IEF0dGVtcHRzIHRvIHBhcnNlIHRoZSAmc3Vic3RyaW5nX3QgQHMgYXMgYSBsb25nIGRlY2ltYWwKKyAqIGludGVnZXIuIE9uIHN1Y2Nlc3MsIHNldHMgQHJlc3VsdCB0byB0aGUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUKKyAqIHN0cmluZyBhbmQgcmV0dXJucyAwLgorICogUmV0dXJucyAtRU5PTUVNLCAtRUlOVkFMLCBvciAtRVJBTkdFIG9uIGZhaWx1cmUuCisgKi8KK2ludCBtYXRjaF91NjQoc3Vic3RyaW5nX3QgKnMsIHU2NCAqcmVzdWx0KQoreworCXJldHVybiBtYXRjaF91NjRpbnQocywgcmVzdWx0LCAwKTsKK30KK0VYUE9SVF9TWU1CT0wobWF0Y2hfdTY0KTsKKworLyoqCisgKiBtYXRjaF9vY3RhbDogLSBzY2FuIGFuIG9jdGFsIHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgZnJvbSBhIHN1YnN0cmluZ190CisgKiBAczogc3Vic3RyaW5nX3QgdG8gYmUgc2Nhbm5lZAorICogQHJlc3VsdDogcmVzdWx0aW5nIGludGVnZXIgb24gc3VjY2VzcworICoKKyAqIERlc2NyaXB0aW9uOiBBdHRlbXB0cyB0byBwYXJzZSB0aGUgJnN1YnN0cmluZ190IEBzIGFzIGFuIG9jdGFsIGludGVnZXIuIE9uCisgKiBzdWNjZXNzLCBzZXRzIEByZXN1bHQgdG8gdGhlIGludGVnZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBhbmQgcmV0dXJucworICogMC4gUmV0dXJucyAtRU5PTUVNLCAtRUlOVkFMLCBvciAtRVJBTkdFIG9uIGZhaWx1cmUuCisgKi8KK2ludCBtYXRjaF9vY3RhbChzdWJzdHJpbmdfdCAqcywgaW50ICpyZXN1bHQpCit7CisJcmV0dXJuIG1hdGNoX251bWJlcihzLCByZXN1bHQsIDgpOworfQorRVhQT1JUX1NZTUJPTChtYXRjaF9vY3RhbCk7CisKKy8qKgorICogbWF0Y2hfaGV4OiAtIHNjYW4gYSBoZXggcmVwcmVzZW50YXRpb24gb2YgYW4gaW50ZWdlciBmcm9tIGEgc3Vic3RyaW5nX3QKKyAqIEBzOiBzdWJzdHJpbmdfdCB0byBiZSBzY2FubmVkCisgKiBAcmVzdWx0OiByZXN1bHRpbmcgaW50ZWdlciBvbiBzdWNjZXNzCisgKgorICogRGVzY3JpcHRpb246IEF0dGVtcHRzIHRvIHBhcnNlIHRoZSAmc3Vic3RyaW5nX3QgQHMgYXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLgorICogT24gc3VjY2Vzcywgc2V0cyBAcmVzdWx0IHRvIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgYW5kCisgKiByZXR1cm5zIDAuIFJldHVybnMgLUVOT01FTSwgLUVJTlZBTCwgb3IgLUVSQU5HRSBvbiBmYWlsdXJlLgorICovCitpbnQgbWF0Y2hfaGV4KHN1YnN0cmluZ190ICpzLCBpbnQgKnJlc3VsdCkKK3sKKwlyZXR1cm4gbWF0Y2hfbnVtYmVyKHMsIHJlc3VsdCwgMTYpOworfQorRVhQT1JUX1NZTUJPTChtYXRjaF9oZXgpOworCisvKioKKyAqIG1hdGNoX3dpbGRjYXJkOiAtIHBhcnNlIGlmIGEgc3RyaW5nIG1hdGNoZXMgZ2l2ZW4gd2lsZGNhcmQgcGF0dGVybgorICogQHBhdHRlcm46IHdpbGRjYXJkIHBhdHRlcm4KKyAqIEBzdHI6IHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VkCisgKgorICogRGVzY3JpcHRpb246IFBhcnNlIHRoZSBzdHJpbmcgQHN0ciB0byBjaGVjayBpZiBtYXRjaGVzIHdpbGRjYXJkCisgKiBwYXR0ZXJuIEBwYXR0ZXJuLiBUaGUgcGF0dGVybiBtYXkgY29udGFpbiB0d28gdHlwZSB3aWxkY2FyZGVzOgorICogICAnKicgLSBtYXRjaGVzIHplcm8gb3IgbW9yZSBjaGFyYWN0ZXJzCisgKiAgICc/JyAtIG1hdGNoZXMgb25lIGNoYXJhY3RlcgorICogSWYgaXQncyBtYXRjaGVkLCByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UuCisgKi8KK2Jvb2wgbWF0Y2hfd2lsZGNhcmQoY29uc3QgY2hhciAqcGF0dGVybiwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnMgPSBzdHI7CisJY29uc3QgY2hhciAqcCA9IHBhdHRlcm47CisJYm9vbCBzdGFyID0gZmFsc2U7CisKKwl3aGlsZSAoKnMpIHsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlICc/JzoKKwkJCXMrKzsKKwkJCXArKzsKKwkJCWJyZWFrOworCQljYXNlICcqJzoKKwkJCXN0YXIgPSB0cnVlOworCQkJc3RyID0gczsKKwkJCWlmICghKisrcCkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCXBhdHRlcm4gPSBwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoKnMgPT0gKnApIHsKKwkJCQlzKys7CisJCQkJcCsrOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIXN0YXIpCisJCQkJCXJldHVybiBmYWxzZTsKKwkJCQlzdHIrKzsKKwkJCQlzID0gc3RyOworCQkJCXAgPSBwYXR0ZXJuOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoKnAgPT0gJyonKQorCQkrK3A7CisJcmV0dXJuICEqcDsKK30KK0VYUE9SVF9TWU1CT0wobWF0Y2hfd2lsZGNhcmQpOworCisvKioKKyAqIG1hdGNoX3N0cmxjcHk6IC0gQ29weSB0aGUgY2hhcmFjdGVycyBmcm9tIGEgc3Vic3RyaW5nX3QgdG8gYSBzaXplZCBidWZmZXIKKyAqIEBkZXN0OiB3aGVyZSB0byBjb3B5IHRvCisgKiBAc3JjOiAmc3Vic3RyaW5nX3QgdG8gY29weQorICogQHNpemU6IHNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogRGVzY3JpcHRpb246IENvcHkgdGhlIGNoYXJhY3RlcnMgaW4gJnN1YnN0cmluZ190IEBzcmMgdG8gdGhlCisgKiBjLXN0eWxlIHN0cmluZyBAZGVzdC4gIENvcHkgbm8gbW9yZSB0aGFuIEBzaXplIC0gMSBjaGFyYWN0ZXJzLCBwbHVzCisgKiB0aGUgdGVybWluYXRpbmcgTlVMLiAgUmV0dXJuIGxlbmd0aCBvZiBAc3JjLgorICovCitzaXplX3QgbWF0Y2hfc3RybGNweShjaGFyICpkZXN0LCBjb25zdCBzdWJzdHJpbmdfdCAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgcmV0ID0gc3JjLT50byAtIHNyYy0+ZnJvbTsKKworCWlmIChzaXplKSB7CisJCXNpemVfdCBsZW4gPSByZXQgPj0gc2l6ZSA/IHNpemUgLSAxIDogcmV0OworCQltZW1jcHkoZGVzdCwgc3JjLT5mcm9tLCBsZW4pOworCQlkZXN0W2xlbl0gPSAnXDAnOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChtYXRjaF9zdHJsY3B5KTsKKworLyoqCisgKiBtYXRjaF9zdHJkdXA6IC0gYWxsb2NhdGUgYSBuZXcgc3RyaW5nIHdpdGggdGhlIGNvbnRlbnRzIG9mIGEgc3Vic3RyaW5nX3QKKyAqIEBzOiAmc3Vic3RyaW5nX3QgdG8gY29weQorICoKKyAqIERlc2NyaXB0aW9uOiBBbGxvY2F0ZXMgYW5kIHJldHVybnMgYSBzdHJpbmcgZmlsbGVkIHdpdGggdGhlIGNvbnRlbnRzIG9mCisgKiB0aGUgJnN1YnN0cmluZ190IEBzLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZSByZXR1cm5lZAorICogc3RyaW5nIHdpdGgga2ZyZWUoKS4KKyAqLworY2hhciAqbWF0Y2hfc3RyZHVwKGNvbnN0IHN1YnN0cmluZ190ICpzKQoreworCXNpemVfdCBzeiA9IHMtPnRvIC0gcy0+ZnJvbSArIDE7CisJY2hhciAqcCA9IGttYWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmIChwKQorCQltYXRjaF9zdHJsY3B5KHAsIHMsIHN6KTsKKwlyZXR1cm4gcDsKK30KK0VYUE9SVF9TWU1CT0wobWF0Y2hfc3RyZHVwKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3BjaV9pb21hcC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGNpX2lvbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwZmJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3BjaV9pb21hcC5jCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogSW1wbGVtZW50IHRoZSBkZWZhdWx0IGlvbWFwIGludGVyZmFjZXMKKyAqCisgKiAoQykgQ29weXJpZ2h0IDIwMDQgTGludXMgVG9ydmFsZHMKKyAqLworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2lmZGVmIENPTkZJR19QQ0kKKy8qKgorICogcGNpX2lvbWFwX3JhbmdlIC0gY3JlYXRlIGEgdmlydHVhbCBtYXBwaW5nIGNvb2tpZSBmb3IgYSBQQ0kgQkFSCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRoYXQgb3ducyB0aGUgQkFSCisgKiBAYmFyOiBCQVIgbnVtYmVyCisgKiBAb2Zmc2V0OiBtYXAgbWVtb3J5IGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4gQkFSCisgKiBAbWF4bGVuOiBtYXggbGVuZ3RoIG9mIHRoZSBtZW1vcnkgdG8gbWFwCisgKgorICogVXNpbmcgdGhpcyBmdW5jdGlvbiB5b3Ugd2lsbCBnZXQgYSBfX2lvbWVtIGFkZHJlc3MgdG8geW91ciBkZXZpY2UgQkFSLgorICogWW91IGNhbiBhY2Nlc3MgaXQgdXNpbmcgaW9yZWFkKigpIGFuZCBpb3dyaXRlKigpLiBUaGVzZSBmdW5jdGlvbnMgaGlkZQorICogdGhlIGRldGFpbHMgaWYgdGhpcyBpcyBhIE1NSU8gb3IgUElPIGFkZHJlc3Mgc3BhY2UgYW5kIHdpbGwganVzdCBkbyB3aGF0CisgKiB5b3UgZXhwZWN0IGZyb20gdGhlbSBpbiB0aGUgY29ycmVjdCB3YXkuCisgKgorICogQG1heGxlbiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbGVuZ3RoIHRvIG1hcC4gSWYgeW91IHdhbnQgdG8gZ2V0IGFjY2VzcyB0bworICogdGhlIGNvbXBsZXRlIEJBUiBmcm9tIG9mZnNldCB0byB0aGUgZW5kLCBwYXNzICUwIGhlcmUuCisgKiAqLwordm9pZCBfX2lvbWVtICpwY2lfaW9tYXBfcmFuZ2Uoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCSAgICAgIGludCBiYXIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWF4bGVuKQoreworCXJlc291cmNlX3NpemVfdCBzdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYsIGJhcik7CisJcmVzb3VyY2Vfc2l6ZV90IGxlbiA9IHBjaV9yZXNvdXJjZV9sZW4oZGV2LCBiYXIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBwY2lfcmVzb3VyY2VfZmxhZ3MoZGV2LCBiYXIpOworCisJaWYgKGxlbiA8PSBvZmZzZXQgfHwgIXN0YXJ0KQorCQlyZXR1cm4gTlVMTDsKKwlsZW4gLT0gb2Zmc2V0OworCXN0YXJ0ICs9IG9mZnNldDsKKwlpZiAobWF4bGVuICYmIGxlbiA+IG1heGxlbikKKwkJbGVuID0gbWF4bGVuOworCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pCisJCXJldHVybiBfX3BjaV9pb3BvcnRfbWFwKGRldiwgc3RhcnQsIGxlbik7CisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9NRU0pCisJCXJldHVybiBpb3JlbWFwKHN0YXJ0LCBsZW4pOworCS8qIFdoYXQ/ICovCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHBjaV9pb21hcF9yYW5nZSk7CisKKy8qKgorICogcGNpX2lvbWFwX3djX3JhbmdlIC0gY3JlYXRlIGEgdmlydHVhbCBXQyBtYXBwaW5nIGNvb2tpZSBmb3IgYSBQQ0kgQkFSCisgKiBAZGV2OiBQQ0kgZGV2aWNlIHRoYXQgb3ducyB0aGUgQkFSCisgKiBAYmFyOiBCQVIgbnVtYmVyCisgKiBAb2Zmc2V0OiBtYXAgbWVtb3J5IGF0IHRoZSBnaXZlbiBvZmZzZXQgaW4gQkFSCisgKiBAbWF4bGVuOiBtYXggbGVuZ3RoIG9mIHRoZSBtZW1vcnkgdG8gbWFwCisgKgorICogVXNpbmcgdGhpcyBmdW5jdGlvbiB5b3Ugd2lsbCBnZXQgYSBfX2lvbWVtIGFkZHJlc3MgdG8geW91ciBkZXZpY2UgQkFSLgorICogWW91IGNhbiBhY2Nlc3MgaXQgdXNpbmcgaW9yZWFkKigpIGFuZCBpb3dyaXRlKigpLiBUaGVzZSBmdW5jdGlvbnMgaGlkZQorICogdGhlIGRldGFpbHMgaWYgdGhpcyBpcyBhIE1NSU8gb3IgUElPIGFkZHJlc3Mgc3BhY2UgYW5kIHdpbGwganVzdCBkbyB3aGF0CisgKiB5b3UgZXhwZWN0IGZyb20gdGhlbSBpbiB0aGUgY29ycmVjdCB3YXkuIFdoZW4gcG9zc2libGUgd3JpdGUgY29tYmluaW5nCisgKiBpcyB1c2VkLgorICoKKyAqIEBtYXhsZW4gc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGxlbmd0aCB0byBtYXAuIElmIHlvdSB3YW50IHRvIGdldCBhY2Nlc3MgdG8KKyAqIHRoZSBjb21wbGV0ZSBCQVIgZnJvbSBvZmZzZXQgdG8gdGhlIGVuZCwgcGFzcyAlMCBoZXJlLgorICogKi8KK3ZvaWQgX19pb21lbSAqcGNpX2lvbWFwX3djX3JhbmdlKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJIGludCBiYXIsCisJCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCSB1bnNpZ25lZCBsb25nIG1heGxlbikKK3sKKwlyZXNvdXJjZV9zaXplX3Qgc3RhcnQgPSBwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LCBiYXIpOworCXJlc291cmNlX3NpemVfdCBsZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldiwgYmFyKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gcGNpX3Jlc291cmNlX2ZsYWdzKGRldiwgYmFyKTsKKworCisJaWYgKGZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAobGVuIDw9IG9mZnNldCB8fCAhc3RhcnQpCisJCXJldHVybiBOVUxMOworCisJbGVuIC09IG9mZnNldDsKKwlzdGFydCArPSBvZmZzZXQ7CisJaWYgKG1heGxlbiAmJiBsZW4gPiBtYXhsZW4pCisJCWxlbiA9IG1heGxlbjsKKworCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQlyZXR1cm4gaW9yZW1hcF93YyhzdGFydCwgbGVuKTsKKworCS8qIFdoYXQ/ICovCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwY2lfaW9tYXBfd2NfcmFuZ2UpOworCisvKioKKyAqIHBjaV9pb21hcCAtIGNyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGEgUENJIEJBUgorICogQGRldjogUENJIGRldmljZSB0aGF0IG93bnMgdGhlIEJBUgorICogQGJhcjogQkFSIG51bWJlcgorICogQG1heGxlbjogbGVuZ3RoIG9mIHRoZSBtZW1vcnkgdG8gbWFwCisgKgorICogVXNpbmcgdGhpcyBmdW5jdGlvbiB5b3Ugd2lsbCBnZXQgYSBfX2lvbWVtIGFkZHJlc3MgdG8geW91ciBkZXZpY2UgQkFSLgorICogWW91IGNhbiBhY2Nlc3MgaXQgdXNpbmcgaW9yZWFkKigpIGFuZCBpb3dyaXRlKigpLiBUaGVzZSBmdW5jdGlvbnMgaGlkZQorICogdGhlIGRldGFpbHMgaWYgdGhpcyBpcyBhIE1NSU8gb3IgUElPIGFkZHJlc3Mgc3BhY2UgYW5kIHdpbGwganVzdCBkbyB3aGF0CisgKiB5b3UgZXhwZWN0IGZyb20gdGhlbSBpbiB0aGUgY29ycmVjdCB3YXkuCisgKgorICogQG1heGxlbiBzcGVjaWZpZXMgdGhlIG1heGltdW0gbGVuZ3RoIHRvIG1hcC4gSWYgeW91IHdhbnQgdG8gZ2V0IGFjY2VzcyB0bworICogdGhlIGNvbXBsZXRlIEJBUiB3aXRob3V0IGNoZWNraW5nIGZvciBpdHMgbGVuZ3RoIGZpcnN0LCBwYXNzICUwIGhlcmUuCisgKiAqLwordm9pZCBfX2lvbWVtICpwY2lfaW9tYXAoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IGJhciwgdW5zaWduZWQgbG9uZyBtYXhsZW4pCit7CisJcmV0dXJuIHBjaV9pb21hcF9yYW5nZShkZXYsIGJhciwgMCwgbWF4bGVuKTsKK30KK0VYUE9SVF9TWU1CT0wocGNpX2lvbWFwKTsKKworLyoqCisgKiBwY2lfaW9tYXBfd2MgLSBjcmVhdGUgYSB2aXJ0dWFsIFdDIG1hcHBpbmcgY29va2llIGZvciBhIFBDSSBCQVIKKyAqIEBkZXY6IFBDSSBkZXZpY2UgdGhhdCBvd25zIHRoZSBCQVIKKyAqIEBiYXI6IEJBUiBudW1iZXIKKyAqIEBtYXhsZW46IGxlbmd0aCBvZiB0aGUgbWVtb3J5IHRvIG1hcAorICoKKyAqIFVzaW5nIHRoaXMgZnVuY3Rpb24geW91IHdpbGwgZ2V0IGEgX19pb21lbSBhZGRyZXNzIHRvIHlvdXIgZGV2aWNlIEJBUi4KKyAqIFlvdSBjYW4gYWNjZXNzIGl0IHVzaW5nIGlvcmVhZCooKSBhbmQgaW93cml0ZSooKS4gVGhlc2UgZnVuY3Rpb25zIGhpZGUKKyAqIHRoZSBkZXRhaWxzIGlmIHRoaXMgaXMgYSBNTUlPIG9yIFBJTyBhZGRyZXNzIHNwYWNlIGFuZCB3aWxsIGp1c3QgZG8gd2hhdAorICogeW91IGV4cGVjdCBmcm9tIHRoZW0gaW4gdGhlIGNvcnJlY3Qgd2F5LiBXaGVuIHBvc3NpYmxlIHdyaXRlIGNvbWJpbmluZworICogaXMgdXNlZC4KKyAqCisgKiBAbWF4bGVuIHNwZWNpZmllcyB0aGUgbWF4aW11bSBsZW5ndGggdG8gbWFwLiBJZiB5b3Ugd2FudCB0byBnZXQgYWNjZXNzIHRvCisgKiB0aGUgY29tcGxldGUgQkFSIHdpdGhvdXQgY2hlY2tpbmcgZm9yIGl0cyBsZW5ndGggZmlyc3QsIHBhc3MgJTAgaGVyZS4KKyAqICovCit2b2lkIF9faW9tZW0gKnBjaV9pb21hcF93YyhzdHJ1Y3QgcGNpX2RldiAqZGV2LCBpbnQgYmFyLCB1bnNpZ25lZCBsb25nIG1heGxlbikKK3sKKwlyZXR1cm4gcGNpX2lvbWFwX3djX3JhbmdlKGRldiwgYmFyLCAwLCBtYXhsZW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGNpX2lvbWFwX3djKTsKKyNlbmRpZiAvKiBDT05GSUdfUENJICovCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wZXJjcHUtcmVmY291bnQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3BlcmNwdS1yZWZjb3VudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDNjNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wZXJjcHUtcmVmY291bnQuYwpAQCAtMCwwICsxLDM2OSBAQAorI2RlZmluZSBwcl9mbXQoZm10KSAiJXM6ICIgZm10ICJcbiIsIF9fZnVuY19fCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUtcmVmY291bnQuaD4KKworLyoKKyAqIEluaXRpYWxseSwgYSBwZXJjcHUgcmVmY291bnQgaXMganVzdCBhIHNldCBvZiBwZXJjcHUgY291bnRlcnMuIEluaXRpYWxseSwgd2UKKyAqIGRvbid0IHRyeSB0byBkZXRlY3QgdGhlIHJlZiBoaXR0aW5nIDAgLSB3aGljaCBtZWFucyB0aGF0IGdldC9wdXQgY2FuIGp1c3QKKyAqIGluY3JlbWVudCBvciBkZWNyZW1lbnQgdGhlIGxvY2FsIGNvdW50ZXIuIE5vdGUgdGhhdCB0aGUgY291bnRlciBvbiBhCisgKiBwYXJ0aWN1bGFyIGNwdSBjYW4gKGFuZCB3aWxsKSB3cmFwIC0gdGhpcyBpcyBmaW5lLCB3aGVuIHdlIGdvIHRvIHNodXRkb3duIHRoZQorICogcGVyY3B1IGNvdW50ZXJzIHdpbGwgYWxsIHN1bSB0byB0aGUgY29ycmVjdCB2YWx1ZQorICoKKyAqIChNb3JlIHByZWNpc2VseTogYmVjYXVzZSBtb2R1bGFyIGFyaXRobWV0aWMgaXMgY29tbXV0YXRpdmUgdGhlIHN1bSBvZiBhbGwgdGhlCisgKiBwZXJjcHVfY291bnQgdmFycyB3aWxsIGJlIGVxdWFsIHRvIHdoYXQgaXQgd291bGQgaGF2ZSBiZWVuIGlmIGFsbCB0aGUgZ2V0cworICogYW5kIHB1dHMgd2VyZSBkb25lIHRvIGEgc2luZ2xlIGludGVnZXIsIGV2ZW4gaWYgc29tZSBvZiB0aGUgcGVyY3B1IGludGVnZXJzCisgKiBvdmVyZmxvdyBvciB1bmRlcmZsb3cpLgorICoKKyAqIFRoZSByZWFsIHRyaWNrIHRvIGltcGxlbWVudGluZyBwZXJjcHUgcmVmY291bnRzIGlzIHNodXRkb3duLiBXZSBjYW4ndCBkZXRlY3QKKyAqIHRoZSByZWYgaGl0dGluZyAwIG9uIGV2ZXJ5IHB1dCAtIHRoaXMgd291bGQgcmVxdWlyZSBnbG9iYWwgc3luY2hyb25pemF0aW9uCisgKiBhbmQgZGVmZWF0IHRoZSB3aG9sZSBwdXJwb3NlIG9mIHVzaW5nIHBlcmNwdSByZWZzLgorICoKKyAqIFdoYXQgd2UgZG8gaXMgcmVxdWlyZSB0aGUgdXNlciB0byBrZWVwIHRyYWNrIG9mIHRoZSBpbml0aWFsIHJlZmNvdW50OyB3ZSBrbm93CisgKiB0aGUgcmVmIGNhbid0IGhpdCAwIGJlZm9yZSB0aGUgdXNlciBkcm9wcyB0aGUgaW5pdGlhbCByZWYsIHNvIGFzIGxvbmcgYXMgd2UKKyAqIGNvbnZlcnQgdG8gbm9uIHBlcmNwdSBtb2RlIGJlZm9yZSB0aGUgaW5pdGlhbCByZWYgaXMgZHJvcHBlZCBldmVyeXRoaW5nCisgKiB3b3Jrcy4KKyAqCisgKiBDb252ZXJ0aW5nIHRvIG5vbiBwZXJjcHUgbW9kZSBpcyBkb25lIHdpdGggc29tZSBSQ1Vpc2ggc3R1ZmYgaW4KKyAqIHBlcmNwdV9yZWZfa2lsbC4gQWRkaXRpb25hbGx5LCB3ZSBuZWVkIGEgYmlhcyB2YWx1ZSBzbyB0aGF0IHRoZQorICogYXRvbWljX2xvbmdfdCBjYW4ndCBoaXQgMCBiZWZvcmUgd2UndmUgYWRkZWQgdXAgYWxsIHRoZSBwZXJjcHUgcmVmcy4KKyAqLworCisjZGVmaW5lIFBFUkNQVV9DT1VOVF9CSUFTCSgxTFUgPDwgKEJJVFNfUEVSX0xPTkcgLSAxKSkKKworc3RhdGljIERFRklORV9TUElOTE9DSyhwZXJjcHVfcmVmX3N3aXRjaF9sb2NrKTsKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChwZXJjcHVfcmVmX3N3aXRjaF93YWl0cSk7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fcGVyY3B1ICpwZXJjcHVfY291bnRfcHRyKHN0cnVjdCBwZXJjcHVfcmVmICpyZWYpCit7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nIF9fcGVyY3B1ICopCisJCShyZWYtPnBlcmNwdV9jb3VudF9wdHIgJiB+X19QRVJDUFVfUkVGX0FUT01JQ19ERUFEKTsKK30KKworLyoqCisgKiBwZXJjcHVfcmVmX2luaXQgLSBpbml0aWFsaXplIGEgcGVyY3B1IHJlZmNvdW50CisgKiBAcmVmOiBwZXJjcHVfcmVmIHRvIGluaXRpYWxpemUKKyAqIEByZWxlYXNlOiBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIHJlZmNvdW50IGhpdHMgMAorICogQGZsYWdzOiBQRVJDUFVfUkVGX0lOSVRfKiBmbGFncworICogQGdmcDogYWxsb2NhdGlvbiBtYXNrIHRvIHVzZQorICoKKyAqIEluaXRpYWxpemVzIEByZWYuICBJZiBAZmxhZ3MgaXMgemVybywgQHJlZiBzdGFydHMgaW4gcGVyY3B1IG1vZGUgd2l0aCBhCisgKiByZWZjb3VudCBvZiAxOyBhbmFsYWdvdXMgdG8gYXRvbWljX2xvbmdfc2V0KHJlZiwgMSkuICBTZWUgdGhlCisgKiBkZWZpbml0aW9ucyBvZiBQRVJDUFVfUkVGX0lOSVRfKiBmbGFncyBmb3IgZmxhZyBiZWhhdmlvcnMuCisgKgorICogTm90ZSB0aGF0IEByZWxlYXNlIG11c3Qgbm90IHNsZWVwIC0gaXQgbWF5IHBvdGVudGlhbGx5IGJlIGNhbGxlZCBmcm9tIFJDVQorICogY2FsbGJhY2sgY29udGV4dCBieSBwZXJjcHVfcmVmX2tpbGwoKS4KKyAqLworaW50IHBlcmNwdV9yZWZfaW5pdChzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmLCBwZXJjcHVfcmVmX2Z1bmNfdCAqcmVsZWFzZSwKKwkJICAgIHVuc2lnbmVkIGludCBmbGFncywgZ2ZwX3QgZ2ZwKQoreworCXNpemVfdCBhbGlnbiA9IG1heF90KHNpemVfdCwgMSA8PCBfX1BFUkNQVV9SRUZfRkxBR19CSVRTLAorCQkJICAgICBfX2FsaWdub2ZfXyh1bnNpZ25lZCBsb25nKSk7CisJdW5zaWduZWQgbG9uZyBzdGFydF9jb3VudCA9IDA7CisKKwlyZWYtPnBlcmNwdV9jb3VudF9wdHIgPSAodW5zaWduZWQgbG9uZykKKwkJX19hbGxvY19wZXJjcHVfZ2ZwKHNpemVvZih1bnNpZ25lZCBsb25nKSwgYWxpZ24sIGdmcCk7CisJaWYgKCFyZWYtPnBlcmNwdV9jb3VudF9wdHIpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVmLT5mb3JjZV9hdG9taWMgPSBmbGFncyAmIFBFUkNQVV9SRUZfSU5JVF9BVE9NSUM7CisKKwlpZiAoZmxhZ3MgJiAoUEVSQ1BVX1JFRl9JTklUX0FUT01JQyB8IFBFUkNQVV9SRUZfSU5JVF9ERUFEKSkKKwkJcmVmLT5wZXJjcHVfY291bnRfcHRyIHw9IF9fUEVSQ1BVX1JFRl9BVE9NSUM7CisJZWxzZQorCQlzdGFydF9jb3VudCArPSBQRVJDUFVfQ09VTlRfQklBUzsKKworCWlmIChmbGFncyAmIFBFUkNQVV9SRUZfSU5JVF9ERUFEKQorCQlyZWYtPnBlcmNwdV9jb3VudF9wdHIgfD0gX19QRVJDUFVfUkVGX0RFQUQ7CisJZWxzZQorCQlzdGFydF9jb3VudCsrOworCisJYXRvbWljX2xvbmdfc2V0KCZyZWYtPmNvdW50LCBzdGFydF9jb3VudCk7CisKKwlyZWYtPnJlbGVhc2UgPSByZWxlYXNlOworCXJlZi0+Y29uZmlybV9zd2l0Y2ggPSBOVUxMOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X3JlZl9pbml0KTsKKworLyoqCisgKiBwZXJjcHVfcmVmX2V4aXQgLSB1bmRvIHBlcmNwdV9yZWZfaW5pdCgpCisgKiBAcmVmOiBwZXJjcHVfcmVmIHRvIGV4aXQKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGV4aXRzIEByZWYuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0CisgKiBAcmVmIGlzIG5vIGxvbmdlciBpbiBhY3RpdmUgdXNlLiAgVGhlIHVzdWFsIHBsYWNlcyB0byBpbnZva2UgdGhpcworICogZnVuY3Rpb24gZnJvbSBhcmUgdGhlIEByZWYtPnJlbGVhc2UoKSBjYWxsYmFjayBvciBpbiBpbml0IGZhaWx1cmUgcGF0aAorICogd2hlcmUgcGVyY3B1X3JlZl9pbml0KCkgc3VjY2VlZGVkIGJ1dCBvdGhlciBwYXJ0cyBvZiB0aGUgaW5pdGlhbGl6YXRpb24KKyAqIG9mIHRoZSBlbWJlZGRpbmcgb2JqZWN0IGZhaWxlZC4KKyAqLwordm9pZCBwZXJjcHVfcmVmX2V4aXQoc3RydWN0IHBlcmNwdV9yZWYgKnJlZikKK3sKKwl1bnNpZ25lZCBsb25nIF9fcGVyY3B1ICpwZXJjcHVfY291bnQgPSBwZXJjcHVfY291bnRfcHRyKHJlZik7CisKKwlpZiAocGVyY3B1X2NvdW50KSB7CisJCS8qIG5vbi1OVUxMIGNvbmZpcm1fc3dpdGNoIGluZGljYXRlcyBzd2l0Y2hpbmcgaW4gcHJvZ3Jlc3MgKi8KKwkJV0FSTl9PTl9PTkNFKHJlZi0+Y29uZmlybV9zd2l0Y2gpOworCQlmcmVlX3BlcmNwdShwZXJjcHVfY291bnQpOworCQlyZWYtPnBlcmNwdV9jb3VudF9wdHIgPSBfX1BFUkNQVV9SRUZfQVRPTUlDX0RFQUQ7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X3JlZl9leGl0KTsKKworc3RhdGljIHZvaWQgcGVyY3B1X3JlZl9jYWxsX2NvbmZpcm1fcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBwZXJjcHVfcmVmICpyZWYgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgcGVyY3B1X3JlZiwgcmN1KTsKKworCXJlZi0+Y29uZmlybV9zd2l0Y2gocmVmKTsKKwlyZWYtPmNvbmZpcm1fc3dpdGNoID0gTlVMTDsKKwl3YWtlX3VwX2FsbCgmcGVyY3B1X3JlZl9zd2l0Y2hfd2FpdHEpOworCisJLyogZHJvcCByZWYgZnJvbSBwZXJjcHVfcmVmX3N3aXRjaF90b19hdG9taWMoKSAqLworCXBlcmNwdV9yZWZfcHV0KHJlZik7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmNwdV9yZWZfc3dpdGNoX3RvX2F0b21pY19yY3Uoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0IHBlcmNwdV9yZWYgKnJlZiA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBwZXJjcHVfcmVmLCByY3UpOworCXVuc2lnbmVkIGxvbmcgX19wZXJjcHUgKnBlcmNwdV9jb3VudCA9IHBlcmNwdV9jb3VudF9wdHIocmVmKTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJY291bnQgKz0gKnBlcl9jcHVfcHRyKHBlcmNwdV9jb3VudCwgY3B1KTsKKworCXByX2RlYnVnKCJnbG9iYWwgJWxkIHBlcmNwdSAlbGQiLAorCQkgYXRvbWljX2xvbmdfcmVhZCgmcmVmLT5jb3VudCksIChsb25nKWNvdW50KTsKKworCS8qCisJICogSXQncyBjcnVjaWFsIHRoYXQgd2Ugc3VtIHRoZSBwZXJjcHUgY291bnRlcnMgX2JlZm9yZV8gYWRkaW5nIHRoZSBzdW0KKwkgKiB0byAmcmVmLT5jb3VudDsgc2luY2UgZ2V0cyBjb3VsZCBiZSBoYXBwZW5pbmcgb24gb25lIGNwdSB3aGlsZSBwdXRzCisJICogaGFwcGVuIG9uIGFub3RoZXIsIGFkZGluZyBhIHNpbmdsZSBjcHUncyBjb3VudCBjb3VsZCBjYXVzZQorCSAqIEByZWYtPmNvdW50IHRvIGhpdCAwIGJlZm9yZSB3ZSd2ZSBnb3QgYSBjb25zaXN0ZW50IHZhbHVlIC0gYnV0IHRoZQorCSAqIHN1bSBvZiBhbGwgdGhlIGNvdW50cyB3aWxsIGJlIGNvbnNpc3RlbnQgYW5kIGNvcnJlY3QuCisJICoKKwkgKiBTdWJ0cmFjdGluZyB0aGUgYmlhcyB2YWx1ZSB0aGVuIGhhcyB0byBoYXBwZW4gX2FmdGVyXyBhZGRpbmcgY291bnQgdG8KKwkgKiAmcmVmLT5jb3VudDsgd2UgbmVlZCB0aGUgYmlhcyB2YWx1ZSB0byBwcmV2ZW50ICZyZWYtPmNvdW50IGZyb20KKwkgKiByZWFjaGluZyAwIGJlZm9yZSB3ZSBhZGQgdGhlIHBlcmNwdSBjb3VudHMuIEJ1dCBkb2luZyBpdCBhdCB0aGUgc2FtZQorCSAqIHRpbWUgaXMgZXF1aXZhbGVudCBhbmQgc2F2ZXMgdXMgYXRvbWljIG9wZXJhdGlvbnM6CisJICovCisJYXRvbWljX2xvbmdfYWRkKChsb25nKWNvdW50IC0gUEVSQ1BVX0NPVU5UX0JJQVMsICZyZWYtPmNvdW50KTsKKworCVdBUk5fT05DRShhdG9taWNfbG9uZ19yZWFkKCZyZWYtPmNvdW50KSA8PSAwLAorCQkgICJwZXJjcHUgcmVmICglcGYpIDw9IDAgKCVsZCkgYWZ0ZXIgc3dpdGNoaW5nIHRvIGF0b21pYyIsCisJCSAgcmVmLT5yZWxlYXNlLCBhdG9taWNfbG9uZ19yZWFkKCZyZWYtPmNvdW50KSk7CisKKwkvKiBAcmVmIGlzIHZpZXdlZCBhcyBkZWFkIG9uIGFsbCBDUFVzLCBzZW5kIG91dCBzd2l0Y2ggY29uZmlybWF0aW9uICovCisJcGVyY3B1X3JlZl9jYWxsX2NvbmZpcm1fcmN1KHJjdSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmNwdV9yZWZfbm9vcF9jb25maXJtX3N3aXRjaChzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKQoreworfQorCitzdGF0aWMgdm9pZCBfX3BlcmNwdV9yZWZfc3dpdGNoX3RvX2F0b21pYyhzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmLAorCQkJCQkgIHBlcmNwdV9yZWZfZnVuY190ICpjb25maXJtX3N3aXRjaCkKK3sKKwlpZiAocmVmLT5wZXJjcHVfY291bnRfcHRyICYgX19QRVJDUFVfUkVGX0FUT01JQykgeworCQlpZiAoY29uZmlybV9zd2l0Y2gpCisJCQljb25maXJtX3N3aXRjaChyZWYpOworCQlyZXR1cm47CisJfQorCisJLyogc3dpdGNoaW5nIGZyb20gcGVyY3B1IHRvIGF0b21pYyAqLworCXJlZi0+cGVyY3B1X2NvdW50X3B0ciB8PSBfX1BFUkNQVV9SRUZfQVRPTUlDOworCisJLyoKKwkgKiBOb24tTlVMTCAtPmNvbmZpcm1fc3dpdGNoIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBzd2l0Y2hpbmcgaXMKKwkgKiBpbiBwcm9ncmVzcy4gIFVzZSBub29wIG9uZSBpZiB1bnNwZWNpZmllZC4KKwkgKi8KKwlyZWYtPmNvbmZpcm1fc3dpdGNoID0gY29uZmlybV9zd2l0Y2ggPzogcGVyY3B1X3JlZl9ub29wX2NvbmZpcm1fc3dpdGNoOworCisJcGVyY3B1X3JlZl9nZXQocmVmKTsJLyogcHV0IGFmdGVyIGNvbmZpcm1hdGlvbiAqLworCWNhbGxfcmN1X3NjaGVkKCZyZWYtPnJjdSwgcGVyY3B1X3JlZl9zd2l0Y2hfdG9fYXRvbWljX3JjdSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcGVyY3B1X3JlZl9zd2l0Y2hfdG9fcGVyY3B1KHN0cnVjdCBwZXJjcHVfcmVmICpyZWYpCit7CisJdW5zaWduZWQgbG9uZyBfX3BlcmNwdSAqcGVyY3B1X2NvdW50ID0gcGVyY3B1X2NvdW50X3B0cihyZWYpOworCWludCBjcHU7CisKKwlCVUdfT04oIXBlcmNwdV9jb3VudCk7CisKKwlpZiAoIShyZWYtPnBlcmNwdV9jb3VudF9wdHIgJiBfX1BFUkNQVV9SRUZfQVRPTUlDKSkKKwkJcmV0dXJuOworCisJYXRvbWljX2xvbmdfYWRkKFBFUkNQVV9DT1VOVF9CSUFTLCAmcmVmLT5jb3VudCk7CisKKwkvKgorCSAqIFJlc3RvcmUgcGVyLWNwdSBvcGVyYXRpb24uICBzbXBfc3RvcmVfcmVsZWFzZSgpIGlzIHBhaXJlZCB3aXRoCisJICogc21wX3JlYWRfYmFycmllcl9kZXBlbmRzKCkgaW4gX19yZWZfaXNfcGVyY3B1KCkgYW5kIGd1YXJhbnRlZXMKKwkgKiB0aGF0IHRoZSB6ZXJvaW5nIGlzIHZpc2libGUgdG8gYWxsIHBlcmNwdSBhY2Nlc3NlcyB3aGljaCBjYW4gc2VlCisJICogdGhlIGZvbGxvd2luZyBfX1BFUkNQVV9SRUZfQVRPTUlDIGNsZWFyaW5nLgorCSAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCSpwZXJfY3B1X3B0cihwZXJjcHVfY291bnQsIGNwdSkgPSAwOworCisJc21wX3N0b3JlX3JlbGVhc2UoJnJlZi0+cGVyY3B1X2NvdW50X3B0ciwKKwkJCSAgcmVmLT5wZXJjcHVfY291bnRfcHRyICYgfl9fUEVSQ1BVX1JFRl9BVE9NSUMpOworfQorCitzdGF0aWMgdm9pZCBfX3BlcmNwdV9yZWZfc3dpdGNoX21vZGUoc3RydWN0IHBlcmNwdV9yZWYgKnJlZiwKKwkJCQkgICAgIHBlcmNwdV9yZWZfZnVuY190ICpjb25maXJtX3N3aXRjaCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwZXJjcHVfcmVmX3N3aXRjaF9sb2NrKTsKKworCS8qCisJICogSWYgdGhlIHByZXZpb3VzIEFUT01JQyBzd2l0Y2hpbmcgaGFzbid0IGZpbmlzaGVkIHlldCwgd2FpdCBmb3IKKwkgKiBpdHMgY29tcGxldGlvbi4gIElmIHRoZSBjYWxsZXIgZW5zdXJlcyB0aGF0IEFUT01JQyBzd2l0Y2hpbmcKKwkgKiBpc24ndCBpbiBwcm9ncmVzcywgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGZyb20gYW55IGNvbnRleHQuCisJICovCisJd2FpdF9ldmVudF9sb2NrX2lycShwZXJjcHVfcmVmX3N3aXRjaF93YWl0cSwgIXJlZi0+Y29uZmlybV9zd2l0Y2gsCisJCQkgICAgcGVyY3B1X3JlZl9zd2l0Y2hfbG9jayk7CisKKwlpZiAocmVmLT5mb3JjZV9hdG9taWMgfHwgKHJlZi0+cGVyY3B1X2NvdW50X3B0ciAmIF9fUEVSQ1BVX1JFRl9ERUFEKSkKKwkJX19wZXJjcHVfcmVmX3N3aXRjaF90b19hdG9taWMocmVmLCBjb25maXJtX3N3aXRjaCk7CisJZWxzZQorCQlfX3BlcmNwdV9yZWZfc3dpdGNoX3RvX3BlcmNwdShyZWYpOworfQorCisvKioKKyAqIHBlcmNwdV9yZWZfc3dpdGNoX3RvX2F0b21pYyAtIHN3aXRjaCBhIHBlcmNwdV9yZWYgdG8gYXRvbWljIG1vZGUKKyAqIEByZWY6IHBlcmNwdV9yZWYgdG8gc3dpdGNoIHRvIGF0b21pYyBtb2RlCisgKiBAY29uZmlybV9zd2l0Y2g6IG9wdGlvbmFsIGNvbmZpcm1hdGlvbiBjYWxsYmFjaworICoKKyAqIFRoZXJlJ3Mgbm8gcmVhc29uIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIGZvciB0aGUgdXN1YWwgcmVmZXJlbmNlIGNvdW50aW5nLgorICogVXNlIHBlcmNwdV9yZWZfa2lsbFtfYW5kX2NvbmZpcm1dKCkuCisgKgorICogU2NoZWR1bGUgc3dpdGNoaW5nIG9mIEByZWYgdG8gYXRvbWljIG1vZGUuICBBbGwgaXRzIHBlcmNwdSBjb3VudHMgd2lsbAorICogYmUgY29sbGVjdGVkIHRvIHRoZSBtYWluIGF0b21pYyBjb3VudGVyLiAgT24gY29tcGxldGlvbiwgd2hlbiBhbGwgQ1BVcworICogYXJlIGd1YXJhbmVlZCB0byBiZSBpbiBhdG9taWMgbW9kZSwgQGNvbmZpcm1fc3dpdGNoLCB3aGljaCBtYXkgbm90CisgKiBibG9jaywgaXMgaW52b2tlZC4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludm9rZWQgY29uY3VycmVudGx5IHdpdGggYWxsCisgKiB0aGUgZ2V0L3B1dCBvcGVyYXRpb25zIGFuZCBjYW4gc2FmZWx5IGJlIG1peGVkIHdpdGgga2lsbCBhbmQgcmVpbml0CisgKiBvcGVyYXRpb25zLiAgTm90ZSB0aGF0IEByZWYgd2lsbCBzdGF5IGluIGF0b21pYyBtb2RlIGFjcm9zcyBraWxsL3JlaW5pdAorICogY3ljbGVzIHVudGlsIHBlcmNwdV9yZWZfc3dpdGNoX3RvX3BlcmNwdSgpIGlzIGNhbGxlZC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBibG9jayBpZiBAcmVmIGlzIGluIHRoZSBwcm9jZXNzIG9mIHN3aXRjaGluZyB0byBhdG9taWMKKyAqIG1vZGUuICBJZiB0aGUgY2FsbGVyIGVuc3VyZXMgdGhhdCBAcmVmIGlzIG5vdCBpbiB0aGUgcHJvY2VzcyBvZgorICogc3dpdGNoaW5nIHRvIGF0b21pYyBtb2RlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KKyAqLwordm9pZCBwZXJjcHVfcmVmX3N3aXRjaF90b19hdG9taWMoc3RydWN0IHBlcmNwdV9yZWYgKnJlZiwKKwkJCQkgcGVyY3B1X3JlZl9mdW5jX3QgKmNvbmZpcm1fc3dpdGNoKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyY3B1X3JlZl9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJcmVmLT5mb3JjZV9hdG9taWMgPSB0cnVlOworCV9fcGVyY3B1X3JlZl9zd2l0Y2hfbW9kZShyZWYsIGNvbmZpcm1fc3dpdGNoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcmNwdV9yZWZfc3dpdGNoX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV9yZWZfc3dpdGNoX3RvX2F0b21pYyk7CisKKy8qKgorICogcGVyY3B1X3JlZl9zd2l0Y2hfdG9fYXRvbWljX3N5bmMgLSBzd2l0Y2ggYSBwZXJjcHVfcmVmIHRvIGF0b21pYyBtb2RlCisgKiBAcmVmOiBwZXJjcHVfcmVmIHRvIHN3aXRjaCB0byBhdG9taWMgbW9kZQorICoKKyAqIFNjaGVkdWxlIHN3aXRjaGluZyB0aGUgcmVmIHRvIGF0b21pYyBtb2RlLCBhbmQgd2FpdCBmb3IgdGhlCisgKiBzd2l0Y2ggdG8gY29tcGxldGUuICBDYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBubyBvdGhlciB0aHJlYWQKKyAqIHdpbGwgc3dpdGNoIGJhY2sgdG8gcGVyY3B1IG1vZGUuCisgKi8KK3ZvaWQgcGVyY3B1X3JlZl9zd2l0Y2hfdG9fYXRvbWljX3N5bmMoc3RydWN0IHBlcmNwdV9yZWYgKnJlZikKK3sKKwlwZXJjcHVfcmVmX3N3aXRjaF90b19hdG9taWMocmVmLCBOVUxMKTsKKwl3YWl0X2V2ZW50KHBlcmNwdV9yZWZfc3dpdGNoX3dhaXRxLCAhcmVmLT5jb25maXJtX3N3aXRjaCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfcmVmX3N3aXRjaF90b19hdG9taWNfc3luYyk7CisKKy8qKgorICogcGVyY3B1X3JlZl9zd2l0Y2hfdG9fcGVyY3B1IC0gc3dpdGNoIGEgcGVyY3B1X3JlZiB0byBwZXJjcHUgbW9kZQorICogQHJlZjogcGVyY3B1X3JlZiB0byBzd2l0Y2ggdG8gcGVyY3B1IG1vZGUKKyAqCisgKiBUaGVyZSdzIG5vIHJlYXNvbiB0byB1c2UgdGhpcyBmdW5jdGlvbiBmb3IgdGhlIHVzdWFsIHJlZmVyZW5jZSBjb3VudGluZy4KKyAqIFRvIHJlLXVzZSBhbiBleHBpcmVkIHJlZiwgdXNlIHBlcmNwdV9yZWZfcmVpbml0KCkuCisgKgorICogU3dpdGNoIEByZWYgdG8gcGVyY3B1IG1vZGUuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnZva2VkIGNvbmN1cnJlbnRseQorICogd2l0aCBhbGwgdGhlIGdldC9wdXQgb3BlcmF0aW9ucyBhbmQgY2FuIHNhZmVseSBiZSBtaXhlZCB3aXRoIGtpbGwgYW5kCisgKiByZWluaXQgb3BlcmF0aW9ucy4gIFRoaXMgZnVuY3Rpb24gcmV2ZXJzZXMgdGhlIHN0aWNreSBhdG9taWMgc3RhdGUgc2V0CisgKiBieSBQRVJDUFVfUkVGX0lOSVRfQVRPTUlDIG9yIHBlcmNwdV9yZWZfc3dpdGNoX3RvX2F0b21pYygpLiAgSWYgQHJlZiBpcworICogZHlpbmcgb3IgZGVhZCwgdGhlIGFjdHVhbCBzd2l0Y2hpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIGZvbGxvd2luZworICogcGVyY3B1X3JlZl9yZWluaXQoKS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG1heSBibG9jayBpZiBAcmVmIGlzIGluIHRoZSBwcm9jZXNzIG9mIHN3aXRjaGluZyB0byBhdG9taWMKKyAqIG1vZGUuICBJZiB0aGUgY2FsbGVyIGVuc3VyZXMgdGhhdCBAcmVmIGlzIG5vdCBpbiB0aGUgcHJvY2VzcyBvZgorICogc3dpdGNoaW5nIHRvIGF0b21pYyBtb2RlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgZnJvbSBhbnkgY29udGV4dC4KKyAqLwordm9pZCBwZXJjcHVfcmVmX3N3aXRjaF90b19wZXJjcHUoc3RydWN0IHBlcmNwdV9yZWYgKnJlZikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBlcmNwdV9yZWZfc3dpdGNoX2xvY2ssIGZsYWdzKTsKKworCXJlZi0+Zm9yY2VfYXRvbWljID0gZmFsc2U7CisJX19wZXJjcHVfcmVmX3N3aXRjaF9tb2RlKHJlZiwgTlVMTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJjcHVfcmVmX3N3aXRjaF9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfcmVmX3N3aXRjaF90b19wZXJjcHUpOworCisvKioKKyAqIHBlcmNwdV9yZWZfa2lsbF9hbmRfY29uZmlybSAtIGRyb3AgdGhlIGluaXRpYWwgcmVmIGFuZCBzY2hlZHVsZSBjb25maXJtYXRpb24KKyAqIEByZWY6IHBlcmNwdV9yZWYgdG8ga2lsbAorICogQGNvbmZpcm1fa2lsbDogb3B0aW9uYWwgY29uZmlybWF0aW9uIGNhbGxiYWNrCisgKgorICogRXF1aXZhbGVudCB0byBwZXJjcHVfcmVmX2tpbGwoKSBidXQgYWxzbyBzY2hlZHVsZXMga2lsbCBjb25maXJtYXRpb24gaWYKKyAqIEBjb25maXJtX2tpbGwgaXMgbm90IE5VTEwuICBAY29uZmlybV9raWxsLCB3aGljaCBtYXkgbm90IGJsb2NrLCB3aWxsIGJlCisgKiBjYWxsZWQgYWZ0ZXIgQHJlZiBpcyBzZWVuIGFzIGRlYWQgZnJvbSBhbGwgQ1BVcyBhdCB3aGljaCBwb2ludCBhbGwKKyAqIGZ1cnRoZXIgaW52b2NhdGlvbnMgb2YgcGVyY3B1X3JlZl90cnlnZXRfbGl2ZSgpIHdpbGwgZmFpbC4gIFNlZQorICogcGVyY3B1X3JlZl90cnlnZXRfbGl2ZSgpIGZvciBkZXRhaWxzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gbm9ybWFsbHkgZG9lc24ndCBibG9jayBhbmQgY2FuIGJlIGNhbGxlZCBmcm9tIGFueSBjb250ZXh0CisgKiBidXQgaXQgbWF5IGJsb2NrIGlmIEBjb25maXJtX2tpbGwgaXMgc3BlY2lmaWVkIGFuZCBAcmVmIGlzIGluIHRoZQorICogcHJvY2VzcyBvZiBzd2l0Y2hpbmcgdG8gYXRvbWljIG1vZGUgYnkgcGVyY3B1X3JlZl9zd2l0Y2hfdG9fYXRvbWljKCkuCisgKi8KK3ZvaWQgcGVyY3B1X3JlZl9raWxsX2FuZF9jb25maXJtKHN0cnVjdCBwZXJjcHVfcmVmICpyZWYsCisJCQkJIHBlcmNwdV9yZWZfZnVuY190ICpjb25maXJtX2tpbGwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZXJjcHVfcmVmX3N3aXRjaF9sb2NrLCBmbGFncyk7CisKKwlXQVJOX09OQ0UocmVmLT5wZXJjcHVfY291bnRfcHRyICYgX19QRVJDUFVfUkVGX0RFQUQsCisJCSAgIiVzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiAlcGYhIiwgX19mdW5jX18sIHJlZi0+cmVsZWFzZSk7CisKKwlyZWYtPnBlcmNwdV9jb3VudF9wdHIgfD0gX19QRVJDUFVfUkVGX0RFQUQ7CisJX19wZXJjcHVfcmVmX3N3aXRjaF9tb2RlKHJlZiwgY29uZmlybV9raWxsKTsKKwlwZXJjcHVfcmVmX3B1dChyZWYpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGVyY3B1X3JlZl9zd2l0Y2hfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X3JlZl9raWxsX2FuZF9jb25maXJtKTsKKworLyoqCisgKiBwZXJjcHVfcmVmX3JlaW5pdCAtIHJlLWluaXRpYWxpemUgYSBwZXJjcHUgcmVmY291bnQKKyAqIEByZWY6IHBlcnBjdV9yZWYgdG8gcmUtaW5pdGlhbGl6ZQorICoKKyAqIFJlLWluaXRpYWxpemUgQHJlZiBzbyB0aGF0IGl0J3MgaW4gdGhlIHNhbWUgc3RhdGUgYXMgd2hlbiBpdCBmaW5pc2hlZAorICogcGVyY3B1X3JlZl9pbml0KCkgaWdub3JpbmcgJVBFUkNQVV9SRUZfSU5JVF9ERUFELiAgQHJlZiBtdXN0IGhhdmUgYmVlbgorICogaW5pdGlhbGl6ZWQgc3VjY2Vzc2Z1bGx5IGFuZCByZWFjaGVkIDAgYnV0IG5vdCBleGl0ZWQuCisgKgorICogTm90ZSB0aGF0IHBlcmNwdV9yZWZfdHJ5Z2V0W19saXZlXSgpIGFyZSBzYWZlIHRvIHBlcmZvcm0gb24gQHJlZiB3aGlsZQorICogdGhpcyBmdW5jdGlvbiBpcyBpbiBwcm9ncmVzcy4KKyAqLwordm9pZCBwZXJjcHVfcmVmX3JlaW5pdChzdHJ1Y3QgcGVyY3B1X3JlZiAqcmVmKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyY3B1X3JlZl9zd2l0Y2hfbG9jaywgZmxhZ3MpOworCisJV0FSTl9PTl9PTkNFKCFwZXJjcHVfcmVmX2lzX3plcm8ocmVmKSk7CisKKwlyZWYtPnBlcmNwdV9jb3VudF9wdHIgJj0gfl9fUEVSQ1BVX1JFRl9ERUFEOworCXBlcmNwdV9yZWZfZ2V0KHJlZik7CisJX19wZXJjcHVfcmVmX3N3aXRjaF9tb2RlKHJlZiwgTlVMTCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJjcHVfcmVmX3N3aXRjaF9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfcmVmX3JlaW5pdCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wZXJjcHVfY291bnRlci5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGVyY3B1X2NvdW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzI1NzdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGVyY3B1X2NvdW50ZXIuYwpAQCAtMCwwICsxLDIzOSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBGYXN0IGJhdGNoaW5nIHBlcmNwdSBjb3VudGVycy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvcGVyY3B1X2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnb2JqZWN0cy5oPgorCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCitzdGF0aWMgTElTVF9IRUFEKHBlcmNwdV9jb3VudGVycyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0RFQlVHX09CSkVDVFNfUEVSQ1BVX0NPVU5URVIKKworc3RhdGljIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgcGVyY3B1X2NvdW50ZXJfZGVidWdfZGVzY3I7CisKK3N0YXRpYyBib29sIHBlcmNwdV9jb3VudGVyX2ZpeHVwX2ZyZWUodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpCit7CisJc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMgPSBhZGRyOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgT0RFQlVHX1NUQVRFX0FDVElWRToKKwkJcGVyY3B1X2NvdW50ZXJfZGVzdHJveShmYmMpOworCQlkZWJ1Z19vYmplY3RfZnJlZShmYmMsICZwZXJjcHVfY291bnRlcl9kZWJ1Z19kZXNjcik7CisJCXJldHVybiB0cnVlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyIHBlcmNwdV9jb3VudGVyX2RlYnVnX2Rlc2NyID0geworCS5uYW1lCQk9ICJwZXJjcHVfY291bnRlciIsCisJLmZpeHVwX2ZyZWUJPSBwZXJjcHVfY291bnRlcl9maXh1cF9mcmVlLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3BlcmNwdV9jb3VudGVyX2FjdGl2YXRlKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQoreworCWRlYnVnX29iamVjdF9pbml0KGZiYywgJnBlcmNwdV9jb3VudGVyX2RlYnVnX2Rlc2NyKTsKKwlkZWJ1Z19vYmplY3RfYWN0aXZhdGUoZmJjLCAmcGVyY3B1X2NvdW50ZXJfZGVidWdfZGVzY3IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfcGVyY3B1X2NvdW50ZXJfZGVhY3RpdmF0ZShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3sKKwlkZWJ1Z19vYmplY3RfZGVhY3RpdmF0ZShmYmMsICZwZXJjcHVfY291bnRlcl9kZWJ1Z19kZXNjcik7CisJZGVidWdfb2JqZWN0X2ZyZWUoZmJjLCAmcGVyY3B1X2NvdW50ZXJfZGVidWdfZGVzY3IpOworfQorCisjZWxzZQkvKiBDT05GSUdfREVCVUdfT0JKRUNUU19QRVJDUFVfQ09VTlRFUiAqLworc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3BlcmNwdV9jb3VudGVyX2FjdGl2YXRlKHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjKQoreyB9CitzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfcGVyY3B1X2NvdW50ZXJfZGVhY3RpdmF0ZShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3sgfQorI2VuZGlmCS8qIENPTkZJR19ERUJVR19PQkpFQ1RTX1BFUkNQVV9DT1VOVEVSICovCisKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfc2V0KHN0cnVjdCBwZXJjcHVfY291bnRlciAqZmJjLCBzNjQgYW1vdW50KQoreworCWludCBjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZmJjLT5sb2NrLCBmbGFncyk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlzMzIgKnBjb3VudCA9IHBlcl9jcHVfcHRyKGZiYy0+Y291bnRlcnMsIGNwdSk7CisJCSpwY291bnQgPSAwOworCX0KKwlmYmMtPmNvdW50ID0gYW1vdW50OworCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZmYmMtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0wocGVyY3B1X2NvdW50ZXJfc2V0KTsKKworLyoqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGJvdGggcHJlZW1wdCBhbmQgaXJxIHNhZmUuIFRoZSBmb3JtZXIgaXMgZHVlIHRvIGV4cGxpY2l0CisgKiBwcmVlbXB0aW9uIGRpc2FibGUuIFRoZSBsYXR0ZXIgaXMgZ3VhcmFudGVlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBzbG93IHBhdGgKKyAqIGlzIGV4cGxpY2l0bHkgcHJvdGVjdGVkIGJ5IGFuIGlycS1zYWZlIHNwaW5sb2NrIHdoZXJlYXMgdGhlIGZhc3QgcGF0Y2ggdXNlcworICogdGhpc19jcHVfYWRkIHdoaWNoIGlzIGlycS1zYWZlIGJ5IGRlZmluaXRpb24uIEhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgbXVjaworICogd2l0aCBpcnEgc3RhdGUgYmVmb3JlIGNhbGxpbmcgdGhpcyBvbmUKKyAqLwordm9pZCBwZXJjcHVfY291bnRlcl9hZGRfYmF0Y2goc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCBhbW91bnQsIHMzMiBiYXRjaCkKK3sKKwlzNjQgY291bnQ7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwljb3VudCA9IF9fdGhpc19jcHVfcmVhZCgqZmJjLT5jb3VudGVycykgKyBhbW91bnQ7CisJaWYgKGNvdW50ID49IGJhdGNoIHx8IGNvdW50IDw9IC1iYXRjaCkgeworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmZiYy0+bG9jaywgZmxhZ3MpOworCQlmYmMtPmNvdW50ICs9IGNvdW50OworCQlfX3RoaXNfY3B1X3N1YigqZmJjLT5jb3VudGVycywgY291bnQgLSBhbW91bnQpOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmJjLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJdGhpc19jcHVfYWRkKCpmYmMtPmNvdW50ZXJzLCBhbW91bnQpOworCX0KKwlwcmVlbXB0X2VuYWJsZSgpOworfQorRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9hZGRfYmF0Y2gpOworCisvKgorICogQWRkIHVwIGFsbCB0aGUgcGVyLWNwdSBjb3VudHMsIHJldHVybiB0aGUgcmVzdWx0LiAgVGhpcyBpcyBhIG1vcmUgYWNjdXJhdGUKKyAqIGJ1dCBtdWNoIHNsb3dlciB2ZXJzaW9uIG9mIHBlcmNwdV9jb3VudGVyX3JlYWRfcG9zaXRpdmUoKQorICovCitzNjQgX19wZXJjcHVfY291bnRlcl9zdW0oc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMpCit7CisJczY0IHJldDsKKwlpbnQgY3B1OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJmZiYy0+bG9jaywgZmxhZ3MpOworCXJldCA9IGZiYy0+Y291bnQ7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJczMyICpwY291bnQgPSBwZXJfY3B1X3B0cihmYmMtPmNvdW50ZXJzLCBjcHUpOworCQlyZXQgKz0gKnBjb3VudDsKKwl9CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZiYy0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKF9fcGVyY3B1X2NvdW50ZXJfc3VtKTsKKworaW50IF9fcGVyY3B1X2NvdW50ZXJfaW5pdChzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYywgczY0IGFtb3VudCwgZ2ZwX3QgZ2ZwLAorCQkJICBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmtleSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzIF9fbWF5YmVfdW51c2VkOworCisJcmF3X3NwaW5fbG9ja19pbml0KCZmYmMtPmxvY2spOworCWxvY2tkZXBfc2V0X2NsYXNzKCZmYmMtPmxvY2ssIGtleSk7CisJZmJjLT5jb3VudCA9IGFtb3VudDsKKwlmYmMtPmNvdW50ZXJzID0gYWxsb2NfcGVyY3B1X2dmcChzMzIsIGdmcCk7CisJaWYgKCFmYmMtPmNvdW50ZXJzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlYnVnX3BlcmNwdV9jb3VudGVyX2FjdGl2YXRlKGZiYyk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlJTklUX0xJU1RfSEVBRCgmZmJjLT5saXN0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyY3B1X2NvdW50ZXJzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZCgmZmJjLT5saXN0LCAmcGVyY3B1X2NvdW50ZXJzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJjcHVfY291bnRlcnNfbG9jaywgZmxhZ3MpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKF9fcGVyY3B1X2NvdW50ZXJfaW5pdCk7CisKK3ZvaWQgcGVyY3B1X2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgKmZiYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzIF9fbWF5YmVfdW51c2VkOworCisJaWYgKCFmYmMtPmNvdW50ZXJzKQorCQlyZXR1cm47CisKKwlkZWJ1Z19wZXJjcHVfY291bnRlcl9kZWFjdGl2YXRlKGZiYyk7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyY3B1X2NvdW50ZXJzX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2RlbCgmZmJjLT5saXN0KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZXJjcHVfY291bnRlcnNfbG9jaywgZmxhZ3MpOworI2VuZGlmCisJZnJlZV9wZXJjcHUoZmJjLT5jb3VudGVycyk7CisJZmJjLT5jb3VudGVycyA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKHBlcmNwdV9jb3VudGVyX2Rlc3Ryb3kpOworCitpbnQgcGVyY3B1X2NvdW50ZXJfYmF0Y2ggX19yZWFkX21vc3RseSA9IDMyOworRVhQT1JUX1NZTUJPTChwZXJjcHVfY291bnRlcl9iYXRjaCk7CisKK3N0YXRpYyBpbnQgY29tcHV0ZV9iYXRjaF92YWx1ZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWludCBuciA9IG51bV9vbmxpbmVfY3B1cygpOworCisJcGVyY3B1X2NvdW50ZXJfYmF0Y2ggPSBtYXgoMzIsIG5yKjIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmNwdV9jb3VudGVyX2NwdV9kZWFkKHVuc2lnbmVkIGludCBjcHUpCit7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmM7CisKKwljb21wdXRlX2JhdGNoX3ZhbHVlKGNwdSk7CisKKwlzcGluX2xvY2tfaXJxKCZwZXJjcHVfY291bnRlcnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmYmMsICZwZXJjcHVfY291bnRlcnMsIGxpc3QpIHsKKwkJczMyICpwY291bnQ7CisKKwkJcmF3X3NwaW5fbG9jaygmZmJjLT5sb2NrKTsKKwkJcGNvdW50ID0gcGVyX2NwdV9wdHIoZmJjLT5jb3VudGVycywgY3B1KTsKKwkJZmJjLT5jb3VudCArPSAqcGNvdW50OworCQkqcGNvdW50ID0gMDsKKwkJcmF3X3NwaW5fdW5sb2NrKCZmYmMtPmxvY2spOworCX0KKwlzcGluX3VubG9ja19pcnEoJnBlcmNwdV9jb3VudGVyc19sb2NrKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisvKgorICogQ29tcGFyZSBjb3VudGVyIGFnYWluc3QgZ2l2ZW4gdmFsdWUuCisgKiBSZXR1cm4gMSBpZiBncmVhdGVyLCAwIGlmIGVxdWFsIGFuZCAtMSBpZiBsZXNzCisgKi8KK2ludCBfX3BlcmNwdV9jb3VudGVyX2NvbXBhcmUoc3RydWN0IHBlcmNwdV9jb3VudGVyICpmYmMsIHM2NCByaHMsIHMzMiBiYXRjaCkKK3sKKwlzNjQJY291bnQ7CisKKwljb3VudCA9IHBlcmNwdV9jb3VudGVyX3JlYWQoZmJjKTsKKwkvKiBDaGVjayB0byBzZWUgaWYgcm91Z2ggY291bnQgd2lsbCBiZSBzdWZmaWNpZW50IGZvciBjb21wYXJpc29uICovCisJaWYgKGFicyhjb3VudCAtIHJocykgPiAoYmF0Y2ggKiBudW1fb25saW5lX2NwdXMoKSkpIHsKKwkJaWYgKGNvdW50ID4gcmhzKQorCQkJcmV0dXJuIDE7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKwl9CisJLyogTmVlZCB0byB1c2UgcHJlY2lzZSBjb3VudCAqLworCWNvdW50ID0gcGVyY3B1X2NvdW50ZXJfc3VtKGZiYyk7CisJaWYgKGNvdW50ID4gcmhzKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmIChjb3VudCA8IHJocykKKwkJcmV0dXJuIC0xOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKF9fcGVyY3B1X2NvdW50ZXJfY29tcGFyZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBlcmNwdV9jb3VudGVyX3N0YXJ0dXAodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY3B1aHBfc2V0dXBfc3RhdGUoQ1BVSFBfQVBfT05MSU5FX0RZTiwgImxpYi9wZXJjcHVfY250Om9ubGluZSIsCisJCQkJY29tcHV0ZV9iYXRjaF92YWx1ZSwgTlVMTCk7CisJV0FSTl9PTihyZXQgPCAwKTsKKwlyZXQgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQX1BFUkNQVV9DTlRfREVBRCwKKwkJCQkJImxpYi9wZXJjcHVfY250OmRlYWQiLCBOVUxMLAorCQkJCQlwZXJjcHVfY291bnRlcl9jcHVfZGVhZCk7CisJV0FSTl9PTihyZXQgPCAwKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHBlcmNwdV9jb3VudGVyX3N0YXJ0dXApOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGVyY3B1X2lkYS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGVyY3B1X2lkYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMTZmMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wZXJjcHVfaWRhLmMKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgKiBQZXJjcHUgSURBIGxpYnJhcnkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgRGF0ZXJhLCBJbmMuIEtlbnQgT3ZlcnN0cmVldAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0CisgKiB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHVfaWRhLmg+CisKK3N0cnVjdCBwZXJjcHVfaWRhX2NwdSB7CisJLyoKKwkgKiBFdmVuIHRob3VnaCB0aGlzIGlzIHBlcmNwdSwgd2UgbmVlZCBhIGxvY2sgZm9yIHRhZyBzdGVhbGluZyBieSByZW1vdGUKKwkgKiBDUFVzOgorCSAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCisJLyogbnJfZnJlZS9mcmVlbGlzdCBmb3JtIGEgc3RhY2sgb2YgZnJlZSBJRHMgKi8KKwl1bnNpZ25lZAkJCW5yX2ZyZWU7CisJdW5zaWduZWQJCQlmcmVlbGlzdFtdOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIG1vdmVfdGFncyh1bnNpZ25lZCAqZHN0LCB1bnNpZ25lZCAqZHN0X25yLAorCQkJICAgICB1bnNpZ25lZCAqc3JjLCB1bnNpZ25lZCAqc3JjX25yLAorCQkJICAgICB1bnNpZ25lZCBucikKK3sKKwkqc3JjX25yIC09IG5yOworCW1lbWNweShkc3QgKyAqZHN0X25yLCBzcmMgKyAqc3JjX25yLCBzaXplb2YodW5zaWduZWQpICogbnIpOworCSpkc3RfbnIgKz0gbnI7Cit9CisKKy8qCisgKiBUcnkgdG8gc3RlYWwgdGFncyBmcm9tIGEgcmVtb3RlIGNwdSdzIHBlcmNwdSBmcmVlbGlzdC4KKyAqCisgKiBXZSBmaXJzdCBjaGVjayBob3cgbWFueSBwZXJjcHUgZnJlZWxpc3RzIGhhdmUgdGFncworICoKKyAqIFRoZW4gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBjcHVzIHVudGlsIHdlIGZpbmQgc29tZSB0YWdzIC0gd2UgZG9uJ3QgYXR0ZW1wdAorICogdG8gZmluZCB0aGUgImJlc3QiIGNwdSB0byBzdGVhbCBmcm9tLCB0byBrZWVwIGNhY2hlbGluZSBib3VuY2luZyB0byBhCisgKiBtaW5pbXVtLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3RlYWxfdGFncyhzdHJ1Y3QgcGVyY3B1X2lkYSAqcG9vbCwKKwkJCSAgICAgIHN0cnVjdCBwZXJjcHVfaWRhX2NwdSAqdGFncykKK3sKKwl1bnNpZ25lZCBjcHVzX2hhdmVfdGFncywgY3B1ID0gcG9vbC0+Y3B1X2xhc3Rfc3RvbGVuOworCXN0cnVjdCBwZXJjcHVfaWRhX2NwdSAqcmVtb3RlOworCisJZm9yIChjcHVzX2hhdmVfdGFncyA9IGNwdW1hc2tfd2VpZ2h0KCZwb29sLT5jcHVzX2hhdmVfdGFncyk7CisJICAgICBjcHVzX2hhdmVfdGFnczsgY3B1c19oYXZlX3RhZ3MtLSkgeworCQljcHUgPSBjcHVtYXNrX25leHQoY3B1LCAmcG9vbC0+Y3B1c19oYXZlX3RhZ3MpOworCisJCWlmIChjcHUgPj0gbnJfY3B1X2lkcykgeworCQkJY3B1ID0gY3B1bWFza19maXJzdCgmcG9vbC0+Y3B1c19oYXZlX3RhZ3MpOworCQkJaWYgKGNwdSA+PSBucl9jcHVfaWRzKQorCQkJCUJVRygpOworCQl9CisKKwkJcG9vbC0+Y3B1X2xhc3Rfc3RvbGVuID0gY3B1OworCQlyZW1vdGUgPSBwZXJfY3B1X3B0cihwb29sLT50YWdfY3B1LCBjcHUpOworCisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgJnBvb2wtPmNwdXNfaGF2ZV90YWdzKTsKKworCQlpZiAocmVtb3RlID09IHRhZ3MpCisJCQljb250aW51ZTsKKworCQlzcGluX2xvY2soJnJlbW90ZS0+bG9jayk7CisKKwkJaWYgKHJlbW90ZS0+bnJfZnJlZSkgeworCQkJbWVtY3B5KHRhZ3MtPmZyZWVsaXN0LAorCQkJICAgICAgIHJlbW90ZS0+ZnJlZWxpc3QsCisJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkKSAqIHJlbW90ZS0+bnJfZnJlZSk7CisKKwkJCXRhZ3MtPm5yX2ZyZWUgPSByZW1vdGUtPm5yX2ZyZWU7CisJCQlyZW1vdGUtPm5yX2ZyZWUgPSAwOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnJlbW90ZS0+bG9jayk7CisKKwkJaWYgKHRhZ3MtPm5yX2ZyZWUpCisJCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBQb3AgdXAgdG8gSURBX1BDUFVfQkFUQ0hfTU9WRSBJRHMgb2ZmIHRoZSBnbG9iYWwgZnJlZWxpc3QsIGFuZCBwdXNoIHRoZW0gb250bworICogb3VyIHBlcmNwdSBmcmVlbGlzdDoKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGFsbG9jX2dsb2JhbF90YWdzKHN0cnVjdCBwZXJjcHVfaWRhICpwb29sLAorCQkJCSAgICAgc3RydWN0IHBlcmNwdV9pZGFfY3B1ICp0YWdzKQoreworCW1vdmVfdGFncyh0YWdzLT5mcmVlbGlzdCwgJnRhZ3MtPm5yX2ZyZWUsCisJCSAgcG9vbC0+ZnJlZWxpc3QsICZwb29sLT5ucl9mcmVlLAorCQkgIG1pbihwb29sLT5ucl9mcmVlLCBwb29sLT5wZXJjcHVfYmF0Y2hfc2l6ZSkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGFsbG9jX2xvY2FsX3RhZyhzdHJ1Y3QgcGVyY3B1X2lkYV9jcHUgKnRhZ3MpCit7CisJaW50IHRhZyA9IC1FTk9TUEM7CisKKwlzcGluX2xvY2soJnRhZ3MtPmxvY2spOworCWlmICh0YWdzLT5ucl9mcmVlKQorCQl0YWcgPSB0YWdzLT5mcmVlbGlzdFstLXRhZ3MtPm5yX2ZyZWVdOworCXNwaW5fdW5sb2NrKCZ0YWdzLT5sb2NrKTsKKworCXJldHVybiB0YWc7Cit9CisKKy8qKgorICogcGVyY3B1X2lkYV9hbGxvYyAtIGFsbG9jYXRlIGEgdGFnCisgKiBAcG9vbDogcG9vbCB0byBhbGxvY2F0ZSBmcm9tCisgKiBAc3RhdGU6IHRhc2sgc3RhdGUgZm9yIHByZXBhcmVfdG9fd2FpdAorICoKKyAqIFJldHVybnMgYSB0YWcgLSBhbiBpbnRlZ2VyIGluIHRoZSByYW5nZSBbMC4ubnJfdGFncykgKHBhc3NlZCB0bworICogdGFnX3Bvb2xfaW5pdCgpKSwgb3Igb3RoZXJ3aXNlIC1FTk9TUEMgb24gYWxsb2NhdGlvbiBmYWlsdXJlLgorICoKKyAqIFNhZmUgdG8gYmUgY2FsbGVkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgKGFzc3VtaW5nIGl0IGlzbid0IHBhc3NlZAorICogVEFTS19VTklOVEVSUlVQVElCTEUgfCBUQVNLX0lOVEVSUlVQVElCTEUsIG9mIGNvdXJzZSkuCisgKgorICogQGdmcCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gd2FpdCB1bnRpbCBhIGZyZWUgaWQgaXMgYXZhaWxhYmxlIChpdCdzIG5vdAorICogdXNlZCBmb3IgaW50ZXJuYWwgbWVtb3J5IGFsbG9jYXRpb25zKTsgdGh1cyBpZiBwYXNzZWQgX19HRlBfUkVDTEFJTSB3ZSBtYXkgc2xlZXAKKyAqIGhvd2V2ZXIgbG9uZyBpdCB0YWtlcyB1bnRpbCBhbm90aGVyIHRocmVhZCBmcmVlcyBhbiBpZCAoc2FtZSBzZW1hbnRpY3MgYXMgYQorICogbWVtcG9vbCkuCisgKgorICogV2lsbCBub3QgZmFpbCBpZiBwYXNzZWQgVEFTS19VTklOVEVSUlVQVElCTEUgfCBUQVNLX0lOVEVSUlVQVElCTEUuCisgKi8KK2ludCBwZXJjcHVfaWRhX2FsbG9jKHN0cnVjdCBwZXJjcHVfaWRhICpwb29sLCBpbnQgc3RhdGUpCit7CisJREVGSU5FX1dBSVQod2FpdCk7CisJc3RydWN0IHBlcmNwdV9pZGFfY3B1ICp0YWdzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHRhZzsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0YWdzID0gdGhpc19jcHVfcHRyKHBvb2wtPnRhZ19jcHUpOworCisJLyogRmFzdHBhdGggKi8KKwl0YWcgPSBhbGxvY19sb2NhbF90YWcodGFncyk7CisJaWYgKGxpa2VseSh0YWcgPj0gMCkpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gdGFnOworCX0KKworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisKKwkJLyoKKwkJICogcHJlcGFyZV90b193YWl0KCkgbXVzdCBjb21lIGJlZm9yZSBzdGVhbF90YWdzKCksIGluIGNhc2UKKwkJICogcGVyY3B1X2lkYV9mcmVlKCkgb24gYW5vdGhlciBjcHUgZmxpcHMgYSBiaXQgaW4KKwkJICogY3B1c19oYXZlX3RhZ3MKKwkJICoKKwkJICogZ2xvYmFsIGxvY2sgaGVsZCBhbmQgaXJxcyBkaXNhYmxlZCwgZG9uJ3QgbmVlZCBwZXJjcHUgbG9jaworCQkgKi8KKwkJaWYgKHN0YXRlICE9IFRBU0tfUlVOTklORykKKwkJCXByZXBhcmVfdG9fd2FpdCgmcG9vbC0+d2FpdCwgJndhaXQsIHN0YXRlKTsKKworCQlpZiAoIXRhZ3MtPm5yX2ZyZWUpCisJCQlhbGxvY19nbG9iYWxfdGFncyhwb29sLCB0YWdzKTsKKwkJaWYgKCF0YWdzLT5ucl9mcmVlKQorCQkJc3RlYWxfdGFncyhwb29sLCB0YWdzKTsKKworCQlpZiAodGFncy0+bnJfZnJlZSkgeworCQkJdGFnID0gdGFncy0+ZnJlZWxpc3RbLS10YWdzLT5ucl9mcmVlXTsKKwkJCWlmICh0YWdzLT5ucl9mcmVlKQorCQkJCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksCisJCQkJCQkmcG9vbC0+Y3B1c19oYXZlX3RhZ3MpOworCQl9CisKKwkJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJaWYgKHRhZyA+PSAwIHx8IHN0YXRlID09IFRBU0tfUlVOTklORykKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZ19zdGF0ZShzdGF0ZSwgY3VycmVudCkpIHsKKwkJCXRhZyA9IC1FUkVTVEFSVFNZUzsKKwkJCWJyZWFrOworCQl9CisKKwkJc2NoZWR1bGUoKTsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXRhZ3MgPSB0aGlzX2NwdV9wdHIocG9vbC0+dGFnX2NwdSk7CisJfQorCWlmIChzdGF0ZSAhPSBUQVNLX1JVTk5JTkcpCisJCWZpbmlzaF93YWl0KCZwb29sLT53YWl0LCAmd2FpdCk7CisKKwlyZXR1cm4gdGFnOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X2lkYV9hbGxvYyk7CisKKy8qKgorICogcGVyY3B1X2lkYV9mcmVlIC0gZnJlZSBhIHRhZworICogQHBvb2w6IHBvb2wgQHRhZyB3YXMgYWxsb2NhdGVkIGZyb20KKyAqIEB0YWc6IGEgdGFnIHByZXZpb3VzbHkgYWxsb2NhdGVkIHdpdGggcGVyY3B1X2lkYV9hbGxvYygpCisgKgorICogU2FmZSB0byBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCBwZXJjcHVfaWRhX2ZyZWUoc3RydWN0IHBlcmNwdV9pZGEgKnBvb2wsIHVuc2lnbmVkIHRhZykKK3sKKwlzdHJ1Y3QgcGVyY3B1X2lkYV9jcHUgKnRhZ3M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBucl9mcmVlOworCisJQlVHX09OKHRhZyA+PSBwb29sLT5ucl90YWdzKTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl0YWdzID0gdGhpc19jcHVfcHRyKHBvb2wtPnRhZ19jcHUpOworCisJc3Bpbl9sb2NrKCZ0YWdzLT5sb2NrKTsKKwl0YWdzLT5mcmVlbGlzdFt0YWdzLT5ucl9mcmVlKytdID0gdGFnOworCisJbnJfZnJlZSA9IHRhZ3MtPm5yX2ZyZWU7CisJc3Bpbl91bmxvY2soJnRhZ3MtPmxvY2spOworCisJaWYgKG5yX2ZyZWUgPT0gMSkgeworCQljcHVtYXNrX3NldF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCSZwb29sLT5jcHVzX2hhdmVfdGFncyk7CisJCXdha2VfdXAoJnBvb2wtPndhaXQpOworCX0KKworCWlmIChucl9mcmVlID09IHBvb2wtPnBlcmNwdV9tYXhfc2l6ZSkgeworCQlzcGluX2xvY2soJnBvb2wtPmxvY2spOworCisJCS8qCisJCSAqIEdsb2JhbCBsb2NrIGhlbGQgYW5kIGlycXMgZGlzYWJsZWQsIGRvbid0IG5lZWQgcGVyY3B1CisJCSAqIGxvY2sKKwkJICovCisJCWlmICh0YWdzLT5ucl9mcmVlID09IHBvb2wtPnBlcmNwdV9tYXhfc2l6ZSkgeworCQkJbW92ZV90YWdzKHBvb2wtPmZyZWVsaXN0LCAmcG9vbC0+bnJfZnJlZSwKKwkJCQkgIHRhZ3MtPmZyZWVsaXN0LCAmdGFncy0+bnJfZnJlZSwKKwkJCQkgIHBvb2wtPnBlcmNwdV9iYXRjaF9zaXplKTsKKworCQkJd2FrZV91cCgmcG9vbC0+d2FpdCk7CisJCX0KKwkJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOworCX0KKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV9pZGFfZnJlZSk7CisKKy8qKgorICogcGVyY3B1X2lkYV9kZXN0cm95IC0gcmVsZWFzZSBhIHRhZyBwb29sJ3MgcmVzb3VyY2VzCisgKiBAcG9vbDogcG9vbCB0byBmcmVlCisgKgorICogRnJlZXMgdGhlIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgcGVyY3B1X2lkYV9pbml0KCkuCisgKi8KK3ZvaWQgcGVyY3B1X2lkYV9kZXN0cm95KHN0cnVjdCBwZXJjcHVfaWRhICpwb29sKQoreworCWZyZWVfcGVyY3B1KHBvb2wtPnRhZ19jcHUpOworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHBvb2wtPmZyZWVsaXN0LAorCQkgICBnZXRfb3JkZXIocG9vbC0+bnJfdGFncyAqIHNpemVvZih1bnNpZ25lZCkpKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBlcmNwdV9pZGFfZGVzdHJveSk7CisKKy8qKgorICogcGVyY3B1X2lkYV9pbml0IC0gaW5pdGlhbGl6ZSBhIHBlcmNwdSB0YWcgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gaW5pdGlhbGl6ZQorICogQG5yX3RhZ3M6IG51bWJlciBvZiB0YWdzIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24KKyAqCisgKiBJbml0aWFsaXplcyBAcG9vbCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGFsbG9jYXRlIHRhZ3MgLSBpbnRlZ2VycyBpbiB0aGUKKyAqIHJhbmdlIFswLCBucl90YWdzKS4gVHlwaWNhbGx5LCB0aGV5J2xsIGJlIHVzZWQgYnkgZHJpdmVyIGNvZGUgdG8gcmVmZXIgdG8gYQorICogcHJlYWxsb2NhdGVkIGFycmF5IG9mIHRhZyBzdHJ1Y3R1cmVzLgorICoKKyAqIEFsbG9jYXRpb24gaXMgcGVyY3B1LCBidXQgc2hhcmRpbmcgaXMgbGltaXRlZCBieSBucl90YWdzIC0gZm9yIGJlc3QKKyAqIHBlcmZvcm1hbmNlLCB0aGUgd29ya2xvYWQgc2hvdWxkIG5vdCBzcGFuIG1vcmUgY3B1cyB0aGFuIG5yX3RhZ3MgLyAxMjguCisgKi8KK2ludCBfX3BlcmNwdV9pZGFfaW5pdChzdHJ1Y3QgcGVyY3B1X2lkYSAqcG9vbCwgdW5zaWduZWQgbG9uZyBucl90YWdzLAorCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUsIHVuc2lnbmVkIGxvbmcgYmF0Y2hfc2l6ZSkKK3sKKwl1bnNpZ25lZCBpLCBjcHUsIG9yZGVyOworCisJbWVtc2V0KHBvb2wsIDAsIHNpemVvZigqcG9vbCkpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcG9vbC0+d2FpdCk7CisJc3Bpbl9sb2NrX2luaXQoJnBvb2wtPmxvY2spOworCXBvb2wtPm5yX3RhZ3MgPSBucl90YWdzOworCXBvb2wtPnBlcmNwdV9tYXhfc2l6ZSA9IG1heF9zaXplOworCXBvb2wtPnBlcmNwdV9iYXRjaF9zaXplID0gYmF0Y2hfc2l6ZTsKKworCS8qIEd1YXJkIGFnYWluc3Qgb3ZlcmZsb3cgKi8KKwlpZiAobnJfdGFncyA+ICh1bnNpZ25lZCkgSU5UX01BWCArIDEpIHsKKwkJcHJfZXJyKCJwZXJjcHVfaWRhX2luaXQoKTogbnJfdGFncyB0b28gbGFyZ2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlvcmRlciA9IGdldF9vcmRlcihucl90YWdzICogc2l6ZW9mKHVuc2lnbmVkKSk7CisJcG9vbC0+ZnJlZWxpc3QgPSAodm9pZCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlpZiAoIXBvb2wtPmZyZWVsaXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBucl90YWdzOyBpKyspCisJCXBvb2wtPmZyZWVsaXN0W2ldID0gaTsKKworCXBvb2wtPm5yX2ZyZWUgPSBucl90YWdzOworCisJcG9vbC0+dGFnX2NwdSA9IF9fYWxsb2NfcGVyY3B1KHNpemVvZihzdHJ1Y3QgcGVyY3B1X2lkYV9jcHUpICsKKwkJCQkgICAgICAgcG9vbC0+cGVyY3B1X21heF9zaXplICogc2l6ZW9mKHVuc2lnbmVkKSwKKwkJCQkgICAgICAgc2l6ZW9mKHVuc2lnbmVkKSk7CisJaWYgKCFwb29sLT50YWdfY3B1KQorCQlnb3RvIGVycjsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1X3B0cihwb29sLT50YWdfY3B1LCBjcHUpLT5sb2NrKTsKKworCXJldHVybiAwOworZXJyOgorCXBlcmNwdV9pZGFfZGVzdHJveShwb29sKTsKKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fcGVyY3B1X2lkYV9pbml0KTsKKworLyoqCisgKiBwZXJjcHVfaWRhX2Zvcl9lYWNoX2ZyZWUgLSBpdGVyYXRlIGZyZWUgaWRzIG9mIGEgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gaXRlcmF0ZQorICogQGZuOiBpbnRlcmF0ZSBjYWxsYmFjayBmdW5jdGlvbgorICogQGRhdGE6IHBhcmFtZXRlciBmb3IgQGZuCisgKgorICogTm90ZSwgdGhpcyBkb2Vzbid0IGd1YXJhbnRlZSB0byBpdGVyYXRlIGFsbCBmcmVlIGlkcyByZXN0cmljdGx5LiBTb21lIGZyZWUKKyAqIGlkcyBtaWdodCBiZSBtaXNzZWQsIHNvbWUgbWlnaHQgYmUgaXRlcmF0ZWQgZHVwbGljYXRlZCwgYW5kIHNvbWUgbWlnaHQKKyAqIGJlIGl0ZXJhdGVkIGFuZCBub3QgZnJlZSBzb29uLgorICovCitpbnQgcGVyY3B1X2lkYV9mb3JfZWFjaF9mcmVlKHN0cnVjdCBwZXJjcHVfaWRhICpwb29sLCBwZXJjcHVfaWRhX2NiIGZuLAorCXZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcGVyY3B1X2lkYV9jcHUgKnJlbW90ZTsKKwl1bnNpZ25lZCBjcHUsIGksIGVyciA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlyZW1vdGUgPSBwZXJfY3B1X3B0cihwb29sLT50YWdfY3B1LCBjcHUpOworCQlzcGluX2xvY2soJnJlbW90ZS0+bG9jayk7CisJCWZvciAoaSA9IDA7IGkgPCByZW1vdGUtPm5yX2ZyZWU7IGkrKykgeworCQkJZXJyID0gZm4ocmVtb3RlLT5mcmVlbGlzdFtpXSwgZGF0YSk7CisJCQlpZiAoZXJyKQorCQkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrKCZyZW1vdGUtPmxvY2spOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJc3Bpbl9sb2NrKCZwb29sLT5sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG9vbC0+bnJfZnJlZTsgaSsrKSB7CisJCWVyciA9IGZuKHBvb2wtPmZyZWVsaXN0W2ldLCBkYXRhKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmcG9vbC0+bG9jayk7CitvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwZXJjcHVfaWRhX2Zvcl9lYWNoX2ZyZWUpOworCisvKioKKyAqIHBlcmNwdV9pZGFfZnJlZV90YWdzIC0gcmV0dXJuIGZyZWUgdGFncyBudW1iZXIgb2YgYSBzcGVjaWZpYyBjcHUgb3IgZ2xvYmFsIHBvb2wKKyAqIEBwb29sOiBwb29sIHJlbGF0ZWQKKyAqIEBjcHU6IHNwZWNpZmljIGNwdSBvciBnbG9iYWwgcG9vbCBpZiBAY3B1ID09IG5yX2NwdV9pZHMKKyAqCisgKiBOb3RlOiB0aGlzIGp1c3QgcmV0dXJucyBhIHNuYXBzaG90IG9mIGZyZWUgdGFncyBudW1iZXIuCisgKi8KK3Vuc2lnbmVkIHBlcmNwdV9pZGFfZnJlZV90YWdzKHN0cnVjdCBwZXJjcHVfaWRhICpwb29sLCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJjcHVfaWRhX2NwdSAqcmVtb3RlOworCWlmIChjcHUgPT0gbnJfY3B1X2lkcykKKwkJcmV0dXJuIHBvb2wtPm5yX2ZyZWU7CisJcmVtb3RlID0gcGVyX2NwdV9wdHIocG9vbC0+dGFnX2NwdSwgY3B1KTsKKwlyZXR1cm4gcmVtb3RlLT5ucl9mcmVlOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyY3B1X2lkYV9mcmVlX3RhZ3MpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGVyY3B1X3Rlc3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3BlcmNwdV90ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ZDE0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3BlcmNwdV90ZXN0LmMKQEAgLTAsMCArMSwxMzggQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogdmFsaWRhdGUgQG5hdGl2ZSBhbmQgQHBjcCBjb3VudGVyIHZhbHVlcyBtYXRjaCBAZXhwZWN0ZWQgKi8KKyNkZWZpbmUgQ0hFQ0sobmF0aXZlLCBwY3AsIGV4cGVjdGVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlXQVJOKChuYXRpdmUpICE9IChleHBlY3RlZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgICAicmF3ICVsZCAoMHglbHgpICE9IGV4cGVjdGVkICVsbGQgKDB4JWxseCkiLAlcCisJCSAgICAgKG5hdGl2ZSksIChuYXRpdmUpLAkJCQlcCisJCSAgICAgKGxvbmcgbG9uZykoZXhwZWN0ZWQpLCAobG9uZyBsb25nKShleHBlY3RlZCkpOwlcCisJCVdBUk4oX190aGlzX2NwdV9yZWFkKHBjcCkgIT0gKGV4cGVjdGVkKSwgICAgICAgICAgICAgICAgXAorCQkgICAgICJwY3AgJWxkICgweCVseCkgIT0gZXhwZWN0ZWQgJWxsZCAoMHglbGx4KSIsCVwKKwkJICAgICBfX3RoaXNfY3B1X3JlYWQocGNwKSwgX190aGlzX2NwdV9yZWFkKHBjcCksCVwKKwkJICAgICAobG9uZyBsb25nKShleHBlY3RlZCksIChsb25nIGxvbmcpKGV4cGVjdGVkKSk7CVwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUobG9uZywgbG9uZ19jb3VudGVyKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB1bG9uZ19jb3VudGVyKTsKKworc3RhdGljIGludCBfX2luaXQgcGVyY3B1X3Rlc3RfaW5pdCh2b2lkKQoreworCS8qCisJICogdm9sYXRpbGUgcHJldmVudHMgY29tcGlsZXIgZnJvbSBvcHRpbWl6aW5nIGl0IHVzZXMsIG90aGVyd2lzZSB0aGUKKwkgKiArdWxfb25lLy11bF9vbmUgYmVsb3cgd291bGQgcmVwbGFjZSB3aXRoIGluYy9kZWMgaW5zdHJ1Y3Rpb25zLgorCSAqLworCXZvbGF0aWxlIHVuc2lnbmVkIGludCB1aV9vbmUgPSAxOworCWxvbmcgbCA9IDA7CisJdW5zaWduZWQgbG9uZyB1bCA9IDA7CisKKwlwcl9pbmZvKCJwZXJjcHUgdGVzdCBzdGFydFxuIik7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCWwgKz0gLTE7CisJX190aGlzX2NwdV9hZGQobG9uZ19jb3VudGVyLCAtMSk7CisJQ0hFQ0sobCwgbG9uZ19jb3VudGVyLCAtMSk7CisKKwlsICs9IDE7CisJX190aGlzX2NwdV9hZGQobG9uZ19jb3VudGVyLCAxKTsKKwlDSEVDSyhsLCBsb25nX2NvdW50ZXIsIDApOworCisJdWwgPSAwOworCV9fdGhpc19jcHVfd3JpdGUodWxvbmdfY291bnRlciwgMCk7CisKKwl1bCArPSAxVUw7CisJX190aGlzX2NwdV9hZGQodWxvbmdfY291bnRlciwgMVVMKTsKKwlDSEVDSyh1bCwgdWxvbmdfY291bnRlciwgMSk7CisKKwl1bCArPSAtMVVMOworCV9fdGhpc19jcHVfYWRkKHVsb25nX2NvdW50ZXIsIC0xVUwpOworCUNIRUNLKHVsLCB1bG9uZ19jb3VudGVyLCAwKTsKKworCXVsICs9IC0odW5zaWduZWQgbG9uZykxOworCV9fdGhpc19jcHVfYWRkKHVsb25nX2NvdW50ZXIsIC0odW5zaWduZWQgbG9uZykxKTsKKwlDSEVDSyh1bCwgdWxvbmdfY291bnRlciwgLTEpOworCisJdWwgPSAwOworCV9fdGhpc19jcHVfd3JpdGUodWxvbmdfY291bnRlciwgMCk7CisKKwl1bCAtPSAxOworCV9fdGhpc19jcHVfZGVjKHVsb25nX2NvdW50ZXIpOworCUNIRUNLKHVsLCB1bG9uZ19jb3VudGVyLCAtMSk7CisJQ0hFQ0sodWwsIHVsb25nX2NvdW50ZXIsIFVMT05HX01BWCk7CisKKwlsICs9IC11aV9vbmU7CisJX190aGlzX2NwdV9hZGQobG9uZ19jb3VudGVyLCAtdWlfb25lKTsKKwlDSEVDSyhsLCBsb25nX2NvdW50ZXIsIDB4ZmZmZmZmZmYpOworCisJbCArPSB1aV9vbmU7CisJX190aGlzX2NwdV9hZGQobG9uZ19jb3VudGVyLCB1aV9vbmUpOworCUNIRUNLKGwsIGxvbmdfY291bnRlciwgKGxvbmcpMHgxMDAwMDAwMDBMTCk7CisKKworCWwgPSAwOworCV9fdGhpc19jcHVfd3JpdGUobG9uZ19jb3VudGVyLCAwKTsKKworCWwgLT0gdWlfb25lOworCV9fdGhpc19jcHVfc3ViKGxvbmdfY291bnRlciwgdWlfb25lKTsKKwlDSEVDSyhsLCBsb25nX2NvdW50ZXIsIC0xKTsKKworCWwgPSAwOworCV9fdGhpc19jcHVfd3JpdGUobG9uZ19jb3VudGVyLCAwKTsKKworCWwgKz0gdWlfb25lOworCV9fdGhpc19jcHVfYWRkKGxvbmdfY291bnRlciwgdWlfb25lKTsKKwlDSEVDSyhsLCBsb25nX2NvdW50ZXIsIDEpOworCisJbCArPSAtdWlfb25lOworCV9fdGhpc19jcHVfYWRkKGxvbmdfY291bnRlciwgLXVpX29uZSk7CisJQ0hFQ0sobCwgbG9uZ19jb3VudGVyLCAobG9uZykweDEwMDAwMDAwMExMKTsKKworCWwgPSAwOworCV9fdGhpc19jcHVfd3JpdGUobG9uZ19jb3VudGVyLCAwKTsKKworCWwgLT0gdWlfb25lOworCXRoaXNfY3B1X3N1Yihsb25nX2NvdW50ZXIsIHVpX29uZSk7CisJQ0hFQ0sobCwgbG9uZ19jb3VudGVyLCAtMSk7CisJQ0hFQ0sobCwgbG9uZ19jb3VudGVyLCBVTE9OR19NQVgpOworCisJdWwgPSAwOworCV9fdGhpc19jcHVfd3JpdGUodWxvbmdfY291bnRlciwgMCk7CisKKwl1bCArPSB1aV9vbmU7CisJX190aGlzX2NwdV9hZGQodWxvbmdfY291bnRlciwgdWlfb25lKTsKKwlDSEVDSyh1bCwgdWxvbmdfY291bnRlciwgMSk7CisKKwl1bCA9IDA7CisJX190aGlzX2NwdV93cml0ZSh1bG9uZ19jb3VudGVyLCAwKTsKKworCXVsIC09IHVpX29uZTsKKwlfX3RoaXNfY3B1X3N1Yih1bG9uZ19jb3VudGVyLCB1aV9vbmUpOworCUNIRUNLKHVsLCB1bG9uZ19jb3VudGVyLCAtMSk7CisJQ0hFQ0sodWwsIHVsb25nX2NvdW50ZXIsIFVMT05HX01BWCk7CisKKwl1bCA9IDM7CisJX190aGlzX2NwdV93cml0ZSh1bG9uZ19jb3VudGVyLCAzKTsKKworCXVsID0gdGhpc19jcHVfc3ViX3JldHVybih1bG9uZ19jb3VudGVyLCB1aV9vbmUpOworCUNIRUNLKHVsLCB1bG9uZ19jb3VudGVyLCAyKTsKKworCXVsID0gX190aGlzX2NwdV9zdWJfcmV0dXJuKHVsb25nX2NvdW50ZXIsIHVpX29uZSk7CisJQ0hFQ0sodWwsIHVsb25nX2NvdW50ZXIsIDEpOworCisJcHJlZW1wdF9lbmFibGUoKTsKKworCXByX2luZm8oInBlcmNwdSB0ZXN0IGRvbmVcbiIpOworCXJldHVybiAtRUFHQUlOOyAgLyogRmFpbCB3aWxsIGRpcmVjdGx5IHVubG9hZCB0aGUgbW9kdWxlICovCit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwZXJjcHVfdGVzdF9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHBlcmNwdV90ZXN0X2luaXQpCittb2R1bGVfZXhpdChwZXJjcHVfdGVzdF9leGl0KQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJHcmVnIFRoZWxlbiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJwZXJjcHUgb3BlcmF0aW9ucyB0ZXN0Iik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wbGlzdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGxpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTk0MDhmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcGxpc3QuYwpAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIGxpYi9wbGlzdC5jCisgKgorICogRGVzY2VuZGluZy1wcmlvcml0eS1zb3J0ZWQgZG91YmxlLWxpbmtlZCBsaXN0CisgKgorICogKEMpIDIwMDItMjAwMyBJbnRlbCBDb3JwCisgKiBJbmFreSBQZXJlei1Hb256YWxleiA8aW5ha3kucGVyZXotZ29uemFsZXpAaW50ZWwuY29tPi4KKyAqCisgKiAyMDAxLTIwMDUgKGMpIE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIERhbmllbCBXYWxrZXIgPGR3YWxrZXJAbXZpc3RhLmNvbT4KKyAqCisgKiAoQykgMjAwNSBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqCisgKiBTaW1wbGlmaWNhdGlvbnMgb2YgdGhlIG9yaWdpbmFsIGNvZGUgYnkKKyAqIE9sZWcgTmVzdGVyb3YgPG9sZWdAdHYtc2lnbi5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgRlNGJ3MgR05VIFB1YmxpYyBMaWNlbnNlIHYyIG9yIGxhdGVyLgorICoKKyAqIEJhc2VkIG9uIHNpbXBsZSBsaXN0cyAoaW5jbHVkZS9saW51eC9saXN0LmgpLgorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgYWRkIC8gZGVsIGZ1bmN0aW9ucyB3aGljaCBhcmUgY29uc2lkZXJlZCB0bworICogYmUgdG9vIGxhcmdlIHRvIGlubGluZS4gU2VlIGluY2x1ZGUvbGludXgvcGxpc3QuaCBmb3IgZnVydGhlcgorICogaW5mb3JtYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsaXN0Lmg+CisKKyNpZmRlZiBDT05GSUdfREVCVUdfUElfTElTVAorCitzdGF0aWMgc3RydWN0IHBsaXN0X2hlYWQgdGVzdF9oZWFkOworCitzdGF0aWMgdm9pZCBwbGlzdF9jaGVja19wcmV2X25leHQoc3RydWN0IGxpc3RfaGVhZCAqdCwgc3RydWN0IGxpc3RfaGVhZCAqcCwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKm4pCit7CisJV0FSTihuLT5wcmV2ICE9IHAgfHwgcC0+bmV4dCAhPSBuLAorCQkJInRvcDogJXAsIG46ICVwLCBwOiAlcFxuIgorCQkJInByZXY6ICVwLCBuOiAlcCwgcDogJXBcbiIKKwkJCSJuZXh0OiAlcCwgbjogJXAsIHA6ICVwXG4iLAorCQkJIHQsIHQtPm5leHQsIHQtPnByZXYsCisJCQlwLCBwLT5uZXh0LCBwLT5wcmV2LAorCQkJbiwgbi0+bmV4dCwgbi0+cHJldik7Cit9CisKK3N0YXRpYyB2b2lkIHBsaXN0X2NoZWNrX2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqdG9wKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKnByZXYgPSB0b3AsICpuZXh0ID0gdG9wLT5uZXh0OworCisJcGxpc3RfY2hlY2tfcHJldl9uZXh0KHRvcCwgcHJldiwgbmV4dCk7CisJd2hpbGUgKG5leHQgIT0gdG9wKSB7CisJCXByZXYgPSBuZXh0OworCQluZXh0ID0gcHJldi0+bmV4dDsKKwkJcGxpc3RfY2hlY2tfcHJldl9uZXh0KHRvcCwgcHJldiwgbmV4dCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwbGlzdF9jaGVja19oZWFkKHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghcGxpc3RfaGVhZF9lbXB0eShoZWFkKSkKKwkJcGxpc3RfY2hlY2tfbGlzdCgmcGxpc3RfZmlyc3QoaGVhZCktPnByaW9fbGlzdCk7CisJcGxpc3RfY2hlY2tfbGlzdCgmaGVhZC0+bm9kZV9saXN0KTsKK30KKworI2Vsc2UKKyMgZGVmaW5lIHBsaXN0X2NoZWNrX2hlYWQoaCkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qKgorICogcGxpc3RfYWRkIC0gYWRkIEBub2RlIHRvIEBoZWFkCisgKgorICogQG5vZGU6CSZzdHJ1Y3QgcGxpc3Rfbm9kZSBwb2ludGVyCisgKiBAaGVhZDoJJnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIKKyAqLwordm9pZCBwbGlzdF9hZGQoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBwbGlzdF9ub2RlICpmaXJzdCwgKml0ZXIsICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlX25leHQgPSAmaGVhZC0+bm9kZV9saXN0OworCisJcGxpc3RfY2hlY2tfaGVhZChoZWFkKTsKKwlXQVJOX09OKCFwbGlzdF9ub2RlX2VtcHR5KG5vZGUpKTsKKwlXQVJOX09OKCFsaXN0X2VtcHR5KCZub2RlLT5wcmlvX2xpc3QpKTsKKworCWlmIChwbGlzdF9oZWFkX2VtcHR5KGhlYWQpKQorCQlnb3RvIGluc19ub2RlOworCisJZmlyc3QgPSBpdGVyID0gcGxpc3RfZmlyc3QoaGVhZCk7CisKKwlkbyB7CisJCWlmIChub2RlLT5wcmlvIDwgaXRlci0+cHJpbykgeworCQkJbm9kZV9uZXh0ID0gJml0ZXItPm5vZGVfbGlzdDsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJldiA9IGl0ZXI7CisJCWl0ZXIgPSBsaXN0X2VudHJ5KGl0ZXItPnByaW9fbGlzdC5uZXh0LAorCQkJCXN0cnVjdCBwbGlzdF9ub2RlLCBwcmlvX2xpc3QpOworCX0gd2hpbGUgKGl0ZXIgIT0gZmlyc3QpOworCisJaWYgKCFwcmV2IHx8IHByZXYtPnByaW8gIT0gbm9kZS0+cHJpbykKKwkJbGlzdF9hZGRfdGFpbCgmbm9kZS0+cHJpb19saXN0LCAmaXRlci0+cHJpb19saXN0KTsKK2luc19ub2RlOgorCWxpc3RfYWRkX3RhaWwoJm5vZGUtPm5vZGVfbGlzdCwgbm9kZV9uZXh0KTsKKworCXBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7Cit9CisKKy8qKgorICogcGxpc3RfZGVsIC0gUmVtb3ZlIGEgQG5vZGUgZnJvbSBwbGlzdC4KKyAqCisgKiBAbm9kZToJJnN0cnVjdCBwbGlzdF9ub2RlIHBvaW50ZXIgLSBlbnRyeSB0byBiZSByZW1vdmVkCisgKiBAaGVhZDoJJnN0cnVjdCBwbGlzdF9oZWFkIHBvaW50ZXIgLSBsaXN0IGhlYWQKKyAqLwordm9pZCBwbGlzdF9kZWwoc3RydWN0IHBsaXN0X25vZGUgKm5vZGUsIHN0cnVjdCBwbGlzdF9oZWFkICpoZWFkKQoreworCXBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7CisKKwlpZiAoIWxpc3RfZW1wdHkoJm5vZGUtPnByaW9fbGlzdCkpIHsKKwkJaWYgKG5vZGUtPm5vZGVfbGlzdC5uZXh0ICE9ICZoZWFkLT5ub2RlX2xpc3QpIHsKKwkJCXN0cnVjdCBwbGlzdF9ub2RlICpuZXh0OworCisJCQluZXh0ID0gbGlzdF9lbnRyeShub2RlLT5ub2RlX2xpc3QubmV4dCwKKwkJCQkJc3RydWN0IHBsaXN0X25vZGUsIG5vZGVfbGlzdCk7CisKKwkJCS8qIGFkZCB0aGUgbmV4dCBwbGlzdF9ub2RlIGludG8gcHJpb19saXN0ICovCisJCQlpZiAobGlzdF9lbXB0eSgmbmV4dC0+cHJpb19saXN0KSkKKwkJCQlsaXN0X2FkZCgmbmV4dC0+cHJpb19saXN0LCAmbm9kZS0+cHJpb19saXN0KTsKKwkJfQorCQlsaXN0X2RlbF9pbml0KCZub2RlLT5wcmlvX2xpc3QpOworCX0KKworCWxpc3RfZGVsX2luaXQoJm5vZGUtPm5vZGVfbGlzdCk7CisKKwlwbGlzdF9jaGVja19oZWFkKGhlYWQpOworfQorCisvKioKKyAqIHBsaXN0X3JlcXVldWUgLSBSZXF1ZXVlIEBub2RlIGF0IGVuZCBvZiBzYW1lLXByaW8gZW50cmllcy4KKyAqCisgKiBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIG9wdGltaXplZCBwbGlzdF9kZWwoKSBmb2xsb3dlZCBieQorICogcGxpc3RfYWRkKCkuICBJdCBtb3ZlcyBhbiBlbnRyeSBhbHJlYWR5IGluIHRoZSBwbGlzdCB0bworICogYWZ0ZXIgYW55IG90aGVyIHNhbWUtcHJpb3JpdHkgZW50cmllcy4KKyAqCisgKiBAbm9kZToJJnN0cnVjdCBwbGlzdF9ub2RlIHBvaW50ZXIgLSBlbnRyeSB0byBiZSBtb3ZlZAorICogQGhlYWQ6CSZzdHJ1Y3QgcGxpc3RfaGVhZCBwb2ludGVyIC0gbGlzdCBoZWFkCisgKi8KK3ZvaWQgcGxpc3RfcmVxdWV1ZShzdHJ1Y3QgcGxpc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IHBsaXN0X25vZGUgKml0ZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZV9uZXh0ID0gJmhlYWQtPm5vZGVfbGlzdDsKKworCXBsaXN0X2NoZWNrX2hlYWQoaGVhZCk7CisJQlVHX09OKHBsaXN0X2hlYWRfZW1wdHkoaGVhZCkpOworCUJVR19PTihwbGlzdF9ub2RlX2VtcHR5KG5vZGUpKTsKKworCWlmIChub2RlID09IHBsaXN0X2xhc3QoaGVhZCkpCisJCXJldHVybjsKKworCWl0ZXIgPSBwbGlzdF9uZXh0KG5vZGUpOworCisJaWYgKG5vZGUtPnByaW8gIT0gaXRlci0+cHJpbykKKwkJcmV0dXJuOworCisJcGxpc3RfZGVsKG5vZGUsIGhlYWQpOworCisJcGxpc3RfZm9yX2VhY2hfY29udGludWUoaXRlciwgaGVhZCkgeworCQlpZiAobm9kZS0+cHJpbyAhPSBpdGVyLT5wcmlvKSB7CisJCQlub2RlX25leHQgPSAmaXRlci0+bm9kZV9saXN0OworCQkJYnJlYWs7CisJCX0KKwl9CisJbGlzdF9hZGRfdGFpbCgmbm9kZS0+bm9kZV9saXN0LCBub2RlX25leHQpOworCisJcGxpc3RfY2hlY2tfaGVhZChoZWFkKTsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19QSV9MSVNUCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9jbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworc3RhdGljIHN0cnVjdCBwbGlzdF9ub2RlIF9faW5pdGRhdGEgdGVzdF9ub2RlWzI0MV07CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwbGlzdF90ZXN0X2NoZWNrKGludCBucl9leHBlY3QpCit7CisJc3RydWN0IHBsaXN0X25vZGUgKmZpcnN0LCAqcHJpb19wb3MsICpub2RlX3BvczsKKworCWlmIChwbGlzdF9oZWFkX2VtcHR5KCZ0ZXN0X2hlYWQpKSB7CisJCUJVR19PTihucl9leHBlY3QgIT0gMCk7CisJCXJldHVybjsKKwl9CisKKwlwcmlvX3BvcyA9IGZpcnN0ID0gcGxpc3RfZmlyc3QoJnRlc3RfaGVhZCk7CisJcGxpc3RfZm9yX2VhY2gobm9kZV9wb3MsICZ0ZXN0X2hlYWQpIHsKKwkJaWYgKG5yX2V4cGVjdC0tIDwgMCkKKwkJCWJyZWFrOworCQlpZiAobm9kZV9wb3MgPT0gZmlyc3QpCisJCQljb250aW51ZTsKKwkJaWYgKG5vZGVfcG9zLT5wcmlvID09IHByaW9fcG9zLT5wcmlvKSB7CisJCQlCVUdfT04oIWxpc3RfZW1wdHkoJm5vZGVfcG9zLT5wcmlvX2xpc3QpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJQlVHX09OKHByaW9fcG9zLT5wcmlvID4gbm9kZV9wb3MtPnByaW8pOworCQlCVUdfT04ocHJpb19wb3MtPnByaW9fbGlzdC5uZXh0ICE9ICZub2RlX3Bvcy0+cHJpb19saXN0KTsKKwkJcHJpb19wb3MgPSBub2RlX3BvczsKKwl9CisKKwlCVUdfT04obnJfZXhwZWN0ICE9IDApOworCUJVR19PTihwcmlvX3Bvcy0+cHJpb19saXN0Lm5leHQgIT0gJmZpcnN0LT5wcmlvX2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgcGxpc3RfdGVzdF9yZXF1ZXVlKHN0cnVjdCBwbGlzdF9ub2RlICpub2RlKQoreworCXBsaXN0X3JlcXVldWUobm9kZSwgJnRlc3RfaGVhZCk7CisKKwlpZiAobm9kZSAhPSBwbGlzdF9sYXN0KCZ0ZXN0X2hlYWQpKQorCQlCVUdfT04obm9kZS0+cHJpbyA9PSBwbGlzdF9uZXh0KG5vZGUpLT5wcmlvKTsKK30KKworc3RhdGljIGludCAgX19pbml0IHBsaXN0X3Rlc3Qodm9pZCkKK3sKKwlpbnQgbnJfZXhwZWN0ID0gMCwgaSwgbG9vcDsKKwl1bnNpZ25lZCBpbnQgciA9IGxvY2FsX2Nsb2NrKCk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAic3RhcnQgcGxpc3QgdGVzdFxuIik7CisJcGxpc3RfaGVhZF9pbml0KCZ0ZXN0X2hlYWQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3Rfbm9kZSk7IGkrKykKKwkJcGxpc3Rfbm9kZV9pbml0KHRlc3Rfbm9kZSArIGksIDApOworCisJZm9yIChsb29wID0gMDsgbG9vcCA8IDEwMDA7IGxvb3ArKykgeworCQlyID0gciAqIDE5MzkzOSAlIDQ3NjI5OworCQlpID0gciAlIEFSUkFZX1NJWkUodGVzdF9ub2RlKTsKKwkJaWYgKHBsaXN0X25vZGVfZW1wdHkodGVzdF9ub2RlICsgaSkpIHsKKwkJCXIgPSByICogMTkzOTM5ICUgNDc2Mjk7CisJCQl0ZXN0X25vZGVbaV0ucHJpbyA9IHIgJSA5OTsKKwkJCXBsaXN0X2FkZCh0ZXN0X25vZGUgKyBpLCAmdGVzdF9oZWFkKTsKKwkJCW5yX2V4cGVjdCsrOworCQl9IGVsc2UgeworCQkJcGxpc3RfZGVsKHRlc3Rfbm9kZSArIGksICZ0ZXN0X2hlYWQpOworCQkJbnJfZXhwZWN0LS07CisJCX0KKwkJcGxpc3RfdGVzdF9jaGVjayhucl9leHBlY3QpOworCQlpZiAoIXBsaXN0X25vZGVfZW1wdHkodGVzdF9ub2RlICsgaSkpIHsKKwkJCXBsaXN0X3Rlc3RfcmVxdWV1ZSh0ZXN0X25vZGUgKyBpKTsKKwkJCXBsaXN0X3Rlc3RfY2hlY2sobnJfZXhwZWN0KTsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3Rfbm9kZSk7IGkrKykgeworCQlpZiAocGxpc3Rfbm9kZV9lbXB0eSh0ZXN0X25vZGUgKyBpKSkKKwkJCWNvbnRpbnVlOworCQlwbGlzdF9kZWwodGVzdF9ub2RlICsgaSwgJnRlc3RfaGVhZCk7CisJCW5yX2V4cGVjdC0tOworCQlwbGlzdF90ZXN0X2NoZWNrKG5yX2V4cGVjdCk7CisJfQorCisJcHJpbnRrKEtFUk5fREVCVUcgImVuZCBwbGlzdCB0ZXN0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQocGxpc3RfdGVzdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcG0tbm90aWZpZXItZXJyb3ItaW5qZWN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wbS1ub3RpZmllci1lcnJvci1pbmplY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDk0YjJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcG0tbm90aWZpZXItZXJyb3ItaW5qZWN0LmMKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KKworI2luY2x1ZGUgIm5vdGlmaWVyLWVycm9yLWluamVjdC5oIgorCitzdGF0aWMgaW50IHByaW9yaXR5OworbW9kdWxlX3BhcmFtKHByaW9yaXR5LCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhwcmlvcml0eSwgInNwZWNpZnkgUE0gbm90aWZpZXIgcHJpb3JpdHkiKTsKKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9lcnJfaW5qZWN0IHBtX25vdGlmaWVyX2Vycl9pbmplY3QgPSB7CisJLmFjdGlvbnMgPSB7CisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oUE1fSElCRVJOQVRJT05fUFJFUEFSRSkgfSwKKwkJeyBOT1RJRklFUl9FUlJfSU5KRUNUX0FDVElPTihQTV9TVVNQRU5EX1BSRVBBUkUpIH0sCisJCXsgTk9USUZJRVJfRVJSX0lOSkVDVF9BQ1RJT04oUE1fUkVTVE9SRV9QUkVQQVJFKSB9LAorCQl7fQorCX0KK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkaXI7CisKK3N0YXRpYyBpbnQgZXJyX2luamVjdF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCWRpciA9IG5vdGlmaWVyX2Vycl9pbmplY3RfaW5pdCgicG0iLCBub3RpZmllcl9lcnJfaW5qZWN0X2RpciwKKwkJCQkJJnBtX25vdGlmaWVyX2Vycl9pbmplY3QsIHByaW9yaXR5KTsKKwlpZiAoSVNfRVJSKGRpcikpCisJCXJldHVybiBQVFJfRVJSKGRpcik7CisKKwllcnIgPSByZWdpc3Rlcl9wbV9ub3RpZmllcigmcG1fbm90aWZpZXJfZXJyX2luamVjdC5uYik7CisJaWYgKGVycikKKwkJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBlcnJfaW5qZWN0X2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX3BtX25vdGlmaWVyKCZwbV9ub3RpZmllcl9lcnJfaW5qZWN0Lm5iKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKK30KKworbW9kdWxlX2luaXQoZXJyX2luamVjdF9pbml0KTsKK21vZHVsZV9leGl0KGVycl9pbmplY3RfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUE0gbm90aWZpZXIgZXJyb3IgaW5qZWN0aW9uIG1vZHVsZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiQWtpbm9idSBNaXRhIDxha2lub2J1Lm1pdGFAZ21haWwuY29tPiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcHJpbWVfbnVtYmVycy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcHJpbWVfbnVtYmVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MGVlYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9wcmltZV9udW1iZXJzLmMKQEAgLTAsMCArMSwzMTUgQEAKKyNkZWZpbmUgcHJfZm10KGZtdCkgInByaW1lIG51bWJlcnM6ICIgZm10ICJcbiIKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcHJpbWVfbnVtYmVycy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBiaXRtYXBfc2l6ZShuYml0cykgKEJJVFNfVE9fTE9OR1MobmJpdHMpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKQorCitzdHJ1Y3QgcHJpbWVzIHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXVuc2lnbmVkIGxvbmcgbGFzdCwgc3o7CisJdW5zaWduZWQgbG9uZyBwcmltZXNbXTsKK307CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CitzdGF0aWMgY29uc3Qgc3RydWN0IHByaW1lcyBzbWFsbF9wcmltZXMgPSB7CisJLmxhc3QgPSA2MSwKKwkuc3ogPSA2NCwKKwkucHJpbWVzID0geworCQlCSVQoMikgfAorCQlCSVQoMykgfAorCQlCSVQoNSkgfAorCQlCSVQoNykgfAorCQlCSVQoMTEpIHwKKwkJQklUKDEzKSB8CisJCUJJVCgxNykgfAorCQlCSVQoMTkpIHwKKwkJQklUKDIzKSB8CisJCUJJVCgyOSkgfAorCQlCSVQoMzEpIHwKKwkJQklUKDM3KSB8CisJCUJJVCg0MSkgfAorCQlCSVQoNDMpIHwKKwkJQklUKDQ3KSB8CisJCUJJVCg1MykgfAorCQlCSVQoNTkpIHwKKwkJQklUKDYxKQorCX0KK307CisjZWxpZiBCSVRTX1BFUl9MT05HID09IDMyCitzdGF0aWMgY29uc3Qgc3RydWN0IHByaW1lcyBzbWFsbF9wcmltZXMgPSB7CisJLmxhc3QgPSAzMSwKKwkuc3ogPSAzMiwKKwkucHJpbWVzID0geworCQlCSVQoMikgfAorCQlCSVQoMykgfAorCQlCSVQoNSkgfAorCQlCSVQoNykgfAorCQlCSVQoMTEpIHwKKwkJQklUKDEzKSB8CisJCUJJVCgxNykgfAorCQlCSVQoMTkpIHwKKwkJQklUKDIzKSB8CisJCUJJVCgyOSkgfAorCQlCSVQoMzEpCisJfQorfTsKKyNlbHNlCisjZXJyb3IgInVuaGFuZGxlZCBCSVRTX1BFUl9MT05HIgorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfTVVURVgobG9jayk7CitzdGF0aWMgY29uc3Qgc3RydWN0IHByaW1lcyBfX3JjdSAqcHJpbWVzID0gUkNVX0lOSVRJQUxJWkVSKCZzbWFsbF9wcmltZXMpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzZWxmdGVzdF9tYXg7CisKK3N0YXRpYyBib29sIHNsb3dfaXNfcHJpbWVfbnVtYmVyKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwl1bnNpZ25lZCBsb25nIHkgPSBpbnRfc3FydCh4KTsKKworCXdoaWxlICh5ID4gMSkgeworCQlpZiAoKHggJSB5KSA9PSAwKQorCQkJYnJlYWs7CisJCXktLTsKKwl9CisKKwlyZXR1cm4geSA9PSAxOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzbG93X25leHRfcHJpbWVfbnVtYmVyKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwl3aGlsZSAoeCA8IFVMT05HX01BWCAmJiAhc2xvd19pc19wcmltZV9udW1iZXIoKyt4KSkKKwkJOworCisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsZWFyX211bHRpcGxlcyh1bnNpZ25lZCBsb25nIHgsCisJCQkJICAgICB1bnNpZ25lZCBsb25nICpwLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgbTsKKworCW0gPSAyICogeDsKKwlpZiAobSA8IHN0YXJ0KQorCQltID0gcm91bmR1cChzdGFydCwgeCk7CisKKwl3aGlsZSAobSA8IGVuZCkgeworCQlfX2NsZWFyX2JpdChtLCBwKTsKKwkJbSArPSB4OworCX0KKworCXJldHVybiB4OworfQorCitzdGF0aWMgYm9vbCBleHBhbmRfdG9fbmV4dF9wcmltZSh1bnNpZ25lZCBsb25nIHgpCit7CisJY29uc3Qgc3RydWN0IHByaW1lcyAqcDsKKwlzdHJ1Y3QgcHJpbWVzICpuZXc7CisJdW5zaWduZWQgbG9uZyBzeiwgeTsKKworCS8qIEJldHJhbmQncyBQb3N0dWxhdGUgKG9yIENoZWJ5c2hldidzIHRoZW9yZW0pIHN0YXRlcyB0aGF0IGlmIG4gPiAzLAorCSAqIHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUgcHJpbWUgcCBiZXR3ZWVuIG4gYW5kIDJuIC0gMi4KKwkgKiBFcXVpdmFsZW50bHksIGlmIG4gPiAxLCB0aGVuIHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUgcHJpbWUgcAorCSAqIHN1Y2ggdGhhdCBuIDwgcCA8IDJuLgorCSAqCisJICogaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9CZXJ0cmFuZHNQb3N0dWxhdGUuaHRtbAorCSAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JlcnRyYW5kJ3NfcG9zdHVsYXRlCisJICovCisJc3ogPSAyICogeDsKKwlpZiAoc3ogPCB4KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzeiA9IHJvdW5kX3VwKHN6LCBCSVRTX1BFUl9MT05HKTsKKwluZXcgPSBrbWFsbG9jKHNpemVvZigqbmV3KSArIGJpdG1hcF9zaXplKHN6KSwKKwkJICAgICAgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTik7CisJaWYgKCFuZXcpCisJCXJldHVybiBmYWxzZTsKKworCW11dGV4X2xvY2soJmxvY2spOworCXAgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKHByaW1lcywgbG9ja2RlcF9pc19oZWxkKCZsb2NrKSk7CisJaWYgKHggPCBwLT5sYXN0KSB7CisJCWtmcmVlKG5ldyk7CisJCWdvdG8gdW5sb2NrOworCX0KKworCS8qIFdoZXJlIG1lbW9yeSBwZXJtaXRzLCB0cmFjayB0aGUgcHJpbWVzIHVzaW5nIHRoZQorCSAqIFNpZXZlIG9mIEVyYXRvc3RoZW5lcy4gVGhlIHNpZXZlIGlzIHRvIHJlbW92ZSBhbGwgbXVsdGlwbGVzIG9mIGtub3duCisJICogcHJpbWVzIGZyb20gdGhlIHNldCwgd2hhdCByZW1haW5zIGluIHRoZSBzZXQgaXMgdGhlcmVmb3JlIHByaW1lLgorCSAqLworCWJpdG1hcF9maWxsKG5ldy0+cHJpbWVzLCBzeik7CisJYml0bWFwX2NvcHkobmV3LT5wcmltZXMsIHAtPnByaW1lcywgcC0+c3opOworCWZvciAoeSA9IDJVTDsgeSA8IHN6OyB5ID0gZmluZF9uZXh0X2JpdChuZXctPnByaW1lcywgc3osIHkgKyAxKSkKKwkJbmV3LT5sYXN0ID0gY2xlYXJfbXVsdGlwbGVzKHksIG5ldy0+cHJpbWVzLCBwLT5zeiwgc3opOworCW5ldy0+c3ogPSBzejsKKworCUJVR19PTihuZXctPmxhc3QgPD0geCk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIocHJpbWVzLCBuZXcpOworCWlmIChwICE9ICZzbWFsbF9wcmltZXMpCisJCWtmcmVlX3JjdSgoc3RydWN0IHByaW1lcyAqKXAsIHJjdSk7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJmxvY2spOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3ByaW1lcyh2b2lkKQoreworCWNvbnN0IHN0cnVjdCBwcmltZXMgKnA7CisKKwltdXRleF9sb2NrKCZsb2NrKTsKKwlwID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcmltZXMsIGxvY2tkZXBfaXNfaGVsZCgmbG9jaykpOworCWlmIChwICE9ICZzbWFsbF9wcmltZXMpIHsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHByaW1lcywgJnNtYWxsX3ByaW1lcyk7CisJCWtmcmVlX3JjdSgoc3RydWN0IHByaW1lcyAqKXAsIHJjdSk7CisJfQorCW11dGV4X3VubG9jaygmbG9jayk7Cit9CisKKy8qKgorICogbmV4dF9wcmltZV9udW1iZXIgLSByZXR1cm4gdGhlIG5leHQgcHJpbWUgbnVtYmVyCisgKiBAeDogdGhlIHN0YXJ0aW5nIHBvaW50IGZvciBzZWFyY2hpbmcgdG8gdGVzdAorICoKKyAqIEEgcHJpbWUgbnVtYmVyIGlzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIDEgdGhhdCBpcyBvbmx5IGRpdmlzaWJsZSBieQorICogaXRzZWxmIGFuZCAxLiAgVGhlIHNldCBvZiBwcmltZSBudW1iZXJzIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBTaWV2ZSBvZgorICogRXJhdG9zaGVuZXMgKG9uIGZpbmRpbmcgYSBwcmltZSwgYWxsIG11bHRpcGxlcyBvZiB0aGF0IHByaW1lIGFyZSByZW1vdmVkCisgKiBmcm9tIHRoZSBzZXQpIGVuYWJsaW5nIGEgZmFzdCBsb29rdXAgb2YgdGhlIG5leHQgcHJpbWUgbnVtYmVyIGxhcmdlciB0aGFuCisgKiBAeC4gSWYgdGhlIHNpZXZlIGZhaWxzIChtZW1vcnkgbGltaXRhdGlvbiksIHRoZSBzZWFyY2ggZmFsbHMgYmFjayB0byB1c2luZworICogc2xvdyB0cmlhbC1kaXZpc29uLCB1cCB0byB0aGUgdmFsdWUgb2YgVUxPTkdfTUFYICh3aGljaCBpcyByZXBvcnRlZCBhcyB0aGUKKyAqIGZpbmFsIHByaW1lIGFzIGEgc2VudGluZWwpLgorICoKKyAqIFJldHVybnM6IHRoZSBuZXh0IHByaW1lIG51bWJlciBsYXJnZXIgdGhhbiBAeAorICovCit1bnNpZ25lZCBsb25nIG5leHRfcHJpbWVfbnVtYmVyKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwljb25zdCBzdHJ1Y3QgcHJpbWVzICpwOworCisJcmN1X3JlYWRfbG9jaygpOworCXAgPSByY3VfZGVyZWZlcmVuY2UocHJpbWVzKTsKKwl3aGlsZSAoeCA+PSBwLT5sYXN0KSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCisJCWlmICghZXhwYW5kX3RvX25leHRfcHJpbWUoeCkpCisJCQlyZXR1cm4gc2xvd19uZXh0X3ByaW1lX251bWJlcih4KTsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXAgPSByY3VfZGVyZWZlcmVuY2UocHJpbWVzKTsKKwl9CisJeCA9IGZpbmRfbmV4dF9iaXQocC0+cHJpbWVzLCBwLT5sYXN0LCB4ICsgMSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4geDsKK30KK0VYUE9SVF9TWU1CT0wobmV4dF9wcmltZV9udW1iZXIpOworCisvKioKKyAqIGlzX3ByaW1lX251bWJlciAtIHRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gbnVtYmVyIGlzIHByaW1lCisgKiBAeDogdGhlIG51bWJlciB0byB0ZXN0CisgKgorICogQSBwcmltZSBudW1iZXIgaXMgYW4gaW50ZWdlciBncmVhdGVyIHRoYW4gMSB0aGF0IGlzIG9ubHkgZGl2aXNpYmxlIGJ5CisgKiBpdHNlbGYgYW5kIDEuIEludGVybmFsbHkgYSBjYWNoZSBvZiBwcmltZSBudW1iZXJzIGlzIGtlcHQgKHRvIHNwZWVkIHVwCisgKiBzZWFyY2hpbmcgZm9yIHNlcXVlbnRpYWwgcHJpbWVzLCBzZWUgbmV4dF9wcmltZV9udW1iZXIoKSksIGJ1dCBpZiB0aGUgbnVtYmVyCisgKiBmYWxscyBvdXRzaWRlIG9mIHRoYXQgY2FjaGUsIGl0cyBwcmltYWxpdHkgaXMgdGVzdGVkIHVzaW5nIHRyaWFsLWRpdmlzb24uCisgKgorICogUmV0dXJuczogdHJ1ZSBpZiBAeCBpcyBwcmltZSwgZmFsc2UgZm9yIGNvbXBvc2l0ZSBudW1iZXJzLgorICovCitib29sIGlzX3ByaW1lX251bWJlcih1bnNpZ25lZCBsb25nIHgpCit7CisJY29uc3Qgc3RydWN0IHByaW1lcyAqcDsKKwlib29sIHJlc3VsdDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwID0gcmN1X2RlcmVmZXJlbmNlKHByaW1lcyk7CisJd2hpbGUgKHggPj0gcC0+c3opIHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkJaWYgKCFleHBhbmRfdG9fbmV4dF9wcmltZSh4KSkKKwkJCXJldHVybiBzbG93X2lzX3ByaW1lX251bWJlcih4KTsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXAgPSByY3VfZGVyZWZlcmVuY2UocHJpbWVzKTsKKwl9CisJcmVzdWx0ID0gdGVzdF9iaXQoeCwgcC0+cHJpbWVzKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKGlzX3ByaW1lX251bWJlcik7CisKK3N0YXRpYyB2b2lkIGR1bXBfcHJpbWVzKHZvaWQpCit7CisJY29uc3Qgc3RydWN0IHByaW1lcyAqcDsKKwljaGFyICpidWY7CisKKwlidWYgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcCA9IHJjdV9kZXJlZmVyZW5jZShwcmltZXMpOworCisJaWYgKGJ1ZikKKwkJYml0bWFwX3ByaW50X3RvX3BhZ2VidWYodHJ1ZSwgYnVmLCBwLT5wcmltZXMsIHAtPnN6KTsKKwlwcl9pbmZvKCJwcmltZXMue2xhc3Q9JWx1LCAuc3o9JWx1LCAucHJpbWVzW109Li4ueCVseH0gPSAlcyIsCisJCXAtPmxhc3QsIHAtPnN6LCBwLT5wcmltZXNbQklUU19UT19MT05HUyhwLT5zeikgLSAxXSwgYnVmKTsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJa2ZyZWUoYnVmKTsKK30KKworc3RhdGljIGludCBzZWxmdGVzdCh1bnNpZ25lZCBsb25nIG1heCkKK3sKKwl1bnNpZ25lZCBsb25nIHgsIGxhc3Q7CisKKwlpZiAoIW1heCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGxhc3QgPSAwLCB4ID0gMjsgeCA8IG1heDsgeCsrKSB7CisJCWJvb2wgc2xvdyA9IHNsb3dfaXNfcHJpbWVfbnVtYmVyKHgpOworCQlib29sIGZhc3QgPSBpc19wcmltZV9udW1iZXIoeCk7CisKKwkJaWYgKHNsb3cgIT0gZmFzdCkgeworCQkJcHJfZXJyKCJpbmNvbnNpc3RlbnQgcmVzdWx0IGZvciBpcy1wcmltZSglbHUpOiBzbG93PSVzLCBmYXN0PSVzISIsCisJCQkgICAgICAgeCwgc2xvdyA/ICJ5ZXMiIDogIm5vIiwgZmFzdCA/ICJ5ZXMiIDogIm5vIik7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCWlmICghc2xvdykKKwkJCWNvbnRpbnVlOworCisJCWlmIChuZXh0X3ByaW1lX251bWJlcihsYXN0KSAhPSB4KSB7CisJCQlwcl9lcnIoImluY29ycmVjdCByZXN1bHQgZm9yIG5leHQtcHJpbWUoJWx1KTogZXhwZWN0ZWQgJWx1LCBnb3QgJWx1IiwKKwkJCSAgICAgICBsYXN0LCB4LCBuZXh0X3ByaW1lX251bWJlcihsYXN0KSk7CisJCQlnb3RvIGVycjsKKwkJfQorCQlsYXN0ID0geDsKKwl9CisKKwlwcl9pbmZvKCJzZWxmdGVzdCglbHUpIHBhc3NlZCwgbGFzdCBwcmltZSB3YXMgJWx1IiwgeCwgbGFzdCk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlkdW1wX3ByaW1lcygpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcmltZXNfaW5pdCh2b2lkKQoreworCXJldHVybiBzZWxmdGVzdChzZWxmdGVzdF9tYXgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcHJpbWVzX2V4aXQodm9pZCkKK3sKKwlmcmVlX3ByaW1lcygpOworfQorCittb2R1bGVfaW5pdChwcmltZXNfaW5pdCk7Cittb2R1bGVfZXhpdChwcmltZXNfZXhpdCk7CisKK21vZHVsZV9wYXJhbV9uYW1lZChzZWxmdGVzdCwgc2VsZnRlc3RfbWF4LCB1bG9uZywgMDQwMCk7CisKK01PRFVMRV9BVVRIT1IoIkludGVsIENvcnBvcmF0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWRpeC10cmVlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWRpeC10cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYwMGM4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhZGl4LXRyZWUuYwpAQCAtMCwwICsxLDIyOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTW9tY2hpbCBWZWxpa292CisgKiBQb3J0aW9ucyBDb3B5cmlnaHQgKEMpIDIwMDEgQ2hyaXN0b3BoIEhlbGx3aWcKKyAqIENvcHlyaWdodCAoQykgMjAwNSBTR0ksIENocmlzdG9waCBMYW1ldGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgTmljayBQaWdnaW4KKyAqIENvcHlyaWdodCAoQykgMjAxMiBLb25zdGFudGluIEtobGVibmlrb3YKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJbnRlbCwgTWF0dGhldyBXaWxjb3gKKyAqIENvcHlyaWdodCAoQykgMjAxNiBJbnRlbCwgUm9zcyBad2lzbGVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQKKyAqIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgkJLyogaW5faW50ZXJydXB0KCkgKi8KKyNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisKKworLyogTnVtYmVyIG9mIG5vZGVzIGluIGZ1bGx5IHBvcHVsYXRlZCB0cmVlIG9mIGdpdmVuIGhlaWdodCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVpZ2h0X3RvX21heG5vZGVzW1JBRElYX1RSRUVfTUFYX1BBVEggKyAxXSBfX3JlYWRfbW9zdGx5OworCisvKgorICogUmFkaXggdHJlZSBub2RlIGNhY2hlLgorICovCitzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnJhZGl4X3RyZWVfbm9kZV9jYWNoZXA7CisKKy8qCisgKiBUaGUgcmFkaXggdHJlZSBpcyB2YXJpYWJsZS1oZWlnaHQsIHNvIGFuIGluc2VydCBvcGVyYXRpb24gbm90IG9ubHkgaGFzCisgKiB0byBidWlsZCB0aGUgYnJhbmNoIHRvIGl0cyBjb3JyZXNwb25kaW5nIGl0ZW0sIGl0IGFsc28gaGFzIHRvIGJ1aWxkIHRoZQorICogYnJhbmNoIHRvIGV4aXN0aW5nIGl0ZW1zIGlmIHRoZSBzaXplIGhhcyB0byBiZSBpbmNyZWFzZWQgKGJ5CisgKiByYWRpeF90cmVlX2V4dGVuZCkuCisgKgorICogVGhlIHdvcnN0IGNhc2UgaXMgYSB6ZXJvIGhlaWdodCB0cmVlIHdpdGgganVzdCBhIHNpbmdsZSBpdGVtIGF0IGluZGV4IDAsCisgKiBhbmQgdGhlbiBpbnNlcnRpbmcgYW4gaXRlbSBhdCBpbmRleCBVTE9OR19NQVguIFRoaXMgcmVxdWlyZXMgMiBuZXcgYnJhbmNoZXMKKyAqIG9mIFJBRElYX1RSRUVfTUFYX1BBVEggc2l6ZSB0byBiZSBjcmVhdGVkLCB3aXRoIG9ubHkgdGhlIHJvb3Qgbm9kZSBzaGFyZWQuCisgKiBIZW5jZToKKyAqLworI2RlZmluZSBSQURJWF9UUkVFX1BSRUxPQURfU0laRSAoUkFESVhfVFJFRV9NQVhfUEFUSCAqIDIgLSAxKQorCisvKgorICogVGhlIElEUiBkb2VzIG5vdCBoYXZlIHRvIGJlIGFzIGhpZ2ggYXMgdGhlIHJhZGl4IHRyZWUgc2luY2UgaXQgdXNlcworICogc2lnbmVkIGludGVnZXJzLCBub3QgdW5zaWduZWQgbG9uZ3MuCisgKi8KKyNkZWZpbmUgSURSX0lOREVYX0JJVFMJCSg4IC8qIENIQVJfQklUICovICogc2l6ZW9mKGludCkgLSAxKQorI2RlZmluZSBJRFJfTUFYX1BBVEgJCShESVZfUk9VTkRfVVAoSURSX0lOREVYX0JJVFMsIFwKKwkJCQkJCVJBRElYX1RSRUVfTUFQX1NISUZUKSkKKyNkZWZpbmUgSURSX1BSRUxPQURfU0laRQkoSURSX01BWF9QQVRIICogMiAtIDEpCisKKy8qCisgKiBUaGUgSURBIGlzIGV2ZW4gc2hvcnRlciBzaW5jZSBpdCB1c2VzIGEgYml0bWFwIGF0IHRoZSBsYXN0IGxldmVsLgorICovCisjZGVmaW5lIElEQV9JTkRFWF9CSVRTCQkoOCAqIHNpemVvZihpbnQpIC0gMSAtIGlsb2cyKElEQV9CSVRNQVBfQklUUykpCisjZGVmaW5lIElEQV9NQVhfUEFUSAkJKERJVl9ST1VORF9VUChJREFfSU5ERVhfQklUUywgXAorCQkJCQkJUkFESVhfVFJFRV9NQVBfU0hJRlQpKQorI2RlZmluZSBJREFfUFJFTE9BRF9TSVpFCShJREFfTUFYX1BBVEggKiAyIC0gMSkKKworLyoKKyAqIFBlci1jcHUgcG9vbCBvZiBwcmVsb2FkZWQgbm9kZXMKKyAqLworc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCB7CisJdW5zaWduZWQgbnI7CisJLyogbm9kZXMtPnBhcmVudCBwb2ludHMgdG8gbmV4dCBwcmVhbGxvY2F0ZWQgbm9kZSAqLworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGVzOworfTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkLCByYWRpeF90cmVlX3ByZWxvYWRzKSA9IHsgMCwgfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICplbnRyeV90b19ub2RlKHZvaWQgKnB0cikKK3sKKwlyZXR1cm4gKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpcHRyICYgflJBRElYX1RSRUVfSU5URVJOQUxfTk9ERSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbm9kZV90b19lbnRyeSh2b2lkICpwdHIpCit7CisJcmV0dXJuICh2b2lkICopKCh1bnNpZ25lZCBsb25nKXB0ciB8IFJBRElYX1RSRUVfSU5URVJOQUxfTk9ERSk7Cit9CisKKyNkZWZpbmUgUkFESVhfVFJFRV9SRVRSWQlub2RlX3RvX2VudHJ5KE5VTEwpCisKKyNpZmRlZiBDT05GSUdfUkFESVhfVFJFRV9NVUxUSU9SREVSCisvKiBTaWJsaW5nIHNsb3RzIHBvaW50IGRpcmVjdGx5IHRvIGFub3RoZXIgc2xvdCBpbiB0aGUgc2FtZSBub2RlICovCitzdGF0aWMgaW5saW5lCitib29sIGlzX3NpYmxpbmdfZW50cnkoY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqcGFyZW50LCB2b2lkICpub2RlKQoreworCXZvaWQgX19yY3UgKipwdHIgPSBub2RlOworCXJldHVybiAocGFyZW50LT5zbG90cyA8PSBwdHIpICYmCisJCQkocHRyIDwgcGFyZW50LT5zbG90cyArIFJBRElYX1RSRUVfTUFQX1NJWkUpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUKK2Jvb2wgaXNfc2libGluZ19lbnRyeShjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpwYXJlbnQsIHZvaWQgKm5vZGUpCit7CisJcmV0dXJuIGZhbHNlOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZ2V0X3Nsb3Rfb2Zmc2V0KGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX25vZGUgKnBhcmVudCwgdm9pZCBfX3JjdSAqKnNsb3QpCit7CisJcmV0dXJuIHNsb3QgLSBwYXJlbnQtPnNsb3RzOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHJhZGl4X3RyZWVfZGVzY2VuZChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpwYXJlbnQsCisJCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqbm9kZXAsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IChpbmRleCA+PiBwYXJlbnQtPnNoaWZ0KSAmIFJBRElYX1RSRUVfTUFQX01BU0s7CisJdm9pZCBfX3JjdSAqKmVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhwYXJlbnQtPnNsb3RzW29mZnNldF0pOworCisjaWZkZWYgQ09ORklHX1JBRElYX1RSRUVfTVVMVElPUkRFUgorCWlmIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoZW50cnkpKSB7CisJCWlmIChpc19zaWJsaW5nX2VudHJ5KHBhcmVudCwgZW50cnkpKSB7CisJCQl2b2lkIF9fcmN1ICoqc2liZW50cnk7CisJCQlzaWJlbnRyeSA9ICh2b2lkIF9fcmN1ICoqKSBlbnRyeV90b19ub2RlKGVudHJ5KTsKKwkJCW9mZnNldCA9IGdldF9zbG90X29mZnNldChwYXJlbnQsIHNpYmVudHJ5KTsKKwkJCWVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2liZW50cnkpOworCQl9CisJfQorI2VuZGlmCisKKwkqbm9kZXAgPSAodm9pZCAqKWVudHJ5OworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZ2ZwX3Qgcm9vdF9nZnBfbWFzayhjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQoreworCXJldHVybiByb290LT5nZnBfbWFzayAmIF9fR0ZQX0JJVFNfTUFTSzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhZ19zZXQoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgdW5zaWduZWQgaW50IHRhZywKKwkJaW50IG9mZnNldCkKK3sKKwlfX3NldF9iaXQob2Zmc2V0LCBub2RlLT50YWdzW3RhZ10pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGFnX2NsZWFyKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGludCB0YWcsCisJCWludCBvZmZzZXQpCit7CisJX19jbGVhcl9iaXQob2Zmc2V0LCBub2RlLT50YWdzW3RhZ10pOworfQorCitzdGF0aWMgaW5saW5lIGludCB0YWdfZ2V0KGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIGludCB0YWcsCisJCWludCBvZmZzZXQpCit7CisJcmV0dXJuIHRlc3RfYml0KG9mZnNldCwgbm9kZS0+dGFnc1t0YWddKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJvb3RfdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCB0YWcpCit7CisJcm9vdC0+Z2ZwX21hc2sgfD0gKF9fZm9yY2UgZ2ZwX3QpKDEgPDwgKHRhZyArIFJPT1RfVEFHX1NISUZUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByb290X3RhZ19jbGVhcihzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCB0YWcpCit7CisJcm9vdC0+Z2ZwX21hc2sgJj0gKF9fZm9yY2UgZ2ZwX3QpfigxIDw8ICh0YWcgKyBST09UX1RBR19TSElGVCkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcm9vdF90YWdfY2xlYXJfYWxsKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QpCit7CisJcm9vdC0+Z2ZwX21hc2sgJj0gKDEgPDwgUk9PVF9UQUdfU0hJRlQpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcm9vdF90YWdfZ2V0KGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIHRhZykKK3sKKwlyZXR1cm4gKF9fZm9yY2UgaW50KXJvb3QtPmdmcF9tYXNrICYgKDEgPDwgKHRhZyArIFJPT1RfVEFHX1NISUZUKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcm9vdF90YWdzX2dldChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQoreworCXJldHVybiAoX19mb3JjZSB1bnNpZ25lZClyb290LT5nZnBfbWFzayA+PiBST09UX1RBR19TSElGVDsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzX2lkcihjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290KQoreworCXJldHVybiAhIShyb290LT5nZnBfbWFzayAmIFJPT1RfSVNfSURSKTsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBhbnkgc2xvdCBpbiB0aGUgbm9kZSBoYXMgdGhpcyB0YWcgc2V0LgorICogT3RoZXJ3aXNlIHJldHVybnMgMC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYW55X3RhZ19zZXQoY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCQkJCQl1bnNpZ25lZCBpbnQgdGFnKQoreworCXVuc2lnbmVkIGlkeDsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFJBRElYX1RSRUVfVEFHX0xPTkdTOyBpZHgrKykgeworCQlpZiAobm9kZS0+dGFnc1t0YWddW2lkeF0pCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhbGxfdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBpbnQgdGFnKQoreworCWJpdG1hcF9maWxsKG5vZGUtPnRhZ3NbdGFnXSwgUkFESVhfVFJFRV9NQVBfU0laRSk7Cit9CisKKy8qKgorICogcmFkaXhfdHJlZV9maW5kX25leHRfYml0IC0gZmluZCB0aGUgbmV4dCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbgorICoKKyAqIEBhZGRyOiBUaGUgYWRkcmVzcyB0byBiYXNlIHRoZSBzZWFyY2ggb24KKyAqIEBzaXplOiBUaGUgYml0bWFwIHNpemUgaW4gYml0cworICogQG9mZnNldDogVGhlIGJpdG51bWJlciB0byBzdGFydCBzZWFyY2hpbmcgYXQKKyAqCisgKiBVbnJvbGxhYmxlIHZhcmlhbnQgb2YgZmluZF9uZXh0X2JpdCgpIGZvciBjb25zdGFudCBzaXplIGFycmF5cy4KKyAqIFRhaWwgYml0cyBzdGFydGluZyBmcm9tIHNpemUgdG8gcm91bmR1cChzaXplLCBCSVRTX1BFUl9MT05HKSBtdXN0IGJlIHplcm8uCisgKiBSZXR1cm5zIG5leHQgYml0IG9mZnNldCwgb3Igc2l6ZSBpZiBub3RoaW5nIGZvdW5kLgorICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcKK3JhZGl4X3RyZWVfZmluZF9uZXh0X2JpdChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBpbnQgdGFnLAorCQkJIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIgPSBub2RlLT50YWdzW3RhZ107CisKKwlpZiAob2Zmc2V0IDwgUkFESVhfVFJFRV9NQVBfU0laRSkgeworCQl1bnNpZ25lZCBsb25nIHRtcDsKKworCQlhZGRyICs9IG9mZnNldCAvIEJJVFNfUEVSX0xPTkc7CisJCXRtcCA9ICphZGRyID4+IChvZmZzZXQgJSBCSVRTX1BFUl9MT05HKTsKKwkJaWYgKHRtcCkKKwkJCXJldHVybiBfX2Zmcyh0bXApICsgb2Zmc2V0OworCQlvZmZzZXQgPSAob2Zmc2V0ICsgQklUU19QRVJfTE9ORykgJiB+KEJJVFNfUEVSX0xPTkcgLSAxKTsKKwkJd2hpbGUgKG9mZnNldCA8IFJBRElYX1RSRUVfTUFQX1NJWkUpIHsKKwkJCXRtcCA9ICorK2FkZHI7CisJCQlpZiAodG1wKQorCQkJCXJldHVybiBfX2Zmcyh0bXApICsgb2Zmc2V0OworCQkJb2Zmc2V0ICs9IEJJVFNfUEVSX0xPTkc7CisJCX0KKwl9CisJcmV0dXJuIFJBRElYX1RSRUVfTUFQX1NJWkU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXRlcl9vZmZzZXQoY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlcikKK3sKKwlyZXR1cm4gKGl0ZXItPmluZGV4ID4+IGl0ZXJfc2hpZnQoaXRlcikpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKK30KKworLyoKKyAqIFRoZSBtYXhpbXVtIGluZGV4IHdoaWNoIGNhbiBiZSBzdG9yZWQgaW4gYSByYWRpeCB0cmVlCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBzaGlmdF9tYXhpbmRleCh1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisJcmV0dXJuIChSQURJWF9UUkVFX01BUF9TSVpFIDw8IHNoaWZ0KSAtIDE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBub2RlX21heGluZGV4KGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUpCit7CisJcmV0dXJuIHNoaWZ0X21heGluZGV4KG5vZGUtPnNoaWZ0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbmV4dF9pbmRleCh1bnNpZ25lZCBsb25nIGluZGV4LAorCQkJCWNvbnN0IHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIChpbmRleCAmIH5ub2RlX21heGluZGV4KG5vZGUpKSArIChvZmZzZXQgPDwgbm9kZS0+c2hpZnQpOworfQorCisjaWZuZGVmIF9fS0VSTkVMX18KK3N0YXRpYyB2b2lkIGR1bXBfbm9kZShzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCXByX2RlYnVnKCJyYWRpeCBub2RlOiAlcCBvZmZzZXQgJWQgaW5kaWNlcyAlbHUtJWx1IHBhcmVudCAlcCB0YWdzICVseCAlbHggJWx4IHNoaWZ0ICVkIGNvdW50ICVkIGV4Y2VwdGlvbmFsICVkXG4iLAorCQlub2RlLCBub2RlLT5vZmZzZXQsIGluZGV4LCBpbmRleCB8IG5vZGVfbWF4aW5kZXgobm9kZSksCisJCW5vZGUtPnBhcmVudCwKKwkJbm9kZS0+dGFnc1swXVswXSwgbm9kZS0+dGFnc1sxXVswXSwgbm9kZS0+dGFnc1syXVswXSwKKwkJbm9kZS0+c2hpZnQsIG5vZGUtPmNvdW50LCBub2RlLT5leGNlcHRpb25hbCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgZmlyc3QgPSBpbmRleCB8IChpIDw8IG5vZGUtPnNoaWZ0KTsKKwkJdW5zaWduZWQgbG9uZyBsYXN0ID0gZmlyc3QgfCAoKDFVTCA8PCBub2RlLT5zaGlmdCkgLSAxKTsKKwkJdm9pZCAqZW50cnkgPSBub2RlLT5zbG90c1tpXTsKKwkJaWYgKCFlbnRyeSkKKwkJCWNvbnRpbnVlOworCQlpZiAoZW50cnkgPT0gUkFESVhfVFJFRV9SRVRSWSkgeworCQkJcHJfZGVidWcoInJhZGl4IHJldHJ5IG9mZnNldCAlbGQgaW5kaWNlcyAlbHUtJWx1IHBhcmVudCAlcFxuIiwKKwkJCQkJaSwgZmlyc3QsIGxhc3QsIG5vZGUpOworCQl9IGVsc2UgaWYgKCFyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoZW50cnkpKSB7CisJCQlwcl9kZWJ1ZygicmFkaXggZW50cnkgJXAgb2Zmc2V0ICVsZCBpbmRpY2VzICVsdS0lbHUgcGFyZW50ICVwXG4iLAorCQkJCQllbnRyeSwgaSwgZmlyc3QsIGxhc3QsIG5vZGUpOworCQl9IGVsc2UgaWYgKGlzX3NpYmxpbmdfZW50cnkobm9kZSwgZW50cnkpKSB7CisJCQlwcl9kZWJ1ZygicmFkaXggc2JsbmcgJXAgb2Zmc2V0ICVsZCBpbmRpY2VzICVsdS0lbHUgcGFyZW50ICVwIHZhbCAlcFxuIiwKKwkJCQkJZW50cnksIGksIGZpcnN0LCBsYXN0LCBub2RlLAorCQkJCQkqKHZvaWQgKiopZW50cnlfdG9fbm9kZShlbnRyeSkpOworCQl9IGVsc2UgeworCQkJZHVtcF9ub2RlKGVudHJ5X3RvX25vZGUoZW50cnkpLCBmaXJzdCk7CisJCX0KKwl9Cit9CisKKy8qIEZvciBkZWJ1ZyAqLworc3RhdGljIHZvaWQgcmFkaXhfdHJlZV9kdW1wKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QpCit7CisJcHJfZGVidWcoInJhZGl4IHJvb3Q6ICVwIHJub2RlICVwIHRhZ3MgJXhcbiIsCisJCQlyb290LCByb290LT5ybm9kZSwKKwkJCXJvb3QtPmdmcF9tYXNrID4+IFJPT1RfVEFHX1NISUZUKTsKKwlpZiAoIXJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShyb290LT5ybm9kZSkpCisJCXJldHVybjsKKwlkdW1wX25vZGUoZW50cnlfdG9fbm9kZShyb290LT5ybm9kZSksIDApOworfQorCitzdGF0aWMgdm9pZCBkdW1wX2lkYV9ub2RlKHZvaWQgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCWlmICghZW50cnkpCisJCXJldHVybjsKKworCWlmIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoZW50cnkpKSB7CisJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUgPSBlbnRyeV90b19ub2RlKGVudHJ5KTsKKworCQlwcl9kZWJ1ZygiaWRhIG5vZGU6ICVwIG9mZnNldCAlZCBpbmRpY2VzICVsdS0lbHUgcGFyZW50ICVwIGZyZWUgJWx4IHNoaWZ0ICVkIGNvdW50ICVkXG4iLAorCQkJbm9kZSwgbm9kZS0+b2Zmc2V0LCBpbmRleCAqIElEQV9CSVRNQVBfQklUUywKKwkJCSgoaW5kZXggfCBub2RlX21heGluZGV4KG5vZGUpKSArIDEpICoKKwkJCQlJREFfQklUTUFQX0JJVFMgLSAxLAorCQkJbm9kZS0+cGFyZW50LCBub2RlLT50YWdzWzBdWzBdLCBub2RlLT5zaGlmdCwKKwkJCW5vZGUtPmNvdW50KTsKKwkJZm9yIChpID0gMDsgaSA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGkrKykKKwkJCWR1bXBfaWRhX25vZGUobm9kZS0+c2xvdHNbaV0sCisJCQkJCWluZGV4IHwgKGkgPDwgbm9kZS0+c2hpZnQpKTsKKwl9IGVsc2UgaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkoZW50cnkpKSB7CisJCXByX2RlYnVnKCJpZGEgZXhjcDogJXAgb2Zmc2V0ICVkIGluZGljZXMgJWx1LSVsdSBkYXRhICVseFxuIiwKKwkJCQllbnRyeSwgKGludCkoaW5kZXggJiBSQURJWF9UUkVFX01BUF9NQVNLKSwKKwkJCQlpbmRleCAqIElEQV9CSVRNQVBfQklUUywKKwkJCQlpbmRleCAqIElEQV9CSVRNQVBfQklUUyArIEJJVFNfUEVSX0xPTkcgLQorCQkJCQlSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZULAorCQkJCSh1bnNpZ25lZCBsb25nKWVudHJ5ID4+CisJCQkJCVJBRElYX1RSRUVfRVhDRVBUSU9OQUxfU0hJRlQpOworCX0gZWxzZSB7CisJCXN0cnVjdCBpZGFfYml0bWFwICpiaXRtYXAgPSBlbnRyeTsKKworCQlwcl9kZWJ1ZygiaWRhIGJ0bXA6ICVwIG9mZnNldCAlZCBpbmRpY2VzICVsdS0lbHUgZGF0YSIsIGJpdG1hcCwKKwkJCQkoaW50KShpbmRleCAmIFJBRElYX1RSRUVfTUFQX01BU0spLAorCQkJCWluZGV4ICogSURBX0JJVE1BUF9CSVRTLAorCQkJCShpbmRleCArIDEpICogSURBX0JJVE1BUF9CSVRTIC0gMSk7CisJCWZvciAoaSA9IDA7IGkgPCBJREFfQklUTUFQX0xPTkdTOyBpKyspCisJCQlwcl9jb250KCIgJWx4IiwgYml0bWFwLT5iaXRtYXBbaV0pOworCQlwcl9jb250KCJcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgaWRhX2R1bXAoc3RydWN0IGlkYSAqaWRhKQoreworCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QgPSAmaWRhLT5pZGFfcnQ7CisJcHJfZGVidWcoImlkYTogJXAgbm9kZSAlcCBmcmVlICVkXG4iLCBpZGEsIHJvb3QtPnJub2RlLAorCQkJCXJvb3QtPmdmcF9tYXNrID4+IFJPT1RfVEFHX1NISUZUKTsKKwlkdW1wX2lkYV9ub2RlKHJvb3QtPnJub2RlLCAwKTsKK30KKyNlbmRpZgorCisvKgorICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlciBoYXMgcGVyZm9ybWVkIGFwcHJvcHJpYXRlIHByZWFsbG9jYXRpb24sIGFuZAorICogdGhhdCB0aGUgY2FsbGVyIGhhcyBwaW5uZWQgdGhpcyB0aHJlYWQgb2YgY29udHJvbCB0byB0aGUgY3VycmVudCBDUFUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoKK3JhZGl4X3RyZWVfbm9kZV9hbGxvYyhnZnBfdCBnZnBfbWFzaywgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqcGFyZW50LAorCQkJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCXVuc2lnbmVkIGludCBzaGlmdCwgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJCXVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IGV4Y2VwdGlvbmFsKQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnJldCA9IE5VTEw7CisKKwkvKgorCSAqIFByZWxvYWQgY29kZSBpc24ndCBpcnEgc2FmZSBhbmQgaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHVzZQorCSAqIHByZWxvYWRpbmcgZHVyaW5nIGFuIGludGVycnVwdCBhbnl3YXkgYXMgYWxsIHRoZSBhbGxvY2F0aW9ucyBoYXZlCisJICogdG8gYmUgYXRvbWljLiBTbyBqdXN0IGRvIG5vcm1hbCBhbGxvY2F0aW9uIHdoZW4gaW4gaW50ZXJydXB0LgorCSAqLworCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwX21hc2spICYmICFpbl9pbnRlcnJ1cHQoKSkgeworCQlzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkICpydHA7CisKKwkJLyoKKwkJICogRXZlbiBpZiB0aGUgY2FsbGVyIGhhcyBwcmVsb2FkZWQsIHRyeSB0byBhbGxvY2F0ZSBmcm9tIHRoZQorCQkgKiBjYWNoZSBmaXJzdCBmb3IgdGhlIG5ldyBub2RlIHRvIGdldCBhY2NvdW50ZWQgdG8gdGhlIG1lbW9yeQorCQkgKiBjZ3JvdXAuCisJCSAqLworCQlyZXQgPSBrbWVtX2NhY2hlX2FsbG9jKHJhZGl4X3RyZWVfbm9kZV9jYWNoZXAsCisJCQkJICAgICAgIGdmcF9tYXNrIHwgX19HRlBfTk9XQVJOKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCisJCS8qCisJCSAqIFByb3ZpZGVkIHRoZSBjYWxsZXIgaGFzIHByZWxvYWRlZCBoZXJlLCB3ZSB3aWxsIGFsd2F5cworCQkgKiBzdWNjZWVkIGluIGdldHRpbmcgYSBub2RlIGhlcmUgKGFuZCBuZXZlciByZWFjaAorCQkgKiBrbWVtX2NhY2hlX2FsbG9jKQorCQkgKi8KKwkJcnRwID0gdGhpc19jcHVfcHRyKCZyYWRpeF90cmVlX3ByZWxvYWRzKTsKKwkJaWYgKHJ0cC0+bnIpIHsKKwkJCXJldCA9IHJ0cC0+bm9kZXM7CisJCQlydHAtPm5vZGVzID0gcmV0LT5wYXJlbnQ7CisJCQlydHAtPm5yLS07CisJCX0KKwkJLyoKKwkJICogVXBkYXRlIHRoZSBhbGxvY2F0aW9uIHN0YWNrIHRyYWNlIGFzIHRoaXMgaXMgbW9yZSB1c2VmdWwKKwkJICogZm9yIGRlYnVnZ2luZy4KKwkJICovCisJCWttZW1sZWFrX3VwZGF0ZV90cmFjZShyZXQpOworCQlnb3RvIG91dDsKKwl9CisJcmV0ID0ga21lbV9jYWNoZV9hbGxvYyhyYWRpeF90cmVlX25vZGVfY2FjaGVwLCBnZnBfbWFzayk7CitvdXQ6CisJQlVHX09OKHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShyZXQpKTsKKwlpZiAocmV0KSB7CisJCXJldC0+c2hpZnQgPSBzaGlmdDsKKwkJcmV0LT5vZmZzZXQgPSBvZmZzZXQ7CisJCXJldC0+Y291bnQgPSBjb3VudDsKKwkJcmV0LT5leGNlcHRpb25hbCA9IGV4Y2VwdGlvbmFsOworCQlyZXQtPnBhcmVudCA9IHBhcmVudDsKKwkJcmV0LT5yb290ID0gcm9vdDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcmFkaXhfdHJlZV9ub2RlX3JjdV9mcmVlKHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlID0KKwkJCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlLCByY3VfaGVhZCk7CisKKwkvKgorCSAqIE11c3Qgb25seSBmcmVlIHplcm9lZCBub2RlcyBpbnRvIHRoZSBzbGFiLiAgV2UgY2FuIGJlIGxlZnQgd2l0aAorCSAqIG5vbi1OVUxMIGVudHJpZXMgYnkgcmFkaXhfdHJlZV9mcmVlX25vZGVzLCBzbyBjbGVhciB0aGUgZW50cmllcworCSAqIGFuZCB0YWdzIGhlcmUuCisJICovCisJbWVtc2V0KG5vZGUtPnNsb3RzLCAwLCBzaXplb2Yobm9kZS0+c2xvdHMpKTsKKwltZW1zZXQobm9kZS0+dGFncywgMCwgc2l6ZW9mKG5vZGUtPnRhZ3MpKTsKKwlJTklUX0xJU1RfSEVBRCgmbm9kZS0+cHJpdmF0ZV9saXN0KTsKKworCWttZW1fY2FjaGVfZnJlZShyYWRpeF90cmVlX25vZGVfY2FjaGVwLCBub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityYWRpeF90cmVlX25vZGVfZnJlZShzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlKQoreworCWNhbGxfcmN1KCZub2RlLT5yY3VfaGVhZCwgcmFkaXhfdHJlZV9ub2RlX3JjdV9mcmVlKTsKK30KKworLyoKKyAqIExvYWQgdXAgdGhpcyBDUFUncyByYWRpeF90cmVlX25vZGUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBvYmplY3RzIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgYWRkaXRpb24gb2YgYSBzaW5nbGUgZWxlbWVudCBpbiB0aGUgdHJlZSBjYW5ub3QgZmFpbC4gIE9uCisgKiBzdWNjZXNzLCByZXR1cm4gemVybywgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkLiAgT24gZXJyb3IsIHJldHVybiAtRU5PTUVNCisgKiB3aXRoIHByZWVtcHRpb24gbm90IGRpc2FibGVkLgorICoKKyAqIFRvIG1ha2UgdXNlIG9mIHRoaXMgZmFjaWxpdHksIHRoZSByYWRpeCB0cmVlIG11c3QgYmUgaW5pdGlhbGlzZWQgd2l0aG91dAorICogX19HRlBfRElSRUNUX1JFQ0xBSU0gYmVpbmcgcGFzc2VkIHRvIElOSVRfUkFESVhfVFJFRSgpLgorICovCitzdGF0aWMgX19tdXN0X2NoZWNrIGludCBfX3JhZGl4X3RyZWVfcHJlbG9hZChnZnBfdCBnZnBfbWFzaywgdW5zaWduZWQgbnIpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfcHJlbG9hZCAqcnRwOworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGU7CisJaW50IHJldCA9IC1FTk9NRU07CisKKwkvKgorCSAqIE5vZGVzIHByZWxvYWRlZCBieSBvbmUgY2dyb3VwIGNhbiBiZSBiZSB1c2VkIGJ5IGFub3RoZXIgY2dyb3VwLCBzbworCSAqIHRoZXkgc2hvdWxkIG5ldmVyIGJlIGFjY291bnRlZCB0byBhbnkgcGFydGljdWxhciBtZW1vcnkgY2dyb3VwLgorCSAqLworCWdmcF9tYXNrICY9IH5fX0dGUF9BQ0NPVU5UOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisJcnRwID0gdGhpc19jcHVfcHRyKCZyYWRpeF90cmVlX3ByZWxvYWRzKTsKKwl3aGlsZSAocnRwLT5uciA8IG5yKSB7CisJCXByZWVtcHRfZW5hYmxlKCk7CisJCW5vZGUgPSBrbWVtX2NhY2hlX2FsbG9jKHJhZGl4X3RyZWVfbm9kZV9jYWNoZXAsIGdmcF9tYXNrKTsKKwkJaWYgKG5vZGUgPT0gTlVMTCkKKwkJCWdvdG8gb3V0OworCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJcnRwID0gdGhpc19jcHVfcHRyKCZyYWRpeF90cmVlX3ByZWxvYWRzKTsKKwkJaWYgKHJ0cC0+bnIgPCBucikgeworCQkJbm9kZS0+cGFyZW50ID0gcnRwLT5ub2RlczsKKwkJCXJ0cC0+bm9kZXMgPSBub2RlOworCQkJcnRwLT5ucisrOworCQl9IGVsc2UgeworCQkJa21lbV9jYWNoZV9mcmVlKHJhZGl4X3RyZWVfbm9kZV9jYWNoZXAsIG5vZGUpOworCQl9CisJfQorCXJldCA9IDA7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIExvYWQgdXAgdGhpcyBDUFUncyByYWRpeF90cmVlX25vZGUgYnVmZmVyIHdpdGggc3VmZmljaWVudCBvYmplY3RzIHRvCisgKiBlbnN1cmUgdGhhdCB0aGUgYWRkaXRpb24gb2YgYSBzaW5nbGUgZWxlbWVudCBpbiB0aGUgdHJlZSBjYW5ub3QgZmFpbC4gIE9uCisgKiBzdWNjZXNzLCByZXR1cm4gemVybywgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkLiAgT24gZXJyb3IsIHJldHVybiAtRU5PTUVNCisgKiB3aXRoIHByZWVtcHRpb24gbm90IGRpc2FibGVkLgorICoKKyAqIFRvIG1ha2UgdXNlIG9mIHRoaXMgZmFjaWxpdHksIHRoZSByYWRpeCB0cmVlIG11c3QgYmUgaW5pdGlhbGlzZWQgd2l0aG91dAorICogX19HRlBfRElSRUNUX1JFQ0xBSU0gYmVpbmcgcGFzc2VkIHRvIElOSVRfUkFESVhfVFJFRSgpLgorICovCitpbnQgcmFkaXhfdHJlZV9wcmVsb2FkKGdmcF90IGdmcF9tYXNrKQoreworCS8qIFdhcm4gb24gbm9uLXNlbnNpY2FsIHVzZS4uLiAqLworCVdBUk5fT05fT05DRSghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwX21hc2spKTsKKwlyZXR1cm4gX19yYWRpeF90cmVlX3ByZWxvYWQoZ2ZwX21hc2ssIFJBRElYX1RSRUVfUFJFTE9BRF9TSVpFKTsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9wcmVsb2FkKTsKKworLyoKKyAqIFRoZSBzYW1lIGFzIGFib3ZlIGZ1bmN0aW9uLCBleGNlcHQgd2UgZG9uJ3QgZ3VhcmFudGVlIHByZWxvYWRpbmcgaGFwcGVucy4KKyAqIFdlIGRvIGl0LCBpZiB3ZSBkZWNpZGUgaXQgaGVscHMuIE9uIHN1Y2Nlc3MsIHJldHVybiB6ZXJvIHdpdGggcHJlZW1wdGlvbgorICogZGlzYWJsZWQuIE9uIGVycm9yLCByZXR1cm4gLUVOT01FTSB3aXRoIHByZWVtcHRpb24gbm90IGRpc2FibGVkLgorICovCitpbnQgcmFkaXhfdHJlZV9tYXliZV9wcmVsb2FkKGdmcF90IGdmcF9tYXNrKQoreworCWlmIChnZnBmbGFnc19hbGxvd19ibG9ja2luZyhnZnBfbWFzaykpCisJCXJldHVybiBfX3JhZGl4X3RyZWVfcHJlbG9hZChnZnBfbWFzaywgUkFESVhfVFJFRV9QUkVMT0FEX1NJWkUpOworCS8qIFByZWxvYWRpbmcgZG9lc24ndCBoZWxwIGFueXRoaW5nIHdpdGggdGhpcyBnZnAgbWFzaywgc2tpcCBpdCAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX21heWJlX3ByZWxvYWQpOworCisjaWZkZWYgQ09ORklHX1JBRElYX1RSRUVfTVVMVElPUkRFUgorLyoKKyAqIFByZWxvYWQgd2l0aCBlbm91Z2ggb2JqZWN0cyB0byBlbnN1cmUgdGhhdCB3ZSBjYW4gc3BsaXQgYSBzaW5nbGUgZW50cnkKKyAqIG9mIG9yZGVyIEBvbGRfb3JkZXIgaW50byBtYW55IGVudHJpZXMgb2Ygc2l6ZSBAbmV3X29yZGVyCisgKi8KK2ludCByYWRpeF90cmVlX3NwbGl0X3ByZWxvYWQodW5zaWduZWQgaW50IG9sZF9vcmRlciwgdW5zaWduZWQgaW50IG5ld19vcmRlciwKKwkJCQkJCQlnZnBfdCBnZnBfbWFzaykKK3sKKwl1bnNpZ25lZCB0b3AgPSAxIDw8IChvbGRfb3JkZXIgJSBSQURJWF9UUkVFX01BUF9TSElGVCk7CisJdW5zaWduZWQgbGF5ZXJzID0gKG9sZF9vcmRlciAvIFJBRElYX1RSRUVfTUFQX1NISUZUKSAtCisJCQkJKG5ld19vcmRlciAvIFJBRElYX1RSRUVfTUFQX1NISUZUKTsKKwl1bnNpZ25lZCBuciA9IDA7CisKKwlXQVJOX09OX09OQ0UoIWdmcGZsYWdzX2FsbG93X2Jsb2NraW5nKGdmcF9tYXNrKSk7CisJQlVHX09OKG5ld19vcmRlciA+PSBvbGRfb3JkZXIpOworCisJd2hpbGUgKGxheWVycy0tKQorCQluciA9IG5yICogUkFESVhfVFJFRV9NQVBfU0laRSArIDE7CisJcmV0dXJuIF9fcmFkaXhfdHJlZV9wcmVsb2FkKGdmcF9tYXNrLCB0b3AgKiBucik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoZSBzYW1lIGFzIGZ1bmN0aW9uIGFib3ZlLCBidXQgcHJlbG9hZCBudW1iZXIgb2Ygbm9kZXMgcmVxdWlyZWQgdG8gaW5zZXJ0CisgKiAoMSA8PCBvcmRlcikgY29udGludW91cyBuYXR1cmFsbHktYWxpZ25lZCBlbGVtZW50cy4KKyAqLworaW50IHJhZGl4X3RyZWVfbWF5YmVfcHJlbG9hZF9vcmRlcihnZnBfdCBnZnBfbWFzaywgaW50IG9yZGVyKQoreworCXVuc2lnbmVkIGxvbmcgbnJfc3VidHJlZXM7CisJaW50IG5yX25vZGVzLCBzdWJ0cmVlX2hlaWdodDsKKworCS8qIFByZWxvYWRpbmcgZG9lc24ndCBoZWxwIGFueXRoaW5nIHdpdGggdGhpcyBnZnAgbWFzaywgc2tpcCBpdCAqLworCWlmICghZ2ZwZmxhZ3NfYWxsb3dfYmxvY2tpbmcoZ2ZwX21hc2spKSB7CisJCXByZWVtcHRfZGlzYWJsZSgpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIENhbGN1bGF0ZSBudW1iZXIgYW5kIGhlaWdodCBvZiBmdWxseSBwb3B1bGF0ZWQgc3VidHJlZXMgaXQgdGFrZXMgdG8KKwkgKiBzdG9yZSAoMSA8PCBvcmRlcikgZWxlbWVudHMuCisJICovCisJbnJfc3VidHJlZXMgPSAxIDw8IG9yZGVyOworCWZvciAoc3VidHJlZV9oZWlnaHQgPSAwOyBucl9zdWJ0cmVlcyA+IFJBRElYX1RSRUVfTUFQX1NJWkU7CisJCQlzdWJ0cmVlX2hlaWdodCsrKQorCQlucl9zdWJ0cmVlcyA+Pj0gUkFESVhfVFJFRV9NQVBfU0hJRlQ7CisKKwkvKgorCSAqIFRoZSB3b3JzdCBjYXNlIGlzIHplcm8gaGVpZ2h0IHRyZWUgd2l0aCBhIHNpbmdsZSBpdGVtIGF0IGluZGV4IDAgYW5kCisJICogdGhlbiBpbnNlcnRpbmcgaXRlbXMgc3RhcnRpbmcgYXQgVUxPTkdfTUFYIC0gKDEgPDwgb3JkZXIpLgorCSAqCisJICogVGhpcyByZXF1aXJlcyBSQURJWF9UUkVFX01BWF9QQVRIIG5vZGVzIHRvIGJ1aWxkIGJyYW5jaCBmcm9tIHJvb3QgdG8KKwkgKiAwLWluZGV4IGl0ZW0uCisJICovCisJbnJfbm9kZXMgPSBSQURJWF9UUkVFX01BWF9QQVRIOworCisJLyogUGx1cyBicmFuY2ggdG8gZnVsbHkgcG9wdWxhdGVkIHN1YnRyZWVzLiAqLworCW5yX25vZGVzICs9IFJBRElYX1RSRUVfTUFYX1BBVEggLSBzdWJ0cmVlX2hlaWdodDsKKworCS8qIFJvb3Qgbm9kZSBpcyBzaGFyZWQuICovCisJbnJfbm9kZXMtLTsKKworCS8qIFBsdXMgbm9kZXMgcmVxdWlyZWQgdG8gYnVpbGQgc3VidHJlZXMuICovCisJbnJfbm9kZXMgKz0gbnJfc3VidHJlZXMgKiBoZWlnaHRfdG9fbWF4bm9kZXNbc3VidHJlZV9oZWlnaHRdOworCisJcmV0dXJuIF9fcmFkaXhfdHJlZV9wcmVsb2FkKGdmcF9tYXNrLCBucl9ub2Rlcyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCByYWRpeF90cmVlX2xvYWRfcm9vdChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqbm9kZXAsIHVuc2lnbmVkIGxvbmcgKm1heGluZGV4KQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHJvb3QtPnJub2RlKTsKKworCSpub2RlcCA9IG5vZGU7CisKKwlpZiAobGlrZWx5KHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShub2RlKSkpIHsKKwkJbm9kZSA9IGVudHJ5X3RvX25vZGUobm9kZSk7CisJCSptYXhpbmRleCA9IG5vZGVfbWF4aW5kZXgobm9kZSk7CisJCXJldHVybiBub2RlLT5zaGlmdCArIFJBRElYX1RSRUVfTUFQX1NISUZUOworCX0KKworCSptYXhpbmRleCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglFeHRlbmQgYSByYWRpeCB0cmVlIHNvIGl0IGNhbiBzdG9yZSBrZXkgQGluZGV4LgorICovCitzdGF0aWMgaW50IHJhZGl4X3RyZWVfZXh0ZW5kKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIGdmcF90IGdmcCwKKwkJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBpbnQgc2hpZnQpCit7CisJdm9pZCAqZW50cnk7CisJdW5zaWduZWQgaW50IG1heHNoaWZ0OworCWludCB0YWc7CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgdGhlIHNoaWZ0IHNob3VsZCBiZS4gICovCisJbWF4c2hpZnQgPSBzaGlmdDsKKwl3aGlsZSAoaW5kZXggPiBzaGlmdF9tYXhpbmRleChtYXhzaGlmdCkpCisJCW1heHNoaWZ0ICs9IFJBRElYX1RSRUVfTUFQX1NISUZUOworCisJZW50cnkgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHJvb3QtPnJub2RlKTsKKwlpZiAoIWVudHJ5ICYmICghaXNfaWRyKHJvb3QpIHx8IHJvb3RfdGFnX2dldChyb290LCBJRFJfRlJFRSkpKQorCQlnb3RvIG91dDsKKworCWRvIHsKKwkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSA9IHJhZGl4X3RyZWVfbm9kZV9hbGxvYyhnZnAsIE5VTEwsCisJCQkJCQkJcm9vdCwgc2hpZnQsIDAsIDEsIDApOworCQlpZiAoIW5vZGUpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoaXNfaWRyKHJvb3QpKSB7CisJCQlhbGxfdGFnX3NldChub2RlLCBJRFJfRlJFRSk7CisJCQlpZiAoIXJvb3RfdGFnX2dldChyb290LCBJRFJfRlJFRSkpIHsKKwkJCQl0YWdfY2xlYXIobm9kZSwgSURSX0ZSRUUsIDApOworCQkJCXJvb3RfdGFnX3NldChyb290LCBJRFJfRlJFRSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBQcm9wYWdhdGUgdGhlIGFnZ3JlZ2F0ZWQgdGFnIGluZm8gdG8gdGhlIG5ldyBjaGlsZCAqLworCQkJZm9yICh0YWcgPSAwOyB0YWcgPCBSQURJWF9UUkVFX01BWF9UQUdTOyB0YWcrKykgeworCQkJCWlmIChyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKKwkJCQkJdGFnX3NldChub2RlLCB0YWcsIDApOworCQkJfQorCQl9CisKKwkJQlVHX09OKHNoaWZ0ID4gQklUU19QRVJfTE9ORyk7CisJCWlmIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoZW50cnkpKSB7CisJCQllbnRyeV90b19ub2RlKGVudHJ5KS0+cGFyZW50ID0gbm9kZTsKKwkJfSBlbHNlIGlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KGVudHJ5KSkgeworCQkJLyogTW92aW5nIGFuIGV4Y2VwdGlvbmFsIHJvb3QtPnJub2RlIHRvIGEgbm9kZSAqLworCQkJbm9kZS0+ZXhjZXB0aW9uYWwgPSAxOworCQl9CisJCS8qCisJCSAqIGVudHJ5IHdhcyBhbHJlYWR5IGluIHRoZSByYWRpeCB0cmVlLCBzbyB3ZSBkbyBub3QgbmVlZAorCQkgKiByY3VfYXNzaWduX3BvaW50ZXIgaGVyZQorCQkgKi8KKwkJbm9kZS0+c2xvdHNbMF0gPSAodm9pZCBfX3JjdSAqKWVudHJ5OworCQllbnRyeSA9IG5vZGVfdG9fZW50cnkobm9kZSk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcihyb290LT5ybm9kZSwgZW50cnkpOworCQlzaGlmdCArPSBSQURJWF9UUkVFX01BUF9TSElGVDsKKwl9IHdoaWxlIChzaGlmdCA8PSBtYXhzaGlmdCk7CitvdXQ6CisJcmV0dXJuIG1heHNoaWZ0ICsgUkFESVhfVFJFRV9NQVBfU0hJRlQ7Cit9CisKKy8qKgorICoJcmFkaXhfdHJlZV9zaHJpbmsgICAgLSAgICBzaHJpbmsgcmFkaXggdHJlZSB0byBtaW5pbXVtIGhlaWdodAorICoJQHJvb3QJCXJhZGl4IHRyZWUgcm9vdAorICovCitzdGF0aWMgaW5saW5lIGJvb2wgcmFkaXhfdHJlZV9zaHJpbmsoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCQkgICAgIHJhZGl4X3RyZWVfdXBkYXRlX25vZGVfdCB1cGRhdGVfbm9kZSwKKwkJCQkgICAgIHZvaWQgKnByaXZhdGUpCit7CisJYm9vbCBzaHJ1bmsgPSBmYWxzZTsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcocm9vdC0+cm5vZGUpOworCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpjaGlsZDsKKworCQlpZiAoIXJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShub2RlKSkKKwkJCWJyZWFrOworCQlub2RlID0gZW50cnlfdG9fbm9kZShub2RlKTsKKworCQkvKgorCQkgKiBUaGUgY2FuZGlkYXRlIG5vZGUgaGFzIG1vcmUgdGhhbiBvbmUgY2hpbGQsIG9yIGl0cyBjaGlsZAorCQkgKiBpcyBub3QgYXQgdGhlIGxlZnRtb3N0IHNsb3QsIG9yIHRoZSBjaGlsZCBpcyBhIG11bHRpb3JkZXIKKwkJICogZW50cnksIHdlIGNhbm5vdCBzaHJpbmsuCisJCSAqLworCQlpZiAobm9kZS0+Y291bnQgIT0gMSkKKwkJCWJyZWFrOworCQljaGlsZCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcobm9kZS0+c2xvdHNbMF0pOworCQlpZiAoIWNoaWxkKQorCQkJYnJlYWs7CisJCWlmICghcmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKGNoaWxkKSAmJiBub2RlLT5zaGlmdCkKKwkJCWJyZWFrOworCisJCWlmIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoY2hpbGQpKQorCQkJZW50cnlfdG9fbm9kZShjaGlsZCktPnBhcmVudCA9IE5VTEw7CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgbmVlZCByY3VfYXNzaWduX3BvaW50ZXIoKSwgc2luY2Ugd2UgYXJlIHNpbXBseQorCQkgKiBtb3ZpbmcgdGhlIG5vZGUgZnJvbSBvbmUgcGFydCBvZiB0aGUgdHJlZSB0byBhbm90aGVyOiBpZiBpdAorCQkgKiB3YXMgc2FmZSB0byBkZXJlZmVyZW5jZSB0aGUgb2xkIHBvaW50ZXIgdG8gaXQKKwkJICogKG5vZGUtPnNsb3RzWzBdKSwgaXQgd2lsbCBiZSBzYWZlIHRvIGRlcmVmZXJlbmNlIHRoZSBuZXcKKwkJICogb25lIChyb290LT5ybm9kZSkgYXMgZmFyIGFzIGRlcGVuZGVudCByZWFkIGJhcnJpZXJzIGdvLgorCQkgKi8KKwkJcm9vdC0+cm5vZGUgPSAodm9pZCBfX3JjdSAqKWNoaWxkOworCQlpZiAoaXNfaWRyKHJvb3QpICYmICF0YWdfZ2V0KG5vZGUsIElEUl9GUkVFLCAwKSkKKwkJCXJvb3RfdGFnX2NsZWFyKHJvb3QsIElEUl9GUkVFKTsKKworCQkvKgorCQkgKiBXZSBoYXZlIGEgZGlsZW1tYSBoZXJlLiBUaGUgbm9kZSdzIHNsb3RbMF0gbXVzdCBub3QgYmUKKwkJICogTlVMTGVkIGluIGNhc2UgdGhlcmUgYXJlIGNvbmN1cnJlbnQgbG9va3VwcyBleHBlY3RpbmcgdG8KKwkJICogZmluZCB0aGUgaXRlbS4gSG93ZXZlciBpZiB0aGlzIHdhcyBhIGJvdHRvbS1sZXZlbCBub2RlLAorCQkgKiB0aGVuIGl0IG1heSBiZSBzdWJqZWN0IHRvIHRoZSBzbG90IHBvaW50ZXIgYmVpbmcgdmlzaWJsZQorCQkgKiB0byBjYWxsZXJzIGRlcmVmZXJlbmNpbmcgaXQuIElmIGl0ZW0gY29ycmVzcG9uZGluZyB0bworCQkgKiBzbG90WzBdIGlzIHN1YnNlcXVlbnRseSBkZWxldGVkLCB0aGVzZSBjYWxsZXJzIHdvdWxkIGV4cGVjdAorCQkgKiB0aGVpciBzbG90IHRvIGJlY29tZSBlbXB0eSBzb29uZXIgb3IgbGF0ZXIuCisJCSAqCisJCSAqIEZvciBleGFtcGxlLCBsb2NrbGVzcyBwYWdlY2FjaGUgd2lsbCBsb29rIHVwIGEgc2xvdCwgZGVyZWYKKwkJICogdGhlIHBhZ2UgcG9pbnRlciwgYW5kIGlmIHRoZSBwYWdlIGhhcyAwIHJlZmNvdW50IGl0IG1lYW5zIGl0CisJCSAqIHdhcyBjb25jdXJyZW50bHkgZGVsZXRlZCBmcm9tIHBhZ2VjYWNoZSBzbyB0cnkgdGhlIGRlcmVmCisJCSAqIGFnYWluLiBGb3J0dW5hdGVseSB0aGVyZSBpcyBhbHJlYWR5IGEgcmVxdWlyZW1lbnQgZm9yIGxvZ2ljCisJCSAqIHRvIHJldHJ5IHRoZSBlbnRpcmUgc2xvdCBsb29rdXAgLS0gdGhlIGluZGlyZWN0IHBvaW50ZXIKKwkJICogcHJvYmxlbSAocmVwbGFjaW5nIGRpcmVjdCByb290IG5vZGUgd2l0aCBhbiBpbmRpcmVjdCBwb2ludGVyCisJCSAqIGFsc28gcmVzdWx0cyBpbiBhIHN0YWxlIHNsb3QpLiBTbyB0YWcgdGhlIHNsb3QgYXMgaW5kaXJlY3QKKwkJICogdG8gZm9yY2UgY2FsbGVycyB0byByZXRyeS4KKwkJICovCisJCW5vZGUtPmNvdW50ID0gMDsKKwkJaWYgKCFyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoY2hpbGQpKSB7CisJCQlub2RlLT5zbG90c1swXSA9ICh2b2lkIF9fcmN1ICopUkFESVhfVFJFRV9SRVRSWTsKKwkJCWlmICh1cGRhdGVfbm9kZSkKKwkJCQl1cGRhdGVfbm9kZShub2RlLCBwcml2YXRlKTsKKwkJfQorCisJCVdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmbm9kZS0+cHJpdmF0ZV9saXN0KSk7CisJCXJhZGl4X3RyZWVfbm9kZV9mcmVlKG5vZGUpOworCQlzaHJ1bmsgPSB0cnVlOworCX0KKworCXJldHVybiBzaHJ1bms7Cit9CisKK3N0YXRpYyBib29sIGRlbGV0ZV9ub2RlKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLAorCQkJcmFkaXhfdHJlZV91cGRhdGVfbm9kZV90IHVwZGF0ZV9ub2RlLCB2b2lkICpwcml2YXRlKQoreworCWJvb2wgZGVsZXRlZCA9IGZhbHNlOworCisJZG8geworCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpwYXJlbnQ7CisKKwkJaWYgKG5vZGUtPmNvdW50KSB7CisJCQlpZiAobm9kZV90b19lbnRyeShub2RlKSA9PQorCQkJCQlyY3VfZGVyZWZlcmVuY2VfcmF3KHJvb3QtPnJub2RlKSkKKwkJCQlkZWxldGVkIHw9IHJhZGl4X3RyZWVfc2hyaW5rKHJvb3QsIHVwZGF0ZV9ub2RlLAorCQkJCQkJCQlwcml2YXRlKTsKKwkJCXJldHVybiBkZWxldGVkOworCQl9CisKKwkJcGFyZW50ID0gbm9kZS0+cGFyZW50OworCQlpZiAocGFyZW50KSB7CisJCQlwYXJlbnQtPnNsb3RzW25vZGUtPm9mZnNldF0gPSBOVUxMOworCQkJcGFyZW50LT5jb3VudC0tOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIFNob3VsZG4ndCB0aGUgdGFncyBhbHJlYWR5IGhhdmUgYWxsIGJlZW4gY2xlYXJlZAorCQkJICogYnkgdGhlIGNhbGxlcj8KKwkJCSAqLworCQkJaWYgKCFpc19pZHIocm9vdCkpCisJCQkJcm9vdF90YWdfY2xlYXJfYWxsKHJvb3QpOworCQkJcm9vdC0+cm5vZGUgPSBOVUxMOworCQl9CisKKwkJV0FSTl9PTl9PTkNFKCFsaXN0X2VtcHR5KCZub2RlLT5wcml2YXRlX2xpc3QpKTsKKwkJcmFkaXhfdHJlZV9ub2RlX2ZyZWUobm9kZSk7CisJCWRlbGV0ZWQgPSB0cnVlOworCisJCW5vZGUgPSBwYXJlbnQ7CisJfSB3aGlsZSAobm9kZSk7CisKKwlyZXR1cm4gZGVsZXRlZDsKK30KKworLyoqCisgKglfX3JhZGl4X3RyZWVfY3JlYXRlCS0JY3JlYXRlIGEgc2xvdCBpbiBhIHJhZGl4IHRyZWUKKyAqCUByb290OgkJcmFkaXggdHJlZSByb290CisgKglAaW5kZXg6CQlpbmRleCBrZXkKKyAqCUBvcmRlcjoJCWluZGV4IG9jY3VwaWVzIDJeb3JkZXIgYWxpZ25lZCBzbG90cworICoJQG5vZGVwOgkJcmV0dXJucyBub2RlCisgKglAc2xvdHA6CQlyZXR1cm5zIHNsb3QKKyAqCisgKglDcmVhdGUsIGlmIG5lY2Vzc2FyeSwgYW5kIHJldHVybiB0aGUgbm9kZSBhbmQgc2xvdCBmb3IgYW4gaXRlbQorICoJYXQgcG9zaXRpb24gQGluZGV4IGluIHRoZSByYWRpeCB0cmVlIEByb290LgorICoKKyAqCVVudGlsIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaXRlbSBpbiB0aGUgdHJlZSwgbm8gbm9kZXMgYXJlCisgKglhbGxvY2F0ZWQgYW5kIEByb290LT5ybm9kZSBpcyB1c2VkIGFzIGEgZGlyZWN0IHNsb3QgaW5zdGVhZCBvZgorICoJcG9pbnRpbmcgdG8gYSBub2RlLCBpbiB3aGljaCBjYXNlICpAbm9kZXAgd2lsbCBiZSBOVUxMLgorICoKKyAqCVJldHVybnMgLUVOT01FTSwgb3IgMCBmb3Igc3VjY2Vzcy4KKyAqLworaW50IF9fcmFkaXhfdHJlZV9jcmVhdGUoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdW5zaWduZWQgbG9uZyBpbmRleCwKKwkJCXVuc2lnbmVkIG9yZGVyLCBzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqbm9kZXAsCisJCQl2b2lkIF9fcmN1ICoqKnNsb3RwKQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUgPSBOVUxMLCAqY2hpbGQ7CisJdm9pZCBfX3JjdSAqKnNsb3QgPSAodm9pZCBfX3JjdSAqKikmcm9vdC0+cm5vZGU7CisJdW5zaWduZWQgbG9uZyBtYXhpbmRleDsKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIG9mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBtYXggPSBpbmRleCB8ICgoMVVMIDw8IG9yZGVyKSAtIDEpOworCWdmcF90IGdmcCA9IHJvb3RfZ2ZwX21hc2socm9vdCk7CisKKwlzaGlmdCA9IHJhZGl4X3RyZWVfbG9hZF9yb290KHJvb3QsICZjaGlsZCwgJm1heGluZGV4KTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgdHJlZSBpcyBoaWdoIGVub3VnaC4gICovCisJaWYgKG9yZGVyID4gMCAmJiBtYXggPT0gKCgxVUwgPDwgb3JkZXIpIC0gMSkpCisJCW1heCsrOworCWlmIChtYXggPiBtYXhpbmRleCkgeworCQlpbnQgZXJyb3IgPSByYWRpeF90cmVlX2V4dGVuZChyb290LCBnZnAsIG1heCwgc2hpZnQpOworCQlpZiAoZXJyb3IgPCAwKQorCQkJcmV0dXJuIGVycm9yOworCQlzaGlmdCA9IGVycm9yOworCQljaGlsZCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcocm9vdC0+cm5vZGUpOworCX0KKworCXdoaWxlIChzaGlmdCA+IG9yZGVyKSB7CisJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOworCQlpZiAoY2hpbGQgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhZGQgYSBjaGlsZCBub2RlLiAgKi8KKwkJCWNoaWxkID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKGdmcCwgbm9kZSwgcm9vdCwgc2hpZnQsCisJCQkJCQkJb2Zmc2V0LCAwLCAwKTsKKwkJCWlmICghY2hpbGQpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoKnNsb3QsIG5vZGVfdG9fZW50cnkoY2hpbGQpKTsKKwkJCWlmIChub2RlKQorCQkJCW5vZGUtPmNvdW50Kys7CisJCX0gZWxzZSBpZiAoIXJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShjaGlsZCkpCisJCQlicmVhazsKKworCQkvKiBHbyBhIGxldmVsIGRvd24gKi8KKwkJbm9kZSA9IGVudHJ5X3RvX25vZGUoY2hpbGQpOworCQlvZmZzZXQgPSByYWRpeF90cmVlX2Rlc2NlbmQobm9kZSwgJmNoaWxkLCBpbmRleCk7CisJCXNsb3QgPSAmbm9kZS0+c2xvdHNbb2Zmc2V0XTsKKwl9CisKKwlpZiAobm9kZXApCisJCSpub2RlcCA9IG5vZGU7CisJaWYgKHNsb3RwKQorCQkqc2xvdHAgPSBzbG90OworCXJldHVybiAwOworfQorCisvKgorICogRnJlZSBhbnkgbm9kZXMgYmVsb3cgdGhpcyBub2RlLiAgVGhlIHRyZWUgaXMgcHJlc3VtZWQgdG8gbm90IG5lZWQKKyAqIHNocmlua2luZywgYW5kIGFueSB1c2VyIGRhdGEgaW4gdGhlIHRyZWUgaXMgcHJlc3VtZWQgdG8gbm90IG5lZWQgYQorICogZGVzdHJ1Y3RvciBjYWxsZWQgb24gaXQuICBJZiB3ZSBuZWVkIHRvIGFkZCBhIGRlc3RydWN0b3IsIHdlIGNhbgorICogYWRkIHRoYXQgZnVuY3Rpb25hbGl0eSBsYXRlci4gIE5vdGUgdGhhdCB3ZSBtYXkgbm90IGNsZWFyIHRhZ3Mgb3IKKyAqIHNsb3RzIGZyb20gdGhlIHRyZWUgYXMgYW4gUkNVIHdhbGtlciBtYXkgc3RpbGwgaGF2ZSBhIHBvaW50ZXIgaW50bworICogdGhpcyBzdWJ0cmVlLiAgV2UgY291bGQgcmVwbGFjZSB0aGUgZW50cmllcyB3aXRoIFJBRElYX1RSRUVfUkVUUlksCisgKiBidXQgd2UnbGwgc3RpbGwgaGF2ZSB0byBjbGVhciB0aG9zZSBpbiByY3VfZnJlZS4KKyAqLworc3RhdGljIHZvaWQgcmFkaXhfdHJlZV9mcmVlX25vZGVzKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUpCit7CisJdW5zaWduZWQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpjaGlsZCA9IGVudHJ5X3RvX25vZGUobm9kZSk7CisKKwlmb3IgKDs7KSB7CisJCXZvaWQgKmVudHJ5ID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhjaGlsZC0+c2xvdHNbb2Zmc2V0XSk7CisJCWlmIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoZW50cnkpICYmCisJCQkJCSFpc19zaWJsaW5nX2VudHJ5KGNoaWxkLCBlbnRyeSkpIHsKKwkJCWNoaWxkID0gZW50cnlfdG9fbm9kZShlbnRyeSk7CisJCQlvZmZzZXQgPSAwOworCQkJY29udGludWU7CisJCX0KKwkJb2Zmc2V0Kys7CisJCXdoaWxlIChvZmZzZXQgPT0gUkFESVhfVFJFRV9NQVBfU0laRSkgeworCQkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqb2xkID0gY2hpbGQ7CisJCQlvZmZzZXQgPSBjaGlsZC0+b2Zmc2V0ICsgMTsKKwkJCWNoaWxkID0gY2hpbGQtPnBhcmVudDsKKwkJCVdBUk5fT05fT05DRSghbGlzdF9lbXB0eSgmb2xkLT5wcml2YXRlX2xpc3QpKTsKKwkJCXJhZGl4X3RyZWVfbm9kZV9mcmVlKG9sZCk7CisJCQlpZiAob2xkID09IGVudHJ5X3RvX25vZGUobm9kZSkpCisJCQkJcmV0dXJuOworCQl9CisJfQorfQorCisjaWZkZWYgQ09ORklHX1JBRElYX1RSRUVfTVVMVElPUkRFUgorc3RhdGljIGlubGluZSBpbnQgaW5zZXJ0X2VudHJpZXMoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJdm9pZCBfX3JjdSAqKnNsb3QsIHZvaWQgKml0ZW0sIHVuc2lnbmVkIG9yZGVyLCBib29sIHJlcGxhY2UpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqY2hpbGQ7CisJdW5zaWduZWQgaSwgbiwgdGFnLCBvZmZzZXQsIHRhZ3MgPSAwOworCisJaWYgKG5vZGUpIHsKKwkJaWYgKG9yZGVyID4gbm9kZS0+c2hpZnQpCisJCQluID0gMSA8PCAob3JkZXIgLSBub2RlLT5zaGlmdCk7CisJCWVsc2UKKwkJCW4gPSAxOworCQlvZmZzZXQgPSBnZXRfc2xvdF9vZmZzZXQobm9kZSwgc2xvdCk7CisJfSBlbHNlIHsKKwkJbiA9IDE7CisJCW9mZnNldCA9IDA7CisJfQorCisJaWYgKG4gPiAxKSB7CisJCW9mZnNldCA9IG9mZnNldCAmIH4obiAtIDEpOworCQlzbG90ID0gJm5vZGUtPnNsb3RzW29mZnNldF07CisJfQorCWNoaWxkID0gbm9kZV90b19lbnRyeShzbG90KTsKKworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJaWYgKHNsb3RbaV0pIHsKKwkJCWlmIChyZXBsYWNlKSB7CisJCQkJbm9kZS0+Y291bnQtLTsKKwkJCQlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKQorCQkJCQlpZiAodGFnX2dldChub2RlLCB0YWcsIG9mZnNldCArIGkpKQorCQkJCQkJdGFncyB8PSAxIDw8IHRhZzsKKwkJCX0gZWxzZQorCQkJCXJldHVybiAtRUVYSVNUOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpvbGQgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHNsb3RbaV0pOworCQlpZiAoaSkgeworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHNsb3RbaV0sIGNoaWxkKTsKKwkJCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspCisJCQkJaWYgKHRhZ3MgJiAoMSA8PCB0YWcpKQorCQkJCQl0YWdfY2xlYXIobm9kZSwgdGFnLCBvZmZzZXQgKyBpKTsKKwkJfSBlbHNlIHsKKwkJCXJjdV9hc3NpZ25fcG9pbnRlcihzbG90W2ldLCBpdGVtKTsKKwkJCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspCisJCQkJaWYgKHRhZ3MgJiAoMSA8PCB0YWcpKQorCQkJCQl0YWdfc2V0KG5vZGUsIHRhZywgb2Zmc2V0KTsKKwkJfQorCQlpZiAocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKG9sZCkgJiYKKwkJCQkJIWlzX3NpYmxpbmdfZW50cnkobm9kZSwgb2xkKSAmJgorCQkJCQkob2xkICE9IFJBRElYX1RSRUVfUkVUUlkpKQorCQkJcmFkaXhfdHJlZV9mcmVlX25vZGVzKG9sZCk7CisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KG9sZCkpCisJCQlub2RlLT5leGNlcHRpb25hbC0tOworCX0KKwlpZiAobm9kZSkgeworCQlub2RlLT5jb3VudCArPSBuOworCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShpdGVtKSkKKwkJCW5vZGUtPmV4Y2VwdGlvbmFsICs9IG47CisJfQorCXJldHVybiBuOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGluc2VydF9lbnRyaWVzKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCXZvaWQgX19yY3UgKipzbG90LCB2b2lkICppdGVtLCB1bnNpZ25lZCBvcmRlciwgYm9vbCByZXBsYWNlKQoreworCWlmICgqc2xvdCkKKwkJcmV0dXJuIC1FRVhJU1Q7CisJcmN1X2Fzc2lnbl9wb2ludGVyKCpzbG90LCBpdGVtKTsKKwlpZiAobm9kZSkgeworCQlub2RlLT5jb3VudCsrOworCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShpdGVtKSkKKwkJCW5vZGUtPmV4Y2VwdGlvbmFsKys7CisJfQorCXJldHVybiAxOworfQorI2VuZGlmCisKKy8qKgorICoJX19yYWRpeF90cmVlX2luc2VydCAgICAtICAgIGluc2VydCBpbnRvIGEgcmFkaXggdHJlZQorICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBpbmRleDoJCWluZGV4IGtleQorICoJQG9yZGVyOgkJa2V5IGNvdmVycyB0aGUgMl5vcmRlciBpbmRpY2VzIGFyb3VuZCBpbmRleAorICoJQGl0ZW06CQlpdGVtIHRvIGluc2VydAorICoKKyAqCUluc2VydCBhbiBpdGVtIGludG8gdGhlIHJhZGl4IHRyZWUgYXQgcG9zaXRpb24gQGluZGV4LgorICovCitpbnQgX19yYWRpeF90cmVlX2luc2VydChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGluZGV4LAorCQkJdW5zaWduZWQgb3JkZXIsIHZvaWQgKml0ZW0pCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl2b2lkIF9fcmN1ICoqc2xvdDsKKwlpbnQgZXJyb3I7CisKKwlCVUdfT04ocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKGl0ZW0pKTsKKworCWVycm9yID0gX19yYWRpeF90cmVlX2NyZWF0ZShyb290LCBpbmRleCwgb3JkZXIsICZub2RlLCAmc2xvdCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwllcnJvciA9IGluc2VydF9lbnRyaWVzKG5vZGUsIHNsb3QsIGl0ZW0sIG9yZGVyLCBmYWxzZSk7CisJaWYgKGVycm9yIDwgMCkKKwkJcmV0dXJuIGVycm9yOworCisJaWYgKG5vZGUpIHsKKwkJdW5zaWduZWQgb2Zmc2V0ID0gZ2V0X3Nsb3Rfb2Zmc2V0KG5vZGUsIHNsb3QpOworCQlCVUdfT04odGFnX2dldChub2RlLCAwLCBvZmZzZXQpKTsKKwkJQlVHX09OKHRhZ19nZXQobm9kZSwgMSwgb2Zmc2V0KSk7CisJCUJVR19PTih0YWdfZ2V0KG5vZGUsIDIsIG9mZnNldCkpOworCX0gZWxzZSB7CisJCUJVR19PTihyb290X3RhZ3NfZ2V0KHJvb3QpKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19yYWRpeF90cmVlX2luc2VydCk7CisKKy8qKgorICoJX19yYWRpeF90cmVlX2xvb2t1cAktCWxvb2t1cCBhbiBpdGVtIGluIGEgcmFkaXggdHJlZQorICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBpbmRleDoJCWluZGV4IGtleQorICoJQG5vZGVwOgkJcmV0dXJucyBub2RlCisgKglAc2xvdHA6CQlyZXR1cm5zIHNsb3QKKyAqCisgKglMb29rdXAgYW5kIHJldHVybiB0aGUgaXRlbSBhdCBwb3NpdGlvbiBAaW5kZXggaW4gdGhlIHJhZGl4CisgKgl0cmVlIEByb290LgorICoKKyAqCVVudGlsIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgaXRlbSBpbiB0aGUgdHJlZSwgbm8gbm9kZXMgYXJlCisgKglhbGxvY2F0ZWQgYW5kIEByb290LT5ybm9kZSBpcyB1c2VkIGFzIGEgZGlyZWN0IHNsb3QgaW5zdGVhZCBvZgorICoJcG9pbnRpbmcgdG8gYSBub2RlLCBpbiB3aGljaCBjYXNlICpAbm9kZXAgd2lsbCBiZSBOVUxMLgorICovCit2b2lkICpfX3JhZGl4X3RyZWVfbG9va3VwKGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkgIHVuc2lnbmVkIGxvbmcgaW5kZXgsIHN0cnVjdCByYWRpeF90cmVlX25vZGUgKipub2RlcCwKKwkJCSAgdm9pZCBfX3JjdSAqKipzbG90cCkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCAqcGFyZW50OworCXVuc2lnbmVkIGxvbmcgbWF4aW5kZXg7CisJdm9pZCBfX3JjdSAqKnNsb3Q7CisKKyByZXN0YXJ0OgorCXBhcmVudCA9IE5VTEw7CisJc2xvdCA9ICh2b2lkIF9fcmN1ICoqKSZyb290LT5ybm9kZTsKKwlyYWRpeF90cmVlX2xvYWRfcm9vdChyb290LCAmbm9kZSwgJm1heGluZGV4KTsKKwlpZiAoaW5kZXggPiBtYXhpbmRleCkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKG5vZGUpKSB7CisJCXVuc2lnbmVkIG9mZnNldDsKKworCQlpZiAobm9kZSA9PSBSQURJWF9UUkVFX1JFVFJZKQorCQkJZ290byByZXN0YXJ0OworCQlwYXJlbnQgPSBlbnRyeV90b19ub2RlKG5vZGUpOworCQlvZmZzZXQgPSByYWRpeF90cmVlX2Rlc2NlbmQocGFyZW50LCAmbm9kZSwgaW5kZXgpOworCQlzbG90ID0gcGFyZW50LT5zbG90cyArIG9mZnNldDsKKwl9CisKKwlpZiAobm9kZXApCisJCSpub2RlcCA9IHBhcmVudDsKKwlpZiAoc2xvdHApCisJCSpzbG90cCA9IHNsb3Q7CisJcmV0dXJuIG5vZGU7Cit9CisKKy8qKgorICoJcmFkaXhfdHJlZV9sb29rdXBfc2xvdCAgICAtICAgIGxvb2t1cCBhIHNsb3QgaW4gYSByYWRpeCB0cmVlCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQGluZGV4OgkJaW5kZXgga2V5CisgKgorICoJUmV0dXJuczogIHRoZSBzbG90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBvc2l0aW9uIEBpbmRleCBpbiB0aGUKKyAqCXJhZGl4IHRyZWUgQHJvb3QuIFRoaXMgaXMgdXNlZnVsIGZvciB1cGRhdGUtaWYtZXhpc3RzIG9wZXJhdGlvbnMuCisgKgorICoJVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2sgaWZmIHRoZSBzbG90IGlzIG5vdAorICoJbW9kaWZpZWQgYnkgcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QsIG90aGVyd2lzZSBpdCBtdXN0IGJlIGNhbGxlZAorICoJZXhjbHVzaXZlIGZyb20gb3RoZXIgd3JpdGVycy4gQW55IGRlcmVmZXJlbmNlIG9mIHRoZSBzbG90IG11c3QgYmUgZG9uZQorICoJdXNpbmcgcmFkaXhfdHJlZV9kZXJlZl9zbG90LgorICovCit2b2lkIF9fcmN1ICoqcmFkaXhfdHJlZV9sb29rdXBfc2xvdChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJdm9pZCBfX3JjdSAqKnNsb3Q7CisKKwlpZiAoIV9fcmFkaXhfdHJlZV9sb29rdXAocm9vdCwgaW5kZXgsIE5VTEwsICZzbG90KSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHNsb3Q7Cit9CitFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfbG9va3VwX3Nsb3QpOworCisvKioKKyAqCXJhZGl4X3RyZWVfbG9va3VwICAgIC0gICAgcGVyZm9ybSBsb29rdXAgb3BlcmF0aW9uIG9uIGEgcmFkaXggdHJlZQorICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBpbmRleDoJCWluZGV4IGtleQorICoKKyAqCUxvb2t1cCB0aGUgaXRlbSBhdCB0aGUgcG9zaXRpb24gQGluZGV4IGluIHRoZSByYWRpeCB0cmVlIEByb290LgorICoKKyAqCVRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrLCBob3dldmVyIHRoZSBjYWxsZXIKKyAqCW11c3QgbWFuYWdlIGxpZmV0aW1lcyBvZiBsZWFmIG5vZGVzIChlZy4gUkNVIG1heSBhbHNvIGJlIHVzZWQgdG8gZnJlZQorICoJdGhlbSBzYWZlbHkpLiBObyBSQ1UgYmFycmllcnMgYXJlIHJlcXVpcmVkIHRvIGFjY2VzcyBvciBtb2RpZnkgdGhlCisgKglyZXR1cm5lZCBpdGVtLCBob3dldmVyLgorICovCit2b2lkICpyYWRpeF90cmVlX2xvb2t1cChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXJldHVybiBfX3JhZGl4X3RyZWVfbG9va3VwKHJvb3QsIGluZGV4LCBOVUxMLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9sb29rdXApOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVwbGFjZV9zaWJsaW5nX2VudHJpZXMoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCQl2b2lkIF9fcmN1ICoqc2xvdCwgaW50IGNvdW50LCBpbnQgZXhjZXB0aW9uYWwpCit7CisjaWZkZWYgQ09ORklHX1JBRElYX1RSRUVfTVVMVElPUkRFUgorCXZvaWQgKnB0ciA9IG5vZGVfdG9fZW50cnkoc2xvdCk7CisJdW5zaWduZWQgb2Zmc2V0ID0gZ2V0X3Nsb3Rfb2Zmc2V0KG5vZGUsIHNsb3QpICsgMTsKKworCXdoaWxlIChvZmZzZXQgPCBSQURJWF9UUkVFX01BUF9TSVpFKSB7CisJCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KG5vZGUtPnNsb3RzW29mZnNldF0pICE9IHB0cikKKwkJCWJyZWFrOworCQlpZiAoY291bnQgPCAwKSB7CisJCQlub2RlLT5zbG90c1tvZmZzZXRdID0gTlVMTDsKKwkJCW5vZGUtPmNvdW50LS07CisJCX0KKwkJbm9kZS0+ZXhjZXB0aW9uYWwgKz0gZXhjZXB0aW9uYWw7CisJCW9mZnNldCsrOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCByZXBsYWNlX3Nsb3Qodm9pZCBfX3JjdSAqKnNsb3QsIHZvaWQgKml0ZW0sCisJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIGludCBjb3VudCwgaW50IGV4Y2VwdGlvbmFsKQoreworCWlmIChXQVJOX09OX09OQ0UocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKGl0ZW0pKSkKKwkJcmV0dXJuOworCisJaWYgKG5vZGUgJiYgKGNvdW50IHx8IGV4Y2VwdGlvbmFsKSkgeworCQlub2RlLT5jb3VudCArPSBjb3VudDsKKwkJbm9kZS0+ZXhjZXB0aW9uYWwgKz0gZXhjZXB0aW9uYWw7CisJCXJlcGxhY2Vfc2libGluZ19lbnRyaWVzKG5vZGUsIHNsb3QsIGNvdW50LCBleGNlcHRpb25hbCk7CisJfQorCisJcmN1X2Fzc2lnbl9wb2ludGVyKCpzbG90LCBpdGVtKTsKK30KKworc3RhdGljIGJvb2wgbm9kZV90YWdfZ2V0KGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkJY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCQl1bnNpZ25lZCBpbnQgdGFnLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCWlmIChub2RlKQorCQlyZXR1cm4gdGFnX2dldChub2RlLCB0YWcsIG9mZnNldCk7CisJcmV0dXJuIHJvb3RfdGFnX2dldChyb290LCB0YWcpOworfQorCisvKgorICogSURSIHVzZXJzIHdhbnQgdG8gYmUgYWJsZSB0byBzdG9yZSBOVUxMIGluIHRoZSB0cmVlLCBzbyBpZiB0aGUgc2xvdCBpc24ndAorICogZnJlZSwgZG9uJ3QgYWRqdXN0IHRoZSBjb3VudCwgZXZlbiBpZiBpdCdzIHRyYW5zaXRpb25pbmcgYmV0d2VlbiBOVUxMIGFuZAorICogbm9uLU5VTEwuICBGb3IgdGhlIElEQSwgd2UgbWFyayBzbG90cyBhcyBiZWluZyBJRFJfRlJFRSB3aGlsZSB0aGV5IHN0aWxsCisgKiBoYXZlIGVtcHR5IGJpdHMsIGJ1dCBpdCBvbmx5IHN0b3JlcyBOVUxMIGluIHNsb3RzIHdoZW4gdGhleSdyZSBiZWluZworICogZGVsZXRlZC4KKyAqLworc3RhdGljIGludCBjYWxjdWxhdGVfY291bnQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCQlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlLCB2b2lkIF9fcmN1ICoqc2xvdCwKKwkJCQl2b2lkICppdGVtLCB2b2lkICpvbGQpCit7CisJaWYgKGlzX2lkcihyb290KSkgeworCQl1bnNpZ25lZCBvZmZzZXQgPSBnZXRfc2xvdF9vZmZzZXQobm9kZSwgc2xvdCk7CisJCWJvb2wgZnJlZSA9IG5vZGVfdGFnX2dldChyb290LCBub2RlLCBJRFJfRlJFRSwgb2Zmc2V0KTsKKwkJaWYgKCFmcmVlKQorCQkJcmV0dXJuIDA7CisJCWlmICghb2xkKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAhIWl0ZW0gLSAhIW9sZDsKK30KKworLyoqCisgKiBfX3JhZGl4X3RyZWVfcmVwbGFjZQkJLSByZXBsYWNlIGl0ZW0gaW4gYSBzbG90CisgKiBAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICogQG5vZGU6CQlwb2ludGVyIHRvIHRyZWUgbm9kZQorICogQHNsb3Q6CQlwb2ludGVyIHRvIHNsb3QgaW4gQG5vZGUKKyAqIEBpdGVtOgkJbmV3IGl0ZW0gdG8gc3RvcmUgaW4gdGhlIHNsb3QuCisgKiBAdXBkYXRlX25vZGU6CWNhbGxiYWNrIGZvciBjaGFuZ2luZyBsZWFmIG5vZGVzCisgKiBAcHJpdmF0ZToJCXByaXZhdGUgZGF0YSB0byBwYXNzIHRvIEB1cGRhdGVfbm9kZQorICoKKyAqIEZvciB1c2Ugd2l0aCBfX3JhZGl4X3RyZWVfbG9va3VwKCkuICBDYWxsZXIgbXVzdCBob2xkIHRyZWUgd3JpdGUgbG9ja2VkCisgKiBhY3Jvc3Mgc2xvdCBsb29rdXAgYW5kIHJlcGxhY2VtZW50LgorICovCit2b2lkIF9fcmFkaXhfdHJlZV9yZXBsYWNlKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkgIHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCQkgIHZvaWQgX19yY3UgKipzbG90LCB2b2lkICppdGVtLAorCQkJICByYWRpeF90cmVlX3VwZGF0ZV9ub2RlX3QgdXBkYXRlX25vZGUsIHZvaWQgKnByaXZhdGUpCit7CisJdm9pZCAqb2xkID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2xvdCk7CisJaW50IGV4Y2VwdGlvbmFsID0gISFyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KGl0ZW0pIC0KKwkJCQkhIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkob2xkKTsKKwlpbnQgY291bnQgPSBjYWxjdWxhdGVfY291bnQocm9vdCwgbm9kZSwgc2xvdCwgaXRlbSwgb2xkKTsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0cyByZXBsYWNpbmcgZXhjZXB0aW9uYWwgZW50cmllcyBhbmQKKwkgKiBkZWxldGluZyBlbnRyaWVzLCBidXQgdGhhdCBuZWVkcyBhY2NvdW50aW5nIGFnYWluc3QgdGhlCisJICogbm9kZSB1bmxlc3MgdGhlIHNsb3QgaXMgcm9vdC0+cm5vZGUuCisJICovCisJV0FSTl9PTl9PTkNFKCFub2RlICYmIChzbG90ICE9ICh2b2lkIF9fcmN1ICoqKSZyb290LT5ybm9kZSkgJiYKKwkJCShjb3VudCB8fCBleGNlcHRpb25hbCkpOworCXJlcGxhY2Vfc2xvdChzbG90LCBpdGVtLCBub2RlLCBjb3VudCwgZXhjZXB0aW9uYWwpOworCisJaWYgKCFub2RlKQorCQlyZXR1cm47CisKKwlpZiAodXBkYXRlX25vZGUpCisJCXVwZGF0ZV9ub2RlKG5vZGUsIHByaXZhdGUpOworCisJZGVsZXRlX25vZGUocm9vdCwgbm9kZSwgdXBkYXRlX25vZGUsIHByaXZhdGUpOworfQorCisvKioKKyAqIHJhZGl4X3RyZWVfcmVwbGFjZV9zbG90CS0gcmVwbGFjZSBpdGVtIGluIGEgc2xvdAorICogQHJvb3Q6CXJhZGl4IHRyZWUgcm9vdAorICogQHNsb3Q6CXBvaW50ZXIgdG8gc2xvdAorICogQGl0ZW06CW5ldyBpdGVtIHRvIHN0b3JlIGluIHRoZSBzbG90LgorICoKKyAqIEZvciB1c2Ugd2l0aCByYWRpeF90cmVlX2xvb2t1cF9zbG90KCksIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCgpLAorICogcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWdfc2xvdCgpLiAgQ2FsbGVyIG11c3QgaG9sZCB0cmVlIHdyaXRlIGxvY2tlZAorICogYWNyb3NzIHNsb3QgbG9va3VwIGFuZCByZXBsYWNlbWVudC4KKyAqCisgKiBOT1RFOiBUaGlzIGNhbm5vdCBiZSB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIG5vbi1lbnRyaWVzIChlbXB0eSBzbG90cyksCisgKiByZWd1bGFyIGVudHJpZXMsIGFuZCBleGNlcHRpb25hbCBlbnRyaWVzLCBhcyB0aGF0IHJlcXVpcmVzIGFjY291bnRpbmcKKyAqIGluc2lkZSB0aGUgcmFkaXggdHJlZSBub2RlLiBXaGVuIHN3aXRjaGluZyBmcm9tIG9uZSB0eXBlIG9mIGVudHJ5IG9yCisgKiBkZWxldGluZywgdXNlIF9fcmFkaXhfdHJlZV9sb29rdXAoKSBhbmQgX19yYWRpeF90cmVlX3JlcGxhY2UoKSBvcgorICogcmFkaXhfdHJlZV9pdGVyX3JlcGxhY2UoKS4KKyAqLwordm9pZCByYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJICAgICB2b2lkIF9fcmN1ICoqc2xvdCwgdm9pZCAqaXRlbSkKK3sKKwlfX3JhZGl4X3RyZWVfcmVwbGFjZShyb290LCBOVUxMLCBzbG90LCBpdGVtLCBOVUxMLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QpOworCisvKioKKyAqIHJhZGl4X3RyZWVfaXRlcl9yZXBsYWNlIC0gcmVwbGFjZSBpdGVtIGluIGEgc2xvdAorICogQHJvb3Q6CXJhZGl4IHRyZWUgcm9vdAorICogQHNsb3Q6CXBvaW50ZXIgdG8gc2xvdAorICogQGl0ZW06CW5ldyBpdGVtIHRvIHN0b3JlIGluIHRoZSBzbG90LgorICoKKyAqIEZvciB1c2Ugd2l0aCByYWRpeF90cmVlX3NwbGl0KCkgYW5kIHJhZGl4X3RyZWVfZm9yX2VhY2hfc2xvdCgpLgorICogQ2FsbGVyIG11c3QgaG9sZCB0cmVlIHdyaXRlIGxvY2tlZCBhY3Jvc3Mgc3BsaXQgYW5kIHJlcGxhY2VtZW50LgorICovCit2b2lkIHJhZGl4X3RyZWVfaXRlcl9yZXBsYWNlKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkJY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlciwKKwkJCQl2b2lkIF9fcmN1ICoqc2xvdCwgdm9pZCAqaXRlbSkKK3sKKwlfX3JhZGl4X3RyZWVfcmVwbGFjZShyb290LCBpdGVyLT5ub2RlLCBzbG90LCBpdGVtLCBOVUxMLCBOVUxMKTsKK30KKworI2lmZGVmIENPTkZJR19SQURJWF9UUkVFX01VTFRJT1JERVIKKy8qKgorICogcmFkaXhfdHJlZV9qb2luIC0gcmVwbGFjZSBtdWx0aXBsZSBlbnRyaWVzIHdpdGggb25lIG11bHRpb3JkZXIgZW50cnkKKyAqIEByb290OiByYWRpeCB0cmVlIHJvb3QKKyAqIEBpbmRleDogYW4gaW5kZXggaW5zaWRlIHRoZSBuZXcgZW50cnkKKyAqIEBvcmRlcjogb3JkZXIgb2YgdGhlIG5ldyBlbnRyeQorICogQGl0ZW06IG5ldyBlbnRyeQorICoKKyAqIENhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBsYWNlIHNldmVyYWwgZW50cmllcyB3aXRoIG9uZSBsYXJnZXIgZW50cnkuCisgKiBUaGUgZXhpc3RpbmcgZW50cmllcyBhcmUgcHJlc3VtZWQgdG8gbm90IG5lZWQgZnJlZWluZyBhcyBhIHJlc3VsdCBvZgorICogdGhpcyBjYWxsLgorICoKKyAqIFRoZSByZXBsYWNlbWVudCBlbnRyeSB3aWxsIGhhdmUgYWxsIHRoZSB0YWdzIHNldCBvbiBpdCB0aGF0IHdlcmUgc2V0CisgKiBvbiBhbnkgb2YgdGhlIGVudHJpZXMgaXQgaXMgcmVwbGFjaW5nLgorICovCitpbnQgcmFkaXhfdHJlZV9qb2luKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCQl1bnNpZ25lZCBvcmRlciwgdm9pZCAqaXRlbSkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOworCXZvaWQgX19yY3UgKipzbG90OworCWludCBlcnJvcjsKKworCUJVR19PTihyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoaXRlbSkpOworCisJZXJyb3IgPSBfX3JhZGl4X3RyZWVfY3JlYXRlKHJvb3QsIGluZGV4LCBvcmRlciwgJm5vZGUsICZzbG90KTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IGluc2VydF9lbnRyaWVzKG5vZGUsIHNsb3QsIGl0ZW0sIG9yZGVyLCB0cnVlKTsKKwlpZiAoZXJyb3IgPiAwKQorCQllcnJvciA9IDA7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qKgorICogcmFkaXhfdHJlZV9zcGxpdCAtIFNwbGl0IGFuIGVudHJ5IGludG8gc21hbGxlciBlbnRyaWVzCisgKiBAcm9vdDogcmFkaXggdHJlZSByb290CisgKiBAaW5kZXg6IEFuIGluZGV4IHdpdGhpbiB0aGUgbGFyZ2UgZW50cnkKKyAqIEBvcmRlcjogT3JkZXIgb2YgbmV3IGVudHJpZXMKKyAqCisgKiBDYWxsIHRoaXMgZnVuY3Rpb24gYXMgdGhlIGZpcnN0IHN0ZXAgaW4gcmVwbGFjaW5nIGEgbXVsdGlvcmRlciBlbnRyeQorICogd2l0aCBzZXZlcmFsIGVudHJpZXMgb2YgbG93ZXIgb3JkZXIuICBBZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMsCisgKiBsb29wIG92ZXIgdGhlIHJlbGV2YW50IHBvcnRpb24gb2YgdGhlIHRyZWUgdXNpbmcgcmFkaXhfdHJlZV9mb3JfZWFjaF9zbG90KCkKKyAqIGFuZCBjYWxsIHJhZGl4X3RyZWVfaXRlcl9yZXBsYWNlKCkgdG8gc2V0IHVwIGVhY2ggbmV3IGVudHJ5LgorICoKKyAqIFRoZSB0YWdzIGZyb20gdGhpcyBlbnRyeSBhcmUgcmVwbGljYXRlZCB0byBhbGwgdGhlIG5ldyBlbnRyaWVzLgorICoKKyAqIFRoZSByYWRpeCB0cmVlIHNob3VsZCBiZSBsb2NrZWQgYWdhaW5zdCBtb2RpZmljYXRpb24gZHVyaW5nIHRoZSBlbnRpcmUKKyAqIHJlcGxhY2VtZW50IG9wZXJhdGlvbi4gIExvY2stZnJlZSBsb29rdXBzIHdpbGwgc2VlIFJBRElYX1RSRUVfUkVUUlkgd2hpY2gKKyAqIHNob3VsZCBwcm9tcHQgUkNVIHdhbGtlcnMgdG8gcmVzdGFydCB0aGUgbG9va3VwIGZyb20gdGhlIHJvb3QuCisgKi8KK2ludCByYWRpeF90cmVlX3NwbGl0KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHVuc2lnbmVkIGxvbmcgaW5kZXgsCisJCQkJdW5zaWduZWQgb3JkZXIpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqcGFyZW50LCAqbm9kZSwgKmNoaWxkOworCXZvaWQgX19yY3UgKipzbG90OworCXVuc2lnbmVkIGludCBvZmZzZXQsIGVuZDsKKwl1bnNpZ25lZCBuLCB0YWcsIHRhZ3MgPSAwOworCWdmcF90IGdmcCA9IHJvb3RfZ2ZwX21hc2socm9vdCk7CisKKwlpZiAoIV9fcmFkaXhfdHJlZV9sb29rdXAocm9vdCwgaW5kZXgsICZwYXJlbnQsICZzbG90KSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKCFwYXJlbnQpCisJCXJldHVybiAtRU5PRU5UOworCisJb2Zmc2V0ID0gZ2V0X3Nsb3Rfb2Zmc2V0KHBhcmVudCwgc2xvdCk7CisKKwlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKQorCQlpZiAodGFnX2dldChwYXJlbnQsIHRhZywgb2Zmc2V0KSkKKwkJCXRhZ3MgfD0gMSA8PCB0YWc7CisKKwlmb3IgKGVuZCA9IG9mZnNldCArIDE7IGVuZCA8IFJBRElYX1RSRUVfTUFQX1NJWkU7IGVuZCsrKSB7CisJCWlmICghaXNfc2libGluZ19lbnRyeShwYXJlbnQsCisJCQkJcmN1X2RlcmVmZXJlbmNlX3JhdyhwYXJlbnQtPnNsb3RzW2VuZF0pKSkKKwkJCWJyZWFrOworCQlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKQorCQkJaWYgKHRhZ3MgJiAoMSA8PCB0YWcpKQorCQkJCXRhZ19zZXQocGFyZW50LCB0YWcsIGVuZCk7CisJCS8qIHJjdV9hc3NpZ25fcG9pbnRlciBlbnN1cmVzIHRhZ3MgYXJlIHNldCBiZWZvcmUgUkVUUlkgKi8KKwkJcmN1X2Fzc2lnbl9wb2ludGVyKHBhcmVudC0+c2xvdHNbZW5kXSwgUkFESVhfVFJFRV9SRVRSWSk7CisJfQorCXJjdV9hc3NpZ25fcG9pbnRlcihwYXJlbnQtPnNsb3RzW29mZnNldF0sIFJBRElYX1RSRUVfUkVUUlkpOworCXBhcmVudC0+ZXhjZXB0aW9uYWwgLT0gKGVuZCAtIG9mZnNldCk7CisKKwlpZiAob3JkZXIgPT0gcGFyZW50LT5zaGlmdCkKKwkJcmV0dXJuIDA7CisJaWYgKG9yZGVyID4gcGFyZW50LT5zaGlmdCkgeworCQl3aGlsZSAob2Zmc2V0IDwgZW5kKQorCQkJb2Zmc2V0ICs9IGluc2VydF9lbnRyaWVzKHBhcmVudCwgJnBhcmVudC0+c2xvdHNbb2Zmc2V0XSwKKwkJCQkJUkFESVhfVFJFRV9SRVRSWSwgb3JkZXIsIHRydWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwlub2RlID0gcGFyZW50OworCisJZm9yICg7OykgeworCQlpZiAobm9kZS0+c2hpZnQgPiBvcmRlcikgeworCQkJY2hpbGQgPSByYWRpeF90cmVlX25vZGVfYWxsb2MoZ2ZwLCBub2RlLCByb290LAorCQkJCQlub2RlLT5zaGlmdCAtIFJBRElYX1RSRUVfTUFQX1NISUZULAorCQkJCQlvZmZzZXQsIDAsIDApOworCQkJaWYgKCFjaGlsZCkKKwkJCQlnb3RvIG5vbWVtOworCQkJaWYgKG5vZGUgIT0gcGFyZW50KSB7CisJCQkJbm9kZS0+Y291bnQrKzsKKwkJCQlyY3VfYXNzaWduX3BvaW50ZXIobm9kZS0+c2xvdHNbb2Zmc2V0XSwKKwkJCQkJCQlub2RlX3RvX2VudHJ5KGNoaWxkKSk7CisJCQkJZm9yICh0YWcgPSAwOyB0YWcgPCBSQURJWF9UUkVFX01BWF9UQUdTOyB0YWcrKykKKwkJCQkJaWYgKHRhZ3MgJiAoMSA8PCB0YWcpKQorCQkJCQkJdGFnX3NldChub2RlLCB0YWcsIG9mZnNldCk7CisJCQl9CisKKwkJCW5vZGUgPSBjaGlsZDsKKwkJCW9mZnNldCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCW4gPSBpbnNlcnRfZW50cmllcyhub2RlLCAmbm9kZS0+c2xvdHNbb2Zmc2V0XSwKKwkJCQkJUkFESVhfVFJFRV9SRVRSWSwgb3JkZXIsIGZhbHNlKTsKKwkJQlVHX09OKG4gPiBSQURJWF9UUkVFX01BUF9TSVpFKTsKKworCQlmb3IgKHRhZyA9IDA7IHRhZyA8IFJBRElYX1RSRUVfTUFYX1RBR1M7IHRhZysrKQorCQkJaWYgKHRhZ3MgJiAoMSA8PCB0YWcpKQorCQkJCXRhZ19zZXQobm9kZSwgdGFnLCBvZmZzZXQpOworCQlvZmZzZXQgKz0gbjsKKworCQl3aGlsZSAob2Zmc2V0ID09IFJBRElYX1RSRUVfTUFQX1NJWkUpIHsKKwkJCWlmIChub2RlID09IHBhcmVudCkKKwkJCQlicmVhazsKKwkJCW9mZnNldCA9IG5vZGUtPm9mZnNldDsKKwkJCWNoaWxkID0gbm9kZTsKKwkJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIobm9kZS0+c2xvdHNbb2Zmc2V0XSwKKwkJCQkJCW5vZGVfdG9fZW50cnkoY2hpbGQpKTsKKwkJCW9mZnNldCsrOworCQl9CisJCWlmICgobm9kZSA9PSBwYXJlbnQpICYmIChvZmZzZXQgPT0gZW5kKSkKKwkJCXJldHVybiAwOworCX0KKworIG5vbWVtOgorCS8qIFNob3VsZG4ndCBoYXBwZW47IGRpZCB1c2VyIGZvcmdldCB0byBwcmVsb2FkPyAqLworCS8qIFRPRE86IGZyZWUgYWxsIHRoZSBhbGxvY2F0ZWQgbm9kZXMgKi8KKwlXQVJOX09OKDEpOworCXJldHVybiAtRU5PTUVNOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG5vZGVfdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCQkJdW5zaWduZWQgaW50IHRhZywgdW5zaWduZWQgaW50IG9mZnNldCkKK3sKKwl3aGlsZSAobm9kZSkgeworCQlpZiAodGFnX2dldChub2RlLCB0YWcsIG9mZnNldCkpCisJCQlyZXR1cm47CisJCXRhZ19zZXQobm9kZSwgdGFnLCBvZmZzZXQpOworCQlvZmZzZXQgPSBub2RlLT5vZmZzZXQ7CisJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJfQorCisJaWYgKCFyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKKwkJcm9vdF90YWdfc2V0KHJvb3QsIHRhZyk7Cit9CisKKy8qKgorICoJcmFkaXhfdHJlZV90YWdfc2V0IC0gc2V0IGEgdGFnIG9uIGEgcmFkaXggdHJlZSBub2RlCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQGluZGV4OgkJaW5kZXgga2V5CisgKglAdGFnOgkJdGFnIGluZGV4CisgKgorICoJU2V0IHRoZSBzZWFyY2ggdGFnICh3aGljaCBtdXN0IGJlIDwgUkFESVhfVFJFRV9NQVhfVEFHUykKKyAqCWNvcnJlc3BvbmRpbmcgdG8gQGluZGV4IGluIHRoZSByYWRpeCB0cmVlLiAgRnJvbQorICoJdGhlIHJvb3QgYWxsIHRoZSB3YXkgZG93biB0byB0aGUgbGVhZiBub2RlLgorICoKKyAqCVJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhZ2dlZCBpdGVtLiAgU2V0dGluZyBhIHRhZyBvbiBhIG5vdC1wcmVzZW50CisgKglpdGVtIGlzIGEgYnVnLgorICovCit2b2lkICpyYWRpeF90cmVlX3RhZ19zZXQoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGludCB0YWcpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgKnBhcmVudDsKKwl1bnNpZ25lZCBsb25nIG1heGluZGV4OworCisJcmFkaXhfdHJlZV9sb2FkX3Jvb3Qocm9vdCwgJm5vZGUsICZtYXhpbmRleCk7CisJQlVHX09OKGluZGV4ID4gbWF4aW5kZXgpOworCisJd2hpbGUgKHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShub2RlKSkgeworCQl1bnNpZ25lZCBvZmZzZXQ7CisKKwkJcGFyZW50ID0gZW50cnlfdG9fbm9kZShub2RlKTsKKwkJb2Zmc2V0ID0gcmFkaXhfdHJlZV9kZXNjZW5kKHBhcmVudCwgJm5vZGUsIGluZGV4KTsKKwkJQlVHX09OKCFub2RlKTsKKworCQlpZiAoIXRhZ19nZXQocGFyZW50LCB0YWcsIG9mZnNldCkpCisJCQl0YWdfc2V0KHBhcmVudCwgdGFnLCBvZmZzZXQpOworCX0KKworCS8qIHNldCB0aGUgcm9vdCdzIHRhZyBiaXQgKi8KKwlpZiAoIXJvb3RfdGFnX2dldChyb290LCB0YWcpKQorCQlyb290X3RhZ19zZXQocm9vdCwgdGFnKTsKKworCXJldHVybiBub2RlOworfQorRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX3RhZ19zZXQpOworCisvKioKKyAqIHJhZGl4X3RyZWVfaXRlcl90YWdfc2V0IC0gc2V0IGEgdGFnIG9uIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGVudHJ5CisgKiBAcm9vdDoJcmFkaXggdHJlZSByb290CisgKiBAaXRlcjoJaXRlcmF0b3Igc3RhdGUKKyAqIEB0YWc6CXRhZyB0byBzZXQKKyAqLwordm9pZCByYWRpeF90cmVlX2l0ZXJfdGFnX3NldChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlciwgdW5zaWduZWQgaW50IHRhZykKK3sKKwlub2RlX3RhZ19zZXQocm9vdCwgaXRlci0+bm9kZSwgdGFnLCBpdGVyX29mZnNldChpdGVyKSk7Cit9CisKK3N0YXRpYyB2b2lkIG5vZGVfdGFnX2NsZWFyKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQkJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCQl1bnNpZ25lZCBpbnQgdGFnLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXdoaWxlIChub2RlKSB7CisJCWlmICghdGFnX2dldChub2RlLCB0YWcsIG9mZnNldCkpCisJCQlyZXR1cm47CisJCXRhZ19jbGVhcihub2RlLCB0YWcsIG9mZnNldCk7CisJCWlmIChhbnlfdGFnX3NldChub2RlLCB0YWcpKQorCQkJcmV0dXJuOworCisJCW9mZnNldCA9IG5vZGUtPm9mZnNldDsKKwkJbm9kZSA9IG5vZGUtPnBhcmVudDsKKwl9CisKKwkvKiBjbGVhciB0aGUgcm9vdCdzIHRhZyBiaXQgKi8KKwlpZiAocm9vdF90YWdfZ2V0KHJvb3QsIHRhZykpCisJCXJvb3RfdGFnX2NsZWFyKHJvb3QsIHRhZyk7Cit9CisKKy8qKgorICoJcmFkaXhfdHJlZV90YWdfY2xlYXIgLSBjbGVhciBhIHRhZyBvbiBhIHJhZGl4IHRyZWUgbm9kZQorICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBpbmRleDoJCWluZGV4IGtleQorICoJQHRhZzoJCXRhZyBpbmRleAorICoKKyAqCUNsZWFyIHRoZSBzZWFyY2ggdGFnICh3aGljaCBtdXN0IGJlIDwgUkFESVhfVFJFRV9NQVhfVEFHUykKKyAqCWNvcnJlc3BvbmRpbmcgdG8gQGluZGV4IGluIHRoZSByYWRpeCB0cmVlLiAgSWYgdGhpcyBjYXVzZXMKKyAqCXRoZSBsZWFmIG5vZGUgdG8gaGF2ZSBubyB0YWdzIHNldCB0aGVuIGNsZWFyIHRoZSB0YWcgaW4gdGhlCisgKgluZXh0LXRvLWxlYWYgbm9kZSwgZXRjLgorICoKKyAqCVJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhZ2dlZCBpdGVtIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4gIGllOgorICoJaGFzIHRoZSBzYW1lIHJldHVybiB2YWx1ZSBhbmQgc2VtYW50aWNzIGFzIHJhZGl4X3RyZWVfbG9va3VwKCkuCisgKi8KK3ZvaWQgKnJhZGl4X3RyZWVfdGFnX2NsZWFyKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQl1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBpbnQgdGFnKQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsICpwYXJlbnQ7CisJdW5zaWduZWQgbG9uZyBtYXhpbmRleDsKKwlpbnQgdW5pbml0aWFsaXplZF92YXIob2Zmc2V0KTsKKworCXJhZGl4X3RyZWVfbG9hZF9yb290KHJvb3QsICZub2RlLCAmbWF4aW5kZXgpOworCWlmIChpbmRleCA+IG1heGluZGV4KQorCQlyZXR1cm4gTlVMTDsKKworCXBhcmVudCA9IE5VTEw7CisKKwl3aGlsZSAocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKG5vZGUpKSB7CisJCXBhcmVudCA9IGVudHJ5X3RvX25vZGUobm9kZSk7CisJCW9mZnNldCA9IHJhZGl4X3RyZWVfZGVzY2VuZChwYXJlbnQsICZub2RlLCBpbmRleCk7CisJfQorCisJaWYgKG5vZGUpCisJCW5vZGVfdGFnX2NsZWFyKHJvb3QsIHBhcmVudCwgdGFnLCBvZmZzZXQpOworCisJcmV0dXJuIG5vZGU7Cit9CitFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfdGFnX2NsZWFyKTsKKworLyoqCisgICogcmFkaXhfdHJlZV9pdGVyX3RhZ19jbGVhciAtIGNsZWFyIGEgdGFnIG9uIHRoZSBjdXJyZW50IGl0ZXJhdG9yIGVudHJ5CisgICogQHJvb3Q6IHJhZGl4IHRyZWUgcm9vdAorICAqIEBpdGVyOiBpdGVyYXRvciBzdGF0ZQorICAqIEB0YWc6IHRhZyB0byBjbGVhcgorICAqLwordm9pZCByYWRpeF90cmVlX2l0ZXJfdGFnX2NsZWFyKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsCisJCQljb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9pdGVyICppdGVyLCB1bnNpZ25lZCBpbnQgdGFnKQoreworCW5vZGVfdGFnX2NsZWFyKHJvb3QsIGl0ZXItPm5vZGUsIHRhZywgaXRlcl9vZmZzZXQoaXRlcikpOworfQorCisvKioKKyAqIHJhZGl4X3RyZWVfdGFnX2dldCAtIGdldCBhIHRhZyBvbiBhIHJhZGl4IHRyZWUgbm9kZQorICogQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqIEBpbmRleDoJCWluZGV4IGtleQorICogQHRhZzoJCXRhZyBpbmRleCAoPCBSQURJWF9UUkVFX01BWF9UQUdTKQorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKgorICogIDA6IHRhZyBub3QgcHJlc2VudCBvciBub3Qgc2V0CisgKiAgMTogdGFnIHNldAorICoKKyAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gbWF5IG5vdCBiZSByZWxpZWQgb24sIGV2ZW4gaWYKKyAqIHRoZSBSQ1UgbG9jayBpcyBoZWxkLCB1bmxlc3MgdGFnIG1vZGlmaWNhdGlvbiBhbmQgbm9kZSBkZWxldGlvbiBhcmUgZXhjbHVkZWQKKyAqIGZyb20gY29uY3VycmVuY3kuCisgKi8KK2ludCByYWRpeF90cmVlX3RhZ19nZXQoY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGludCB0YWcpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgKnBhcmVudDsKKwl1bnNpZ25lZCBsb25nIG1heGluZGV4OworCisJaWYgKCFyb290X3RhZ19nZXQocm9vdCwgdGFnKSkKKwkJcmV0dXJuIDA7CisKKwlyYWRpeF90cmVlX2xvYWRfcm9vdChyb290LCAmbm9kZSwgJm1heGluZGV4KTsKKwlpZiAoaW5kZXggPiBtYXhpbmRleCkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKG5vZGUpKSB7CisJCXVuc2lnbmVkIG9mZnNldDsKKworCQlwYXJlbnQgPSBlbnRyeV90b19ub2RlKG5vZGUpOworCQlvZmZzZXQgPSByYWRpeF90cmVlX2Rlc2NlbmQocGFyZW50LCAmbm9kZSwgaW5kZXgpOworCisJCWlmICghdGFnX2dldChwYXJlbnQsIHRhZywgb2Zmc2V0KSkKKwkJCXJldHVybiAwOworCQlpZiAobm9kZSA9PSBSQURJWF9UUkVFX1JFVFJZKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfdGFnX2dldCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3NldF9pdGVyX3NoaWZ0KHN0cnVjdCByYWRpeF90cmVlX2l0ZXIgKml0ZXIsCisJCQkJCXVuc2lnbmVkIGludCBzaGlmdCkKK3sKKyNpZmRlZiBDT05GSUdfUkFESVhfVFJFRV9NVUxUSU9SREVSCisJaXRlci0+c2hpZnQgPSBzaGlmdDsKKyNlbmRpZgorfQorCisvKiBDb25zdHJ1Y3QgaXRlci0+dGFncyBiaXQtbWFzayBmcm9tIG5vZGUtPnRhZ3NbdGFnXSBhcnJheSAqLworc3RhdGljIHZvaWQgc2V0X2l0ZXJfdGFncyhzdHJ1Y3QgcmFkaXhfdHJlZV9pdGVyICppdGVyLAorCQkJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQl1bnNpZ25lZCB0YWcpCit7CisJdW5zaWduZWQgdGFnX2xvbmcgPSBvZmZzZXQgLyBCSVRTX1BFUl9MT05HOworCXVuc2lnbmVkIHRhZ19iaXQgID0gb2Zmc2V0ICUgQklUU19QRVJfTE9ORzsKKworCWlmICghbm9kZSkgeworCQlpdGVyLT50YWdzID0gMTsKKwkJcmV0dXJuOworCX0KKworCWl0ZXItPnRhZ3MgPSBub2RlLT50YWdzW3RhZ11bdGFnX2xvbmddID4+IHRhZ19iaXQ7CisKKwkvKiBUaGlzIG5ldmVyIGhhcHBlbnMgaWYgUkFESVhfVFJFRV9UQUdfTE9OR1MgPT0gMSAqLworCWlmICh0YWdfbG9uZyA8IFJBRElYX1RSRUVfVEFHX0xPTkdTIC0gMSkgeworCQkvKiBQaWNrIHRhZ3MgZnJvbSBuZXh0IGVsZW1lbnQgKi8KKwkJaWYgKHRhZ19iaXQpCisJCQlpdGVyLT50YWdzIHw9IG5vZGUtPnRhZ3NbdGFnXVt0YWdfbG9uZyArIDFdIDw8CisJCQkJCQkoQklUU19QRVJfTE9ORyAtIHRhZ19iaXQpOworCQkvKiBDbGlwIGNodW5rIHNpemUsIGhlcmUgb25seSBCSVRTX1BFUl9MT05HIHRhZ3MgKi8KKwkJaXRlci0+bmV4dF9pbmRleCA9IF9fcmFkaXhfdHJlZV9pdGVyX2FkZChpdGVyLCBCSVRTX1BFUl9MT05HKTsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUkFESVhfVFJFRV9NVUxUSU9SREVSCitzdGF0aWMgdm9pZCBfX3JjdSAqKnNraXBfc2libGluZ3Moc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqKm5vZGVwLAorCQkJdm9pZCBfX3JjdSAqKnNsb3QsIHN0cnVjdCByYWRpeF90cmVlX2l0ZXIgKml0ZXIpCit7CisJd2hpbGUgKGl0ZXItPmluZGV4IDwgaXRlci0+bmV4dF9pbmRleCkgeworCQkqbm9kZXAgPSByY3VfZGVyZWZlcmVuY2VfcmF3KCpzbG90KTsKKwkJaWYgKCpub2RlcCAmJiAhaXNfc2libGluZ19lbnRyeShpdGVyLT5ub2RlLCAqbm9kZXApKQorCQkJcmV0dXJuIHNsb3Q7CisJCXNsb3QrKzsKKwkJaXRlci0+aW5kZXggPSBfX3JhZGl4X3RyZWVfaXRlcl9hZGQoaXRlciwgMSk7CisJCWl0ZXItPnRhZ3MgPj49IDE7CisJfQorCisJKm5vZGVwID0gTlVMTDsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBfX3JjdSAqKl9fcmFkaXhfdHJlZV9uZXh0X3Nsb3Qodm9pZCBfX3JjdSAqKnNsb3QsCisJCQkJc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlciwgdW5zaWduZWQgZmxhZ3MpCit7CisJdW5zaWduZWQgdGFnID0gZmxhZ3MgJiBSQURJWF9UUkVFX0lURVJfVEFHX01BU0s7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKworCXNsb3QgPSBza2lwX3NpYmxpbmdzKCZub2RlLCBzbG90LCBpdGVyKTsKKworCXdoaWxlIChyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUobm9kZSkpIHsKKwkJdW5zaWduZWQgb2Zmc2V0OworCQl1bnNpZ25lZCBsb25nIG5leHRfaW5kZXg7CisKKwkJaWYgKG5vZGUgPT0gUkFESVhfVFJFRV9SRVRSWSkKKwkJCXJldHVybiBzbG90OworCQlub2RlID0gZW50cnlfdG9fbm9kZShub2RlKTsKKwkJaXRlci0+bm9kZSA9IG5vZGU7CisJCWl0ZXItPnNoaWZ0ID0gbm9kZS0+c2hpZnQ7CisKKwkJaWYgKGZsYWdzICYgUkFESVhfVFJFRV9JVEVSX1RBR0dFRCkgeworCQkJb2Zmc2V0ID0gcmFkaXhfdHJlZV9maW5kX25leHRfYml0KG5vZGUsIHRhZywgMCk7CisJCQlpZiAob2Zmc2V0ID09IFJBRElYX1RSRUVfTUFQX1NJWkUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlzbG90ID0gJm5vZGUtPnNsb3RzW29mZnNldF07CisJCQlpdGVyLT5pbmRleCA9IF9fcmFkaXhfdHJlZV9pdGVyX2FkZChpdGVyLCBvZmZzZXQpOworCQkJc2V0X2l0ZXJfdGFncyhpdGVyLCBub2RlLCBvZmZzZXQsIHRhZyk7CisJCQlub2RlID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2xvdCk7CisJCX0gZWxzZSB7CisJCQlvZmZzZXQgPSAwOworCQkJc2xvdCA9ICZub2RlLT5zbG90c1swXTsKKwkJCWZvciAoOzspIHsKKwkJCQlub2RlID0gcmN1X2RlcmVmZXJlbmNlX3Jhdygqc2xvdCk7CisJCQkJaWYgKG5vZGUpCisJCQkJCWJyZWFrOworCQkJCXNsb3QrKzsKKwkJCQlvZmZzZXQrKzsKKwkJCQlpZiAob2Zmc2V0ID09IFJBRElYX1RSRUVfTUFQX1NJWkUpCisJCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJaXRlci0+aW5kZXggPSBfX3JhZGl4X3RyZWVfaXRlcl9hZGQoaXRlciwgb2Zmc2V0KTsKKwkJfQorCQlpZiAoKGZsYWdzICYgUkFESVhfVFJFRV9JVEVSX0NPTlRJRykgJiYgKG9mZnNldCA+IDApKQorCQkJZ290byBub25lOworCQluZXh0X2luZGV4ID0gKGl0ZXItPmluZGV4IHwgc2hpZnRfbWF4aW5kZXgoaXRlci0+c2hpZnQpKSArIDE7CisJCWlmIChuZXh0X2luZGV4IDwgaXRlci0+bmV4dF9pbmRleCkKKwkJCWl0ZXItPm5leHRfaW5kZXggPSBuZXh0X2luZGV4OworCX0KKworCXJldHVybiBzbG90OworIG5vbmU6CisJaXRlci0+bmV4dF9pbmRleCA9IDA7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKF9fcmFkaXhfdHJlZV9uZXh0X3Nsb3QpOworI2Vsc2UKK3N0YXRpYyB2b2lkIF9fcmN1ICoqc2tpcF9zaWJsaW5ncyhzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICoqbm9kZXAsCisJCQl2b2lkIF9fcmN1ICoqc2xvdCwgc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlcikKK3sKKwlyZXR1cm4gc2xvdDsKK30KKyNlbmRpZgorCit2b2lkIF9fcmN1ICoqcmFkaXhfdHJlZV9pdGVyX3Jlc3VtZSh2b2lkIF9fcmN1ICoqc2xvdCwKKwkJCQkJc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlcikKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlOworCisJc2xvdCsrOworCWl0ZXItPmluZGV4ID0gX19yYWRpeF90cmVlX2l0ZXJfYWRkKGl0ZXIsIDEpOworCXNraXBfc2libGluZ3MoJm5vZGUsIHNsb3QsIGl0ZXIpOworCWl0ZXItPm5leHRfaW5kZXggPSBpdGVyLT5pbmRleDsKKwlpdGVyLT50YWdzID0gMDsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9pdGVyX3Jlc3VtZSk7CisKKy8qKgorICogcmFkaXhfdHJlZV9uZXh0X2NodW5rIC0gZmluZCBuZXh0IGNodW5rIG9mIHNsb3RzIGZvciBpdGVyYXRpb24KKyAqCisgKiBAcm9vdDoJcmFkaXggdHJlZSByb290CisgKiBAaXRlcjoJaXRlcmF0b3Igc3RhdGUKKyAqIEBmbGFnczoJUkFESVhfVFJFRV9JVEVSXyogZmxhZ3MgYW5kIHRhZyBpbmRleAorICogUmV0dXJuczoJcG9pbnRlciB0byBjaHVuayBmaXJzdCBzbG90LCBvciBOVUxMIGlmIGl0ZXJhdGlvbiBpcyBvdmVyCisgKi8KK3ZvaWQgX19yY3UgKipyYWRpeF90cmVlX25leHRfY2h1bmsoY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCSAgICAgc3RydWN0IHJhZGl4X3RyZWVfaXRlciAqaXRlciwgdW5zaWduZWQgZmxhZ3MpCit7CisJdW5zaWduZWQgdGFnID0gZmxhZ3MgJiBSQURJWF9UUkVFX0lURVJfVEFHX01BU0s7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwgKmNoaWxkOworCXVuc2lnbmVkIGxvbmcgaW5kZXgsIG9mZnNldCwgbWF4aW5kZXg7CisKKwlpZiAoKGZsYWdzICYgUkFESVhfVFJFRV9JVEVSX1RBR0dFRCkgJiYgIXJvb3RfdGFnX2dldChyb290LCB0YWcpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogQ2F0Y2ggbmV4dF9pbmRleCBvdmVyZmxvdyBhZnRlciB+MFVMLiBpdGVyLT5pbmRleCBuZXZlciBvdmVyZmxvd3MKKwkgKiBkdXJpbmcgaXRlcmF0aW5nOyBpdCBjYW4gYmUgemVybyBvbmx5IGF0IHRoZSBiZWdpbm5pbmcuCisJICogQW5kIHdlIGNhbm5vdCBvdmVyZmxvdyBpdGVyLT5uZXh0X2luZGV4IGluIGEgc2luZ2xlIHN0ZXAsCisJICogYmVjYXVzZSBSQURJWF9UUkVFX01BUF9TSElGVCA8IEJJVFNfUEVSX0xPTkcuCisJICoKKwkgKiBUaGlzIGNvbmRpdGlvbiBhbHNvIHVzZWQgYnkgcmFkaXhfdHJlZV9uZXh0X3Nsb3QoKSB0byBzdG9wCisJICogY29udGlndW91cyBpdGVyYXRpbmcsIGFuZCBmb3JiaWQgc3dpdGNoaW5nIHRvIHRoZSBuZXh0IGNodW5rLgorCSAqLworCWluZGV4ID0gaXRlci0+bmV4dF9pbmRleDsKKwlpZiAoIWluZGV4ICYmIGl0ZXItPmluZGV4KQorCQlyZXR1cm4gTlVMTDsKKworIHJlc3RhcnQ6CisJcmFkaXhfdHJlZV9sb2FkX3Jvb3Qocm9vdCwgJmNoaWxkLCAmbWF4aW5kZXgpOworCWlmIChpbmRleCA+IG1heGluZGV4KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWNoaWxkKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghcmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKGNoaWxkKSkgeworCQkvKiBTaW5nbGUtc2xvdCB0cmVlICovCisJCWl0ZXItPmluZGV4ID0gaW5kZXg7CisJCWl0ZXItPm5leHRfaW5kZXggPSBtYXhpbmRleCArIDE7CisJCWl0ZXItPnRhZ3MgPSAxOworCQlpdGVyLT5ub2RlID0gTlVMTDsKKwkJX19zZXRfaXRlcl9zaGlmdChpdGVyLCAwKTsKKwkJcmV0dXJuICh2b2lkIF9fcmN1ICoqKSZyb290LT5ybm9kZTsKKwl9CisKKwlkbyB7CisJCW5vZGUgPSBlbnRyeV90b19ub2RlKGNoaWxkKTsKKwkJb2Zmc2V0ID0gcmFkaXhfdHJlZV9kZXNjZW5kKG5vZGUsICZjaGlsZCwgaW5kZXgpOworCisJCWlmICgoZmxhZ3MgJiBSQURJWF9UUkVFX0lURVJfVEFHR0VEKSA/CisJCQkJIXRhZ19nZXQobm9kZSwgdGFnLCBvZmZzZXQpIDogIWNoaWxkKSB7CisJCQkvKiBIb2xlIGRldGVjdGVkICovCisJCQlpZiAoZmxhZ3MgJiBSQURJWF9UUkVFX0lURVJfQ09OVElHKQorCQkJCXJldHVybiBOVUxMOworCisJCQlpZiAoZmxhZ3MgJiBSQURJWF9UUkVFX0lURVJfVEFHR0VEKQorCQkJCW9mZnNldCA9IHJhZGl4X3RyZWVfZmluZF9uZXh0X2JpdChub2RlLCB0YWcsCisJCQkJCQlvZmZzZXQgKyAxKTsKKwkJCWVsc2UKKwkJCQl3aGlsZSAoKytvZmZzZXQJPCBSQURJWF9UUkVFX01BUF9TSVpFKSB7CisJCQkJCXZvaWQgKnNsb3QgPSByY3VfZGVyZWZlcmVuY2VfcmF3KAorCQkJCQkJCW5vZGUtPnNsb3RzW29mZnNldF0pOworCQkJCQlpZiAoaXNfc2libGluZ19lbnRyeShub2RlLCBzbG90KSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoc2xvdCkKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCWluZGV4ICY9IH5ub2RlX21heGluZGV4KG5vZGUpOworCQkJaW5kZXggKz0gb2Zmc2V0IDw8IG5vZGUtPnNoaWZ0OworCQkJLyogT3ZlcmZsb3cgYWZ0ZXIgfjBVTCAqLworCQkJaWYgKCFpbmRleCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWlmIChvZmZzZXQgPT0gUkFESVhfVFJFRV9NQVBfU0laRSkKKwkJCQlnb3RvIHJlc3RhcnQ7CisJCQljaGlsZCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcobm9kZS0+c2xvdHNbb2Zmc2V0XSk7CisJCX0KKworCQlpZiAoIWNoaWxkKQorCQkJZ290byByZXN0YXJ0OworCQlpZiAoY2hpbGQgPT0gUkFESVhfVFJFRV9SRVRSWSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShjaGlsZCkpOworCisJLyogVXBkYXRlIHRoZSBpdGVyYXRvciBzdGF0ZSAqLworCWl0ZXItPmluZGV4ID0gKGluZGV4ICZ+IG5vZGVfbWF4aW5kZXgobm9kZSkpIHwgKG9mZnNldCA8PCBub2RlLT5zaGlmdCk7CisJaXRlci0+bmV4dF9pbmRleCA9IChpbmRleCB8IG5vZGVfbWF4aW5kZXgobm9kZSkpICsgMTsKKwlpdGVyLT5ub2RlID0gbm9kZTsKKwlfX3NldF9pdGVyX3NoaWZ0KGl0ZXIsIG5vZGUtPnNoaWZ0KTsKKworCWlmIChmbGFncyAmIFJBRElYX1RSRUVfSVRFUl9UQUdHRUQpCisJCXNldF9pdGVyX3RhZ3MoaXRlciwgbm9kZSwgb2Zmc2V0LCB0YWcpOworCisJcmV0dXJuIG5vZGUtPnNsb3RzICsgb2Zmc2V0OworfQorRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX25leHRfY2h1bmspOworCisvKioKKyAqCXJhZGl4X3RyZWVfZ2FuZ19sb29rdXAgLSBwZXJmb3JtIG11bHRpcGxlIGxvb2t1cCBvbiBhIHJhZGl4IHRyZWUKKyAqCUByb290OgkJcmFkaXggdHJlZSByb290CisgKglAcmVzdWx0czoJd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGxvb2t1cCBhcmUgcGxhY2VkCisgKglAZmlyc3RfaW5kZXg6CXN0YXJ0IHRoZSBsb29rdXAgZnJvbSB0aGlzIGtleQorICoJQG1heF9pdGVtczoJcGxhY2UgdXAgdG8gdGhpcyBtYW55IGl0ZW1zIGF0ICpyZXN1bHRzCisgKgorICoJUGVyZm9ybXMgYW4gaW5kZXgtYXNjZW5kaW5nIHNjYW4gb2YgdGhlIHRyZWUgZm9yIHByZXNlbnQgaXRlbXMuICBQbGFjZXMKKyAqCXRoZW0gYXQgKkByZXN1bHRzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgd2hpY2ggd2VyZSBwbGFjZWQgYXQKKyAqCSpAcmVzdWx0cy4KKyAqCisgKglUaGUgaW1wbGVtZW50YXRpb24gaXMgbmFpdmUuCisgKgorICoJTGlrZSByYWRpeF90cmVlX2xvb2t1cCwgcmFkaXhfdHJlZV9nYW5nX2xvb2t1cCBtYXkgYmUgY2FsbGVkIHVuZGVyCisgKglyY3VfcmVhZF9sb2NrLiBJbiB0aGlzIGNhc2UsIHJhdGhlciB0aGFuIHRoZSByZXR1cm5lZCByZXN1bHRzIGJlaW5nCisgKglhbiBhdG9taWMgc25hcHNob3Qgb2YgdGhlIHRyZWUgYXQgYSBzaW5nbGUgcG9pbnQgaW4gdGltZSwgdGhlCisgKglzZW1hbnRpY3Mgb2YgYW4gUkNVIHByb3RlY3RlZCBnYW5nIGxvb2t1cCBhcmUgYXMgdGhvdWdoIG11bHRpcGxlCisgKglyYWRpeF90cmVlX2xvb2t1cHMgaGF2ZSBiZWVuIGlzc3VlZCBpbiBpbmRpdmlkdWFsIGxvY2tzLCBhbmQgcmVzdWx0cworICoJc3RvcmVkIGluICdyZXN1bHRzJy4KKyAqLwordW5zaWduZWQgaW50CityYWRpeF90cmVlX2dhbmdfbG9va3VwKGNvbnN0IHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKipyZXN1bHRzLAorCQkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcykKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9pdGVyIGl0ZXI7CisJdm9pZCBfX3JjdSAqKnNsb3Q7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlpZiAodW5saWtlbHkoIW1heF9pdGVtcykpCisJCXJldHVybiAwOworCisJcmFkaXhfdHJlZV9mb3JfZWFjaF9zbG90KHNsb3QsIHJvb3QsICZpdGVyLCBmaXJzdF9pbmRleCkgeworCQlyZXN1bHRzW3JldF0gPSByY3VfZGVyZWZlcmVuY2VfcmF3KCpzbG90KTsKKwkJaWYgKCFyZXN1bHRzW3JldF0pCisJCQljb250aW51ZTsKKwkJaWYgKHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShyZXN1bHRzW3JldF0pKSB7CisJCQlzbG90ID0gcmFkaXhfdHJlZV9pdGVyX3JldHJ5KCZpdGVyKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgrK3JldCA9PSBtYXhfaXRlbXMpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX2dhbmdfbG9va3VwKTsKKworLyoqCisgKglyYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QgLSBwZXJmb3JtIG11bHRpcGxlIHNsb3QgbG9va3VwIG9uIHJhZGl4IHRyZWUKKyAqCUByb290OgkJcmFkaXggdHJlZSByb290CisgKglAcmVzdWx0czoJd2hlcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGxvb2t1cCBhcmUgcGxhY2VkCisgKglAaW5kaWNlczoJd2hlcmUgdGhlaXIgaW5kaWNlcyBzaG91bGQgYmUgcGxhY2VkIChidXQgdXN1YWxseSBOVUxMKQorICoJQGZpcnN0X2luZGV4OglzdGFydCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKKyAqCUBtYXhfaXRlbXM6CXBsYWNlIHVwIHRvIHRoaXMgbWFueSBpdGVtcyBhdCAqcmVzdWx0cworICoKKyAqCVBlcmZvcm1zIGFuIGluZGV4LWFzY2VuZGluZyBzY2FuIG9mIHRoZSB0cmVlIGZvciBwcmVzZW50IGl0ZW1zLiAgUGxhY2VzCisgKgl0aGVpciBzbG90cyBhdCAqQHJlc3VsdHMgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyB3aGljaCB3ZXJlCisgKglwbGFjZWQgYXQgKkByZXN1bHRzLgorICoKKyAqCVRoZSBpbXBsZW1lbnRhdGlvbiBpcyBuYWl2ZS4KKyAqCisgKglMaWtlIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAgYXMgZmFyIGFzIFJDVSBhbmQgbG9ja2luZyBnb2VzLiBTbG90cyBtdXN0CisgKgliZSBkZXJlZmVyZW5jZWQgd2l0aCByYWRpeF90cmVlX2RlcmVmX3Nsb3QsIGFuZCBpZiB1c2luZyBvbmx5IFJDVQorICoJcHJvdGVjdGlvbiwgcmFkaXhfdHJlZV9kZXJlZl9zbG90IG1heSBmYWlsIHJlcXVpcmluZyBhIHJldHJ5LgorICovCit1bnNpZ25lZCBpbnQKK3JhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJdm9pZCBfX3JjdSAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nICppbmRpY2VzLAorCQkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcykKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9pdGVyIGl0ZXI7CisJdm9pZCBfX3JjdSAqKnNsb3Q7CisJdW5zaWduZWQgaW50IHJldCA9IDA7CisKKwlpZiAodW5saWtlbHkoIW1heF9pdGVtcykpCisJCXJldHVybiAwOworCisJcmFkaXhfdHJlZV9mb3JfZWFjaF9zbG90KHNsb3QsIHJvb3QsICZpdGVyLCBmaXJzdF9pbmRleCkgeworCQlyZXN1bHRzW3JldF0gPSBzbG90OworCQlpZiAoaW5kaWNlcykKKwkJCWluZGljZXNbcmV0XSA9IGl0ZXIuaW5kZXg7CisJCWlmICgrK3JldCA9PSBtYXhfaXRlbXMpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QpOworCisvKioKKyAqCXJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfdGFnIC0gcGVyZm9ybSBtdWx0aXBsZSBsb29rdXAgb24gYSByYWRpeCB0cmVlCisgKgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2VkIG9uIGEgdGFnCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQHJlc3VsdHM6CXdoZXJlIHRoZSByZXN1bHRzIG9mIHRoZSBsb29rdXAgYXJlIHBsYWNlZAorICoJQGZpcnN0X2luZGV4OglzdGFydCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKKyAqCUBtYXhfaXRlbXM6CXBsYWNlIHVwIHRvIHRoaXMgbWFueSBpdGVtcyBhdCAqcmVzdWx0cworICoJQHRhZzoJCXRoZSB0YWcgaW5kZXggKDwgUkFESVhfVFJFRV9NQVhfVEFHUykKKyAqCisgKglQZXJmb3JtcyBhbiBpbmRleC1hc2NlbmRpbmcgc2NhbiBvZiB0aGUgdHJlZSBmb3IgcHJlc2VudCBpdGVtcyB3aGljaAorICoJaGF2ZSB0aGUgdGFnIGluZGV4ZWQgYnkgQHRhZyBzZXQuICBQbGFjZXMgdGhlIGl0ZW1zIGF0ICpAcmVzdWx0cyBhbmQKKyAqCXJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyB3aGljaCB3ZXJlIHBsYWNlZCBhdCAqQHJlc3VsdHMuCisgKi8KK3Vuc2lnbmVkIGludAorcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWcoY29uc3Qgc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKnJlc3VsdHMsCisJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMsCisJCXVuc2lnbmVkIGludCB0YWcpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXZvaWQgX19yY3UgKipzbG90OworCXVuc2lnbmVkIGludCByZXQgPSAwOworCisJaWYgKHVubGlrZWx5KCFtYXhfaXRlbXMpKQorCQlyZXR1cm4gMDsKKworCXJhZGl4X3RyZWVfZm9yX2VhY2hfdGFnZ2VkKHNsb3QsIHJvb3QsICZpdGVyLCBmaXJzdF9pbmRleCwgdGFnKSB7CisJCXJlc3VsdHNbcmV0XSA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoKnNsb3QpOworCQlpZiAoIXJlc3VsdHNbcmV0XSkKKwkJCWNvbnRpbnVlOworCQlpZiAocmFkaXhfdHJlZV9pc19pbnRlcm5hbF9ub2RlKHJlc3VsdHNbcmV0XSkpIHsKKwkJCXNsb3QgPSByYWRpeF90cmVlX2l0ZXJfcmV0cnkoJml0ZXIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCsrcmV0ID09IG1heF9pdGVtcykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfdGFnKTsKKworLyoqCisgKglyYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZ19zbG90IC0gcGVyZm9ybSBtdWx0aXBsZSBzbG90IGxvb2t1cCBvbiBhCisgKgkJCQkJICByYWRpeCB0cmVlIGJhc2VkIG9uIGEgdGFnCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQHJlc3VsdHM6CXdoZXJlIHRoZSByZXN1bHRzIG9mIHRoZSBsb29rdXAgYXJlIHBsYWNlZAorICoJQGZpcnN0X2luZGV4OglzdGFydCB0aGUgbG9va3VwIGZyb20gdGhpcyBrZXkKKyAqCUBtYXhfaXRlbXM6CXBsYWNlIHVwIHRvIHRoaXMgbWFueSBpdGVtcyBhdCAqcmVzdWx0cworICoJQHRhZzoJCXRoZSB0YWcgaW5kZXggKDwgUkFESVhfVFJFRV9NQVhfVEFHUykKKyAqCisgKglQZXJmb3JtcyBhbiBpbmRleC1hc2NlbmRpbmcgc2NhbiBvZiB0aGUgdHJlZSBmb3IgcHJlc2VudCBpdGVtcyB3aGljaAorICoJaGF2ZSB0aGUgdGFnIGluZGV4ZWQgYnkgQHRhZyBzZXQuICBQbGFjZXMgdGhlIHNsb3RzIGF0ICpAcmVzdWx0cyBhbmQKKyAqCXJldHVybnMgdGhlIG51bWJlciBvZiBzbG90cyB3aGljaCB3ZXJlIHBsYWNlZCBhdCAqQHJlc3VsdHMuCisgKi8KK3Vuc2lnbmVkIGludAorcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWdfc2xvdChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQl2b2lkIF9fcmN1ICoqKnJlc3VsdHMsIHVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsCisJCXVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVkIGludCB0YWcpCit7CisJc3RydWN0IHJhZGl4X3RyZWVfaXRlciBpdGVyOworCXZvaWQgX19yY3UgKipzbG90OworCXVuc2lnbmVkIGludCByZXQgPSAwOworCisJaWYgKHVubGlrZWx5KCFtYXhfaXRlbXMpKQorCQlyZXR1cm4gMDsKKworCXJhZGl4X3RyZWVfZm9yX2VhY2hfdGFnZ2VkKHNsb3QsIHJvb3QsICZpdGVyLCBmaXJzdF9pbmRleCwgdGFnKSB7CisJCXJlc3VsdHNbcmV0XSA9IHNsb3Q7CisJCWlmICgrK3JldCA9PSBtYXhfaXRlbXMpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyYWRpeF90cmVlX2dhbmdfbG9va3VwX3RhZ19zbG90KTsKKworLyoqCisgKglfX3JhZGl4X3RyZWVfZGVsZXRlX25vZGUgICAgLSAgICB0cnkgdG8gZnJlZSBub2RlIGFmdGVyIGNsZWFyaW5nIGEgc2xvdAorICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKKyAqCUBub2RlOgkJbm9kZSBjb250YWluaW5nIEBpbmRleAorICoJQHVwZGF0ZV9ub2RlOgljYWxsYmFjayBmb3IgY2hhbmdpbmcgbGVhZiBub2RlcworICoJQHByaXZhdGU6CXByaXZhdGUgZGF0YSB0byBwYXNzIHRvIEB1cGRhdGVfbm9kZQorICoKKyAqCUFmdGVyIGNsZWFyaW5nIHRoZSBzbG90IGF0IEBpbmRleCBpbiBAbm9kZSBmcm9tIHJhZGl4IHRyZWUKKyAqCXJvb3RlZCBhdCBAcm9vdCwgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGF0dGVtcHQgZnJlZWluZyB0aGUKKyAqCW5vZGUgYW5kIHNocmlua2luZyB0aGUgdHJlZS4KKyAqLwordm9pZCBfX3JhZGl4X3RyZWVfZGVsZXRlX25vZGUoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsCisJCQkgICAgICByYWRpeF90cmVlX3VwZGF0ZV9ub2RlX3QgdXBkYXRlX25vZGUsCisJCQkgICAgICB2b2lkICpwcml2YXRlKQoreworCWRlbGV0ZV9ub2RlKHJvb3QsIG5vZGUsIHVwZGF0ZV9ub2RlLCBwcml2YXRlKTsKK30KKworc3RhdGljIGJvb2wgX19yYWRpeF90cmVlX2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUsIHZvaWQgX19yY3UgKipzbG90KQoreworCXZvaWQgKm9sZCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoKnNsb3QpOworCWludCBleGNlcHRpb25hbCA9IHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkob2xkKSA/IC0xIDogMDsKKwl1bnNpZ25lZCBvZmZzZXQgPSBnZXRfc2xvdF9vZmZzZXQobm9kZSwgc2xvdCk7CisJaW50IHRhZzsKKworCWlmIChpc19pZHIocm9vdCkpCisJCW5vZGVfdGFnX3NldChyb290LCBub2RlLCBJRFJfRlJFRSwgb2Zmc2V0KTsKKwllbHNlCisJCWZvciAodGFnID0gMDsgdGFnIDwgUkFESVhfVFJFRV9NQVhfVEFHUzsgdGFnKyspCisJCQlub2RlX3RhZ19jbGVhcihyb290LCBub2RlLCB0YWcsIG9mZnNldCk7CisKKwlyZXBsYWNlX3Nsb3Qoc2xvdCwgTlVMTCwgbm9kZSwgLTEsIGV4Y2VwdGlvbmFsKTsKKwlyZXR1cm4gbm9kZSAmJiBkZWxldGVfbm9kZShyb290LCBub2RlLCBOVUxMLCBOVUxMKTsKK30KKworLyoqCisgKiByYWRpeF90cmVlX2l0ZXJfZGVsZXRlIC0gZGVsZXRlIHRoZSBlbnRyeSBhdCB0aGlzIGl0ZXJhdG9yIHBvc2l0aW9uCisgKiBAcm9vdDogcmFkaXggdHJlZSByb290CisgKiBAaXRlcjogaXRlcmF0b3Igc3RhdGUKKyAqIEBzbG90OiBwb2ludGVyIHRvIHNsb3QKKyAqCisgKiBEZWxldGUgdGhlIGVudHJ5IGF0IHRoZSBwb3NpdGlvbiBjdXJyZW50bHkgcG9pbnRlZCB0byBieSB0aGUgaXRlcmF0b3IuCisgKiBUaGlzIG1heSByZXN1bHQgaW4gdGhlIGN1cnJlbnQgbm9kZSBiZWluZyBmcmVlZDsgaWYgaXQgaXMsIHRoZSBpdGVyYXRvcgorICogaXMgYWR2YW5jZWQgc28gdGhhdCBpdCB3aWxsIG5vdCByZWZlcmVuY2UgdGhlIGZyZWVkIG1lbW9yeS4gIFRoaXMKKyAqIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgd2l0aG91dCBhbnkgbG9ja2luZyBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgdGhyZWFkcworICogd2hpY2ggY2FuIGFjY2VzcyB0aGlzIHRyZWUuCisgKi8KK3ZvaWQgcmFkaXhfdHJlZV9pdGVyX2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJCXN0cnVjdCByYWRpeF90cmVlX2l0ZXIgKml0ZXIsIHZvaWQgX19yY3UgKipzbG90KQoreworCWlmIChfX3JhZGl4X3RyZWVfZGVsZXRlKHJvb3QsIGl0ZXItPm5vZGUsIHNsb3QpKQorCQlpdGVyLT5pbmRleCA9IGl0ZXItPm5leHRfaW5kZXg7Cit9CitFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfaXRlcl9kZWxldGUpOworCisvKioKKyAqIHJhZGl4X3RyZWVfZGVsZXRlX2l0ZW0gLSBkZWxldGUgYW4gaXRlbSBmcm9tIGEgcmFkaXggdHJlZQorICogQHJvb3Q6IHJhZGl4IHRyZWUgcm9vdAorICogQGluZGV4OiBpbmRleCBrZXkKKyAqIEBpdGVtOiBleHBlY3RlZCBpdGVtCisgKgorICogUmVtb3ZlIEBpdGVtIGF0IEBpbmRleCBmcm9tIHRoZSByYWRpeCB0cmVlIHJvb3RlZCBhdCBAcm9vdC4KKyAqCisgKiBSZXR1cm46IHRoZSBkZWxldGVkIGVudHJ5LCBvciAlTlVMTCBpZiBpdCB3YXMgbm90IHByZXNlbnQKKyAqIG9yIHRoZSBlbnRyeSBhdCB0aGUgZ2l2ZW4gQGluZGV4IHdhcyBub3QgQGl0ZW0uCisgKi8KK3ZvaWQgKnJhZGl4X3RyZWVfZGVsZXRlX2l0ZW0oc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBpbmRleCwgdm9pZCAqaXRlbSkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlID0gTlVMTDsKKwl2b2lkIF9fcmN1ICoqc2xvdCA9IE5VTEw7CisJdm9pZCAqZW50cnk7CisKKwllbnRyeSA9IF9fcmFkaXhfdHJlZV9sb29rdXAocm9vdCwgaW5kZXgsICZub2RlLCAmc2xvdCk7CisJaWYgKCFzbG90KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIWVudHJ5ICYmICghaXNfaWRyKHJvb3QpIHx8IG5vZGVfdGFnX2dldChyb290LCBub2RlLCBJRFJfRlJFRSwKKwkJCQkJCWdldF9zbG90X29mZnNldChub2RlLCBzbG90KSkpKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChpdGVtICYmIGVudHJ5ICE9IGl0ZW0pCisJCXJldHVybiBOVUxMOworCisJX19yYWRpeF90cmVlX2RlbGV0ZShyb290LCBub2RlLCBzbG90KTsKKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9kZWxldGVfaXRlbSk7CisKKy8qKgorICogcmFkaXhfdHJlZV9kZWxldGUgLSBkZWxldGUgYW4gZW50cnkgZnJvbSBhIHJhZGl4IHRyZWUKKyAqIEByb290OiByYWRpeCB0cmVlIHJvb3QKKyAqIEBpbmRleDogaW5kZXgga2V5CisgKgorICogUmVtb3ZlIHRoZSBlbnRyeSBhdCBAaW5kZXggZnJvbSB0aGUgcmFkaXggdHJlZSByb290ZWQgYXQgQHJvb3QuCisgKgorICogUmV0dXJuOiBUaGUgZGVsZXRlZCBlbnRyeSwgb3IgJU5VTEwgaWYgaXQgd2FzIG5vdCBwcmVzZW50LgorICovCit2b2lkICpyYWRpeF90cmVlX2RlbGV0ZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBsb25nIGluZGV4KQoreworCXJldHVybiByYWRpeF90cmVlX2RlbGV0ZV9pdGVtKHJvb3QsIGluZGV4LCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9kZWxldGUpOworCit2b2lkIHJhZGl4X3RyZWVfY2xlYXJfdGFncyhzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJICAgc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZSwKKwkJCSAgIHZvaWQgX19yY3UgKipzbG90KQoreworCWlmIChub2RlKSB7CisJCXVuc2lnbmVkIGludCB0YWcsIG9mZnNldCA9IGdldF9zbG90X29mZnNldChub2RlLCBzbG90KTsKKwkJZm9yICh0YWcgPSAwOyB0YWcgPCBSQURJWF9UUkVFX01BWF9UQUdTOyB0YWcrKykKKwkJCW5vZGVfdGFnX2NsZWFyKHJvb3QsIG5vZGUsIHRhZywgb2Zmc2V0KTsKKwl9IGVsc2UgeworCQlyb290X3RhZ19jbGVhcl9hbGwocm9vdCk7CisJfQorfQorCisvKioKKyAqCXJhZGl4X3RyZWVfdGFnZ2VkIC0gdGVzdCB3aGV0aGVyIGFueSBpdGVtcyBpbiB0aGUgdHJlZSBhcmUgdGFnZ2VkCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQHRhZzoJCXRhZyB0byB0ZXN0CisgKi8KK2ludCByYWRpeF90cmVlX3RhZ2dlZChjb25zdCBzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBpbnQgdGFnKQoreworCXJldHVybiByb290X3RhZ19nZXQocm9vdCwgdGFnKTsKK30KK0VYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV90YWdnZWQpOworCisvKioKKyAqIGlkcl9wcmVsb2FkIC0gcHJlbG9hZCBmb3IgaWRyX2FsbG9jKCkKKyAqIEBnZnBfbWFzazogYWxsb2NhdGlvbiBtYXNrIHRvIHVzZSBmb3IgcHJlbG9hZGluZworICoKKyAqIFByZWFsbG9jYXRlIG1lbW9yeSB0byB1c2UgZm9yIHRoZSBuZXh0IGNhbGwgdG8gaWRyX2FsbG9jKCkuICBUaGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIHdpdGggcHJlZW1wdGlvbiBkaXNhYmxlZC4gIEl0IHdpbGwgYmUgZW5hYmxlZCBieSBpZHJfcHJlbG9hZF9lbmQoKS4KKyAqLwordm9pZCBpZHJfcHJlbG9hZChnZnBfdCBnZnBfbWFzaykKK3sKKwlpZiAoX19yYWRpeF90cmVlX3ByZWxvYWQoZ2ZwX21hc2ssIElEUl9QUkVMT0FEX1NJWkUpKQorCQlwcmVlbXB0X2Rpc2FibGUoKTsKK30KK0VYUE9SVF9TWU1CT0woaWRyX3ByZWxvYWQpOworCisvKioKKyAqIGlkYV9wcmVfZ2V0IC0gcmVzZXJ2ZSByZXNvdXJjZXMgZm9yIGlkYSBhbGxvY2F0aW9uCisgKiBAaWRhOiBpZGEgaGFuZGxlCisgKiBAZ2ZwOiBtZW1vcnkgYWxsb2NhdGlvbiBmbGFncworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBpZGFfZ2V0X25ld19hYm92ZSgpLiAgSWYgaXQKKyAqIGlzIHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnksIGl0IHdpbGwgcmV0dXJuICUwLiAgT24gc3VjY2VzcywgaXQgcmV0dXJucyAlMS4KKyAqLworaW50IGlkYV9wcmVfZ2V0KHN0cnVjdCBpZGEgKmlkYSwgZ2ZwX3QgZ2ZwKQoreworCS8qCisJICogVGhlIElEQSBBUEkgaGFzIG5vIHByZWxvYWRfZW5kKCkgZXF1aXZhbGVudC4gIEluc3RlYWQsCisJICogaWRhX2dldF9uZXcoKSBjYW4gcmV0dXJuIC1FQUdBSU4sIHByb21wdGluZyB0aGUgY2FsbGVyCisJICogdG8gcmV0dXJuIHRvIHRoZSBpZGFfcHJlX2dldCgpIHN0ZXAuCisJICovCisJaWYgKCFfX3JhZGl4X3RyZWVfcHJlbG9hZChnZnAsIElEQV9QUkVMT0FEX1NJWkUpKQorCQlwcmVlbXB0X2VuYWJsZSgpOworCisJaWYgKCF0aGlzX2NwdV9yZWFkKGlkYV9iaXRtYXApKSB7CisJCXN0cnVjdCBpZGFfYml0bWFwICpiaXRtYXAgPSBrbWFsbG9jKHNpemVvZigqYml0bWFwKSwgZ2ZwKTsKKwkJaWYgKCFiaXRtYXApCisJCQlyZXR1cm4gMDsKKwkJaWYgKHRoaXNfY3B1X2NtcHhjaGcoaWRhX2JpdG1hcCwgTlVMTCwgYml0bWFwKSkKKwkJCWtmcmVlKGJpdG1hcCk7CisJfQorCisJcmV0dXJuIDE7Cit9CitFWFBPUlRfU1lNQk9MKGlkYV9wcmVfZ2V0KTsKKwordm9pZCBfX3JjdSAqKmlkcl9nZXRfZnJlZV9jbW4oc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCSAgICAgIHN0cnVjdCByYWRpeF90cmVlX2l0ZXIgKml0ZXIsIGdmcF90IGdmcCwKKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbWF4KQoreworCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKm5vZGUgPSBOVUxMLCAqY2hpbGQ7CisJdm9pZCBfX3JjdSAqKnNsb3QgPSAodm9pZCBfX3JjdSAqKikmcm9vdC0+cm5vZGU7CisJdW5zaWduZWQgbG9uZyBtYXhpbmRleCwgc3RhcnQgPSBpdGVyLT5uZXh0X2luZGV4OworCXVuc2lnbmVkIGludCBzaGlmdCwgb2Zmc2V0ID0gMDsKKworIGdyb3c6CisJc2hpZnQgPSByYWRpeF90cmVlX2xvYWRfcm9vdChyb290LCAmY2hpbGQsICZtYXhpbmRleCk7CisJaWYgKCFyYWRpeF90cmVlX3RhZ2dlZChyb290LCBJRFJfRlJFRSkpCisJCXN0YXJ0ID0gbWF4KHN0YXJ0LCBtYXhpbmRleCArIDEpOworCWlmIChzdGFydCA+IG1heCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisKKwlpZiAoc3RhcnQgPiBtYXhpbmRleCkgeworCQlpbnQgZXJyb3IgPSByYWRpeF90cmVlX2V4dGVuZChyb290LCBnZnAsIHN0YXJ0LCBzaGlmdCk7CisJCWlmIChlcnJvciA8IDApCisJCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJCXNoaWZ0ID0gZXJyb3I7CisJCWNoaWxkID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhyb290LT5ybm9kZSk7CisJfQorCisJd2hpbGUgKHNoaWZ0KSB7CisJCXNoaWZ0IC09IFJBRElYX1RSRUVfTUFQX1NISUZUOworCQlpZiAoY2hpbGQgPT0gTlVMTCkgeworCQkJLyogSGF2ZSB0byBhZGQgYSBjaGlsZCBub2RlLiAgKi8KKwkJCWNoaWxkID0gcmFkaXhfdHJlZV9ub2RlX2FsbG9jKGdmcCwgbm9kZSwgcm9vdCwgc2hpZnQsCisJCQkJCQkJb2Zmc2V0LCAwLCAwKTsKKwkJCWlmICghY2hpbGQpCisJCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJCQlhbGxfdGFnX3NldChjaGlsZCwgSURSX0ZSRUUpOworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKCpzbG90LCBub2RlX3RvX2VudHJ5KGNoaWxkKSk7CisJCQlpZiAobm9kZSkKKwkJCQlub2RlLT5jb3VudCsrOworCQl9IGVsc2UgaWYgKCFyYWRpeF90cmVlX2lzX2ludGVybmFsX25vZGUoY2hpbGQpKQorCQkJYnJlYWs7CisKKwkJbm9kZSA9IGVudHJ5X3RvX25vZGUoY2hpbGQpOworCQlvZmZzZXQgPSByYWRpeF90cmVlX2Rlc2NlbmQobm9kZSwgJmNoaWxkLCBzdGFydCk7CisJCWlmICghdGFnX2dldChub2RlLCBJRFJfRlJFRSwgb2Zmc2V0KSkgeworCQkJb2Zmc2V0ID0gcmFkaXhfdHJlZV9maW5kX25leHRfYml0KG5vZGUsIElEUl9GUkVFLAorCQkJCQkJCW9mZnNldCArIDEpOworCQkJc3RhcnQgPSBuZXh0X2luZGV4KHN0YXJ0LCBub2RlLCBvZmZzZXQpOworCQkJaWYgKHN0YXJ0ID4gbWF4IHx8IHN0YXJ0ID09IDApCisJCQkJcmV0dXJuIEVSUl9QVFIoLUVOT1NQQyk7CisJCQl3aGlsZSAob2Zmc2V0ID09IFJBRElYX1RSRUVfTUFQX1NJWkUpIHsKKwkJCQlvZmZzZXQgPSBub2RlLT5vZmZzZXQgKyAxOworCQkJCW5vZGUgPSBub2RlLT5wYXJlbnQ7CisJCQkJaWYgKCFub2RlKQorCQkJCQlnb3RvIGdyb3c7CisJCQkJc2hpZnQgPSBub2RlLT5zaGlmdDsKKwkJCX0KKwkJCWNoaWxkID0gcmN1X2RlcmVmZXJlbmNlX3Jhdyhub2RlLT5zbG90c1tvZmZzZXRdKTsKKwkJfQorCQlzbG90ID0gJm5vZGUtPnNsb3RzW29mZnNldF07CisJfQorCisJaXRlci0+aW5kZXggPSBzdGFydDsKKwlpZiAobm9kZSkKKwkJaXRlci0+bmV4dF9pbmRleCA9IDEgKyBtaW4obWF4LCAoc3RhcnQgfCBub2RlX21heGluZGV4KG5vZGUpKSk7CisJZWxzZQorCQlpdGVyLT5uZXh0X2luZGV4ID0gMTsKKwlpdGVyLT5ub2RlID0gbm9kZTsKKwlfX3NldF9pdGVyX3NoaWZ0KGl0ZXIsIHNoaWZ0KTsKKwlzZXRfaXRlcl90YWdzKGl0ZXIsIG5vZGUsIG9mZnNldCwgSURSX0ZSRUUpOworCisJcmV0dXJuIHNsb3Q7Cit9CisKKy8qKgorICogaWRyX2Rlc3Ryb3kgLSByZWxlYXNlIGFsbCBpbnRlcm5hbCBtZW1vcnkgZnJvbSBhbiBJRFIKKyAqIEBpZHI6IGlkciBoYW5kbGUKKyAqCisgKiBBZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIElEUiBpcyBlbXB0eSwgYW5kIG1heSBiZSByZXVzZWQgb3IKKyAqIHRoZSBkYXRhIHN0cnVjdHVyZSBjb250YWluaW5nIGl0IG1heSBiZSBmcmVlZC4KKyAqCisgKiBBIHR5cGljYWwgY2xlYW4tdXAgc2VxdWVuY2UgZm9yIG9iamVjdHMgc3RvcmVkIGluIGFuIGlkciB0cmVlIHdpbGwgdXNlCisgKiBpZHJfZm9yX2VhY2goKSB0byBmcmVlIGFsbCBvYmplY3RzLCBpZiBuZWNlc3NhcnksIHRoZW4gaWRyX2Rlc3Ryb3koKSB0bworICogZnJlZSB0aGUgbWVtb3J5IHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aG9zZSBvYmplY3RzLgorICovCit2b2lkIGlkcl9kZXN0cm95KHN0cnVjdCBpZHIgKmlkcikKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlID0gcmN1X2RlcmVmZXJlbmNlX3JhdyhpZHItPmlkcl9ydC5ybm9kZSk7CisJaWYgKHJhZGl4X3RyZWVfaXNfaW50ZXJuYWxfbm9kZShub2RlKSkKKwkJcmFkaXhfdHJlZV9mcmVlX25vZGVzKG5vZGUpOworCWlkci0+aWRyX3J0LnJub2RlID0gTlVMTDsKKwlyb290X3RhZ19zZXQoJmlkci0+aWRyX3J0LCBJRFJfRlJFRSk7Cit9CitFWFBPUlRfU1lNQk9MKGlkcl9kZXN0cm95KTsKKworc3RhdGljIHZvaWQKK3JhZGl4X3RyZWVfbm9kZV9jdG9yKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpub2RlID0gYXJnOworCisJbWVtc2V0KG5vZGUsIDAsIHNpemVvZigqbm9kZSkpOworCUlOSVRfTElTVF9IRUFEKCZub2RlLT5wcml2YXRlX2xpc3QpOworfQorCitzdGF0aWMgX19pbml0IHVuc2lnbmVkIGxvbmcgX19tYXhpbmRleCh1bnNpZ25lZCBpbnQgaGVpZ2h0KQoreworCXVuc2lnbmVkIGludCB3aWR0aCA9IGhlaWdodCAqIFJBRElYX1RSRUVfTUFQX1NISUZUOworCWludCBzaGlmdCA9IFJBRElYX1RSRUVfSU5ERVhfQklUUyAtIHdpZHRoOworCisJaWYgKHNoaWZ0IDwgMCkKKwkJcmV0dXJuIH4wVUw7CisJaWYgKHNoaWZ0ID49IEJJVFNfUEVSX0xPTkcpCisJCXJldHVybiAwVUw7CisJcmV0dXJuIH4wVUwgPj4gc2hpZnQ7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCByYWRpeF90cmVlX2luaXRfbWF4bm9kZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGhlaWdodF90b19tYXhpbmRleFtSQURJWF9UUkVFX01BWF9QQVRIICsgMV07CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZWlnaHRfdG9fbWF4aW5kZXgpOyBpKyspCisJCWhlaWdodF90b19tYXhpbmRleFtpXSA9IF9fbWF4aW5kZXgoaSk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGVpZ2h0X3RvX21heG5vZGVzKTsgaSsrKSB7CisJCWZvciAoaiA9IGk7IGogPiAwOyBqLS0pCisJCQloZWlnaHRfdG9fbWF4bm9kZXNbaV0gKz0gaGVpZ2h0X3RvX21heGluZGV4W2ogLSAxXSArIDE7CisJfQorfQorCitzdGF0aWMgaW50IHJhZGl4X3RyZWVfY3B1X2RlYWQodW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmFkaXhfdHJlZV9wcmVsb2FkICpydHA7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKworCS8qIEZyZWUgcGVyLWNwdSBwb29sIG9mIHByZWxvYWRlZCBub2RlcyAqLworCXJ0cCA9ICZwZXJfY3B1KHJhZGl4X3RyZWVfcHJlbG9hZHMsIGNwdSk7CisJd2hpbGUgKHJ0cC0+bnIpIHsKKwkJbm9kZSA9IHJ0cC0+bm9kZXM7CisJCXJ0cC0+bm9kZXMgPSBub2RlLT5wYXJlbnQ7CisJCWttZW1fY2FjaGVfZnJlZShyYWRpeF90cmVlX25vZGVfY2FjaGVwLCBub2RlKTsKKwkJcnRwLT5uci0tOworCX0KKwlrZnJlZShwZXJfY3B1KGlkYV9iaXRtYXAsIGNwdSkpOworCXBlcl9jcHUoaWRhX2JpdG1hcCwgY3B1KSA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHJhZGl4X3RyZWVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlCVUlMRF9CVUdfT04oUkFESVhfVFJFRV9NQVhfVEFHUyArIF9fR0ZQX0JJVFNfU0hJRlQgPiAzMik7CisJcmFkaXhfdHJlZV9ub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJyYWRpeF90cmVlX25vZGUiLAorCQkJc2l6ZW9mKHN0cnVjdCByYWRpeF90cmVlX25vZGUpLCAwLAorCQkJU0xBQl9QQU5JQyB8IFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAorCQkJcmFkaXhfdHJlZV9ub2RlX2N0b3IpOworCXJhZGl4X3RyZWVfaW5pdF9tYXhub2RlcygpOworCXJldCA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfUkFESVhfREVBRCwgImxpYi9yYWRpeDpkZWFkIiwKKwkJCQkJTlVMTCwgcmFkaXhfdHJlZV9jcHVfZGVhZCk7CisJV0FSTl9PTihyZXQgPCAwKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2Ly5naXRpZ25vcmUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWIxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsNiBAQAorbWt0YWJsZXMKK2FsdGl2ZWMqLmMKK2ludCouYwordGFibGVzLmMKK25lb24/LmMKK3MzOTB2eD8uYwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvTWFrZWZpbGUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGYzYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvTWFrZWZpbGUKQEAgLTAsMCArMSwxNDggQEAKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKK29iai0kKENPTkZJR19SQUlENl9QUSkJKz0gcmFpZDZfcHEubworCityYWlkNl9wcS15CSs9IGFsZ29zLm8gcmVjb3YubyB0YWJsZXMubyBpbnQxLm8gaW50Mi5vIGludDQubyBcCisJCSAgIGludDgubyBpbnQxNi5vIGludDMyLm8KKworcmFpZDZfcHEtJChDT05GSUdfWDg2KSArPSByZWNvdl9zc3NlMy5vIHJlY292X2F2eDIubyBtbXgubyBzc2UxLm8gc3NlMi5vIGF2eDIubyBhdng1MTIubyByZWNvdl9hdng1MTIubworcmFpZDZfcHEtJChDT05GSUdfQUxUSVZFQykgKz0gYWx0aXZlYzEubyBhbHRpdmVjMi5vIGFsdGl2ZWM0Lm8gYWx0aXZlYzgubworcmFpZDZfcHEtJChDT05GSUdfS0VSTkVMX01PREVfTkVPTikgKz0gbmVvbi5vIG5lb24xLm8gbmVvbjIubyBuZW9uNC5vIG5lb244Lm8gcmVjb3ZfbmVvbi5vIHJlY292X25lb25faW5uZXIubworcmFpZDZfcHEtJChDT05GSUdfVElMRUdYKSArPSB0aWxlZ3g4Lm8KK3JhaWQ2X3BxLSQoQ09ORklHX1MzOTApICs9IHMzOTB2eDgubyByZWNvdl9zMzkweGMubworCitob3N0cHJvZ3MteQkrPSBta3RhYmxlcworCitxdWlldF9jbWRfdW5yb2xsID0gVU5ST0xMICAkQAorICAgICAgY21kX3Vucm9sbCA9ICQoQVdLKSAtZiQoc3JjdHJlZSkvJChzcmMpL3Vucm9sbC5hd2sgLXZOPSQoVU5ST0xMKSBcCisgICAgICAgICAgICAgICAgICAgPCAkPCA+ICRAIHx8ICggcm0gLWYgJEAgJiYgZXhpdCAxICkKKworaWZlcSAoJChDT05GSUdfQUxUSVZFQykseSkKK2FsdGl2ZWNfZmxhZ3MgOj0gLW1hbHRpdmVjICQoY2FsbCBjYy1vcHRpb24sLW1hYmk9YWx0aXZlYykKKworaWZlcSAoJChjYy1uYW1lKSxjbGFuZykKKyMgY2xhbmcgcHBjIHBvcnQgZG9lcyBub3QgeWV0IHN1cHBvcnQgLW1hbHRpdmVjIHdoZW4gLW1zb2Z0LWZsb2F0IGlzCisjIGVuYWJsZWQuIEEgZnV0dXJlIHJlbGVhc2Ugb2YgY2xhbmcgd2lsbCByZXNvbHZlIHRoaXMKKyMgaHR0cHM6Ly9idWdzLmxsdm0ub3JnL3Nob3dfYnVnLmNnaT9pZD0zMTE3NworQ0ZMQUdTX1JFTU9WRV9hbHRpdmVjMS5vICArPSAtbXNvZnQtZmxvYXQKK0NGTEFHU19SRU1PVkVfYWx0aXZlYzIubyAgKz0gLW1zb2Z0LWZsb2F0CitDRkxBR1NfUkVNT1ZFX2FsdGl2ZWM0Lm8gICs9IC1tc29mdC1mbG9hdAorQ0ZMQUdTX1JFTU9WRV9hbHRpdmVjOC5vICArPSAtbXNvZnQtZmxvYXQKK0NGTEFHU19SRU1PVkVfYWx0aXZlYzgubyAgKz0gLW1zb2Z0LWZsb2F0CitDRkxBR1NfUkVNT1ZFX3ZwZXJteG9yMS5vICs9IC1tc29mdC1mbG9hdAorQ0ZMQUdTX1JFTU9WRV92cGVybXhvcjIubyArPSAtbXNvZnQtZmxvYXQKK0NGTEFHU19SRU1PVkVfdnBlcm14b3I0Lm8gKz0gLW1zb2Z0LWZsb2F0CitDRkxBR1NfUkVNT1ZFX3ZwZXJteG9yOC5vICs9IC1tc29mdC1mbG9hdAorZW5kaWYKK2VuZGlmCisKKyMgVGhlIEdDQyBvcHRpb24gLWZmcmVlc3RhbmRpbmcgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gY29tcGlsZSBjb2RlIGNvbnRhaW5pbmcKKyMgQVJNL05FT04gaW50cmluc2ljcyBpbiBhIG5vbiBDOTktY29tcGxpYW50IGVudmlyb25tZW50IChzdWNoIGFzIHRoZSBrZXJuZWwpCitpZmVxICgkKENPTkZJR19LRVJORUxfTU9ERV9ORU9OKSx5KQorTkVPTl9GTEFHUyA6PSAtZmZyZWVzdGFuZGluZworaWZlcSAoJChBUkNIKSxhcm0pCitORU9OX0ZMQUdTICs9IC1tYXJjaD1hcm12Ny1hIC1tZmxvYXQtYWJpPXNvZnRmcCAtbWZwdT1uZW9uCitlbmRpZgorQ0ZMQUdTX3JlY292X25lb25faW5uZXIubyArPSAkKE5FT05fRkxBR1MpCitpZmVxICgkKEFSQ0gpLGFybTY0KQorQ0ZMQUdTX1JFTU9WRV9yZWNvdl9uZW9uX2lubmVyLm8gKz0gLW1nZW5lcmFsLXJlZ3Mtb25seQorQ0ZMQUdTX1JFTU9WRV9uZW9uMS5vICs9IC1tZ2VuZXJhbC1yZWdzLW9ubHkKK0NGTEFHU19SRU1PVkVfbmVvbjIubyArPSAtbWdlbmVyYWwtcmVncy1vbmx5CitDRkxBR1NfUkVNT1ZFX25lb240Lm8gKz0gLW1nZW5lcmFsLXJlZ3Mtb25seQorQ0ZMQUdTX1JFTU9WRV9uZW9uOC5vICs9IC1tZ2VuZXJhbC1yZWdzLW9ubHkKK2VuZGlmCitlbmRpZgorCit0YXJnZXRzICs9IGludDEuYworJChvYmopL2ludDEuYzogICBVTlJPTEwgOj0gMQorJChvYmopL2ludDEuYzogICAkKHNyYykvaW50LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCit0YXJnZXRzICs9IGludDIuYworJChvYmopL2ludDIuYzogICBVTlJPTEwgOj0gMgorJChvYmopL2ludDIuYzogICAkKHNyYykvaW50LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCit0YXJnZXRzICs9IGludDQuYworJChvYmopL2ludDQuYzogICBVTlJPTEwgOj0gNAorJChvYmopL2ludDQuYzogICAkKHNyYykvaW50LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCit0YXJnZXRzICs9IGludDguYworJChvYmopL2ludDguYzogICBVTlJPTEwgOj0gOAorJChvYmopL2ludDguYzogICAkKHNyYykvaW50LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCit0YXJnZXRzICs9IGludDE2LmMKKyQob2JqKS9pbnQxNi5jOiAgVU5ST0xMIDo9IDE2CiskKG9iaikvaW50MTYuYzogICQoc3JjKS9pbnQudWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCisKK3RhcmdldHMgKz0gaW50MzIuYworJChvYmopL2ludDMyLmM6ICBVTlJPTEwgOj0gMzIKKyQob2JqKS9pbnQzMi5jOiAgJChzcmMpL2ludC51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKKworQ0ZMQUdTX2FsdGl2ZWMxLm8gKz0gJChhbHRpdmVjX2ZsYWdzKQordGFyZ2V0cyArPSBhbHRpdmVjMS5jCiskKG9iaikvYWx0aXZlYzEuYzogICBVTlJPTEwgOj0gMQorJChvYmopL2FsdGl2ZWMxLmM6ICAgJChzcmMpL2FsdGl2ZWMudWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCisKK0NGTEFHU19hbHRpdmVjMi5vICs9ICQoYWx0aXZlY19mbGFncykKK3RhcmdldHMgKz0gYWx0aXZlYzIuYworJChvYmopL2FsdGl2ZWMyLmM6ICAgVU5ST0xMIDo9IDIKKyQob2JqKS9hbHRpdmVjMi5jOiAgICQoc3JjKS9hbHRpdmVjLnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCitDRkxBR1NfYWx0aXZlYzQubyArPSAkKGFsdGl2ZWNfZmxhZ3MpCit0YXJnZXRzICs9IGFsdGl2ZWM0LmMKKyQob2JqKS9hbHRpdmVjNC5jOiAgIFVOUk9MTCA6PSA0CiskKG9iaikvYWx0aXZlYzQuYzogICAkKHNyYykvYWx0aXZlYy51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKKworQ0ZMQUdTX2FsdGl2ZWM4Lm8gKz0gJChhbHRpdmVjX2ZsYWdzKQordGFyZ2V0cyArPSBhbHRpdmVjOC5jCiskKG9iaikvYWx0aXZlYzguYzogICBVTlJPTEwgOj0gOAorJChvYmopL2FsdGl2ZWM4LmM6ICAgJChzcmMpL2FsdGl2ZWMudWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCisKK0NGTEFHU19uZW9uMS5vICs9ICQoTkVPTl9GTEFHUykKK3RhcmdldHMgKz0gbmVvbjEuYworJChvYmopL25lb24xLmM6ICAgVU5ST0xMIDo9IDEKKyQob2JqKS9uZW9uMS5jOiAgICQoc3JjKS9uZW9uLnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCitDRkxBR1NfbmVvbjIubyArPSAkKE5FT05fRkxBR1MpCit0YXJnZXRzICs9IG5lb24yLmMKKyQob2JqKS9uZW9uMi5jOiAgIFVOUk9MTCA6PSAyCiskKG9iaikvbmVvbjIuYzogICAkKHNyYykvbmVvbi51YyAkKHNyYykvdW5yb2xsLmF3ayBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHVucm9sbCkKKworQ0ZMQUdTX25lb240Lm8gKz0gJChORU9OX0ZMQUdTKQordGFyZ2V0cyArPSBuZW9uNC5jCiskKG9iaikvbmVvbjQuYzogICBVTlJPTEwgOj0gNAorJChvYmopL25lb240LmM6ICAgJChzcmMpL25lb24udWMgJChzcmMpL3Vucm9sbC5hd2sgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCx1bnJvbGwpCisKK0NGTEFHU19uZW9uOC5vICs9ICQoTkVPTl9GTEFHUykKK3RhcmdldHMgKz0gbmVvbjguYworJChvYmopL25lb244LmM6ICAgVU5ST0xMIDo9IDgKKyQob2JqKS9uZW9uOC5jOiAgICQoc3JjKS9uZW9uLnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCit0YXJnZXRzICs9IHRpbGVneDguYworJChvYmopL3RpbGVneDguYzogICBVTlJPTEwgOj0gOAorJChvYmopL3RpbGVneDguYzogICAkKHNyYykvdGlsZWd4LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCit0YXJnZXRzICs9IHMzOTB2eDguYworJChvYmopL3MzOTB2eDguYzogICBVTlJPTEwgOj0gOAorJChvYmopL3MzOTB2eDguYzogICAkKHNyYykvczM5MHZ4LnVjICQoc3JjKS91bnJvbGwuYXdrIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsdW5yb2xsKQorCitxdWlldF9jbWRfbWt0YWJsZSA9IFRBQkxFICAgJEAKKyAgICAgIGNtZF9ta3RhYmxlID0gJChvYmopL21rdGFibGVzID4gJEAgfHwgKCBybSAtZiAkQCAmJiBleGl0IDEgKQorCit0YXJnZXRzICs9IHRhYmxlcy5jCiskKG9iaikvdGFibGVzLmM6ICQob2JqKS9ta3RhYmxlcyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG1rdGFibGUpCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9hbGdvcy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvYWxnb3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzY5OTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvYWxnb3MuYwpAQCAtMCwwICsxLDI3MSBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDIgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJhaWQ2L2FsZ29zLmMKKyAqCisgKiBBbGdvcml0aG0gbGlzdCBhbmQgYWxnb3JpdGhtIHNlbGVjdGlvbiBmb3IgUkFJRC02CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKyNpZm5kZWYgX19LRVJORUxfXworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbHNlCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaWYgIVJBSUQ2X1VTRV9FTVBUWV9aRVJPX1BBR0UKKy8qIEluIC5ic3Mgc28gaXQncyB6ZXJvZWQgKi8KK2NvbnN0IGNoYXIgcmFpZDZfZW1wdHlfemVyb19wYWdlW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyNTYpKSk7CitFWFBPUlRfU1lNQk9MKHJhaWQ2X2VtcHR5X3plcm9fcGFnZSk7CisjZW5kaWYKKyNlbmRpZgorCitzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfY2FsbDsKK0VYUE9SVF9TWU1CT0xfR1BMKHJhaWQ2X2NhbGwpOworCitjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgKiBjb25zdCByYWlkNl9hbGdvc1tdID0geworI2lmIGRlZmluZWQoX19pYTY0X18pCisJJnJhaWQ2X2ludHgxNiwKKwkmcmFpZDZfaW50eDMyLAorI2VuZGlmCisjaWYgZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX19hcmNoX3VtX18pCisJJnJhaWQ2X21teHgxLAorCSZyYWlkNl9tbXh4MiwKKwkmcmFpZDZfc3NlMXgxLAorCSZyYWlkNl9zc2UxeDIsCisJJnJhaWQ2X3NzZTJ4MSwKKwkmcmFpZDZfc3NlMngyLAorI2lmZGVmIENPTkZJR19BU19BVlgyCisJJnJhaWQ2X2F2eDJ4MSwKKwkmcmFpZDZfYXZ4MngyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FTX0FWWDUxMgorCSZyYWlkNl9hdng1MTJ4MSwKKwkmcmFpZDZfYXZ4NTEyeDIsCisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoX194ODZfNjRfXykgJiYgIWRlZmluZWQoX19hcmNoX3VtX18pCisJJnJhaWQ2X3NzZTJ4MSwKKwkmcmFpZDZfc3NlMngyLAorCSZyYWlkNl9zc2UyeDQsCisjaWZkZWYgQ09ORklHX0FTX0FWWDIKKwkmcmFpZDZfYXZ4MngxLAorCSZyYWlkNl9hdngyeDIsCisJJnJhaWQ2X2F2eDJ4NCwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BU19BVlg1MTIKKwkmcmFpZDZfYXZ4NTEyeDEsCisJJnJhaWQ2X2F2eDUxMngyLAorCSZyYWlkNl9hdng1MTJ4NCwKKyNlbmRpZgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FMVElWRUMKKwkmcmFpZDZfYWx0aXZlYzEsCisJJnJhaWQ2X2FsdGl2ZWMyLAorCSZyYWlkNl9hbHRpdmVjNCwKKwkmcmFpZDZfYWx0aXZlYzgsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19USUxFR1gpCisJJnJhaWQ2X3RpbGVneDgsCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQorCSZyYWlkNl9zMzkwdng4LAorI2VuZGlmCisJJnJhaWQ2X2ludHgxLAorCSZyYWlkNl9pbnR4MiwKKwkmcmFpZDZfaW50eDQsCisJJnJhaWQ2X2ludHg4LAorI2lmZGVmIENPTkZJR19LRVJORUxfTU9ERV9ORU9OCisJJnJhaWQ2X25lb254MSwKKwkmcmFpZDZfbmVvbngyLAorCSZyYWlkNl9uZW9ueDQsCisJJnJhaWQ2X25lb254OCwKKyNlbmRpZgorCU5VTEwKK307CisKK3ZvaWQgKCpyYWlkNl8yZGF0YV9yZWNvdikoaW50LCBzaXplX3QsIGludCwgaW50LCB2b2lkICoqKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJhaWQ2XzJkYXRhX3JlY292KTsKKwordm9pZCAoKnJhaWQ2X2RhdGFwX3JlY292KShpbnQsIHNpemVfdCwgaW50LCB2b2lkICoqKTsKK0VYUE9SVF9TWU1CT0xfR1BMKHJhaWQ2X2RhdGFwX3JlY292KTsKKworY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzICpjb25zdCByYWlkNl9yZWNvdl9hbGdvc1tdID0geworI2lmZGVmIENPTkZJR19BU19BVlg1MTIKKwkmcmFpZDZfcmVjb3ZfYXZ4NTEyLAorI2VuZGlmCisjaWZkZWYgQ09ORklHX0FTX0FWWDIKKwkmcmFpZDZfcmVjb3ZfYXZ4MiwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19BU19TU1NFMworCSZyYWlkNl9yZWNvdl9zc3NlMywKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TMzkwCisJJnJhaWQ2X3JlY292X3MzOTB4YywKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0tFUk5FTF9NT0RFX05FT04pCisJJnJhaWQ2X3JlY292X25lb24sCisjZW5kaWYKKwkmcmFpZDZfcmVjb3ZfaW50eDEsCisJTlVMTAorfTsKKworI2lmZGVmIF9fS0VSTkVMX18KKyNkZWZpbmUgUkFJRDZfVElNRV9KSUZGSUVTX0xHMgk0CisjZWxzZQorLyogTmVlZCBtb3JlIHRpbWUgdG8gYmUgc3RhYmxlIGluIHVzZXJzcGFjZSAqLworI2RlZmluZSBSQUlENl9USU1FX0pJRkZJRVNfTEcyCTkKKyNkZWZpbmUgdGltZV9iZWZvcmUoeCwgeSkgKCh4KSA8ICh5KSkKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyAqcmFpZDZfY2hvb3NlX3JlY292KHZvaWQpCit7CisJY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzICpjb25zdCAqYWxnbzsKKwljb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgKmJlc3Q7CisKKwlmb3IgKGJlc3QgPSBOVUxMLCBhbGdvID0gcmFpZDZfcmVjb3ZfYWxnb3M7ICphbGdvOyBhbGdvKyspCisJCWlmICghYmVzdCB8fCAoKmFsZ28pLT5wcmlvcml0eSA+IGJlc3QtPnByaW9yaXR5KQorCQkJaWYgKCEoKmFsZ28pLT52YWxpZCB8fCAoKmFsZ28pLT52YWxpZCgpKQorCQkJCWJlc3QgPSAqYWxnbzsKKworCWlmIChiZXN0KSB7CisJCXJhaWQ2XzJkYXRhX3JlY292ID0gYmVzdC0+ZGF0YTI7CisJCXJhaWQ2X2RhdGFwX3JlY292ID0gYmVzdC0+ZGF0YXA7CisKKwkJcHJfaW5mbygicmFpZDY6IHVzaW5nICVzIHJlY292ZXJ5IGFsZ29yaXRobVxuIiwgYmVzdC0+bmFtZSk7CisJfSBlbHNlCisJCXByX2VycigicmFpZDY6IFlpa2VzISBObyByZWNvdmVyeSBhbGdvcml0aG0gZm91bmQhXG4iKTsKKworCXJldHVybiBiZXN0OworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCByYWlkNl9jYWxscyAqcmFpZDZfY2hvb3NlX2dlbigKKwl2b2lkICooKmNvbnN0IGRwdHJzKVsoNjU1MzYvUEFHRV9TSVpFKSsyXSwgY29uc3QgaW50IGRpc2tzKQoreworCXVuc2lnbmVkIGxvbmcgcGVyZiwgYmVzdGdlbnBlcmYsIGJlc3R4b3JwZXJmLCBqMCwgajE7CisJaW50IHN0YXJ0ID0gKGRpc2tzPj4xKS0xLCBzdG9wID0gZGlza3MtMzsJLyogd29yayBvbiB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGRpc2tzICovCisJY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzICpjb25zdCAqYWxnbzsKKwljb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgKmJlc3Q7CisKKwlmb3IgKGJlc3RnZW5wZXJmID0gMCwgYmVzdHhvcnBlcmYgPSAwLCBiZXN0ID0gTlVMTCwgYWxnbyA9IHJhaWQ2X2FsZ29zOyAqYWxnbzsgYWxnbysrKSB7CisJCWlmICghYmVzdCB8fCAoKmFsZ28pLT5wcmVmZXIgPj0gYmVzdC0+cHJlZmVyKSB7CisJCQlpZiAoKCphbGdvKS0+dmFsaWQgJiYgISgqYWxnbyktPnZhbGlkKCkpCisJCQkJY29udGludWU7CisKKwkJCXBlcmYgPSAwOworCisJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCWowID0gamlmZmllczsKKwkJCXdoaWxlICgoajEgPSBqaWZmaWVzKSA9PSBqMCkKKwkJCQljcHVfcmVsYXgoKTsKKwkJCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLAorCQkJCQkgICAgajEgKyAoMTw8UkFJRDZfVElNRV9KSUZGSUVTX0xHMikpKSB7CisJCQkJKCphbGdvKS0+Z2VuX3N5bmRyb21lKGRpc2tzLCBQQUdFX1NJWkUsICpkcHRycyk7CisJCQkJcGVyZisrOworCQkJfQorCQkJcHJlZW1wdF9lbmFibGUoKTsKKworCQkJaWYgKHBlcmYgPiBiZXN0Z2VucGVyZikgeworCQkJCWJlc3RnZW5wZXJmID0gcGVyZjsKKwkJCQliZXN0ID0gKmFsZ287CisJCQl9CisJCQlwcl9pbmZvKCJyYWlkNjogJS04cyBnZW4oKSAlNWxkIE1CL3NcbiIsICgqYWxnbyktPm5hbWUsCisJCQkgICAgICAgKHBlcmYqSFopID4+ICgyMC0xNitSQUlENl9USU1FX0pJRkZJRVNfTEcyKSk7CisKKwkJCWlmICghKCphbGdvKS0+eG9yX3N5bmRyb21lKQorCQkJCWNvbnRpbnVlOworCisJCQlwZXJmID0gMDsKKworCQkJcHJlZW1wdF9kaXNhYmxlKCk7CisJCQlqMCA9IGppZmZpZXM7CisJCQl3aGlsZSAoKGoxID0gamlmZmllcykgPT0gajApCisJCQkJY3B1X3JlbGF4KCk7CisJCQl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywKKwkJCQkJICAgIGoxICsgKDE8PFJBSUQ2X1RJTUVfSklGRklFU19MRzIpKSkgeworCQkJCSgqYWxnbyktPnhvcl9zeW5kcm9tZShkaXNrcywgc3RhcnQsIHN0b3AsCisJCQkJCQkgICAgICBQQUdFX1NJWkUsICpkcHRycyk7CisJCQkJcGVyZisrOworCQkJfQorCQkJcHJlZW1wdF9lbmFibGUoKTsKKworCQkJaWYgKGJlc3QgPT0gKmFsZ28pCisJCQkJYmVzdHhvcnBlcmYgPSBwZXJmOworCisJCQlwcl9pbmZvKCJyYWlkNjogJS04cyB4b3IoKSAlNWxkIE1CL3NcbiIsICgqYWxnbyktPm5hbWUsCisJCQkJKHBlcmYqSFopID4+ICgyMC0xNitSQUlENl9USU1FX0pJRkZJRVNfTEcyKzEpKTsKKwkJfQorCX0KKworCWlmIChiZXN0KSB7CisJCXByX2luZm8oInJhaWQ2OiB1c2luZyBhbGdvcml0aG0gJXMgZ2VuKCkgJWxkIE1CL3NcbiIsCisJCSAgICAgICBiZXN0LT5uYW1lLAorCQkgICAgICAgKGJlc3RnZW5wZXJmKkhaKSA+PiAoMjAtMTYrUkFJRDZfVElNRV9KSUZGSUVTX0xHMikpOworCQlpZiAoYmVzdC0+eG9yX3N5bmRyb21lKQorCQkJcHJfaW5mbygicmFpZDY6IC4uLi4geG9yKCkgJWxkIE1CL3MsIHJtdyBlbmFibGVkXG4iLAorCQkJICAgICAgIChiZXN0eG9ycGVyZipIWikgPj4gKDIwLTE2K1JBSUQ2X1RJTUVfSklGRklFU19MRzIrMSkpOworCQlyYWlkNl9jYWxsID0gKmJlc3Q7CisJfSBlbHNlCisJCXByX2VycigicmFpZDY6IFlpa2VzISAgTm8gYWxnb3JpdGhtIGZvdW5kIVxuIik7CisKKwlyZXR1cm4gYmVzdDsKK30KKworCisvKiBUcnkgdG8gcGljayB0aGUgYmVzdCBhbGdvcml0aG0gKi8KKy8qIFRoaXMgY29kZSB1c2VzIHRoZSBnZm11bCB0YWJsZSBhcyBjb252ZW5pZW50IGRhdGEgc2V0IHRvIGFidXNlICovCisKK2ludCBfX2luaXQgcmFpZDZfc2VsZWN0X2FsZ28odm9pZCkKK3sKKwljb25zdCBpbnQgZGlza3MgPSAoNjU1MzYvUEFHRV9TSVpFKSsyOworCisJY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzICpnZW5fYmVzdDsKKwljb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgKnJlY19iZXN0OworCWNoYXIgKnN5bmRyb21lczsKKwl2b2lkICpkcHRyc1soNjU1MzYvUEFHRV9TSVpFKSsyXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBkaXNrcy0yOyBpKyspCisJCWRwdHJzW2ldID0gKChjaGFyICopcmFpZDZfZ2ZtdWwpICsgUEFHRV9TSVpFKmk7CisKKwkvKiBOb3JtYWwgY29kZSAtIHVzZSBhIDItcGFnZSBhbGxvY2F0aW9uIHRvIGF2b2lkIEQkIGNvbmZsaWN0ICovCisJc3luZHJvbWVzID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAxKTsKKworCWlmICghc3luZHJvbWVzKSB7CisJCXByX2VycigicmFpZDY6IFlpa2VzISAgTm8gbWVtb3J5IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlkcHRyc1tkaXNrcy0yXSA9IHN5bmRyb21lczsKKwlkcHRyc1tkaXNrcy0xXSA9IHN5bmRyb21lcyArIFBBR0VfU0laRTsKKworCS8qIHNlbGVjdCByYWlkIGdlbl9zeW5kcm9tZSBmdW5jdGlvbiAqLworCWdlbl9iZXN0ID0gcmFpZDZfY2hvb3NlX2dlbigmZHB0cnMsIGRpc2tzKTsKKworCS8qIHNlbGVjdCByYWlkIHJlY292ZXIgZnVuY3Rpb25zICovCisJcmVjX2Jlc3QgPSByYWlkNl9jaG9vc2VfcmVjb3YoKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpc3luZHJvbWVzLCAxKTsKKworCXJldHVybiBnZW5fYmVzdCAmJiByZWNfYmVzdCA/IDAgOiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZCByYWlkNl9leGl0KHZvaWQpCit7CisJZG8geyB9IHdoaWxlICgwKTsKK30KKworc3Vic3lzX2luaXRjYWxsKHJhaWQ2X3NlbGVjdF9hbGdvKTsKK21vZHVsZV9leGl0KHJhaWQ2X2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSQUlENiBRLXN5bmRyb21lIGNhbGN1bGF0aW9ucyIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvYWx0aXZlYy51YyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L2FsdGl2ZWMudWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyYWFlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L2FsdGl2ZWMudWMKQEAgLTAsMCArMSwxMjkgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAyLTIwMDQgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJhaWQ2YWx0aXZlYyQjLmMKKyAqCisgKiAkIy13YXkgdW5yb2xsZWQgcG9ydGFibGUgaW50ZWdlciBtYXRoIFJBSUQtNiBpbnN0cnVjdGlvbiBzZXQKKyAqCisgKiBUaGlzIGZpbGUgaXMgcG9zdHByb2Nlc3NlZCB1c2luZyB1bnJvbGwuYXdrCisgKgorICogPGJlbmg+IGhwYTogaW4gcHJvY2VzcywKKyAqIHlvdSBjYW4ganVzdCAic3RlYWwiIHRoZSB2ZWMgdW5pdCB3aXRoIGVuYWJsZV9rZXJuZWxfYWx0aXZlYygpIChidXQKKyAqIGJyYWNrZWQgdGhpcyB3aXRoIHByZWVtcHRfZGlzYWJsZS9lbmFibGUgb3IgaW4gYSBsb2NrKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisKKyNpbmNsdWRlIDxhbHRpdmVjLmg+CisjaWZkZWYgX19LRVJORUxfXworIyBpbmNsdWRlIDxhc20vY3B1dGFibGUuaD4KKyMgaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgorCisvKgorICogVGhpcyBpcyB0aGUgQyBkYXRhIHR5cGUgdG8gdXNlLiAgV2UgdXNlIGEgdmVjdG9yIG9mCisgKiBzaWduZWQgY2hhciBzbyB2ZWNfY21wZ3QoKSB3aWxsIGdlbmVyYXRlIHRoZSByaWdodAorICogaW5zdHJ1Y3Rpb24uCisgKi8KKwordHlwZWRlZiB2ZWN0b3Igc2lnbmVkIGNoYXIgdW5hdGl2ZV90OworCisjZGVmaW5lIE5CWVRFUyh4KSAoKHZlY3RvciBzaWduZWQgY2hhcikge3gseCx4LHgsIHgseCx4LHgsIHgseCx4LHgsIHgseCx4LHh9KQorI2RlZmluZSBOU0laRQlzaXplb2YodW5hdGl2ZV90KQorCisvKgorICogVGhlIFNITEJZVEUoKSBvcGVyYXRpb24gc2hpZnRzIGVhY2ggYnl0ZSBsZWZ0IGJ5IDEsICpub3QqCisgKiByb2xsaW5nIG92ZXIgaW50byB0aGUgbmV4dCBieXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bmF0aXZlX3QgU0hMQllURSh1bmF0aXZlX3QgdikKK3sKKwlyZXR1cm4gdmVjX2FkZCh2LHYpOworfQorCisvKgorICogVGhlIE1BU0soKSBvcGVyYXRpb24gcmV0dXJucyAweEZGIGluIGFueSBieXRlIGZvciB3aGljaCB0aGUgaGlnaAorICogYml0IGlzIDEsIDB4MDAgZm9yIGFueSBieXRlIGZvciB3aGljaCB0aGUgaGlnaCBiaXQgaXMgMC4KKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIHVuYXRpdmVfdCBNQVNLKHVuYXRpdmVfdCB2KQoreworCXVuYXRpdmVfdCB6diA9IE5CWVRFUygwKTsKKworCS8qIHZlY19jbXBndCByZXR1cm5zIGEgdmVjdG9yIGJvb2wgY2hhcjsgdGh1cyB0aGUgbmVlZCBmb3IgdGhlIGNhc3QgKi8KKwlyZXR1cm4gKHVuYXRpdmVfdCl2ZWNfY21wZ3QoenYsIHYpOworfQorCisKKy8qIFRoaXMgaXMgbm9pbmxpbmUgdG8gbWFrZSBkYW1uZWQgc3VyZSB0aGF0IGdjYyBkb2Vzbid0IG1vdmUgYW55IG9mIHRoZQorICAgQWx0aXZlYyBjb2RlIGFyb3VuZCB0aGUgZW5hYmxlL2Rpc2FibGUgY29kZSAqLworc3RhdGljIHZvaWQgbm9pbmxpbmUKK3JhaWQ2X2FsdGl2ZWMkI19nZW5fc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXVuYXRpdmVfdCB3ZCQkLCB3cSQkLCB3cCQkLCB3MSQkLCB3MiQkOworCXVuYXRpdmVfdCB4MWQgPSBOQllURVMoMHgxZCk7CisKKwl6MCA9IGRpc2tzIC0gMzsJCS8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejArMV07CQkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07CQkvKiBSUyBzeW5kcm9tZSAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IE5TSVpFKiQjICkgeworCQl3cSQkID0gd3AkJCA9ICoodW5hdGl2ZV90ICopJmRwdHJbejBdW2QrJCQqTlNJWkVdOworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCXdkJCQgPSAqKHVuYXRpdmVfdCAqKSZkcHRyW3pdW2QrJCQqTlNJWkVdOworCQkJd3AkJCA9IHZlY194b3Iod3AkJCwgd2QkJCk7CisJCQl3MiQkID0gTUFTSyh3cSQkKTsKKwkJCXcxJCQgPSBTSExCWVRFKHdxJCQpOworCQkJdzIkJCA9IHZlY19hbmQodzIkJCwgeDFkKTsKKwkJCXcxJCQgPSB2ZWNfeG9yKHcxJCQsIHcyJCQpOworCQkJd3EkJCA9IHZlY194b3IodzEkJCwgd2QkJCk7CisJCX0KKwkJKih1bmF0aXZlX3QgKikmcFtkK05TSVpFKiQkXSA9IHdwJCQ7CisJCSoodW5hdGl2ZV90ICopJnFbZCtOU0laRSokJF0gPSB3cSQkOworCX0KK30KKworc3RhdGljIHZvaWQgcmFpZDZfYWx0aXZlYyQjX2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJcHJlZW1wdF9kaXNhYmxlKCk7CisJZW5hYmxlX2tlcm5lbF9hbHRpdmVjKCk7CisKKwlyYWlkNl9hbHRpdmVjJCNfZ2VuX3N5bmRyb21lX3JlYWwoZGlza3MsIGJ5dGVzLCBwdHJzKTsKKworCWRpc2FibGVfa2VybmVsX2FsdGl2ZWMoKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitpbnQgcmFpZDZfaGF2ZV9hbHRpdmVjKHZvaWQpOworI2lmICQjID09IDEKK2ludCByYWlkNl9oYXZlX2FsdGl2ZWModm9pZCkKK3sKKwkvKiBUaGlzIGFzc3VtZXMgZWl0aGVyIGFsbCBDUFVzIGhhdmUgQWx0aXZlYyBvciBub25lIGRvZXMgKi8KKyMgaWZkZWYgX19LRVJORUxfXworCXJldHVybiBjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9BTFRJVkVDKTsKKyMgZWxzZQorCXJldHVybiAxOworIyBlbmRpZgorfQorI2VuZGlmCisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hbHRpdmVjJCMgPSB7CisJcmFpZDZfYWx0aXZlYyQjX2dlbl9zeW5kcm9tZSwKKwlOVUxMLAkJCS8qIFhPUiBub3QgeWV0IGltcGxlbWVudGVkICovCisJcmFpZDZfaGF2ZV9hbHRpdmVjLAorCSJhbHRpdmVjeCQjIiwKKwkwCit9OworCisjZW5kaWYgLyogQ09ORklHX0FMVElWRUMgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L2F2eDIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L2F2eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGJjYTNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvYXZ4Mi5jCkBAIC0wLDAgKzEsNDgwIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqICAgQXV0aG9yOiBZdWFuaGFuIExpdSA8eXVhbmhhbi5saXVAbGludXguaW50ZWwuY29tPgorICoKKyAqICAgQmFzZWQgb24gc3NlMi5jOiBDb3B5cmlnaHQgMjAwMiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIEFWWDIgaW1wbGVtZW50YXRpb24gb2YgUkFJRC02IHN5bmRyb21lIGZ1bmN0aW9ucworICoKKyAqLworCisjaWZkZWYgQ09ORklHX0FTX0FWWDIKKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKyNpbmNsdWRlICJ4ODYuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCByYWlkNl9hdngyX2NvbnN0YW50cyB7CisJdTY0IHgxZFs0XTsKK30gcmFpZDZfYXZ4Ml9jb25zdGFudHMgX19hbGlnbmVkKDMyKSA9IHsKKwl7IDB4MWQxZDFkMWQxZDFkMWQxZFVMTCwgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLAorCSAgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLCAweDFkMWQxZDFkMWQxZDFkMWRVTEwsfSwKK307CisKK3N0YXRpYyBpbnQgcmFpZDZfaGF2ZV9hdngyKHZvaWQpCit7CisJcmV0dXJuIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlgyKSAmJiBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYKTsKK30KKworLyoKKyAqIFBsYWluIEFWWDIgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmFpZDZfYXZ4MjFfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7CQkvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOwkJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owKzJdOwkJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTAiIDogOiAibSIgKHJhaWQ2X2F2eDJfY29uc3RhbnRzLngxZFswXSkpOworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTMsJXltbTMsJXltbTMiKTsJLyogWmVybyB0ZW1wICovCisKKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gMzIpIHsKKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMCIgOiA6ICJtIiAoZHB0clt6MF1bZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tMiIgOiA6ICJtIiAoZHB0clt6MF1bZF0pKTsvKiBQWzBdICovCisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbejAtMV1bZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICV5bW0yLCV5bW00Iik7LyogUVswXSAqLworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW02IiA6IDogIm0iIChkcHRyW3owLTFdW2RdKSk7CisJCWZvciAoeiA9IHowLTI7IHogPj0gMDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6IDogIm0iIChkcHRyW3pdW2RdKSk7CisJCQlhc20gdm9sYXRpbGUoInZwY21wZ3RiICV5bW00LCV5bW0zLCV5bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tNCwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNiwleW1tMiwleW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNiwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tNiIgOiA6ICJtIiAoZHB0clt6XVtkXSkpOworCQl9CisJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTQsJXltbTMsJXltbTUiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTQsJXltbTQsJXltbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tNSwleW1tNSIpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCV5bW00LCV5bW00Iik7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTYsJXltbTIsJXltbTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNiwleW1tNCwleW1tNCIpOworCisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0yLCUwIiA6ICI9bSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMiwleW1tMiwleW1tMiIpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tNCwlMCIgOiAiPW0iIChxW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTQsJXltbTQsJXltbTQiKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDIxX3hvcl9zeW5kcm9tZShpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCisJCQkJICAgICBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tMCIgOiA6ICJtIiAocmFpZDZfYXZ4Ml9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSAzMikgeworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW00IiA6OiAibSIgKGRwdHJbejBdW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTIiIDogOiAibSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNCwleW1tMiwleW1tMiIpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKHogPSB6MC0xIDsgeiA+PSBzdGFydCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTQsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTUsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTUsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTUiIDo6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tMiwleW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNCwleW1tNCIpOworCQl9CisJCS8qIFAvUSBsZWZ0IHNpZGUgb3B0aW1pemF0aW9uICovCisJCWZvciAoeiA9IHN0YXJ0LTEgOyB6ID49IDAgOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTUsJXltbTUsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTQsJXltbTUsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhZGRiICV5bW00LCV5bW00LCV5bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW0wLCV5bW01LCV5bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCV5bW00LCV5bW00Iik7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwlJXltbTQsJSV5bW00IiA6IDogIm0iIChxW2RdKSk7CisJCS8qIERvbid0IHVzZSBtb3ZudGRxIGZvciByL3cgbWVtb3J5IGFyZWEgPCBjYWNoZSBsaW5lICovCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTQsJTAiIDogIj1tIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJSV5bW0yLCUwIiA6ICI9bSIgKHBbZF0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdngyeDEgPSB7CisJcmFpZDZfYXZ4MjFfZ2VuX3N5bmRyb21lLAorCXJhaWQ2X2F2eDIxX3hvcl9zeW5kcm9tZSwKKwlyYWlkNl9oYXZlX2F2eDIsCisJImF2eDJ4MSIsCisJMQkJCS8qIEhhcyBjYWNoZSBoaW50cyAqLworfTsKKworLyoKKyAqIFVucm9sbGVkLWJ5LTIgQVZYMiBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCByYWlkNl9hdngyMl9nZW5fc3luZHJvbWUoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IGRpc2tzIC0gMzsJCS8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejArMV07CQkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07CQkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tMCIgOiA6ICJtIiAocmFpZDZfYXZ4Ml9jb25zdGFudHMueDFkWzBdKSk7CisJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMSwleW1tMSwleW1tMSIpOyAvKiBaZXJvIHRlbXAgKi8KKworCS8qIFdlIHVuaWZvcm1seSBhc3N1bWUgYSBzaW5nbGUgcHJlZmV0Y2ggY292ZXJzIGF0IGxlYXN0IDMyIGJ5dGVzICovCisJZm9yIChkID0gMDsgZCA8IGJ5dGVzOyBkICs9IDY0KSB7CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbejBdW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbejBdW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTIiIDogOiAibSIgKGRwdHJbejBdW2RdKSk7LyogUFswXSAqLworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0zIiA6IDogIm0iIChkcHRyW3owXVtkKzMyXSkpOy8qIFBbMV0gKi8KKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICV5bW0yLCV5bW00Iik7IC8qIFFbMF0gKi8KKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICV5bW0zLCV5bW02Iik7IC8qIFFbMV0gKi8KKwkJZm9yICh6ID0gejAtMTsgeiA+PSAwOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZCszMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTQsJXltbTEsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTYsJXltbTEsJXltbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhZGRiICV5bW00LCV5bW00LCV5bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tNiwleW1tNiwleW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNiwleW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tNSIgOiA6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tNyIgOiA6ICJtIiAoZHB0clt6XVtkKzMyXSkpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tMiwleW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tMywleW1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNiwleW1tNiIpOworCQl9CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0yLCUwIiA6ICI9bSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXltbTMsJTAiIDogIj1tIiAocFtkKzMyXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tNCwlMCIgOiAiPW0iIChxW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW02LCUwIiA6ICI9bSIgKHFbZCszMl0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDIyX3hvcl9zeW5kcm9tZShpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCisJCQkJICAgICBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tMCIgOiA6ICJtIiAocmFpZDZfYXZ4Ml9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSA2NCkgeworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW00IiA6OiAibSIgKGRwdHJbejBdW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTYiIDo6ICJtIiAoZHB0clt6MF1bZCszMl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tMiIgOiA6ICJtIiAocFtkXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0zIiA6IDogIm0iIChwW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTQsJXltbTIsJXltbTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNiwleW1tMywleW1tMyIpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKHogPSB6MC0xIDsgeiA+PSBzdGFydCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNiwleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTQsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhZGRiICV5bW02LCV5bW02LCV5bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW0wLCV5bW01LCV5bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW0wLCV5bW03LCV5bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCV5bW00LCV5bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW03LCV5bW02LCV5bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW01IiA6OiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTciCisJCQkJICAgICA6OiAibSIgKGRwdHJbel1bZCszMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTUsJXltbTIsJXltbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTcsJXltbTMsJXltbTMiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTUsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTcsJXltbTYsJXltbTYiKTsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKHogPSBzdGFydC0xIDsgeiA+PSAwIDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCV5bW01LCV5bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW03LCV5bW03LCV5bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInZwY21wZ3RiICV5bW00LCV5bW01LCV5bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInZwY21wZ3RiICV5bW02LCV5bW03LCV5bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tNCwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTYsJXltbTYsJXltbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTUsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTcsJXltbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTUsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTcsJXltbTYsJXltbTYiKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoInZweG9yICUwLCUleW1tNCwlJXltbTQiIDogOiAibSIgKHFbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwlJXltbTYsJSV5bW02IiA6IDogIm0iIChxW2QrMzJdKSk7CisJCS8qIERvbid0IHVzZSBtb3ZudGRxIGZvciByL3cgbWVtb3J5IGFyZWEgPCBjYWNoZSBsaW5lICovCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTQsJTAiIDogIj1tIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJSV5bW02LCUwIiA6ICI9bSIgKHFbZCszMl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUleW1tMiwlMCIgOiAiPW0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTMsJTAiIDogIj1tIiAocFtkKzMyXSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDJ4MiA9IHsKKwlyYWlkNl9hdngyMl9nZW5fc3luZHJvbWUsCisJcmFpZDZfYXZ4MjJfeG9yX3N5bmRyb21lLAorCXJhaWQ2X2hhdmVfYXZ4MiwKKwkiYXZ4MngyIiwKKwkxCQkJLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisvKgorICogVW5yb2xsZWQtYnktNCBBVlgyIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDI0X2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXowID0gZGlza3MgLSAzOwkJLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsJCS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCsyXTsJCS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0wIiA6IDogIm0iIChyYWlkNl9hdngyX2NvbnN0YW50cy54MWRbMF0pKTsKKwlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xLCV5bW0xLCV5bW0xIik7CS8qIFplcm8gdGVtcCAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTIsJXltbTIsJXltbTIiKTsJLyogUFswXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTMsJXltbTMsJXltbTMiKTsJLyogUFsxXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTQsJXltbTQsJXltbTQiKTsJLyogUVswXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTYsJXltbTYsJXltbTYiKTsJLyogUVsxXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTEwLCV5bW0xMCwleW1tMTAiKTsJLyogUFsyXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTExLCV5bW0xMSwleW1tMTEiKTsJLyogUFszXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTEyLCV5bW0xMiwleW1tMTIiKTsJLyogUVsyXSAqLworCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTE0LCV5bW0xNCwleW1tMTQiKTsJLyogUVszXSAqLworCisJZm9yIChkID0gMDsgZCA8IGJ5dGVzOyBkICs9IDEyOCkgeworCQlmb3IgKHogPSB6MDsgeiA+PSAwOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZCszMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZCs2NF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZCs5Nl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTQsJXltbTEsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTYsJXltbTEsJXltbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBjbXBndGIgJXltbTEyLCV5bW0xLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tMTQsJXltbTEsJXltbTE1Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tNCwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTYsJXltbTYsJXltbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhZGRiICV5bW0xMiwleW1tMTIsJXltbTEyIik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tMTQsJXltbTE0LCV5bW0xNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tMTMsJXltbTEzIik7CisJCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW0wLCV5bW0xNSwleW1tMTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTUsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTcsJXltbTYsJXltbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTEzLCV5bW0xMiwleW1tMTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTE1LCV5bW0xNCwleW1tMTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTUiIDogOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTciIDogOiAibSIgKGRwdHJbel1bZCszMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTEzIiA6IDogIm0iIChkcHRyW3pdW2QrNjRdKSk7CisJCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0xNSIgOiA6ICJtIiAoZHB0clt6XVtkKzk2XSkpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tMiwleW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tMywleW1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsJXltbTEwLCV5bW0xMCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsJXltbTExLCV5bW0xMSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNiwleW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsJXltbTEyLCV5bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsJXltbTE0LCV5bW0xNCIpOworCQl9CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0yLCUwIiA6ICI9bSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMiwleW1tMiwleW1tMiIpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tMywlMCIgOiAiPW0iIChwW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTMsJXltbTMsJXltbTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXltbTEwLCUwIiA6ICI9bSIgKHBbZCs2NF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTAsJXltbTEwLCV5bW0xMCIpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tMTEsJTAiIDogIj1tIiAocFtkKzk2XSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xMSwleW1tMTEsJXltbTExIik7CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW00LCUwIiA6ICI9bSIgKHFbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNCwleW1tNCwleW1tNCIpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tNiwlMCIgOiAiPW0iIChxW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTYsJXltbTYsJXltbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXltbTEyLCUwIiA6ICI9bSIgKHFbZCs2NF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTIsJXltbTEyLCV5bW0xMiIpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tMTQsJTAiIDogIj1tIiAocVtkKzk2XSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xNCwleW1tMTQsJXltbTE0Iik7CisJfQorCisJYXNtIHZvbGF0aWxlKCJzZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl9hdngyNF94b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBzdG9wOwkJLyogUC9RIHJpZ2h0IHNpZGUgb3B0aW1pemF0aW9uICovCisJcCA9IGRwdHJbZGlza3MtMl07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0cltkaXNrcy0xXTsJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTAiIDo6ICJtIiAocmFpZDZfYXZ4Ml9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSAxMjgpIHsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tNCIgOjogIm0iIChkcHRyW3owXVtkXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW02IiA6OiAibSIgKGRwdHJbejBdW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTEyIiA6OiAibSIgKGRwdHJbejBdW2QrNjRdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTE0IiA6OiAibSIgKGRwdHJbejBdW2QrOTZdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTIiIDogOiAibSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCUleW1tMyIgOiA6ICJtIiAocFtkKzMyXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0xMCIgOiA6ICJtIiAocFtkKzY0XSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0xMSIgOiA6ICJtIiAocFtkKzk2XSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW00LCV5bW0yLCV5bW0yIik7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTYsJXltbTMsJXltbTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTIsJXltbTEwLCV5bW0xMCIpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xNCwleW1tMTEsJXltbTExIik7CisJCS8qIFAvUSBkYXRhIHBhZ2VzICovCisJCWZvciAoeiA9IHowLTEgOyB6ID49IHN0YXJ0IDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6OiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDo6ICJtIiAoZHB0clt6XVtkKzY0XSkpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsJXltbTEzLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsJXltbTE1LCV5bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNiwleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tMTIsJXltbTEzLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tMTQsJXltbTE1LCV5bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTQsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhZGRiICV5bW02LCV5bW02LCV5bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tMTIsJXltbTEyLCV5bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTE0LCV5bW0xNCwleW1tMTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTUsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTcsJXltbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTEzLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tMTUsJXltbTE1Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCV5bW00LCV5bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW03LCV5bW02LCV5bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xMywleW1tMTIsJXltbTEyIik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xNSwleW1tMTQsJXltbTE0Iik7CisJCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW01IiA6OiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTciCisJCQkJICAgICA6OiAibSIgKGRwdHJbel1bZCszMl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwlJXltbTEzIgorCQkJCSAgICAgOjogIm0iIChkcHRyW3pdW2QrNjRdKSk7CisJCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsJSV5bW0xNSIKKwkJCQkgICAgIDo6ICJtIiAoZHB0clt6XVtkKzk2XSkpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tMiwleW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tMywleW1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsJXltbTEwLCV5bW0xMCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsJXltbTExLCV5bW0xMSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNCwleW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNiwleW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsJXltbTEyLCV5bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsJXltbTE0LCV5bW0xNCIpOworCQl9CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDo6ICJtIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6OiAibSIgKHFbZCs2NF0pKTsKKwkJLyogUC9RIGxlZnQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwkJZm9yICh6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNSwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNywleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsJXltbTEzLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsJXltbTE1LCV5bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNCwleW1tNSwleW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tNiwleW1tNywleW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tMTIsJXltbTEzLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAleW1tMTQsJXltbTE1LCV5bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTQsJXltbTQsJXltbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhZGRiICV5bW02LCV5bW02LCV5bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInZwYWRkYiAleW1tMTIsJXltbTEyLCV5bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFkZGIgJXltbTE0LCV5bW0xNCwleW1tMTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTUsJXltbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTcsJXltbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTAsJXltbTEzLCV5bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tMCwleW1tMTUsJXltbTE1Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCV5bW00LCV5bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW03LCV5bW02LCV5bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xMywleW1tMTIsJXltbTEyIik7CisJCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xNSwleW1tMTQsJXltbTE0Iik7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXltbTIsJTAiIDogIj1tIiAocFtkXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tMywlMCIgOiAiPW0iIChwW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0xMCwlMCIgOiAiPW0iIChwW2QrNjRdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0xMSwlMCIgOiAiPW0iIChwW2QrOTZdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJTAsJSV5bW00LCUleW1tNCIgOiA6ICJtIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICUwLCUleW1tNiwlJXltbTYiIDogOiAibSIgKHFbZCszMl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwlJXltbTEyLCUleW1tMTIiIDogOiAibSIgKHFbZCs2NF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwlJXltbTE0LCUleW1tMTQiIDogOiAibSIgKHFbZCs5Nl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXltbTQsJTAiIDogIj1tIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZudGRxICUleW1tNiwlMCIgOiAiPW0iIChxW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0xMiwlMCIgOiAiPW0iIChxW2QrNjRdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV5bW0xNCwlMCIgOiAiPW0iIChxW2QrOTZdKSk7CisJfQorCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2F2eDJ4NCA9IHsKKwlyYWlkNl9hdngyNF9nZW5fc3luZHJvbWUsCisJcmFpZDZfYXZ4MjRfeG9yX3N5bmRyb21lLAorCXJhaWQ2X2hhdmVfYXZ4MiwKKwkiYXZ4Mng0IiwKKwkxCQkJLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworI2VuZGlmCisKKyNlbmRpZiAvKiBDT05GSUdfQVNfQVZYMiAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvYXZ4NTEyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9hdng1MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmRmNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvYXZ4NTEyLmMKQEAgLTAsMCArMSw1NjkgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogICBBdXRob3I6IEdheWF0cmkgS2FtbWVsYSA8Z2F5YXRyaS5rYW1tZWxhQGludGVsLmNvbT4KKyAqICAgQXV0aG9yOiBNZWdoYSBEZXkgPG1lZ2hhLmRleUBsaW51eC5pbnRlbC5jb20+CisgKgorICogICBCYXNlZCBvbiBhdngyLmM6IENvcHlyaWdodCAyMDEyIFl1YW5oYW4gTGl1IEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQmFzZWQgb24gc3NlMi5jOiBDb3B5cmlnaHQgMjAwMiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisKKy8qCisgKiBBVlg1MTIgaW1wbGVtZW50YXRpb24gb2YgUkFJRC02IHN5bmRyb21lIGZ1bmN0aW9ucworICoKKyAqLworCisjaWZkZWYgQ09ORklHX0FTX0FWWDUxMgorCisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgIng4Ni5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhaWQ2X2F2eDUxMl9jb25zdGFudHMgeworCXU2NCB4MWRbOF07Cit9IHJhaWQ2X2F2eDUxMl9jb25zdGFudHMgX19hbGlnbmVkKDUxMi84KSA9IHsKKwl7IDB4MWQxZDFkMWQxZDFkMWQxZFVMTCwgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLAorCSAgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLCAweDFkMWQxZDFkMWQxZDFkMWRVTEwsCisJICAweDFkMWQxZDFkMWQxZDFkMWRVTEwsIDB4MWQxZDFkMWQxZDFkMWQxZFVMTCwKKwkgIDB4MWQxZDFkMWQxZDFkMWQxZFVMTCwgMHgxZDFkMWQxZDFkMWQxZDFkVUxMLH0sCit9OworCitzdGF0aWMgaW50IHJhaWQ2X2hhdmVfYXZ4NTEyKHZvaWQpCit7CisJcmV0dXJuIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlgyKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYNTEyRikgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDUxMkJXKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYNTEyVkwpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlg1MTJEUSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDUxMjFfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7ICAgICAgICAgLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsgICAgICAgICAvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07ICAgICAgICAgLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tMFxuXHQiCisJCSAgICAgInZweG9ycSAlJXptbTEsJSV6bW0xLCUlem1tMSIgLyogWmVybyB0ZW1wICovCisJCSAgICAgOgorCQkgICAgIDogIm0iIChyYWlkNl9hdng1MTJfY29uc3RhbnRzLngxZFswXSkpOworCisJZm9yIChkID0gMDsgZCA8IGJ5dGVzOyBkICs9IDY0KSB7CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUwLCUlem1tMlxuXHQiICAgICAvKiBQWzBdICovCisJCQkgICAgICJwcmVmZXRjaG50YSAlMVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0yLCUlem1tNFxuXHQiIC8qIFFbMF0gKi8KKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwlJXptbTYiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwdHJbejBdW2RdKSwgIm0iIChkcHRyW3owLTFdW2RdKSk7CisJCWZvciAoeiA9IHowLTI7IHogPj0gMDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW0xLCUlazFcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW02LCUlem1tMiwlJXptbTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTYsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUwLCUlem1tNiIKKwkJCQkgICAgIDoKKwkJCQkgICAgIDogIm0iIChkcHRyW3pdW2RdKSk7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2cGNtcGd0YiAlJXptbTQsJSV6bW0xLCUlazFcblx0IgorCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJICAgICAidnBhZGRiICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNiwlJXptbTIsJSV6bW0yXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTYsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTIsJTBcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMiwlJXptbTIsJSV6bW0yXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tNCwlMVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW00LCUlem1tNCwlJXptbTQiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHBbZF0pLCAibSIgKHFbZF0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDUxMjFfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkgICAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBzdG9wOwkJLyogUC9RIHJpZ2h0IHNpZGUgb3B0aW1pemF0aW9uICovCisJcCA9IGRwdHJbZGlza3MtMl07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0cltkaXNrcy0xXTsJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tMCIKKwkJICAgICA6IDogIm0iIChyYWlkNl9hdng1MTJfY29uc3RhbnRzLngxZFswXSkpOworCisJZm9yIChkID0gMCA7IGQgPCBieXRlcyA7IGQgKz0gNjQpIHsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW00XG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwlJXptbTJcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNCwlJXptbTIsJSV6bW0yIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcHRyW3owXVtkXSksICAibSIgKHBbZF0pKTsKKwkJLyogUC9RIGRhdGEgcGFnZXMgKi8KKwkJZm9yICh6ID0gejAtMSA7IHogPj0gc3RhcnQgOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgidnB4b3JxICUlem1tNSwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW01LCUlazFcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tMiwlJXptbTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNCIKKwkJCQkgICAgIDoKKwkJCQkgICAgIDogIm0iIChkcHRyW3pdW2RdKSk7CisJCX0KKwkJLyogUC9RIGxlZnQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwkJZm9yICh6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvcnEgJSV6bW01LCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTUsJSVrMVxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTQiCisJCQkJICAgICA6CisJCQkJICAgICA6ICk7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2cHhvcnEgJTAsJSV6bW00LCUlem1tNFxuXHQiCisJCS8qIERvbid0IHVzZSBtb3ZudGRxIGZvciByL3cgbWVtb3J5IGFyZWEgPCBjYWNoZSBsaW5lICovCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW00LCUwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTIsJTEiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHFbZF0pLCAibSIgKHBbZF0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdng1MTJ4MSA9IHsKKwlyYWlkNl9hdng1MTIxX2dlbl9zeW5kcm9tZSwKKwlyYWlkNl9hdng1MTIxX3hvcl9zeW5kcm9tZSwKKwlyYWlkNl9oYXZlX2F2eDUxMiwKKwkiYXZ4NTEyeDEiLAorCTEgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBjYWNoZSBoaW50cyAqLworfTsKKworLyoKKyAqIFVucm9sbGVkLWJ5LTIgQVZYNTEyIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDUxMjJfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7ICAgICAgICAgLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsgICAgICAgICAvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07ICAgICAgICAgLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tMFxuXHQiCisJCSAgICAgInZweG9ycSAlJXptbTEsJSV6bW0xLCUlem1tMSIgLyogWmVybyB0ZW1wICovCisJCSAgICAgOgorCQkgICAgIDogIm0iIChyYWlkNl9hdng1MTJfY29uc3RhbnRzLngxZFswXSkpOworCisJLyogV2UgdW5pZm9ybWx5IGFzc3VtZSBhIHNpbmdsZSBwcmVmZXRjaCBjb3ZlcnMgYXQgbGVhc3QgNjQgYnl0ZXMgKi8KKwlmb3IgKGQgPSAwOyBkIDwgYnl0ZXM7IGQgKz0gMTI4KSB7CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTBcblx0IgorCQkJICAgICAicHJlZmV0Y2hudGEgJTFcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUwLCUlem1tMlxuXHQiICAgICAgLyogUFswXSAqLworCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tM1xuXHQiICAgICAgLyogUFsxXSAqLworCQkJICAgICAidm1vdmRxYTY0ICUlem1tMiwlJXptbTRcblx0IiAgLyogUVswXSAqLworCQkJICAgICAidm1vdmRxYTY0ICUlem1tMywlJXptbTYiICAgICAgLyogUVsxXSAqLworCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcHRyW3owXVtkXSksICJtIiAoZHB0clt6MF1bZCs2NF0pKTsKKwkJZm9yICh6ID0gejAtMTsgeiA+PSAwOyB6LS0pIHsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTBcblx0IgorCQkJCSAgICAgInByZWZldGNobnRhICUxXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW0xLCUlazFcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNiwlJXptbTEsJSVrMlxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMSwlJXptbTVcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazIsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTYsJSV6bW02LCUlem1tNlxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNywlJXptbTdcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2bW92ZHFhNjQgJTEsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tMiwlJXptbTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW0zLCUlem1tM1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTYiCisJCQkJICAgICA6CisJCQkJICAgICA6ICJtIiAoZHB0clt6XVtkXSksICJtIiAoZHB0clt6XVtkKzY0XSkpOworCQl9CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV6bW0yLCUwXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMywlMVxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTQsJTJcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW02LCUzIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChwW2RdKSwgIm0iIChwW2QrNjRdKSwgIm0iIChxW2RdKSwKKwkJCSAgICAgICAibSIgKHFbZCs2NF0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDUxMjJfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkgICAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBzdG9wOwkJLyogUC9RIHJpZ2h0IHNpZGUgb3B0aW1pemF0aW9uICovCisJcCA9IGRwdHJbZGlza3MtMl07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0cltkaXNrcy0xXTsJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tMCIKKwkJICAgICA6IDogIm0iIChyYWlkNl9hdng1MTJfY29uc3RhbnRzLngxZFswXSkpOworCisJZm9yIChkID0gMCA7IGQgPCBieXRlcyA7IGQgKz0gMTI4KSB7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tNFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTEsJSV6bW02XG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMiwlJXptbTJcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUzLCUlem1tM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW00LCUlem1tMiwlJXptbTJcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNiwlJXptbTMsJSV6bW0zIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcHRyW3owXVtkXSksICJtIiAoZHB0clt6MF1bZCs2NF0pLAorCQkJICAgICAgICJtIiAocFtkXSksICJtIiAocFtkKzY0XSkpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKHogPSB6MC0xIDsgeiA+PSBzdGFydCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvcnEgJSV6bW01LCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW03LCUlem1tN1xuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW00LCUlem1tNSwlJWsxXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTYsJSV6bW03LCUlazJcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsyLCUlem1tN1xuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW02LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW02LCUlem1tNlxuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUwLCUlem1tNVxuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tN1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTIsJSV6bW0yXG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tMywlJXptbTNcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02IgorCQkJCSAgICAgOgorCQkJCSAgICAgOiAibSIgKGRwdHJbel1bZF0pLCAgIm0iIChkcHRyW3pdW2QrNjRdKSk7CisJCX0KKwkJLyogUC9RIGxlZnQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwkJZm9yICh6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvcnEgJSV6bW01LCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW03LCUlem1tN1xuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW00LCUlem1tNSwlJWsxXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTYsJSV6bW03LCUlazJcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsyLCUlem1tN1xuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW02LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW02LCUlem1tNiIKKwkJCQkgICAgIDoKKwkJCQkgICAgIDogKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoInZweG9ycSAlMCwlJXptbTQsJSV6bW00XG5cdCIKKwkJCSAgICAgInZweG9ycSAlMSwlJXptbTYsJSV6bW02XG5cdCIKKwkJCSAgICAgLyogRG9uJ3QgdXNlIG1vdm50ZHEgZm9yIHIvdworCQkJICAgICAgKiBtZW1vcnkgYXJlYSA8IGNhY2hlIGxpbmUKKwkJCSAgICAgICovCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW00LCUwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTYsJTFcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tMiwlMlxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0zLCUzIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChxW2RdKSwgIm0iIChxW2QrNjRdKSwgIm0iIChwW2RdKSwKKwkJCSAgICAgICAibSIgKHBbZCs2NF0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9hdng1MTJ4MiA9IHsKKwlyYWlkNl9hdng1MTIyX2dlbl9zeW5kcm9tZSwKKwlyYWlkNl9hdng1MTIyX3hvcl9zeW5kcm9tZSwKKwlyYWlkNl9oYXZlX2F2eDUxMiwKKwkiYXZ4NTEyeDIiLAorCTEgICAgICAgICAgICAgICAgICAgICAgIC8qIEhhcyBjYWNoZSBoaW50cyAqLworfTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKworLyoKKyAqIFVucm9sbGVkLWJ5LTQgQVZYMiBpbXBsZW1lbnRhdGlvbgorICovCitzdGF0aWMgdm9pZCByYWlkNl9hdng1MTI0X2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXowID0gZGlza3MgLSAzOyAgICAgICAgIC8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejArMV07ICAgICAgICAgLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owKzJdOyAgICAgICAgIC8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwlJXptbTBcblx0IgorCQkgICAgICJ2cHhvcnEgJSV6bW0xLCUlem1tMSwlJXptbTFcblx0IiAgICAgICAvKiBaZXJvIHRlbXAgKi8KKwkJICAgICAidnB4b3JxICUlem1tMiwlJXptbTIsJSV6bW0yXG5cdCIgICAgICAgLyogUFswXSAqLworCQkgICAgICJ2cHhvcnEgJSV6bW0zLCUlem1tMywlJXptbTNcblx0IiAgICAgICAvKiBQWzFdICovCisJCSAgICAgInZweG9ycSAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiICAgICAgIC8qIFFbMF0gKi8KKwkJICAgICAidnB4b3JxICUlem1tNiwlJXptbTYsJSV6bW02XG5cdCIgICAgICAgLyogUVsxXSAqLworCQkgICAgICJ2cHhvcnEgJSV6bW0xMCwlJXptbTEwLCUlem1tMTBcblx0IiAgICAvKiBQWzJdICovCisJCSAgICAgInZweG9ycSAlJXptbTExLCUlem1tMTEsJSV6bW0xMVxuXHQiICAgIC8qIFBbM10gKi8KKwkJICAgICAidnB4b3JxICUlem1tMTIsJSV6bW0xMiwlJXptbTEyXG5cdCIgICAgLyogUVsyXSAqLworCQkgICAgICJ2cHhvcnEgJSV6bW0xNCwlJXptbTE0LCUlem1tMTQiICAgICAgICAvKiBRWzNdICovCisJCSAgICAgOgorCQkgICAgIDogIm0iIChyYWlkNl9hdng1MTJfY29uc3RhbnRzLngxZFswXSkpOworCisJZm9yIChkID0gMDsgZCA8IGJ5dGVzOyBkICs9IDI1NikgeworCQlmb3IgKHogPSB6MDsgeiA+PSAwOyB6LS0pIHsKKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMFxuXHQiCisJCQkgICAgICJwcmVmZXRjaG50YSAlMVxuXHQiCisJCQkgICAgICJwcmVmZXRjaG50YSAlMlxuXHQiCisJCQkgICAgICJwcmVmZXRjaG50YSAlM1xuXHQiCisJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW0xLCUlazFcblx0IgorCQkJICAgICAidnBjbXBndGIgJSV6bW02LCUlem1tMSwlJWsyXG5cdCIKKwkJCSAgICAgInZwY21wZ3RiICUlem1tMTIsJSV6bW0xLCUlazNcblx0IgorCQkJICAgICAidnBjbXBndGIgJSV6bW0xNCwlJXptbTEsJSVrNFxuXHQiCisJCQkgICAgICJ2cG1vdm0yYiAlJWsxLCUlem1tNVxuXHQiCisJCQkgICAgICJ2cG1vdm0yYiAlJWsyLCUlem1tN1xuXHQiCisJCQkgICAgICJ2cG1vdm0yYiAlJWszLCUlem1tMTNcblx0IgorCQkJICAgICAidnBtb3ZtMmIgJSVrNCwlJXptbTE1XG5cdCIKKwkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2cGFkZGIgJSV6bW02LCUlem1tNiwlJXptbTZcblx0IgorCQkJICAgICAidnBhZGRiICUlem1tMTIsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCSAgICAgInZwYWRkYiAlJXptbTE0LCUlem1tMTQsJSV6bW0xNFxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNSwlJXptbTVcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTcsJSV6bW03XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW0xMywlJXptbTEzXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW0xNSwlJXptbTE1XG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTZcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTMsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTQsJSV6bW0xNFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTAsJSV6bW01XG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwlJXptbTdcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUyLCUlem1tMTNcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUzLCUlem1tMTVcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTIsJSV6bW0yXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW0zLCUlem1tM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEwLCUlem1tMTBcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTUsJSV6bW0xMSwlJXptbTExXG4iCisJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tNCwlJXptbTRcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02XG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEzLCUlem1tMTIsJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xNSwlJXptbTE0LCUlem1tMTQiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRwdHJbel1bZF0pLCAibSIgKGRwdHJbel1bZCs2NF0pLAorCQkJICAgICAgICJtIiAoZHB0clt6XVtkKzEyOF0pLCAibSIgKGRwdHJbel1bZCsxOTJdKSk7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJ2bW92bnRkcSAlJXptbTIsJTBcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMiwlJXptbTIsJSV6bW0yXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMywlMVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0zLCUlem1tMywlJXptbTNcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0xMCwlMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMCwlJXptbTEwLCUlem1tMTBcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0xMSwlM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMSwlJXptbTExLCUlem1tMTFcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW00LCU0XG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTYsJTVcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNiwlJXptbTYsJSV6bW02XG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMTIsJTZcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTIsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMTQsJTdcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTQsJSV6bW0xNCwlJXptbTE0IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChwW2RdKSwgIm0iIChwW2QrNjRdKSwgIm0iIChwW2QrMTI4XSksCisJCQkgICAgICAgIm0iIChwW2QrMTkyXSksICJtIiAocVtkXSksICJtIiAocVtkKzY0XSksCisJCQkgICAgICAgIm0iIChxW2QrMTI4XSksICJtIiAocVtkKzE5Ml0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2F2eDUxMjRfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkgICAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBzdG9wOwkJLyogUC9RIHJpZ2h0IHNpZGUgb3B0aW1pemF0aW9uICovCisJcCA9IGRwdHJbZGlza3MtMl07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0cltkaXNrcy0xXTsJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCUlem1tMCIKKwkJICAgICA6OiAibSIgKHJhaWQ2X2F2eDUxMl9jb25zdGFudHMueDFkWzBdKSk7CisKKwlmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSAyNTYpIHsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsJSV6bW00XG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwlJXptbTZcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUyLCUlem1tMTJcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUzLCUlem1tMTRcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICU0LCUlem1tMlxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTUsJSV6bW0zXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlNiwlJXptbTEwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlNywlJXptbTExXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTQsJSV6bW0yLCUlem1tMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW02LCUlem1tMywlJXptbTNcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTIsJSV6bW0xMCwlJXptbTEwXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTE0LCUlem1tMTEsJSV6bW0xMSIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHB0clt6MF1bZF0pLCAibSIgKGRwdHJbejBdW2QrNjRdKSwKKwkJCSAgICAgICAibSIgKGRwdHJbejBdW2QrMTI4XSksICJtIiAoZHB0clt6MF1bZCsxOTJdKSwKKwkJCSAgICAgICAibSIgKHBbZF0pLCAibSIgKHBbZCs2NF0pLCAibSIgKHBbZCsxMjhdKSwKKwkJCSAgICAgICAibSIgKHBbZCsxOTJdKSk7CisJCS8qIFAvUSBkYXRhIHBhZ2VzICovCisJCWZvciAoeiA9IHowLTEgOyB6ID49IHN0YXJ0IDsgei0tKSB7CisJCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEzLCUlem1tMTNcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTUsJSV6bW0xNVxuXHQiCisJCQkJICAgICAicHJlZmV0Y2hudGEgJTBcblx0IgorCQkJCSAgICAgInByZWZldGNobnRhICUyXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTQsJSV6bW01LCUlazFcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNiwlJXptbTcsJSVrMlxuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW0xMiwlJXptbTEzLCUlazNcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tMTQsJSV6bW0xNSwlJWs0XG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsxLCUlem1tNVxuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMiwlJXptbTdcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazMsJSV6bW0xM1xuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrNCwlJXptbTE1XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW00LCUlem1tNCwlJXptbTRcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTYsJSV6bW02LCUlem1tNlxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tMTIsJSV6bW0xMiwlJXptbTEyXG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSVabW0xNCwlJXptbTE0LCUlem1tMTRcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW01LCUlem1tNVxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTcsJSV6bW03XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tMTMsJSV6bW0xM1xuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTE1LCUlem1tMTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEyLCUlem1tMTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTQsJSV6bW0xNFxuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUwLCUlem1tNVxuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUxLCUlem1tN1xuXHQiCisJCQkJICAgICAidm1vdmRxYTY0ICUyLCUlem1tMTNcblx0IgorCQkJCSAgICAgInZtb3ZkcWE2NCAlMywlJXptbTE1XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW01LCUlem1tMiwlJXptbTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW0zLCUlem1tM1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTMsJSV6bW0xMCwlJXptbTEwXG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xNSwlJXptbTExLCUlem1tMTFcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTUsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNywlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywlJXptbTEyLCUlem1tMTJcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTE1LCUlem1tMTQsJSV6bW0xNCIKKwkJCQkgICAgIDoKKwkJCQkgICAgIDogIm0iIChkcHRyW3pdW2RdKSwgIm0iIChkcHRyW3pdW2QrNjRdKSwKKwkJCQkgICAgICAgIm0iIChkcHRyW3pdW2QrMTI4XSksCisJCQkJICAgICAgICJtIiAoZHB0clt6XVtkKzE5Ml0pKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwXG5cdCIKKwkJCSAgICAgInByZWZldGNobnRhICUxXG5cdCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocVtkXSksICJtIiAocVtkKzEyOF0pKTsKKwkJLyogUC9RIGxlZnQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwkJZm9yICh6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSkgeworCQkJYXNtIHZvbGF0aWxlKCJ2cHhvcnEgJSV6bW01LCUlem1tNSwlJXptbTVcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTcsJSV6bW03LCUlem1tN1xuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTMsJSV6bW0xMywlJXptbTEzXG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW0xNSwlJXptbTE1LCUlem1tMTVcblx0IgorCQkJCSAgICAgInZwY21wZ3RiICUlem1tNCwlJXptbTUsJSVrMVxuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW02LCUlem1tNywlJWsyXG5cdCIKKwkJCQkgICAgICJ2cGNtcGd0YiAlJXptbTEyLCUlem1tMTMsJSVrM1xuXHQiCisJCQkJICAgICAidnBjbXBndGIgJSV6bW0xNCwlJXptbTE1LCUlazRcblx0IgorCQkJCSAgICAgInZwbW92bTJiICUlazEsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWsyLCUlem1tN1xuXHQiCisJCQkJICAgICAidnBtb3ZtMmIgJSVrMywlJXptbTEzXG5cdCIKKwkJCQkgICAgICJ2cG1vdm0yYiAlJWs0LCUlem1tMTVcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTQsJSV6bW00LCUlem1tNFxuXHQiCisJCQkJICAgICAidnBhZGRiICUlem1tNiwlJXptbTYsJSV6bW02XG5cdCIKKwkJCQkgICAgICJ2cGFkZGIgJSV6bW0xMiwlJXptbTEyLCUlem1tMTJcblx0IgorCQkJCSAgICAgInZwYWRkYiAlJXptbTE0LCUlem1tMTQsJSV6bW0xNFxuXHQiCisJCQkJICAgICAidnBhbmRxICUlem1tMCwlJXptbTUsJSV6bW01XG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tNywlJXptbTdcblx0IgorCQkJCSAgICAgInZwYW5kcSAlJXptbTAsJSV6bW0xMywlJXptbTEzXG5cdCIKKwkJCQkgICAgICJ2cGFuZHEgJSV6bW0wLCUlem1tMTUsJSV6bW0xNVxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tNSwlJXptbTQsJSV6bW00XG5cdCIKKwkJCQkgICAgICJ2cHhvcnEgJSV6bW03LCUlem1tNiwlJXptbTZcblx0IgorCQkJCSAgICAgInZweG9ycSAlJXptbTEzLCUlem1tMTIsJSV6bW0xMlxuXHQiCisJCQkJICAgICAidnB4b3JxICUlem1tMTUsJSV6bW0xNCwlJXptbTE0IgorCQkJCSAgICAgOgorCQkJCSAgICAgOiApOworCQl9CisJCWFzbSB2b2xhdGlsZSgidm1vdm50ZHEgJSV6bW0yLCUwXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMywlMVxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTEwLCUyXG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tMTEsJTNcblx0IgorCQkJICAgICAidnB4b3JxICU0LCUlem1tNCwlJXptbTRcblx0IgorCQkJICAgICAidnB4b3JxICU1LCUlem1tNiwlJXptbTZcblx0IgorCQkJICAgICAidnB4b3JxICU2LCUlem1tMTIsJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTcsJSV6bW0xNCwlJXptbTE0XG5cdCIKKwkJCSAgICAgInZtb3ZudGRxICUlem1tNCwlNFxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTYsJTVcblx0IgorCQkJICAgICAidm1vdm50ZHEgJSV6bW0xMiwlNlxuXHQiCisJCQkgICAgICJ2bW92bnRkcSAlJXptbTE0LCU3IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChwW2RdKSwgICJtIiAocFtkKzY0XSksICJtIiAocFtkKzEyOF0pLAorCQkJICAgICAgICJtIiAocFtkKzE5Ml0pLCAibSIgKHFbZF0pLCAgIm0iIChxW2QrNjRdKSwKKwkJCSAgICAgICAibSIgKHFbZCsxMjhdKSwgIm0iIChxW2QrMTkyXSkpOworCX0KKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9Citjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfYXZ4NTEyeDQgPSB7CisJcmFpZDZfYXZ4NTEyNF9nZW5fc3luZHJvbWUsCisJcmFpZDZfYXZ4NTEyNF94b3Jfc3luZHJvbWUsCisJcmFpZDZfaGF2ZV9hdng1MTIsCisJImF2eDUxMng0IiwKKwkxICAgICAgICAgICAgICAgICAgICAgICAvKiBIYXMgY2FjaGUgaGludHMgKi8KK307CisjZW5kaWYKKworI2VuZGlmIC8qIENPTkZJR19BU19BVlg1MTIgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L2ludC51YyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L2ludC51YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThhZWFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvaW50LnVjCkBAIC0wLDAgKzEsMTU2IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMi0yMDA0IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBpbnQkIy5jCisgKgorICogJCMtd2F5IHVucm9sbGVkIHBvcnRhYmxlIGludGVnZXIgbWF0aCBSQUlELTYgaW5zdHJ1Y3Rpb24gc2V0CisgKgorICogVGhpcyBmaWxlIGlzIHBvc3Rwcm9jZXNzZWQgdXNpbmcgdW5yb2xsLmF3aworICovCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisKKy8qCisgKiBUaGlzIGlzIHRoZSBDIGRhdGEgdHlwZSB0byB1c2UKKyAqLworCisvKiBDaGFuZ2UgdGhpcyBmcm9tIEJJVFNfUEVSX0xPTkcgaWYgdGhlcmUgaXMgc29tZXRoaW5nIGJldHRlci4uLiAqLworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyMgZGVmaW5lIE5CWVRFUyh4KSAoKHgpICogMHgwMTAxMDEwMTAxMDEwMTAxVUwpCisjIGRlZmluZSBOU0laRSAgOAorIyBkZWZpbmUgTlNISUZUIDMKKyMgZGVmaW5lIE5TVFJJTkcgIjY0IgordHlwZWRlZiB1NjQgdW5hdGl2ZV90OworI2Vsc2UKKyMgZGVmaW5lIE5CWVRFUyh4KSAoKHgpICogMHgwMTAxMDEwMVUpCisjIGRlZmluZSBOU0laRSAgNAorIyBkZWZpbmUgTlNISUZUIDIKKyMgZGVmaW5lIE5TVFJJTkcgIjMyIgordHlwZWRlZiB1MzIgdW5hdGl2ZV90OworI2VuZGlmCisKKworCisvKgorICogSUEtNjQgd2FudHMgaW5zYW5lIGFtb3VudHMgb2YgdW5yb2xsaW5nLiAgT24gb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0CisgKiBpcyBqdXN0IGEgd2FzdGUgb2Ygc3BhY2UuCisgKi8KKyNpZiAoJCMgPD0gOCkgfHwgZGVmaW5lZChfX2lhNjRfXykKKworCisvKgorICogVGhlc2Ugc3ViLW9wZXJhdGlvbnMgYXJlIHNlcGFyYXRlIGlubGluZXMgc2luY2UgdGhleSBjYW4gc29tZXRpbWVzIGJlCisgKiBzcGVjaWFsbHkgb3B0aW1pemVkIHVzaW5nIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBoYWNrcy4KKyAqLworCisvKgorICogVGhlIFNITEJZVEUoKSBvcGVyYXRpb24gc2hpZnRzIGVhY2ggYnl0ZSBsZWZ0IGJ5IDEsICpub3QqCisgKiByb2xsaW5nIG92ZXIgaW50byB0aGUgbmV4dCBieXRlCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bmF0aXZlX3QgU0hMQllURSh1bmF0aXZlX3QgdikKK3sKKwl1bmF0aXZlX3QgdnY7CisKKwl2diA9ICh2IDw8IDEpICYgTkJZVEVTKDB4ZmUpOworCXJldHVybiB2djsKK30KKworLyoKKyAqIFRoZSBNQVNLKCkgb3BlcmF0aW9uIHJldHVybnMgMHhGRiBpbiBhbnkgYnl0ZSBmb3Igd2hpY2ggdGhlIGhpZ2gKKyAqIGJpdCBpcyAxLCAweDAwIGZvciBhbnkgYnl0ZSBmb3Igd2hpY2ggdGhlIGhpZ2ggYml0IGlzIDAuCisgKi8KK3N0YXRpYyBpbmxpbmUgX19hdHRyaWJ1dGVfY29uc3RfXyB1bmF0aXZlX3QgTUFTSyh1bmF0aXZlX3QgdikKK3sKKwl1bmF0aXZlX3QgdnY7CisKKwl2diA9IHYgJiBOQllURVMoMHg4MCk7CisJdnYgPSAodnYgPDwgMSkgLSAodnYgPj4gNyk7IC8qIE92ZXJmbG93IG9uIHRoZSB0b3AgYml0IGlzIE9LICovCisJcmV0dXJuIHZ2OworfQorCisKK3N0YXRpYyB2b2lkIHJhaWQ2X2ludCQjX2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXVuYXRpdmVfdCB3ZCQkLCB3cSQkLCB3cCQkLCB3MSQkLCB3MiQkOworCisJejAgPSBkaXNrcyAtIDM7CQkvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOwkJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owKzJdOwkJLyogUlMgc3luZHJvbWUgKi8KKworCWZvciAoIGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSBOU0laRSokIyApIHsKKwkJd3EkJCA9IHdwJCQgPSAqKHVuYXRpdmVfdCAqKSZkcHRyW3owXVtkKyQkKk5TSVpFXTsKKwkJZm9yICggeiA9IHowLTEgOyB6ID49IDAgOyB6LS0gKSB7CisJCQl3ZCQkID0gKih1bmF0aXZlX3QgKikmZHB0clt6XVtkKyQkKk5TSVpFXTsKKwkJCXdwJCQgXj0gd2QkJDsKKwkJCXcyJCQgPSBNQVNLKHdxJCQpOworCQkJdzEkJCA9IFNITEJZVEUod3EkJCk7CisJCQl3MiQkICY9IE5CWVRFUygweDFkKTsKKwkJCXcxJCQgXj0gdzIkJDsKKwkJCXdxJCQgPSB3MSQkIF4gd2QkJDsKKwkJfQorCQkqKHVuYXRpdmVfdCAqKSZwW2QrTlNJWkUqJCRdID0gd3AkJDsKKwkJKih1bmF0aXZlX3QgKikmcVtkK05TSVpFKiQkXSA9IHdxJCQ7CisJfQorfQorCitzdGF0aWMgdm9pZCByYWlkNl9pbnQkI194b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJdW5hdGl2ZV90IHdkJCQsIHdxJCQsIHdwJCQsIHcxJCQsIHcyJCQ7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IE5TSVpFKiQjICkgeworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQl3cSQkID0gd3AkJCA9ICoodW5hdGl2ZV90ICopJmRwdHJbejBdW2QrJCQqTlNJWkVdOworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gc3RhcnQgOyB6LS0gKSB7CisJCQl3ZCQkID0gKih1bmF0aXZlX3QgKikmZHB0clt6XVtkKyQkKk5TSVpFXTsKKwkJCXdwJCQgXj0gd2QkJDsKKwkJCXcyJCQgPSBNQVNLKHdxJCQpOworCQkJdzEkJCA9IFNITEJZVEUod3EkJCk7CisJCQl3MiQkICY9IE5CWVRFUygweDFkKTsKKwkJCXcxJCQgXj0gdzIkJDsKKwkJCXdxJCQgPSB3MSQkIF4gd2QkJDsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKCB6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCXcyJCQgPSBNQVNLKHdxJCQpOworCQkJdzEkJCA9IFNITEJZVEUod3EkJCk7CisJCQl3MiQkICY9IE5CWVRFUygweDFkKTsKKwkJCXdxJCQgPSB3MSQkIF4gdzIkJDsKKwkJfQorCQkqKHVuYXRpdmVfdCAqKSZwW2QrTlNJWkUqJCRdIF49IHdwJCQ7CisJCSoodW5hdGl2ZV90ICopJnFbZCtOU0laRSokJF0gXj0gd3EkJDsKKwl9CisKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2ludHgkIyA9IHsKKwlyYWlkNl9pbnQkI19nZW5fc3luZHJvbWUsCisJcmFpZDZfaW50JCNfeG9yX3N5bmRyb21lLAorCU5VTEwsCQkJLyogYWx3YXlzIHZhbGlkICovCisJImludCIgTlNUUklORyAieCQjIiwKKwkwCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L21rdGFibGVzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9ta3RhYmxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjRkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9ta3RhYmxlcy5jCkBAIC0wLDAgKzEsMTc4IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMi0yMDA3IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCisgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9yIChhdCB5b3VyCisgKiAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBta3RhYmxlcy5jCisgKgorICogTWFrZSBSQUlELTYgdGFibGVzLiAgVGhpcyBpcyBhIGhvc3QgdXNlciBzcGFjZSBwcm9ncmFtIHRvIGJlIHJ1biBhdAorICogY29tcGlsZSB0aW1lLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitzdGF0aWMgdWludDhfdCBnZm11bCh1aW50OF90IGEsIHVpbnQ4X3QgYikKK3sKKwl1aW50OF90IHYgPSAwOworCisJd2hpbGUgKGIpIHsKKwkJaWYgKGIgJiAxKQorCQkJdiBePSBhOworCQlhID0gKGEgPDwgMSkgXiAoYSAmIDB4ODAgPyAweDFkIDogMCk7CisJCWIgPj49IDE7CisJfQorCisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB1aW50OF90IGdmcG93KHVpbnQ4X3QgYSwgaW50IGIpCit7CisJdWludDhfdCB2ID0gMTsKKworCWIgJT0gMjU1OworCWlmIChiIDwgMCkKKwkJYiArPSAyNTU7CisKKwl3aGlsZSAoYikgeworCQlpZiAoYiAmIDEpCisJCQl2ID0gZ2ZtdWwodiwgYSk7CisJCWEgPSBnZm11bChhLCBhKTsKKwkJYiA+Pj0gMTsKKwl9CisKKwlyZXR1cm4gdjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgaSwgaiwgazsKKwl1aW50OF90IHY7CisJdWludDhfdCBleHB0YmxbMjU2XSwgaW52dGJsWzI1Nl07CisKKwlwcmludGYoIiNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+XG4iKTsKKwlwcmludGYoIiNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD5cbiIpOworCisJLyogQ29tcHV0ZSBtdWx0aXBsaWNhdGlvbiB0YWJsZSAqLworCXByaW50ZigiXG5jb25zdCB1OCAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyNTYpKSlcbiIKKwkJInJhaWQ2X2dmbXVsWzI1Nl1bMjU2XSA9XG4iCisJCSJ7XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJcHJpbnRmKCJcdHtcbiIpOworCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqICs9IDgpIHsKKwkJCXByaW50ZigiXHRcdCIpOworCQkJZm9yIChrID0gMDsgayA8IDg7IGsrKykKKwkJCQlwcmludGYoIjB4JTAyeCwlYyIsIGdmbXVsKGksIGogKyBrKSwKKwkJCQkgICAgICAgKGsgPT0gNykgPyAnXG4nIDogJyAnKTsKKwkJfQorCQlwcmludGYoIlx0fSxcbiIpOworCX0KKwlwcmludGYoIn07XG4iKTsKKwlwcmludGYoIiNpZmRlZiBfX0tFUk5FTF9fXG4iKTsKKwlwcmludGYoIkVYUE9SVF9TWU1CT0wocmFpZDZfZ2ZtdWwpO1xuIik7CisJcHJpbnRmKCIjZW5kaWZcbiIpOworCisJLyogQ29tcHV0ZSB2ZWN0b3IgbXVsdGlwbGljYXRpb24gdGFibGUgKi8KKwlwcmludGYoIlxuY29uc3QgdTggIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpXG4iCisJCSJyYWlkNl92Z2ZtdWxbMjU2XVszMl0gPVxuIgorCQkie1xuIik7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCXByaW50ZigiXHR7XG4iKTsKKwkJZm9yIChqID0gMDsgaiA8IDE2OyBqICs9IDgpIHsKKwkJCXByaW50ZigiXHRcdCIpOworCQkJZm9yIChrID0gMDsgayA8IDg7IGsrKykKKwkJCQlwcmludGYoIjB4JTAyeCwlYyIsIGdmbXVsKGksIGogKyBrKSwKKwkJCQkgICAgICAgKGsgPT0gNykgPyAnXG4nIDogJyAnKTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gOCkgeworCQkJcHJpbnRmKCJcdFx0Iik7CisJCQlmb3IgKGsgPSAwOyBrIDwgODsgaysrKQorCQkJCXByaW50ZigiMHglMDJ4LCVjIiwgZ2ZtdWwoaSwgKGogKyBrKSA8PCA0KSwKKwkJCQkgICAgICAgKGsgPT0gNykgPyAnXG4nIDogJyAnKTsKKwkJfQorCQlwcmludGYoIlx0fSxcbiIpOworCX0KKwlwcmludGYoIn07XG4iKTsKKwlwcmludGYoIiNpZmRlZiBfX0tFUk5FTF9fXG4iKTsKKwlwcmludGYoIkVYUE9SVF9TWU1CT0wocmFpZDZfdmdmbXVsKTtcbiIpOworCXByaW50ZigiI2VuZGlmXG4iKTsKKworCS8qIENvbXB1dGUgcG93ZXItb2YtMiB0YWJsZSAoZXhwb25lbnQpICovCisJdiA9IDE7CisJcHJpbnRmKCJcbmNvbnN0IHU4IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpXG4iCisJICAgICAgICJyYWlkNl9nZmV4cFsyNTZdID1cbiIgIntcbiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gOCkgeworCQlwcmludGYoIlx0Iik7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWV4cHRibFtpICsgal0gPSB2OworCQkJcHJpbnRmKCIweCUwMngsJWMiLCB2LCAoaiA9PSA3KSA/ICdcbicgOiAnICcpOworCQkJdiA9IGdmbXVsKHYsIDIpOworCQkJaWYgKHYgPT0gMSkKKwkJCQl2ID0gMDsJLyogRm9yIGVudHJ5IDI1NSwgbm90IGEgcmVhbCBlbnRyeSAqLworCQl9CisJfQorCXByaW50ZigifTtcbiIpOworCXByaW50ZigiI2lmZGVmIF9fS0VSTkVMX19cbiIpOworCXByaW50ZigiRVhQT1JUX1NZTUJPTChyYWlkNl9nZmV4cCk7XG4iKTsKKwlwcmludGYoIiNlbmRpZlxuIik7CisKKwkvKiBDb21wdXRlIGxvZy1vZi0yIHRhYmxlICovCisJcHJpbnRmKCJcbmNvbnN0IHU4IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpXG4iCisJICAgICAgICJyYWlkNl9nZmxvZ1syNTZdID1cbiIgIntcbiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gOCkgeworCQlwcmludGYoIlx0Iik7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCXYgPSAyNTU7CisJCQlmb3IgKGsgPSAwOyBrIDwgMjU2OyBrKyspCisJCQkJaWYgKGV4cHRibFtrXSA9PSAoaSArIGopKSB7CisJCQkJCXYgPSBrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQlwcmludGYoIjB4JTAyeCwlYyIsIHYsIChqID09IDcpID8gJ1xuJyA6ICcgJyk7CisJCX0KKwl9CisJcHJpbnRmKCJ9O1xuIik7CisJcHJpbnRmKCIjaWZkZWYgX19LRVJORUxfX1xuIik7CisJcHJpbnRmKCJFWFBPUlRfU1lNQk9MKHJhaWQ2X2dmbG9nKTtcbiIpOworCXByaW50ZigiI2VuZGlmXG4iKTsKKworCS8qIENvbXB1dGUgaW52ZXJzZSB0YWJsZSB4Xi0xID09IHheMjU0ICovCisJcHJpbnRmKCJcbmNvbnN0IHU4IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMjU2KSkpXG4iCisJICAgICAgICJyYWlkNl9nZmludlsyNTZdID1cbiIgIntcbiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gOCkgeworCQlwcmludGYoIlx0Iik7CisJCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJCWludnRibFtpICsgal0gPSB2ID0gZ2Zwb3coaSArIGosIDI1NCk7CisJCQlwcmludGYoIjB4JTAyeCwlYyIsIHYsIChqID09IDcpID8gJ1xuJyA6ICcgJyk7CisJCX0KKwl9CisJcHJpbnRmKCJ9O1xuIik7CisJcHJpbnRmKCIjaWZkZWYgX19LRVJORUxfX1xuIik7CisJcHJpbnRmKCJFWFBPUlRfU1lNQk9MKHJhaWQ2X2dmaW52KTtcbiIpOworCXByaW50ZigiI2VuZGlmXG4iKTsKKworCS8qIENvbXB1dGUgaW52KDJeeCArIDEpIChleHBvbmVudC14b3ItaW52ZXJzZSkgdGFibGUgKi8KKwlwcmludGYoIlxuY29uc3QgdTggX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyNTYpKSlcbiIKKwkgICAgICAgInJhaWQ2X2dmZXhpWzI1Nl0gPVxuIiAie1xuIik7CisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSA4KSB7CisJCXByaW50ZigiXHQiKTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykKKwkJCXByaW50ZigiMHglMDJ4LCVjIiwgaW52dGJsW2V4cHRibFtpICsgal0gXiAxXSwKKwkJCSAgICAgICAoaiA9PSA3KSA/ICdcbicgOiAnICcpOworCX0KKwlwcmludGYoIn07XG4iKTsKKwlwcmludGYoIiNpZmRlZiBfX0tFUk5FTF9fXG4iKTsKKwlwcmludGYoIkVYUE9SVF9TWU1CT0wocmFpZDZfZ2ZleGkpO1xuIik7CisJcHJpbnRmKCIjZW5kaWZcbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9tbXguYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L21teC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjBlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9tbXguYwpAQCAtMCwwICsxLDE0NCBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDIgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJhaWQ2L21teC5jCisgKgorICogTU1YIGltcGxlbWVudGF0aW9uIG9mIFJBSUQtNiBzeW5kcm9tZSBmdW5jdGlvbnMKKyAqLworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgIng4Ni5oIgorCisvKiBTaGFyZWQgd2l0aCByYWlkNi9zc2UxLmMgKi8KK2NvbnN0IHN0cnVjdCByYWlkNl9tbXhfY29uc3RhbnRzIHsKKwl1NjQgeDFkOworfSByYWlkNl9tbXhfY29uc3RhbnRzID0geworCTB4MWQxZDFkMWQxZDFkMWQxZFVMTCwKK307CisKK3N0YXRpYyBpbnQgcmFpZDZfaGF2ZV9tbXgodm9pZCkKK3sKKwkvKiBOb3QgcmVhbGx5ICJib290X2NwdSIgYnV0ICJhbGxfY3B1cyIgKi8KKwlyZXR1cm4gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX01NWCk7Cit9CisKKy8qCisgKiBQbGFpbiBNTVggaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmFpZDZfbW14MV9nZW5fc3luZHJvbWUoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IGRpc2tzIC0gMzsJCS8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejArMV07CQkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07CQkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJtb3ZxICUwLCUlbW0wIiA6IDogIm0iIChyYWlkNl9tbXhfY29uc3RhbnRzLngxZCkpOworCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTUiKTsJLyogWmVybyB0ZW1wICovCisKKwlmb3IgKCBkID0gMCA7IGQgPCBieXRlcyA7IGQgKz0gOCApIHsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZxICUwLCUlbW0yIiA6IDogIm0iIChkcHRyW3owXVtkXSkpOyAvKiBQWzBdICovCisJCWFzbSB2b2xhdGlsZSgibW92cSAlbW0yLCVtbTQiKTsJLyogUVswXSAqLworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tNiIgOiA6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICVtbTQsJW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAlbW00LCVtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAlbW0wLCVtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW02LCVtbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW02LCVtbTQiKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoIm1vdnEgJSVtbTIsJTAiIDogIj1tIiAocFtkXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJW1tMiwlbW0yIik7CisJCWFzbSB2b2xhdGlsZSgibW92cSAlJW1tNCwlMCIgOiAiPW0iIChxW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAlbW00LCVtbTQiKTsKKwl9CisKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCitjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfbW14eDEgPSB7CisJcmFpZDZfbW14MV9nZW5fc3luZHJvbWUsCisJTlVMTCwJCQkvKiBYT1Igbm90IHlldCBpbXBsZW1lbnRlZCAqLworCXJhaWQ2X2hhdmVfbW14LAorCSJtbXh4MSIsCisJMAorfTsKKworLyoKKyAqIFVucm9sbGVkLWJ5LTIgTU1YIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X21teDJfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7CQkvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOwkJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owKzJdOwkJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tMCIgOiA6ICJtIiAocmFpZDZfbW14X2NvbnN0YW50cy54MWQpKTsKKwlhc20gdm9sYXRpbGUoInB4b3IgJW1tNSwlbW01Iik7CS8qIFplcm8gdGVtcCAqLworCWFzbSB2b2xhdGlsZSgicHhvciAlbW03LCVtbTciKTsgLyogWmVybyB0ZW1wICovCisKKwlmb3IgKCBkID0gMCA7IGQgPCBieXRlcyA7IGQgKz0gMTYgKSB7CisJCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tMiIgOiA6ICJtIiAoZHB0clt6MF1bZF0pKTsgLyogUFswXSAqLworCQlhc20gdm9sYXRpbGUoIm1vdnEgJTAsJSVtbTMiIDogOiAibSIgKGRwdHJbejBdW2QrOF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZxICVtbTIsJW1tNCIpOyAvKiBRWzBdICovCisJCWFzbSB2b2xhdGlsZSgibW92cSAlbW0zLCVtbTYiKTsgLyogUVsxXSAqLworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAlbW00LCVtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAlbW02LCVtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJW1tNCwlbW00Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICVtbTYsJW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICVtbTAsJW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICVtbTAsJW1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTcsJW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZxICUwLCUlbW01IiA6IDogIm0iIChkcHRyW3pdW2RdKSk7CisJCQlhc20gdm9sYXRpbGUoIm1vdnEgJTAsJSVtbTciIDogOiAibSIgKGRwdHJbel1bZCs4XSkpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTcsJW1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTcsJW1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTcsJW1tNyIpOworCQl9CisJCWFzbSB2b2xhdGlsZSgibW92cSAlJW1tMiwlMCIgOiAiPW0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92cSAlJW1tMywlMCIgOiAiPW0iIChwW2QrOF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZxICUlbW00LCUwIiA6ICI9bSIgKHFbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZxICUlbW02LCUwIiA6ICI9bSIgKHFbZCs4XSkpOworCX0KKworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9tbXh4MiA9IHsKKwlyYWlkNl9tbXgyX2dlbl9zeW5kcm9tZSwKKwlOVUxMLAkJCS8qIFhPUiBub3QgeWV0IGltcGxlbWVudGVkICovCisJcmFpZDZfaGF2ZV9tbXgsCisJIm1teHgyIiwKKwkwCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L25lb24uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDc2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvbmVvbi5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBsaW51eC9saWIvcmFpZDYvbmVvbi5jIC0gUkFJRDYgc3luZHJvbWUgY2FsY3VsYXRpb24gdXNpbmcgQVJNIE5FT04gaW50cmluc2ljcworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBMaW5hcm8gTHRkIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKworI2lmZGVmIF9fS0VSTkVMX18KKyNpbmNsdWRlIDxhc20vbmVvbi5oPgorI2Vsc2UKKyNkZWZpbmUga2VybmVsX25lb25fYmVnaW4oKQorI2RlZmluZSBrZXJuZWxfbmVvbl9lbmQoKQorI2RlZmluZSBjcHVfaGFzX25lb24oKQkJKDEpCisjZW5kaWYKKworLyoKKyAqIFRoZXJlIGFyZSAyIHJlYXNvbnMgdGhlc2Ugd3JhcHBlcnMgYXJlIGtlcHQgaW4gYSBzZXBhcmF0ZSBjb21waWxhdGlvbiB1bml0CisgKiBmcm9tIHRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb25zIGluIG5lb25OLmMgKGdlbmVyYXRlZCBmcm9tIG5lb24udWMgYnkKKyAqIHVucm9sbC5hd2spOgorICogLSB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9ucyB1c2UgTkVPTiBpbnRyaW5zaWNzLCBhbmQgdGhlIEdDQyBzdXBwb3J0IGhlYWRlcgorICogICAoYXJtX25lb24uaCkgaXMgbm90IGZ1bGx5IGNvbXBhdGlibGUgKHR5cGUgd2lzZSkgd2l0aCB0aGUga2VybmVsOworICogLSB0aGUgbmVvbk4uYyBmaWxlcyBhcmUgY29tcGlsZWQgd2l0aCAtbWZwdT1uZW9uIGFuZCBvcHRpbWl6YXRpb24gZW5hYmxlZCwKKyAqICAgYW5kIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgbmV2ZXIgdXNlICphbnkqIE5FT04vVkZQIGluc3RydWN0aW9ucworICogICBvdXRzaWRlIGEga2VybmVsX25lb25fYmVnaW4oKS9rZXJuZWxfbmVvbl9lbmQoKSBwYWlyLgorICovCisKKyNkZWZpbmUgUkFJRDZfTkVPTl9XUkFQUEVSKF9uKQkJCQkJCVwKKwlzdGF0aWMgdm9pZCByYWlkNl9uZW9uICMjIF9uICMjIF9nZW5fc3luZHJvbWUoaW50IGRpc2tzLAlcCisJCQkJCXNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCVwKKwl7CQkJCQkJCQlcCisJCXZvaWQgcmFpZDZfbmVvbiAjIyBfbiAgIyMgX2dlbl9zeW5kcm9tZV9yZWFsKGludCwJXAorCQkJCQkJdW5zaWduZWQgbG9uZywgdm9pZCoqKTsJXAorCQlrZXJuZWxfbmVvbl9iZWdpbigpOwkJCQkJXAorCQlyYWlkNl9uZW9uICMjIF9uICMjIF9nZW5fc3luZHJvbWVfcmVhbChkaXNrcywJCVwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpYnl0ZXMsIHB0cnMpOwlcCisJCWtlcm5lbF9uZW9uX2VuZCgpOwkJCQkJXAorCX0JCQkJCQkJCVwKKwlzdGF0aWMgdm9pZCByYWlkNl9uZW9uICMjIF9uICMjIF94b3Jfc3luZHJvbWUoaW50IGRpc2tzLAlcCisJCQkJCWludCBzdGFydCwgaW50IHN0b3AsIAkJXAorCQkJCQlzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQlcCisJewkJCQkJCQkJXAorCQl2b2lkIHJhaWQ2X25lb24gIyMgX24gICMjIF94b3Jfc3luZHJvbWVfcmVhbChpbnQsCVwKKwkJCQlpbnQsIGludCwgdW5zaWduZWQgbG9uZywgdm9pZCoqKTsJXAorCQlrZXJuZWxfbmVvbl9iZWdpbigpOwkJCQkJXAorCQlyYWlkNl9uZW9uICMjIF9uICMjIF94b3Jfc3luZHJvbWVfcmVhbChkaXNrcywJCVwKKwkJCXN0YXJ0LCBzdG9wLCAodW5zaWduZWQgbG9uZylieXRlcywgcHRycyk7CVwKKwkJa2VybmVsX25lb25fZW5kKCk7CQkJCQlcCisJfQkJCQkJCQkJXAorCXN0cnVjdCByYWlkNl9jYWxscyBjb25zdCByYWlkNl9uZW9ueCAjIyBfbiA9IHsJCQlcCisJCXJhaWQ2X25lb24gIyMgX24gIyMgX2dlbl9zeW5kcm9tZSwJCQlcCisJCXJhaWQ2X25lb24gIyMgX24gIyMgX3hvcl9zeW5kcm9tZSwJCQlcCisJCXJhaWQ2X2hhdmVfbmVvbiwJCQkJCVwKKwkJIm5lb254IiAjX24sCQkJCQkJXAorCQkwCQkJCQkJCVwKKwl9CisKK3N0YXRpYyBpbnQgcmFpZDZfaGF2ZV9uZW9uKHZvaWQpCit7CisJcmV0dXJuIGNwdV9oYXNfbmVvbigpOworfQorCitSQUlENl9ORU9OX1dSQVBQRVIoMSk7CitSQUlENl9ORU9OX1dSQVBQRVIoMik7CitSQUlENl9ORU9OX1dSQVBQRVIoNCk7CitSQUlENl9ORU9OX1dSQVBQRVIoOCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9uZW9uLnVjIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvbmVvbi51YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M2ODAzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvbmVvbi51YwpAQCAtMCwwICsxLDE1MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIG5lb24udWMgLSBSQUlELTYgc3luZHJvbWUgY2FsY3VsYXRpb24gdXNpbmcgQVJNIE5FT04gaW5zdHJ1Y3Rpb25zCisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMTIgUm9iIEhlcnJpbmcKKyAqICAgQ29weXJpZ2h0IChDKSAyMDE1IExpbmFybyBMdGQuIDxhcmQuYmllc2hldXZlbEBsaW5hcm8ub3JnPgorICoKKyAqICAgQmFzZWQgb24gYWx0aXZlYy51YzoKKyAqICAgICBDb3B5cmlnaHQgMjAwMi0yMDA0IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBuZW9uJCMuYworICoKKyAqICQjLXdheSB1bnJvbGxlZCBORU9OIGludHJpbnNpY3MgbWF0aCBSQUlELTYgaW5zdHJ1Y3Rpb24gc2V0CisgKgorICogVGhpcyBmaWxlIGlzIHBvc3Rwcm9jZXNzZWQgdXNpbmcgdW5yb2xsLmF3aworICovCisKKyNpbmNsdWRlIDxhcm1fbmVvbi5oPgorCit0eXBlZGVmIHVpbnQ4eDE2X3QgdW5hdGl2ZV90OworCisjZGVmaW5lIE5TSVpFCXNpemVvZih1bmF0aXZlX3QpCisKKy8qCisgKiBUaGUgU0hMQllURSgpIG9wZXJhdGlvbiBzaGlmdHMgZWFjaCBieXRlIGxlZnQgYnkgMSwgKm5vdCoKKyAqIHJvbGxpbmcgb3ZlciBpbnRvIHRoZSBuZXh0IGJ5dGUKKyAqLworc3RhdGljIGlubGluZSB1bmF0aXZlX3QgU0hMQllURSh1bmF0aXZlX3QgdikKK3sKKwlyZXR1cm4gdnNobHFfbl91OCh2LCAxKTsKK30KKworLyoKKyAqIFRoZSBNQVNLKCkgb3BlcmF0aW9uIHJldHVybnMgMHhGRiBpbiBhbnkgYnl0ZSBmb3Igd2hpY2ggdGhlIGhpZ2gKKyAqIGJpdCBpcyAxLCAweDAwIGZvciBhbnkgYnl0ZSBmb3Igd2hpY2ggdGhlIGhpZ2ggYml0IGlzIDAuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5hdGl2ZV90IE1BU0sodW5hdGl2ZV90IHYpCit7CisJcmV0dXJuICh1bmF0aXZlX3QpdnNocnFfbl9zOCgoaW50OHgxNl90KXYsIDcpOworfQorCitzdGF0aWMgaW5saW5lIHVuYXRpdmVfdCBQTVVMKHVuYXRpdmVfdCB2LCB1bmF0aXZlX3QgdSkKK3sKKwlyZXR1cm4gKHVuYXRpdmVfdCl2bXVscV9wOCgocG9seTh4MTZfdCl2LCAocG9seTh4MTZfdCl1KTsKK30KKwordm9pZCByYWlkNl9uZW9uJCNfZ2VuX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCB1bnNpZ25lZCBsb25nIGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1aW50OF90ICoqZHB0ciA9ICh1aW50OF90ICoqKXB0cnM7CisJdWludDhfdCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJcmVnaXN0ZXIgdW5hdGl2ZV90IHdkJCQsIHdxJCQsIHdwJCQsIHcxJCQsIHcyJCQ7CisJY29uc3QgdW5hdGl2ZV90IHgxZCA9IHZkdXBxX25fdTgoMHgxZCk7CisKKwl6MCA9IGRpc2tzIC0gMzsJCS8qIEhpZ2hlc3QgZGF0YSBkaXNrICovCisJcCA9IGRwdHJbejArMV07CQkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejArMl07CQkvKiBSUyBzeW5kcm9tZSAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IE5TSVpFKiQjICkgeworCQl3cSQkID0gd3AkJCA9IHZsZDFxX3U4KCZkcHRyW3owXVtkKyQkKk5TSVpFXSk7CisJCWZvciAoIHogPSB6MC0xIDsgeiA+PSAwIDsgei0tICkgeworCQkJd2QkJCA9IHZsZDFxX3U4KCZkcHRyW3pdW2QrJCQqTlNJWkVdKTsKKwkJCXdwJCQgPSB2ZW9ycV91OCh3cCQkLCB3ZCQkKTsKKwkJCXcyJCQgPSBNQVNLKHdxJCQpOworCQkJdzEkJCA9IFNITEJZVEUod3EkJCk7CisKKwkJCXcyJCQgPSB2YW5kcV91OCh3MiQkLCB4MWQpOworCQkJdzEkJCA9IHZlb3JxX3U4KHcxJCQsIHcyJCQpOworCQkJd3EkJCA9IHZlb3JxX3U4KHcxJCQsIHdkJCQpOworCQl9CisJCXZzdDFxX3U4KCZwW2QrTlNJWkUqJCRdLCB3cCQkKTsKKwkJdnN0MXFfdTgoJnFbZCtOU0laRSokJF0sIHdxJCQpOworCX0KK30KKwordm9pZCByYWlkNl9uZW9uJCNfeG9yX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1aW50OF90ICoqZHB0ciA9ICh1aW50OF90ICoqKXB0cnM7CisJdWludDhfdCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJcmVnaXN0ZXIgdW5hdGl2ZV90IHdkJCQsIHdxJCQsIHdwJCQsIHcxJCQsIHcyJCQ7CisJY29uc3QgdW5hdGl2ZV90IHgxZCA9IHZkdXBxX25fdTgoMHgxZCk7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IE5TSVpFKiQjICkgeworCQl3cSQkID0gdmxkMXFfdTgoJmRwdHJbejBdW2QrJCQqTlNJWkVdKTsKKwkJd3AkJCA9IHZlb3JxX3U4KHZsZDFxX3U4KCZwW2QrJCQqTlNJWkVdKSwgd3EkJCk7CisKKwkJLyogUC9RIGRhdGEgcGFnZXMgKi8KKwkJZm9yICggeiA9IHowLTEgOyB6ID49IHN0YXJ0IDsgei0tICkgeworCQkJd2QkJCA9IHZsZDFxX3U4KCZkcHRyW3pdW2QrJCQqTlNJWkVdKTsKKwkJCXdwJCQgPSB2ZW9ycV91OCh3cCQkLCB3ZCQkKTsKKwkJCXcyJCQgPSBNQVNLKHdxJCQpOworCQkJdzEkJCA9IFNITEJZVEUod3EkJCk7CisKKwkJCXcyJCQgPSB2YW5kcV91OCh3MiQkLCB4MWQpOworCQkJdzEkJCA9IHZlb3JxX3U4KHcxJCQsIHcyJCQpOworCQkJd3EkJCA9IHZlb3JxX3U4KHcxJCQsIHdkJCQpOworCQl9CisJCS8qIFAvUSBsZWZ0IHNpZGUgb3B0aW1pemF0aW9uICovCisJCWZvciAoIHogPSBzdGFydC0xIDsgeiA+PSAzIDsgeiAtPSA0ICkgeworCQkJdzIkJCA9IHZzaHJxX25fdTgod3EkJCwgNCk7CisJCQl3MSQkID0gdnNobHFfbl91OCh3cSQkLCA0KTsKKworCQkJdzIkJCA9IFBNVUwodzIkJCwgeDFkKTsKKwkJCXdxJCQgPSB2ZW9ycV91OCh3MSQkLCB3MiQkKTsKKwkJfQorCisJCXN3aXRjaCAoeikgeworCQljYXNlIDI6CisJCQl3MiQkID0gdnNocnFfbl91OCh3cSQkLCA1KTsKKwkJCXcxJCQgPSB2c2hscV9uX3U4KHdxJCQsIDMpOworCisJCQl3MiQkID0gUE1VTCh3MiQkLCB4MWQpOworCQkJd3EkJCA9IHZlb3JxX3U4KHcxJCQsIHcyJCQpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXcyJCQgPSB2c2hycV9uX3U4KHdxJCQsIDYpOworCQkJdzEkJCA9IHZzaGxxX25fdTgod3EkJCwgMik7CisKKwkJCXcyJCQgPSBQTVVMKHcyJCQsIHgxZCk7CisJCQl3cSQkID0gdmVvcnFfdTgodzEkJCwgdzIkJCk7CisJCQlicmVhazsKKwkJY2FzZSAwOgorCQkJdzIkJCA9IE1BU0sod3EkJCk7CisJCQl3MSQkID0gU0hMQllURSh3cSQkKTsKKworCQkJdzIkJCA9IHZhbmRxX3U4KHcyJCQsIHgxZCk7CisJCQl3cSQkID0gdmVvcnFfdTgodzEkJCwgdzIkJCk7CisJCX0KKwkJdzEkJCA9IHZsZDFxX3U4KCZxW2QrTlNJWkUqJCRdKTsKKwkJd3EkJCA9IHZlb3JxX3U4KHdxJCQsIHcxJCQpOworCisJCXZzdDFxX3U4KCZwW2QrTlNJWkUqJCRdLCB3cCQkKTsKKwkJdnN0MXFfdTgoJnFbZCtOU0laRSokJF0sIHdxJCQpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NWJjY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdi5jCkBAIC0wLDAgKzEsMTQxIEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmFpZDYvcmVjb3YuYworICoKKyAqIFJBSUQtNiBkYXRhIHJlY292ZXJ5IGluIGR1YWwgZmFpbHVyZSBtb2RlLiAgSW4gc2luZ2xlIGZhaWx1cmUgbW9kZSwKKyAqIHVzZSB0aGUgUkFJRC01IGFsZ29yaXRobSAob3IsIGluIHRoZSBjYXNlIG9mIFEgZmFpbHVyZSwganVzdCByZWNvbnN0cnVjdAorICogdGhlIHN5bmRyb21lLikKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorCisvKiBSZWNvdmVyIHR3byBmYWlsZWQgZGF0YSBibG9ja3MuICovCitzdGF0aWMgdm9pZCByYWlkNl8yZGF0YV9yZWNvdl9pbnR4MShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQlpbnQgZmFpbGIsIHZvaWQgKipwdHJzKQoreworCXU4ICpwLCAqcSwgKmRwLCAqZHE7CisJdTggcHgsIHF4LCBkYjsKKwljb25zdCB1OCAqcGJtdWw7CS8qIFAgbXVsdGlwbGllciB0YWJsZSBmb3IgQiBkYXRhICovCisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKGZvciBib3RoKSAqLworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlcworCSAgIFVzZSB0aGUgZGVhZCBkYXRhIHBhZ2VzIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvcgorCSAgIGRlbHRhIHAgYW5kIGRlbHRhIHEgKi8KKwlkcCA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0yXSA9IGRwOworCWRxID0gKHU4ICopcHRyc1tmYWlsYl07CisJcHRyc1tmYWlsYl0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRwOworCXB0cnNbZmFpbGJdICAgPSBkcTsKKwlwdHJzW2Rpc2tzLTJdID0gcDsKKwlwdHJzW2Rpc2tzLTFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcGJtdWwgPSByYWlkNl9nZm11bFtyYWlkNl9nZmV4aVtmYWlsYi1mYWlsYV1dOworCXFtdWwgID0gcmFpZDZfZ2ZtdWxbcmFpZDZfZ2ZpbnZbcmFpZDZfZ2ZleHBbZmFpbGFdXnJhaWQ2X2dmZXhwW2ZhaWxiXV1dOworCisJLyogTm93IGRvIGl0Li4uICovCisJd2hpbGUgKCBieXRlcy0tICkgeworCQlweCAgICA9ICpwIF4gKmRwOworCQlxeCAgICA9IHFtdWxbKnEgXiAqZHFdOworCQkqZHErKyA9IGRiID0gcGJtdWxbcHhdIF4gcXg7IC8qIFJlY29uc3RydWN0ZWQgQiAqLworCQkqZHArKyA9IGRiIF4gcHg7IC8qIFJlY29uc3RydWN0ZWQgQSAqLworCQlwKys7IHErKzsKKwl9Cit9CisKKy8qIFJlY292ZXIgZmFpbHVyZSBvZiBvbmUgZGF0YSBibG9jayBwbHVzIHRoZSBQIGJsb2NrICovCitzdGF0aWMgdm9pZCByYWlkNl9kYXRhcF9yZWNvdl9pbnR4MShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQl2b2lkICoqcHRycykKK3sKKwl1OCAqcCwgKnEsICpkcTsKKwljb25zdCB1OCAqcW11bDsJCS8qIFEgbXVsdGlwbGllciB0YWJsZSAqLworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcSAqLworCWRxID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRxOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlxbXVsICA9IHJhaWQ2X2dmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV1dOworCisJLyogTm93IGRvIGl0Li4uICovCisJd2hpbGUgKCBieXRlcy0tICkgeworCQkqcCsrIF49ICpkcSA9IHFtdWxbKnEgXiAqZHFdOworCQlxKys7IGRxKys7CisJfQorfQorCisKK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9pbnR4MSA9IHsKKwkuZGF0YTIgPSByYWlkNl8yZGF0YV9yZWNvdl9pbnR4MSwKKwkuZGF0YXAgPSByYWlkNl9kYXRhcF9yZWNvdl9pbnR4MSwKKwkudmFsaWQgPSBOVUxMLAorCS5uYW1lID0gImludHgxIiwKKwkucHJpb3JpdHkgPSAwLAorfTsKKworI2lmbmRlZiBfX0tFUk5FTF9fCisvKiBUZXN0aW5nIG9ubHkgKi8KKworLyogUmVjb3ZlciB0d28gZmFpbGVkIGJsb2Nrcy4gKi8KK3ZvaWQgcmFpZDZfZHVhbF9yZWNvdihpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLCBpbnQgZmFpbGIsIHZvaWQgKipwdHJzKQoreworCWlmICggZmFpbGEgPiBmYWlsYiApIHsKKwkJaW50IHRtcCA9IGZhaWxhOworCQlmYWlsYSA9IGZhaWxiOworCQlmYWlsYiA9IHRtcDsKKwl9CisKKwlpZiAoIGZhaWxiID09IGRpc2tzLTEgKSB7CisJCWlmICggZmFpbGEgPT0gZGlza3MtMiApIHsKKwkJCS8qIFArUSBmYWlsdXJlLiAgSnVzdCByZWJ1aWxkIHRoZSBzeW5kcm9tZS4gKi8KKwkJCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisJCX0gZWxzZSB7CisJCQkvKiBkYXRhK1EgZmFpbHVyZS4gIFJlY29uc3RydWN0IGRhdGEgZnJvbSBQLAorCQkJICAgdGhlbiByZWJ1aWxkIHN5bmRyb21lLiAqLworCQkJLyogTk9UIElNUExFTUVOVEVEIC0gZXF1aXZhbGVudCB0byBSQUlELTUgKi8KKwkJfQorCX0gZWxzZSB7CisJCWlmICggZmFpbGIgPT0gZGlza3MtMiApIHsKKwkJCS8qIGRhdGErUCBmYWlsdXJlLiAqLworCQkJcmFpZDZfZGF0YXBfcmVjb3YoZGlza3MsIGJ5dGVzLCBmYWlsYSwgcHRycyk7CisJCX0gZWxzZSB7CisJCQkvKiBkYXRhK2RhdGEgZmFpbHVyZS4gKi8KKwkJCXJhaWQ2XzJkYXRhX3JlY292KGRpc2tzLCBieXRlcywgZmFpbGEsIGZhaWxiLCBwdHJzKTsKKwkJfQorCX0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdl9hdngyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdl9hdngyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmZTNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X2F2eDIuYwpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBJbnRlbCBDb3Jwb3JhdGlvbgorICogQXV0aG9yOiBKaW0gS3VrdW5hcyA8amFtZXMudC5rdWt1bmFzQGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIENPTkZJR19BU19BVlgyCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisjaW5jbHVkZSAieDg2LmgiCisKK3N0YXRpYyBpbnQgcmFpZDZfaGFzX2F2eDIodm9pZCkKK3sKKwlyZXR1cm4gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDIpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlgpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl8yZGF0YV9yZWNvdl9hdngyKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsCisJCWludCBmYWlsYiwgdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHAsICpkcTsKKwljb25zdCB1OCAqcGJtdWw7CS8qIFAgbXVsdGlwbGllciB0YWJsZSBmb3IgQiBkYXRhICovCisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKGZvciBib3RoKSAqLworCWNvbnN0IHU4IHgwZiA9IDB4MGY7CisKKwlwID0gKHU4ICopcHRyc1tkaXNrcy0yXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcy0xXTsKKworCS8qIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2VzCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZXMgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yCisJICAgZGVsdGEgcCBhbmQgZGVsdGEgcSAqLworCWRwID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTJdID0gZHA7CisJZHEgPSAodTggKilwdHJzW2ZhaWxiXTsKKwlwdHJzW2ZhaWxiXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHA7CisJcHRyc1tmYWlsYl0gICA9IGRxOworCXB0cnNbZGlza3MtMl0gPSBwOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlwYm11bCA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmV4aVtmYWlsYi1mYWlsYV1dOworCXFtdWwgID0gcmFpZDZfdmdmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXSBeCisJCXJhaWQ2X2dmZXhwW2ZhaWxiXV1dOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJLyogeW1tMCA9IHgwZlsxNl0gKi8KKwlhc20gdm9sYXRpbGUoInZwYnJvYWRjYXN0YiAlMCwgJSV5bW03IiA6IDogIm0iICh4MGYpKTsKKworCXdoaWxlIChieXRlcykgeworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCAlJXltbTEiIDogOiAibSIgKHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCAlJXltbTkiIDogOiAibSIgKHFbMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwgJSV5bW0wIiA6IDogIm0iIChwWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwgJSV5bW04IiA6IDogIm0iIChwWzMyXSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICUwLCAlJXltbTEsICUleW1tMSIgOiA6ICJtIiAoZHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwgJSV5bW05LCAlJXltbTkiIDogOiAibSIgKGRxWzMyXSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICUwLCAlJXltbTAsICUleW1tMCIgOiA6ICJtIiAoZHBbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwgJSV5bW04LCAlJXltbTgiIDogOiAibSIgKGRwWzMyXSkpOworCisJCS8qCisJCSAqIDEgPSBkcVswXSAgXiBxWzBdCisJCSAqIDkgPSBkcVszMl0gXiBxWzMyXQorCQkgKiAwID0gZHBbMF0gIF4gcFswXQorCQkgKiA4ID0gZHBbMzJdIF4gcFszMl0KKwkJICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTEyOCAlMCwgJSV5bW00IiA6IDogIm0iIChxbXVsWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGkxMjggJTAsICUleW1tNSIgOiA6ICJtIiAocW11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJXltbTEsICV5bW0zIik7CisJCWFzbSB2b2xhdGlsZSgidnBzcmF3ICQ0LCAleW1tOSwgJXltbTEyIik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW0xLCAleW1tMSIpOworCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW03LCAleW1tOSwgJXltbTkiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tNywgJXltbTMsICV5bW0zIik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW0xMiwgJXltbTEyIik7CisJCWFzbSB2b2xhdGlsZSgidnBzaHVmYiAleW1tOSwgJXltbTQsICV5bW0xNCIpOworCQlhc20gdm9sYXRpbGUoInZwc2h1ZmIgJXltbTEsICV5bW00LCAleW1tNCIpOworCQlhc20gdm9sYXRpbGUoInZwc2h1ZmIgJXltbTEyLCAleW1tNSwgJXltbTE1Iik7CisJCWFzbSB2b2xhdGlsZSgidnBzaHVmYiAleW1tMywgJXltbTUsICV5bW01Iik7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTE0LCAleW1tMTUsICV5bW0xNSIpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW00LCAleW1tNSwgJXltbTUiKTsKKworCQkvKgorCQkgKiA1ID0gcXhbMF0KKwkJICogMTUgPSBxeFszMl0KKwkJICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTEyOCAlMCwgJSV5bW00IiA6IDogIm0iIChwYm11bFswXSkpOworCQlhc20gdm9sYXRpbGUoInZicm9hZGNhc3RpMTI4ICUwLCAlJXltbTEiIDogOiAibSIgKHBibXVsWzE2XSkpOworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJXltbTAsICV5bW0yIik7CisJCWFzbSB2b2xhdGlsZSgidnBzcmF3ICQ0LCAleW1tOCwgJXltbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tNywgJXltbTAsICV5bW0zIik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW04LCAleW1tMTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tNywgJXltbTIsICV5bW0yIik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW02LCAleW1tNiIpOworCQlhc20gdm9sYXRpbGUoInZwc2h1ZmIgJXltbTE0LCAleW1tNCwgJXltbTEyIik7CisJCWFzbSB2b2xhdGlsZSgidnBzaHVmYiAleW1tMywgJXltbTQsICV5bW00Iik7CisJCWFzbSB2b2xhdGlsZSgidnBzaHVmYiAleW1tNiwgJXltbTEsICV5bW0xMyIpOworCQlhc20gdm9sYXRpbGUoInZwc2h1ZmIgJXltbTIsICV5bW0xLCAleW1tMSIpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW00LCAleW1tMSwgJXltbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTIsICV5bW0xMywgJXltbTEzIik7CisKKwkJLyoKKwkJICogMSAgPSBwYm11bFtweFswXV0KKwkJICogMTMgPSBwYm11bFtweFszMl1dCisJCSAqLworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCAleW1tMSwgJXltbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTUsICV5bW0xMywgJXltbTEzIik7CisKKwkJLyoKKwkJICogMSA9IGRiID0gRFEKKwkJICogMTMgPSBkYlszMl0gPSBEUVszMl0KKwkJICovCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTEsICUwIiA6ICI9bSIgKGRxWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTEzLCUwIiA6ICI9bSIgKGRxWzMyXSkpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xLCAleW1tMCwgJXltbTAiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsICV5bW04LCAleW1tOCIpOworCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTAsICUwIiA6ICI9bSIgKGRwWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTgsICUwIiA6ICI9bSIgKGRwWzMyXSkpOworCisJCWJ5dGVzIC09IDY0OworCQlwICs9IDY0OworCQlxICs9IDY0OworCQlkcCArPSA2NDsKKwkJZHEgKz0gNjQ7CisjZWxzZQorCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsICUleW1tMSIgOiA6ICJtIiAoKnEpKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUwLCAlJXltbTAiIDogOiAibSIgKCpwKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJTAsICUleW1tMSwgJSV5bW0xIiA6IDogIm0iICgqZHEpKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwgJSV5bW0wLCAlJXltbTAiIDogOiAibSIgKCpkcCkpOworCisJCS8qIDEgPSBkcSBeIHE7ICAwID0gZHAgXiBwICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTEyOCAlMCwgJSV5bW00IiA6IDogIm0iIChxbXVsWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGkxMjggJTAsICUleW1tNSIgOiA6ICJtIiAocW11bFsxNl0pKTsKKworCQkvKgorCQkgKiAxID0gZHEgXiBxCisJCSAqIDMgPSBkcSBeIHAgPj4gNAorCQkgKi8KKwkJYXNtIHZvbGF0aWxlKCJ2cHNyYXcgJDQsICV5bW0xLCAleW1tMyIpOworCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW03LCAleW1tMSwgJXltbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tNywgJXltbTMsICV5bW0zIik7CisJCWFzbSB2b2xhdGlsZSgidnBzaHVmYiAleW1tMSwgJXltbTQsICV5bW00Iik7CisJCWFzbSB2b2xhdGlsZSgidnBzaHVmYiAleW1tMywgJXltbTUsICV5bW01Iik7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTQsICV5bW01LCAleW1tNSIpOworCisJCS8qIDUgPSBxeCAqLworCisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGkxMjggJTAsICUleW1tNCIgOiA6ICJtIiAocGJtdWxbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTEyOCAlMCwgJSV5bW0xIiA6IDogIm0iIChwYm11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJXltbTAsICV5bW0yIik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW0wLCAleW1tMyIpOworCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW03LCAleW1tMiwgJXltbTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNodWZiICV5bW0zLCAleW1tNCwgJXltbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNodWZiICV5bW0yLCAleW1tMSwgJXltbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tNCwgJXltbTEsICV5bW0xIik7CisKKwkJLyogMSA9IHBibXVsW3B4XSAqLworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW01LCAleW1tMSwgJXltbTEiKTsKKwkJLyogMSA9IGRiID0gRFEgKi8KKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUleW1tMSwgJTAiIDogIj1tIiAoZHFbMF0pKTsKKworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0xLCAleW1tMCwgJXltbTAiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUleW1tMCwgJTAiIDogIj1tIiAoZHBbMF0pKTsKKworCQlieXRlcyAtPSAzMjsKKwkJcCArPSAzMjsKKwkJcSArPSAzMjsKKwkJZHAgKz0gMzI7CisJCWRxICs9IDMyOworI2VuZGlmCisJfQorCisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworc3RhdGljIHZvaWQgcmFpZDZfZGF0YXBfcmVjb3ZfYXZ4MihpbnQgZGlza3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAorCQl2b2lkICoqcHRycykKK3sKKwl1OCAqcCwgKnEsICpkcTsKKwljb25zdCB1OCAqcW11bDsJCS8qIFEgbXVsdGlwbGllciB0YWJsZSAqLworCWNvbnN0IHU4IHgwZiA9IDB4MGY7CisKKwlwID0gKHU4ICopcHRyc1tkaXNrcy0yXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcy0xXTsKKworCS8qIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2UKKwkgICBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBkZWx0YSBxICovCisJZHEgPSAodTggKilwdHJzW2ZhaWxhXTsKKwlwdHJzW2ZhaWxhXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHE7CisJcHRyc1tkaXNrcy0xXSA9IHE7CisKKwkvKiBOb3csIHBpY2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLworCXFtdWwgID0gcmFpZDZfdmdmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV1dOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2cGJyb2FkY2FzdGIgJTAsICUleW1tNyIgOiA6ICJtIiAoeDBmKSk7CisKKwl3aGlsZSAoYnl0ZXMpIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwgJSV5bW0zIiA6IDogIm0iIChkcVswXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsICUleW1tOCIgOiA6ICJtIiAoZHFbMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJTAsICUleW1tMywgJSV5bW0zIiA6IDogIm0iIChxWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJTAsICUleW1tOCwgJSV5bW04IiA6IDogIm0iIChxWzMyXSkpOworCisJCS8qCisJCSAqIDMgPSBxWzBdIF4gZHFbMF0KKwkJICogOCA9IHFbMzJdIF4gZHFbMzJdCisJCSAqLworCQlhc20gdm9sYXRpbGUoInZicm9hZGNhc3RpMTI4ICUwLCAlJXltbTAiIDogOiAibSIgKHFtdWxbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92YXBkICV5bW0wLCAleW1tMTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTEyOCAlMCwgJSV5bW0xIiA6IDogIm0iIChxbXVsWzE2XSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZhcGQgJXltbTEsICV5bW0xNCIpOworCisJCWFzbSB2b2xhdGlsZSgidnBzcmF3ICQ0LCAleW1tMywgJXltbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNyYXcgJDQsICV5bW04LCAleW1tMTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tNywgJXltbTMsICV5bW0zIik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW04LCAleW1tOCIpOworCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW03LCAleW1tNiwgJXltbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cGFuZCAleW1tNywgJXltbTEyLCAleW1tMTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNodWZiICV5bW0zLCAleW1tMCwgJXltbTAiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNodWZiICV5bW04LCAleW1tMTMsICV5bW0xMyIpOworCQlhc20gdm9sYXRpbGUoInZwc2h1ZmIgJXltbTYsICV5bW0xLCAleW1tMSIpOworCQlhc20gdm9sYXRpbGUoInZwc2h1ZmIgJXltbTEyLCAleW1tMTQsICV5bW0xNCIpOworCQlhc20gdm9sYXRpbGUoInZweG9yICV5bW0wLCAleW1tMSwgJXltbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMTMsICV5bW0xNCwgJXltbTE0Iik7CisKKwkJLyoKKwkJICogMSAgPSBxbXVsW3FbMF0gIF4gZHFbMF1dCisJCSAqIDE0ID0gcW11bFtxWzMyXSBeIGRxWzMyXV0KKwkJICovCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwgJSV5bW0yIiA6IDogIm0iIChwWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwgJSV5bW0xMiIgOiA6ICJtIiAocFszMl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMSwgJXltbTIsICV5bW0yIik7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTE0LCAleW1tMTIsICV5bW0xMiIpOworCisJCS8qCisJCSAqIDIgID0gcFswXSAgXiBxbXVsW3FbMF0gIF4gZHFbMF1dCisJCSAqIDEyID0gcFszMl0gXiBxbXVsW3FbMzJdIF4gZHFbMzJdXQorCQkgKi8KKworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJSV5bW0xLCAlMCIgOiAiPW0iIChkcVswXSkpOworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJSV5bW0xNCwgJTAiIDogIj1tIiAoZHFbMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlJXltbTIsICUwIiA6ICI9bSIgKHBbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUleW1tMTIsJTAiIDogIj1tIiAocFszMl0pKTsKKworCQlieXRlcyAtPSA2NDsKKwkJcCArPSA2NDsKKwkJcSArPSA2NDsKKwkJZHEgKz0gNjQ7CisjZWxzZQorCQlhc20gdm9sYXRpbGUoInZtb3ZkcWEgJTAsICUleW1tMyIgOiA6ICJtIiAoZHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAlMCwgJSV5bW0zLCAlJXltbTMiIDogOiAibSIgKHFbMF0pKTsKKworCQkvKiAzID0gcSBeIGRxICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTEyOCAlMCwgJSV5bW0wIiA6IDogIm0iIChxbXVsWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGkxMjggJTAsICUleW1tMSIgOiA6ICJtIiAocW11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJXltbTMsICV5bW02Iik7CisJCWFzbSB2b2xhdGlsZSgidnBhbmQgJXltbTcsICV5bW0zLCAleW1tMyIpOworCQlhc20gdm9sYXRpbGUoInZwYW5kICV5bW03LCAleW1tNiwgJXltbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNodWZiICV5bW0zLCAleW1tMCwgJXltbTAiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHNodWZiICV5bW02LCAleW1tMSwgJXltbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJ2cHhvciAleW1tMCwgJXltbTEsICV5bW0xIik7CisKKwkJLyogMSA9IHFtdWxbcSBeIGRxXSAqLworCisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYSAlMCwgJSV5bW0yIiA6IDogIm0iIChwWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgidnB4b3IgJXltbTEsICV5bW0yLCAleW1tMiIpOworCisJCS8qIDIgPSBwIF4gcW11bFtxIF4gZHFdICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUleW1tMSwgJTAiIDogIj1tIiAoZHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhICUleW1tMiwgJTAiIDogIj1tIiAocFswXSkpOworCisJCWJ5dGVzIC09IDMyOworCQlwICs9IDMyOworCQlxICs9IDMyOworCQlkcSArPSAzMjsKKyNlbmRpZgorCX0KKworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9hdngyID0geworCS5kYXRhMiA9IHJhaWQ2XzJkYXRhX3JlY292X2F2eDIsCisJLmRhdGFwID0gcmFpZDZfZGF0YXBfcmVjb3ZfYXZ4MiwKKwkudmFsaWQgPSByYWlkNl9oYXNfYXZ4MiwKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLm5hbWUgPSAiYXZ4MngyIiwKKyNlbHNlCisJLm5hbWUgPSAiYXZ4MngxIiwKKyNlbmRpZgorCS5wcmlvcml0eSA9IDIsCit9OworCisjZWxzZQorI3dhcm5pbmcgInlvdXIgdmVyc2lvbiBvZiBiaW51dGlscyBsYWNrcyBBVlgyIHN1cHBvcnQiCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X2F2eDUxMi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvcmVjb3ZfYXZ4NTEyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1YWFmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X2F2eDUxMi5jCkBAIC0wLDAgKzEsMzg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IEludGVsIENvcnBvcmF0aW9uCisgKgorICogQXV0aG9yOiBHYXlhdHJpIEthbW1lbGEgPGdheWF0cmkua2FtbWVsYUBpbnRlbC5jb20+CisgKiBBdXRob3I6IE1lZ2hhIERleSA8bWVnaGEuZGV5QGxpbnV4LmludGVsLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKgorICovCisKKyNpZmRlZiBDT05GSUdfQVNfQVZYNTEyCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisjaW5jbHVkZSAieDg2LmgiCisKK3N0YXRpYyBpbnQgcmFpZDZfaGFzX2F2eDUxMih2b2lkKQoreworCXJldHVybiBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYMikgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWCkgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDUxMkYpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9BVlg1MTJCVykgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0FWWDUxMlZMKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfQVZYNTEyRFEpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl8yZGF0YV9yZWNvdl9hdng1MTIoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJCQkgICAgIGludCBmYWlsYiwgdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHAsICpkcTsKKwljb25zdCB1OCAqcGJtdWw7CS8qIFAgbXVsdGlwbGllciB0YWJsZSBmb3IgQiBkYXRhICovCisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKGZvciBib3RoKSAqLworCWNvbnN0IHU4IHgwZiA9IDB4MGY7CisKKwlwID0gKHU4ICopcHRyc1tkaXNrcy0yXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcy0xXTsKKworCS8qCisJICogQ29tcHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZXMKKwkgKiBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlcyBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IKKwkgKiBkZWx0YSBwIGFuZCBkZWx0YSBxCisJICovCisKKwlkcCA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0yXSA9IGRwOworCWRxID0gKHU4ICopcHRyc1tmYWlsYl07CisJcHRyc1tmYWlsYl0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRwOworCXB0cnNbZmFpbGJdICAgPSBkcTsKKwlwdHJzW2Rpc2tzLTJdID0gcDsKKwlwdHJzW2Rpc2tzLTFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcGJtdWwgPSByYWlkNl92Z2ZtdWxbcmFpZDZfZ2ZleGlbZmFpbGItZmFpbGFdXTsKKwlxbXVsICA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV0gXgorCQlyYWlkNl9nZmV4cFtmYWlsYl1dXTsKKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCS8qIHptbTAgPSB4MGZbMTZdICovCisJYXNtIHZvbGF0aWxlKCJ2cGJyb2FkY2FzdGIgJTAsICUlem1tNyIgOiA6ICJtIiAoeDBmKSk7CisKKwl3aGlsZSAoYnl0ZXMpIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCAlJXptbTFcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUxLCAlJXptbTlcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUyLCAlJXptbTBcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUzLCAlJXptbThcblx0IgorCQkJICAgICAidnB4b3JxICU0LCAlJXptbTEsICUlem1tMVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTUsICUlem1tOSwgJSV6bW05XG5cdCIKKwkJCSAgICAgInZweG9ycSAlNiwgJSV6bW0wLCAlJXptbTBcblx0IgorCQkJICAgICAidnB4b3JxICU3LCAlJXptbTgsICUlem1tOCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocVswXSksICJtIiAocVs2NF0pLCAibSIgKHBbMF0pLAorCQkJICAgICAgICJtIiAocFs2NF0pLCAibSIgKGRxWzBdKSwgIm0iIChkcVs2NF0pLAorCQkJICAgICAgICJtIiAoZHBbMF0pLCAibSIgKGRwWzY0XSkpOworCisJCS8qCisJCSAqIDEgPSBkcVswXSAgXiBxWzBdCisJCSAqIDkgPSBkcVs2NF0gXiBxWzY0XQorCQkgKiAwID0gZHBbMF0gIF4gcFswXQorCQkgKiA4ID0gZHBbNjRdIF4gcFs2NF0KKwkJICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTY0eDIgJTAsICUlem1tNFxuXHQiCisJCQkgICAgICJ2YnJvYWRjYXN0aTY0eDIgJTEsICUlem1tNSIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocW11bFswXSksICJtIiAocW11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJSV6bW0xLCAlJXptbTNcblx0IgorCQkJICAgICAidnBzcmF3ICQ0LCAlJXptbTksICUlem1tMTJcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW05LCAlJXptbTlcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0zLCAlJXptbTNcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0xMiwgJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tOSwgJSV6bW00LCAlJXptbTE0XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0xLCAlJXptbTQsICUlem1tNFxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMTIsICUlem1tNSwgJSV6bW0xNVxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMywgJSV6bW01LCAlJXptbTVcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTQsICUlem1tMTUsICUlem1tMTVcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNCwgJSV6bW01LCAlJXptbTUiCisJCQkgICAgIDoKKwkJCSAgICAgOiApOworCisJCS8qCisJCSAqIDUgPSBxeFswXQorCQkgKiAxNSA9IHF4WzY0XQorCQkgKi8KKworCQlhc20gdm9sYXRpbGUoInZicm9hZGNhc3RpNjR4MiAlMCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZicm9hZGNhc3RpNjR4MiAlMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZwc3JhdyAkNCwgJSV6bW0wLCAlJXptbTJcblx0IgorCQkJICAgICAidnBzcmF3ICQ0LCAlJXptbTgsICUlem1tNlxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTAsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTgsICUlem1tMTRcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0yLCAlJXptbTJcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW02LCAlJXptbTZcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTE0LCAlJXptbTQsICUlem1tMTJcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTMsICUlem1tNCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW02LCAlJXptbTEsICUlem1tMTNcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTIsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTQsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTEyLCAlJXptbTEzLCAlJXptbTEzIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChwYm11bFswXSksICJtIiAocGJtdWxbMTZdKSk7CisKKwkJLyoKKwkJICogMSAgPSBwYm11bFtweFswXV0KKwkJICogMTMgPSBwYm11bFtweFs2NF1dCisJCSAqLworCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTE1LCAlJXptbTEzLCAlJXptbTEzIgorCQkJICAgICA6CisJCQkgICAgIDogKTsKKworCQkvKgorCQkgKiAxID0gZGIgPSBEUQorCQkgKiAxMyA9IGRiWzY0XSA9IERRWzY0XQorCQkgKi8KKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJSV6bW0xLCAlMFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0xMywlMVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xLCAlJXptbTAsICUlem1tMFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xMywgJSV6bW04LCAlJXptbTgiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRxWzBdKSwgIm0iIChkcVs2NF0pKTsKKworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlJXptbTAsICUwXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTgsICUxIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcFswXSksICJtIiAoZHBbNjRdKSk7CisKKwkJYnl0ZXMgLT0gMTI4OworCQlwICs9IDEyODsKKwkJcSArPSAxMjg7CisJCWRwICs9IDEyODsKKwkJZHEgKz0gMTI4OworI2Vsc2UKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsICUlem1tMVxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJTEsICUlem1tMFxuXHQiCisJCQkgICAgICJ2cHhvcnEgJTIsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlMywgJSV6bW0wLCAlJXptbTAiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKCpxKSwgIm0iICgqcCksICJtIigqZHEpLCAibSIgKCpkcCkpOworCisJCS8qIDEgPSBkcSBeIHE7ICAwID0gZHAgXiBwICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2YnJvYWRjYXN0aTY0eDIgJTAsICUlem1tNFxuXHQiCisJCQkgICAgICJ2YnJvYWRjYXN0aTY0eDIgJTEsICUlem1tNSIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocW11bFswXSksICJtIiAocW11bFsxNl0pKTsKKworCQkvKgorCQkgKiAxID0gZHEgXiBxCisJCSAqIDMgPSBkcSBeIHAgPj4gNAorCQkgKi8KKwkJYXNtIHZvbGF0aWxlKCJ2cHNyYXcgJDQsICUlem1tMSwgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tMywgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0xLCAlJXptbTQsICUlem1tNFxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMywgJSV6bW01LCAlJXptbTVcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tNCwgJSV6bW01LCAlJXptbTUiCisJCQkgICAgIDoKKwkJCSAgICAgOiApOworCisJCS8qIDUgPSBxeCAqLworCisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGk2NHgyICUwLCAlJXptbTRcblx0IgorCQkJICAgICAidmJyb2FkY2FzdGk2NHgyICUxLCAlJXptbTEiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHBibXVsWzBdKSwgIm0iIChwYm11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoInZwc3JhdyAkNCwgJSV6bW0wLCAlJXptbTJcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0wLCAlJXptbTNcblx0IgorCQkJICAgICAidnBhbmRxICUlem1tNywgJSV6bW0yLCAlJXptbTJcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTMsICUlem1tNCwgJSV6bW00XG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW0yLCAlJXptbTEsICUlem1tMVxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW00LCAlJXptbTEsICUlem1tMSIKKwkJCSAgICAgOgorCQkJICAgICA6ICk7CisKKwkJLyogMSA9IHBibXVsW3B4XSAqLworCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTUsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgLyogMSA9IGRiID0gRFEgKi8KKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTEsICUwXG5cdCIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHFbMF0pKTsKKworCQlhc20gdm9sYXRpbGUoInZweG9ycSAlJXptbTEsICUlem1tMCwgJSV6bW0wXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlJXptbTAsICUwIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcFswXSkpOworCisJCWJ5dGVzIC09IDY0OworCQlwICs9IDY0OworCQlxICs9IDY0OworCQlkcCArPSA2NDsKKwkJZHEgKz0gNjQ7CisjZW5kaWYKKwl9CisKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl9kYXRhcF9yZWNvdl9hdng1MTIoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJCQkgICAgIHZvaWQgKipwdHJzKQoreworCXU4ICpwLCAqcSwgKmRxOworCWNvbnN0IHU4ICpxbXVsOwkJLyogUSBtdWx0aXBsaWVyIHRhYmxlICovCisJY29uc3QgdTggeDBmID0gMHgwZjsKKworCXAgPSAodTggKilwdHJzW2Rpc2tzLTJdOworCXEgPSAodTggKilwdHJzW2Rpc2tzLTFdOworCisJLyoKKwkgKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlCisJICogVXNlIHRoZSBkZWFkIGRhdGEgcGFnZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcQorCSAqLworCisJZHEgPSAodTggKilwdHJzW2ZhaWxhXTsKKwlwdHJzW2ZhaWxhXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHE7CisJcHRyc1tkaXNrcy0xXSA9IHE7CisKKwkvKiBOb3csIHBpY2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLworCXFtdWwgID0gcmFpZDZfdmdmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV1dOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJ2cGJyb2FkY2FzdGIgJTAsICUlem1tNyIgOiA6ICJtIiAoeDBmKSk7CisKKwl3aGlsZSAoYnl0ZXMpIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCWFzbSB2b2xhdGlsZSgidm1vdmRxYTY0ICUwLCAlJXptbTNcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUxLCAlJXptbThcblx0IgorCQkJICAgICAidnB4b3JxICUyLCAlJXptbTMsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJTMsICUlem1tOCwgJSV6bW04IgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcVswXSksICJtIiAoZHFbNjRdKSwgIm0iIChxWzBdKSwKKwkJCSAgICAgICAibSIgKHFbNjRdKSk7CisKKwkJLyoKKwkJICogMyA9IHFbMF0gXiBkcVswXQorCQkgKiA4ID0gcVs2NF0gXiBkcVs2NF0KKwkJICovCisJCWFzbSB2b2xhdGlsZSgidmJyb2FkY2FzdGk2NHgyICUwLCAlJXptbTBcblx0IgorCQkJICAgICAidm1vdmFwZCAlJXptbTAsICUlem1tMTNcblx0IgorCQkJICAgICAidmJyb2FkY2FzdGk2NHgyICUxLCAlJXptbTFcblx0IgorCQkJICAgICAidm1vdmFwZCAlJXptbTEsICUlem1tMTQiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKHFtdWxbMF0pLCAibSIgKHFtdWxbMTZdKSk7CisKKwkJYXNtIHZvbGF0aWxlKCJ2cHNyYXcgJDQsICUlem1tMywgJSV6bW02XG5cdCIKKwkJCSAgICAgInZwc3JhdyAkNCwgJSV6bW04LCAlJXptbTEyXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tMywgJSV6bW0zXG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tOCwgJSV6bW04XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tNiwgJSV6bW02XG5cdCIKKwkJCSAgICAgInZwYW5kcSAlJXptbTcsICUlem1tMTIsICUlem1tMTJcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTMsICUlem1tMCwgJSV6bW0wXG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW04LCAlJXptbTEzLCAlJXptbTEzXG5cdCIKKwkJCSAgICAgInZwc2h1ZmIgJSV6bW02LCAlJXptbTEsICUlem1tMVxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMTIsICUlem1tMTQsICUlem1tMTRcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMCwgJSV6bW0xLCAlJXptbTFcblx0IgorCQkJICAgICAidnB4b3JxICUlem1tMTMsICUlem1tMTQsICUlem1tMTQiCisJCQkgICAgIDoKKwkJCSAgICAgOiApOworCisJCS8qCisJCSAqIDEgID0gcW11bFtxWzBdICBeIGRxWzBdXQorCQkgKiAxNCA9IHFtdWxbcVs2NF0gXiBkcVs2NF1dCisJCSAqLworCQlhc20gdm9sYXRpbGUoInZtb3ZkcWE2NCAlMCwgJSV6bW0yXG5cdCIKKwkJCSAgICAgInZtb3ZkcWE2NCAlMSwgJSV6bW0xMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xLCAlJXptbTIsICUlem1tMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xNCwgJSV6bW0xMiwgJSV6bW0xMiIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocFswXSksICJtIiAocFs2NF0pKTsKKworCQkvKgorCQkgKiAyICA9IHBbMF0gIF4gcW11bFtxWzBdICBeIGRxWzBdXQorCQkgKiAxMiA9IHBbNjRdIF4gcW11bFtxWzY0XSBeIGRxWzY0XV0KKwkJICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJSV6bW0xLCAlMFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0xNCwgJTFcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tMiwgJTJcblx0IgorCQkJICAgICAidm1vdmRxYTY0ICUlem1tMTIsJTMiCisJCQkgICAgIDoKKwkJCSAgICAgOiAibSIgKGRxWzBdKSwgIm0iIChkcVs2NF0pLCAibSIgKHBbMF0pLAorCQkJICAgICAgICJtIiAocFs2NF0pKTsKKworCQlieXRlcyAtPSAxMjg7CisJCXAgKz0gMTI4OworCQlxICs9IDEyODsKKwkJZHEgKz0gMTI4OworI2Vsc2UKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cHhvcnEgJTEsICUlem1tMywgJSV6bW0zIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChkcVswXSksICJtIiAocVswXSkpOworCisJCS8qIDMgPSBxIF4gZHEgKi8KKworCQlhc20gdm9sYXRpbGUoInZicm9hZGNhc3RpNjR4MiAlMCwgJSV6bW0wXG5cdCIKKwkJCSAgICAgInZicm9hZGNhc3RpNjR4MiAlMSwgJSV6bW0xIgorCQkJICAgICA6CisJCQkgICAgIDogIm0iIChxbXVsWzBdKSwgIm0iIChxbXVsWzE2XSkpOworCisJCWFzbSB2b2xhdGlsZSgidnBzcmF3ICQ0LCAlJXptbTMsICUlem1tNlxuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTMsICUlem1tM1xuXHQiCisJCQkgICAgICJ2cGFuZHEgJSV6bW03LCAlJXptbTYsICUlem1tNlxuXHQiCisJCQkgICAgICJ2cHNodWZiICUlem1tMywgJSV6bW0wLCAlJXptbTBcblx0IgorCQkJICAgICAidnBzaHVmYiAlJXptbTYsICUlem1tMSwgJSV6bW0xXG5cdCIKKwkJCSAgICAgInZweG9ycSAlJXptbTAsICUlem1tMSwgJSV6bW0xIgorCQkJICAgICA6CisJCQkgICAgIDogKTsKKworCQkvKiAxID0gcW11bFtxIF4gZHFdICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJTAsICUlem1tMlxuXHQiCisJCQkgICAgICJ2cHhvcnEgJSV6bW0xLCAlJXptbTIsICUlem1tMiIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAocFswXSkpOworCisJCS8qIDIgPSBwIF4gcW11bFtxIF4gZHFdICovCisKKwkJYXNtIHZvbGF0aWxlKCJ2bW92ZHFhNjQgJSV6bW0xLCAlMFxuXHQiCisJCQkgICAgICJ2bW92ZHFhNjQgJSV6bW0yLCAlMSIKKwkJCSAgICAgOgorCQkJICAgICA6ICJtIiAoZHFbMF0pLCAibSIgKHBbMF0pKTsKKworCQlieXRlcyAtPSA2NDsKKwkJcCArPSA2NDsKKwkJcSArPSA2NDsKKwkJZHEgKz0gNjQ7CisjZW5kaWYKKwl9CisKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCitjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3ZfYXZ4NTEyID0geworCS5kYXRhMiA9IHJhaWQ2XzJkYXRhX3JlY292X2F2eDUxMiwKKwkuZGF0YXAgPSByYWlkNl9kYXRhcF9yZWNvdl9hdng1MTIsCisJLnZhbGlkID0gcmFpZDZfaGFzX2F2eDUxMiwKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLm5hbWUgPSAiYXZ4NTEyeDIiLAorI2Vsc2UKKwkubmFtZSA9ICJhdng1MTJ4MSIsCisjZW5kaWYKKwkucHJpb3JpdHkgPSAzLAorfTsKKworI2Vsc2UKKyN3YXJuaW5nICJ5b3VyIHZlcnNpb24gb2YgYmludXRpbHMgbGFja3MgQVZYNTEyIHN1cHBvcnQiCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X25lb24uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWI1YzQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvcmVjb3ZfbmVvbi5jCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgTGluYXJvIEx0ZC4gPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8YXNtL25lb24uaD4KKyNlbHNlCisjZGVmaW5lIGtlcm5lbF9uZW9uX2JlZ2luKCkKKyNkZWZpbmUga2VybmVsX25lb25fZW5kKCkKKyNkZWZpbmUgY3B1X2hhc19uZW9uKCkJCSgxKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcmFpZDZfaGFzX25lb24odm9pZCkKK3sKKwlyZXR1cm4gY3B1X2hhc19uZW9uKCk7Cit9CisKK3ZvaWQgX19yYWlkNl8yZGF0YV9yZWNvdl9uZW9uKGludCBieXRlcywgdWludDhfdCAqcCwgdWludDhfdCAqcSwgdWludDhfdCAqZHAsCisJCQkgICAgICB1aW50OF90ICpkcSwgY29uc3QgdWludDhfdCAqcGJtdWwsCisJCQkgICAgICBjb25zdCB1aW50OF90ICpxbXVsKTsKKwordm9pZCBfX3JhaWQ2X2RhdGFwX3JlY292X25lb24oaW50IGJ5dGVzLCB1aW50OF90ICpwLCB1aW50OF90ICpxLCB1aW50OF90ICpkcSwKKwkJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKnFtdWwpOworCitzdGF0aWMgdm9pZCByYWlkNl8yZGF0YV9yZWNvdl9uZW9uKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsCisJCWludCBmYWlsYiwgdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHAsICpkcTsKKwljb25zdCB1OCAqcGJtdWw7CS8qIFAgbXVsdGlwbGllciB0YWJsZSBmb3IgQiBkYXRhICovCisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKGZvciBib3RoKSAqLworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MgLSAyXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcyAtIDFdOworCisJLyoKKwkgKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlcworCSAqIFVzZSB0aGUgZGVhZCBkYXRhIHBhZ2VzIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvcgorCSAqIGRlbHRhIHAgYW5kIGRlbHRhIHEKKwkgKi8KKwlkcCA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcyAtIDJdID0gZHA7CisJZHEgPSAodTggKilwdHJzW2ZhaWxiXTsKKwlwdHJzW2ZhaWxiXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MgLSAxXSA9IGRxOworCisJcmFpZDZfY2FsbC5nZW5fc3luZHJvbWUoZGlza3MsIGJ5dGVzLCBwdHJzKTsKKworCS8qIFJlc3RvcmUgcG9pbnRlciB0YWJsZSAqLworCXB0cnNbZmFpbGFdICAgICA9IGRwOworCXB0cnNbZmFpbGJdICAgICA9IGRxOworCXB0cnNbZGlza3MgLSAyXSA9IHA7CisJcHRyc1tkaXNrcyAtIDFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcGJtdWwgPSByYWlkNl92Z2ZtdWxbcmFpZDZfZ2ZleGlbZmFpbGItZmFpbGFdXTsKKwlxbXVsICA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV0gXgorCQkJCQkgcmFpZDZfZ2ZleHBbZmFpbGJdXV07CisKKwlrZXJuZWxfbmVvbl9iZWdpbigpOworCV9fcmFpZDZfMmRhdGFfcmVjb3ZfbmVvbihieXRlcywgcCwgcSwgZHAsIGRxLCBwYm11bCwgcW11bCk7CisJa2VybmVsX25lb25fZW5kKCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X2RhdGFwX3JlY292X25lb24oaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHE7CisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKi8KKworCXAgPSAodTggKilwdHJzW2Rpc2tzIC0gMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MgLSAxXTsKKworCS8qCisJICogQ29tcHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZQorCSAqIFVzZSB0aGUgZGVhZCBkYXRhIHBhZ2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGRlbHRhIHEKKwkgKi8KKwlkcSA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcyAtIDFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICAgID0gZHE7CisJcHRyc1tkaXNrcyAtIDFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcW11bCA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV1dXTsKKworCWtlcm5lbF9uZW9uX2JlZ2luKCk7CisJX19yYWlkNl9kYXRhcF9yZWNvdl9uZW9uKGJ5dGVzLCBwLCBxLCBkcSwgcW11bCk7CisJa2VybmVsX25lb25fZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyByYWlkNl9yZWNvdl9uZW9uID0geworCS5kYXRhMgkJPSByYWlkNl8yZGF0YV9yZWNvdl9uZW9uLAorCS5kYXRhcAkJPSByYWlkNl9kYXRhcF9yZWNvdl9uZW9uLAorCS52YWxpZAkJPSByYWlkNl9oYXNfbmVvbiwKKwkubmFtZQkJPSAibmVvbiIsCisJLnByaW9yaXR5CT0gMTAsCit9OwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvcmVjb3ZfbmVvbl9pbm5lci5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvcmVjb3ZfbmVvbl9pbm5lci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMDBjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdl9uZW9uX2lubmVyLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgSW50ZWwgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoQykgMjAxNyBMaW5hcm8gTHRkLiA8YXJkLmJpZXNoZXV2ZWxAbGluYXJvLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IHZlcnNpb24gMgorICogb2YgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKyNpZmRlZiBDT05GSUdfQVJNCisvKgorICogQUFyY2gzMiBkb2VzIG5vdCBwcm92aWRlIHRoaXMgaW50cmluc2ljIG5hdGl2ZWx5IGJlY2F1c2UgaXQgZG9lcyBub3QKKyAqIGltcGxlbWVudCB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbi4gQUFyY2gzMiBvbmx5IHByb3ZpZGVzIGEgNjQtYml0CisgKiB3aWRlIHZ0YmwuOCBpbnN0cnVjdGlvbiwgc28gdXNlIHRoYXQgaW5zdGVhZC4KKyAqLworc3RhdGljIHVpbnQ4eDE2X3QgdnF0YmwxcV91OCh1aW50OHgxNl90IGEsIHVpbnQ4eDE2X3QgYikKK3sKKwl1bmlvbiB7CisJCXVpbnQ4eDE2X3QJdmFsOworCQl1aW50OHg4eDJfdAlwYWlyOworCX0gX19hID0geyBhIH07CisKKwlyZXR1cm4gdmNvbWJpbmVfdTgodnRibDJfdTgoX19hLnBhaXIsIHZnZXRfbG93X3U4KGIpKSwKKwkJCSAgIHZ0YmwyX3U4KF9fYS5wYWlyLCB2Z2V0X2hpZ2hfdTgoYikpKTsKK30KKyNlbmRpZgorCit2b2lkIF9fcmFpZDZfMmRhdGFfcmVjb3ZfbmVvbihpbnQgYnl0ZXMsIHVpbnQ4X3QgKnAsIHVpbnQ4X3QgKnEsIHVpbnQ4X3QgKmRwLAorCQkJICAgICAgdWludDhfdCAqZHEsIGNvbnN0IHVpbnQ4X3QgKnBibXVsLAorCQkJICAgICAgY29uc3QgdWludDhfdCAqcW11bCkKK3sKKwl1aW50OHgxNl90IHBtMCA9IHZsZDFxX3U4KHBibXVsKTsKKwl1aW50OHgxNl90IHBtMSA9IHZsZDFxX3U4KHBibXVsICsgMTYpOworCXVpbnQ4eDE2X3QgcW0wID0gdmxkMXFfdTgocW11bCk7CisJdWludDh4MTZfdCBxbTEgPSB2bGQxcV91OChxbXVsICsgMTYpOworCXVpbnQ4eDE2X3QgeDBmID0gdmR1cHFfbl91OCgweDBmKTsKKworCS8qCisJICogd2hpbGUgKCBieXRlcy0tICkgeworCSAqCXVpbnQ4X3QgcHgsIHF4LCBkYjsKKwkgKgorCSAqCXB4ICAgID0gKnAgXiAqZHA7CisJICoJcXggICAgPSBxbXVsWypxIF4gKmRxXTsKKwkgKgkqZHErKyA9IGRiID0gcGJtdWxbcHhdIF4gcXg7CisJICoJKmRwKysgPSBkYiBeIHB4OworCSAqCXArKzsgcSsrOworCSAqIH0KKwkgKi8KKworCXdoaWxlIChieXRlcykgeworCQl1aW50OHgxNl90IHZ4LCB2eSwgcHgsIHF4LCBkYjsKKworCQlweCA9IHZlb3JxX3U4KHZsZDFxX3U4KHApLCB2bGQxcV91OChkcCkpOworCQl2eCA9IHZlb3JxX3U4KHZsZDFxX3U4KHEpLCB2bGQxcV91OChkcSkpOworCisJCXZ5ID0gKHVpbnQ4eDE2X3QpdnNocnFfbl9zMTYoKGludDE2eDhfdCl2eCwgNCk7CisJCXZ4ID0gdnF0YmwxcV91OChxbTAsIHZhbmRxX3U4KHZ4LCB4MGYpKTsKKwkJdnkgPSB2cXRibDFxX3U4KHFtMSwgdmFuZHFfdTgodnksIHgwZikpOworCQlxeCA9IHZlb3JxX3U4KHZ4LCB2eSk7CisKKwkJdnkgPSAodWludDh4MTZfdCl2c2hycV9uX3MxNigoaW50MTZ4OF90KXB4LCA0KTsKKwkJdnggPSB2cXRibDFxX3U4KHBtMCwgdmFuZHFfdTgocHgsIHgwZikpOworCQl2eSA9IHZxdGJsMXFfdTgocG0xLCB2YW5kcV91OCh2eSwgeDBmKSk7CisJCXZ4ID0gdmVvcnFfdTgodngsIHZ5KTsKKwkJZGIgPSB2ZW9ycV91OCh2eCwgcXgpOworCisJCXZzdDFxX3U4KGRxLCBkYik7CisJCXZzdDFxX3U4KGRwLCB2ZW9ycV91OChkYiwgcHgpKTsKKworCQlieXRlcyAtPSAxNjsKKwkJcCArPSAxNjsKKwkJcSArPSAxNjsKKwkJZHAgKz0gMTY7CisJCWRxICs9IDE2OworCX0KK30KKwordm9pZCBfX3JhaWQ2X2RhdGFwX3JlY292X25lb24oaW50IGJ5dGVzLCB1aW50OF90ICpwLCB1aW50OF90ICpxLCB1aW50OF90ICpkcSwKKwkJCSAgICAgIGNvbnN0IHVpbnQ4X3QgKnFtdWwpCit7CisJdWludDh4MTZfdCBxbTAgPSB2bGQxcV91OChxbXVsKTsKKwl1aW50OHgxNl90IHFtMSA9IHZsZDFxX3U4KHFtdWwgKyAxNik7CisJdWludDh4MTZfdCB4MGYgPSB2ZHVwcV9uX3U4KDB4MGYpOworCisJLyoKKwkgKiB3aGlsZSAoYnl0ZXMtLSkgeworCSAqCSpwKysgXj0gKmRxID0gcW11bFsqcSBeICpkcV07CisJICoJcSsrOyBkcSsrOworCSAqIH0KKwkgKi8KKworCXdoaWxlIChieXRlcykgeworCQl1aW50OHgxNl90IHZ4LCB2eTsKKworCQl2eCA9IHZlb3JxX3U4KHZsZDFxX3U4KHEpLCB2bGQxcV91OChkcSkpOworCisJCXZ5ID0gKHVpbnQ4eDE2X3QpdnNocnFfbl9zMTYoKGludDE2eDhfdCl2eCwgNCk7CisJCXZ4ID0gdnF0YmwxcV91OChxbTAsIHZhbmRxX3U4KHZ4LCB4MGYpKTsKKwkJdnkgPSB2cXRibDFxX3U4KHFtMSwgdmFuZHFfdTgodnksIHgwZikpOworCQl2eCA9IHZlb3JxX3U4KHZ4LCB2eSk7CisJCXZ5ID0gdmVvcnFfdTgodngsIHZsZDFxX3U4KHApKTsKKworCQl2c3QxcV91OChkcSwgdngpOworCQl2c3QxcV91OChwLCB2eSk7CisKKwkJYnl0ZXMgLT0gMTY7CisJCXAgKz0gMTY7CisJCXEgKz0gMTY7CisJCWRxICs9IDE2OworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvcmVjb3ZfczM5MHhjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5ZWVjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X3MzOTB4Yy5jCkBAIC0wLDAgKzEsMTE3IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIFJBSUQtNiBkYXRhIHJlY292ZXJ5IGluIGR1YWwgZmFpbHVyZSBtb2RlIGJhc2VkIG9uIHRoZSBYQyBpbnN0cnVjdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMTYKKyAqIEF1dGhvcihzKTogTWFydGluIFNjaHdpZGVmc2t5IDxzY2h3aWRlZnNreUBkZS5pYm0uY29tPgorICovCisKKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4b3JfYmxvY2sodTggKnAxLCB1OCAqcDIpCit7CisJdHlwZWRlZiBzdHJ1Y3QgeyB1OCBfWzI1Nl07IH0gYWRkcnR5cGU7CisKKwlhc20gdm9sYXRpbGUoCisJCSIJeGMJMCgyNTYsJVtwMV0pLDAoJVtwMl0pXG4iCisJCTogIittIiAoKihhZGRydHlwZSAqKSBwMSkgOiAibSIgKCooYWRkcnR5cGUgKikgcDIpLAorCQkgIFtwMV0gImEiIChwMSksIFtwMl0gImEiIChwMikgOiAiY2MiKTsKK30KKworLyogUmVjb3ZlciB0d28gZmFpbGVkIGRhdGEgYmxvY2tzLiAqLworc3RhdGljIHZvaWQgcmFpZDZfMmRhdGFfcmVjb3ZfczM5MHhjKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsCisJCWludCBmYWlsYiwgdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHAsICpkcTsKKwljb25zdCB1OCAqcGJtdWw7CS8qIFAgbXVsdGlwbGllciB0YWJsZSBmb3IgQiBkYXRhICovCisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKGZvciBib3RoKSAqLworCWludCBpOworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlcworCSAgIFVzZSB0aGUgZGVhZCBkYXRhIHBhZ2VzIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvcgorCSAgIGRlbHRhIHAgYW5kIGRlbHRhIHEgKi8KKwlkcCA9ICh1OCAqKXB0cnNbZmFpbGFdOworCXB0cnNbZmFpbGFdID0gKHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7CisJcHRyc1tkaXNrcy0yXSA9IGRwOworCWRxID0gKHU4ICopcHRyc1tmYWlsYl07CisJcHRyc1tmYWlsYl0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRwOworCXB0cnNbZmFpbGJdICAgPSBkcTsKKwlwdHJzW2Rpc2tzLTJdID0gcDsKKwlwdHJzW2Rpc2tzLTFdID0gcTsKKworCS8qIE5vdywgcGljayB0aGUgcHJvcGVyIGRhdGEgdGFibGVzICovCisJcGJtdWwgPSByYWlkNl9nZm11bFtyYWlkNl9nZmV4aVtmYWlsYi1mYWlsYV1dOworCXFtdWwgID0gcmFpZDZfZ2ZtdWxbcmFpZDZfZ2ZpbnZbcmFpZDZfZ2ZleHBbZmFpbGFdXnJhaWQ2X2dmZXhwW2ZhaWxiXV1dOworCisJLyogTm93IGRvIGl0Li4uICovCisJd2hpbGUgKGJ5dGVzKSB7CisJCXhvcl9ibG9jayhkcCwgcCk7CisJCXhvcl9ibG9jayhkcSwgcSk7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCWRxW2ldID0gcGJtdWxbZHBbaV1dIF4gcW11bFtkcVtpXV07CisJCXhvcl9ibG9jayhkcCwgZHEpOworCQlwICs9IDI1NjsKKwkJcSArPSAyNTY7CisJCWRwICs9IDI1NjsKKwkJZHEgKz0gMjU2OworCQlieXRlcyAtPSAyNTY7CisJfQorfQorCisvKiBSZWNvdmVyIGZhaWx1cmUgb2Ygb25lIGRhdGEgYmxvY2sgcGx1cyB0aGUgUCBibG9jayAqLworc3RhdGljIHZvaWQgcmFpZDZfZGF0YXBfcmVjb3ZfczM5MHhjKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsCisJCXZvaWQgKipwdHJzKQoreworCXU4ICpwLCAqcSwgKmRxOworCWNvbnN0IHU4ICpxbXVsOwkJLyogUSBtdWx0aXBsaWVyIHRhYmxlICovCisJaW50IGk7CisKKwlwID0gKHU4ICopcHRyc1tkaXNrcy0yXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcy0xXTsKKworCS8qIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2UKKwkgICBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBkZWx0YSBxICovCisJZHEgPSAodTggKilwdHJzW2ZhaWxhXTsKKwlwdHJzW2ZhaWxhXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHE7CisJcHRyc1tkaXNrcy0xXSA9IHE7CisKKwkvKiBOb3csIHBpY2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLworCXFtdWwgID0gcmFpZDZfZ2ZtdWxbcmFpZDZfZ2ZpbnZbcmFpZDZfZ2ZleHBbZmFpbGFdXV07CisKKwkvKiBOb3cgZG8gaXQuLi4gKi8KKwl3aGlsZSAoYnl0ZXMpIHsKKwkJeG9yX2Jsb2NrKGRxLCBxKTsKKwkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKQorCQkJZHFbaV0gPSBxbXVsW2RxW2ldXTsKKwkJeG9yX2Jsb2NrKHAsIGRxKTsKKwkJcCArPSAyNTY7CisJCXEgKz0gMjU2OworCQlkcSArPSAyNTY7CisJCWJ5dGVzIC09IDI1NjsKKwl9Cit9CisKKworY29uc3Qgc3RydWN0IHJhaWQ2X3JlY292X2NhbGxzIHJhaWQ2X3JlY292X3MzOTB4YyA9IHsKKwkuZGF0YTIgPSByYWlkNl8yZGF0YV9yZWNvdl9zMzkweGMsCisJLmRhdGFwID0gcmFpZDZfZGF0YXBfcmVjb3ZfczM5MHhjLAorCS52YWxpZCA9IE5VTEwsCisJLm5hbWUgPSAiczM5MHhjIiwKKwkucHJpb3JpdHkgPSAxLAorfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3JlY292X3Nzc2UzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdl9zc3NlMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYTMzZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9yZWNvdl9zc3NlMy5jCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIEludGVsIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIKKyAqIG9mIHRoZSBMaWNlbnNlLgorICovCisKKyNpZmRlZiBDT05GSUdfQVNfU1NTRTMKKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKyNpbmNsdWRlICJ4ODYuaCIKKworc3RhdGljIGludCByYWlkNl9oYXNfc3NzZTModm9pZCkKK3sKKwlyZXR1cm4gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTSkgJiYKKwkJYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTTIpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9TU1NFMyk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2XzJkYXRhX3JlY292X3Nzc2UzKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCBpbnQgZmFpbGEsCisJCWludCBmYWlsYiwgdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHAsICpkcTsKKwljb25zdCB1OCAqcGJtdWw7CS8qIFAgbXVsdGlwbGllciB0YWJsZSBmb3IgQiBkYXRhICovCisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKGZvciBib3RoKSAqLworCXN0YXRpYyBjb25zdCB1OCBfX2FsaWduZWQoMTYpIHgwZlsxNl0gPSB7CisJCSAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorCQkgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZn07CisKKwlwID0gKHU4ICopcHRyc1tkaXNrcy0yXTsKKwlxID0gKHU4ICopcHRyc1tkaXNrcy0xXTsKKworCS8qIENvbXB1dGUgc3luZHJvbWUgd2l0aCB6ZXJvIGZvciB0aGUgbWlzc2luZyBkYXRhIHBhZ2VzCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZXMgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yCisJICAgZGVsdGEgcCBhbmQgZGVsdGEgcSAqLworCWRwID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTJdID0gZHA7CisJZHEgPSAodTggKilwdHJzW2ZhaWxiXTsKKwlwdHJzW2ZhaWxiXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdlOworCXB0cnNbZGlza3MtMV0gPSBkcTsKKworCXJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tzLCBieXRlcywgcHRycyk7CisKKwkvKiBSZXN0b3JlIHBvaW50ZXIgdGFibGUgKi8KKwlwdHJzW2ZhaWxhXSAgID0gZHA7CisJcHRyc1tmYWlsYl0gICA9IGRxOworCXB0cnNbZGlza3MtMl0gPSBwOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlwYm11bCA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmV4aVtmYWlsYi1mYWlsYV1dOworCXFtdWwgID0gcmFpZDZfdmdmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXSBeCisJCXJhaWQ2X2dmZXhwW2ZhaWxiXV1dOworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW03IiA6IDogIm0iICh4MGZbMF0pKTsKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTYiIDogOiAibSIgKHFtdWxbMF0pKTsKKwlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTE0IiA6IDogIm0iIChwYm11bFswXSkpOworCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMTUiIDogOiAibSIgKHBibXVsWzE2XSkpOworI2VuZGlmCisKKwkvKiBOb3cgZG8gaXQuLi4gKi8KKwl3aGlsZSAoYnl0ZXMpIHsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJCS8qIHhtbTYsIHhtbTE0LCB4bW0xNSAqLworCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMSIgOiA6ICJtIiAocVswXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTkiIDogOiAibSIgKHFbMTZdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMCIgOiA6ICJtIiAocFswXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTgiIDogOiAibSIgKHBbMTZdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAgICUwLCUleG1tMSIgOiA6ICJtIiAoZHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICAgJTAsJSV4bW05IiA6IDogIm0iIChkcVsxNl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICAgJTAsJSV4bW0wIiA6IDogIm0iIChkcFswXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAlMCwlJXhtbTgiIDogOiAibSIgKGRwWzE2XSkpOworCisJCS8qIHhtbTAvOCA9IHB4ICovCisKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTYsJXhtbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW01IiA6IDogIm0iIChxbXVsWzE2XSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tNiwleG1tMTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTUsJXhtbTEzIik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICV4bW0xLCV4bW0zIik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICV4bW05LCV4bW0xMSIpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMCwleG1tMiIpOyAvKiB4bW0yLzEwID0gcHggKi8KKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTgsJXhtbTEwIik7CisJCWFzbSB2b2xhdGlsZSgicHNyYXcgICQ0LCV4bW0xIik7CisJCWFzbSB2b2xhdGlsZSgicHNyYXcgICQ0LCV4bW05Iik7CisJCWFzbSB2b2xhdGlsZSgicGFuZCAgICV4bW03LCV4bW0zIik7CisJCWFzbSB2b2xhdGlsZSgicGFuZCAgICV4bW03LCV4bW0xMSIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgICAleG1tNywleG1tMSIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgICAleG1tNywleG1tOSIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tMywleG1tNCIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tMTEsJXhtbTEyIik7CisJCWFzbSB2b2xhdGlsZSgicHNodWZiICV4bW0xLCV4bW01Iik7CisJCWFzbSB2b2xhdGlsZSgicHNodWZiICV4bW05LCV4bW0xMyIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAleG1tNCwleG1tNSIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAleG1tMTIsJXhtbTEzIik7CisKKwkJLyogeG1tNS8xMyA9IHF4ICovCisKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTE0LCV4bW00Iik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICV4bW0xNSwleG1tMSIpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMTQsJXhtbTEyIik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICV4bW0xNSwleG1tOSIpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMiwleG1tMyIpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMTAsJXhtbTExIik7CisJCWFzbSB2b2xhdGlsZSgicHNyYXcgICQ0LCV4bW0yIik7CisJCWFzbSB2b2xhdGlsZSgicHNyYXcgICQ0LCV4bW0xMCIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgICAleG1tNywleG1tMyIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgICAleG1tNywleG1tMTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICAgJXhtbTcsJXhtbTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICAgJXhtbTcsJXhtbTEwIik7CisJCWFzbSB2b2xhdGlsZSgicHNodWZiICV4bW0zLCV4bW00Iik7CisJCWFzbSB2b2xhdGlsZSgicHNodWZiICV4bW0xMSwleG1tMTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJwc2h1ZmIgJXhtbTIsJXhtbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJwc2h1ZmIgJXhtbTEwLCV4bW05Iik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAgICV4bW00LCV4bW0xIik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAgICV4bW0xMiwleG1tOSIpOworCisJCS8qIHhtbTEvOSA9IHBibXVsW3B4XSAqLworCQlhc20gdm9sYXRpbGUoInB4b3IgICAleG1tNSwleG1tMSIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAleG1tMTMsJXhtbTkiKTsKKwkJLyogeG1tMS85ID0gZGIgPSBEUSAqLworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlJXhtbTEsJTAiIDogIj1tIiAoZHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJSV4bW05LCUwIiA6ICI9bSIgKGRxWzE2XSkpOworCisJCWFzbSB2b2xhdGlsZSgicHhvciAgICV4bW0xLCV4bW0wIik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAgICV4bW05LCV4bW04Iik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tMCwlMCIgOiAiPW0iIChkcFswXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlJXhtbTgsJTAiIDogIj1tIiAoZHBbMTZdKSk7CisKKwkJYnl0ZXMgLT0gMzI7CisJCXAgKz0gMzI7CisJCXEgKz0gMzI7CisJCWRwICs9IDMyOworCQlkcSArPSAzMjsKKyNlbHNlCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMSIgOiA6ICJtIiAoKnEpKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0wIiA6IDogIm0iICgqcCkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAlMCwlJXhtbTEiIDogOiAibSIgKCpkcSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAlMCwlJXhtbTAiIDogOiAibSIgKCpkcCkpOworCisJCS8qIDEgPSBkcSBeIHEKKwkJICogMCA9IGRwIF4gcAorCQkgKi8KKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW00IiA6IDogIm0iIChxbXVsWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNSIgOiA6ICJtIiAocW11bFsxNl0pKTsKKworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMSwleG1tMyIpOworCQlhc20gdm9sYXRpbGUoInBzcmF3ICAkNCwleG1tMSIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgICAleG1tNywleG1tMyIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgICAleG1tNywleG1tMSIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tMywleG1tNCIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tMSwleG1tNSIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgICAleG1tNCwleG1tNSIpOworCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICV4bW0wLCV4bW0yIik7IC8qIHhtbTIgPSBweCAqLworCisJCS8qIHhtbTUgPSBxeCAqLworCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNCIgOiA6ICJtIiAocGJtdWxbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0xIiA6IDogIm0iIChwYm11bFsxNl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTIsJXhtbTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJwc3JhdyAgJDQsJXhtbTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICAgJXhtbTcsJXhtbTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICAgJXhtbTcsJXhtbTIiKTsKKwkJYXNtIHZvbGF0aWxlKCJwc2h1ZmIgJXhtbTMsJXhtbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJwc2h1ZmIgJXhtbTIsJXhtbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICAgJXhtbTQsJXhtbTEiKTsKKworCQkvKiB4bW0xID0gcGJtdWxbcHhdICovCisJCWFzbSB2b2xhdGlsZSgicHhvciAgICV4bW01LCV4bW0xIik7CisJCS8qIHhtbTEgPSBkYiA9IERRICovCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tMSwlMCIgOiAiPW0iICgqZHEpKTsKKworCQlhc20gdm9sYXRpbGUoInB4b3IgICAleG1tMSwleG1tMCIpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlJXhtbTAsJTAiIDogIj1tIiAoKmRwKSk7CisKKwkJYnl0ZXMgLT0gMTY7CisJCXAgKz0gMTY7CisJCXEgKz0gMTY7CisJCWRwICs9IDE2OworCQlkcSArPSAxNjsKKyNlbmRpZgorCX0KKworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKworc3RhdGljIHZvaWQgcmFpZDZfZGF0YXBfcmVjb3Zfc3NzZTMoaW50IGRpc2tzLCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKKwkJdm9pZCAqKnB0cnMpCit7CisJdTggKnAsICpxLCAqZHE7CisJY29uc3QgdTggKnFtdWw7CQkvKiBRIG11bHRpcGxpZXIgdGFibGUgKi8KKwlzdGF0aWMgY29uc3QgdTggX19hbGlnbmVkKDE2KSB4MGZbMTZdID0geworCQkgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwKKwkJIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGZ9OworCisJcCA9ICh1OCAqKXB0cnNbZGlza3MtMl07CisJcSA9ICh1OCAqKXB0cnNbZGlza3MtMV07CisKKwkvKiBDb21wdXRlIHN5bmRyb21lIHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlCisJICAgVXNlIHRoZSBkZWFkIGRhdGEgcGFnZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGVsdGEgcSAqLworCWRxID0gKHU4ICopcHRyc1tmYWlsYV07CisJcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2X2VtcHR5X3plcm9fcGFnZTsKKwlwdHJzW2Rpc2tzLTFdID0gZHE7CisKKwlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOworCisJLyogUmVzdG9yZSBwb2ludGVyIHRhYmxlICovCisJcHRyc1tmYWlsYV0gICA9IGRxOworCXB0cnNbZGlza3MtMV0gPSBxOworCisJLyogTm93LCBwaWNrIHRoZSBwcm9wZXIgZGF0YSB0YWJsZXMgKi8KKwlxbXVsICA9IHJhaWQ2X3ZnZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV1dXTsKKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCAlJXhtbTciIDogOiAibSIgKHgwZlswXSkpOworCisJd2hpbGUgKGJ5dGVzKSB7CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwgJSV4bW0zIiA6IDogIm0iIChkcVswXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwgJSV4bW00IiA6IDogIm0iIChkcVsxNl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICUwLCAlJXhtbTMiIDogOiAibSIgKHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsICUleG1tMCIgOiA6ICJtIiAocW11bFswXSkpOworCisJCS8qIHhtbTMgPSBxWzBdIF4gZHFbMF0gKi8KKworCQlhc20gdm9sYXRpbGUoInB4b3IgJTAsICUleG1tNCIgOiA6ICJtIiAocVsxNl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsICUleG1tMSIgOiA6ICJtIiAocW11bFsxNl0pKTsKKworCQkvKiB4bW00ID0gcVsxNl0gXiBkcVsxNl0gKi8KKworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMywgJXhtbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTQsICV4bW04Iik7CisKKwkJLyogeG1tNCA9IHhtbTggPSBxWzE2XSBeIGRxWzE2XSAqLworCisJCWFzbSB2b2xhdGlsZSgicHNyYXcgJDQsICV4bW0zIik7CisJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tNywgJXhtbTYiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW03LCAleG1tMyIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tNiwgJXhtbTAiKTsKKwkJYXNtIHZvbGF0aWxlKCJwc2h1ZmIgJXhtbTMsICV4bW0xIik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCAlJXhtbTEwIiA6IDogIm0iIChxbXVsWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMCwgJXhtbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsICUleG1tMTEiIDogOiAibSIgKHFtdWxbMTZdKSk7CisKKwkJLyogeG1tMSA9IHFtdWxbcVswXSBeIGRxWzBdXSAqLworCisJCWFzbSB2b2xhdGlsZSgicHNyYXcgJDQsICV4bW00Iik7CisJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tNywgJXhtbTgiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW03LCAleG1tNCIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tOCwgJXhtbTEwIik7CisJCWFzbSB2b2xhdGlsZSgicHNodWZiICV4bW00LCAleG1tMTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsICUleG1tMiIgOiA6ICJtIiAocFswXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEwLCAleG1tMTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsICUleG1tMTIiIDogOiAibSIgKHBbMTZdKSk7CisKKwkJLyogeG1tMTEgPSBxbXVsW3FbMTZdIF4gZHFbMTZdXSAqLworCisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMSwgJXhtbTIiKTsKKworCQkvKiB4bW0yID0gcFswXSBeIHFtdWxbcVswXSBeIGRxWzBdXSAqLworCisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTEsICV4bW0xMiIpOworCisJCS8qIHhtbTEyID0gcFsxNl0gXiBxbXVsW3FbMTZdIF4gZHFbMTZdXSAqLworCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tMSwgJTAiIDogIj1tIiAoZHFbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJSV4bW0xMSwgJTAiIDogIj1tIiAoZHFbMTZdKSk7CisKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJSV4bW0yLCAlMCIgOiAiPW0iIChwWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tMTIsICUwIiA6ICI9bSIgKHBbMTZdKSk7CisKKwkJYnl0ZXMgLT0gMzI7CisJCXAgKz0gMzI7CisJCXEgKz0gMzI7CisJCWRxICs9IDMyOworCisjZWxzZQorCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwgJSV4bW0zIiA6IDogIm0iIChkcVswXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwgJSV4bW0wIiA6IDogIm0iIChxbXVsWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAlMCwgJSV4bW0zIiA6IDogIm0iIChxWzBdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCAlJXhtbTEiIDogOiAibSIgKHFtdWxbMTZdKSk7CisKKwkJLyogeG1tMyA9ICpxIF4gKmRxICovCisKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTMsICV4bW02Iik7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCAlJXhtbTIiIDogOiAibSIgKHBbMF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJwc3JhdyAkNCwgJXhtbTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW03LCAleG1tNiIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTcsICV4bW0zIik7CisJCWFzbSB2b2xhdGlsZSgicHNodWZiICV4bW02LCAleG1tMCIpOworCQlhc20gdm9sYXRpbGUoInBzaHVmYiAleG1tMywgJXhtbTEiKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0wLCAleG1tMSIpOworCisJCS8qIHhtbTEgPSBxbXVsWypxIF4gKmRxICovCisKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xLCAleG1tMiIpOworCisJCS8qIHhtbTIgPSAqcCBeIHFtdWxbKnEgXiAqZHFdICovCisKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJSV4bW0xLCAlMCIgOiAiPW0iIChkcVswXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlJXhtbTIsICUwIiA6ICI9bSIgKHBbMF0pKTsKKworCQlieXRlcyAtPSAxNjsKKwkJcCArPSAxNjsKKwkJcSArPSAxNjsKKwkJZHEgKz0gMTY7CisjZW5kaWYKKwl9CisKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCitjb25zdCBzdHJ1Y3QgcmFpZDZfcmVjb3ZfY2FsbHMgcmFpZDZfcmVjb3Zfc3NzZTMgPSB7CisJLmRhdGEyID0gcmFpZDZfMmRhdGFfcmVjb3Zfc3NzZTMsCisJLmRhdGFwID0gcmFpZDZfZGF0YXBfcmVjb3Zfc3NzZTMsCisJLnZhbGlkID0gcmFpZDZfaGFzX3Nzc2UzLAorI2lmZGVmIENPTkZJR19YODZfNjQKKwkubmFtZSA9ICJzc3NlM3gyIiwKKyNlbHNlCisJLm5hbWUgPSAic3NzZTN4MSIsCisjZW5kaWYKKwkucHJpb3JpdHkgPSAxLAorfTsKKworI2Vsc2UKKyN3YXJuaW5nICJ5b3VyIHZlcnNpb24gb2YgYmludXRpbHMgbGFja3MgU1NTRTMgc3VwcG9ydCIKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvczM5MHZ4LnVjIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvczM5MHZ4LnVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MGZhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9zMzkwdngudWMKQEAgLTAsMCArMSwxNjkgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogcmFpZDZfdngkIy5jCisgKgorICogJCMtd2F5IHVucm9sbGVkIFJBSUQ2IGdlbi94b3IgZnVuY3Rpb25zIGZvciBzMzkwCisgKiBiYXNlZCBvbiB0aGUgdmVjdG9yIGZhY2lsaXR5CisgKgorICogQ29weXJpZ2h0IElCTSBDb3JwLiAyMDE2CisgKiBBdXRob3Iocyk6IE1hcnRpbiBTY2h3aWRlZnNreSA8c2Nod2lkZWZza3lAZGUuaWJtLmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcG9zdHByb2Nlc3NlZCB1c2luZyB1bnJvbGwuYXdrLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisjaW5jbHVkZSA8YXNtL2ZwdS9hcGkuaD4KKworYXNtKCIuaW5jbHVkZSBcImFzbS92eC1pbnNuLmhcIlxuIik7CisKKyNkZWZpbmUgTlNJWkUgMTYKKworc3RhdGljIGlubGluZSB2b2lkIExPQURfQ09OU1Qodm9pZCkKK3sKKwlhc20gdm9sYXRpbGUoIlZSRVBJQiAldjI0LDciKTsKKwlhc20gdm9sYXRpbGUoIlZSRVBJQiAldjI1LDB4MWQiKTsKK30KKworLyoKKyAqIFRoZSBTSExCWVRFKCkgb3BlcmF0aW9uIHNoaWZ0cyBlYWNoIG9mIHRoZSAxNiBieXRlcyBpbgorICogdmVjdG9yIHJlZ2lzdGVyIHkgbGVmdCBieSAxIGJpdCBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4KKyAqIHZlY3RvciByZWdpc3RlciB4LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgU0hMQllURShpbnQgeCwgaW50IHkpCit7CisJYXNtIHZvbGF0aWxlICgiVkFCICUwLCUxLCUxIiA6IDogImkiICh4KSwgImkiICh5KSk7Cit9CisKKy8qCisgKiBGb3IgZWFjaCBvZiB0aGUgMTYgYnl0ZXMgaW4gdGhlIHZlY3RvciByZWdpc3RlciB5IHRoZSBNQVNLKCkKKyAqIG9wZXJhdGlvbiByZXR1cm5zIDB4RkYgaWYgdGhlIGhpZ2ggYml0IG9mIHRoZSBieXRlIGlzIDEsCisgKiBvciAweDAwIGlmIHRoZSBoaWdoIGJpdCBpcyAwLiBUaGUgcmVzdWx0IGlzIHN0b3JlZCBpbiB2ZWN0b3IKKyAqIHJlZ2lzdGVyIHguCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBNQVNLKGludCB4LCBpbnQgeSkKK3sKKwlhc20gdm9sYXRpbGUgKCJWRVNSQVZCCSUwLCUxLDI0IiA6IDogImkiICh4KSwgImkiICh5KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBBTkQoaW50IHgsIGludCB5LCBpbnQgeikKK3sKKwlhc20gdm9sYXRpbGUgKCJWTiAlMCwlMSwlMiIgOiA6ICJpIiAoeCksICJpIiAoeSksICJpIiAoeikpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgWE9SKGludCB4LCBpbnQgeSwgaW50IHopCit7CisJYXNtIHZvbGF0aWxlICgiVlggJTAsJTEsJTIiIDogOiAiaSIgKHgpLCAiaSIgKHkpLCAiaSIgKHopKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIExPQURfREFUQShpbnQgeCwgaW50IG4sIHU4ICpwdHIpCit7CisJdHlwZWRlZiBzdHJ1Y3QgeyB1OCBfWzE2Km5dOyB9IGFkZHJ0eXBlOworCXJlZ2lzdGVyIGFkZHJ0eXBlICpfX3B0ciBhc20oIjEiKSA9IChhZGRydHlwZSAqKSBwdHI7CisKKwlhc20gdm9sYXRpbGUgKCJWTE0gJTIsJTMsMCwlcjEiCisJCSAgICAgIDogOiAibSIgKCpfX3B0ciksICJhIiAoX19wdHIpLCAiaSIgKHgpLCAiaSIgKHggKyBuIC0gMSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgU1RPUkVfREFUQShpbnQgeCwgaW50IG4sIHU4ICpwdHIpCit7CisJdHlwZWRlZiBzdHJ1Y3QgeyB1OCBfWzE2Km5dOyB9IGFkZHJ0eXBlOworCXJlZ2lzdGVyIGFkZHJ0eXBlICpfX3B0ciBhc20oIjEiKSA9IChhZGRydHlwZSAqKSBwdHI7CisKKwlhc20gdm9sYXRpbGUgKCJWU1RNICUyLCUzLDAsMSIKKwkJICAgICAgOiAiPW0iICgqX19wdHIpIDogImEiIChfX3B0ciksICJpIiAoeCksICJpIiAoeCArIG4gLSAxKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBDT1BZX1ZFQyhpbnQgeCwgaW50IHkpCit7CisJYXNtIHZvbGF0aWxlICgiVkxSICUwLCUxIiA6IDogImkiICh4KSwgImkiICh5KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaWQ2X3MzOTB2eCQjX2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJc3RydWN0IGtlcm5lbF9mcHUgdnhzdGF0ZTsKKwl1OCAqKmRwdHIsICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwlrZXJuZWxfZnB1X2JlZ2luKCZ2eHN0YXRlLCBLRVJORUxfVlhSKTsKKwlMT0FEX0NPTlNUKCk7CisKKwlkcHRyID0gKHU4ICoqKSBwdHJzOworCXowID0gZGlza3MgLSAzOwkJLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCArIDFdOwkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbejAgKyAyXTsJLyogUlMgc3luZHJvbWUgKi8KKworCWZvciAoZCA9IDA7IGQgPCBieXRlczsgZCArPSAkIypOU0laRSkgeworCQlMT0FEX0RBVEEoMCwkIywmZHB0clt6MF1bZF0pOworCQlDT1BZX1ZFQyg4KyQkLDArJCQpOworCQlmb3IgKHogPSB6MCAtIDE7IHogPj0gMDsgei0tKSB7CisJCQlNQVNLKDE2KyQkLDgrJCQpOworCQkJQU5EKDE2KyQkLDE2KyQkLDI1KTsKKwkJCVNITEJZVEUoOCskJCw4KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQkJTE9BRF9EQVRBKDE2LCQjLCZkcHRyW3pdW2RdKTsKKwkJCVhPUigwKyQkLDArJCQsMTYrJCQpOworCQkJWE9SKDgrJCQsOCskJCwxNiskJCk7CisJCX0KKwkJU1RPUkVfREFUQSgwLCQjLCZwW2RdKTsKKwkJU1RPUkVfREFUQSg4LCQjLCZxW2RdKTsKKwl9CisJa2VybmVsX2ZwdV9lbmQoJnZ4c3RhdGUsIEtFUk5FTF9WWFIpOworfQorCitzdGF0aWMgdm9pZCByYWlkNl9zMzkwdngkI194b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCQlzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKQoreworCXN0cnVjdCBrZXJuZWxfZnB1IHZ4c3RhdGU7CisJdTggKipkcHRyLCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJZHB0ciA9ICh1OCAqKikgcHRyczsKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcyAtIDJdOwkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbZGlza3MgLSAxXTsJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oJnZ4c3RhdGUsIEtFUk5FTF9WWFIpOworCUxPQURfQ09OU1QoKTsKKworCWZvciAoZCA9IDA7IGQgPCBieXRlczsgZCArPSAkIypOU0laRSkgeworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlMT0FEX0RBVEEoMCwkIywmZHB0clt6MF1bZF0pOworCQlDT1BZX1ZFQyg4KyQkLDArJCQpOworCQlmb3IgKHogPSB6MCAtIDE7IHogPj0gc3RhcnQ7IHotLSkgeworCQkJTUFTSygxNiskJCw4KyQkKTsKKwkJCUFORCgxNiskJCwxNiskJCwyNSk7CisJCQlTSExCWVRFKDgrJCQsOCskJCk7CisJCQlYT1IoOCskJCw4KyQkLDE2KyQkKTsKKwkJCUxPQURfREFUQSgxNiwkIywmZHB0clt6XVtkXSk7CisJCQlYT1IoMCskJCwwKyQkLDE2KyQkKTsKKwkJCVhPUig4KyQkLDgrJCQsMTYrJCQpOworCQl9CisJCS8qIFAvUSBsZWZ0IHNpZGUgb3B0aW1pemF0aW9uICovCisJCWZvciAoeiA9IHN0YXJ0IC0gMTsgeiA+PSAwOyB6LS0pIHsKKwkJCU1BU0soMTYrJCQsOCskJCk7CisJCQlBTkQoMTYrJCQsMTYrJCQsMjUpOworCQkJU0hMQllURSg4KyQkLDgrJCQpOworCQkJWE9SKDgrJCQsOCskJCwxNiskJCk7CisJCX0KKwkJTE9BRF9EQVRBKDE2LCQjLCZwW2RdKTsKKwkJWE9SKDE2KyQkLDE2KyQkLDArJCQpOworCQlTVE9SRV9EQVRBKDE2LCQjLCZwW2RdKTsKKwkJTE9BRF9EQVRBKDE2LCQjLCZxW2RdKTsKKwkJWE9SKDE2KyQkLDE2KyQkLDgrJCQpOworCQlTVE9SRV9EQVRBKDE2LCQjLCZxW2RdKTsKKwl9CisJa2VybmVsX2ZwdV9lbmQoJnZ4c3RhdGUsIEtFUk5FTF9WWFIpOworfQorCitzdGF0aWMgaW50IHJhaWQ2X3MzOTB2eCQjX3ZhbGlkKHZvaWQpCit7CisJcmV0dXJuIE1BQ0hJTkVfSEFTX1ZYOworfQorCitjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfczM5MHZ4JCMgPSB7CisJcmFpZDZfczM5MHZ4JCNfZ2VuX3N5bmRyb21lLAorCXJhaWQ2X3MzOTB2eCQjX3hvcl9zeW5kcm9tZSwKKwlyYWlkNl9zMzkwdngkI192YWxpZCwKKwkidngxMjh4JCMiLAorCTEKK307CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9zc2UxLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi9zc2UxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyNWI4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3NzZTEuYwpAQCAtMCwwICsxLDE2NCBAQAorLyogLSotIGxpbnV4LWMgLSotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgorICoKKyAqICAgQ29weXJpZ2h0IDIwMDIgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MyBUZW1wbGUgUGxhY2UgU3RlIDMzMCwKKyAqICAgQm9zdG9uIE1BIDAyMTExLTEzMDcsIFVTQTsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJhaWQ2L3NzZTEuYworICoKKyAqIFNTRS0xL01NWEVYVCBpbXBsZW1lbnRhdGlvbiBvZiBSQUlELTYgc3luZHJvbWUgZnVuY3Rpb25zCisgKgorICogVGhpcyBpcyByZWFsbHkgYW4gTU1YIGltcGxlbWVudGF0aW9uLCBidXQgaXQgcmVxdWlyZXMgU1NFLTEgb3IKKyAqIEFNRCBNTVhFWFQgZm9yIHByZWZldGNoIHN1cHBvcnQgYW5kIGEgZmV3IG90aGVyIGZlYXR1cmVzLiAgVGhlCisgKiBzdXBwb3J0IGZvciBub250ZW1wb3JhbCBtZW1vcnkgYWNjZXNzZXMgaXMgZW5vdWdoIHRvIG1ha2UgdGhpcworICogd29ydGh3aGlsZSBhcyBhIHNlcGFyYXRlIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisKKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisjaW5jbHVkZSAieDg2LmgiCisKKy8qIERlZmluZWQgaW4gcmFpZDYvbW14LmMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgcmFpZDZfbW14X2NvbnN0YW50cyB7CisJdTY0IHgxZDsKK30gcmFpZDZfbW14X2NvbnN0YW50czsKKworc3RhdGljIGludCByYWlkNl9oYXZlX3NzZTFfb3JfbW14ZXh0KHZvaWQpCit7CisJLyogTm90IHJlYWxseSBib290X2NwdSBidXQgImFsbF9jcHVzIiAqLworCXJldHVybiBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfTU1YKSAmJgorCQkoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1hNTSkgfHwKKwkJIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9NTVhFWFQpKTsKK30KKworLyoKKyAqIFBsYWluIFNTRTEgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmFpZDZfc3NlMTFfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7CQkvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOwkJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owKzJdOwkJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tMCIgOiA6ICJtIiAocmFpZDZfbW14X2NvbnN0YW50cy54MWQpKTsKKwlhc20gdm9sYXRpbGUoInB4b3IgJW1tNSwlbW01Iik7CS8qIFplcm8gdGVtcCAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDggKSB7CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbejBdW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tMiIgOiA6ICJtIiAoZHB0clt6MF1bZF0pKTsgLyogUFswXSAqLworCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6IDogIm0iIChkcHRyW3owLTFdW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92cSAlbW0yLCVtbTQiKTsJLyogUVswXSAqLworCQlhc20gdm9sYXRpbGUoIm1vdnEgJTAsJSVtbTYiIDogOiAibSIgKGRwdHJbejAtMV1bZF0pKTsKKwkJZm9yICggeiA9IHowLTIgOyB6ID49IDAgOyB6LS0gKSB7CisJCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6IDogIm0iIChkcHRyW3pdW2RdKSk7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJW1tNCwlbW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICVtbTQsJW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICVtbTAsJW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTYsJW1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTYsJW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZxICUwLCUlbW02IiA6IDogIm0iIChkcHRyW3pdW2RdKSk7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICVtbTQsJW1tNSIpOworCQlhc20gdm9sYXRpbGUoInBhZGRiICVtbTQsJW1tNCIpOworCQlhc20gdm9sYXRpbGUoInBhbmQgJW1tMCwlbW01Iik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICVtbTUsJW1tNSIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJW1tNiwlbW0yIik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAlbW02LCVtbTQiKTsKKworCQlhc20gdm9sYXRpbGUoIm1vdm50cSAlJW1tMiwlMCIgOiAiPW0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92bnRxICUlbW00LCUwIiA6ICI9bSIgKHFbZF0pKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zc2UxeDEgPSB7CisJcmFpZDZfc3NlMTFfZ2VuX3N5bmRyb21lLAorCU5VTEwsCQkJLyogWE9SIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwlyYWlkNl9oYXZlX3NzZTFfb3JfbW14ZXh0LAorCSJzc2UxeDEiLAorCTEJCQkvKiBIYXMgY2FjaGUgaGludHMgKi8KK307CisKKy8qCisgKiBVbnJvbGxlZC1ieS0yIFNTRTEgaW1wbGVtZW50YXRpb24KKyAqLworc3RhdGljIHZvaWQgcmFpZDZfc3NlMTJfZ2VuX3N5bmRyb21lKGludCBkaXNrcywgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKK3sKKwl1OCAqKmRwdHIgPSAodTggKiopcHRyczsKKwl1OCAqcCwgKnE7CisJaW50IGQsIHosIHowOworCisJejAgPSBkaXNrcyAtIDM7CQkvKiBIaWdoZXN0IGRhdGEgZGlzayAqLworCXAgPSBkcHRyW3owKzFdOwkJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW3owKzJdOwkJLyogUlMgc3luZHJvbWUgKi8KKworCWtlcm5lbF9mcHVfYmVnaW4oKTsKKworCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tMCIgOiA6ICJtIiAocmFpZDZfbW14X2NvbnN0YW50cy54MWQpKTsKKwlhc20gdm9sYXRpbGUoInB4b3IgJW1tNSwlbW01Iik7CS8qIFplcm8gdGVtcCAqLworCWFzbSB2b2xhdGlsZSgicHhvciAlbW03LCVtbTciKTsgLyogWmVybyB0ZW1wICovCisKKwkvKiBXZSB1bmlmb3JtbHkgYXNzdW1lIGEgc2luZ2xlIHByZWZldGNoIGNvdmVycyBhdCBsZWFzdCAxNiBieXRlcyAqLworCWZvciAoIGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSAxNiApIHsKKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMCIgOiA6ICJtIiAoZHB0clt6MF1bZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZxICUwLCUlbW0yIiA6IDogIm0iIChkcHRyW3owXVtkXSkpOyAvKiBQWzBdICovCisJCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tMyIgOiA6ICJtIiAoZHB0clt6MF1bZCs4XSkpOyAvKiBQWzFdICovCisJCWFzbSB2b2xhdGlsZSgibW92cSAlbW0yLCVtbTQiKTsJLyogUVswXSAqLworCQlhc20gdm9sYXRpbGUoIm1vdnEgJW1tMywlbW02Iik7IC8qIFFbMV0gKi8KKwkJZm9yICggeiA9IHowLTEgOyB6ID49IDAgOyB6LS0gKSB7CisJCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6IDogIm0iIChkcHRyW3pdW2RdKSk7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJW1tNCwlbW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJW1tNiwlbW03Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICVtbTQsJW1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAlbW02LCVtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAlbW0wLCVtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAlbW0wLCVtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW03LCVtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92cSAlMCwlJW1tNSIgOiA6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZxICUwLCUlbW03IiA6IDogIm0iIChkcHRyW3pdW2QrOF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW03LCVtbTMiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW03LCVtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW01LCVtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAlbW03LCVtbTciKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoIm1vdm50cSAlJW1tMiwlMCIgOiAiPW0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92bnRxICUlbW0zLCUwIiA6ICI9bSIgKHBbZCs4XSkpOworCQlhc20gdm9sYXRpbGUoIm1vdm50cSAlJW1tNCwlMCIgOiAiPW0iIChxW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92bnRxICUlbW02LCUwIiA6ICI9bSIgKHFbZCs4XSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDo6ICJtZW1vcnkiKTsKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCitjb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgcmFpZDZfc3NlMXgyID0geworCXJhaWQ2X3NzZTEyX2dlbl9zeW5kcm9tZSwKKwlOVUxMLAkJCS8qIFhPUiBub3QgeWV0IGltcGxlbWVudGVkICovCisJcmFpZDZfaGF2ZV9zc2UxX29yX21teGV4dCwKKwkic3NlMXgyIiwKKwkxCQkJLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3NzZTIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDIyNzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvc3NlMi5jCkBAIC0wLDAgKzEsNDg1IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUzIFRlbXBsZSBQbGFjZSBTdGUgMzMwLAorICogICBCb3N0b24gTUEgMDIxMTEtMTMwNywgVVNBOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogcmFpZDYvc3NlMi5jCisgKgorICogU1NFLTIgaW1wbGVtZW50YXRpb24gb2YgUkFJRC02IHN5bmRyb21lIGZ1bmN0aW9ucworICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvcmFpZC9wcS5oPgorI2luY2x1ZGUgIng4Ni5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHJhaWQ2X3NzZV9jb25zdGFudHMgeworCXU2NCB4MWRbMl07Cit9IHJhaWQ2X3NzZV9jb25zdGFudHMgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMTYpKSkgPSB7CisJeyAweDFkMWQxZDFkMWQxZDFkMWRVTEwsIDB4MWQxZDFkMWQxZDFkMWQxZFVMTCB9LAorfTsKKworc3RhdGljIGludCByYWlkNl9oYXZlX3NzZTIodm9pZCkKK3sKKwkvKiBOb3QgcmVhbGx5IGJvb3RfY3B1IGJ1dCAiYWxsX2NwdXMiICovCisJcmV0dXJuIGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9NTVgpICYmCisJCWJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9GWFNSKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWE1NKSAmJgorCQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfWE1NMik7Cit9CisKKy8qCisgKiBQbGFpbiBTU0UyIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X3NzZTIxX2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXowID0gZGlza3MgLSAzOwkJLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsJCS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCsyXTsJCS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTAiIDogOiAibSIgKHJhaWQ2X3NzZV9jb25zdGFudHMueDFkWzBdKSk7CisJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW01Iik7CS8qIFplcm8gdGVtcCAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDE2ICkgeworCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6IDogIm0iIChkcHRyW3owXVtkXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTIiIDogOiAibSIgKGRwdHJbejBdW2RdKSk7IC8qIFBbMF0gKi8KKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMCIgOiA6ICJtIiAoZHB0clt6MC0xXVtkXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAleG1tMiwleG1tNCIpOyAvKiBRWzBdICovCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNiIgOiA6ICJtIiAoZHB0clt6MC0xXVtkXSkpOworCQlmb3IgKCB6ID0gejAtMiA7IHogPj0gMCA7IHotLSApIHsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tNCwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW02LCV4bW0yIik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTYsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNiIgOiA6ICJtIiAoZHB0clt6XVtkXSkpOworCQl9CisJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNCwleG1tNSIpOworCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW00LCV4bW00Iik7CisJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tNSIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW01Iik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNiwleG1tMiIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTYsJXhtbTQiKTsKKworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW0yLCUwIiA6ICI9bSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0yLCV4bW0yIik7CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTQsJTAiIDogIj1tIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTQsJXhtbTQiKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKworc3RhdGljIHZvaWQgcmFpZDZfc3NlMjFfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkgICAgIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCisgeworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0wIiA6IDogIm0iIChyYWlkNl9zc2VfY29uc3RhbnRzLngxZFswXSkpOworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDE2ICkgeworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTQiIDo6ICJtIiAoZHB0clt6MF1bZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0yIiA6IDogIm0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNCwleG1tMiIpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gc3RhcnQgOyB6LS0gKSB7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tNCwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNSIgOjogIm0iIChkcHRyW3pdW2RdKSk7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNCIpOworCQl9CisJCS8qIFAvUSBsZWZ0IHNpZGUgb3B0aW1pemF0aW9uICovCisJCWZvciAoIHogPSBzdGFydC0xIDsgeiA+PSAwIDsgei0tICkgeworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTQsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTQsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW00Iik7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJweG9yICUwLCUleG1tNCIgOiA6ICJtIiAocVtkXSkpOworCQkvKiBEb24ndCB1c2UgbW92bnRkcSBmb3Igci93IG1lbW9yeSBhcmVhIDwgY2FjaGUgbGluZSAqLworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlJXhtbTQsJTAiIDogIj1tIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlJXhtbTIsJTAiIDogIj1tIiAocFtkXSkpOworCX0KKworCWFzbSB2b2xhdGlsZSgic2ZlbmNlIiA6IDogOiAibWVtb3J5Iik7CisJa2VybmVsX2ZwdV9lbmQoKTsKK30KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3NzZTJ4MSA9IHsKKwlyYWlkNl9zc2UyMV9nZW5fc3luZHJvbWUsCisJcmFpZDZfc3NlMjFfeG9yX3N5bmRyb21lLAorCXJhaWQ2X2hhdmVfc3NlMiwKKwkic3NlMngxIiwKKwkxCQkJLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworCisvKgorICogVW5yb2xsZWQtYnktMiBTU0UyIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X3NzZTIyX2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXowID0gZGlza3MgLSAzOwkJLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsJCS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCsyXTsJCS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTAiIDogOiAibSIgKHJhaWQ2X3NzZV9jb25zdGFudHMueDFkWzBdKSk7CisJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW01Iik7IC8qIFplcm8gdGVtcCAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tNyIpOyAvKiBaZXJvIHRlbXAgKi8KKworCS8qIFdlIHVuaWZvcm1seSBhc3N1bWUgYSBzaW5nbGUgcHJlZmV0Y2ggY292ZXJzIGF0IGxlYXN0IDMyIGJ5dGVzICovCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDMyICkgeworCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6IDogIm0iIChkcHRyW3owXVtkXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTIiIDogOiAibSIgKGRwdHJbejBdW2RdKSk7ICAgIC8qIFBbMF0gKi8KKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0zIiA6IDogIm0iIChkcHRyW3owXVtkKzE2XSkpOyAvKiBQWzFdICovCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICV4bW0yLCV4bW00Iik7IC8qIFFbMF0gKi8KKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJXhtbTMsJXhtbTYiKTsgLyogUVsxXSAqLworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDogOiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICV4bW02LCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW00LCV4bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW02LCV4bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTAsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTcsJXhtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNSIgOiA6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW03IiA6IDogIm0iIChkcHRyW3pdW2QrMTZdKSk7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTcsJXhtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW03Iik7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tMiwlMCIgOiAiPW0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTMsJTAiIDogIj1tIiAocFtkKzE2XSkpOworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW00LCUwIiA6ICI9bSIgKHFbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tNiwlMCIgOiAiPW0iIChxW2QrMTZdKSk7CisJfQorCisJYXNtIHZvbGF0aWxlKCJzZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKwlrZXJuZWxfZnB1X2VuZCgpOworfQorCisgc3RhdGljIHZvaWQgcmFpZDZfc3NlMjJfeG9yX3N5bmRyb21lKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKKwkJCQkgICAgIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCisgeworCXU4ICoqZHB0ciA9ICh1OCAqKilwdHJzOworCXU4ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl6MCA9IHN0b3A7CQkvKiBQL1EgcmlnaHQgc2lkZSBvcHRpbWl6YXRpb24gKi8KKwlwID0gZHB0cltkaXNrcy0yXTsJLyogWE9SIHBhcml0eSAqLworCXEgPSBkcHRyW2Rpc2tzLTFdOwkvKiBSUyBzeW5kcm9tZSAqLworCisJa2VybmVsX2ZwdV9iZWdpbigpOworCisJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0wIiA6IDogIm0iIChyYWlkNl9zc2VfY29uc3RhbnRzLngxZFswXSkpOworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDMyICkgeworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTQiIDo6ICJtIiAoZHB0clt6MF1bZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW02IiA6OiAibSIgKGRwdHJbejBdW2QrMTZdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMiIgOiA6ICJtIiAocFtkXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTMiIDogOiAibSIgKHBbZCsxNl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW00LCV4bW0yIik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNiwleG1tMyIpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gc3RhcnQgOyB6LS0gKSB7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICV4bW00LCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTYsJXhtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTQsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTYsJXhtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW01IiA6OiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNyIgOjogIm0iIChkcHRyW3pdW2QrMTZdKSk7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTcsJXhtbTYiKTsKKwkJfQorCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKCB6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTQsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNiwleG1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tNCwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tNiwleG1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTAsJXhtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW02Iik7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJweG9yICUwLCUleG1tNCIgOiA6ICJtIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJTAsJSV4bW02IiA6IDogIm0iIChxW2QrMTZdKSk7CisJCS8qIERvbid0IHVzZSBtb3ZudGRxIGZvciByL3cgbWVtb3J5IGFyZWEgPCBjYWNoZSBsaW5lICovCisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tNCwlMCIgOiAiPW0iIChxW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tNiwlMCIgOiAiPW0iIChxW2QrMTZdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tMiwlMCIgOiAiPW0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUleG1tMywlMCIgOiAiPW0iIChwW2QrMTZdKSk7CisJfQorCisJYXNtIHZvbGF0aWxlKCJzZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKKwlrZXJuZWxfZnB1X2VuZCgpOworIH0KKworY29uc3Qgc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X3NzZTJ4MiA9IHsKKwlyYWlkNl9zc2UyMl9nZW5fc3luZHJvbWUsCisJcmFpZDZfc3NlMjJfeG9yX3N5bmRyb21lLAorCXJhaWQ2X2hhdmVfc3NlMiwKKwkic3NlMngyIiwKKwkxCQkJLyogSGFzIGNhY2hlIGhpbnRzICovCit9OworCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisvKgorICogVW5yb2xsZWQtYnktNCBTU0UyIGltcGxlbWVudGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkIHJhaWQ2X3NzZTI0X2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXowID0gZGlza3MgLSAzOwkJLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gZHB0clt6MCsxXTsJCS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gZHB0clt6MCsyXTsJCS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTAiIDo6ICJtIiAocmFpZDZfc3NlX2NvbnN0YW50cy54MWRbMF0pKTsKKwlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTIsJXhtbTIiKTsJLyogUFswXSAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMywleG1tMyIpOwkvKiBQWzFdICovCisJYXNtIHZvbGF0aWxlKCJweG9yICV4bW00LCV4bW00Iik7IAkvKiBRWzBdICovCisJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW01Iik7CS8qIFplcm8gdGVtcCAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNiwleG1tNiIpOyAJLyogUVsxXSAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tNyIpOyAJLyogWmVybyB0ZW1wICovCisJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xMCwleG1tMTAiKTsJLyogUFsyXSAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTEsJXhtbTExIik7CS8qIFBbM10gKi8KKwlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEyLCV4bW0xMiIpOyAJLyogUVsyXSAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTMsJXhtbTEzIik7CS8qIFplcm8gdGVtcCAqLworCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTQsJXhtbTE0Iik7IAkvKiBRWzNdICovCisJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNSwleG1tMTUiKTsgCS8qIFplcm8gdGVtcCAqLworCisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IDY0ICkgeworCQlmb3IgKCB6ID0gejAgOyB6ID49IDAgOyB6LS0gKSB7CisJCQkvKiBUaGUgc2Vjb25kIHByZWZldGNoIHNlZW1zIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuLi4gKi8KKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDo6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMCIgOjogIm0iIChkcHRyW3pdW2QrMzJdKSk7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTQsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNiwleG1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICV4bW0xMiwleG1tMTMiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tMTQsJXhtbTE1Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW00LCV4bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW02LCV4bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW0xMiwleG1tMTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTE0LCV4bW0xNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTAsJXhtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tMTMiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tMTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEzLCV4bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNSwleG1tMTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNSIgOjogIm0iIChkcHRyW3pdW2RdKSk7CisJCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTciIDo6ICJtIiAoZHB0clt6XVtkKzE2XSkpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0xMyIgOjogIm0iIChkcHRyW3pdW2QrMzJdKSk7CisJCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTE1IiA6OiAibSIgKGRwdHJbel1bZCs0OF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tMiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW0zIik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEzLCV4bW0xMCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNSwleG1tMTEiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW02Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEzLCV4bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNSwleG1tMTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEzLCV4bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNSwleG1tMTUiKTsKKwkJfQorCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW0yLCUwIiA6ICI9bSIgKHBbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0yLCV4bW0yIik7CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTMsJTAiIDogIj1tIiAocFtkKzE2XSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTMsJXhtbTMiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tMTAsJTAiIDogIj1tIiAocFtkKzMyXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEwLCV4bW0xMCIpOworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW0xMSwlMCIgOiAiPW0iIChwW2QrNDhdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTEsJXhtbTExIik7CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTQsJTAiIDogIj1tIiAocVtkXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTQsJXhtbTQiKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tNiwlMCIgOiAiPW0iIChxW2QrMTZdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNiwleG1tNiIpOworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW0xMiwlMCIgOiAiPW0iIChxW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTIsJXhtbTEyIik7CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTE0LCUwIiA6ICI9bSIgKHFbZCs0OF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNCwleG1tMTQiKTsKKwl9CisKKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7Cit9CisKKyBzdGF0aWMgdm9pZCByYWlkNl9zc2UyNF94b3Jfc3luZHJvbWUoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAorCQkJCSAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykKKyB7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTggKnAsICpxOworCWludCBkLCB6LCB6MDsKKworCXowID0gc3RvcDsJCS8qIFAvUSByaWdodCBzaWRlIG9wdGltaXphdGlvbiAqLworCXAgPSBkcHRyW2Rpc2tzLTJdOwkvKiBYT1IgcGFyaXR5ICovCisJcSA9IGRwdHJbZGlza3MtMV07CS8qIFJTIHN5bmRyb21lICovCisKKwlrZXJuZWxfZnB1X2JlZ2luKCk7CisKKwlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTAiIDo6ICJtIiAocmFpZDZfc3NlX2NvbnN0YW50cy54MWRbMF0pKTsKKworCWZvciAoIGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSA2NCApIHsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW00IiA6OiAibSIgKGRwdHJbejBdW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tNiIgOjogIm0iIChkcHRyW3owXVtkKzE2XSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTEyIiA6OiAibSIgKGRwdHJbejBdW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMTQiIDo6ICJtIiAoZHB0clt6MF1bZCs0OF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0yIiA6IDogIm0iIChwW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMyIgOiA6ICJtIiAocFtkKzE2XSkpOworCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTEwIiA6IDogIm0iIChwW2QrMzJdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMTEiIDogOiAibSIgKHBbZCs0OF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW00LCV4bW0yIik7CisJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNiwleG1tMyIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEyLCV4bW0xMCIpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTE0LCV4bW0xMSIpOworCQkvKiBQL1EgZGF0YSBwYWdlcyAqLworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gc3RhcnQgOyB6LS0gKSB7CisJCQlhc20gdm9sYXRpbGUoInByZWZldGNobnRhICUwIiA6OiAibSIgKGRwdHJbel1bZF0pKTsKKwkJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDo6ICJtIiAoZHB0clt6XVtkKzMyXSkpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTcsJXhtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTMsJXhtbTEzIik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTE1LCV4bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICV4bW00LCV4bW01Iik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTYsJXhtbTciKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tMTIsJXhtbTEzIik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTE0LCV4bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tNCwleG1tNCIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tNiwleG1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tMTIsJXhtbTEyIik7CisJCQlhc20gdm9sYXRpbGUoInBhZGRiICV4bW0xNCwleG1tMTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTAsJXhtbTEzIik7CisJCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTAsJXhtbTE1Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xMywleG1tMTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTUsJXhtbTE0Iik7CisJCQlhc20gdm9sYXRpbGUoIm1vdmRxYSAlMCwlJXhtbTUiIDo6ICJtIiAoZHB0clt6XVtkXSkpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW03IiA6OiAibSIgKGRwdHJbel1bZCsxNl0pKTsKKwkJCWFzbSB2b2xhdGlsZSgibW92ZHFhICUwLCUleG1tMTMiIDo6ICJtIiAoZHB0clt6XVtkKzMyXSkpOworCQkJYXNtIHZvbGF0aWxlKCJtb3ZkcWEgJTAsJSV4bW0xNSIgOjogIm0iIChkcHRyW3pdW2QrNDhdKSk7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tMyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xMywleG1tMTAiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTUsJXhtbTExIik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTUsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNywleG1tNiIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xMywleG1tMTIiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTUsJXhtbTE0Iik7CisJCX0KKwkJYXNtIHZvbGF0aWxlKCJwcmVmZXRjaG50YSAlMCIgOjogIm0iIChxW2RdKSk7CisJCWFzbSB2b2xhdGlsZSgicHJlZmV0Y2hudGEgJTAiIDo6ICJtIiAocVtkKzMyXSkpOworCQkvKiBQL1EgbGVmdCBzaWRlIG9wdGltaXphdGlvbiAqLworCQlmb3IgKCB6ID0gc3RhcnQtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tNSwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW03LCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTEzLCV4bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW0xNSwleG1tMTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGNtcGd0YiAleG1tNCwleG1tNSIpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICV4bW02LCV4bW03Iik7CisJCQlhc20gdm9sYXRpbGUoInBjbXBndGIgJXhtbTEyLCV4bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJwY21wZ3RiICV4bW0xNCwleG1tMTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTQsJXhtbTQiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTYsJXhtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFkZGIgJXhtbTEyLCV4bW0xMiIpOworCQkJYXNtIHZvbGF0aWxlKCJwYWRkYiAleG1tMTQsJXhtbTE0Iik7CisJCQlhc20gdm9sYXRpbGUoInBhbmQgJXhtbTAsJXhtbTUiKTsKKwkJCWFzbSB2b2xhdGlsZSgicGFuZCAleG1tMCwleG1tNyIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW0xMyIpOworCQkJYXNtIHZvbGF0aWxlKCJwYW5kICV4bW0wLCV4bW0xNSIpOworCQkJYXNtIHZvbGF0aWxlKCJweG9yICV4bW01LCV4bW00Iik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTcsJXhtbTYiKTsKKwkJCWFzbSB2b2xhdGlsZSgicHhvciAleG1tMTMsJXhtbTEyIik7CisJCQlhc20gdm9sYXRpbGUoInB4b3IgJXhtbTE1LCV4bW0xNCIpOworCQl9CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTIsJTAiIDogIj1tIiAocFtkXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW0zLCUwIiA6ICI9bSIgKHBbZCsxNl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tMTAsJTAiIDogIj1tIiAocFtkKzMyXSkpOworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW0xMSwlMCIgOiAiPW0iIChwW2QrNDhdKSk7CisJCWFzbSB2b2xhdGlsZSgicHhvciAlMCwlJXhtbTQiIDogOiAibSIgKHFbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJweG9yICUwLCUleG1tNiIgOiA6ICJtIiAocVtkKzE2XSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJTAsJSV4bW0xMiIgOiA6ICJtIiAocVtkKzMyXSkpOworCQlhc20gdm9sYXRpbGUoInB4b3IgJTAsJSV4bW0xNCIgOiA6ICJtIiAocVtkKzQ4XSkpOworCQlhc20gdm9sYXRpbGUoIm1vdm50ZHEgJSV4bW00LCUwIiA6ICI9bSIgKHFbZF0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tNiwlMCIgOiAiPW0iIChxW2QrMTZdKSk7CisJCWFzbSB2b2xhdGlsZSgibW92bnRkcSAlJXhtbTEyLCUwIiA6ICI9bSIgKHFbZCszMl0pKTsKKwkJYXNtIHZvbGF0aWxlKCJtb3ZudGRxICUleG1tMTQsJTAiIDogIj1tIiAocVtkKzQ4XSkpOworCX0KKwlhc20gdm9sYXRpbGUoInNmZW5jZSIgOiA6IDogIm1lbW9yeSIpOworCWtlcm5lbF9mcHVfZW5kKCk7CisgfQorCisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl9zc2UyeDQgPSB7CisJcmFpZDZfc3NlMjRfZ2VuX3N5bmRyb21lLAorCXJhaWQ2X3NzZTI0X3hvcl9zeW5kcm9tZSwKKwlyYWlkNl9oYXZlX3NzZTIsCisJInNzZTJ4NCIsCisJMQkJCS8qIEhhcyBjYWNoZSBoaW50cyAqLworfTsKKworI2VuZGlmIC8qIENPTkZJR19YODZfNjQgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3Rlc3QvTWFrZWZpbGUgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi90ZXN0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NWE3NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi90ZXN0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTMwIEBACisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjCisjIFRoaXMgaXMgYSBzaW1wbGUgTWFrZWZpbGUgdG8gdGVzdCBzb21lIG9mIHRoZSBSQUlELTYgY29kZQorIyBmcm9tIHVzZXJzcGFjZS4KKyMKKworQ0MJID0gZ2NjCitPUFRGTEFHUyA9IC1PMgkJCSMgQWRqdXN0IGFzIGRlc2lyZWQKK0NGTEFHUwkgPSAtSS4uIC1JIC4uLy4uLy4uL2luY2x1ZGUgLWcgJChPUFRGTEFHUykKK0xECSA9IGxkCitBV0sJID0gYXdrIC1mCitBUgkgPSBhcgorUkFOTElCCSA9IHJhbmxpYgorT0JKUwkgPSBpbnQxLm8gaW50Mi5vIGludDQubyBpbnQ4Lm8gaW50MTYubyBpbnQzMi5vIHJlY292Lm8gYWxnb3MubyB0YWJsZXMubworCitBUkNIIDo9ICQoc2hlbGwgdW5hbWUgLW0gMj4vZGV2L251bGwgfCBzZWQgLWUgL3MvaS44Ni9pMzg2LykKK2lmZXEgKCQoQVJDSCksaTM4NikKKyAgICAgICAgQ0ZMQUdTICs9IC1EQ09ORklHX1g4Nl8zMgorICAgICAgICBJU19YODYgPSB5ZXMKK2VuZGlmCitpZmVxICgkKEFSQ0gpLHg4Nl82NCkKKyAgICAgICAgQ0ZMQUdTICs9IC1EQ09ORklHX1g4Nl82NAorICAgICAgICBJU19YODYgPSB5ZXMKK2VuZGlmCisKK2lmZXEgKCQoQVJDSCksYXJtKQorICAgICAgICBDRkxBR1MgKz0gLUkuLi8uLi8uLi9hcmNoL2FybS9pbmNsdWRlIC1tZnB1PW5lb24KKyAgICAgICAgSEFTX05FT04gPSB5ZXMKK2VuZGlmCitpZmVxICgkKEFSQ0gpLGFhcmNoNjQpCisgICAgICAgIENGTEFHUyArPSAtSS4uLy4uLy4uL2FyY2gvYXJtNjQvaW5jbHVkZQorICAgICAgICBIQVNfTkVPTiA9IHllcworZW5kaWYKKworaWZlcSAoJChJU19YODYpLHllcykKKyAgICAgICAgT0JKUyAgICs9IG1teC5vIHNzZTEubyBzc2UyLm8gYXZ4Mi5vIHJlY292X3Nzc2UzLm8gcmVjb3ZfYXZ4Mi5vIGF2eDUxMi5vIHJlY292X2F2eDUxMi5vCisgICAgICAgIENGTEFHUyArPSAkKHNoZWxsIGVjaG8gInZwYnJvYWRjYXN0YiAleG1tMCwgJXltbTEiIHwJXAorICAgICAgICAgICAgICAgICAgICBnY2MgLWMgLXggYXNzZW1ibGVyIC0gPiYvZGV2L251bGwgJiYJXAorICAgICAgICAgICAgICAgICAgICBybSAuLy0ubyAmJiBlY2hvIC1EQ09ORklHX0FTX0FWWDI9MSkKKwlDRkxBR1MgKz0gJChzaGVsbCBlY2hvICJ2cG1vdm0yYiAlazEsICV6bW01IiB8ICAgICAgICAgIFwKKwkJICAgIGdjYyAtYyAteCBhc3NlbWJsZXIgLSA+Ji9kZXYvbnVsbCAmJiAgICAgICAgXAorCQkgICAgcm0gLi8tLm8gJiYgZWNobyAtRENPTkZJR19BU19BVlg1MTI9MSkKK2Vsc2UgaWZlcSAoJChIQVNfTkVPTikseWVzKQorICAgICAgICBPQkpTICAgKz0gbmVvbi5vIG5lb24xLm8gbmVvbjIubyBuZW9uNC5vIG5lb244Lm8gcmVjb3ZfbmVvbi5vIHJlY292X25lb25faW5uZXIubworICAgICAgICBDRkxBR1MgKz0gLURDT05GSUdfS0VSTkVMX01PREVfTkVPTj0xCitlbHNlCisgICAgICAgIEhBU19BTFRJVkVDIDo9ICQoc2hlbGwgcHJpbnRmICdcI2luY2x1ZGUgPGFsdGl2ZWMuaD5cbnZlY3RvciBpbnQgYTtcbicgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnY2MgLWMgLXggYyAtID4mL2Rldi9udWxsICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBybSAuLy0ubyAmJiBlY2hvIHllcykKKyAgICAgICAgaWZlcSAoJChIQVNfQUxUSVZFQykseWVzKQorICAgICAgICAgICAgICAgIE9CSlMgKz0gYWx0aXZlYzEubyBhbHRpdmVjMi5vIGFsdGl2ZWM0Lm8gYWx0aXZlYzgubworICAgICAgICBlbmRpZgorZW5kaWYKK2lmZXEgKCQoQVJDSCksdGlsZWd4KQorT0JKUyArPSB0aWxlZ3g4Lm8KK2VuZGlmCisKKy5jLm86CisJJChDQykgJChDRkxBR1MpIC1jIC1vICRAICQ8CisKKyUuYzogLi4vJS5jCisJY3AgLWYgJDwgJEAKKworJS51YzogLi4vJS51YworCWNwIC1mICQ8ICRACisKK2FsbDoJcmFpZDYuYSByYWlkNnRlc3QKKworcmFpZDYuYTogJChPQkpTKQorCSBybSAtZiAkQAorCSAkKEFSKSBjcSAkQCAkXgorCSAkKFJBTkxJQikgJEAKKworcmFpZDZ0ZXN0OiB0ZXN0LmMgcmFpZDYuYQorCSQoQ0MpICQoQ0ZMQUdTKSAtbyByYWlkNnRlc3QgJF4KKworbmVvbjEuYzogbmVvbi51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTEgPCBuZW9uLnVjID4gJEAKKworbmVvbjIuYzogbmVvbi51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTIgPCBuZW9uLnVjID4gJEAKKworbmVvbjQuYzogbmVvbi51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTQgPCBuZW9uLnVjID4gJEAKKworbmVvbjguYzogbmVvbi51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTggPCBuZW9uLnVjID4gJEAKKworYWx0aXZlYzEuYzogYWx0aXZlYy51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTEgPCBhbHRpdmVjLnVjID4gJEAKKworYWx0aXZlYzIuYzogYWx0aXZlYy51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTIgPCBhbHRpdmVjLnVjID4gJEAKKworYWx0aXZlYzQuYzogYWx0aXZlYy51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTQgPCBhbHRpdmVjLnVjID4gJEAKKworYWx0aXZlYzguYzogYWx0aXZlYy51YyAuLi91bnJvbGwuYXdrCisJJChBV0spIC4uL3Vucm9sbC5hd2sgLXZOPTggPCBhbHRpdmVjLnVjID4gJEAKKworaW50MS5jOiBpbnQudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj0xIDwgaW50LnVjID4gJEAKKworaW50Mi5jOiBpbnQudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj0yIDwgaW50LnVjID4gJEAKKworaW50NC5jOiBpbnQudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj00IDwgaW50LnVjID4gJEAKKworaW50OC5jOiBpbnQudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj04IDwgaW50LnVjID4gJEAKKworaW50MTYuYzogaW50LnVjIC4uL3Vucm9sbC5hd2sKKwkkKEFXSykgLi4vdW5yb2xsLmF3ayAtdk49MTYgPCBpbnQudWMgPiAkQAorCitpbnQzMi5jOiBpbnQudWMgLi4vdW5yb2xsLmF3aworCSQoQVdLKSAuLi91bnJvbGwuYXdrIC12Tj0zMiA8IGludC51YyA+ICRACisKK3RpbGVneDguYzogdGlsZWd4LnVjIC4uL3Vucm9sbC5hd2sKKwkkKEFXSykgLi4vdW5yb2xsLmF3ayAtdk49OCA8IHRpbGVneC51YyA+ICRACisKK3RhYmxlcy5jOiBta3RhYmxlcworCS4vbWt0YWJsZXMgPiB0YWJsZXMuYworCitjbGVhbjoKKwlybSAtZiAqLm8gKi5hIG1rdGFibGVzIG1rdGFibGVzLmMgKi51YyBpbnQqLmMgYWx0aXZlYyouYyBuZW9uKi5jIHRhYmxlcy5jIHJhaWQ2dGVzdAorCXJtIC1mIHRpbGVneCouYworCitzcG90bGVzczogY2xlYW4KKwlybSAtZiAqfgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvdGVzdC90ZXN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi90ZXN0L3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDdmNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvdGVzdC90ZXN0LmMKQEAgLTAsMCArMSwxNTYgQEAKKy8qIC0qLSBsaW51eC1jIC0qLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKKyAqCisgKiAgIENvcHlyaWdodCAyMDAyLTIwMDcgSC4gUGV0ZXIgQW52aW4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIHJhaWQ2dGVzdC5jCisgKgorICogVGVzdCBSQUlELTYgcmVjb3Zlcnkgd2l0aCB2YXJpb3VzIGFsZ29yaXRobXMKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL3BxLmg+CisKKyNkZWZpbmUgTkRJU0tTCQkxNgkvKiBJbmNsdWRpbmcgUCBhbmQgUSAqLworCitjb25zdCBjaGFyIHJhaWQ2X2VtcHR5X3plcm9fcGFnZVtQQUdFX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoUEFHRV9TSVpFKSkpOworc3RydWN0IHJhaWQ2X2NhbGxzIHJhaWQ2X2NhbGw7CisKK2NoYXIgKmRhdGFwdHJzW05ESVNLU107CitjaGFyIGRhdGFbTkRJU0tTXVtQQUdFX1NJWkVdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoUEFHRV9TSVpFKSkpOworY2hhciByZWNvdmlbUEFHRV9TSVpFXSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKFBBR0VfU0laRSkpKTsKK2NoYXIgcmVjb3ZqW1BBR0VfU0laRV0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChQQUdFX1NJWkUpKSk7CisKK3N0YXRpYyB2b2lkIG1ha2VkYXRhKGludCBzdGFydCwgaW50IHN0b3ApCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8PSBzdG9wOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IFBBR0VfU0laRTsgaisrKQorCQkJZGF0YVtpXVtqXSA9IHJhbmQoKTsKKworCQlkYXRhcHRyc1tpXSA9IGRhdGFbaV07CisJfQorfQorCitzdGF0aWMgY2hhciBkaXNrX3R5cGUoaW50IGQpCit7CisJc3dpdGNoIChkKSB7CisJY2FzZSBORElTS1MtMjoKKwkJcmV0dXJuICdQJzsKKwljYXNlIE5ESVNLUy0xOgorCQlyZXR1cm4gJ1EnOworCWRlZmF1bHQ6CisJCXJldHVybiAnRCc7CisJfQorfQorCitzdGF0aWMgaW50IHRlc3RfZGlza3MoaW50IGksIGludCBqKQoreworCWludCBlcnJhLCBlcnJiOworCisJbWVtc2V0KHJlY292aSwgMHhmMCwgUEFHRV9TSVpFKTsKKwltZW1zZXQocmVjb3ZqLCAweGJhLCBQQUdFX1NJWkUpOworCisJZGF0YXB0cnNbaV0gPSByZWNvdmk7CisJZGF0YXB0cnNbal0gPSByZWNvdmo7CisKKwlyYWlkNl9kdWFsX3JlY292KE5ESVNLUywgUEFHRV9TSVpFLCBpLCBqLCAodm9pZCAqKikmZGF0YXB0cnMpOworCisJZXJyYSA9IG1lbWNtcChkYXRhW2ldLCByZWNvdmksIFBBR0VfU0laRSk7CisJZXJyYiA9IG1lbWNtcChkYXRhW2pdLCByZWNvdmosIFBBR0VfU0laRSk7CisKKwlpZiAoaSA8IE5ESVNLUy0yICYmIGogPT0gTkRJU0tTLTEpIHsKKwkJLyogV2UgZG9uJ3QgaW1wbGVtZW50IHRoZSBEUSBmYWlsdXJlIHNjZW5hcmlvLCBzaW5jZSBpdCdzCisJCSAgIGVxdWl2YWxlbnQgdG8gYSBSQUlELTUgZmFpbHVyZSAoWE9SLCB0aGVuIHJlY29tcHV0ZSBRKSAqLworCQllcnJhID0gZXJyYiA9IDA7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJhbGdvPSUtOHMgIGZhaWxhPSUzZCglYykgIGZhaWxiPSUzZCglYykgICVzXG4iLAorCQkgICAgICAgcmFpZDZfY2FsbC5uYW1lLAorCQkgICAgICAgaSwgZGlza190eXBlKGkpLAorCQkgICAgICAgaiwgZGlza190eXBlKGopLAorCQkgICAgICAgKCFlcnJhICYmICFlcnJiKSA/ICJPSyIgOgorCQkgICAgICAgIWVycmEgPyAiRVJSQiIgOgorCQkgICAgICAgIWVycmIgPyAiRVJSQSIgOiAiRVJSQUIiKTsKKwl9CisKKwlkYXRhcHRyc1tpXSA9IGRhdGFbaV07CisJZGF0YXB0cnNbal0gPSBkYXRhW2pdOworCisJcmV0dXJuIGVycmEgfHwgZXJyYjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljb25zdCBzdHJ1Y3QgcmFpZDZfY2FsbHMgKmNvbnN0ICphbGdvOworCWNvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9jYWxscyAqY29uc3QgKnJhOworCWludCBpLCBqLCBwMSwgcDI7CisJaW50IGVyciA9IDA7CisKKwltYWtlZGF0YSgwLCBORElTS1MtMSk7CisKKwlmb3IgKHJhID0gcmFpZDZfcmVjb3ZfYWxnb3M7ICpyYTsgcmErKykgeworCQlpZiAoKCpyYSktPnZhbGlkICAmJiAhKCpyYSktPnZhbGlkKCkpCisJCQljb250aW51ZTsKKworCQlyYWlkNl8yZGF0YV9yZWNvdiA9ICgqcmEpLT5kYXRhMjsKKwkJcmFpZDZfZGF0YXBfcmVjb3YgPSAoKnJhKS0+ZGF0YXA7CisKKwkJcHJpbnRmKCJ1c2luZyByZWNvdmVyeSAlc1xuIiwgKCpyYSktPm5hbWUpOworCisJCWZvciAoYWxnbyA9IHJhaWQ2X2FsZ29zOyAqYWxnbzsgYWxnbysrKSB7CisJCQlpZiAoKCphbGdvKS0+dmFsaWQgJiYgISgqYWxnbyktPnZhbGlkKCkpCisJCQkJY29udGludWU7CisKKwkJCXJhaWQ2X2NhbGwgPSAqKmFsZ287CisKKwkJCS8qIE51a2Ugc3luZHJvbWVzICovCisJCQltZW1zZXQoZGF0YVtORElTS1MtMl0sIDB4ZWUsIDIqUEFHRV9TSVpFKTsKKworCQkJLyogR2VuZXJhdGUgYXNzdW1lZCBnb29kIHN5bmRyb21lICovCisJCQlyYWlkNl9jYWxsLmdlbl9zeW5kcm9tZShORElTS1MsIFBBR0VfU0laRSwKKwkJCQkJCSh2b2lkICoqKSZkYXRhcHRycyk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBORElTS1MtMTsgaSsrKQorCQkJCWZvciAoaiA9IGkrMTsgaiA8IE5ESVNLUzsgaisrKQorCQkJCQllcnIgKz0gdGVzdF9kaXNrcyhpLCBqKTsKKworCQkJaWYgKCFyYWlkNl9jYWxsLnhvcl9zeW5kcm9tZSkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChwMSA9IDA7IHAxIDwgTkRJU0tTLTI7IHAxKyspCisJCQkJZm9yIChwMiA9IHAxOyBwMiA8IE5ESVNLUy0yOyBwMisrKSB7CisKKwkJCQkJLyogU2ltdWxhdGUgcm13IHJ1biAqLworCQkJCQlyYWlkNl9jYWxsLnhvcl9zeW5kcm9tZShORElTS1MsIHAxLCBwMiwgUEFHRV9TSVpFLAorCQkJCQkJCQkodm9pZCAqKikmZGF0YXB0cnMpOworCQkJCQltYWtlZGF0YShwMSwgcDIpOworCQkJCQlyYWlkNl9jYWxsLnhvcl9zeW5kcm9tZShORElTS1MsIHAxLCBwMiwgUEFHRV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICoqKSZkYXRhcHRycyk7CisKKwkJCQkJZm9yIChpID0gMDsgaSA8IE5ESVNLUy0xOyBpKyspCisJCQkJCQlmb3IgKGogPSBpKzE7IGogPCBORElTS1M7IGorKykKKwkJCQkJCQllcnIgKz0gdGVzdF9kaXNrcyhpLCBqKTsKKwkJCQl9CisKKwkJfQorCQlwcmludGYoIlxuIik7CisJfQorCisJcHJpbnRmKCJcbiIpOworCS8qIFBpY2sgdGhlIGJlc3QgYWxnb3JpdGhtIHRlc3QgKi8KKwlyYWlkNl9zZWxlY3RfYWxnbygpOworCisJaWYgKGVycikKKwkJcHJpbnRmKCJcbioqKiBFUlJPUlMgRk9VTkQgKioqXG4iKTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi90aWxlZ3gudWMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi90aWxlZ3gudWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRkMjkxYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3RpbGVneC51YwpAQCAtMCwwICsxLDg3IEBACisvKiAtKi0gbGludXgtYyAtKi0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMiBILiBQZXRlciBBbnZpbiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMTIgVGlsZXJhIENvcnBvcmF0aW9uIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiB0aWxlZ3gkIy5jCisgKgorICogJCMtd2F5IHVucm9sbGVkIFRJTEUtR3ggU0lNRCBmb3IgUkFJRC02IG1hdGguCisgKgorICogVGhpcyBmaWxlIGlzIHBvc3Rwcm9jZXNzZWQgdXNpbmcgdW5yb2xsLmF3ay4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhaWQvcHEuaD4KKworLyogQ3JlYXRlIDggYnl0ZSBjb3BpZXMgb2YgY29uc3RhbnQgYnl0ZSAqLworIyBkZWZpbmUgTkJZVEVTKHgpIChfX2luc25fdjFhZGRpKDAsIHgpKQorIyBkZWZpbmUgTlNJWkUgIDgKKworLyoKKyAqIFRoZSBTSExCWVRFKCkgb3BlcmF0aW9uIHNoaWZ0cyBlYWNoIGJ5dGUgbGVmdCBieSAxLCAqbm90KgorICogcm9sbGluZyBvdmVyIGludG8gdGhlIG5leHQgYnl0ZQorICovCitzdGF0aWMgaW5saW5lIF9fYXR0cmlidXRlX2NvbnN0X18gdTY0IFNITEJZVEUodTY0IHYpCit7CisJLyogVmVjdG9yIE9uZSBCeXRlIFNoaWZ0IExlZnQgSW1tZWRpYXRlLiAqLworCXJldHVybiBfX2luc25fdjFzaGxpKHYsIDEpOworfQorCisvKgorICogVGhlIE1BU0soKSBvcGVyYXRpb24gcmV0dXJucyAweEZGIGluIGFueSBieXRlIGZvciB3aGljaCB0aGUgaGlnaAorICogYml0IGlzIDEsIDB4MDAgZm9yIGFueSBieXRlIGZvciB3aGljaCB0aGUgaGlnaCBiaXQgaXMgMC4KKyAqLworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9jb25zdF9fIHU2NCBNQVNLKHU2NCB2KQoreworCS8qIFZlY3RvciBPbmUgQnl0ZSBTaGlmdCBSaWdodCBTaWduZWQgSW1tZWRpYXRlLiAqLworCXJldHVybiBfX2luc25fdjFzaHJzaSh2LCA3KTsKK30KKworCit2b2lkIHJhaWQ2X3RpbGVneCQjX2dlbl9zeW5kcm9tZShpbnQgZGlza3MsIHNpemVfdCBieXRlcywgdm9pZCAqKnB0cnMpCit7CisJdTggKipkcHRyID0gKHU4ICoqKXB0cnM7CisJdTY0ICpwLCAqcTsKKwlpbnQgZCwgeiwgejA7CisKKwl1NjQgd2QkJCwgd3EkJCwgd3AkJCwgdzEkJCwgdzIkJDsKKwl1NjQgeDFkID0gTkJZVEVTKDB4MWQpOworCXU2NCAqIHowcHRyOworCisJejAgPSBkaXNrcyAtIDM7CQkJLyogSGlnaGVzdCBkYXRhIGRpc2sgKi8KKwlwID0gKHU2NCAqKWRwdHJbejArMV07CS8qIFhPUiBwYXJpdHkgKi8KKwlxID0gKHU2NCAqKWRwdHJbejArMl07CS8qIFJTIHN5bmRyb21lICovCisKKwl6MHB0ciA9ICh1NjQgKikmZHB0clt6MF1bMF07CisJZm9yICggZCA9IDAgOyBkIDwgYnl0ZXMgOyBkICs9IE5TSVpFKiQjICkgeworCQl3cSQkID0gd3AkJCA9ICp6MHB0cisrOworCQlmb3IgKCB6ID0gejAtMSA7IHogPj0gMCA7IHotLSApIHsKKwkJCXdkJCQgPSAqKHU2NCAqKSZkcHRyW3pdW2QrJCQqTlNJWkVdOworCQkJd3AkJCA9IHdwJCQgXiB3ZCQkOworCQkJdzIkJCA9IE1BU0sod3EkJCk7CisJCQl3MSQkID0gU0hMQllURSh3cSQkKTsKKwkJCXcyJCQgPSB3MiQkICYgeDFkOworCQkJdzEkJCA9IHcxJCQgXiB3MiQkOworCQkJd3EkJCA9IHcxJCQgXiB3ZCQkOworCQl9CisJCSpwKysgPSB3cCQkOworCQkqcSsrID0gd3EkJDsKKwl9Cit9CisKK2NvbnN0IHN0cnVjdCByYWlkNl9jYWxscyByYWlkNl90aWxlZ3gkIyA9IHsKKwlyYWlkNl90aWxlZ3gkI19nZW5fc3luZHJvbWUsCisJTlVMTCwJCQkvKiBYT1Igbm90IHlldCBpbXBsZW1lbnRlZCAqLworCU5VTEwsCisJInRpbGVneCQjIiwKKwkwCit9OwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmFpZDYvdW5yb2xsLmF3ayBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3Vucm9sbC5hd2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwOTgwNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3Vucm9sbC5hd2sKQEAgLTAsMCArMSwyMCBAQAorCisjIFRoaXMgZmlsdGVyIHJlcXVpcmVzIG9uZSBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIGZvcm0gLXZOPW4KKyMgd2hlcmUgbiBtdXN0IGJlIGEgZGVjaW1hbCBudW1iZXIuCisjCisjIFJlcGVhdCBlYWNoIGlucHV0IGxpbmUgY29udGFpbmluZyAkJCBuIHRpbWVzLCByZXBsYWNpbmcgJCQgd2l0aCAwLi4ubi0xLgorIyBSZXBsYWNlIGVhY2ggJCMgd2l0aCBuLCBhbmQgZWFjaCAkKiB3aXRoIGEgc2luZ2xlICQuCisKK0JFR0lOIHsKKwluID0gTiArIDAKK30KK3sKKwlpZiAoL1wkXCQvKSB7IHJlcCA9IG4gfSBlbHNlIHsgcmVwID0gMSB9CisJZm9yIChpID0gMDsgaSA8IHJlcDsgKytpKSB7CisJCXRtcCA9ICQwCisJCWdzdWIoL1wkXCQvLCBpLCB0bXApCisJCWdzdWIoL1wkIy8sIG4sIHRtcCkKKwkJZ3N1YigvXCRcKi8sICIkIiwgdG1wKQorCQlwcmludCB0bXAKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi94ODYuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhaWQ2L3g4Ni5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGQyNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYWlkNi94ODYuaApAQCAtMCwwICsxLDgwIEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogICBDb3B5cmlnaHQgMjAwMi0yMDA0IEguIFBldGVyIEFudmluIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTMgVGVtcGxlIFBsYWNlIFN0ZSAzMzAsCisgKiAgIEJvc3RvbiBNQSAwMjExMS0xMzA3LCBVU0E7IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb247IGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiByYWlkNi94ODYuaAorICoKKyAqIERlZmluaXRpb25zIGNvbW1vbiB0byB4ODYgYW5kIHg4Ni02NCBSQUlELTYgY29kZSBvbmx5CisgKi8KKworI2lmbmRlZiBMSU5VWF9SQUlEX1JBSUQ2WDg2X0gKKyNkZWZpbmUgTElOVVhfUkFJRF9SQUlENlg4Nl9ICisKKyNpZiAoZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSkgJiYgIWRlZmluZWQoX19hcmNoX3VtX18pCisKKyNpZmRlZiBfX0tFUk5FTF9fIC8qIFJlYWwgY29kZSAqLworCisjaW5jbHVkZSA8YXNtL2ZwdS9hcGkuaD4KKworI2Vsc2UgLyogRHVtbXkgY29kZSBmb3IgdXNlciBzcGFjZSB0ZXN0aW5nICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZWxfZnB1X2JlZ2luKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBrZXJuZWxfZnB1X2VuZCh2b2lkKQoreworfQorCisjZGVmaW5lIF9fYWxpZ25lZCh4KSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHgpKSkKKworI2RlZmluZSBYODZfRkVBVFVSRV9NTVgJCSgwKjMyKzIzKSAvKiBNdWx0aW1lZGlhIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRlhTUgkoMCozMisyNCkgLyogRlhTQVZFIGFuZCBGWFJTVE9SIGluc3RydWN0aW9ucworCQkJCQkgICAqIChmYXN0IHNhdmUgYW5kIHJlc3RvcmUpICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTQkJKDAqMzIrMjUpIC8qIFN0cmVhbWluZyBTSU1EIEV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfWE1NMgkoMCozMisyNikgLyogU3RyZWFtaW5nIFNJTUQgRXh0ZW5zaW9ucy0yICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1hNTTMJKDQqMzIrIDApIC8qICJwbmkiIFNTRS0zICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX1NTU0UzCSg0KjMyKyA5KSAvKiBTdXBwbGVtZW50YWwgU1NFLTMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQVZYCSg0KjMyKzI4KSAvKiBBZHZhbmNlZCBWZWN0b3IgRXh0ZW5zaW9ucyAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlgyICAgICAgICAoOSozMisgNSkgLyogQVZYMiBpbnN0cnVjdGlvbnMgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQVZYNTEyRiAgICAgKDkqMzIrMTYpIC8qIEFWWC01MTIgRm91bmRhdGlvbiAqLworI2RlZmluZSBYODZfRkVBVFVSRV9BVlg1MTJEUSAgICAoOSozMisxNykgLyogQVZYLTUxMiBEUSAoRG91YmxlL1F1YWQgZ3JhbnVsYXIpCisJCQkJCSAgICogSW5zdHJ1Y3Rpb25zCisJCQkJCSAgICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMkJXICAgICg5KjMyKzMwKSAvKiBBVlgtNTEyIEJXIChCeXRlL1dvcmQgZ3JhbnVsYXIpCisJCQkJCSAgICogSW5zdHJ1Y3Rpb25zCisJCQkJCSAgICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX0FWWDUxMlZMICAgICg5KjMyKzMxKSAvKiBBVlgtNTEyIFZMICgxMjgvMjU2IFZlY3RvciBMZW5ndGgpCisJCQkJCSAgICogRXh0ZW5zaW9ucworCQkJCQkgICAqLworI2RlZmluZSBYODZfRkVBVFVSRV9NTVhFWFQJKDEqMzIrMjIpIC8qIEFNRCBNTVggZXh0ZW5zaW9ucyAqLworCisvKiBTaG91bGQgd29yayB3ZWxsIGVub3VnaCBvbiBtb2Rlcm4gQ1BVcyBmb3IgdGVzdGluZyAqLworc3RhdGljIGlubGluZSBpbnQgYm9vdF9jcHVfaGFzKGludCBmbGFnKQoreworCXUzMiBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwllYXggPSAoZmxhZyAmIDB4MTAwKSA/IDcgOgorCQkoZmxhZyAmIDB4MjApID8gMHg4MDAwMDAwMSA6IDE7CisJZWN4ID0gMDsKKworCWFzbSB2b2xhdGlsZSgiY3B1aWQiCisJCSAgICAgOiAiK2EiIChlYXgpLCAiPWIiIChlYngpLCAiPWQiIChlZHgpLCAiK2MiIChlY3gpKTsKKworCXJldHVybiAoKGZsYWcgJiAweDEwMCA/IGVieCA6CisJCShmbGFnICYgMHg4MCkgPyBlY3ggOiBlZHgpID4+IChmbGFnICYgMzEpKSAmIDE7Cit9CisKKyNlbmRpZiAvKiBuZGVmIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JhbmRvbTMyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYW5kb20zMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmM0OGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYW5kb20zMi5jCkBAIC0wLDAgKzEsNDY1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIFRoaXMgaXMgYSBtYXhpbWFsbHkgZXF1aWRpc3RyaWJ1dGVkIGNvbWJpbmVkIFRhdXN3b3J0aGUgZ2VuZXJhdG9yCisgKiBiYXNlZCBvbiBjb2RlIGZyb20gR05VIFNjaWVudGlmaWMgTGlicmFyeSAxLjUgKDMwIEp1biAyMDA0KQorICoKKyAqIGxmc3IxMTMgdmVyc2lvbjoKKyAqCisgKiB4X24gPSAoczFfbiBeIHMyX24gXiBzM19uIF4gczRfbikKKyAqCisgKiBzMV97bisxfSA9ICgoKHMxX24gJiA0Mjk0OTY3Mjk0KSA8PCAxOCkgXiAoKChzMV9uIDw8ICA2KSBeIHMxX24pID4+IDEzKSkKKyAqIHMyX3tuKzF9ID0gKCgoczJfbiAmIDQyOTQ5NjcyODgpIDw8ICAyKSBeICgoKHMyX24gPDwgIDIpIF4gczJfbikgPj4gMjcpKQorICogczNfe24rMX0gPSAoKChzM19uICYgNDI5NDk2NzI4MCkgPDwgIDcpIF4gKCgoczNfbiA8PCAxMykgXiBzM19uKSA+PiAyMSkpCisgKiBzNF97bisxfSA9ICgoKHM0X24gJiA0Mjk0OTY3MTY4KSA8PCAxMykgXiAoKChzNF9uIDw8ICAzKSBeIHM0X24pID4+IDEyKSkKKyAqCisgKiBUaGUgcGVyaW9kIG9mIHRoaXMgZ2VuZXJhdG9yIGlzIGFib3V0IDJeMTEzIChzZWUgZXJyYXR1bSBwYXBlcikuCisgKgorICogRnJvbTogUC4gTCdFY3V5ZXIsICJNYXhpbWFsbHkgRXF1aWRpc3RyaWJ1dGVkIENvbWJpbmVkIFRhdXN3b3J0aGUKKyAqIEdlbmVyYXRvcnMiLCBNYXRoZW1hdGljcyBvZiBDb21wdXRhdGlvbiwgNjUsIDIxMyAoMTk5NiksIDIwMy0tMjEzOgorICogaHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL35sZWN1eWVyL215ZnRwL3BhcGVycy90YXVzbWUucHMKKyAqIGZ0cDovL2Z0cC5pcm8udW1vbnRyZWFsLmNhL3B1Yi9zaW11bGF0aW9uL2xlY3V5ZXIvcGFwZXJzL3RhdXNtZS5wcworICoKKyAqIFRoZXJlIGlzIGFuIGVycmF0dW0gaW4gdGhlIHBhcGVyICJUYWJsZXMgb2YgTWF4aW1hbGx5IEVxdWlkaXN0cmlidXRlZAorICogQ29tYmluZWQgTEZTUiBHZW5lcmF0b3JzIiwgTWF0aGVtYXRpY3Mgb2YgQ29tcHV0YXRpb24sIDY4LCAyMjUgKDE5OTkpLAorICogMjYxLS0yNjk6IGh0dHA6Ly93d3cuaXJvLnVtb250cmVhbC5jYS9+bGVjdXllci9teWZ0cC9wYXBlcnMvdGF1c21lMi5wcworICoKKyAqICAgICAgLi4uIHRoZSBrX2ogbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHpfaiBtdXN0IGJlIG5vbi16ZXJvLAorICogICAgICBmb3IgZWFjaCBqLiAoTm90ZTogdGhpcyByZXN0cmljdGlvbiBhbHNvIGFwcGxpZXMgdG8gdGhlCisgKiAgICAgIGNvbXB1dGVyIGNvZGUgZ2l2ZW4gaW4gWzRdLCBidXQgd2FzIG1pc3Rha2VubHkgbm90IG1lbnRpb25lZAorICogICAgICBpbiB0aGF0IHBhcGVyLikKKyAqCisgKiBUaGlzIGFmZmVjdHMgdGhlIHNlZWRpbmcgcHJvY2VkdXJlIGJ5IGltcG9zaW5nIHRoZSByZXF1aXJlbWVudAorICogczEgPiAxLCBzMiA+IDcsIHMzID4gMTUsIHM0ID4gMTI3LgorICovCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2lmZGVmIENPTkZJR19SQU5ET00zMl9TRUxGVEVTVAorc3RhdGljIHZvaWQgX19pbml0IHByYW5kb21fc3RhdGVfc2VsZnRlc3Qodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHByYW5kb21fc3RhdGVfc2VsZnRlc3Qodm9pZCkKK3sKK30KKyNlbmRpZgorCitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgcm5kX3N0YXRlLCBuZXRfcmFuZF9zdGF0ZSk7CisKKy8qKgorICoJcHJhbmRvbV91MzJfc3RhdGUgLSBzZWVkZWQgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICoJQHN0YXRlOiBwb2ludGVyIHRvIHN0YXRlIHN0cnVjdHVyZSBob2xkaW5nIHNlZWRlZCBzdGF0ZS4KKyAqCisgKglUaGlzIGlzIHVzZWQgZm9yIHBzZXVkby1yYW5kb21uZXNzIHdpdGggbm8gb3V0c2lkZSBzZWVkaW5nLgorICoJRm9yIG1vcmUgcmFuZG9tIHJlc3VsdHMsIHVzZSBwcmFuZG9tX3UzMigpLgorICovCit1MzIgcHJhbmRvbV91MzJfc3RhdGUoc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUpCit7CisjZGVmaW5lIFRBVVNXT1JUSEUocywgYSwgYiwgYywgZCkgKChzICYgYykgPDwgZCkgXiAoKChzIDw8IGEpIF4gcykgPj4gYikKKwlzdGF0ZS0+czEgPSBUQVVTV09SVEhFKHN0YXRlLT5zMSwgIDZVLCAxM1UsIDQyOTQ5NjcyOTRVLCAxOFUpOworCXN0YXRlLT5zMiA9IFRBVVNXT1JUSEUoc3RhdGUtPnMyLCAgMlUsIDI3VSwgNDI5NDk2NzI4OFUsICAyVSk7CisJc3RhdGUtPnMzID0gVEFVU1dPUlRIRShzdGF0ZS0+czMsIDEzVSwgMjFVLCA0Mjk0OTY3MjgwVSwgIDdVKTsKKwlzdGF0ZS0+czQgPSBUQVVTV09SVEhFKHN0YXRlLT5zNCwgIDNVLCAxMlUsIDQyOTQ5NjcxNjhVLCAxM1UpOworCisJcmV0dXJuIChzdGF0ZS0+czEgXiBzdGF0ZS0+czIgXiBzdGF0ZS0+czMgXiBzdGF0ZS0+czQpOworfQorRVhQT1JUX1NZTUJPTChwcmFuZG9tX3UzMl9zdGF0ZSk7CisKKy8qKgorICoJcHJhbmRvbV91MzIgLSBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCisgKglBIDMyIGJpdCBwc2V1ZG8tcmFuZG9tIG51bWJlciBpcyBnZW5lcmF0ZWQgdXNpbmcgYSBmYXN0CisgKglhbGdvcml0aG0gc3VpdGFibGUgZm9yIHNpbXVsYXRpb24uIFRoaXMgYWxnb3JpdGhtIGlzIE5PVAorICoJY29uc2lkZXJlZCBzYWZlIGZvciBjcnlwdG9ncmFwaGljIHVzZS4KKyAqLwordTMyIHByYW5kb21fdTMyKHZvaWQpCit7CisJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCXUzMiByZXM7CisKKwlyZXMgPSBwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7CisJcHV0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0wocHJhbmRvbV91MzIpOworCisvKioKKyAqCXByYW5kb21fYnl0ZXNfc3RhdGUgLSBnZXQgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgcHNldWRvLXJhbmRvbSBieXRlcworICoKKyAqCUBzdGF0ZTogcG9pbnRlciB0byBzdGF0ZSBzdHJ1Y3R1cmUgaG9sZGluZyBzZWVkZWQgc3RhdGUuCisgKglAYnVmOiB3aGVyZSB0byBjb3B5IHRoZSBwc2V1ZG8tcmFuZG9tIGJ5dGVzIHRvCisgKglAYnl0ZXM6IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzCisgKgorICoJVGhpcyBpcyB1c2VkIGZvciBwc2V1ZG8tcmFuZG9tbmVzcyB3aXRoIG5vIG91dHNpZGUgc2VlZGluZy4KKyAqCUZvciBtb3JlIHJhbmRvbSByZXN1bHRzLCB1c2UgcHJhbmRvbV9ieXRlcygpLgorICovCit2b2lkIHByYW5kb21fYnl0ZXNfc3RhdGUoc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ5dGVzKQoreworCXU4ICpwdHIgPSBidWY7CisKKwl3aGlsZSAoYnl0ZXMgPj0gc2l6ZW9mKHUzMikpIHsKKwkJcHV0X3VuYWxpZ25lZChwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSksICh1MzIgKikgcHRyKTsKKwkJcHRyICs9IHNpemVvZih1MzIpOworCQlieXRlcyAtPSBzaXplb2YodTMyKTsKKwl9CisKKwlpZiAoYnl0ZXMgPiAwKSB7CisJCXUzMiByZW0gPSBwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7CisJCWRvIHsKKwkJCSpwdHIrKyA9ICh1OCkgcmVtOworCQkJYnl0ZXMtLTsKKwkJCXJlbSA+Pj0gQklUU19QRVJfQllURTsKKwkJfSB3aGlsZSAoYnl0ZXMgPiAwKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHByYW5kb21fYnl0ZXNfc3RhdGUpOworCisvKioKKyAqCXByYW5kb21fYnl0ZXMgLSBnZXQgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgcHNldWRvLXJhbmRvbSBieXRlcworICoJQGJ1Zjogd2hlcmUgdG8gY29weSB0aGUgcHNldWRvLXJhbmRvbSBieXRlcyB0bworICoJQGJ5dGVzOiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcworICovCit2b2lkIHByYW5kb21fYnl0ZXModm9pZCAqYnVmLCBzaXplX3QgYnl0ZXMpCit7CisJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmZ2V0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworCisJcHJhbmRvbV9ieXRlc19zdGF0ZShzdGF0ZSwgYnVmLCBieXRlcyk7CisJcHV0X2NwdV92YXIobmV0X3JhbmRfc3RhdGUpOworfQorRVhQT1JUX1NZTUJPTChwcmFuZG9tX2J5dGVzKTsKKworc3RhdGljIHZvaWQgcHJhbmRvbV93YXJtdXAoc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUpCit7CisJLyogQ2FsbGluZyBSTkcgdGVuIHRpbWVzIHRvIHNhdGlzZnkgcmVjdXJyZW5jZSBjb25kaXRpb24gKi8KKwlwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7CisJcHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpOworCXByYW5kb21fdTMyX3N0YXRlKHN0YXRlKTsKKwlwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7CisJcHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpOworCXByYW5kb21fdTMyX3N0YXRlKHN0YXRlKTsKKwlwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7CisJcHJhbmRvbV91MzJfc3RhdGUoc3RhdGUpOworCXByYW5kb21fdTMyX3N0YXRlKHN0YXRlKTsKKwlwcmFuZG9tX3UzMl9zdGF0ZShzdGF0ZSk7Cit9CisKK3N0YXRpYyB1MzIgX19leHRyYWN0X2h3c2VlZCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2YWwgPSAwOworCisJKHZvaWQpKGFyY2hfZ2V0X3JhbmRvbV9zZWVkX2ludCgmdmFsKSB8fAorCSAgICAgICBhcmNoX2dldF9yYW5kb21faW50KCZ2YWwpKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHByYW5kb21fc2VlZF9lYXJseShzdHJ1Y3Qgcm5kX3N0YXRlICpzdGF0ZSwgdTMyIHNlZWQsCisJCQkgICAgICAgYm9vbCBtaXhfd2l0aF9od3NlZWQpCit7CisjZGVmaW5lIExDRyh4KQkgKCh4KSAqIDY5MDY5VSkJLyogc3VwZXItZHVwZXIgTENHICovCisjZGVmaW5lIEhXU0VFRCgpIChtaXhfd2l0aF9od3NlZWQgPyBfX2V4dHJhY3RfaHdzZWVkKCkgOiAwKQorCXN0YXRlLT5zMSA9IF9fc2VlZChIV1NFRUQoKSBeIExDRyhzZWVkKSwgICAgICAgIDJVKTsKKwlzdGF0ZS0+czIgPSBfX3NlZWQoSFdTRUVEKCkgXiBMQ0coc3RhdGUtPnMxKSwgICA4VSk7CisJc3RhdGUtPnMzID0gX19zZWVkKEhXU0VFRCgpIF4gTENHKHN0YXRlLT5zMiksICAxNlUpOworCXN0YXRlLT5zNCA9IF9fc2VlZChIV1NFRUQoKSBeIExDRyhzdGF0ZS0+czMpLCAxMjhVKTsKK30KKworLyoqCisgKglwcmFuZG9tX3NlZWQgLSBhZGQgZW50cm9weSB0byBwc2V1ZG8gcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCUBzZWVkOiBzZWVkIHZhbHVlCisgKgorICoJQWRkIHNvbWUgYWRkaXRpb25hbCBzZWVkaW5nIHRvIHRoZSBwcmFuZG9tIHBvb2wuCisgKi8KK3ZvaWQgcHJhbmRvbV9zZWVkKHUzMiBlbnRyb3B5KQoreworCWludCBpOworCS8qCisJICogTm8gbG9ja2luZyBvbiB0aGUgQ1BVcywgYnV0IHRoZW4gc29tZXdoYXQgcmFuZG9tIHJlc3VsdHMgYXJlLCB3ZWxsLAorCSAqIGV4cGVjdGVkLgorCSAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXN0cnVjdCBybmRfc3RhdGUgKnN0YXRlID0gJnBlcl9jcHUobmV0X3JhbmRfc3RhdGUsIGkpOworCisJCXN0YXRlLT5zMSA9IF9fc2VlZChzdGF0ZS0+czEgXiBlbnRyb3B5LCAyVSk7CisJCXByYW5kb21fd2FybXVwKHN0YXRlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHByYW5kb21fc2VlZCk7CisKKy8qCisgKglHZW5lcmF0ZSBzb21lIGluaXRpYWxseSB3ZWFrIHNlZWRpbmcgdmFsdWVzIHRvIGFsbG93CisgKgl0byBzdGFydCB0aGUgcHJhbmRvbV91MzIoKSBlbmdpbmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHByYW5kb21faW5pdCh2b2lkKQoreworCWludCBpOworCisJcHJhbmRvbV9zdGF0ZV9zZWxmdGVzdCgpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJc3RydWN0IHJuZF9zdGF0ZSAqc3RhdGUgPSAmcGVyX2NwdShuZXRfcmFuZF9zdGF0ZSwgaSk7CisJCXUzMiB3ZWFrX3NlZWQgPSAoaSArIGppZmZpZXMpIF4gcmFuZG9tX2dldF9lbnRyb3B5KCk7CisKKwkJcHJhbmRvbV9zZWVkX2Vhcmx5KHN0YXRlLCB3ZWFrX3NlZWQsIHRydWUpOworCQlwcmFuZG9tX3dhcm11cChzdGF0ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9Citjb3JlX2luaXRjYWxsKHByYW5kb21faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fcHJhbmRvbV90aW1lcih1bnNpZ25lZCBsb25nIGRvbnRjYXJlKTsKKworc3RhdGljIERFRklORV9USU1FUihzZWVkX3RpbWVyLCBfX3ByYW5kb21fdGltZXIsIDAsIDApOworCitzdGF0aWMgdm9pZCBfX3ByYW5kb21fdGltZXIodW5zaWduZWQgbG9uZyBkb250Y2FyZSkKK3sKKwl1MzIgZW50cm9weTsKKwl1bnNpZ25lZCBsb25nIGV4cGlyZXM7CisKKwlnZXRfcmFuZG9tX2J5dGVzKCZlbnRyb3B5LCBzaXplb2YoZW50cm9weSkpOworCXByYW5kb21fc2VlZChlbnRyb3B5KTsKKworCS8qIHJlc2VlZCBldmVyeSB+NjAgc2Vjb25kcywgaW4gWzQwIC4uIDgwKSBpbnRlcnZhbCB3aXRoIHNsYWNrICovCisJZXhwaXJlcyA9IDQwICsgcHJhbmRvbV91MzJfbWF4KDQwKTsKKwlzZWVkX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhleHBpcmVzICogTVNFQ19QRVJfU0VDKTsKKworCWFkZF90aW1lcigmc2VlZF90aW1lcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBfX3ByYW5kb21fc3RhcnRfc2VlZF90aW1lcih2b2lkKQoreworCXNlZWRfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDQwICogTVNFQ19QRVJfU0VDKTsKKwlhZGRfdGltZXIoJnNlZWRfdGltZXIpOworfQorCit2b2lkIHByYW5kb21fc2VlZF9mdWxsX3N0YXRlKHN0cnVjdCBybmRfc3RhdGUgX19wZXJjcHUgKnBjcHVfc3RhdGUpCit7CisJaW50IGk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlzdHJ1Y3Qgcm5kX3N0YXRlICpzdGF0ZSA9IHBlcl9jcHVfcHRyKHBjcHVfc3RhdGUsIGkpOworCQl1MzIgc2VlZHNbNF07CisKKwkJZ2V0X3JhbmRvbV9ieXRlcygmc2VlZHMsIHNpemVvZihzZWVkcykpOworCQlzdGF0ZS0+czEgPSBfX3NlZWQoc2VlZHNbMF0sICAgMlUpOworCQlzdGF0ZS0+czIgPSBfX3NlZWQoc2VlZHNbMV0sICAgOFUpOworCQlzdGF0ZS0+czMgPSBfX3NlZWQoc2VlZHNbMl0sICAxNlUpOworCQlzdGF0ZS0+czQgPSBfX3NlZWQoc2VlZHNbM10sIDEyOFUpOworCisJCXByYW5kb21fd2FybXVwKHN0YXRlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHByYW5kb21fc2VlZF9mdWxsX3N0YXRlKTsKKworLyoKKyAqCUdlbmVyYXRlIGJldHRlciB2YWx1ZXMgYWZ0ZXIgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAqCWlzIGZ1bGx5IGluaXRpYWxpemVkLgorICovCitzdGF0aWMgdm9pZCBfX3ByYW5kb21fcmVzZWVkKGJvb2wgbGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0YXRpYyBib29sIGxhdGNoID0gZmFsc2U7CisJc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworCS8qIEFza2luZyBmb3IgcmFuZG9tIGJ5dGVzIG1pZ2h0IHJlc3VsdCBpbiBieXRlcyBnZXR0aW5nCisJICogbW92ZWQgaW50byB0aGUgbm9uYmxvY2tpbmcgcG9vbCBhbmQgdGh1cyBtYXJraW5nIGl0CisJICogYXMgaW5pdGlhbGl6ZWQuIEluIHRoaXMgY2FzZSB3ZSB3b3VsZCBkb3VibGUgYmFjayBpbnRvCisJICogdGhpcyBmdW5jdGlvbiBhbmQgYXR0ZW1wdCB0byBkbyBhIGxhdGUgcmVzZWVkLgorCSAqIElnbm9yZSB0aGUgcG9pbnRsZXNzIGF0dGVtcHQgdG8gcmVzZWVkIGFnYWluIGlmIHdlJ3JlCisJICogYWxyZWFkeSB3YWl0aW5nIGZvciBieXRlcyB3aGVuIHRoZSBub25ibG9ja2luZyBwb29sCisJICogZ290IGluaXRpYWxpemVkLgorCSAqLworCisJLyogb25seSBhbGxvdyBpbml0aWFsIHNlZWRpbmcgKGxhdGUgPT0gZmFsc2UpIG9uY2UgKi8KKwlpZiAoIXNwaW5fdHJ5bG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncykpCisJCXJldHVybjsKKworCWlmIChsYXRjaCAmJiAhbGF0ZSkKKwkJZ290byBvdXQ7CisKKwlsYXRjaCA9IHRydWU7CisJcHJhbmRvbV9zZWVkX2Z1bGxfc3RhdGUoJm5ldF9yYW5kX3N0YXRlKTsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgcHJhbmRvbV9yZXNlZWRfbGF0ZSh2b2lkKQoreworCV9fcHJhbmRvbV9yZXNlZWQodHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByYW5kb21fcmVzZWVkKHZvaWQpCit7CisJX19wcmFuZG9tX3Jlc2VlZChmYWxzZSk7CisJX19wcmFuZG9tX3N0YXJ0X3NlZWRfdGltZXIoKTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwocHJhbmRvbV9yZXNlZWQpOworCisjaWZkZWYgQ09ORklHX1JBTkRPTTMyX1NFTEZURVNUCitzdGF0aWMgc3RydWN0IHByYW5kb21fdGVzdDEgeworCXUzMiBzZWVkOworCXUzMiByZXN1bHQ7Cit9IHRlc3QxW10gPSB7CisJeyAxVSwgMzQ4NDM1MTY4NVUgfSwKKwl7IDJVLCAyNjIzMTMwMDU5VSB9LAorCXsgM1UsIDMxMjUxMzM4OTNVIH0sCisJeyA0VSwgIDk4NDg0NzI1NFUgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcHJhbmRvbV90ZXN0MiB7CisJdTMyIHNlZWQ7CisJdTMyIGl0ZXJhdGlvbjsKKwl1MzIgcmVzdWx0OworfSB0ZXN0MltdID0geworCS8qIFRlc3QgY2FzZXMgYWdhaW5zdCB0YXVzMTEzIGZyb20gR1NMIGxpYnJhcnkuICovCisJeyAgOTMxNTU3NjU2VSwgOTU5VSwgMjk3NTU5Mzc4MlUgfSwKKwl7IDEzMzk2OTMyOTVVLCA4NzZVLCAzODg3Nzc2NTMyVSB9LAorCXsgMTU0NTU1NjI4NVUsIDk2MVUsIDE2MTU1Mzg4MzNVIH0sCisJeyAgNjAxNzMwNzc2VSwgNzIzVSwgMTc3NjE2MjY1MVUgfSwKKwl7IDEwMjc1MTYwNDdVLCA2ODdVLCAgNTExOTgzMDc5VSB9LAorCXsgIDQxNjUyNjI5OFUsIDcwMFUsICA5MTYxNTY1NTJVIH0sCisJeyAxMzk1NTIyMDMyVSwgNjUyVSwgMjIyMjA2MzY3NlUgfSwKKwl7ICAzNjYyMjE0NDNVLCA2MTdVLCAyOTkyODU3NzYzVSB9LAorCXsgMTUzOTgzNjk2NVUsIDcxNFUsIDM3ODMyNjU3MjVVIH0sCisJeyAgNTU2MjA2NjcxVSwgOTk0VSwgIDc5OTYyNjQ1OVUgfSwKKwl7ICA2ODQ5MDcyMThVLCA3OTlVLCAgMzY3Nzg5NDkxVSB9LAorCXsgMjEyMTIzMDcwMVUsIDkzMVUsIDIxMTU0NjcwMDFVIH0sCisJeyAxNjY4NTE2NDUxVSwgNjQ0VSwgMzYyMDU5MDY4NVUgfSwKKwl7ICA3NjgwNDYwNjZVLCA4ODNVLCAyMDM0MDc3MzkwVSB9LAorCXsgMTk4OTE1OTEzNlUsIDgzM1UsIDExOTU3NjczMDVVIH0sCisJeyAgNTM2NTg1MTQ1VSwgOTk2VSwgMzU3NzI1OTIwNFUgfSwKKwl7IDEwMDgxMjkzNzNVLCA2NDJVLCAxNDc4MDgwNzc2VSB9LAorCXsgMTc0MDc3NTYwNFUsIDkzOVUsIDEyNjQ5ODAzNzJVIH0sCisJeyAxOTY3ODgzMTYzVSwgNTA4VSwgICAxMDczNDYyNFUgfSwKKwl7IDE5MjMwMTk2OTdVLCA3MzBVLCAzODIxNDE5NjI5VSB9LAorCXsgIDQ0MjA3OTkzMlUsIDU2MFUsIDM0NDAwMzIzNDNVIH0sCisJeyAxOTYxMzAyNzE0VSwgODQ1VSwgIDg0MTk2MjU3MlUgfSwKKwl7IDIwMzAyMDU5NjRVLCA5NjJVLCAxMzI1MTQ0MjI3VSB9LAorCXsgMTE2MDQwNzUyOVUsIDUwN1UsICAyNDA5NDA4NThVIH0sCisJeyAgNjM1NDgyNTAyVSwgNzc5VSwgNDIwMDQ4OTc0NlUgfSwKKwl7IDEyNTI3ODg5MzFVLCA2OTlVLCAgODY3MTk1NDM0VSB9LAorCXsgMTk2MTgxNzEzMVUsIDcxOVUsICA2NjgyMzc2NTdVIH0sCisJeyAxMDcxNDY4MjE2VSwgOTgzVSwgIDkxNzg3NjYzMFUgfSwKKwl7IDEyODE4NDgzNjdVLCA5MzJVLCAxMDAzMTAwMDM5VSB9LAorCXsgIDU4MjUzNzExOVUsIDc4MFUsIDExMjcyNzM3NzhVIH0sCisJeyAxOTczNjcyNzc3VSwgODUzVSwgMTA3MTM2ODg3MlUgfSwKKwl7IDE4OTY3NTY5OTZVLCA3NjJVLCAxMTI3ODUxMDU1VSB9LAorCXsgIDg0NzkxNzA1NFUsIDUwMFUsIDE3MTc0OTkwNzVVIH0sCisJeyAxMjQwNTIwNTEwVSwgOTUxVSwgMjg0OTU3NjY1N1UgfSwKKwl7IDE2ODUwNzE2ODJVLCA1NjdVLCAxOTYxODEwMzk2VSB9LAorCXsgMTUxNjIzMjEyOVUsIDU1N1UsICAgIDMxNzM4NzdVIH0sCisJeyAxMjA4MTE4OTAzVSwgNjEyVSwgMTYxMzE0NTAyMlUgfSwKKwl7IDE4MTcyNjk5MjdVLCA2OTNVLCA0Mjc5MTIyNTczVSB9LAorCXsgMTUxMDA5MTcwMVUsIDcxN1UsICA2MzgxOTEyMjlVIH0sCisJeyAgMzY1OTE2ODUwVSwgODA3VSwgIDYwMDQyNDMxNFUgfSwKKwl7ICAzOTkzMjQzNTlVLCA3MDJVLCAxODAzNTk4MTE2VSB9LAorCXsgMTMxODQ4MDI3NFUsIDc3OVUsIDIwNzQyMzcwMjJVIH0sCisJeyAgNjk3NzU4MTE1VSwgODQwVSwgMTQ4MzYzOTQwMlUgfSwKKwl7IDE2OTY1MDc3NzNVLCA4NDBVLCAgNTc3NDE1NDQ3VSB9LAorCXsgMjA4MTk3OTEyMVUsIDk4MVUsIDMwNDE0ODY0NDlVIH0sCisJeyAgOTU1NjQ2Njg3VSwgNzQyVSwgMzg0NjQ5NDM1N1UgfSwKKwl7IDEyNTA2ODM1MDZVLCA3NDlVLCAgODM2NDE5ODU5VSB9LAorCXsgIDU5NTAwMzEwMlUsIDUzNFUsICAzNjY3OTQxMDlVIH0sCisJeyAgIDQ3NDg1MzM4VSwgNTU4VSwgMzUyMTEyMDgzNFUgfSwKKwl7ICA2MTk0MzM0NzlVLCA2MTBVLCAzOTkxNzgzODc1VSB9LAorCXsgIDcwNDA5NjUyMFUsIDUxOFUsIDQxMzk0OTM4NTJVIH0sCisJeyAxNzEyMjI0OTg0VSwgNjA2VSwgMjM5MzMxMjAwM1UgfSwKKwl7IDEzMTgyMzMxNTJVLCA5MjJVLCAzODgwMzYxMTM0VSB9LAorCXsgIDg1NTU3Mjk5MlUsIDc2MVUsIDE0NzI5NzQ3ODdVIH0sCisJeyAgIDY0NzIxNDIxVSwgNzAzVSwgIDY4Mzg2MDU1MFUgfSwKKwl7ICA2Nzg5MzE3NThVLCA4NDBVLCAgMzgwNjE2MDQzVSB9LAorCXsgIDY5MjcxMTk3M1UsIDc3OFUsIDEzODIzNjE5NDdVIH0sCisJeyAgNjc3NzAzNjE5VSwgNTMwVSwgMjgyNjkxNDE2MVUgfSwKKwl7ICAgOTIzOTMyMjNVLCA1ODZVLCAxNTIyMTI4NDcxVSB9LAorCXsgMTIyMjU5MjkyMFUsIDc0M1UsIDM0NjY3MjY2NjdVIH0sCisJeyAgMzU4Mjg4OTg2VSwgNjk1VSwgMTA5MTk1Njk5OFUgfSwKKwl7IDE5MzUwNTY5NDVVLCA5NThVLCAgNTE0ODY0NDc3VSB9LAorCXsgIDczNTY3NTk5M1UsIDk5MFUsIDEyOTQyMzk5ODlVIH0sCisJeyAxNTYwMDg5NDAyVSwgODk3VSwgMjIzODU1MTI4N1UgfSwKKwl7ICAgNzA2MTYzNjFVLCA4MjlVLCAgIDIyNDgzMDk4VSB9LAorCXsgIDM2ODIzNDcwMFUsIDczMVUsIDI5MTM4NzUwODRVIH0sCisJeyAgIDIwMjIxMTkwVSwgODc5VSwgMTU2NDE1Mjk3MFUgfSwKKwl7ICA1Mzk0NDQ2NTRVLCA2ODJVLCAxODM1MTQxMjU5VSB9LAorCXsgMTMxNDk4NzI5N1UsIDg0MFUsIDE4MDExMTQxMzZVIH0sCisJeyAyMDE5Mjk1NTQ0VSwgNjQ1VSwgMzI4NjQzODkzMFUgfSwKKwl7ICA0NjkwMjM4MzhVLCA3MTZVLCAxNjM3OTE4MjAyVSB9LAorCXsgMTg0Mzc1NDQ5NlUsIDY1M1UsIDI1NjIwOTIxNTJVIH0sCisJeyAgNDAwNjcyMDM2VSwgODA5VSwgNDI2NDIxMjc4NVUgfSwKKwl7ICA0MDQ3MjIyNDlVLCA5NjVVLCAyNzA0MTE2OTk5VSB9LAorCXsgIDYwMDcwMjIwOVUsIDc1OFUsICA1ODQ5Nzk5ODZVIH0sCisJeyAgNTE5OTUzOTU0VSwgNjY3VSwgMjU3NDQzNjIzN1UgfSwKKwl7IDE2NTgwNzExMjZVLCA2OTRVLCAyMjE0NTY5NDkwVSB9LAorCXsgIDQyMDQ4MDAzN1UsIDc0OVUsIDM0MzAwMTA4NjZVIH0sCisJeyAgNjkwMTAzNjQ3VSwgOTY5VSwgMzcwMDc1ODA4M1UgfSwKKwl7IDEwMjk0MjQ3OTlVLCA5MzdVLCAzNzg3NzQ2ODQxVSB9LAorCXsgMjAxMjYwODY2OVUsIDUwNlUsIDMzNjI2Mjg5NzNVIH0sCisJeyAxNTM1NDMyODg3VSwgOTk4VSwgICA0MjYxMDk0M1UgfSwKKwl7IDEzMzA2MzU1MzNVLCA4NTdVLCAzMDQwODA2NTA0VSB9LAorCXsgMTIyMzgwMDU1MFUsIDUzOVUsIDM5NTQyMjk1MTdVIH0sCisJeyAxMzIyNDExNTM3VSwgNjgwVSwgMzIyMzI1MDMyNFUgfSwKKwl7IDE4Nzc4NDc4OThVLCA5NDVVLCAyOTE1MTQ3MTQzVSB9LAorCXsgMTY0NjM1NjA5OVUsIDg3NFUsICA5NjU5ODgyODBVIH0sCisJeyAgODA1Njg3NTM2VSwgNzQ0VSwgNDAzMjI3NzkyMFUgfSwKKwl7IDE5NDgwOTMyMTBVLCA2MzNVLCAxMzQ2NTk3Njg0VSB9LAorCXsgIDM5MjYwOTc0NFUsIDc4M1UsIDE2MzYwODMyOTVVIH0sCisJeyAgNjkwMjQxMzA0VSwgNzcwVSwgMTIwMTAzMTI5OFUgfSwKKwl7IDEzNjAzMDI5NjVVLCA2OTZVLCAxNjY1Mzk0NDYxVSB9LAorCXsgMTIyMDA5MDk0NlUsIDc4MFUsIDEzMTY5MjI4MTJVIH0sCisJeyAgNDQ3MDkyMjUxVSwgNTAwVSwgMzQzODc0MzM3NVUgfSwKKwl7IDE2MTM4Njg3OTFVLCA1OTJVLCAgODI4NTQ2ODgzVSB9LAorCXsgIDUyMzQzMDk1MVUsIDU0OFUsIDI1NTIzOTIzMDRVIH0sCisJeyAgNzI2NjkyODk5VSwgODEwVSwgMTY1Njg3Mjg2N1UgfSwKKwl7IDEzNjQzNDAwMjFVLCA4MzZVLCAzNzEwNTEzNDg2VSB9LAorCXsgMTk4NjI1NzcyOVUsIDkzMVUsICA5MzUwMTM5NjJVIH0sCisJeyAgNDA3OTgzOTY0VSwgOTIxVSwgIDcyODc2NzA1OVUgfSwKK307CisKK3N0YXRpYyB2b2lkIF9faW5pdCBwcmFuZG9tX3N0YXRlX3NlbGZ0ZXN0KHZvaWQpCit7CisJaW50IGksIGosIGVycm9ycyA9IDAsIHJ1bnMgPSAwOworCWJvb2wgZXJyb3IgPSBmYWxzZTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3QxKTsgaSsrKSB7CisJCXN0cnVjdCBybmRfc3RhdGUgc3RhdGU7CisKKwkJcHJhbmRvbV9zZWVkX2Vhcmx5KCZzdGF0ZSwgdGVzdDFbaV0uc2VlZCwgZmFsc2UpOworCQlwcmFuZG9tX3dhcm11cCgmc3RhdGUpOworCisJCWlmICh0ZXN0MVtpXS5yZXN1bHQgIT0gcHJhbmRvbV91MzJfc3RhdGUoJnN0YXRlKSkKKwkJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwlpZiAoZXJyb3IpCisJCXByX3dhcm4oInByYW5kb206IHNlZWQgYm91bmRhcnkgc2VsZiB0ZXN0IGZhaWxlZFxuIik7CisJZWxzZQorCQlwcl9pbmZvKCJwcmFuZG9tOiBzZWVkIGJvdW5kYXJ5IHNlbGYgdGVzdCBwYXNzZWRcbiIpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVzdDIpOyBpKyspIHsKKwkJc3RydWN0IHJuZF9zdGF0ZSBzdGF0ZTsKKworCQlwcmFuZG9tX3NlZWRfZWFybHkoJnN0YXRlLCB0ZXN0MltpXS5zZWVkLCBmYWxzZSk7CisJCXByYW5kb21fd2FybXVwKCZzdGF0ZSk7CisKKwkJZm9yIChqID0gMDsgaiA8IHRlc3QyW2ldLml0ZXJhdGlvbiAtIDE7IGorKykKKwkJCXByYW5kb21fdTMyX3N0YXRlKCZzdGF0ZSk7CisKKwkJaWYgKHRlc3QyW2ldLnJlc3VsdCAhPSBwcmFuZG9tX3UzMl9zdGF0ZSgmc3RhdGUpKQorCQkJZXJyb3JzKys7CisKKwkJcnVucysrOworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwlpZiAoZXJyb3JzKQorCQlwcl93YXJuKCJwcmFuZG9tOiAlZC8lZCBzZWxmIHRlc3RzIGZhaWxlZFxuIiwgZXJyb3JzLCBydW5zKTsKKwllbHNlCisJCXByX2luZm8oInByYW5kb206ICVkIHNlbGYgdGVzdHMgcGFzc2VkXG4iLCBydW5zKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmF0ZWxpbWl0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYXRlbGltaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDFmNDcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmF0ZWxpbWl0LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIHJhdGVsaW1pdC5jIC0gRG8gc29tZXRoaW5nIHdpdGggcmF0ZSBsaW1pdC4KKyAqCisgKiBJc29sYXRlZCBmcm9tIGtlcm5lbC9wcmludGsuYyBieSBEYXZlIFlvdW5nIDxoaWRhdmUuZGFya3N0YXJAZ21haWwuY29tPgorICoKKyAqIDIwMDgtMDUtMDEgcmV3cml0ZSB0aGUgZnVuY3Rpb24gYW5kIHVzZSBhIHJhdGVsaW1pdF9zdGF0ZSBkYXRhIHN0cnVjdCBhcworICogcGFyYW1ldGVyLiBOb3cgZXZlcnkgdXNlciBjYW4gdXNlIHRoZWlyIG93biBzdGFuZGFsb25lIHJhdGVsaW1pdF9zdGF0ZS4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTHYyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisKKy8qCisgKiBfX3JhdGVsaW1pdCAtIHJhdGUgbGltaXRpbmcKKyAqIEByczogcmF0ZWxpbWl0X3N0YXRlIGRhdGEKKyAqIEBmdW5jOiBuYW1lIG9mIGNhbGxpbmcgZnVuY3Rpb24KKyAqCisgKiBUaGlzIGVuZm9yY2VzIGEgcmF0ZSBsaW1pdDogbm90IG1vcmUgdGhhbiBAcnMtPmJ1cnN0IGNhbGxiYWNrcworICogaW4gZXZlcnkgQHJzLT5pbnRlcnZhbAorICoKKyAqIFJFVFVSTlM6CisgKiAwIG1lYW5zIGNhbGxiYWNrcyB3aWxsIGJlIHN1cHByZXNzZWQuCisgKiAxIG1lYW5zIGdvIGFoZWFkIGFuZCBkbyBpdC4KKyAqLworaW50IF9fX3JhdGVsaW1pdChzdHJ1Y3QgcmF0ZWxpbWl0X3N0YXRlICpycywgY29uc3QgY2hhciAqZnVuYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlpZiAoIXJzLT5pbnRlcnZhbCkKKwkJcmV0dXJuIDE7CisKKwkvKgorCSAqIElmIHdlIGNvbnRlbmQgb24gdGhpcyBzdGF0ZSdzIGxvY2sgdGhlbiBhbG1vc3QKKwkgKiBieSBkZWZpbml0aW9uIHdlIGFyZSB0b28gYnVzeSB0byBwcmludCBhIG1lc3NhZ2UsCisJICogaW4gYWRkaXRpb24gdG8gdGhlIG9uZSB0aGF0IHdpbGwgYmUgcHJpbnRlZCBieQorCSAqIHRoZSBlbnRpdHkgdGhhdCBpcyBob2xkaW5nIHRoZSBsb2NrIGFscmVhZHk6CisJICovCisJaWYgKCFyYXdfc3Bpbl90cnlsb2NrX2lycXNhdmUoJnJzLT5sb2NrLCBmbGFncykpCisJCXJldHVybiAwOworCisJaWYgKCFycy0+YmVnaW4pCisJCXJzLT5iZWdpbiA9IGppZmZpZXM7CisKKwlpZiAodGltZV9pc19iZWZvcmVfamlmZmllcyhycy0+YmVnaW4gKyBycy0+aW50ZXJ2YWwpKSB7CisJCWlmIChycy0+bWlzc2VkKSB7CisJCQlpZiAoIShycy0+ZmxhZ3MgJiBSQVRFTElNSVRfTVNHX09OX1JFTEVBU0UpKSB7CisJCQkJcHJpbnRrX2RlZmVycmVkKEtFUk5fV0FSTklORworCQkJCQkJIiVzOiAlZCBjYWxsYmFja3Mgc3VwcHJlc3NlZFxuIiwKKwkJCQkJCWZ1bmMsIHJzLT5taXNzZWQpOworCQkJCXJzLT5taXNzZWQgPSAwOworCQkJfQorCQl9CisJCXJzLT5iZWdpbiAgID0gamlmZmllczsKKwkJcnMtPnByaW50ZWQgPSAwOworCX0KKwlpZiAocnMtPmJ1cnN0ICYmIHJzLT5idXJzdCA+IHJzLT5wcmludGVkKSB7CisJCXJzLT5wcmludGVkKys7CisJCXJldCA9IDE7CisJfSBlbHNlIHsKKwkJcnMtPm1pc3NlZCsrOworCQlyZXQgPSAwOworCX0KKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKF9fX3JhdGVsaW1pdCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYXRpb25hbC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmF0aW9uYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc0NDM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmF0aW9uYWwuYwpAQCAtMCwwICsxLDY1IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoKKyAqIHJhdGlvbmFsIGZyYWN0aW9ucworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBlbWxpeCBHbWJILCBPc2thciBTY2hpcm1lciA8b3NrYXJAc2NhcmEuY29tPgorICoKKyAqIGhlbHBlciBmdW5jdGlvbnMgd2hlbiBjb3Bpbmcgd2l0aCByYXRpb25hbCBudW1iZXJzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3JhdGlvbmFsLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworLyoKKyAqIGNhbGN1bGF0ZSBiZXN0IHJhdGlvbmFsIGFwcHJveGltYXRpb24gZm9yIGEgZ2l2ZW4gZnJhY3Rpb24KKyAqIHRha2luZyBpbnRvIGFjY291bnQgcmVzdHJpY3RlZCByZWdpc3RlciBzaXplLCBlLmcuIHRvIGZpbmQKKyAqIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgYSBwbGwgd2l0aCA1IGJpdCBkZW5vbWluYXRvciBhbmQKKyAqIDggYml0IG51bWVyYXRvciByZWdpc3RlciBmaWVsZHMsIHRyeWluZyB0byBzZXQgdXAgd2l0aCBhCisgKiBmcmVxdWVuY3kgcmF0aW8gb2YgMy4xNDE1LCBvbmUgd291bGQgc2F5OgorICoKKyAqIHJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbigzMTQxNSwgMTAwMDAsCisgKgkJKDEgPDwgOCkgLSAxLCAoMSA8PCA1KSAtIDEsICZuLCAmZCk7CisgKgorICogeW91IG1heSBsb29rIGF0IGdpdmVuX251bWVyYXRvciBhcyBhIGZpeGVkIHBvaW50IG51bWJlciwKKyAqIHdpdGggdGhlIGZyYWN0aW9uYWwgcGFydCBzaXplIGRlc2NyaWJlZCBpbiBnaXZlbl9kZW5vbWluYXRvci4KKyAqCisgKiBmb3IgdGhlb3JldGljYWwgYmFja2dyb3VuZCwgc2VlOgorICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db250aW51ZWRfZnJhY3Rpb24KKyAqLworCit2b2lkIHJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbigKKwl1bnNpZ25lZCBsb25nIGdpdmVuX251bWVyYXRvciwgdW5zaWduZWQgbG9uZyBnaXZlbl9kZW5vbWluYXRvciwKKwl1bnNpZ25lZCBsb25nIG1heF9udW1lcmF0b3IsIHVuc2lnbmVkIGxvbmcgbWF4X2Rlbm9taW5hdG9yLAorCXVuc2lnbmVkIGxvbmcgKmJlc3RfbnVtZXJhdG9yLCB1bnNpZ25lZCBsb25nICpiZXN0X2Rlbm9taW5hdG9yKQoreworCXVuc2lnbmVkIGxvbmcgbiwgZCwgbjAsIGQwLCBuMSwgZDE7CisJbiA9IGdpdmVuX251bWVyYXRvcjsKKwlkID0gZ2l2ZW5fZGVub21pbmF0b3I7CisJbjAgPSBkMSA9IDA7CisJbjEgPSBkMCA9IDE7CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nIHQsIGE7CisJCWlmICgobjEgPiBtYXhfbnVtZXJhdG9yKSB8fCAoZDEgPiBtYXhfZGVub21pbmF0b3IpKSB7CisJCQluMSA9IG4wOworCQkJZDEgPSBkMDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkID09IDApCisJCQlicmVhazsKKwkJdCA9IGQ7CisJCWEgPSBuIC8gZDsKKwkJZCA9IG4gJSBkOworCQluID0gdDsKKwkJdCA9IG4wICsgYSAqIG4xOworCQluMCA9IG4xOworCQluMSA9IHQ7CisJCXQgPSBkMCArIGEgKiBkMTsKKwkJZDAgPSBkMTsKKwkJZDEgPSB0OworCX0KKwkqYmVzdF9udW1lcmF0b3IgPSBuMTsKKwkqYmVzdF9kZW5vbWluYXRvciA9IGQxOworfQorCitFWFBPUlRfU1lNQk9MKHJhdGlvbmFsX2Jlc3RfYXBwcm94aW1hdGlvbik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYnRyZWUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JidHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGE5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYnRyZWUuYwpAQCAtMCwwICsxLDY2NiBAQAorLyoKKyAgUmVkIEJsYWNrIFRyZWVzCisgIChDKSAxOTk5ICBBbmRyZWEgQXJjYW5nZWxpIDxhbmRyZWFAc3VzZS5kZT4KKyAgKEMpIDIwMDIgIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAgKEMpIDIwMTIgIE1pY2hlbCBMZXNwaW5hc3NlIDx3YWxrZW5AZ29vZ2xlLmNvbT4KKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorCisgIGxpbnV4L2xpYi9yYnRyZWUuYworKi8KKworI2luY2x1ZGUgPGxpbnV4L3JidHJlZV9hdWdtZW50ZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworLyoKKyAqIHJlZC1ibGFjayB0cmVlcyBwcm9wZXJ0aWVzOiAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9SYnRyZWUKKyAqCisgKiAgMSkgQSBub2RlIGlzIGVpdGhlciByZWQgb3IgYmxhY2sKKyAqICAyKSBUaGUgcm9vdCBpcyBibGFjaworICogIDMpIEFsbCBsZWF2ZXMgKE5VTEwpIGFyZSBibGFjaworICogIDQpIEJvdGggY2hpbGRyZW4gb2YgZXZlcnkgcmVkIG5vZGUgYXJlIGJsYWNrCisgKiAgNSkgRXZlcnkgc2ltcGxlIHBhdGggZnJvbSByb290IHRvIGxlYXZlcyBjb250YWlucyB0aGUgc2FtZSBudW1iZXIKKyAqICAgICBvZiBibGFjayBub2Rlcy4KKyAqCisgKiAgNCBhbmQgNSBnaXZlIHRoZSBPKGxvZyBuKSBndWFyYW50ZWUsIHNpbmNlIDQgaW1wbGllcyB5b3UgY2Fubm90IGhhdmUgdHdvCisgKiAgY29uc2VjdXRpdmUgcmVkIG5vZGVzIGluIGEgcGF0aCBhbmQgZXZlcnkgcmVkIG5vZGUgaXMgdGhlcmVmb3JlIGZvbGxvd2VkIGJ5CisgKiAgYSBibGFjay4gU28gaWYgQiBpcyB0aGUgbnVtYmVyIG9mIGJsYWNrIG5vZGVzIG9uIGV2ZXJ5IHNpbXBsZSBwYXRoIChhcyBwZXIKKyAqICA1KSwgdGhlbiB0aGUgbG9uZ2VzdCBwb3NzaWJsZSBwYXRoIGR1ZSB0byA0IGlzIDJCLgorICoKKyAqICBXZSBzaGFsbCBpbmRpY2F0ZSBjb2xvciB3aXRoIGNhc2UsIHdoZXJlIGJsYWNrIG5vZGVzIGFyZSB1cHBlcmNhc2UgYW5kIHJlZAorICogIG5vZGVzIHdpbGwgYmUgbG93ZXJjYXNlLiBVbmtub3duIGNvbG9yIG5vZGVzIHNoYWxsIGJlIGRyYXduIGFzIHJlZCB3aXRoaW4KKyAqICBwYXJlbnRoZXNlcyBhbmQgaGF2ZSBzb21lIGFjY29tcGFueWluZyB0ZXh0IGNvbW1lbnQuCisgKi8KKworLyoKKyAqIE5vdGVzIG9uIGxvY2tsZXNzIGxvb2t1cHM6CisgKgorICogQWxsIHN0b3JlcyB0byB0aGUgdHJlZSBzdHJ1Y3R1cmUgKHJiX2xlZnQgYW5kIHJiX3JpZ2h0KSBtdXN0IGJlIGRvbmUgdXNpbmcKKyAqIFdSSVRFX09OQ0UoKS4gQW5kIHdlIG11c3Qgbm90IGluYWR2ZXJ0ZW50bHkgY2F1c2UgKHRlbXBvcmFyeSkgbG9vcHMgaW4gdGhlCisgKiB0cmVlIHN0cnVjdHVyZSBhcyBzZWVuIGluIHByb2dyYW0gb3JkZXIuCisgKgorICogVGhlc2UgdHdvIHJlcXVpcmVtZW50cyB3aWxsIGFsbG93IGxvY2tsZXNzIGl0ZXJhdGlvbiBvZiB0aGUgdHJlZSAtLSBub3QKKyAqIGNvcnJlY3QgaXRlcmF0aW9uIG1pbmQgeW91LCB0cmVlIHJvdGF0aW9ucyBhcmUgbm90IGF0b21pYyBzbyBhIGxvb2t1cCBtaWdodAorICogbWlzcyBlbnRpcmUgc3VidHJlZXMuCisgKgorICogQnV0IHRoZXkgZG8gZ3VhcmFudGVlIHRoYXQgYW55IHN1Y2ggdHJhdmVyc2FsIHdpbGwgb25seSBzZWUgdmFsaWQgZWxlbWVudHMKKyAqIGFuZCB0aGF0IGl0IHdpbGwgaW5kZWVkIGNvbXBsZXRlIC0tIGRvZXMgbm90IGdldCBzdHVjayBpbiBhIGxvb3AuCisgKgorICogSXQgYWxzbyBndWFyYW50ZWVzIHRoYXQgaWYgdGhlIGxvb2t1cCByZXR1cm5zIGFuIGVsZW1lbnQgaXQgaXMgdGhlICdjb3JyZWN0JworICogb25lLiBCdXQgbm90IHJldHVybmluZyBhbiBlbGVtZW50IGRvZXMgX05PVF8gbWVhbiBpdCdzIG5vdCBwcmVzZW50LgorICoKKyAqIE5PVEU6CisgKgorICogU3RvcmVzIHRvIF9fcmJfcGFyZW50X2NvbG9yIGFyZSBub3QgaW1wb3J0YW50IGZvciBzaW1wbGUgbG9va3VwcyBzbyB0aG9zZQorICogYXJlIGxlZnQgdW5kb25lIGFzIG9mIG5vdy4gTm9yIGRpZCBJIGNoZWNrIGZvciBsb29wcyBpbnZvbHZpbmcgcGFyZW50CisgKiBwb2ludGVycy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfc2V0X2JsYWNrKHN0cnVjdCByYl9ub2RlICpyYikKK3sKKwlyYi0+X19yYl9wYXJlbnRfY29sb3IgfD0gUkJfQkxBQ0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJiX25vZGUgKnJiX3JlZF9wYXJlbnQoc3RydWN0IHJiX25vZGUgKnJlZCkKK3sKKwlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopcmVkLT5fX3JiX3BhcmVudF9jb2xvcjsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3Igcm90YXRpb25zOgorICogLSBvbGQncyBwYXJlbnQgYW5kIGNvbG9yIGdldCBhc3NpZ25lZCB0byBuZXcKKyAqIC0gb2xkIGdldHMgYXNzaWduZWQgbmV3IGFzIGEgcGFyZW50IGFuZCAnY29sb3InIGFzIGEgY29sb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19yYl9yb3RhdGVfc2V0X3BhcmVudHMoc3RydWN0IHJiX25vZGUgKm9sZCwgc3RydWN0IHJiX25vZGUgKm5ldywKKwkJCXN0cnVjdCByYl9yb290ICpyb290LCBpbnQgY29sb3IpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHJiX3BhcmVudChvbGQpOworCW5ldy0+X19yYl9wYXJlbnRfY29sb3IgPSBvbGQtPl9fcmJfcGFyZW50X2NvbG9yOworCXJiX3NldF9wYXJlbnRfY29sb3Iob2xkLCBuZXcsIGNvbG9yKTsKKwlfX3JiX2NoYW5nZV9jaGlsZChvbGQsIG5ldywgcGFyZW50LCByb290KTsKK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkCitfX3JiX2luc2VydChzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJICAgIGJvb2wgbmV3bGVmdCwgc3RydWN0IHJiX25vZGUgKipsZWZ0bW9zdCwKKwkgICAgdm9pZCAoKmF1Z21lbnRfcm90YXRlKShzdHJ1Y3QgcmJfbm9kZSAqb2xkLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3KSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gcmJfcmVkX3BhcmVudChub2RlKSwgKmdwYXJlbnQsICp0bXA7CisKKwlpZiAobmV3bGVmdCkKKwkJKmxlZnRtb3N0ID0gbm9kZTsKKworCXdoaWxlICh0cnVlKSB7CisJCS8qCisJCSAqIExvb3AgaW52YXJpYW50OiBub2RlIGlzIHJlZC4KKwkJICovCisJCWlmICh1bmxpa2VseSghcGFyZW50KSkgeworCQkJLyoKKwkJCSAqIFRoZSBpbnNlcnRlZCBub2RlIGlzIHJvb3QuIEVpdGhlciB0aGlzIGlzIHRoZQorCQkJICogZmlyc3Qgbm9kZSwgb3Igd2UgcmVjdXJzZWQgYXQgQ2FzZSAxIGJlbG93IGFuZAorCQkJICogYXJlIG5vIGxvbmdlciB2aW9sYXRpbmcgNCkuCisJCQkgKi8KKwkJCXJiX3NldF9wYXJlbnRfY29sb3Iobm9kZSwgTlVMTCwgUkJfQkxBQ0spOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGVyZSBpcyBhIGJsYWNrIHBhcmVudCwgd2UgYXJlIGRvbmUuCisJCSAqIE90aGVyd2lzZSwgdGFrZSBzb21lIGNvcnJlY3RpdmUgYWN0aW9uIGFzLAorCQkgKiBwZXIgNCksIHdlIGRvbid0IHdhbnQgYSByZWQgcm9vdCBvciB0d28KKwkJICogY29uc2VjdXRpdmUgcmVkIG5vZGVzLgorCQkgKi8KKwkJaWYocmJfaXNfYmxhY2socGFyZW50KSkKKwkJCWJyZWFrOworCisJCWdwYXJlbnQgPSByYl9yZWRfcGFyZW50KHBhcmVudCk7CisKKwkJdG1wID0gZ3BhcmVudC0+cmJfcmlnaHQ7CisJCWlmIChwYXJlbnQgIT0gdG1wKSB7CS8qIHBhcmVudCA9PSBncGFyZW50LT5yYl9sZWZ0ICovCisJCQlpZiAodG1wICYmIHJiX2lzX3JlZCh0bXApKSB7CisJCQkJLyoKKwkJCQkgKiBDYXNlIDEgLSBub2RlJ3MgdW5jbGUgaXMgcmVkIChjb2xvciBmbGlwcykuCisJCQkJICoKKwkJCQkgKiAgICAgICBHICAgICAgICAgICAgZworCQkJCSAqICAgICAgLyBcICAgICAgICAgIC8gXAorCQkJCSAqICAgICBwICAgdSAgLS0+ICAgUCAgIFUKKwkJCQkgKiAgICAvICAgICAgICAgICAgLworCQkJCSAqICAgbiAgICAgICAgICAgIG4KKwkJCQkgKgorCQkJCSAqIEhvd2V2ZXIsIHNpbmNlIGcncyBwYXJlbnQgbWlnaHQgYmUgcmVkLCBhbmQKKwkJCQkgKiA0KSBkb2VzIG5vdCBhbGxvdyB0aGlzLCB3ZSBuZWVkIHRvIHJlY3Vyc2UKKwkJCQkgKiBhdCBnLgorCQkJCSAqLworCQkJCXJiX3NldF9wYXJlbnRfY29sb3IodG1wLCBncGFyZW50LCBSQl9CTEFDSyk7CisJCQkJcmJfc2V0X3BhcmVudF9jb2xvcihwYXJlbnQsIGdwYXJlbnQsIFJCX0JMQUNLKTsKKwkJCQlub2RlID0gZ3BhcmVudDsKKwkJCQlwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7CisJCQkJcmJfc2V0X3BhcmVudF9jb2xvcihub2RlLCBwYXJlbnQsIFJCX1JFRCk7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXRtcCA9IHBhcmVudC0+cmJfcmlnaHQ7CisJCQlpZiAobm9kZSA9PSB0bXApIHsKKwkJCQkvKgorCQkJCSAqIENhc2UgMiAtIG5vZGUncyB1bmNsZSBpcyBibGFjayBhbmQgbm9kZSBpcworCQkJCSAqIHRoZSBwYXJlbnQncyByaWdodCBjaGlsZCAobGVmdCByb3RhdGUgYXQgcGFyZW50KS4KKwkJCQkgKgorCQkJCSAqICAgICAgRyAgICAgICAgICAgICBHCisJCQkJICogICAgIC8gXCAgICAgICAgICAgLyBcCisJCQkJICogICAgcCAgIFUgIC0tPiAgICBuICAgVQorCQkJCSAqICAgICBcICAgICAgICAgICAvCisJCQkJICogICAgICBuICAgICAgICAgcAorCQkJCSAqCisJCQkJICogVGhpcyBzdGlsbCBsZWF2ZXMgdXMgaW4gdmlvbGF0aW9uIG9mIDQpLCB0aGUKKwkJCQkgKiBjb250aW51YXRpb24gaW50byBDYXNlIDMgd2lsbCBmaXggdGhhdC4KKwkJCQkgKi8KKwkJCQl0bXAgPSBub2RlLT5yYl9sZWZ0OworCQkJCVdSSVRFX09OQ0UocGFyZW50LT5yYl9yaWdodCwgdG1wKTsKKwkJCQlXUklURV9PTkNFKG5vZGUtPnJiX2xlZnQsIHBhcmVudCk7CisJCQkJaWYgKHRtcCkKKwkJCQkJcmJfc2V0X3BhcmVudF9jb2xvcih0bXAsIHBhcmVudCwKKwkJCQkJCQkgICAgUkJfQkxBQ0spOworCQkJCXJiX3NldF9wYXJlbnRfY29sb3IocGFyZW50LCBub2RlLCBSQl9SRUQpOworCQkJCWF1Z21lbnRfcm90YXRlKHBhcmVudCwgbm9kZSk7CisJCQkJcGFyZW50ID0gbm9kZTsKKwkJCQl0bXAgPSBub2RlLT5yYl9yaWdodDsKKwkJCX0KKworCQkJLyoKKwkJCSAqIENhc2UgMyAtIG5vZGUncyB1bmNsZSBpcyBibGFjayBhbmQgbm9kZSBpcworCQkJICogdGhlIHBhcmVudCdzIGxlZnQgY2hpbGQgKHJpZ2h0IHJvdGF0ZSBhdCBncGFyZW50KS4KKwkJCSAqCisJCQkgKiAgICAgICAgRyAgICAgICAgICAgUAorCQkJICogICAgICAgLyBcICAgICAgICAgLyBcCisJCQkgKiAgICAgIHAgICBVICAtLT4gIG4gICBnCisJCQkgKiAgICAgLyAgICAgICAgICAgICAgICAgXAorCQkJICogICAgbiAgICAgICAgICAgICAgICAgICBVCisJCQkgKi8KKwkJCVdSSVRFX09OQ0UoZ3BhcmVudC0+cmJfbGVmdCwgdG1wKTsgLyogPT0gcGFyZW50LT5yYl9yaWdodCAqLworCQkJV1JJVEVfT05DRShwYXJlbnQtPnJiX3JpZ2h0LCBncGFyZW50KTsKKwkJCWlmICh0bXApCisJCQkJcmJfc2V0X3BhcmVudF9jb2xvcih0bXAsIGdwYXJlbnQsIFJCX0JMQUNLKTsKKwkJCV9fcmJfcm90YXRlX3NldF9wYXJlbnRzKGdwYXJlbnQsIHBhcmVudCwgcm9vdCwgUkJfUkVEKTsKKwkJCWF1Z21lbnRfcm90YXRlKGdwYXJlbnQsIHBhcmVudCk7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IGdwYXJlbnQtPnJiX2xlZnQ7CisJCQlpZiAodG1wICYmIHJiX2lzX3JlZCh0bXApKSB7CisJCQkJLyogQ2FzZSAxIC0gY29sb3IgZmxpcHMgKi8KKwkJCQlyYl9zZXRfcGFyZW50X2NvbG9yKHRtcCwgZ3BhcmVudCwgUkJfQkxBQ0spOworCQkJCXJiX3NldF9wYXJlbnRfY29sb3IocGFyZW50LCBncGFyZW50LCBSQl9CTEFDSyk7CisJCQkJbm9kZSA9IGdwYXJlbnQ7CisJCQkJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCQkJCXJiX3NldF9wYXJlbnRfY29sb3Iobm9kZSwgcGFyZW50LCBSQl9SRUQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQl0bXAgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQlpZiAobm9kZSA9PSB0bXApIHsKKwkJCQkvKiBDYXNlIDIgLSByaWdodCByb3RhdGUgYXQgcGFyZW50ICovCisJCQkJdG1wID0gbm9kZS0+cmJfcmlnaHQ7CisJCQkJV1JJVEVfT05DRShwYXJlbnQtPnJiX2xlZnQsIHRtcCk7CisJCQkJV1JJVEVfT05DRShub2RlLT5yYl9yaWdodCwgcGFyZW50KTsKKwkJCQlpZiAodG1wKQorCQkJCQlyYl9zZXRfcGFyZW50X2NvbG9yKHRtcCwgcGFyZW50LAorCQkJCQkJCSAgICBSQl9CTEFDSyk7CisJCQkJcmJfc2V0X3BhcmVudF9jb2xvcihwYXJlbnQsIG5vZGUsIFJCX1JFRCk7CisJCQkJYXVnbWVudF9yb3RhdGUocGFyZW50LCBub2RlKTsKKwkJCQlwYXJlbnQgPSBub2RlOworCQkJCXRtcCA9IG5vZGUtPnJiX2xlZnQ7CisJCQl9CisKKwkJCS8qIENhc2UgMyAtIGxlZnQgcm90YXRlIGF0IGdwYXJlbnQgKi8KKwkJCVdSSVRFX09OQ0UoZ3BhcmVudC0+cmJfcmlnaHQsIHRtcCk7IC8qID09IHBhcmVudC0+cmJfbGVmdCAqLworCQkJV1JJVEVfT05DRShwYXJlbnQtPnJiX2xlZnQsIGdwYXJlbnQpOworCQkJaWYgKHRtcCkKKwkJCQlyYl9zZXRfcGFyZW50X2NvbG9yKHRtcCwgZ3BhcmVudCwgUkJfQkxBQ0spOworCQkJX19yYl9yb3RhdGVfc2V0X3BhcmVudHMoZ3BhcmVudCwgcGFyZW50LCByb290LCBSQl9SRUQpOworCQkJYXVnbWVudF9yb3RhdGUoZ3BhcmVudCwgcGFyZW50KTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKgorICogSW5saW5lIHZlcnNpb24gZm9yIHJiX2VyYXNlKCkgdXNlIC0gd2Ugd2FudCB0byBiZSBhYmxlIHRvIGlubGluZQorICogYW5kIGVsaW1pbmF0ZSB0aGUgZHVtbXlfcm90YXRlIGNhbGxiYWNrIHRoZXJlCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZAorX19fX3JiX2VyYXNlX2NvbG9yKHN0cnVjdCByYl9ub2RlICpwYXJlbnQsIHN0cnVjdCByYl9yb290ICpyb290LAorCXZvaWQgKCphdWdtZW50X3JvdGF0ZSkoc3RydWN0IHJiX25vZGUgKm9sZCwgc3RydWN0IHJiX25vZGUgKm5ldykpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSBOVUxMLCAqc2libGluZywgKnRtcDEsICp0bXAyOworCisJd2hpbGUgKHRydWUpIHsKKwkJLyoKKwkJICogTG9vcCBpbnZhcmlhbnRzOgorCQkgKiAtIG5vZGUgaXMgYmxhY2sgKG9yIE5VTEwgb24gZmlyc3QgaXRlcmF0aW9uKQorCQkgKiAtIG5vZGUgaXMgbm90IHRoZSByb290IChwYXJlbnQgaXMgbm90IE5VTEwpCisJCSAqIC0gQWxsIGxlYWYgcGF0aHMgZ29pbmcgdGhyb3VnaCBwYXJlbnQgYW5kIG5vZGUgaGF2ZSBhCisJCSAqICAgYmxhY2sgbm9kZSBjb3VudCB0aGF0IGlzIDEgbG93ZXIgdGhhbiBvdGhlciBsZWFmIHBhdGhzLgorCQkgKi8KKwkJc2libGluZyA9IHBhcmVudC0+cmJfcmlnaHQ7CisJCWlmIChub2RlICE9IHNpYmxpbmcpIHsJLyogbm9kZSA9PSBwYXJlbnQtPnJiX2xlZnQgKi8KKwkJCWlmIChyYl9pc19yZWQoc2libGluZykpIHsKKwkJCQkvKgorCQkJCSAqIENhc2UgMSAtIGxlZnQgcm90YXRlIGF0IHBhcmVudAorCQkJCSAqCisJCQkJICogICAgIFAgICAgICAgICAgICAgICBTCisJCQkJICogICAgLyBcICAgICAgICAgICAgIC8gXAorCQkJCSAqICAgTiAgIHMgICAgLS0+ICAgIHAgICBTcgorCQkJCSAqICAgICAgLyBcICAgICAgICAgLyBcCisJCQkJICogICAgIFNsICBTciAgICAgIE4gICBTbAorCQkJCSAqLworCQkJCXRtcDEgPSBzaWJsaW5nLT5yYl9sZWZ0OworCQkJCVdSSVRFX09OQ0UocGFyZW50LT5yYl9yaWdodCwgdG1wMSk7CisJCQkJV1JJVEVfT05DRShzaWJsaW5nLT5yYl9sZWZ0LCBwYXJlbnQpOworCQkJCXJiX3NldF9wYXJlbnRfY29sb3IodG1wMSwgcGFyZW50LCBSQl9CTEFDSyk7CisJCQkJX19yYl9yb3RhdGVfc2V0X3BhcmVudHMocGFyZW50LCBzaWJsaW5nLCByb290LAorCQkJCQkJCVJCX1JFRCk7CisJCQkJYXVnbWVudF9yb3RhdGUocGFyZW50LCBzaWJsaW5nKTsKKwkJCQlzaWJsaW5nID0gdG1wMTsKKwkJCX0KKwkJCXRtcDEgPSBzaWJsaW5nLT5yYl9yaWdodDsKKwkJCWlmICghdG1wMSB8fCByYl9pc19ibGFjayh0bXAxKSkgeworCQkJCXRtcDIgPSBzaWJsaW5nLT5yYl9sZWZ0OworCQkJCWlmICghdG1wMiB8fCByYl9pc19ibGFjayh0bXAyKSkgeworCQkJCQkvKgorCQkJCQkgKiBDYXNlIDIgLSBzaWJsaW5nIGNvbG9yIGZsaXAKKwkJCQkJICogKHAgY291bGQgYmUgZWl0aGVyIGNvbG9yIGhlcmUpCisJCQkJCSAqCisJCQkJCSAqICAgIChwKSAgICAgICAgICAgKHApCisJCQkJCSAqICAgIC8gXCAgICAgICAgICAgLyBcCisJCQkJCSAqICAgTiAgIFMgICAgLS0+ICBOICAgcworCQkJCQkgKiAgICAgIC8gXCAgICAgICAgICAgLyBcCisJCQkJCSAqICAgICBTbCAgU3IgICAgICAgIFNsICBTcgorCQkJCQkgKgorCQkJCQkgKiBUaGlzIGxlYXZlcyB1cyB2aW9sYXRpbmcgNSkgd2hpY2gKKwkJCQkJICogY2FuIGJlIGZpeGVkIGJ5IGZsaXBwaW5nIHAgdG8gYmxhY2sKKwkJCQkJICogaWYgaXQgd2FzIHJlZCwgb3IgYnkgcmVjdXJzaW5nIGF0IHAuCisJCQkJCSAqIHAgaXMgcmVkIHdoZW4gY29taW5nIGZyb20gQ2FzZSAxLgorCQkJCQkgKi8KKwkJCQkJcmJfc2V0X3BhcmVudF9jb2xvcihzaWJsaW5nLCBwYXJlbnQsCisJCQkJCQkJICAgIFJCX1JFRCk7CisJCQkJCWlmIChyYl9pc19yZWQocGFyZW50KSkKKwkJCQkJCXJiX3NldF9ibGFjayhwYXJlbnQpOworCQkJCQllbHNlIHsKKwkJCQkJCW5vZGUgPSBwYXJlbnQ7CisJCQkJCQlwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7CisJCQkJCQlpZiAocGFyZW50KQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKgorCQkJCSAqIENhc2UgMyAtIHJpZ2h0IHJvdGF0ZSBhdCBzaWJsaW5nCisJCQkJICogKHAgY291bGQgYmUgZWl0aGVyIGNvbG9yIGhlcmUpCisJCQkJICoKKwkJCQkgKiAgIChwKSAgICAgICAgICAgKHApCisJCQkJICogICAvIFwgICAgICAgICAgIC8gXAorCQkJCSAqICBOICAgUyAgICAtLT4gIE4gICBzbAorCQkJCSAqICAgICAvIFwgICAgICAgICAgICAgXAorCQkJCSAqICAgIHNsICBTciAgICAgICAgICAgIFMKKwkJCQkgKiAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJCSAqICAgICAgICAgICAgICAgICAgICAgICAgU3IKKwkJCQkgKgorCQkJCSAqIE5vdGU6IHAgbWlnaHQgYmUgcmVkLCBhbmQgdGhlbiBib3RoCisJCQkJICogcCBhbmQgc2wgYXJlIHJlZCBhZnRlciByb3RhdGlvbih3aGljaAorCQkJCSAqIGJyZWFrcyBwcm9wZXJ0eSA0KS4gVGhpcyBpcyBmaXhlZCBpbgorCQkJCSAqIENhc2UgNCAoaW4gX19yYl9yb3RhdGVfc2V0X3BhcmVudHMoKQorCQkJCSAqICAgICAgICAgd2hpY2ggc2V0IHNsIHRoZSBjb2xvciBvZiBwCisJCQkJICogICAgICAgICBhbmQgc2V0IHAgUkJfQkxBQ0spCisJCQkJICoKKwkJCQkgKiAgIChwKSAgICAgICAgICAgIChzbCkKKwkJCQkgKiAgIC8gXCAgICAgICAgICAgIC8gIFwKKwkJCQkgKiAgTiAgIHNsICAgLS0+ICAgUCAgICBTCisJCQkJICogICAgICAgXCAgICAgICAgLyAgICAgIFwKKwkJCQkgKiAgICAgICAgUyAgICAgIE4gICAgICAgIFNyCisJCQkJICogICAgICAgICBcCisJCQkJICogICAgICAgICAgU3IKKwkJCQkgKi8KKwkJCQl0bXAxID0gdG1wMi0+cmJfcmlnaHQ7CisJCQkJV1JJVEVfT05DRShzaWJsaW5nLT5yYl9sZWZ0LCB0bXAxKTsKKwkJCQlXUklURV9PTkNFKHRtcDItPnJiX3JpZ2h0LCBzaWJsaW5nKTsKKwkJCQlXUklURV9PTkNFKHBhcmVudC0+cmJfcmlnaHQsIHRtcDIpOworCQkJCWlmICh0bXAxKQorCQkJCQlyYl9zZXRfcGFyZW50X2NvbG9yKHRtcDEsIHNpYmxpbmcsCisJCQkJCQkJICAgIFJCX0JMQUNLKTsKKwkJCQlhdWdtZW50X3JvdGF0ZShzaWJsaW5nLCB0bXAyKTsKKwkJCQl0bXAxID0gc2libGluZzsKKwkJCQlzaWJsaW5nID0gdG1wMjsKKwkJCX0KKwkJCS8qCisJCQkgKiBDYXNlIDQgLSBsZWZ0IHJvdGF0ZSBhdCBwYXJlbnQgKyBjb2xvciBmbGlwcworCQkJICogKHAgYW5kIHNsIGNvdWxkIGJlIGVpdGhlciBjb2xvciBoZXJlLgorCQkJICogIEFmdGVyIHJvdGF0aW9uLCBwIGJlY29tZXMgYmxhY2ssIHMgYWNxdWlyZXMKKwkJCSAqICBwJ3MgY29sb3IsIGFuZCBzbCBrZWVwcyBpdHMgY29sb3IpCisJCQkgKgorCQkJICogICAgICAocCkgICAgICAgICAgICAgKHMpCisJCQkgKiAgICAgIC8gXCAgICAgICAgICAgICAvIFwKKwkJCSAqICAgICBOICAgUyAgICAgLS0+ICAgUCAgIFNyCisJCQkgKiAgICAgICAgLyBcICAgICAgICAgLyBcCisJCQkgKiAgICAgIChzbCkgc3IgICAgICBOICAoc2wpCisJCQkgKi8KKwkJCXRtcDIgPSBzaWJsaW5nLT5yYl9sZWZ0OworCQkJV1JJVEVfT05DRShwYXJlbnQtPnJiX3JpZ2h0LCB0bXAyKTsKKwkJCVdSSVRFX09OQ0Uoc2libGluZy0+cmJfbGVmdCwgcGFyZW50KTsKKwkJCXJiX3NldF9wYXJlbnRfY29sb3IodG1wMSwgc2libGluZywgUkJfQkxBQ0spOworCQkJaWYgKHRtcDIpCisJCQkJcmJfc2V0X3BhcmVudCh0bXAyLCBwYXJlbnQpOworCQkJX19yYl9yb3RhdGVfc2V0X3BhcmVudHMocGFyZW50LCBzaWJsaW5nLCByb290LAorCQkJCQkJUkJfQkxBQ0spOworCQkJYXVnbWVudF9yb3RhdGUocGFyZW50LCBzaWJsaW5nKTsKKwkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJc2libGluZyA9IHBhcmVudC0+cmJfbGVmdDsKKwkJCWlmIChyYl9pc19yZWQoc2libGluZykpIHsKKwkJCQkvKiBDYXNlIDEgLSByaWdodCByb3RhdGUgYXQgcGFyZW50ICovCisJCQkJdG1wMSA9IHNpYmxpbmctPnJiX3JpZ2h0OworCQkJCVdSSVRFX09OQ0UocGFyZW50LT5yYl9sZWZ0LCB0bXAxKTsKKwkJCQlXUklURV9PTkNFKHNpYmxpbmctPnJiX3JpZ2h0LCBwYXJlbnQpOworCQkJCXJiX3NldF9wYXJlbnRfY29sb3IodG1wMSwgcGFyZW50LCBSQl9CTEFDSyk7CisJCQkJX19yYl9yb3RhdGVfc2V0X3BhcmVudHMocGFyZW50LCBzaWJsaW5nLCByb290LAorCQkJCQkJCVJCX1JFRCk7CisJCQkJYXVnbWVudF9yb3RhdGUocGFyZW50LCBzaWJsaW5nKTsKKwkJCQlzaWJsaW5nID0gdG1wMTsKKwkJCX0KKwkJCXRtcDEgPSBzaWJsaW5nLT5yYl9sZWZ0OworCQkJaWYgKCF0bXAxIHx8IHJiX2lzX2JsYWNrKHRtcDEpKSB7CisJCQkJdG1wMiA9IHNpYmxpbmctPnJiX3JpZ2h0OworCQkJCWlmICghdG1wMiB8fCByYl9pc19ibGFjayh0bXAyKSkgeworCQkJCQkvKiBDYXNlIDIgLSBzaWJsaW5nIGNvbG9yIGZsaXAgKi8KKwkJCQkJcmJfc2V0X3BhcmVudF9jb2xvcihzaWJsaW5nLCBwYXJlbnQsCisJCQkJCQkJICAgIFJCX1JFRCk7CisJCQkJCWlmIChyYl9pc19yZWQocGFyZW50KSkKKwkJCQkJCXJiX3NldF9ibGFjayhwYXJlbnQpOworCQkJCQllbHNlIHsKKwkJCQkJCW5vZGUgPSBwYXJlbnQ7CisJCQkJCQlwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7CisJCQkJCQlpZiAocGFyZW50KQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBDYXNlIDMgLSBsZWZ0IHJvdGF0ZSBhdCBzaWJsaW5nICovCisJCQkJdG1wMSA9IHRtcDItPnJiX2xlZnQ7CisJCQkJV1JJVEVfT05DRShzaWJsaW5nLT5yYl9yaWdodCwgdG1wMSk7CisJCQkJV1JJVEVfT05DRSh0bXAyLT5yYl9sZWZ0LCBzaWJsaW5nKTsKKwkJCQlXUklURV9PTkNFKHBhcmVudC0+cmJfbGVmdCwgdG1wMik7CisJCQkJaWYgKHRtcDEpCisJCQkJCXJiX3NldF9wYXJlbnRfY29sb3IodG1wMSwgc2libGluZywKKwkJCQkJCQkgICAgUkJfQkxBQ0spOworCQkJCWF1Z21lbnRfcm90YXRlKHNpYmxpbmcsIHRtcDIpOworCQkJCXRtcDEgPSBzaWJsaW5nOworCQkJCXNpYmxpbmcgPSB0bXAyOworCQkJfQorCQkJLyogQ2FzZSA0IC0gcmlnaHQgcm90YXRlIGF0IHBhcmVudCArIGNvbG9yIGZsaXBzICovCisJCQl0bXAyID0gc2libGluZy0+cmJfcmlnaHQ7CisJCQlXUklURV9PTkNFKHBhcmVudC0+cmJfbGVmdCwgdG1wMik7CisJCQlXUklURV9PTkNFKHNpYmxpbmctPnJiX3JpZ2h0LCBwYXJlbnQpOworCQkJcmJfc2V0X3BhcmVudF9jb2xvcih0bXAxLCBzaWJsaW5nLCBSQl9CTEFDSyk7CisJCQlpZiAodG1wMikKKwkJCQlyYl9zZXRfcGFyZW50KHRtcDIsIHBhcmVudCk7CisJCQlfX3JiX3JvdGF0ZV9zZXRfcGFyZW50cyhwYXJlbnQsIHNpYmxpbmcsIHJvb3QsCisJCQkJCQlSQl9CTEFDSyk7CisJCQlhdWdtZW50X3JvdGF0ZShwYXJlbnQsIHNpYmxpbmcpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIE5vbi1pbmxpbmUgdmVyc2lvbiBmb3IgcmJfZXJhc2VfYXVnbWVudGVkKCkgdXNlICovCit2b2lkIF9fcmJfZXJhc2VfY29sb3Ioc3RydWN0IHJiX25vZGUgKnBhcmVudCwgc3RydWN0IHJiX3Jvb3QgKnJvb3QsCisJdm9pZCAoKmF1Z21lbnRfcm90YXRlKShzdHJ1Y3QgcmJfbm9kZSAqb2xkLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3KSkKK3sKKwlfX19fcmJfZXJhc2VfY29sb3IocGFyZW50LCByb290LCBhdWdtZW50X3JvdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MKF9fcmJfZXJhc2VfY29sb3IpOworCisvKgorICogTm9uLWF1Z21lbnRlZCByYnRyZWUgbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4KKyAqCisgKiBXZSB1c2UgZHVtbXkgYXVnbWVudGVkIGNhbGxiYWNrcyBoZXJlLCBhbmQgaGF2ZSB0aGUgY29tcGlsZXIgb3B0aW1pemUgdGhlbQorICogb3V0IG9mIHRoZSByYl9pbnNlcnRfY29sb3IoKSBhbmQgcmJfZXJhc2UoKSBmdW5jdGlvbiBkZWZpbml0aW9ucy4KKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcHJvcGFnYXRlKHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfbm9kZSAqc3RvcCkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkdW1teV9jb3B5KHN0cnVjdCByYl9ub2RlICpvbGQsIHN0cnVjdCByYl9ub2RlICpuZXcpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgZHVtbXlfcm90YXRlKHN0cnVjdCByYl9ub2RlICpvbGQsIHN0cnVjdCByYl9ub2RlICpuZXcpIHt9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmJfYXVnbWVudF9jYWxsYmFja3MgZHVtbXlfY2FsbGJhY2tzID0geworCS5wcm9wYWdhdGUgPSBkdW1teV9wcm9wYWdhdGUsCisJLmNvcHkgPSBkdW1teV9jb3B5LAorCS5yb3RhdGUgPSBkdW1teV9yb3RhdGUKK307CisKK3ZvaWQgcmJfaW5zZXJ0X2NvbG9yKHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlfX3JiX2luc2VydChub2RlLCByb290LCBmYWxzZSwgTlVMTCwgZHVtbXlfcm90YXRlKTsKK30KK0VYUE9SVF9TWU1CT0wocmJfaW5zZXJ0X2NvbG9yKTsKKwordm9pZCByYl9lcmFzZShzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnJlYmFsYW5jZTsKKwlyZWJhbGFuY2UgPSBfX3JiX2VyYXNlX2F1Z21lbnRlZChub2RlLCByb290LAorCQkJCQkgTlVMTCwgJmR1bW15X2NhbGxiYWNrcyk7CisJaWYgKHJlYmFsYW5jZSkKKwkJX19fX3JiX2VyYXNlX2NvbG9yKHJlYmFsYW5jZSwgcm9vdCwgZHVtbXlfcm90YXRlKTsKK30KK0VYUE9SVF9TWU1CT0wocmJfZXJhc2UpOworCit2b2lkIHJiX2luc2VydF9jb2xvcl9jYWNoZWQoc3RydWN0IHJiX25vZGUgKm5vZGUsCisJCQkgICAgc3RydWN0IHJiX3Jvb3RfY2FjaGVkICpyb290LCBib29sIGxlZnRtb3N0KQoreworCV9fcmJfaW5zZXJ0KG5vZGUsICZyb290LT5yYl9yb290LCBsZWZ0bW9zdCwKKwkJICAgICZyb290LT5yYl9sZWZ0bW9zdCwgZHVtbXlfcm90YXRlKTsKK30KK0VYUE9SVF9TWU1CT0wocmJfaW5zZXJ0X2NvbG9yX2NhY2hlZCk7CisKK3ZvaWQgcmJfZXJhc2VfY2FjaGVkKHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfcm9vdF9jYWNoZWQgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnJlYmFsYW5jZTsKKwlyZWJhbGFuY2UgPSBfX3JiX2VyYXNlX2F1Z21lbnRlZChub2RlLCAmcm9vdC0+cmJfcm9vdCwKKwkJCQkJICZyb290LT5yYl9sZWZ0bW9zdCwgJmR1bW15X2NhbGxiYWNrcyk7CisJaWYgKHJlYmFsYW5jZSkKKwkJX19fX3JiX2VyYXNlX2NvbG9yKHJlYmFsYW5jZSwgJnJvb3QtPnJiX3Jvb3QsIGR1bW15X3JvdGF0ZSk7Cit9CitFWFBPUlRfU1lNQk9MKHJiX2VyYXNlX2NhY2hlZCk7CisKKy8qCisgKiBBdWdtZW50ZWQgcmJ0cmVlIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMuCisgKgorICogVGhpcyBpbnN0YW50aWF0ZXMgdGhlIHNhbWUgX19hbHdheXNfaW5saW5lIGZ1bmN0aW9ucyBhcyBpbiB0aGUgbm9uLWF1Z21lbnRlZAorICogY2FzZSwgYnV0IHRoaXMgdGltZSB3aXRoIHVzZXItZGVmaW5lZCBjYWxsYmFja3MuCisgKi8KKwordm9pZCBfX3JiX2luc2VydF9hdWdtZW50ZWQoc3RydWN0IHJiX25vZGUgKm5vZGUsIHN0cnVjdCByYl9yb290ICpyb290LAorCQkJICAgYm9vbCBuZXdsZWZ0LCBzdHJ1Y3QgcmJfbm9kZSAqKmxlZnRtb3N0LAorCXZvaWQgKCphdWdtZW50X3JvdGF0ZSkoc3RydWN0IHJiX25vZGUgKm9sZCwgc3RydWN0IHJiX25vZGUgKm5ldykpCit7CisJX19yYl9pbnNlcnQobm9kZSwgcm9vdCwgbmV3bGVmdCwgbGVmdG1vc3QsIGF1Z21lbnRfcm90YXRlKTsKK30KK0VYUE9SVF9TWU1CT0woX19yYl9pbnNlcnRfYXVnbWVudGVkKTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3Qgbm9kZSAoaW4gc29ydCBvcmRlcikgb2YgdGhlIHRyZWUuCisgKi8KK3N0cnVjdCByYl9ub2RlICpyYl9maXJzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZQkqbjsKKworCW4gPSByb290LT5yYl9ub2RlOworCWlmICghbikKKwkJcmV0dXJuIE5VTEw7CisJd2hpbGUgKG4tPnJiX2xlZnQpCisJCW4gPSBuLT5yYl9sZWZ0OworCXJldHVybiBuOworfQorRVhQT1JUX1NZTUJPTChyYl9maXJzdCk7CisKK3N0cnVjdCByYl9ub2RlICpyYl9sYXN0KGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlCSpuOworCisJbiA9IHJvb3QtPnJiX25vZGU7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAobi0+cmJfcmlnaHQpCisJCW4gPSBuLT5yYl9yaWdodDsKKwlyZXR1cm4gbjsKK30KK0VYUE9SVF9TWU1CT0wocmJfbGFzdCk7CisKK3N0cnVjdCByYl9ub2RlICpyYl9uZXh0KGNvbnN0IHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQ7CisKKwlpZiAoUkJfRU1QVFlfTk9ERShub2RlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIElmIHdlIGhhdmUgYSByaWdodC1oYW5kIGNoaWxkLCBnbyBkb3duIGFuZCB0aGVuIGxlZnQgYXMgZmFyCisJICogYXMgd2UgY2FuLgorCSAqLworCWlmIChub2RlLT5yYl9yaWdodCkgeworCQlub2RlID0gbm9kZS0+cmJfcmlnaHQ7CisJCXdoaWxlIChub2RlLT5yYl9sZWZ0KQorCQkJbm9kZT1ub2RlLT5yYl9sZWZ0OworCQlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopbm9kZTsKKwl9CisKKwkvKgorCSAqIE5vIHJpZ2h0LWhhbmQgY2hpbGRyZW4uIEV2ZXJ5dGhpbmcgZG93biBhbmQgbGVmdCBpcyBzbWFsbGVyIHRoYW4gdXMsCisJICogc28gYW55ICduZXh0JyBub2RlIG11c3QgYmUgaW4gdGhlIGdlbmVyYWwgZGlyZWN0aW9uIG9mIG91ciBwYXJlbnQuCisJICogR28gdXAgdGhlIHRyZWU7IGFueSB0aW1lIHRoZSBhbmNlc3RvciBpcyBhIHJpZ2h0LWhhbmQgY2hpbGQgb2YgaXRzCisJICogcGFyZW50LCBrZWVwIGdvaW5nIHVwLiBGaXJzdCB0aW1lIGl0J3MgYSBsZWZ0LWhhbmQgY2hpbGQgb2YgaXRzCisJICogcGFyZW50LCBzYWlkIHBhcmVudCBpcyBvdXIgJ25leHQnIG5vZGUuCisJICovCisJd2hpbGUgKChwYXJlbnQgPSByYl9wYXJlbnQobm9kZSkpICYmIG5vZGUgPT0gcGFyZW50LT5yYl9yaWdodCkKKwkJbm9kZSA9IHBhcmVudDsKKworCXJldHVybiBwYXJlbnQ7Cit9CitFWFBPUlRfU1lNQk9MKHJiX25leHQpOworCitzdHJ1Y3QgcmJfbm9kZSAqcmJfcHJldihjb25zdCBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OworCisJaWYgKFJCX0VNUFRZX05PREUobm9kZSkpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBJZiB3ZSBoYXZlIGEgbGVmdC1oYW5kIGNoaWxkLCBnbyBkb3duIGFuZCB0aGVuIHJpZ2h0IGFzIGZhcgorCSAqIGFzIHdlIGNhbi4KKwkgKi8KKwlpZiAobm9kZS0+cmJfbGVmdCkgeworCQlub2RlID0gbm9kZS0+cmJfbGVmdDsKKwkJd2hpbGUgKG5vZGUtPnJiX3JpZ2h0KQorCQkJbm9kZT1ub2RlLT5yYl9yaWdodDsKKwkJcmV0dXJuIChzdHJ1Y3QgcmJfbm9kZSAqKW5vZGU7CisJfQorCisJLyoKKwkgKiBObyBsZWZ0LWhhbmQgY2hpbGRyZW4uIEdvIHVwIHRpbGwgd2UgZmluZCBhbiBhbmNlc3RvciB3aGljaAorCSAqIGlzIGEgcmlnaHQtaGFuZCBjaGlsZCBvZiBpdHMgcGFyZW50LgorCSAqLworCXdoaWxlICgocGFyZW50ID0gcmJfcGFyZW50KG5vZGUpKSAmJiBub2RlID09IHBhcmVudC0+cmJfbGVmdCkKKwkJbm9kZSA9IHBhcmVudDsKKworCXJldHVybiBwYXJlbnQ7Cit9CitFWFBPUlRfU1lNQk9MKHJiX3ByZXYpOworCit2b2lkIHJiX3JlcGxhY2Vfbm9kZShzdHJ1Y3QgcmJfbm9kZSAqdmljdGltLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3LAorCQkgICAgIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSByYl9wYXJlbnQodmljdGltKTsKKworCS8qIENvcHkgdGhlIHBvaW50ZXJzL2NvbG91ciBmcm9tIHRoZSB2aWN0aW0gdG8gdGhlIHJlcGxhY2VtZW50ICovCisJKm5ldyA9ICp2aWN0aW07CisKKwkvKiBTZXQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzIHRvIHBvaW50IHRvIHRoZSByZXBsYWNlbWVudCAqLworCWlmICh2aWN0aW0tPnJiX2xlZnQpCisJCXJiX3NldF9wYXJlbnQodmljdGltLT5yYl9sZWZ0LCBuZXcpOworCWlmICh2aWN0aW0tPnJiX3JpZ2h0KQorCQlyYl9zZXRfcGFyZW50KHZpY3RpbS0+cmJfcmlnaHQsIG5ldyk7CisJX19yYl9jaGFuZ2VfY2hpbGQodmljdGltLCBuZXcsIHBhcmVudCwgcm9vdCk7Cit9CitFWFBPUlRfU1lNQk9MKHJiX3JlcGxhY2Vfbm9kZSk7CisKK3ZvaWQgcmJfcmVwbGFjZV9ub2RlX3JjdShzdHJ1Y3QgcmJfbm9kZSAqdmljdGltLCBzdHJ1Y3QgcmJfbm9kZSAqbmV3LAorCQkJIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSByYl9wYXJlbnQodmljdGltKTsKKworCS8qIENvcHkgdGhlIHBvaW50ZXJzL2NvbG91ciBmcm9tIHRoZSB2aWN0aW0gdG8gdGhlIHJlcGxhY2VtZW50ICovCisJKm5ldyA9ICp2aWN0aW07CisKKwkvKiBTZXQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzIHRvIHBvaW50IHRvIHRoZSByZXBsYWNlbWVudCAqLworCWlmICh2aWN0aW0tPnJiX2xlZnQpCisJCXJiX3NldF9wYXJlbnQodmljdGltLT5yYl9sZWZ0LCBuZXcpOworCWlmICh2aWN0aW0tPnJiX3JpZ2h0KQorCQlyYl9zZXRfcGFyZW50KHZpY3RpbS0+cmJfcmlnaHQsIG5ldyk7CisKKwkvKiBTZXQgdGhlIHBhcmVudCdzIHBvaW50ZXIgdG8gdGhlIG5ldyBub2RlIGxhc3QgYWZ0ZXIgYW4gUkNVIGJhcnJpZXIKKwkgKiBzbyB0aGF0IHRoZSBwb2ludGVycyBvbndhcmRzIGFyZSBzZWVuIHRvIGJlIHNldCBjb3JyZWN0bHkgd2hlbiBkb2luZworCSAqIGFuIFJDVSB3YWxrIG92ZXIgdGhlIHRyZWUuCisJICovCisJX19yYl9jaGFuZ2VfY2hpbGRfcmN1KHZpY3RpbSwgbmV3LCBwYXJlbnQsIHJvb3QpOworfQorRVhQT1JUX1NZTUJPTChyYl9yZXBsYWNlX25vZGVfcmN1KTsKKworc3RhdGljIHN0cnVjdCByYl9ub2RlICpyYl9sZWZ0X2RlZXBlc3Rfbm9kZShjb25zdCBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKK3sKKwlmb3IgKDs7KSB7CisJCWlmIChub2RlLT5yYl9sZWZ0KQorCQkJbm9kZSA9IG5vZGUtPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG5vZGUtPnJiX3JpZ2h0KQorCQkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopbm9kZTsKKwl9Cit9CisKK3N0cnVjdCByYl9ub2RlICpyYl9uZXh0X3Bvc3RvcmRlcihjb25zdCBzdHJ1Y3QgcmJfbm9kZSAqbm9kZSkKK3sKKwljb25zdCBzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50OworCWlmICghbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCisJLyogSWYgd2UncmUgc2l0dGluZyBvbiBub2RlLCB3ZSd2ZSBhbHJlYWR5IHNlZW4gb3VyIGNoaWxkcmVuICovCisJaWYgKHBhcmVudCAmJiBub2RlID09IHBhcmVudC0+cmJfbGVmdCAmJiBwYXJlbnQtPnJiX3JpZ2h0KSB7CisJCS8qIElmIHdlIGFyZSB0aGUgcGFyZW50J3MgbGVmdCBub2RlLCBnbyB0byB0aGUgcGFyZW50J3MgcmlnaHQKKwkJICogbm9kZSB0aGVuIGFsbCB0aGUgd2F5IGRvd24gdG8gdGhlIGxlZnQgKi8KKwkJcmV0dXJuIHJiX2xlZnRfZGVlcGVzdF9ub2RlKHBhcmVudC0+cmJfcmlnaHQpOworCX0gZWxzZQorCQkvKiBPdGhlcndpc2Ugd2UgYXJlIHRoZSBwYXJlbnQncyByaWdodCBub2RlLCBhbmQgdGhlIHBhcmVudAorCQkgKiBzaG91bGQgYmUgbmV4dCAqLworCQlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopcGFyZW50OworfQorRVhQT1JUX1NZTUJPTChyYl9uZXh0X3Bvc3RvcmRlcik7CisKK3N0cnVjdCByYl9ub2RlICpyYl9maXJzdF9wb3N0b3JkZXIoY29uc3Qgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJaWYgKCFyb290LT5yYl9ub2RlKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiByYl9sZWZ0X2RlZXBlc3Rfbm9kZShyb290LT5yYl9ub2RlKTsKK30KK0VYUE9SVF9TWU1CT0wocmJfZmlyc3RfcG9zdG9yZGVyKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JidHJlZV90ZXN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYnRyZWVfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMzZjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yYnRyZWVfdGVzdC5jCkBAIC0wLDAgKzEsNDEwIEBACisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9yYnRyZWVfYXVnbWVudGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCisjZGVmaW5lIF9fcGFyYW0odHlwZSwgbmFtZSwgaW5pdCwgbXNnKQkJXAorCXN0YXRpYyB0eXBlIG5hbWUgPSBpbml0OwkJXAorCW1vZHVsZV9wYXJhbShuYW1lLCB0eXBlLCAwNDQ0KTsJCVwKKwlNT0RVTEVfUEFSTV9ERVNDKG5hbWUsIG1zZyk7CisKK19fcGFyYW0oaW50LCBubm9kZXMsIDEwMCwgIk51bWJlciBvZiBub2RlcyBpbiB0aGUgcmItdHJlZSIpOworX19wYXJhbShpbnQsIHBlcmZfbG9vcHMsIDEwMDAsICJOdW1iZXIgb2YgaXRlcmF0aW9ucyBtb2RpZnlpbmcgdGhlIHJiLXRyZWUiKTsKK19fcGFyYW0oaW50LCBjaGVja19sb29wcywgMTAwLCAiTnVtYmVyIG9mIGl0ZXJhdGlvbnMgbW9kaWZ5aW5nIGFuZCB2ZXJpZnlpbmcgdGhlIHJiLXRyZWUiKTsKKworc3RydWN0IHRlc3Rfbm9kZSB7CisJdTMyIGtleTsKKwlzdHJ1Y3QgcmJfbm9kZSByYjsKKworCS8qIGZvbGxvd2luZyBmaWVsZHMgdXNlZCBmb3IgdGVzdGluZyBhdWdtZW50ZWQgcmJ0cmVlIGZ1bmN0aW9uYWxpdHkgKi8KKwl1MzIgdmFsOworCXUzMiBhdWdtZW50ZWQ7Cit9OworCitzdGF0aWMgc3RydWN0IHJiX3Jvb3RfY2FjaGVkIHJvb3QgPSBSQl9ST09UX0NBQ0hFRDsKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9ub2RlICpub2RlcyA9IE5VTEw7CisKK3N0YXRpYyBzdHJ1Y3Qgcm5kX3N0YXRlIHJuZDsKKworc3RhdGljIHZvaWQgaW5zZXJ0KHN0cnVjdCB0ZXN0X25vZGUgKm5vZGUsIHN0cnVjdCByYl9yb290X2NhY2hlZCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ldyA9ICZyb290LT5yYl9yb290LnJiX25vZGUsICpwYXJlbnQgPSBOVUxMOworCXUzMiBrZXkgPSBub2RlLT5rZXk7CisKKwl3aGlsZSAoKm5ldykgeworCQlwYXJlbnQgPSAqbmV3OworCQlpZiAoa2V5IDwgcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgdGVzdF9ub2RlLCByYiktPmtleSkKKwkJCW5ldyA9ICZwYXJlbnQtPnJiX2xlZnQ7CisJCWVsc2UKKwkJCW5ldyA9ICZwYXJlbnQtPnJiX3JpZ2h0OworCX0KKworCXJiX2xpbmtfbm9kZSgmbm9kZS0+cmIsIHBhcmVudCwgbmV3KTsKKwlyYl9pbnNlcnRfY29sb3IoJm5vZGUtPnJiLCAmcm9vdC0+cmJfcm9vdCk7Cit9CisKK3N0YXRpYyB2b2lkIGluc2VydF9jYWNoZWQoc3RydWN0IHRlc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3RfY2FjaGVkICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICoqbmV3ID0gJnJvb3QtPnJiX3Jvb3QucmJfbm9kZSwgKnBhcmVudCA9IE5VTEw7CisJdTMyIGtleSA9IG5vZGUtPmtleTsKKwlib29sIGxlZnRtb3N0ID0gdHJ1ZTsKKworCXdoaWxlICgqbmV3KSB7CisJCXBhcmVudCA9ICpuZXc7CisJCWlmIChrZXkgPCByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCB0ZXN0X25vZGUsIHJiKS0+a2V5KQorCQkJbmV3ID0gJnBhcmVudC0+cmJfbGVmdDsKKwkJZWxzZSB7CisJCQluZXcgPSAmcGFyZW50LT5yYl9yaWdodDsKKwkJCWxlZnRtb3N0ID0gZmFsc2U7CisJCX0KKwl9CisKKwlyYl9saW5rX25vZGUoJm5vZGUtPnJiLCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yX2NhY2hlZCgmbm9kZS0+cmIsIHJvb3QsIGxlZnRtb3N0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVyYXNlKHN0cnVjdCB0ZXN0X25vZGUgKm5vZGUsIHN0cnVjdCByYl9yb290X2NhY2hlZCAqcm9vdCkKK3sKKwlyYl9lcmFzZSgmbm9kZS0+cmIsICZyb290LT5yYl9yb290KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVyYXNlX2NhY2hlZChzdHJ1Y3QgdGVzdF9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfcm9vdF9jYWNoZWQgKnJvb3QpCit7CisJcmJfZXJhc2VfY2FjaGVkKCZub2RlLT5yYiwgcm9vdCk7Cit9CisKKworc3RhdGljIGlubGluZSB1MzIgYXVnbWVudF9yZWNvbXB1dGUoc3RydWN0IHRlc3Rfbm9kZSAqbm9kZSkKK3sKKwl1MzIgbWF4ID0gbm9kZS0+dmFsLCBjaGlsZF9hdWdtZW50ZWQ7CisJaWYgKG5vZGUtPnJiLnJiX2xlZnQpIHsKKwkJY2hpbGRfYXVnbWVudGVkID0gcmJfZW50cnkobm9kZS0+cmIucmJfbGVmdCwgc3RydWN0IHRlc3Rfbm9kZSwKKwkJCQkJICAgcmIpLT5hdWdtZW50ZWQ7CisJCWlmIChtYXggPCBjaGlsZF9hdWdtZW50ZWQpCisJCQltYXggPSBjaGlsZF9hdWdtZW50ZWQ7CisJfQorCWlmIChub2RlLT5yYi5yYl9yaWdodCkgeworCQljaGlsZF9hdWdtZW50ZWQgPSByYl9lbnRyeShub2RlLT5yYi5yYl9yaWdodCwgc3RydWN0IHRlc3Rfbm9kZSwKKwkJCQkJICAgcmIpLT5hdWdtZW50ZWQ7CisJCWlmIChtYXggPCBjaGlsZF9hdWdtZW50ZWQpCisJCQltYXggPSBjaGlsZF9hdWdtZW50ZWQ7CisJfQorCXJldHVybiBtYXg7Cit9CisKK1JCX0RFQ0xBUkVfQ0FMTEJBQ0tTKHN0YXRpYywgYXVnbWVudF9jYWxsYmFja3MsIHN0cnVjdCB0ZXN0X25vZGUsIHJiLAorCQkgICAgIHUzMiwgYXVnbWVudGVkLCBhdWdtZW50X3JlY29tcHV0ZSkKKworc3RhdGljIHZvaWQgaW5zZXJ0X2F1Z21lbnRlZChzdHJ1Y3QgdGVzdF9ub2RlICpub2RlLAorCQkJICAgICBzdHJ1Y3QgcmJfcm9vdF9jYWNoZWQgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKipuZXcgPSAmcm9vdC0+cmJfcm9vdC5yYl9ub2RlLCAqcmJfcGFyZW50ID0gTlVMTDsKKwl1MzIga2V5ID0gbm9kZS0+a2V5OworCXUzMiB2YWwgPSBub2RlLT52YWw7CisJc3RydWN0IHRlc3Rfbm9kZSAqcGFyZW50OworCisJd2hpbGUgKCpuZXcpIHsKKwkJcmJfcGFyZW50ID0gKm5ldzsKKwkJcGFyZW50ID0gcmJfZW50cnkocmJfcGFyZW50LCBzdHJ1Y3QgdGVzdF9ub2RlLCByYik7CisJCWlmIChwYXJlbnQtPmF1Z21lbnRlZCA8IHZhbCkKKwkJCXBhcmVudC0+YXVnbWVudGVkID0gdmFsOworCQlpZiAoa2V5IDwgcGFyZW50LT5rZXkpCisJCQluZXcgPSAmcGFyZW50LT5yYi5yYl9sZWZ0OworCQllbHNlCisJCQluZXcgPSAmcGFyZW50LT5yYi5yYl9yaWdodDsKKwl9CisKKwlub2RlLT5hdWdtZW50ZWQgPSB2YWw7CisJcmJfbGlua19ub2RlKCZub2RlLT5yYiwgcmJfcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9hdWdtZW50ZWQoJm5vZGUtPnJiLCAmcm9vdC0+cmJfcm9vdCwgJmF1Z21lbnRfY2FsbGJhY2tzKTsKK30KKworc3RhdGljIHZvaWQgaW5zZXJ0X2F1Z21lbnRlZF9jYWNoZWQoc3RydWN0IHRlc3Rfbm9kZSAqbm9kZSwKKwkJCQkgICAgc3RydWN0IHJiX3Jvb3RfY2FjaGVkICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICoqbmV3ID0gJnJvb3QtPnJiX3Jvb3QucmJfbm9kZSwgKnJiX3BhcmVudCA9IE5VTEw7CisJdTMyIGtleSA9IG5vZGUtPmtleTsKKwl1MzIgdmFsID0gbm9kZS0+dmFsOworCXN0cnVjdCB0ZXN0X25vZGUgKnBhcmVudDsKKwlib29sIGxlZnRtb3N0ID0gdHJ1ZTsKKworCXdoaWxlICgqbmV3KSB7CisJCXJiX3BhcmVudCA9ICpuZXc7CisJCXBhcmVudCA9IHJiX2VudHJ5KHJiX3BhcmVudCwgc3RydWN0IHRlc3Rfbm9kZSwgcmIpOworCQlpZiAocGFyZW50LT5hdWdtZW50ZWQgPCB2YWwpCisJCQlwYXJlbnQtPmF1Z21lbnRlZCA9IHZhbDsKKwkJaWYgKGtleSA8IHBhcmVudC0+a2V5KQorCQkJbmV3ID0gJnBhcmVudC0+cmIucmJfbGVmdDsKKwkJZWxzZSB7CisJCQluZXcgPSAmcGFyZW50LT5yYi5yYl9yaWdodDsKKwkJCWxlZnRtb3N0ID0gZmFsc2U7CisJCX0KKwl9CisKKwlub2RlLT5hdWdtZW50ZWQgPSB2YWw7CisJcmJfbGlua19ub2RlKCZub2RlLT5yYiwgcmJfcGFyZW50LCBuZXcpOworCXJiX2luc2VydF9hdWdtZW50ZWRfY2FjaGVkKCZub2RlLT5yYiwgcm9vdCwKKwkJCQkgICBsZWZ0bW9zdCwgJmF1Z21lbnRfY2FsbGJhY2tzKTsKK30KKworCitzdGF0aWMgdm9pZCBlcmFzZV9hdWdtZW50ZWQoc3RydWN0IHRlc3Rfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3RfY2FjaGVkICpyb290KQoreworCXJiX2VyYXNlX2F1Z21lbnRlZCgmbm9kZS0+cmIsICZyb290LT5yYl9yb290LCAmYXVnbWVudF9jYWxsYmFja3MpOworfQorCitzdGF0aWMgdm9pZCBlcmFzZV9hdWdtZW50ZWRfY2FjaGVkKHN0cnVjdCB0ZXN0X25vZGUgKm5vZGUsCisJCQkJICAgc3RydWN0IHJiX3Jvb3RfY2FjaGVkICpyb290KQoreworCXJiX2VyYXNlX2F1Z21lbnRlZF9jYWNoZWQoJm5vZGUtPnJiLCByb290LCAmYXVnbWVudF9jYWxsYmFja3MpOworfQorCitzdGF0aWMgdm9pZCBpbml0KHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5ub2RlczsgaSsrKSB7CisJCW5vZGVzW2ldLmtleSA9IHByYW5kb21fdTMyX3N0YXRlKCZybmQpOworCQlub2Rlc1tpXS52YWwgPSBwcmFuZG9tX3UzMl9zdGF0ZSgmcm5kKTsKKwl9Cit9CisKK3N0YXRpYyBib29sIGlzX3JlZChzdHJ1Y3QgcmJfbm9kZSAqcmIpCit7CisJcmV0dXJuICEocmItPl9fcmJfcGFyZW50X2NvbG9yICYgMSk7Cit9CisKK3N0YXRpYyBpbnQgYmxhY2tfcGF0aF9jb3VudChzdHJ1Y3QgcmJfbm9kZSAqcmIpCit7CisJaW50IGNvdW50OworCWZvciAoY291bnQgPSAwOyByYjsgcmIgPSByYl9wYXJlbnQocmIpKQorCQljb3VudCArPSAhaXNfcmVkKHJiKTsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3Bvc3RvcmRlcl9mb3JlYWNoKGludCBucl9ub2RlcykKK3sKKwlzdHJ1Y3QgdGVzdF9ub2RlICpjdXIsICpuOworCWludCBjb3VudCA9IDA7CisJcmJ0cmVlX3Bvc3RvcmRlcl9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1ciwgbiwgJnJvb3QucmJfcm9vdCwgcmIpCisJCWNvdW50Kys7CisKKwlXQVJOX09OX09OQ0UoY291bnQgIT0gbnJfbm9kZXMpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19wb3N0b3JkZXIoaW50IG5yX25vZGVzKQoreworCXN0cnVjdCByYl9ub2RlICpyYjsKKwlpbnQgY291bnQgPSAwOworCWZvciAocmIgPSByYl9maXJzdF9wb3N0b3JkZXIoJnJvb3QucmJfcm9vdCk7IHJiOyByYiA9IHJiX25leHRfcG9zdG9yZGVyKHJiKSkKKwkJY291bnQrKzsKKworCVdBUk5fT05fT05DRShjb3VudCAhPSBucl9ub2Rlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrKGludCBucl9ub2RlcykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisJaW50IGNvdW50ID0gMCwgYmxhY2tzID0gMDsKKwl1MzIgcHJldl9rZXkgPSAwOworCisJZm9yIChyYiA9IHJiX2ZpcnN0KCZyb290LnJiX3Jvb3QpOyByYjsgcmIgPSByYl9uZXh0KHJiKSkgeworCQlzdHJ1Y3QgdGVzdF9ub2RlICpub2RlID0gcmJfZW50cnkocmIsIHN0cnVjdCB0ZXN0X25vZGUsIHJiKTsKKwkJV0FSTl9PTl9PTkNFKG5vZGUtPmtleSA8IHByZXZfa2V5KTsKKwkJV0FSTl9PTl9PTkNFKGlzX3JlZChyYikgJiYKKwkJCSAgICAgKCFyYl9wYXJlbnQocmIpIHx8IGlzX3JlZChyYl9wYXJlbnQocmIpKSkpOworCQlpZiAoIWNvdW50KQorCQkJYmxhY2tzID0gYmxhY2tfcGF0aF9jb3VudChyYik7CisJCWVsc2UKKwkJCVdBUk5fT05fT05DRSgoIXJiLT5yYl9sZWZ0IHx8ICFyYi0+cmJfcmlnaHQpICYmCisJCQkJICAgICBibGFja3MgIT0gYmxhY2tfcGF0aF9jb3VudChyYikpOworCQlwcmV2X2tleSA9IG5vZGUtPmtleTsKKwkJY291bnQrKzsKKwl9CisKKwlXQVJOX09OX09OQ0UoY291bnQgIT0gbnJfbm9kZXMpOworCVdBUk5fT05fT05DRShjb3VudCA8ICgxIDw8IGJsYWNrX3BhdGhfY291bnQocmJfbGFzdCgmcm9vdC5yYl9yb290KSkpIC0gMSk7CisKKwljaGVja19wb3N0b3JkZXIobnJfbm9kZXMpOworCWNoZWNrX3Bvc3RvcmRlcl9mb3JlYWNoKG5yX25vZGVzKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfYXVnbWVudGVkKGludCBucl9ub2RlcykKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcmI7CisKKwljaGVjayhucl9ub2Rlcyk7CisJZm9yIChyYiA9IHJiX2ZpcnN0KCZyb290LnJiX3Jvb3QpOyByYjsgcmIgPSByYl9uZXh0KHJiKSkgeworCQlzdHJ1Y3QgdGVzdF9ub2RlICpub2RlID0gcmJfZW50cnkocmIsIHN0cnVjdCB0ZXN0X25vZGUsIHJiKTsKKwkJV0FSTl9PTl9PTkNFKG5vZGUtPmF1Z21lbnRlZCAhPSBhdWdtZW50X3JlY29tcHV0ZShub2RlKSk7CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCByYnRyZWVfdGVzdF9pbml0KHZvaWQpCit7CisJaW50IGksIGo7CisJY3ljbGVzX3QgdGltZTEsIHRpbWUyLCB0aW1lOworCXN0cnVjdCByYl9ub2RlICpub2RlOworCisJbm9kZXMgPSBrbWFsbG9jKG5ub2RlcyAqIHNpemVvZigqbm9kZXMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5vZGVzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaW50ayhLRVJOX0FMRVJUICJyYnRyZWUgdGVzdGluZyIpOworCisJcHJhbmRvbV9zZWVkX3N0YXRlKCZybmQsIDMxNDE1OTI2NTM1ODk3OTMyMzhVTEwpOworCWluaXQoKTsKKworCXRpbWUxID0gZ2V0X2N5Y2xlcygpOworCisJZm9yIChpID0gMDsgaSA8IHBlcmZfbG9vcHM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgbm5vZGVzOyBqKyspCisJCQlpbnNlcnQobm9kZXMgKyBqLCAmcm9vdCk7CisJCWZvciAoaiA9IDA7IGogPCBubm9kZXM7IGorKykKKwkJCWVyYXNlKG5vZGVzICsgaiwgJnJvb3QpOworCX0KKworCXRpbWUyID0gZ2V0X2N5Y2xlcygpOworCXRpbWUgPSB0aW1lMiAtIHRpbWUxOworCisJdGltZSA9IGRpdl91NjQodGltZSwgcGVyZl9sb29wcyk7CisJcHJpbnRrKCIgLT4gdGVzdCAxIChsYXRlbmN5IG9mIG5ub2RlcyBpbnNlcnQrZGVsZXRlKTogJWxsdSBjeWNsZXNcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZSk7CisKKwl0aW1lMSA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJmX2xvb3BzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG5ub2RlczsgaisrKQorCQkJaW5zZXJ0X2NhY2hlZChub2RlcyArIGosICZyb290KTsKKwkJZm9yIChqID0gMDsgaiA8IG5ub2RlczsgaisrKQorCQkJZXJhc2VfY2FjaGVkKG5vZGVzICsgaiwgJnJvb3QpOworCX0KKworCXRpbWUyID0gZ2V0X2N5Y2xlcygpOworCXRpbWUgPSB0aW1lMiAtIHRpbWUxOworCisJdGltZSA9IGRpdl91NjQodGltZSwgcGVyZl9sb29wcyk7CisJcHJpbnRrKCIgLT4gdGVzdCAyIChsYXRlbmN5IG9mIG5ub2RlcyBjYWNoZWQgaW5zZXJ0K2RlbGV0ZSk6ICVsbHUgY3ljbGVzXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRpbWUpOworCisJZm9yIChpID0gMDsgaSA8IG5ub2RlczsgaSsrKQorCQlpbnNlcnQobm9kZXMgKyBpLCAmcm9vdCk7CisKKwl0aW1lMSA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJmX2xvb3BzOyBpKyspIHsKKwkJZm9yIChub2RlID0gcmJfZmlyc3QoJnJvb3QucmJfcm9vdCk7IG5vZGU7IG5vZGUgPSByYl9uZXh0KG5vZGUpKQorCQkJOworCX0KKworCXRpbWUyID0gZ2V0X2N5Y2xlcygpOworCXRpbWUgPSB0aW1lMiAtIHRpbWUxOworCisJdGltZSA9IGRpdl91NjQodGltZSwgcGVyZl9sb29wcyk7CisJcHJpbnRrKCIgLT4gdGVzdCAzIChsYXRlbmN5IG9mIGlub3JkZXIgdHJhdmVyc2FsKTogJWxsdSBjeWNsZXNcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZSk7CisKKwl0aW1lMSA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJmX2xvb3BzOyBpKyspCisJCW5vZGUgPSByYl9maXJzdCgmcm9vdC5yYl9yb290KTsKKworCXRpbWUyID0gZ2V0X2N5Y2xlcygpOworCXRpbWUgPSB0aW1lMiAtIHRpbWUxOworCisJdGltZSA9IGRpdl91NjQodGltZSwgcGVyZl9sb29wcyk7CisJcHJpbnRrKCIgLT4gdGVzdCA0IChsYXRlbmN5IHRvIGZldGNoIGZpcnN0IG5vZGUpXG4iKTsKKwlwcmludGsoIiAgICAgICAgbm9uLWNhY2hlZDogJWxsdSBjeWNsZXNcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZSk7CisKKwl0aW1lMSA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJmX2xvb3BzOyBpKyspCisJCW5vZGUgPSByYl9maXJzdF9jYWNoZWQoJnJvb3QpOworCisJdGltZTIgPSBnZXRfY3ljbGVzKCk7CisJdGltZSA9IHRpbWUyIC0gdGltZTE7CisKKwl0aW1lID0gZGl2X3U2NCh0aW1lLCBwZXJmX2xvb3BzKTsKKwlwcmludGsoIiAgICAgICAgY2FjaGVkOiAlbGx1IGN5Y2xlc1xuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl0aW1lKTsKKworCWZvciAoaSA9IDA7IGkgPCBubm9kZXM7IGkrKykKKwkJZXJhc2Uobm9kZXMgKyBpLCAmcm9vdCk7CisKKwkvKiBydW4gY2hlY2tzICovCisJZm9yIChpID0gMDsgaSA8IGNoZWNrX2xvb3BzOyBpKyspIHsKKwkJaW5pdCgpOworCQlmb3IgKGogPSAwOyBqIDwgbm5vZGVzOyBqKyspIHsKKwkJCWNoZWNrKGopOworCQkJaW5zZXJ0KG5vZGVzICsgaiwgJnJvb3QpOworCQl9CisJCWZvciAoaiA9IDA7IGogPCBubm9kZXM7IGorKykgeworCQkJY2hlY2sobm5vZGVzIC0gaik7CisJCQllcmFzZShub2RlcyArIGosICZyb290KTsKKwkJfQorCQljaGVjaygwKTsKKwl9CisKKwlwcmludGsoS0VSTl9BTEVSVCAiYXVnbWVudGVkIHJidHJlZSB0ZXN0aW5nIik7CisKKwlpbml0KCk7CisKKwl0aW1lMSA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJmX2xvb3BzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG5ub2RlczsgaisrKQorCQkJaW5zZXJ0X2F1Z21lbnRlZChub2RlcyArIGosICZyb290KTsKKwkJZm9yIChqID0gMDsgaiA8IG5ub2RlczsgaisrKQorCQkJZXJhc2VfYXVnbWVudGVkKG5vZGVzICsgaiwgJnJvb3QpOworCX0KKworCXRpbWUyID0gZ2V0X2N5Y2xlcygpOworCXRpbWUgPSB0aW1lMiAtIHRpbWUxOworCisJdGltZSA9IGRpdl91NjQodGltZSwgcGVyZl9sb29wcyk7CisJcHJpbnRrKCIgLT4gdGVzdCAxIChsYXRlbmN5IG9mIG5ub2RlcyBpbnNlcnQrZGVsZXRlKTogJWxsdSBjeWNsZXNcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZSk7CisKKwl0aW1lMSA9IGdldF9jeWNsZXMoKTsKKworCWZvciAoaSA9IDA7IGkgPCBwZXJmX2xvb3BzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG5ub2RlczsgaisrKQorCQkJaW5zZXJ0X2F1Z21lbnRlZF9jYWNoZWQobm9kZXMgKyBqLCAmcm9vdCk7CisJCWZvciAoaiA9IDA7IGogPCBubm9kZXM7IGorKykKKwkJCWVyYXNlX2F1Z21lbnRlZF9jYWNoZWQobm9kZXMgKyBqLCAmcm9vdCk7CisJfQorCisJdGltZTIgPSBnZXRfY3ljbGVzKCk7CisJdGltZSA9IHRpbWUyIC0gdGltZTE7CisKKwl0aW1lID0gZGl2X3U2NCh0aW1lLCBwZXJmX2xvb3BzKTsKKwlwcmludGsoIiAtPiB0ZXN0IDIgKGxhdGVuY3kgb2Ygbm5vZGVzIGNhY2hlZCBpbnNlcnQrZGVsZXRlKTogJWxsdSBjeWNsZXNcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdGltZSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hlY2tfbG9vcHM7IGkrKykgeworCQlpbml0KCk7CisJCWZvciAoaiA9IDA7IGogPCBubm9kZXM7IGorKykgeworCQkJY2hlY2tfYXVnbWVudGVkKGopOworCQkJaW5zZXJ0X2F1Z21lbnRlZChub2RlcyArIGosICZyb290KTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgbm5vZGVzOyBqKyspIHsKKwkJCWNoZWNrX2F1Z21lbnRlZChubm9kZXMgLSBqKTsKKwkJCWVyYXNlX2F1Z21lbnRlZChub2RlcyArIGosICZyb290KTsKKwkJfQorCQljaGVja19hdWdtZW50ZWQoMCk7CisJfQorCisJa2ZyZWUobm9kZXMpOworCisJcmV0dXJuIC1FQUdBSU47IC8qIEZhaWwgd2lsbCBkaXJlY3RseSB1bmxvYWQgdGhlIG1vZHVsZSAqLworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcmJ0cmVlX3Rlc3RfZXhpdCh2b2lkKQoreworCXByaW50ayhLRVJOX0FMRVJUICJ0ZXN0IGV4aXRcbiIpOworfQorCittb2R1bGVfaW5pdChyYnRyZWVfdGVzdF9pbml0KQorbW9kdWxlX2V4aXQocmJ0cmVlX3Rlc3RfZXhpdCkKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiTWljaGVsIExlc3BpbmFzc2UiKTsKK01PRFVMRV9ERVNDUklQVElPTigiUmVkIEJsYWNrIFRyZWUgdGVzdCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVjaXByb2NhbF9kaXYuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlY2lwcm9jYWxfZGl2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiNGNlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlY2lwcm9jYWxfZGl2LmMKQEAgLTAsMCArMSwyOCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWNpcHJvY2FsX2Rpdi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisvKgorICogRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGFsZ29yaXRobSBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQKKyAqIGluY2x1ZGUvbGludXgvcmVjaXByb2NhbF9kaXYuaAorICovCisKK3N0cnVjdCByZWNpcHJvY2FsX3ZhbHVlIHJlY2lwcm9jYWxfdmFsdWUodTMyIGQpCit7CisJc3RydWN0IHJlY2lwcm9jYWxfdmFsdWUgUjsKKwl1NjQgbTsKKwlpbnQgbDsKKworCWwgPSBmbHMoZCAtIDEpOworCW0gPSAoKDFVTEwgPDwgMzIpICogKCgxVUxMIDw8IGwpIC0gZCkpOworCWRvX2RpdihtLCBkKTsKKwkrK207CisJUi5tID0gKHUzMiltOworCVIuc2gxID0gbWluKGwsIDEpOworCVIuc2gyID0gbWF4KGwgLSAxLCAwKTsKKworCXJldHVybiBSOworfQorRVhQT1JUX1NZTUJPTChyZWNpcHJvY2FsX3ZhbHVlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlZWRfc29sb21vbi9NYWtlZmlsZSBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlZWRfc29sb21vbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q3MTM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVlZF9zb2xvbW9uL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIworIyBUaGlzIGlzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiByZWVkIHNvbG9tb24gbGliLAorIworCitvYmotJChDT05GSUdfUkVFRF9TT0xPTU9OKSArPSByZWVkX3NvbG9tb24ubworCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yZWVkX3NvbG9tb24vZGVjb2RlX3JzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yZWVkX3NvbG9tb24vZGVjb2RlX3JzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVkMzEzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlZWRfc29sb21vbi9kZWNvZGVfcnMuYwpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIGxpYi9yZWVkX3NvbG9tb24vZGVjb2RlX3JzLmMKKyAqCisgKiBPdmVydmlldzoKKyAqICAgR2VuZXJpYyBSZWVkIFNvbG9tb24gZW5jb2RlciAvIGRlY29kZXIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAyMDAyLCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqCisgKiBBZGFwdGlvbiB0byB0aGUga2VybmVsIGJ5IFRob21hcyBHbGVpeG5lciAodGdseEBsaW51dHJvbml4LmRlKQorICoKKyAqICRJZDogZGVjb2RlX3JzLmMsdiAxLjcgMjAwNS8xMS8wNyAxMToxNDo1OSBnbGVpeG5lciBFeHAgJAorICoKKyAqLworCisvKiBHZW5lcmljIGRhdGEgd2lkdGggaW5kZXBlbmRlbnQgY29kZSB3aGljaCBpcyBpbmNsdWRlZCBieSB0aGUKKyAqIHdyYXBwZXJzLgorICovCit7CisJaW50IGRlZ19sYW1iZGEsIGVsLCBkZWdfb21lZ2E7CisJaW50IGksIGosIHIsIGssIHBhZDsKKwlpbnQgbm4gPSBycy0+bm47CisJaW50IG5yb290cyA9IHJzLT5ucm9vdHM7CisJaW50IGZjciA9IHJzLT5mY3I7CisJaW50IHByaW0gPSBycy0+cHJpbTsKKwlpbnQgaXByaW0gPSBycy0+aXByaW07CisJdWludDE2X3QgKmFscGhhX3RvID0gcnMtPmFscGhhX3RvOworCXVpbnQxNl90ICppbmRleF9vZiA9IHJzLT5pbmRleF9vZjsKKwl1aW50MTZfdCB1LCBxLCB0bXAsIG51bTEsIG51bTIsIGRlbiwgZGlzY3Jfciwgc3luX2Vycm9yOworCS8qIEVycitFcmFzIExvY2F0b3IgcG9seSBhbmQgc3luZHJvbWUgcG9seSBUaGUgbWF4aW11bSB2YWx1ZQorCSAqIG9mIG5yb290cyBpcyA4LiBTbyB0aGUgbmVjZXNzYXJ5IHN0YWNrIHNpemUgd2lsbCBiZSBhYm91dAorCSAqIDIyMCBieXRlcyBtYXguCisJICovCisJdWludDE2X3QgbGFtYmRhW25yb290cyArIDFdLCBzeW5bbnJvb3RzXTsKKwl1aW50MTZfdCBiW25yb290cyArIDFdLCB0W25yb290cyArIDFdLCBvbWVnYVtucm9vdHMgKyAxXTsKKwl1aW50MTZfdCByb290W25yb290c10sIHJlZ1tucm9vdHMgKyAxXSwgbG9jW25yb290c107CisJaW50IGNvdW50ID0gMDsKKwl1aW50MTZfdCBtc2sgPSAodWludDE2X3QpIHJzLT5ubjsKKworCS8qIENoZWNrIGxlbmd0aCBwYXJhbWV0ZXIgZm9yIHZhbGlkaXR5ICovCisJcGFkID0gbm4gLSBucm9vdHMgLSBsZW47CisJQlVHX09OKHBhZCA8IDAgfHwgcGFkID49IG5uKTsKKworCS8qIERvZXMgdGhlIGNhbGxlciBwcm92aWRlIHRoZSBzeW5kcm9tZSA/ICovCisJaWYgKHMgIT0gTlVMTCkgeworCQlmb3IgKGkgPSAwOyBpIDwgbnJvb3RzOyBpKyspIHsKKwkJCS8qIFRoZSBzeW5kcm9tZSBpcyBpbiBpbmRleCBmb3JtLAorCQkJICogc28gbm4gcmVwcmVzZW50cyB6ZXJvCisJCQkgKi8KKwkJCWlmIChzW2ldICE9IG5uKQorCQkJCWdvdG8gZGVjb2RlOworCQl9CisKKwkJLyogc3luZHJvbWUgaXMgemVybywgbm8gZXJyb3JzIHRvIGNvcnJlY3QgICovCisJCXJldHVybiAwOworCX0KKworCS8qIGZvcm0gdGhlIHN5bmRyb21lczsgaS5lLiwgZXZhbHVhdGUgZGF0YSh4KSBhdCByb290cyBvZgorCSAqIGcoeCkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnJvb3RzOyBpKyspCisJCXN5bltpXSA9ICgoKHVpbnQxNl90KSBkYXRhWzBdKSBeIGludm1zaykgJiBtc2s7CisKKwlmb3IgKGogPSAxOyBqIDwgbGVuOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yb290czsgaSsrKSB7CisJCQlpZiAoc3luW2ldID09IDApIHsKKwkJCQlzeW5baV0gPSAoKCh1aW50MTZfdCkgZGF0YVtqXSkgXgorCQkJCQkgIGludm1zaykgJiBtc2s7CisJCQl9IGVsc2UgeworCQkJCXN5bltpXSA9ICgoKCh1aW50MTZfdCkgZGF0YVtqXSkgXgorCQkJCQkgICBpbnZtc2spICYgbXNrKSBeCisJCQkJCWFscGhhX3RvW3JzX21vZG5uKHJzLCBpbmRleF9vZltzeW5baV1dICsKKwkJCQkJCSAgICAgICAoZmNyICsgaSkgKiBwcmltKV07CisJCQl9CisJCX0KKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgbnJvb3RzOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yb290czsgaSsrKSB7CisJCQlpZiAoc3luW2ldID09IDApIHsKKwkJCQlzeW5baV0gPSAoKHVpbnQxNl90KSBwYXJbal0pICYgbXNrOworCQkJfSBlbHNlIHsKKwkJCQlzeW5baV0gPSAoKCh1aW50MTZfdCkgcGFyW2pdKSAmIG1zaykgXgorCQkJCQlhbHBoYV90b1tyc19tb2RubihycywgaW5kZXhfb2Zbc3luW2ldXSArCisJCQkJCQkgICAgICAgKGZjcitpKSpwcmltKV07CisJCQl9CisJCX0KKwl9CisJcyA9IHN5bjsKKworCS8qIENvbnZlcnQgc3luZHJvbWVzIHRvIGluZGV4IGZvcm0sIGNoZWNraW5nIGZvciBub256ZXJvIGNvbmRpdGlvbiAqLworCXN5bl9lcnJvciA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5yb290czsgaSsrKSB7CisJCXN5bl9lcnJvciB8PSBzW2ldOworCQlzW2ldID0gaW5kZXhfb2Zbc1tpXV07CisJfQorCisJaWYgKCFzeW5fZXJyb3IpIHsKKwkJLyogaWYgc3luZHJvbWUgaXMgemVybywgZGF0YVtdIGlzIGEgY29kZXdvcmQgYW5kIHRoZXJlIGFyZSBubworCQkgKiBlcnJvcnMgdG8gY29ycmVjdC4gU28gcmV0dXJuIGRhdGFbXSB1bm1vZGlmaWVkCisJCSAqLworCQljb3VudCA9IDA7CisJCWdvdG8gZmluaXNoOworCX0KKworIGRlY29kZToKKwltZW1zZXQoJmxhbWJkYVsxXSwgMCwgbnJvb3RzICogc2l6ZW9mKGxhbWJkYVswXSkpOworCWxhbWJkYVswXSA9IDE7CisKKwlpZiAobm9fZXJhcyA+IDApIHsKKwkJLyogSW5pdCBsYW1iZGEgdG8gYmUgdGhlIGVyYXN1cmUgbG9jYXRvciBwb2x5bm9taWFsICovCisJCWxhbWJkYVsxXSA9IGFscGhhX3RvW3JzX21vZG5uKHJzLAorCQkJCQlwcmltICogKG5uIC0gMSAtIChlcmFzX3Bvc1swXSArIHBhZCkpKV07CisJCWZvciAoaSA9IDE7IGkgPCBub19lcmFzOyBpKyspIHsKKwkJCXUgPSByc19tb2RubihycywgcHJpbSAqIChubiAtIDEgLSAoZXJhc19wb3NbaV0gKyBwYWQpKSk7CisJCQlmb3IgKGogPSBpICsgMTsgaiA+IDA7IGotLSkgeworCQkJCXRtcCA9IGluZGV4X29mW2xhbWJkYVtqIC0gMV1dOworCQkJCWlmICh0bXAgIT0gbm4pIHsKKwkJCQkJbGFtYmRhW2pdIF49CisJCQkJCQlhbHBoYV90b1tyc19tb2RubihycywgdSArIHRtcCldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBucm9vdHMgKyAxOyBpKyspCisJCWJbaV0gPSBpbmRleF9vZltsYW1iZGFbaV1dOworCisJLyoKKwkgKiBCZWdpbiBCZXJsZWthbXAtTWFzc2V5IGFsZ29yaXRobSB0byBkZXRlcm1pbmUgZXJyb3IrZXJhc3VyZQorCSAqIGxvY2F0b3IgcG9seW5vbWlhbAorCSAqLworCXIgPSBub19lcmFzOworCWVsID0gbm9fZXJhczsKKwl3aGlsZSAoKytyIDw9IG5yb290cykgewkvKiByIGlzIHRoZSBzdGVwIG51bWJlciAqLworCQkvKiBDb21wdXRlIGRpc2NyZXBhbmN5IGF0IHRoZSByLXRoIHN0ZXAgaW4gcG9seS1mb3JtICovCisJCWRpc2NyX3IgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgcjsgaSsrKSB7CisJCQlpZiAoKGxhbWJkYVtpXSAhPSAwKSAmJiAoc1tyIC0gaSAtIDFdICE9IG5uKSkgeworCQkJCWRpc2NyX3IgXj0KKwkJCQkJYWxwaGFfdG9bcnNfbW9kbm4ocnMsCisJCQkJCQkJICBpbmRleF9vZltsYW1iZGFbaV1dICsKKwkJCQkJCQkgIHNbciAtIGkgLSAxXSldOworCQkJfQorCQl9CisJCWRpc2NyX3IgPSBpbmRleF9vZltkaXNjcl9yXTsJLyogSW5kZXggZm9ybSAqLworCQlpZiAoZGlzY3JfciA9PSBubikgeworCQkJLyogMiBsaW5lcyBiZWxvdzogQih4KSA8LS0geCpCKHgpICovCisJCQltZW1tb3ZlICgmYlsxXSwgYiwgbnJvb3RzICogc2l6ZW9mIChiWzBdKSk7CisJCQliWzBdID0gbm47CisJCX0gZWxzZSB7CisJCQkvKiA3IGxpbmVzIGJlbG93OiBUKHgpIDwtLSBsYW1iZGEoeCktZGlzY3Jfcip4KmIoeCkgKi8KKwkJCXRbMF0gPSBsYW1iZGFbMF07CisJCQlmb3IgKGkgPSAwOyBpIDwgbnJvb3RzOyBpKyspIHsKKwkJCQlpZiAoYltpXSAhPSBubikgeworCQkJCQl0W2kgKyAxXSA9IGxhbWJkYVtpICsgMV0gXgorCQkJCQkJYWxwaGFfdG9bcnNfbW9kbm4ocnMsIGRpc2NyX3IgKworCQkJCQkJCQkgIGJbaV0pXTsKKwkJCQl9IGVsc2UKKwkJCQkJdFtpICsgMV0gPSBsYW1iZGFbaSArIDFdOworCQkJfQorCQkJaWYgKDIgKiBlbCA8PSByICsgbm9fZXJhcyAtIDEpIHsKKwkJCQllbCA9IHIgKyBub19lcmFzIC0gZWw7CisJCQkJLyoKKwkJCQkgKiAyIGxpbmVzIGJlbG93OiBCKHgpIDwtLSBpbnYoZGlzY3JfcikgKgorCQkJCSAqIGxhbWJkYSh4KQorCQkJCSAqLworCQkJCWZvciAoaSA9IDA7IGkgPD0gbnJvb3RzOyBpKyspIHsKKwkJCQkJYltpXSA9IChsYW1iZGFbaV0gPT0gMCkgPyBubiA6CisJCQkJCQlyc19tb2RubihycywgaW5kZXhfb2ZbbGFtYmRhW2ldXQorCQkJCQkJCSAtIGRpc2NyX3IgKyBubik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiAyIGxpbmVzIGJlbG93OiBCKHgpIDwtLSB4KkIoeCkgKi8KKwkJCQltZW1tb3ZlKCZiWzFdLCBiLCBucm9vdHMgKiBzaXplb2YoYlswXSkpOworCQkJCWJbMF0gPSBubjsKKwkJCX0KKwkJCW1lbWNweShsYW1iZGEsIHQsIChucm9vdHMgKyAxKSAqIHNpemVvZih0WzBdKSk7CisJCX0KKwl9CisKKwkvKiBDb252ZXJ0IGxhbWJkYSB0byBpbmRleCBmb3JtIGFuZCBjb21wdXRlIGRlZyhsYW1iZGEoeCkpICovCisJZGVnX2xhbWJkYSA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5yb290cyArIDE7IGkrKykgeworCQlsYW1iZGFbaV0gPSBpbmRleF9vZltsYW1iZGFbaV1dOworCQlpZiAobGFtYmRhW2ldICE9IG5uKQorCQkJZGVnX2xhbWJkYSA9IGk7CisJfQorCS8qIEZpbmQgcm9vdHMgb2YgZXJyb3IrZXJhc3VyZSBsb2NhdG9yIHBvbHlub21pYWwgYnkgQ2hpZW4gc2VhcmNoICovCisJbWVtY3B5KCZyZWdbMV0sICZsYW1iZGFbMV0sIG5yb290cyAqIHNpemVvZihyZWdbMF0pKTsKKwljb3VudCA9IDA7CQkvKiBOdW1iZXIgb2Ygcm9vdHMgb2YgbGFtYmRhKHgpICovCisJZm9yIChpID0gMSwgayA9IGlwcmltIC0gMTsgaSA8PSBubjsgaSsrLCBrID0gcnNfbW9kbm4ocnMsIGsgKyBpcHJpbSkpIHsKKwkJcSA9IDE7CQkvKiBsYW1iZGFbMF0gaXMgYWx3YXlzIDAgKi8KKwkJZm9yIChqID0gZGVnX2xhbWJkYTsgaiA+IDA7IGotLSkgeworCQkJaWYgKHJlZ1tqXSAhPSBubikgeworCQkJCXJlZ1tqXSA9IHJzX21vZG5uKHJzLCByZWdbal0gKyBqKTsKKwkJCQlxIF49IGFscGhhX3RvW3JlZ1tqXV07CisJCQl9CisJCX0KKwkJaWYgKHEgIT0gMCkKKwkJCWNvbnRpbnVlOwkvKiBOb3QgYSByb290ICovCisJCS8qIHN0b3JlIHJvb3QgKGluZGV4LWZvcm0pIGFuZCBlcnJvciBsb2NhdGlvbiBudW1iZXIgKi8KKwkJcm9vdFtjb3VudF0gPSBpOworCQlsb2NbY291bnRdID0gazsKKwkJLyogSWYgd2UndmUgYWxyZWFkeSBmb3VuZCBtYXggcG9zc2libGUgcm9vdHMsCisJCSAqIGFib3J0IHRoZSBzZWFyY2ggdG8gc2F2ZSB0aW1lCisJCSAqLworCQlpZiAoKytjb3VudCA9PSBkZWdfbGFtYmRhKQorCQkJYnJlYWs7CisJfQorCWlmIChkZWdfbGFtYmRhICE9IGNvdW50KSB7CisJCS8qCisJCSAqIGRlZyhsYW1iZGEpIHVuZXF1YWwgdG8gbnVtYmVyIG9mIHJvb3RzID0+IHVuY29ycmVjdGFibGUKKwkJICogZXJyb3IgZGV0ZWN0ZWQKKwkJICovCisJCWNvdW50ID0gLUVCQURNU0c7CisJCWdvdG8gZmluaXNoOworCX0KKwkvKgorCSAqIENvbXB1dGUgZXJyK2VyYXMgZXZhbHVhdG9yIHBvbHkgb21lZ2EoeCkgPSBzKHgpKmxhbWJkYSh4KSAobW9kdWxvCisJICogeCoqbnJvb3RzKS4gaW4gaW5kZXggZm9ybS4gQWxzbyBmaW5kIGRlZyhvbWVnYSkuCisJICovCisJZGVnX29tZWdhID0gZGVnX2xhbWJkYSAtIDE7CisJZm9yIChpID0gMDsgaSA8PSBkZWdfb21lZ2E7IGkrKykgeworCQl0bXAgPSAwOworCQlmb3IgKGogPSBpOyBqID49IDA7IGotLSkgeworCQkJaWYgKChzW2kgLSBqXSAhPSBubikgJiYgKGxhbWJkYVtqXSAhPSBubikpCisJCQkJdG1wIF49CisJCQkJICAgIGFscGhhX3RvW3JzX21vZG5uKHJzLCBzW2kgLSBqXSArIGxhbWJkYVtqXSldOworCQl9CisJCW9tZWdhW2ldID0gaW5kZXhfb2ZbdG1wXTsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgZXJyb3IgdmFsdWVzIGluIHBvbHktZm9ybS4gbnVtMSA9IG9tZWdhKGludihYKGwpKSksIG51bTIgPQorCSAqIGludihYKGwpKSoqKGZjci0xKSBhbmQgZGVuID0gbGFtYmRhX3ByKGludihYKGwpKSkgYWxsIGluIHBvbHktZm9ybQorCSAqLworCWZvciAoaiA9IGNvdW50IC0gMTsgaiA+PSAwOyBqLS0pIHsKKwkJbnVtMSA9IDA7CisJCWZvciAoaSA9IGRlZ19vbWVnYTsgaSA+PSAwOyBpLS0pIHsKKwkJCWlmIChvbWVnYVtpXSAhPSBubikKKwkJCQludW0xIF49IGFscGhhX3RvW3JzX21vZG5uKHJzLCBvbWVnYVtpXSArCisJCQkJCQkJaSAqIHJvb3Rbal0pXTsKKwkJfQorCQludW0yID0gYWxwaGFfdG9bcnNfbW9kbm4ocnMsIHJvb3Rbal0gKiAoZmNyIC0gMSkgKyBubildOworCQlkZW4gPSAwOworCisJCS8qIGxhbWJkYVtpKzFdIGZvciBpIGV2ZW4gaXMgdGhlIGZvcm1hbCBkZXJpdmF0aXZlCisJCSAqIGxhbWJkYV9wciBvZiBsYW1iZGFbaV0gKi8KKwkJZm9yIChpID0gbWluKGRlZ19sYW1iZGEsIG5yb290cyAtIDEpICYgfjE7IGkgPj0gMDsgaSAtPSAyKSB7CisJCQlpZiAobGFtYmRhW2kgKyAxXSAhPSBubikgeworCQkJCWRlbiBePSBhbHBoYV90b1tyc19tb2RubihycywgbGFtYmRhW2kgKyAxXSArCisJCQkJCQkgICAgICAgaSAqIHJvb3Rbal0pXTsKKwkJCX0KKwkJfQorCQkvKiBBcHBseSBlcnJvciB0byBkYXRhICovCisJCWlmIChudW0xICE9IDAgJiYgbG9jW2pdID49IHBhZCkgeworCQkJdWludDE2X3QgY29yID0gYWxwaGFfdG9bcnNfbW9kbm4ocnMsaW5kZXhfb2ZbbnVtMV0gKworCQkJCQkJICAgICAgIGluZGV4X29mW251bTJdICsKKwkJCQkJCSAgICAgICBubiAtIGluZGV4X29mW2Rlbl0pXTsKKwkJCS8qIFN0b3JlIHRoZSBlcnJvciBjb3JyZWN0aW9uIHBhdHRlcm4sIGlmIGEKKwkJCSAqIGNvcnJlY3Rpb24gYnVmZmVyIGlzIGF2YWlsYWJsZSAqLworCQkJaWYgKGNvcnIpIHsKKwkJCQljb3JyW2pdID0gY29yOworCQkJfSBlbHNlIHsKKwkJCQkvKiBJZiBhIGRhdGEgYnVmZmVyIGlzIGdpdmVuIGFuZCB0aGUKKwkJCQkgKiBlcnJvciBpcyBpbnNpZGUgdGhlIG1lc3NhZ2UsCisJCQkJICogY29ycmVjdCBpdCAqLworCQkJCWlmIChkYXRhICYmIChsb2Nbal0gPCAobm4gLSBucm9vdHMpKSkKKwkJCQkJZGF0YVtsb2Nbal0gLSBwYWRdIF49IGNvcjsKKwkJCX0KKwkJfQorCX0KKworZmluaXNoOgorCWlmIChlcmFzX3BvcyAhPSBOVUxMKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorCQkJZXJhc19wb3NbaV0gPSBsb2NbaV0gLSBwYWQ7CisJfQorCXJldHVybiBjb3VudDsKKworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVlZF9zb2xvbW9uL2VuY29kZV9ycy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVlZF9zb2xvbW9uL2VuY29kZV9ycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNWIxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yZWVkX3NvbG9tb24vZW5jb2RlX3JzLmMKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIGxpYi9yZWVkX3NvbG9tb24vZW5jb2RlX3JzLmMKKyAqCisgKiBPdmVydmlldzoKKyAqICAgR2VuZXJpYyBSZWVkIFNvbG9tb24gZW5jb2RlciAvIGRlY29kZXIgbGlicmFyeQorICoKKyAqIENvcHlyaWdodCAyMDAyLCBQaGlsIEthcm4sIEtBOVEKKyAqIE1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkKKyAqCisgKiBBZGFwdGlvbiB0byB0aGUga2VybmVsIGJ5IFRob21hcyBHbGVpeG5lciAodGdseEBsaW51dHJvbml4LmRlKQorICoKKyAqICRJZDogZW5jb2RlX3JzLmMsdiAxLjUgMjAwNS8xMS8wNyAxMToxNDo1OSBnbGVpeG5lciBFeHAgJAorICoKKyAqLworCisvKiBHZW5lcmljIGRhdGEgd2lkdGggaW5kZXBlbmRlbnQgY29kZSB3aGljaCBpcyBpbmNsdWRlZCBieSB0aGUKKyAqIHdyYXBwZXJzLgorICogaW50IGVuY29kZV9yc1ggKHN0cnVjdCByc19jb250cm9sICpycywgdWludFhfdCAqZGF0YSwgaW50IGxlbiwgdWludFlfdCAqcGFyKQorICovCit7CisJaW50IGksIGosIHBhZDsKKwlpbnQgbm4gPSBycy0+bm47CisJaW50IG5yb290cyA9IHJzLT5ucm9vdHM7CisJdWludDE2X3QgKmFscGhhX3RvID0gcnMtPmFscGhhX3RvOworCXVpbnQxNl90ICppbmRleF9vZiA9IHJzLT5pbmRleF9vZjsKKwl1aW50MTZfdCAqZ2VucG9seSA9IHJzLT5nZW5wb2x5OworCXVpbnQxNl90IGZiOworCXVpbnQxNl90IG1zayA9ICh1aW50MTZfdCkgcnMtPm5uOworCisJLyogQ2hlY2sgbGVuZ3RoIHBhcmFtZXRlciBmb3IgdmFsaWRpdHkgKi8KKwlwYWQgPSBubiAtIG5yb290cyAtIGxlbjsKKwlpZiAocGFkIDwgMCB8fCBwYWQgPj0gbm4pCisJCXJldHVybiAtRVJBTkdFOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWZiID0gaW5kZXhfb2ZbKCgoKHVpbnQxNl90KSBkYXRhW2ldKV5pbnZtc2spICYgbXNrKSBeIHBhclswXV07CisJCS8qIGZlZWRiYWNrIHRlcm0gaXMgbm9uLXplcm8gKi8KKwkJaWYgKGZiICE9IG5uKSB7CisJCQlmb3IgKGogPSAxOyBqIDwgbnJvb3RzOyBqKyspIHsKKwkJCQlwYXJbal0gXj0gYWxwaGFfdG9bcnNfbW9kbm4ocnMsIGZiICsKKwkJCQkJCQkgZ2VucG9seVtucm9vdHMgLSBqXSldOworCQkJfQorCQl9CisJCS8qIFNoaWZ0ICovCisJCW1lbW1vdmUoJnBhclswXSwgJnBhclsxXSwgc2l6ZW9mKHVpbnQxNl90KSAqIChucm9vdHMgLSAxKSk7CisJCWlmIChmYiAhPSBubikgeworCQkJcGFyW25yb290cyAtIDFdID0gYWxwaGFfdG9bcnNfbW9kbm4ocnMsCisJCQkJCQkJICAgIGZiICsgZ2VucG9seVswXSldOworCQl9IGVsc2UgeworCQkJcGFyW25yb290cyAtIDFdID0gMDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlZWRfc29sb21vbi9yZWVkX3NvbG9tb24uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JlZWRfc29sb21vbi9yZWVkX3NvbG9tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQwNGNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVlZF9zb2xvbW9uL3JlZWRfc29sb21vbi5jCkBAIC0wLDAgKzEsMzg0IEBACisvKgorICogbGliL3JlZWRfc29sb21vbi9yZWVkX3NvbG9tb24uYworICoKKyAqIE92ZXJ2aWV3OgorICogICBHZW5lcmljIFJlZWQgU29sb21vbiBlbmNvZGVyIC8gZGVjb2RlciBsaWJyYXJ5CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IFRob21hcyBHbGVpeG5lciAodGdseEBsaW51dHJvbml4LmRlKQorICoKKyAqIFJlZWQgU29sb21vbiBjb2RlIGxpZnRlZCBmcm9tIHJlZWQgc29sb21vbiBsaWJyYXJ5IHdyaXR0ZW4gYnkgUGhpbCBLYXJuCisgKiBDb3B5cmlnaHQgMjAwMiBQaGlsIEthcm4sIEtBOVEKKyAqCisgKiAkSWQ6IHJzbGliLmMsdiAxLjcgMjAwNS8xMS8wNyAxMToxNDo1OSBnbGVpeG5lciBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogRGVzY3JpcHRpb246CisgKgorICogVGhlIGdlbmVyaWMgUmVlZCBTb2xvbW9uIGxpYnJhcnkgcHJvdmlkZXMgcnVudGltZSBjb25maWd1cmFibGUKKyAqIGVuY29kaW5nIC8gZGVjb2Rpbmcgb2YgUlMgY29kZXMuCisgKiBFYWNoIHVzZXIgbXVzdCBjYWxsIGluaXRfcnMgdG8gZ2V0IGEgcG9pbnRlciB0byBhIHJzX2NvbnRyb2wKKyAqIHN0cnVjdHVyZSBmb3IgdGhlIGdpdmVuIHJzIHBhcmFtZXRlcnMuIFRoaXMgc3RydWN0dXJlIGlzIGVpdGhlcgorICogZ2VuZXJhdGVkIG9yIGEgYWxyZWFkeSBhdmFpbGFibGUgbWF0Y2hpbmcgY29udHJvbCBzdHJ1Y3R1cmUgaXMgdXNlZC4KKyAqIElmIGEgc3RydWN0dXJlIGlzIGdlbmVyYXRlZCB0aGVuIHRoZSBwb2x5bm9taWFsIGFycmF5cyBmb3IKKyAqIGZhc3QgZW5jb2RpbmcgLyBkZWNvZGluZyBhcmUgYnVpbHQuIFRoaXMgY2FuIHRha2Ugc29tZSB0aW1lIHNvCisgKiBtYWtlIHN1cmUgbm90IHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tIGEgdGltZSBjcml0aWNhbCBwYXRoLgorICogVXN1YWxseSBhIG1vZHVsZSAvIGRyaXZlciBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgbmVjZXNzYXJ5CisgKiByc19jb250cm9sIHN0cnVjdHVyZSBvbiBtb2R1bGUgLyBkcml2ZXIgaW5pdCBhbmQgcmVsZWFzZSBpdAorICogb24gZXhpdC4KKyAqIFRoZSBlbmNvZGluZyBwdXRzIHRoZSBjYWxjdWxhdGVkIHN5bmRyb21lIGludG8gYSBnaXZlbiBzeW5kcm9tZQorICogYnVmZmVyLgorICogVGhlIGRlY29kaW5nIGlzIGEgdHdvIHN0ZXAgcHJvY2Vzcy4gVGhlIGZpcnN0IHN0ZXAgY2FsY3VsYXRlcworICogdGhlIHN5bmRyb21lIG92ZXIgdGhlIHJlY2VpdmVkIChkYXRhICsgc3luZHJvbWUpIGFuZCBjYWxscyB0aGUKKyAqIHNlY29uZCBzdGFnZSwgd2hpY2ggZG9lcyB0aGUgZGVjb2RpbmcgLyBlcnJvciBjb3JyZWN0aW9uIGl0c2VsZi4KKyAqIE1hbnkgaHcgZW5jb2RlcnMgcHJvdmlkZSBhIHN5bmRyb21lIGNhbGN1bGF0aW9uIG92ZXIgdGhlIHJlY2VpdmVkCisgKiBkYXRhICsgc3luZHJvbWUgYW5kIGNhbiBjYWxsIHRoZSBzZWNvbmQgc3RhZ2UgZGlyZWN0bHkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yc2xpYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisvKiBUaGlzIGxpc3QgaG9sZHMgYWxsIGN1cnJlbnRseSBhbGxvY2F0ZWQgcnMgY29udHJvbCBzdHJ1Y3R1cmVzICovCitzdGF0aWMgTElTVF9IRUFEIChyc2xpc3QpOworLyogUHJvdGVjdGlvbiBmb3IgdGhlIGxpc3QgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgocnNsaXN0bG9jayk7CisKKy8qKgorICogcnNfaW5pdCAtIEluaXRpYWxpemUgYSBSZWVkLVNvbG9tb24gY29kZWMKKyAqIEBzeW1zaXplOglzeW1ib2wgc2l6ZSwgYml0cyAoMS04KQorICogQGdmcG9seToJRmllbGQgZ2VuZXJhdG9yIHBvbHlub21pYWwgY29lZmZpY2llbnRzCisgKiBAZ2ZmdW5jOglGaWVsZCBnZW5lcmF0b3IgZnVuY3Rpb24KKyAqIEBmY3I6CWZpcnN0IHJvb3Qgb2YgUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCwgaW5kZXggZm9ybQorICogQHByaW06CXByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHBvbHlub21pYWwgcm9vdHMKKyAqIEBucm9vdHM6CVJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZGVncmVlIChudW1iZXIgb2Ygcm9vdHMpCisgKgorICogQWxsb2NhdGUgYSBjb250cm9sIHN0cnVjdHVyZSBhbmQgdGhlIHBvbHlub20gYXJyYXlzIGZvciBmYXN0ZXIKKyAqIGVuL2RlY29kaW5nLiBGaWxsIHRoZSBhcnJheXMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICovCitzdGF0aWMgc3RydWN0IHJzX2NvbnRyb2wgKnJzX2luaXQoaW50IHN5bXNpemUsIGludCBnZnBvbHksIGludCAoKmdmZnVuYykoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmNyLCBpbnQgcHJpbSwgaW50IG5yb290cykKK3sKKwlzdHJ1Y3QgcnNfY29udHJvbCAqcnM7CisJaW50IGksIGosIHNyLCByb290LCBpcHJpbTsKKworCS8qIEFsbG9jYXRlIHRoZSBjb250cm9sIHN0cnVjdHVyZSAqLworCXJzID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCByc19jb250cm9sKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MSVNUX0hFQUQoJnJzLT5saXN0KTsKKworCXJzLT5tbSA9IHN5bXNpemU7CisJcnMtPm5uID0gKDEgPDwgc3ltc2l6ZSkgLSAxOworCXJzLT5mY3IgPSBmY3I7CisJcnMtPnByaW0gPSBwcmltOworCXJzLT5ucm9vdHMgPSBucm9vdHM7CisJcnMtPmdmcG9seSA9IGdmcG9seTsKKwlycy0+Z2ZmdW5jID0gZ2ZmdW5jOworCisJLyogQWxsb2NhdGUgdGhlIGFycmF5cyAqLworCXJzLT5hbHBoYV90byA9IGttYWxsb2Moc2l6ZW9mKHVpbnQxNl90KSAqIChycy0+bm4gKyAxKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJzLT5hbHBoYV90byA9PSBOVUxMKQorCQlnb3RvIGVycnJzOworCisJcnMtPmluZGV4X29mID0ga21hbGxvYyhzaXplb2YodWludDE2X3QpICogKHJzLT5ubiArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZiAocnMtPmluZGV4X29mID09IE5VTEwpCisJCWdvdG8gZXJyYWxwOworCisJcnMtPmdlbnBvbHkgPSBrbWFsbG9jKHNpemVvZih1aW50MTZfdCkgKiAocnMtPm5yb290cyArIDEpLCBHRlBfS0VSTkVMKTsKKwlpZihycy0+Z2VucG9seSA9PSBOVUxMKQorCQlnb3RvIGVycmlkeDsKKworCS8qIEdlbmVyYXRlIEdhbG9pcyBmaWVsZCBsb29rdXAgdGFibGVzICovCisJcnMtPmluZGV4X29mWzBdID0gcnMtPm5uOwkvKiBsb2coemVybykgPSAtaW5mICovCisJcnMtPmFscGhhX3RvW3JzLT5ubl0gPSAwOwkvKiBhbHBoYSoqLWluZiA9IDAgKi8KKwlpZiAoZ2Zwb2x5KSB7CisJCXNyID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IHJzLT5ubjsgaSsrKSB7CisJCQlycy0+aW5kZXhfb2Zbc3JdID0gaTsKKwkJCXJzLT5hbHBoYV90b1tpXSA9IHNyOworCQkJc3IgPDw9IDE7CisJCQlpZiAoc3IgJiAoMSA8PCBzeW1zaXplKSkKKwkJCQlzciBePSBnZnBvbHk7CisJCQlzciAmPSBycy0+bm47CisJCX0KKwl9IGVsc2UgeworCQlzciA9IGdmZnVuYygwKTsKKwkJZm9yIChpID0gMDsgaSA8IHJzLT5ubjsgaSsrKSB7CisJCQlycy0+aW5kZXhfb2Zbc3JdID0gaTsKKwkJCXJzLT5hbHBoYV90b1tpXSA9IHNyOworCQkJc3IgPSBnZmZ1bmMoc3IpOworCQl9CisJfQorCS8qIElmIGl0J3Mgbm90IHByaW1pdGl2ZSwgZXhpdCAqLworCWlmKHNyICE9IHJzLT5hbHBoYV90b1swXSkKKwkJZ290byBlcnJwb2w7CisKKwkvKiBGaW5kIHByaW0tdGggcm9vdCBvZiAxLCB1c2VkIGluIGRlY29kaW5nICovCisJZm9yKGlwcmltID0gMTsgKGlwcmltICUgcHJpbSkgIT0gMDsgaXByaW0gKz0gcnMtPm5uKTsKKwkvKiBwcmltLXRoIHJvb3Qgb2YgMSwgaW5kZXggZm9ybSAqLworCXJzLT5pcHJpbSA9IGlwcmltIC8gcHJpbTsKKworCS8qIEZvcm0gUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBmcm9tIGl0cyByb290cyAqLworCXJzLT5nZW5wb2x5WzBdID0gMTsKKwlmb3IgKGkgPSAwLCByb290ID0gZmNyICogcHJpbTsgaSA8IG5yb290czsgaSsrLCByb290ICs9IHByaW0pIHsKKwkJcnMtPmdlbnBvbHlbaSArIDFdID0gMTsKKwkJLyogTXVsdGlwbHkgcnMtPmdlbnBvbHlbXSBieSAgQCoqKHJvb3QgKyB4KSAqLworCQlmb3IgKGogPSBpOyBqID4gMDsgai0tKSB7CisJCQlpZiAocnMtPmdlbnBvbHlbal0gIT0gMCkgeworCQkJCXJzLT5nZW5wb2x5W2pdID0gcnMtPmdlbnBvbHlbaiAtMV0gXgorCQkJCQlycy0+YWxwaGFfdG9bcnNfbW9kbm4ocnMsCisJCQkJCXJzLT5pbmRleF9vZltycy0+Z2VucG9seVtqXV0gKyByb290KV07CisJCQl9IGVsc2UKKwkJCQlycy0+Z2VucG9seVtqXSA9IHJzLT5nZW5wb2x5W2ogLSAxXTsKKwkJfQorCQkvKiBycy0+Z2VucG9seVswXSBjYW4gbmV2ZXIgYmUgemVybyAqLworCQlycy0+Z2VucG9seVswXSA9CisJCQlycy0+YWxwaGFfdG9bcnNfbW9kbm4ocnMsCisJCQkJcnMtPmluZGV4X29mW3JzLT5nZW5wb2x5WzBdXSArIHJvb3QpXTsKKwl9CisJLyogY29udmVydCBycy0+Z2VucG9seVtdIHRvIGluZGV4IGZvcm0gZm9yIHF1aWNrZXIgZW5jb2RpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IG5yb290czsgaSsrKQorCQlycy0+Z2VucG9seVtpXSA9IHJzLT5pbmRleF9vZltycy0+Z2VucG9seVtpXV07CisJcmV0dXJuIHJzOworCisJLyogRXJyb3IgZXhpdCAqLworZXJycG9sOgorCWtmcmVlKHJzLT5nZW5wb2x5KTsKK2VycmlkeDoKKwlrZnJlZShycy0+aW5kZXhfb2YpOworZXJyYWxwOgorCWtmcmVlKHJzLT5hbHBoYV90byk7CitlcnJyczoKKwlrZnJlZShycyk7CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoqCisgKiAgZnJlZV9ycyAtIEZyZWUgdGhlIHJzIGNvbnRyb2wgc3RydWN0dXJlLCBpZiBpdCBpcyBubyBsb25nZXIgdXNlZAorICogIEByczoJdGhlIGNvbnRyb2wgc3RydWN0dXJlIHdoaWNoIGlzIG5vdCBsb25nZXIgdXNlZCBieSB0aGUKKyAqCQljYWxsZXIKKyAqLwordm9pZCBmcmVlX3JzKHN0cnVjdCByc19jb250cm9sICpycykKK3sKKwltdXRleF9sb2NrKCZyc2xpc3Rsb2NrKTsKKwlycy0+dXNlcnMtLTsKKwlpZighcnMtPnVzZXJzKSB7CisJCWxpc3RfZGVsKCZycy0+bGlzdCk7CisJCWtmcmVlKHJzLT5hbHBoYV90byk7CisJCWtmcmVlKHJzLT5pbmRleF9vZik7CisJCWtmcmVlKHJzLT5nZW5wb2x5KTsKKwkJa2ZyZWUocnMpOworCX0KKwltdXRleF91bmxvY2soJnJzbGlzdGxvY2spOworfQorCisvKioKKyAqIGluaXRfcnNfaW50ZXJuYWwgLSBGaW5kIGEgbWF0Y2hpbmcgb3IgYWxsb2NhdGUgYSBuZXcgcnMgY29udHJvbCBzdHJ1Y3R1cmUKKyAqICBAc3ltc2l6ZToJdGhlIHN5bWJvbCBzaXplIChudW1iZXIgb2YgYml0cykKKyAqICBAZ2Zwb2x5Ogl0aGUgZXh0ZW5kZWQgR2Fsb2lzIGZpZWxkIGdlbmVyYXRvciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cywKKyAqCQl3aXRoIHRoZSAwdGggY29lZmZpY2llbnQgaW4gdGhlIGxvdyBvcmRlciBiaXQuIFRoZSBwb2x5bm9taWFsCisgKgkJbXVzdCBiZSBwcmltaXRpdmU7CisgKiAgQGdmZnVuYzoJcG9pbnRlciB0byBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgbmV4dCBmaWVsZCBlbGVtZW50LAorICoJCW9yIHRoZSBtdWx0aXBsaWNhdGl2ZSBpZGVudGl0eSBlbGVtZW50IGlmIGdpdmVuIDAuICBVc2VkCisgKgkJaW5zdGVhZCBvZiBnZnBvbHkgaWYgZ2Zwb2x5IGlzIDAKKyAqICBAZmNyOiAgCXRoZSBmaXJzdCBjb25zZWN1dGl2ZSByb290IG9mIHRoZSBycyBjb2RlIGdlbmVyYXRvciBwb2x5bm9taWFsCisgKgkJaW4gaW5kZXggZm9ybQorICogIEBwcmltOglwcmltaXRpdmUgZWxlbWVudCB0byBnZW5lcmF0ZSBwb2x5bm9taWFsIHJvb3RzCisgKiAgQG5yb290czoJUlMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbCBkZWdyZWUgKG51bWJlciBvZiByb290cykKKyAqLworc3RhdGljIHN0cnVjdCByc19jb250cm9sICppbml0X3JzX2ludGVybmFsKGludCBzeW1zaXplLCBpbnQgZ2Zwb2x5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAoKmdmZnVuYykoaW50KSwgaW50IGZjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJpbSwgaW50IG5yb290cykKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkCSp0bXA7CisJc3RydWN0IHJzX2NvbnRyb2wJKnJzOworCisJLyogU2FuaXR5IGNoZWNrcyAqLworCWlmIChzeW1zaXplIDwgMSkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGZjciA8IDAgfHwgZmNyID49ICgxPDxzeW1zaXplKSkKKyAgICAJCXJldHVybiBOVUxMOworCWlmIChwcmltIDw9IDAgfHwgcHJpbSA+PSAoMTw8c3ltc2l6ZSkpCisgICAgCQlyZXR1cm4gTlVMTDsKKwlpZiAobnJvb3RzIDwgMCB8fCBucm9vdHMgPj0gKDE8PHN5bXNpemUpKQorCQlyZXR1cm4gTlVMTDsKKworCW11dGV4X2xvY2soJnJzbGlzdGxvY2spOworCisJLyogV2FsayB0aHJvdWdoIHRoZSBsaXN0IGFuZCBsb29rIGZvciBhIG1hdGNoaW5nIGVudHJ5ICovCisJbGlzdF9mb3JfZWFjaCh0bXAsICZyc2xpc3QpIHsKKwkJcnMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IHJzX2NvbnRyb2wsIGxpc3QpOworCQlpZiAoc3ltc2l6ZSAhPSBycy0+bW0pCisJCQljb250aW51ZTsKKwkJaWYgKGdmcG9seSAhPSBycy0+Z2Zwb2x5KQorCQkJY29udGludWU7CisJCWlmIChnZmZ1bmMgIT0gcnMtPmdmZnVuYykKKwkJCWNvbnRpbnVlOworCQlpZiAoZmNyICE9IHJzLT5mY3IpCisJCQljb250aW51ZTsKKwkJaWYgKHByaW0gIT0gcnMtPnByaW0pCisJCQljb250aW51ZTsKKwkJaWYgKG5yb290cyAhPSBycy0+bnJvb3RzKQorCQkJY29udGludWU7CisJCS8qIFdlIGhhdmUgYSBtYXRjaGluZyBvbmUgYWxyZWFkeSAqLworCQlycy0+dXNlcnMrKzsKKwkJZ290byBvdXQ7CisJfQorCisJLyogQ3JlYXRlIGEgbmV3IG9uZSAqLworCXJzID0gcnNfaW5pdChzeW1zaXplLCBnZnBvbHksIGdmZnVuYywgZmNyLCBwcmltLCBucm9vdHMpOworCWlmIChycykgeworCQlycy0+dXNlcnMgPSAxOworCQlsaXN0X2FkZCgmcnMtPmxpc3QsICZyc2xpc3QpOworCX0KK291dDoKKwltdXRleF91bmxvY2soJnJzbGlzdGxvY2spOworCXJldHVybiByczsKK30KKworLyoqCisgKiBpbml0X3JzIC0gRmluZCBhIG1hdGNoaW5nIG9yIGFsbG9jYXRlIGEgbmV3IHJzIGNvbnRyb2wgc3RydWN0dXJlCisgKiAgQHN5bXNpemU6CXRoZSBzeW1ib2wgc2l6ZSAobnVtYmVyIG9mIGJpdHMpCisgKiAgQGdmcG9seToJdGhlIGV4dGVuZGVkIEdhbG9pcyBmaWVsZCBnZW5lcmF0b3IgcG9seW5vbWlhbCBjb2VmZmljaWVudHMsCisgKgkJd2l0aCB0aGUgMHRoIGNvZWZmaWNpZW50IGluIHRoZSBsb3cgb3JkZXIgYml0LiBUaGUgcG9seW5vbWlhbAorICoJCW11c3QgYmUgcHJpbWl0aXZlOworICogIEBmY3I6ICAJdGhlIGZpcnN0IGNvbnNlY3V0aXZlIHJvb3Qgb2YgdGhlIHJzIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwKKyAqCQlpbiBpbmRleCBmb3JtCisgKiAgQHByaW06CXByaW1pdGl2ZSBlbGVtZW50IHRvIGdlbmVyYXRlIHBvbHlub21pYWwgcm9vdHMKKyAqICBAbnJvb3RzOglSUyBjb2RlIGdlbmVyYXRvciBwb2x5bm9taWFsIGRlZ3JlZSAobnVtYmVyIG9mIHJvb3RzKQorICovCitzdHJ1Y3QgcnNfY29udHJvbCAqaW5pdF9ycyhpbnQgc3ltc2l6ZSwgaW50IGdmcG9seSwgaW50IGZjciwgaW50IHByaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnJvb3RzKQoreworCXJldHVybiBpbml0X3JzX2ludGVybmFsKHN5bXNpemUsIGdmcG9seSwgTlVMTCwgZmNyLCBwcmltLCBucm9vdHMpOworfQorCisvKioKKyAqIGluaXRfcnNfbm9uX2Nhbm9uaWNhbCAtIEZpbmQgYSBtYXRjaGluZyBvciBhbGxvY2F0ZSBhIG5ldyBycyBjb250cm9sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUsIGZvciBmaWVsZHMgd2l0aCBub24tY2Fub25pY2FsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbgorICogIEBzeW1zaXplOgl0aGUgc3ltYm9sIHNpemUgKG51bWJlciBvZiBiaXRzKQorICogIEBnZmZ1bmM6CXBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gZ2VuZXJhdGUgdGhlIG5leHQgZmllbGQgZWxlbWVudCwKKyAqCQlvciB0aGUgbXVsdGlwbGljYXRpdmUgaWRlbnRpdHkgZWxlbWVudCBpZiBnaXZlbiAwLiAgVXNlZAorICoJCWluc3RlYWQgb2YgZ2Zwb2x5IGlmIGdmcG9seSBpcyAwCisgKiAgQGZjcjogIAl0aGUgZmlyc3QgY29uc2VjdXRpdmUgcm9vdCBvZiB0aGUgcnMgY29kZSBnZW5lcmF0b3IgcG9seW5vbWlhbAorICoJCWluIGluZGV4IGZvcm0KKyAqICBAcHJpbToJcHJpbWl0aXZlIGVsZW1lbnQgdG8gZ2VuZXJhdGUgcG9seW5vbWlhbCByb290cworICogIEBucm9vdHM6CVJTIGNvZGUgZ2VuZXJhdG9yIHBvbHlub21pYWwgZGVncmVlIChudW1iZXIgb2Ygcm9vdHMpCisgKi8KK3N0cnVjdCByc19jb250cm9sICppbml0X3JzX25vbl9jYW5vbmljYWwoaW50IHN5bXNpemUsIGludCAoKmdmZnVuYykoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZjciwgaW50IHByaW0sIGludCBucm9vdHMpCit7CisJcmV0dXJuIGluaXRfcnNfaW50ZXJuYWwoc3ltc2l6ZSwgMCwgZ2ZmdW5jLCBmY3IsIHByaW0sIG5yb290cyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUkVFRF9TT0xPTU9OX0VOQzgKKy8qKgorICogIGVuY29kZV9yczggLSBDYWxjdWxhdGUgdGhlIHBhcml0eSBmb3IgZGF0YSB2YWx1ZXMgKDhiaXQgZGF0YSB3aWR0aCkKKyAqICBAcnM6CXRoZSBycyBjb250cm9sIHN0cnVjdHVyZQorICogIEBkYXRhOglkYXRhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZQorICogIEBsZW46CWRhdGEgbGVuZ3RoCisgKiAgQHBhcjoJcGFyaXR5IGRhdGEsIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGVyICh1c3VhbGx5IGFsbCAwKQorICogIEBpbnZtc2s6CWludmVydCBkYXRhIG1hc2sgKHdpbGwgYmUgeG9yZWQgb24gZGF0YSkKKyAqCisgKiAgVGhlIHBhcml0eSB1c2VzIGEgdWludDE2X3QgZGF0YSB0eXBlIHRvIGVuYWJsZQorICogIHN5bWJvbCBzaXplID4gOC4gVGhlIGNhbGxpbmcgY29kZSBtdXN0IHRha2UgY2FyZSBvZiBlbmNvZGluZyBvZiB0aGUKKyAqICBzeW5kcm9tZSByZXN1bHQgZm9yIHN0b3JhZ2UgaXRzZWxmLgorICovCitpbnQgZW5jb2RlX3JzOChzdHJ1Y3QgcnNfY29udHJvbCAqcnMsIHVpbnQ4X3QgKmRhdGEsIGludCBsZW4sIHVpbnQxNl90ICpwYXIsCisJICAgICAgIHVpbnQxNl90IGludm1zaykKK3sKKyNpbmNsdWRlICJlbmNvZGVfcnMuYyIKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVuY29kZV9yczgpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUkVFRF9TT0xPTU9OX0RFQzgKKy8qKgorICogIGRlY29kZV9yczggLSBEZWNvZGUgY29kZXdvcmQgKDhiaXQgZGF0YSB3aWR0aCkKKyAqICBAcnM6CXRoZSBycyBjb250cm9sIHN0cnVjdHVyZQorICogIEBkYXRhOglkYXRhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZQorICogIEBwYXI6CXJlY2VpdmVkIHBhcml0eSBkYXRhIGZpZWxkCisgKiAgQGxlbjoJZGF0YSBsZW5ndGgKKyAqICBAczoJCXN5bmRyb21lIGRhdGEgZmllbGQgKGlmIE5VTEwsIHN5bmRyb21lIGlzIGNhbGN1bGF0ZWQpCisgKiAgQG5vX2VyYXM6CW51bWJlciBvZiBlcmFzdXJlcworICogIEBlcmFzX3BvczoJcG9zaXRpb24gb2YgZXJhc3VyZXMsIGNhbiBiZSBOVUxMCisgKiAgQGludm1zazoJaW52ZXJ0IGRhdGEgbWFzayAod2lsbCBiZSB4b3JlZCBvbiBkYXRhLCBub3Qgb24gcGFyaXR5ISkKKyAqICBAY29ycjoJYnVmZmVyIHRvIHN0b3JlIGNvcnJlY3Rpb24gYml0bWFzayBvbiBlcmFzX3BvcworICoKKyAqICBUaGUgc3luZHJvbWUgYW5kIHBhcml0eSB1c2VzIGEgdWludDE2X3QgZGF0YSB0eXBlIHRvIGVuYWJsZQorICogIHN5bWJvbCBzaXplID4gOC4gVGhlIGNhbGxpbmcgY29kZSBtdXN0IHRha2UgY2FyZSBvZiBkZWNvZGluZyBvZiB0aGUKKyAqICBzeW5kcm9tZSByZXN1bHQgYW5kIHRoZSByZWNlaXZlZCBwYXJpdHkgYmVmb3JlIGNhbGxpbmcgdGhpcyBjb2RlLgorICogIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3JyZWN0ZWQgYml0cyBvciAtRUJBRE1TRyBmb3IgdW5jb3JyZWN0YWJsZSBlcnJvcnMuCisgKi8KK2ludCBkZWNvZGVfcnM4KHN0cnVjdCByc19jb250cm9sICpycywgdWludDhfdCAqZGF0YSwgdWludDE2X3QgKnBhciwgaW50IGxlbiwKKwkgICAgICAgdWludDE2X3QgKnMsIGludCBub19lcmFzLCBpbnQgKmVyYXNfcG9zLCB1aW50MTZfdCBpbnZtc2ssCisJICAgICAgIHVpbnQxNl90ICpjb3JyKQoreworI2luY2x1ZGUgImRlY29kZV9ycy5jIgorfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVjb2RlX3JzOCk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19SRUVEX1NPTE9NT05fRU5DMTYKKy8qKgorICogIGVuY29kZV9yczE2IC0gQ2FsY3VsYXRlIHRoZSBwYXJpdHkgZm9yIGRhdGEgdmFsdWVzICgxNmJpdCBkYXRhIHdpZHRoKQorICogIEByczoJdGhlIHJzIGNvbnRyb2wgc3RydWN0dXJlCisgKiAgQGRhdGE6CWRhdGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlCisgKiAgQGxlbjoJZGF0YSBsZW5ndGgKKyAqICBAcGFyOglwYXJpdHkgZGF0YSwgbXVzdCBiZSBpbml0aWFsaXplZCBieSBjYWxsZXIgKHVzdWFsbHkgYWxsIDApCisgKiAgQGludm1zazoJaW52ZXJ0IGRhdGEgbWFzayAod2lsbCBiZSB4b3JlZCBvbiBkYXRhLCBub3Qgb24gcGFyaXR5ISkKKyAqCisgKiAgRWFjaCBmaWVsZCBpbiB0aGUgZGF0YSBhcnJheSBjb250YWlucyB1cCB0byBzeW1ib2wgc2l6ZSBiaXRzIG9mIHZhbGlkIGRhdGEuCisgKi8KK2ludCBlbmNvZGVfcnMxNihzdHJ1Y3QgcnNfY29udHJvbCAqcnMsIHVpbnQxNl90ICpkYXRhLCBpbnQgbGVuLCB1aW50MTZfdCAqcGFyLAorCXVpbnQxNl90IGludm1zaykKK3sKKyNpbmNsdWRlICJlbmNvZGVfcnMuYyIKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVuY29kZV9yczE2KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JFRURfU09MT01PTl9ERUMxNgorLyoqCisgKiAgZGVjb2RlX3JzMTYgLSBEZWNvZGUgY29kZXdvcmQgKDE2Yml0IGRhdGEgd2lkdGgpCisgKiAgQHJzOgl0aGUgcnMgY29udHJvbCBzdHJ1Y3R1cmUKKyAqICBAZGF0YToJZGF0YSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUKKyAqICBAcGFyOglyZWNlaXZlZCBwYXJpdHkgZGF0YSBmaWVsZAorICogIEBsZW46CWRhdGEgbGVuZ3RoCisgKiAgQHM6CQlzeW5kcm9tZSBkYXRhIGZpZWxkIChpZiBOVUxMLCBzeW5kcm9tZSBpcyBjYWxjdWxhdGVkKQorICogIEBub19lcmFzOgludW1iZXIgb2YgZXJhc3VyZXMKKyAqICBAZXJhc19wb3M6CXBvc2l0aW9uIG9mIGVyYXN1cmVzLCBjYW4gYmUgTlVMTAorICogIEBpbnZtc2s6CWludmVydCBkYXRhIG1hc2sgKHdpbGwgYmUgeG9yZWQgb24gZGF0YSwgbm90IG9uIHBhcml0eSEpCisgKiAgQGNvcnI6CWJ1ZmZlciB0byBzdG9yZSBjb3JyZWN0aW9uIGJpdG1hc2sgb24gZXJhc19wb3MKKyAqCisgKiAgRWFjaCBmaWVsZCBpbiB0aGUgZGF0YSBhcnJheSBjb250YWlucyB1cCB0byBzeW1ib2wgc2l6ZSBiaXRzIG9mIHZhbGlkIGRhdGEuCisgKiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcnJlY3RlZCBiaXRzIG9yIC1FQkFETVNHIGZvciB1bmNvcnJlY3RhYmxlIGVycm9ycy4KKyAqLworaW50IGRlY29kZV9yczE2KHN0cnVjdCByc19jb250cm9sICpycywgdWludDE2X3QgKmRhdGEsIHVpbnQxNl90ICpwYXIsIGludCBsZW4sCisJCXVpbnQxNl90ICpzLCBpbnQgbm9fZXJhcywgaW50ICplcmFzX3BvcywgdWludDE2X3QgaW52bXNrLAorCQl1aW50MTZfdCAqY29ycikKK3sKKyNpbmNsdWRlICJkZWNvZGVfcnMuYyIKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRlY29kZV9yczE2KTsKKyNlbmRpZgorCitFWFBPUlRfU1lNQk9MX0dQTChpbml0X3JzKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGluaXRfcnNfbm9uX2Nhbm9uaWNhbCk7CitFWFBPUlRfU1lNQk9MX0dQTChmcmVlX3JzKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSZWVkIFNvbG9tb24gZW5jb2Rlci9kZWNvZGVyIik7CitNT0RVTEVfQVVUSE9SKCJQaGlsIEthcm4sIFRob21hcyBHbGVpeG5lciIpOworCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yZWZjb3VudC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVmY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI0ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvcmVmY291bnQuYwpAQCAtMCwwICsxLDM1MiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBWYXJpYW50IG9mIGF0b21pY190IHNwZWNpYWxpemVkIGZvciByZWZlcmVuY2UgY291bnRzLgorICoKKyAqIFRoZSBpbnRlcmZhY2UgbWF0Y2hlcyB0aGUgYXRvbWljX3QgaW50ZXJmYWNlICh0byBhaWQgaW4gcG9ydGluZykgYnV0IG9ubHkKKyAqIHByb3ZpZGVzIHRoZSBmZXcgZnVuY3Rpb25zIG9uZSBzaG91bGQgdXNlIGZvciByZWZlcmVuY2UgY291bnRpbmcuCisgKgorICogSXQgZGlmZmVycyBpbiB0aGF0IHRoZSBjb3VudGVyIHNhdHVyYXRlcyBhdCBVSU5UX01BWCBhbmQgd2lsbCBub3QgbW92ZSBvbmNlCisgKiB0aGVyZS4gVGhpcyBhdm9pZHMgd3JhcHBpbmcgdGhlIGNvdW50ZXIgYW5kIGNhdXNpbmcgJ3NwdXJpb3VzJworICogdXNlLWFmdGVyLWZyZWUgaXNzdWVzLgorICoKKyAqIE1lbW9yeSBvcmRlcmluZyBydWxlcyBhcmUgc2xpZ2h0bHkgcmVsYXhlZCB3cnQgcmVndWxhciBhdG9taWNfdCBmdW5jdGlvbnMKKyAqIGFuZCBwcm92aWRlIG9ubHkgd2hhdCBpcyBzdHJpY3RseSByZXF1aXJlZCBmb3IgcmVmY291bnRzLgorICoKKyAqIFRoZSBpbmNyZW1lbnRzIGFyZSBmdWxseSByZWxheGVkOyB0aGVzZSB3aWxsIG5vdCBwcm92aWRlIG9yZGVyaW5nLiBUaGUKKyAqIHJhdGlvbmFsZSBpcyB0aGF0IHdoYXRldmVyIGlzIHVzZWQgdG8gb2J0YWluIHRoZSBvYmplY3Qgd2UncmUgaW5jcmVhc2luZyB0aGUKKyAqIHJlZmVyZW5jZSBjb3VudCBvbiB3aWxsIHByb3ZpZGUgdGhlIG9yZGVyaW5nLiBGb3IgbG9ja2VkIGRhdGEgc3RydWN0dXJlcywKKyAqIGl0cyB0aGUgbG9jayBhY3F1aXJlLCBmb3IgUkNVL2xvY2tsZXNzIGRhdGEgc3RydWN0dXJlcyBpdHMgdGhlIGRlcGVuZGVudAorICogbG9hZC4KKyAqCisgKiBEbyBub3RlIHRoYXQgaW5jX25vdF96ZXJvKCkgcHJvdmlkZXMgYSBjb250cm9sIGRlcGVuZGVuY3kgd2hpY2ggd2lsbCBvcmRlcgorICogZnV0dXJlIHN0b3JlcyBhZ2FpbnN0IHRoZSBpbmMsIHRoaXMgZW5zdXJlcyB3ZSdsbCBuZXZlciBtb2RpZnkgdGhlIG9iamVjdAorICogaWYgd2UgZGlkIG5vdCBpbiBmYWN0IGFjcXVpcmUgYSByZWZlcmVuY2UuCisgKgorICogVGhlIGRlY3JlbWVudHMgd2lsbCBwcm92aWRlIHJlbGVhc2Ugb3JkZXIsIHN1Y2ggdGhhdCBhbGwgdGhlIHByaW9yIGxvYWRzIGFuZAorICogc3RvcmVzIHdpbGwgYmUgaXNzdWVkIGJlZm9yZSwgaXQgYWxzbyBwcm92aWRlcyBhIGNvbnRyb2wgZGVwZW5kZW5jeSwgd2hpY2gKKyAqIHdpbGwgb3JkZXIgdXMgYWdhaW5zdCB0aGUgc3Vic2VxdWVudCBmcmVlKCkuCisgKgorICogVGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBpcyBhZ2FpbnN0IHRoZSBsb2FkIG9mIHRoZSBjbXB4Y2hnIChsbC9zYykgdGhhdAorICogc3VjY2VlZGVkLiBUaGlzIG1lYW5zIHRoZSBzdG9yZXMgYXJlbid0IGZ1bGx5IG9yZGVyZWQsIGJ1dCB0aGlzIGlzIGZpbmUKKyAqIGJlY2F1c2UgdGhlIDEtPjAgdHJhbnNpdGlvbiBpbmRpY2F0ZXMgbm8gY29uY3VycmVuY3kuCisgKgorICogTm90ZSB0aGF0IHRoZSBhbGxvY2F0b3IgaXMgcmVzcG9uc2libGUgZm9yIG9yZGVyaW5nIHRoaW5ncyBiZXR3ZWVuIGZyZWUoKQorICogYW5kIGFsbG9jKCkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9yZWZjb3VudC5oPgorI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgorCisjaWZkZWYgQ09ORklHX1JFRkNPVU5UX0ZVTEwKKworLyoqCisgKiByZWZjb3VudF9hZGRfbm90X3plcm8gLSBhZGQgYSB2YWx1ZSB0byBhIHJlZmNvdW50IHVubGVzcyBpdCBpcyAwCisgKiBAaTogdGhlIHZhbHVlIHRvIGFkZCB0byB0aGUgcmVmY291bnQKKyAqIEByOiB0aGUgcmVmY291bnQKKyAqCisgKiBXaWxsIHNhdHVyYXRlIGF0IFVJTlRfTUFYIGFuZCBXQVJOLgorICoKKyAqIFByb3ZpZGVzIG5vIG1lbW9yeSBvcmRlcmluZywgaXQgaXMgYXNzdW1lZCB0aGUgY2FsbGVyIGhhcyBndWFyYW50ZWVkIHRoZQorICogb2JqZWN0IG1lbW9yeSB0byBiZSBzdGFibGUgKFJDVSwgZXRjLikuIEl0IGRvZXMgcHJvdmlkZSBhIGNvbnRyb2wgZGVwZW5kZW5jeQorICogYW5kIHRoZXJlYnkgb3JkZXJzIGZ1dHVyZSBzdG9yZXMuIFNlZSB0aGUgY29tbWVudCBvbiB0b3AuCisgKgorICogVXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgbm90IHJlY29tbWVuZGVkIGZvciB0aGUgbm9ybWFsIHJlZmVyZW5jZSBjb3VudGluZworICogdXNlIGNhc2UgaW4gd2hpY2ggcmVmZXJlbmNlcyBhcmUgdGFrZW4gYW5kIHJlbGVhc2VkIG9uZSBhdCBhIHRpbWUuICBJbiB0aGVzZQorICogY2FzZXMsIHJlZmNvdW50X2luYygpLCBvciBvbmUgb2YgaXRzIHZhcmlhbnRzLCBzaG91bGQgaW5zdGVhZCBiZSB1c2VkIHRvCisgKiBpbmNyZW1lbnQgYSByZWZlcmVuY2UgY291bnQuCisgKgorICogUmV0dXJuOiBmYWxzZSBpZiB0aGUgcGFzc2VkIHJlZmNvdW50IGlzIDAsIHRydWUgb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcmVmY291bnRfYWRkX25vdF96ZXJvKHVuc2lnbmVkIGludCBpLCByZWZjb3VudF90ICpyKQoreworCXVuc2lnbmVkIGludCBuZXcsIHZhbCA9IGF0b21pY19yZWFkKCZyLT5yZWZzKTsKKworCWRvIHsKKwkJaWYgKCF2YWwpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJaWYgKHVubGlrZWx5KHZhbCA9PSBVSU5UX01BWCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQluZXcgPSB2YWwgKyBpOworCQlpZiAobmV3IDwgdmFsKQorCQkJbmV3ID0gVUlOVF9NQVg7CisKKwl9IHdoaWxlICghYXRvbWljX3RyeV9jbXB4Y2hnX3JlbGF4ZWQoJnItPnJlZnMsICZ2YWwsIG5ldykpOworCisJV0FSTl9PTkNFKG5ldyA9PSBVSU5UX01BWCwgInJlZmNvdW50X3Q6IHNhdHVyYXRlZDsgbGVha2luZyBtZW1vcnkuXG4iKTsKKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChyZWZjb3VudF9hZGRfbm90X3plcm8pOworCisvKioKKyAqIHJlZmNvdW50X2FkZCAtIGFkZCBhIHZhbHVlIHRvIGEgcmVmY291bnQKKyAqIEBpOiB0aGUgdmFsdWUgdG8gYWRkIHRvIHRoZSByZWZjb3VudAorICogQHI6IHRoZSByZWZjb3VudAorICoKKyAqIFNpbWlsYXIgdG8gYXRvbWljX2FkZCgpLCBidXQgd2lsbCBzYXR1cmF0ZSBhdCBVSU5UX01BWCBhbmQgV0FSTi4KKyAqCisgKiBQcm92aWRlcyBubyBtZW1vcnkgb3JkZXJpbmcsIGl0IGlzIGFzc3VtZWQgdGhlIGNhbGxlciBoYXMgZ3VhcmFudGVlZCB0aGUKKyAqIG9iamVjdCBtZW1vcnkgdG8gYmUgc3RhYmxlIChSQ1UsIGV0Yy4pLiBJdCBkb2VzIHByb3ZpZGUgYSBjb250cm9sIGRlcGVuZGVuY3kKKyAqIGFuZCB0aGVyZWJ5IG9yZGVycyBmdXR1cmUgc3RvcmVzLiBTZWUgdGhlIGNvbW1lbnQgb24gdG9wLgorICoKKyAqIFVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhlIG5vcm1hbCByZWZlcmVuY2UgY291bnRpbmcKKyAqIHVzZSBjYXNlIGluIHdoaWNoIHJlZmVyZW5jZXMgYXJlIHRha2VuIGFuZCByZWxlYXNlZCBvbmUgYXQgYSB0aW1lLiAgSW4gdGhlc2UKKyAqIGNhc2VzLCByZWZjb3VudF9pbmMoKSwgb3Igb25lIG9mIGl0cyB2YXJpYW50cywgc2hvdWxkIGluc3RlYWQgYmUgdXNlZCB0bworICogaW5jcmVtZW50IGEgcmVmZXJlbmNlIGNvdW50LgorICovCit2b2lkIHJlZmNvdW50X2FkZCh1bnNpZ25lZCBpbnQgaSwgcmVmY291bnRfdCAqcikKK3sKKwlXQVJOX09OQ0UoIXJlZmNvdW50X2FkZF9ub3RfemVybyhpLCByKSwgInJlZmNvdW50X3Q6IGFkZGl0aW9uIG9uIDA7IHVzZS1hZnRlci1mcmVlLlxuIik7Cit9CitFWFBPUlRfU1lNQk9MKHJlZmNvdW50X2FkZCk7CisKKy8qKgorICogcmVmY291bnRfaW5jX25vdF96ZXJvIC0gaW5jcmVtZW50IGEgcmVmY291bnQgdW5sZXNzIGl0IGlzIDAKKyAqIEByOiB0aGUgcmVmY291bnQgdG8gaW5jcmVtZW50CisgKgorICogU2ltaWxhciB0byBhdG9taWNfaW5jX25vdF96ZXJvKCksIGJ1dCB3aWxsIHNhdHVyYXRlIGF0IFVJTlRfTUFYIGFuZCBXQVJOLgorICoKKyAqIFByb3ZpZGVzIG5vIG1lbW9yeSBvcmRlcmluZywgaXQgaXMgYXNzdW1lZCB0aGUgY2FsbGVyIGhhcyBndWFyYW50ZWVkIHRoZQorICogb2JqZWN0IG1lbW9yeSB0byBiZSBzdGFibGUgKFJDVSwgZXRjLikuIEl0IGRvZXMgcHJvdmlkZSBhIGNvbnRyb2wgZGVwZW5kZW5jeQorICogYW5kIHRoZXJlYnkgb3JkZXJzIGZ1dHVyZSBzdG9yZXMuIFNlZSB0aGUgY29tbWVudCBvbiB0b3AuCisgKgorICogUmV0dXJuOiB0cnVlIGlmIHRoZSBpbmNyZW1lbnQgd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHJlZmNvdW50X2luY19ub3RfemVybyhyZWZjb3VudF90ICpyKQoreworCXVuc2lnbmVkIGludCBuZXcsIHZhbCA9IGF0b21pY19yZWFkKCZyLT5yZWZzKTsKKworCWRvIHsKKwkJbmV3ID0gdmFsICsgMTsKKworCQlpZiAoIXZhbCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAodW5saWtlbHkoIW5ldykpCisJCQlyZXR1cm4gdHJ1ZTsKKworCX0gd2hpbGUgKCFhdG9taWNfdHJ5X2NtcHhjaGdfcmVsYXhlZCgmci0+cmVmcywgJnZhbCwgbmV3KSk7CisKKwlXQVJOX09OQ0UobmV3ID09IFVJTlRfTUFYLCAicmVmY291bnRfdDogc2F0dXJhdGVkOyBsZWFraW5nIG1lbW9yeS5cbiIpOworCisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MKHJlZmNvdW50X2luY19ub3RfemVybyk7CisKKy8qKgorICogcmVmY291bnRfaW5jIC0gaW5jcmVtZW50IGEgcmVmY291bnQKKyAqIEByOiB0aGUgcmVmY291bnQgdG8gaW5jcmVtZW50CisgKgorICogU2ltaWxhciB0byBhdG9taWNfaW5jKCksIGJ1dCB3aWxsIHNhdHVyYXRlIGF0IFVJTlRfTUFYIGFuZCBXQVJOLgorICoKKyAqIFByb3ZpZGVzIG5vIG1lbW9yeSBvcmRlcmluZywgaXQgaXMgYXNzdW1lZCB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGEKKyAqIHJlZmVyZW5jZSBvbiB0aGUgb2JqZWN0LgorICoKKyAqIFdpbGwgV0FSTiBpZiB0aGUgcmVmY291bnQgaXMgMCwgYXMgdGhpcyByZXByZXNlbnRzIGEgcG9zc2libGUgdXNlLWFmdGVyLWZyZWUKKyAqIGNvbmRpdGlvbi4KKyAqLwordm9pZCByZWZjb3VudF9pbmMocmVmY291bnRfdCAqcikKK3sKKwlXQVJOX09OQ0UoIXJlZmNvdW50X2luY19ub3RfemVybyhyKSwgInJlZmNvdW50X3Q6IGluY3JlbWVudCBvbiAwOyB1c2UtYWZ0ZXItZnJlZS5cbiIpOworfQorRVhQT1JUX1NZTUJPTChyZWZjb3VudF9pbmMpOworCisvKioKKyAqIHJlZmNvdW50X3N1Yl9hbmRfdGVzdCAtIHN1YnRyYWN0IGZyb20gYSByZWZjb3VudCBhbmQgdGVzdCBpZiBpdCBpcyAwCisgKiBAaTogYW1vdW50IHRvIHN1YnRyYWN0IGZyb20gdGhlIHJlZmNvdW50CisgKiBAcjogdGhlIHJlZmNvdW50CisgKgorICogU2ltaWxhciB0byBhdG9taWNfZGVjX2FuZF90ZXN0KCksIGJ1dCBpdCB3aWxsIFdBUk4sIHJldHVybiBmYWxzZSBhbmQKKyAqIHVsdGltYXRlbHkgbGVhayBvbiB1bmRlcmZsb3cgYW5kIHdpbGwgZmFpbCB0byBkZWNyZW1lbnQgd2hlbiBzYXR1cmF0ZWQKKyAqIGF0IFVJTlRfTUFYLgorICoKKyAqIFByb3ZpZGVzIHJlbGVhc2UgbWVtb3J5IG9yZGVyaW5nLCBzdWNoIHRoYXQgcHJpb3IgbG9hZHMgYW5kIHN0b3JlcyBhcmUgZG9uZQorICogYmVmb3JlLCBhbmQgcHJvdmlkZXMgYSBjb250cm9sIGRlcGVuZGVuY3kgc3VjaCB0aGF0IGZyZWUoKSBtdXN0IGNvbWUgYWZ0ZXIuCisgKiBTZWUgdGhlIGNvbW1lbnQgb24gdG9wLgorICoKKyAqIFVzZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdGhlIG5vcm1hbCByZWZlcmVuY2UgY291bnRpbmcKKyAqIHVzZSBjYXNlIGluIHdoaWNoIHJlZmVyZW5jZXMgYXJlIHRha2VuIGFuZCByZWxlYXNlZCBvbmUgYXQgYSB0aW1lLiAgSW4gdGhlc2UKKyAqIGNhc2VzLCByZWZjb3VudF9kZWMoKSwgb3Igb25lIG9mIGl0cyB2YXJpYW50cywgc2hvdWxkIGluc3RlYWQgYmUgdXNlZCB0bworICogZGVjcmVtZW50IGEgcmVmZXJlbmNlIGNvdW50LgorICoKKyAqIFJldHVybjogdHJ1ZSBpZiB0aGUgcmVzdWx0aW5nIHJlZmNvdW50IGlzIDAsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHJlZmNvdW50X3N1Yl9hbmRfdGVzdCh1bnNpZ25lZCBpbnQgaSwgcmVmY291bnRfdCAqcikKK3sKKwl1bnNpZ25lZCBpbnQgbmV3LCB2YWwgPSBhdG9taWNfcmVhZCgmci0+cmVmcyk7CisKKwlkbyB7CisJCWlmICh1bmxpa2VseSh2YWwgPT0gVUlOVF9NQVgpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCW5ldyA9IHZhbCAtIGk7CisJCWlmIChuZXcgPiB2YWwpIHsKKwkJCVdBUk5fT05DRShuZXcgPiB2YWwsICJyZWZjb3VudF90OiB1bmRlcmZsb3c7IHVzZS1hZnRlci1mcmVlLlxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCX0gd2hpbGUgKCFhdG9taWNfdHJ5X2NtcHhjaGdfcmVsZWFzZSgmci0+cmVmcywgJnZhbCwgbmV3KSk7CisKKwlyZXR1cm4gIW5ldzsKK30KK0VYUE9SVF9TWU1CT0wocmVmY291bnRfc3ViX2FuZF90ZXN0KTsKKworLyoqCisgKiByZWZjb3VudF9kZWNfYW5kX3Rlc3QgLSBkZWNyZW1lbnQgYSByZWZjb3VudCBhbmQgdGVzdCBpZiBpdCBpcyAwCisgKiBAcjogdGhlIHJlZmNvdW50CisgKgorICogU2ltaWxhciB0byBhdG9taWNfZGVjX2FuZF90ZXN0KCksIGl0IHdpbGwgV0FSTiBvbiB1bmRlcmZsb3cgYW5kIGZhaWwgdG8KKyAqIGRlY3JlbWVudCB3aGVuIHNhdHVyYXRlZCBhdCBVSU5UX01BWC4KKyAqCisgKiBQcm92aWRlcyByZWxlYXNlIG1lbW9yeSBvcmRlcmluZywgc3VjaCB0aGF0IHByaW9yIGxvYWRzIGFuZCBzdG9yZXMgYXJlIGRvbmUKKyAqIGJlZm9yZSwgYW5kIHByb3ZpZGVzIGEgY29udHJvbCBkZXBlbmRlbmN5IHN1Y2ggdGhhdCBmcmVlKCkgbXVzdCBjb21lIGFmdGVyLgorICogU2VlIHRoZSBjb21tZW50IG9uIHRvcC4KKyAqCisgKiBSZXR1cm46IHRydWUgaWYgdGhlIHJlc3VsdGluZyByZWZjb3VudCBpcyAwLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCByZWZjb3VudF9kZWNfYW5kX3Rlc3QocmVmY291bnRfdCAqcikKK3sKKwlyZXR1cm4gcmVmY291bnRfc3ViX2FuZF90ZXN0KDEsIHIpOworfQorRVhQT1JUX1NZTUJPTChyZWZjb3VudF9kZWNfYW5kX3Rlc3QpOworCisvKioKKyAqIHJlZmNvdW50X2RlYyAtIGRlY3JlbWVudCBhIHJlZmNvdW50CisgKiBAcjogdGhlIHJlZmNvdW50CisgKgorICogU2ltaWxhciB0byBhdG9taWNfZGVjKCksIGl0IHdpbGwgV0FSTiBvbiB1bmRlcmZsb3cgYW5kIGZhaWwgdG8gZGVjcmVtZW50CisgKiB3aGVuIHNhdHVyYXRlZCBhdCBVSU5UX01BWC4KKyAqCisgKiBQcm92aWRlcyByZWxlYXNlIG1lbW9yeSBvcmRlcmluZywgc3VjaCB0aGF0IHByaW9yIGxvYWRzIGFuZCBzdG9yZXMgYXJlIGRvbmUKKyAqIGJlZm9yZS4KKyAqLwordm9pZCByZWZjb3VudF9kZWMocmVmY291bnRfdCAqcikKK3sKKwlXQVJOX09OQ0UocmVmY291bnRfZGVjX2FuZF90ZXN0KHIpLCAicmVmY291bnRfdDogZGVjcmVtZW50IGhpdCAwOyBsZWFraW5nIG1lbW9yeS5cbiIpOworfQorRVhQT1JUX1NZTUJPTChyZWZjb3VudF9kZWMpOworI2VuZGlmIC8qIENPTkZJR19SRUZDT1VOVF9GVUxMICovCisKKy8qKgorICogcmVmY291bnRfZGVjX2lmX29uZSAtIGRlY3JlbWVudCBhIHJlZmNvdW50IGlmIGl0IGlzIDEKKyAqIEByOiB0aGUgcmVmY291bnQKKyAqCisgKiBObyBhdG9taWNfdCBjb3VudGVycGFydCwgaXQgYXR0ZW1wdHMgYSAxIC0+IDAgdHJhbnNpdGlvbiBhbmQgcmV0dXJucyB0aGUKKyAqIHN1Y2Nlc3MgdGhlcmVvZi4KKyAqCisgKiBMaWtlIGFsbCBkZWNyZW1lbnQgb3BlcmF0aW9ucywgaXQgcHJvdmlkZXMgcmVsZWFzZSBtZW1vcnkgb3JkZXIgYW5kIHByb3ZpZGVzCisgKiBhIGNvbnRyb2wgZGVwZW5kZW5jeS4KKyAqCisgKiBJdCBjYW4gYmUgdXNlZCBsaWtlIGEgdHJ5LWRlbGV0ZSBvcGVyYXRvcjsgdGhpcyBleHBsaWNpdCBjYXNlIGlzIHByb3ZpZGVkCisgKiBhbmQgbm90IGNtcHhjaGcgaW4gZ2VuZXJpYywgYmVjYXVzZSB0aGF0IHdvdWxkIGFsbG93IGltcGxlbWVudGluZyB1bnNhZmUKKyAqIG9wZXJhdGlvbnMuCisgKgorICogUmV0dXJuOiB0cnVlIGlmIHRoZSByZXN1bHRpbmcgcmVmY291bnQgaXMgMCwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcmVmY291bnRfZGVjX2lmX29uZShyZWZjb3VudF90ICpyKQoreworCWludCB2YWwgPSAxOworCisJcmV0dXJuIGF0b21pY190cnlfY21weGNoZ19yZWxlYXNlKCZyLT5yZWZzLCAmdmFsLCAwKTsKK30KK0VYUE9SVF9TWU1CT0wocmVmY291bnRfZGVjX2lmX29uZSk7CisKKy8qKgorICogcmVmY291bnRfZGVjX25vdF9vbmUgLSBkZWNyZW1lbnQgYSByZWZjb3VudCBpZiBpdCBpcyBub3QgMQorICogQHI6IHRoZSByZWZjb3VudAorICoKKyAqIE5vIGF0b21pY190IGNvdW50ZXJwYXJ0LCBpdCBkZWNyZW1lbnRzIHVubGVzcyB0aGUgdmFsdWUgaXMgMSwgaW4gd2hpY2ggY2FzZQorICogaXQgd2lsbCByZXR1cm4gZmFsc2UuCisgKgorICogV2FzIG9mdGVuIGRvbmUgbGlrZTogYXRvbWljX2FkZF91bmxlc3MoJnZhciwgLTEsIDEpCisgKgorICogUmV0dXJuOiB0cnVlIGlmIHRoZSBkZWNyZW1lbnQgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCByZWZjb3VudF9kZWNfbm90X29uZShyZWZjb3VudF90ICpyKQoreworCXVuc2lnbmVkIGludCBuZXcsIHZhbCA9IGF0b21pY19yZWFkKCZyLT5yZWZzKTsKKworCWRvIHsKKwkJaWYgKHVubGlrZWx5KHZhbCA9PSBVSU5UX01BWCkpCisJCQlyZXR1cm4gdHJ1ZTsKKworCQlpZiAodmFsID09IDEpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJbmV3ID0gdmFsIC0gMTsKKwkJaWYgKG5ldyA+IHZhbCkgeworCQkJV0FSTl9PTkNFKG5ldyA+IHZhbCwgInJlZmNvdW50X3Q6IHVuZGVyZmxvdzsgdXNlLWFmdGVyLWZyZWUuXG4iKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwl9IHdoaWxlICghYXRvbWljX3RyeV9jbXB4Y2hnX3JlbGVhc2UoJnItPnJlZnMsICZ2YWwsIG5ldykpOworCisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MKHJlZmNvdW50X2RlY19ub3Rfb25lKTsKKworLyoqCisgKiByZWZjb3VudF9kZWNfYW5kX211dGV4X2xvY2sgLSByZXR1cm4gaG9sZGluZyBtdXRleCBpZiBhYmxlIHRvIGRlY3JlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmY291bnQgdG8gMAorICogQHI6IHRoZSByZWZjb3VudAorICogQGxvY2s6IHRoZSBtdXRleCB0byBiZSBsb2NrZWQKKyAqCisgKiBTaW1pbGFyIHRvIGF0b21pY19kZWNfYW5kX211dGV4X2xvY2soKSwgaXQgd2lsbCBXQVJOIG9uIHVuZGVyZmxvdyBhbmQgZmFpbAorICogdG8gZGVjcmVtZW50IHdoZW4gc2F0dXJhdGVkIGF0IFVJTlRfTUFYLgorICoKKyAqIFByb3ZpZGVzIHJlbGVhc2UgbWVtb3J5IG9yZGVyaW5nLCBzdWNoIHRoYXQgcHJpb3IgbG9hZHMgYW5kIHN0b3JlcyBhcmUgZG9uZQorICogYmVmb3JlLCBhbmQgcHJvdmlkZXMgYSBjb250cm9sIGRlcGVuZGVuY3kgc3VjaCB0aGF0IGZyZWUoKSBtdXN0IGNvbWUgYWZ0ZXIuCisgKiBTZWUgdGhlIGNvbW1lbnQgb24gdG9wLgorICoKKyAqIFJldHVybjogdHJ1ZSBhbmQgaG9sZCBtdXRleCBpZiBhYmxlIHRvIGRlY3JlbWVudCByZWZjb3VudCB0byAwLCBmYWxzZQorICogICAgICAgICBvdGhlcndpc2UKKyAqLworYm9vbCByZWZjb3VudF9kZWNfYW5kX211dGV4X2xvY2socmVmY291bnRfdCAqciwgc3RydWN0IG11dGV4ICpsb2NrKQoreworCWlmIChyZWZjb3VudF9kZWNfbm90X29uZShyKSkKKwkJcmV0dXJuIGZhbHNlOworCisJbXV0ZXhfbG9jayhsb2NrKTsKKwlpZiAoIXJlZmNvdW50X2RlY19hbmRfdGVzdChyKSkgeworCQltdXRleF91bmxvY2sobG9jayk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0wocmVmY291bnRfZGVjX2FuZF9tdXRleF9sb2NrKTsKKworLyoqCisgKiByZWZjb3VudF9kZWNfYW5kX2xvY2sgLSByZXR1cm4gaG9sZGluZyBzcGlubG9jayBpZiBhYmxlIHRvIGRlY3JlbWVudAorICogICAgICAgICAgICAgICAgICAgICAgICAgcmVmY291bnQgdG8gMAorICogQHI6IHRoZSByZWZjb3VudAorICogQGxvY2s6IHRoZSBzcGlubG9jayB0byBiZSBsb2NrZWQKKyAqCisgKiBTaW1pbGFyIHRvIGF0b21pY19kZWNfYW5kX2xvY2soKSwgaXQgd2lsbCBXQVJOIG9uIHVuZGVyZmxvdyBhbmQgZmFpbCB0bworICogZGVjcmVtZW50IHdoZW4gc2F0dXJhdGVkIGF0IFVJTlRfTUFYLgorICoKKyAqIFByb3ZpZGVzIHJlbGVhc2UgbWVtb3J5IG9yZGVyaW5nLCBzdWNoIHRoYXQgcHJpb3IgbG9hZHMgYW5kIHN0b3JlcyBhcmUgZG9uZQorICogYmVmb3JlLCBhbmQgcHJvdmlkZXMgYSBjb250cm9sIGRlcGVuZGVuY3kgc3VjaCB0aGF0IGZyZWUoKSBtdXN0IGNvbWUgYWZ0ZXIuCisgKiBTZWUgdGhlIGNvbW1lbnQgb24gdG9wLgorICoKKyAqIFJldHVybjogdHJ1ZSBhbmQgaG9sZCBzcGlubG9jayBpZiBhYmxlIHRvIGRlY3JlbWVudCByZWZjb3VudCB0byAwLCBmYWxzZQorICogICAgICAgICBvdGhlcndpc2UKKyAqLworYm9vbCByZWZjb3VudF9kZWNfYW5kX2xvY2socmVmY291bnRfdCAqciwgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpZiAocmVmY291bnRfZGVjX25vdF9vbmUocikpCisJCXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9jayhsb2NrKTsKKwlpZiAoIXJlZmNvdW50X2RlY19hbmRfdGVzdChyKSkgeworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChyZWZjb3VudF9kZWNfYW5kX2xvY2spOworCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yaGFzaHRhYmxlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9yaGFzaHRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1NzdjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3JoYXNodGFibGUuYwpAQCAtMCwwICsxLDExNzAgQEAKKy8qCisgKiBSZXNpemFibGUsIFNjYWxhYmxlLCBDb25jdXJyZW50IEhhc2ggVGFibGUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUgVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxNCBQYXRyaWNrIE1jSGFyZHkgPGthYmVyQHRyYXNoLm5ldD4KKyAqCisgKiBDb2RlIHBhcnRpYWxseSBkZXJpdmVkIGZyb20gbmZ0X2hhc2gKKyAqIFJld3JpdHRlbiB3aXRoIHJlaGFzaCBjb2RlIGZyb20gYnJfbXVsdGljYXN0IHBsdXMgc2luZ2xlIGxpc3QKKyAqIHBvaW50ZXIgYXMgc3VnZ2VzdGVkIGJ5IEpvc2ggVHJpcGxldHQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3JoYXNodGFibGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKworI2RlZmluZSBIQVNIX0RFRkFVTFRfU0laRQk2NFVMCisjZGVmaW5lIEhBU0hfTUlOX1NJWkUJCTRVCisjZGVmaW5lIEJVQ0tFVF9MT0NLU19QRVJfQ1BVCTMyVUwKKwordW5pb24gbmVzdGVkX3RhYmxlIHsKKwl1bmlvbiBuZXN0ZWRfdGFibGUgX19yY3UgKnRhYmxlOworCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICpidWNrZXQ7Cit9OworCitzdGF0aWMgdTMyIGhlYWRfaGFzaGZuKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCByaGFzaF9oZWFkICpoZSkKK3sKKwlyZXR1cm4gcmh0X2hlYWRfaGFzaGZuKGh0LCB0YmwsIGhlLCBodC0+cCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORworI2RlZmluZSBBU1NFUlRfUkhUX01VVEVYKEhUKSBCVUdfT04oIWxvY2tkZXBfcmh0X211dGV4X2lzX2hlbGQoSFQpKQorCitpbnQgbG9ja2RlcF9yaHRfbXV0ZXhfaXNfaGVsZChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCit7CisJcmV0dXJuIChkZWJ1Z19sb2NrcykgPyBsb2NrZGVwX2lzX2hlbGQoJmh0LT5tdXRleCkgOiAxOworfQorRVhQT1JUX1NZTUJPTF9HUEwobG9ja2RlcF9yaHRfbXV0ZXhfaXNfaGVsZCk7CisKK2ludCBsb2NrZGVwX3JodF9idWNrZXRfaXNfaGVsZChjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsIHUzMiBoYXNoKQoreworCXNwaW5sb2NrX3QgKmxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKKworCXJldHVybiAoZGVidWdfbG9ja3MpID8gbG9ja2RlcF9pc19oZWxkKGxvY2spIDogMTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2tkZXBfcmh0X2J1Y2tldF9pc19oZWxkKTsKKyNlbHNlCisjZGVmaW5lIEFTU0VSVF9SSFRfTVVURVgoSFQpCisjZW5kaWYKKworCitzdGF0aWMgaW50IGFsbG9jX2J1Y2tldF9sb2NrcyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwkJCSAgICAgIGdmcF90IGdmcCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgc2l6ZTsKKyNpZiBkZWZpbmVkKENPTkZJR19QUk9WRV9MT0NLSU5HKQorCXVuc2lnbmVkIGludCBucl9wY3B1cyA9IDI7CisjZWxzZQorCXVuc2lnbmVkIGludCBucl9wY3B1cyA9IG51bV9wb3NzaWJsZV9jcHVzKCk7CisjZW5kaWYKKworCW5yX3BjcHVzID0gbWluX3QodW5zaWduZWQgaW50LCBucl9wY3B1cywgNjRVTCk7CisJc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhucl9wY3B1cyAqIGh0LT5wLmxvY2tzX211bCk7CisKKwkvKiBOZXZlciBhbGxvY2F0ZSBtb3JlIHRoYW4gMC41IGxvY2tzIHBlciBidWNrZXQgKi8KKwlzaXplID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplLCB0YmwtPnNpemUgPj4gMSk7CisKKwlpZiAodGJsLT5uZXN0KQorCQlzaXplID0gbWluKHNpemUsIDFVIDw8IHRibC0+bmVzdCk7CisKKwlpZiAoc2l6ZW9mKHNwaW5sb2NrX3QpICE9IDApIHsKKwkJaWYgKGdmcGZsYWdzX2FsbG93X2Jsb2NraW5nKGdmcCkpCisJCQl0YmwtPmxvY2tzID0ga3ZtYWxsb2Moc2l6ZSAqIHNpemVvZihzcGlubG9ja190KSwgZ2ZwKTsKKwkJZWxzZQorCQkJdGJsLT5sb2NrcyA9IGttYWxsb2NfYXJyYXkoc2l6ZSwgc2l6ZW9mKHNwaW5sb2NrX3QpLAorCQkJCQkJICAgZ2ZwKTsKKwkJaWYgKCF0YmwtPmxvY2tzKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCQlzcGluX2xvY2tfaW5pdCgmdGJsLT5sb2Nrc1tpXSk7CisJfQorCXRibC0+bG9ja3NfbWFzayA9IHNpemUgLSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG5lc3RlZF90YWJsZV9mcmVlKHVuaW9uIG5lc3RlZF90YWJsZSAqbnRibCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJY29uc3QgdW5zaWduZWQgaW50IHNoaWZ0ID0gUEFHRV9TSElGVCAtIGlsb2cyKHNpemVvZih2b2lkICopKTsKKwljb25zdCB1bnNpZ25lZCBpbnQgbGVuID0gMSA8PCBzaGlmdDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCW50YmwgPSByY3VfZGVyZWZlcmVuY2VfcmF3KG50YmwtPnRhYmxlKTsKKwlpZiAoIW50YmwpCisJCXJldHVybjsKKworCWlmIChzaXplID4gbGVuKSB7CisJCXNpemUgPj49IHNoaWZ0OworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQluZXN0ZWRfdGFibGVfZnJlZShudGJsICsgaSwgc2l6ZSk7CisJfQorCisJa2ZyZWUobnRibCk7Cit9CisKK3N0YXRpYyB2b2lkIG5lc3RlZF9idWNrZXRfdGFibGVfZnJlZShjb25zdCBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwpCit7CisJdW5zaWduZWQgaW50IHNpemUgPSB0YmwtPnNpemUgPj4gdGJsLT5uZXN0OworCXVuc2lnbmVkIGludCBsZW4gPSAxIDw8IHRibC0+bmVzdDsKKwl1bmlvbiBuZXN0ZWRfdGFibGUgKm50Ymw7CisJdW5zaWduZWQgaW50IGk7CisKKwludGJsID0gKHVuaW9uIG5lc3RlZF90YWJsZSAqKXJjdV9kZXJlZmVyZW5jZV9yYXcodGJsLT5idWNrZXRzWzBdKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJbmVzdGVkX3RhYmxlX2ZyZWUobnRibCArIGksIHNpemUpOworCisJa2ZyZWUobnRibCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1Y2tldF90YWJsZV9mcmVlKGNvbnN0IHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3sKKwlpZiAodGJsLT5uZXN0KQorCQluZXN0ZWRfYnVja2V0X3RhYmxlX2ZyZWUodGJsKTsKKworCWt2ZnJlZSh0YmwtPmxvY2tzKTsKKwlrdmZyZWUodGJsKTsKK30KKworc3RhdGljIHZvaWQgYnVja2V0X3RhYmxlX2ZyZWVfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlidWNrZXRfdGFibGVfZnJlZShjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGJ1Y2tldF90YWJsZSwgcmN1KSk7Cit9CisKK3N0YXRpYyB1bmlvbiBuZXN0ZWRfdGFibGUgKm5lc3RlZF90YWJsZV9hbGxvYyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCSAgICAgIHVuaW9uIG5lc3RlZF90YWJsZSBfX3JjdSAqKnByZXYsCisJCQkJCSAgICAgIHVuc2lnbmVkIGludCBzaGlmdGVkLAorCQkJCQkgICAgICB1bnNpZ25lZCBpbnQgbmhhc2gpCit7CisJdW5pb24gbmVzdGVkX3RhYmxlICpudGJsOworCWludCBpOworCisJbnRibCA9IHJjdV9kZXJlZmVyZW5jZSgqcHJldik7CisJaWYgKG50YmwpCisJCXJldHVybiBudGJsOworCisJbnRibCA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfQVRPTUlDKTsKKworCWlmIChudGJsICYmIHNoaWZ0ZWQpIHsKKwkJZm9yIChpID0gMDsgaSA8IFBBR0VfU0laRSAvIHNpemVvZihudGJsWzBdLmJ1Y2tldCk7IGkrKykKKwkJCUlOSVRfUkhUX05VTExTX0hFQUQobnRibFtpXS5idWNrZXQsIGh0LAorCQkJCQkgICAgKGkgPDwgc2hpZnRlZCkgfCBuaGFzaCk7CisJfQorCisJcmN1X2Fzc2lnbl9wb2ludGVyKCpwcmV2LCBudGJsKTsKKworCXJldHVybiBudGJsOworfQorCitzdGF0aWMgc3RydWN0IGJ1Y2tldF90YWJsZSAqbmVzdGVkX2J1Y2tldF90YWJsZV9hbGxvYyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCQkgICAgICBzaXplX3QgbmJ1Y2tldHMsCisJCQkJCQkgICAgICBnZnBfdCBnZnApCit7CisJY29uc3QgdW5zaWduZWQgaW50IHNoaWZ0ID0gUEFHRV9TSElGVCAtIGlsb2cyKHNpemVvZih2b2lkICopKTsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CisJc2l6ZV90IHNpemU7CisKKwlpZiAobmJ1Y2tldHMgPCAoMSA8PCAoc2hpZnQgKyAxKSkpCisJCXJldHVybiBOVUxMOworCisJc2l6ZSA9IHNpemVvZigqdGJsKSArIHNpemVvZih0YmwtPmJ1Y2tldHNbMF0pOworCisJdGJsID0ga3phbGxvYyhzaXplLCBnZnApOworCWlmICghdGJsKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghbmVzdGVkX3RhYmxlX2FsbG9jKGh0LCAodW5pb24gbmVzdGVkX3RhYmxlIF9fcmN1ICoqKXRibC0+YnVja2V0cywKKwkJCQkwLCAwKSkgeworCQlrZnJlZSh0YmwpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0YmwtPm5lc3QgPSAoaWxvZzIobmJ1Y2tldHMpIC0gMSkgJSBzaGlmdCArIDE7CisKKwlyZXR1cm4gdGJsOworfQorCitzdGF0aWMgc3RydWN0IGJ1Y2tldF90YWJsZSAqYnVja2V0X3RhYmxlX2FsbG9jKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkJICAgICAgIHNpemVfdCBuYnVja2V0cywKKwkJCQkJICAgICAgIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwgPSBOVUxMOworCXNpemVfdCBzaXplOworCWludCBpOworCisJc2l6ZSA9IHNpemVvZigqdGJsKSArIG5idWNrZXRzICogc2l6ZW9mKHRibC0+YnVja2V0c1swXSk7CisJaWYgKGdmcCAhPSBHRlBfS0VSTkVMKQorCQl0YmwgPSBremFsbG9jKHNpemUsIGdmcCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpOworCWVsc2UKKwkJdGJsID0ga3Z6YWxsb2Moc2l6ZSwgZ2ZwKTsKKworCXNpemUgPSBuYnVja2V0czsKKworCWlmICh0YmwgPT0gTlVMTCAmJiBnZnAgIT0gR0ZQX0tFUk5FTCkgeworCQl0YmwgPSBuZXN0ZWRfYnVja2V0X3RhYmxlX2FsbG9jKGh0LCBuYnVja2V0cywgZ2ZwKTsKKwkJbmJ1Y2tldHMgPSAwOworCX0KKwlpZiAodGJsID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdGJsLT5zaXplID0gc2l6ZTsKKworCWlmIChhbGxvY19idWNrZXRfbG9ja3MoaHQsIHRibCwgZ2ZwKSA8IDApIHsKKwkJYnVja2V0X3RhYmxlX2ZyZWUodGJsKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJSU5JVF9MSVNUX0hFQUQoJnRibC0+d2Fsa2Vycyk7CisKKwl0YmwtPmhhc2hfcm5kID0gZ2V0X3JhbmRvbV91MzIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBuYnVja2V0czsgaSsrKQorCQlJTklUX1JIVF9OVUxMU19IRUFEKHRibC0+YnVja2V0c1tpXSwgaHQsIGkpOworCisJcmV0dXJuIHRibDsKK30KKworc3RhdGljIHN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfbGFzdF90YWJsZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCQkgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCisJZG8geworCQluZXdfdGJsID0gdGJsOworCQl0YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KHRibC0+ZnV0dXJlX3RibCwgaHQpOworCX0gd2hpbGUgKHRibCk7CisKKwlyZXR1cm4gbmV3X3RibDsKK30KKworc3RhdGljIGludCByaGFzaHRhYmxlX3JlaGFzaF9vbmUoc3RydWN0IHJoYXNodGFibGUgKmh0LCB1bnNpZ25lZCBpbnQgb2xkX2hhc2gpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqbmV3X3RibCA9IHJoYXNodGFibGVfbGFzdF90YWJsZShodCwKKwkJcmh0X2RlcmVmZXJlbmNlX3JjdShvbGRfdGJsLT5mdXR1cmVfdGJsLCBodCkpOworCXN0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICoqcHByZXYgPSByaHRfYnVja2V0X3ZhcihvbGRfdGJsLCBvbGRfaGFzaCk7CisJaW50IGVyciA9IC1FQUdBSU47CisJc3RydWN0IHJoYXNoX2hlYWQgKmhlYWQsICpuZXh0LCAqZW50cnk7CisJc3BpbmxvY2tfdCAqbmV3X2J1Y2tldF9sb2NrOworCXVuc2lnbmVkIGludCBuZXdfaGFzaDsKKworCWlmIChuZXdfdGJsLT5uZXN0KQorCQlnb3RvIG91dDsKKworCWVyciA9IC1FTk9FTlQ7CisKKwlyaHRfZm9yX2VhY2goZW50cnksIG9sZF90YmwsIG9sZF9oYXNoKSB7CisJCWVyciA9IDA7CisJCW5leHQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGVudHJ5LT5uZXh0LCBvbGRfdGJsLCBvbGRfaGFzaCk7CisKKwkJaWYgKHJodF9pc19hX251bGxzKG5leHQpKQorCQkJYnJlYWs7CisKKwkJcHByZXYgPSAmZW50cnktPm5leHQ7CisJfQorCisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwluZXdfaGFzaCA9IGhlYWRfaGFzaGZuKGh0LCBuZXdfdGJsLCBlbnRyeSk7CisKKwluZXdfYnVja2V0X2xvY2sgPSByaHRfYnVja2V0X2xvY2sobmV3X3RibCwgbmV3X2hhc2gpOworCisJc3Bpbl9sb2NrX25lc3RlZChuZXdfYnVja2V0X2xvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwloZWFkID0gcmh0X2RlcmVmZXJlbmNlX2J1Y2tldChuZXdfdGJsLT5idWNrZXRzW25ld19oYXNoXSwKKwkJCQkgICAgICBuZXdfdGJsLCBuZXdfaGFzaCk7CisKKwlSQ1VfSU5JVF9QT0lOVEVSKGVudHJ5LT5uZXh0LCBoZWFkKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihuZXdfdGJsLT5idWNrZXRzW25ld19oYXNoXSwgZW50cnkpOworCXNwaW5fdW5sb2NrKG5ld19idWNrZXRfbG9jayk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoKnBwcmV2LCBuZXh0KTsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmhhc2h0YWJsZV9yZWhhc2hfY2hhaW4oc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgb2xkX2hhc2gpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7CisJc3BpbmxvY2tfdCAqb2xkX2J1Y2tldF9sb2NrOworCWludCBlcnI7CisKKwlvbGRfYnVja2V0X2xvY2sgPSByaHRfYnVja2V0X2xvY2sob2xkX3RibCwgb2xkX2hhc2gpOworCisJc3Bpbl9sb2NrX2JoKG9sZF9idWNrZXRfbG9jayk7CisJd2hpbGUgKCEoZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfb25lKGh0LCBvbGRfaGFzaCkpKQorCQk7CisKKwlpZiAoZXJyID09IC1FTk9FTlQpIHsKKwkJb2xkX3RibC0+cmVoYXNoKys7CisJCWVyciA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2JoKG9sZF9idWNrZXRfbG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHJoYXNodGFibGVfcmVoYXNoX2F0dGFjaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKm9sZF90YmwsCisJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190YmwpCit7CisJLyogUHJvdGVjdCBmdXR1cmVfdGJsIHVzaW5nIHRoZSBmaXJzdCBidWNrZXQgbG9jay4gKi8KKwlzcGluX2xvY2tfYmgob2xkX3RibC0+bG9ja3MpOworCisJLyogRGlkIHNvbWVib2R5IGJlYXQgdXMgdG8gaXQ/ICovCisJaWYgKHJjdV9hY2Nlc3NfcG9pbnRlcihvbGRfdGJsLT5mdXR1cmVfdGJsKSkgeworCQlzcGluX3VubG9ja19iaChvbGRfdGJsLT5sb2Nrcyk7CisJCXJldHVybiAtRUVYSVNUOworCX0KKworCS8qIE1ha2UgaW5zZXJ0aW9ucyBnbyBpbnRvIHRoZSBuZXcsIGVtcHR5IHRhYmxlIHJpZ2h0IGF3YXkuIERlbGV0aW9ucworCSAqIGFuZCBsb29rdXBzIHdpbGwgYmUgYXR0ZW1wdGVkIGluIGJvdGggdGFibGVzIHVudGlsIHdlIHN5bmNocm9uaXplLgorCSAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihvbGRfdGJsLT5mdXR1cmVfdGJsLCBuZXdfdGJsKTsKKworCXNwaW5fdW5sb2NrX2JoKG9sZF90YmwtPmxvY2tzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJoYXNodGFibGVfcmVoYXNoX3RhYmxlKHN0cnVjdCByaGFzaHRhYmxlICpodCkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlKGh0LT50YmwsIGh0KTsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCXN0cnVjdCByaGFzaHRhYmxlX3dhbGtlciAqd2Fsa2VyOworCXVuc2lnbmVkIGludCBvbGRfaGFzaDsKKwlpbnQgZXJyOworCisJbmV3X3RibCA9IHJodF9kZXJlZmVyZW5jZShvbGRfdGJsLT5mdXR1cmVfdGJsLCBodCk7CisJaWYgKCFuZXdfdGJsKQorCQlyZXR1cm4gMDsKKworCWZvciAob2xkX2hhc2ggPSAwOyBvbGRfaGFzaCA8IG9sZF90YmwtPnNpemU7IG9sZF9oYXNoKyspIHsKKwkJZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfY2hhaW4oaHQsIG9sZF9oYXNoKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWNvbmRfcmVzY2hlZCgpOworCX0KKworCS8qIFB1Ymxpc2ggdGhlIG5ldyB0YWJsZSBwb2ludGVyLiAqLworCXJjdV9hc3NpZ25fcG9pbnRlcihodC0+dGJsLCBuZXdfdGJsKTsKKworCXNwaW5fbG9jaygmaHQtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkod2Fsa2VyLCAmb2xkX3RibC0+d2Fsa2VycywgbGlzdCkKKwkJd2Fsa2VyLT50YmwgPSBOVUxMOworCXNwaW5fdW5sb2NrKCZodC0+bG9jayk7CisKKwkvKiBXYWl0IGZvciByZWFkZXJzLiBBbGwgbmV3IHJlYWRlcnMgd2lsbCBzZWUgdGhlIG5ldworCSAqIHRhYmxlLCBhbmQgdGh1cyBubyByZWZlcmVuY2VzIHRvIHRoZSBvbGQgdGFibGUgd2lsbAorCSAqIHJlbWFpbi4KKwkgKi8KKwljYWxsX3JjdSgmb2xkX3RibC0+cmN1LCBidWNrZXRfdGFibGVfZnJlZV9yY3UpOworCisJcmV0dXJuIHJodF9kZXJlZmVyZW5jZShuZXdfdGJsLT5mdXR1cmVfdGJsLCBodCkgPyAtRUFHQUlOIDogMDsKK30KKworc3RhdGljIGludCByaGFzaHRhYmxlX3JlaGFzaF9hbGxvYyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqb2xkX3RibCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCWludCBlcnI7CisKKwlBU1NFUlRfUkhUX01VVEVYKGh0KTsKKworCW5ld190YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIHNpemUsIEdGUF9LRVJORUwpOworCWlmIChuZXdfdGJsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfYXR0YWNoKGh0LCBvbGRfdGJsLCBuZXdfdGJsKTsKKwlpZiAoZXJyKQorCQlidWNrZXRfdGFibGVfZnJlZShuZXdfdGJsKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogcmhhc2h0YWJsZV9zaHJpbmsgLSBTaHJpbmsgaGFzaCB0YWJsZSB3aGlsZSBhbGxvd2luZyBjb25jdXJyZW50IGxvb2t1cHMKKyAqIEBodDoJCXRoZSBoYXNoIHRhYmxlIHRvIHNocmluaworICoKKyAqIFRoaXMgZnVuY3Rpb24gc2hyaW5rcyB0aGUgaGFzaCB0YWJsZSB0byBmaXQsIGkuZS4sIHRoZSBzbWFsbGVzdAorICogc2l6ZSB3b3VsZCBub3QgY2F1c2UgaXQgdG8gZXhwYW5kIHJpZ2h0IGF3YXkgYXV0b21hdGljYWxseS4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgbm8gY29uY3VycmVudCByZXNpemluZyBvY2N1cnMgYnkgaG9sZGluZworICogaHQtPm11dGV4LgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBubyBjb25jdXJyZW50IHRhYmxlIG11dGF0aW9ucyB0YWtlIHBsYWNlLgorICogSXQgaXMgaG93ZXZlciB2YWxpZCB0byBoYXZlIGNvbmN1cnJlbnQgbG9va3VwcyBpZiB0aGV5IGFyZSBSQ1UgcHJvdGVjdGVkLgorICoKKyAqIEl0IGlzIHZhbGlkIHRvIGhhdmUgY29uY3VycmVudCBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMgcHJvdGVjdGVkIGJ5IHBlcgorICogYnVja2V0IGxvY2tzIG9yIGNvbmN1cnJlbnQgUkNVIHByb3RlY3RlZCBsb29rdXBzIGFuZCB0cmF2ZXJzYWxzLgorICovCitzdGF0aWMgaW50IHJoYXNodGFibGVfc2hyaW5rKHN0cnVjdCByaGFzaHRhYmxlICpodCkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsID0gcmh0X2RlcmVmZXJlbmNlKGh0LT50YmwsIGh0KTsKKwl1bnNpZ25lZCBpbnQgbmVsZW1zID0gYXRvbWljX3JlYWQoJmh0LT5uZWxlbXMpOworCXVuc2lnbmVkIGludCBzaXplID0gMDsKKworCWlmIChuZWxlbXMpCisJCXNpemUgPSByb3VuZHVwX3Bvd19vZl90d28obmVsZW1zICogMyAvIDIpOworCWlmIChzaXplIDwgaHQtPnAubWluX3NpemUpCisJCXNpemUgPSBodC0+cC5taW5fc2l6ZTsKKworCWlmIChvbGRfdGJsLT5zaXplIDw9IHNpemUpCisJCXJldHVybiAwOworCisJaWYgKHJodF9kZXJlZmVyZW5jZShvbGRfdGJsLT5mdXR1cmVfdGJsLCBodCkpCisJCXJldHVybiAtRUVYSVNUOworCisJcmV0dXJuIHJoYXNodGFibGVfcmVoYXNoX2FsbG9jKGh0LCBvbGRfdGJsLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgcmh0X2RlZmVycmVkX3dvcmtlcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJoYXNodGFibGUgKmh0OworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibDsKKwlpbnQgZXJyID0gMDsKKworCWh0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCByaGFzaHRhYmxlLCBydW5fd29yayk7CisJbXV0ZXhfbG9jaygmaHQtPm11dGV4KTsKKworCXRibCA9IHJodF9kZXJlZmVyZW5jZShodC0+dGJsLCBodCk7CisJdGJsID0gcmhhc2h0YWJsZV9sYXN0X3RhYmxlKGh0LCB0YmwpOworCisJaWYgKHJodF9ncm93X2Fib3ZlXzc1KGh0LCB0YmwpKQorCQllcnIgPSByaGFzaHRhYmxlX3JlaGFzaF9hbGxvYyhodCwgdGJsLCB0YmwtPnNpemUgKiAyKTsKKwllbHNlIGlmIChodC0+cC5hdXRvbWF0aWNfc2hyaW5raW5nICYmIHJodF9zaHJpbmtfYmVsb3dfMzAoaHQsIHRibCkpCisJCWVyciA9IHJoYXNodGFibGVfc2hyaW5rKGh0KTsKKwllbHNlIGlmICh0YmwtPm5lc3QpCisJCWVyciA9IHJoYXNodGFibGVfcmVoYXNoX2FsbG9jKGh0LCB0YmwsIHRibC0+c2l6ZSk7CisKKwlpZiAoIWVyciB8fCBlcnIgPT0gLUVFWElTVCkgeworCQlpbnQgbmVycjsKKworCQluZXJyID0gcmhhc2h0YWJsZV9yZWhhc2hfdGFibGUoaHQpOworCQllcnIgPSBlcnIgPzogbmVycjsKKwl9CisKKwltdXRleF91bmxvY2soJmh0LT5tdXRleCk7CisKKwlpZiAoZXJyKQorCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOworfQorCitzdGF0aWMgaW50IHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJICAgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCkKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpvbGRfdGJsOworCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190Ymw7CisJdW5zaWduZWQgaW50IHNpemU7CisJaW50IGVycjsKKworCW9sZF90YmwgPSByaHRfZGVyZWZlcmVuY2VfcmN1KGh0LT50YmwsIGh0KTsKKworCXNpemUgPSB0YmwtPnNpemU7CisKKwllcnIgPSAtRUJVU1k7CisKKwlpZiAocmh0X2dyb3dfYWJvdmVfNzUoaHQsIHRibCkpCisJCXNpemUgKj0gMjsKKwkvKiBEbyBub3Qgc2NoZWR1bGUgbW9yZSB0aGFuIG9uZSByZWhhc2ggKi8KKwllbHNlIGlmIChvbGRfdGJsICE9IHRibCkKKwkJZ290byBmYWlsOworCisJZXJyID0gLUVOT01FTTsKKworCW5ld190YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIHNpemUsIEdGUF9BVE9NSUMpOworCWlmIChuZXdfdGJsID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCWVyciA9IHJoYXNodGFibGVfcmVoYXNoX2F0dGFjaChodCwgdGJsLCBuZXdfdGJsKTsKKwlpZiAoZXJyKSB7CisJCWJ1Y2tldF90YWJsZV9mcmVlKG5ld190YmwpOworCQlpZiAoZXJyID09IC1FRVhJU1QpCisJCQllcnIgPSAwOworCX0gZWxzZQorCQlzY2hlZHVsZV93b3JrKCZodC0+cnVuX3dvcmspOworCisJcmV0dXJuIGVycjsKKworZmFpbDoKKwkvKiBEbyBub3QgZmFpbCB0aGUgaW5zZXJ0IGlmIHNvbWVvbmUgZWxzZSBkaWQgYSByZWhhc2guICovCisJaWYgKGxpa2VseShyY3VfZGVyZWZlcmVuY2VfcmF3KHRibC0+ZnV0dXJlX3RibCkpKQorCQlyZXR1cm4gMDsKKworCS8qIFNjaGVkdWxlIGFzeW5jIHJlaGFzaCB0byByZXRyeSBhbGxvY2F0aW9uIGluIHByb2Nlc3MgY29udGV4dC4gKi8KKwlpZiAoZXJyID09IC1FTk9NRU0pCisJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCAqcmhhc2h0YWJsZV9sb29rdXBfb25lKHN0cnVjdCByaGFzaHRhYmxlICpodCwKKwkJCQkgICBzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwsIHVuc2lnbmVkIGludCBoYXNoLAorCQkJCSAgIGNvbnN0IHZvaWQgKmtleSwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaikKK3sKKwlzdHJ1Y3Qgcmhhc2h0YWJsZV9jb21wYXJlX2FyZyBhcmcgPSB7CisJCS5odCA9IGh0LAorCQkua2V5ID0ga2V5LAorCX07CisJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldjsKKwlzdHJ1Y3Qgcmhhc2hfaGVhZCAqaGVhZDsKKwlpbnQgZWxhc3RpY2l0eTsKKworCWVsYXN0aWNpdHkgPSBSSFRfRUxBU1RJQ0lUWTsKKwlwcHJldiA9IHJodF9idWNrZXRfdmFyKHRibCwgaGFzaCk7CisJcmh0X2Zvcl9lYWNoX2NvbnRpbnVlKGhlYWQsICpwcHJldiwgdGJsLCBoYXNoKSB7CisJCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdDsKKwkJc3RydWN0IHJobGlzdF9oZWFkICpwbGlzdDsKKworCQllbGFzdGljaXR5LS07CisJCWlmICgha2V5IHx8CisJCSAgICAoaHQtPnAub2JqX2NtcGZuID8KKwkJICAgICBodC0+cC5vYmpfY21wZm4oJmFyZywgcmh0X29iaihodCwgaGVhZCkpIDoKKwkJICAgICByaGFzaHRhYmxlX2NvbXBhcmUoJmFyZywgcmh0X29iaihodCwgaGVhZCkpKSkgeworCQkJcHByZXYgPSAmaGVhZC0+bmV4dDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFodC0+cmhsaXN0KQorCQkJcmV0dXJuIHJodF9vYmooaHQsIGhlYWQpOworCisJCWxpc3QgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgcmhsaXN0X2hlYWQsIHJoZWFkKTsKKwkJcGxpc3QgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHJobGlzdF9oZWFkLCByaGVhZCk7CisKKwkJUkNVX0lOSVRfUE9JTlRFUihsaXN0LT5uZXh0LCBwbGlzdCk7CisJCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KGhlYWQtPm5leHQsIHRibCwgaGFzaCk7CisJCVJDVV9JTklUX1BPSU5URVIobGlzdC0+cmhlYWQubmV4dCwgaGVhZCk7CisJCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iaik7CisKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGVsYXN0aWNpdHkgPD0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisKKwlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKK30KKworc3RhdGljIHN0cnVjdCBidWNrZXRfdGFibGUgKnJoYXNodGFibGVfaW5zZXJ0X29uZShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJCQkgIHN0cnVjdCBidWNrZXRfdGFibGUgKnRibCwKKwkJCQkJCSAgdW5zaWduZWQgaW50IGhhc2gsCisJCQkJCQkgIHN0cnVjdCByaGFzaF9oZWFkICpvYmosCisJCQkJCQkgIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipwcHJldjsKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICpuZXdfdGJsOworCXN0cnVjdCByaGFzaF9oZWFkICpoZWFkOworCisJaWYgKCFJU19FUlJfT1JfTlVMTChkYXRhKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVFWElTVCk7CisKKwlpZiAoUFRSX0VSUihkYXRhKSAhPSAtRUFHQUlOICYmIFBUUl9FUlIoZGF0YSkgIT0gLUVOT0VOVCkKKwkJcmV0dXJuIEVSUl9DQVNUKGRhdGEpOworCisJbmV3X3RibCA9IHJjdV9kZXJlZmVyZW5jZSh0YmwtPmZ1dHVyZV90YmwpOworCWlmIChuZXdfdGJsKQorCQlyZXR1cm4gbmV3X3RibDsKKworCWlmIChQVFJfRVJSKGRhdGEpICE9IC1FTk9FTlQpCisJCXJldHVybiBFUlJfQ0FTVChkYXRhKTsKKworCWlmICh1bmxpa2VseShyaHRfZ3Jvd19hYm92ZV9tYXgoaHQsIHRibCkpKQorCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCisJaWYgKHVubGlrZWx5KHJodF9ncm93X2Fib3ZlXzEwMChodCwgdGJsKSkpCisJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCisJcHByZXYgPSByaHRfYnVja2V0X2luc2VydChodCwgdGJsLCBoYXNoKTsKKwlpZiAoIXBwcmV2KQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWhlYWQgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0KCpwcHJldiwgdGJsLCBoYXNoKTsKKworCVJDVV9JTklUX1BPSU5URVIob2JqLT5uZXh0LCBoZWFkKTsKKwlpZiAoaHQtPnJobGlzdCkgeworCQlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisKKwkJbGlzdCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGxpc3QtPm5leHQsIE5VTEwpOworCX0KKworCXJjdV9hc3NpZ25fcG9pbnRlcigqcHByZXYsIG9iaik7CisKKwlhdG9taWNfaW5jKCZodC0+bmVsZW1zKTsKKwlpZiAocmh0X2dyb3dfYWJvdmVfNzUoaHQsIHRibCkpCisJCXNjaGVkdWxlX3dvcmsoJmh0LT5ydW5fd29yayk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKnJoYXNodGFibGVfdHJ5X2luc2VydChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsIGNvbnN0IHZvaWQgKmtleSwKKwkJCQkgICBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqKQoreworCXN0cnVjdCBidWNrZXRfdGFibGUgKm5ld190Ymw7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCXVuc2lnbmVkIGludCBoYXNoOworCXNwaW5sb2NrX3QgKmxvY2s7CisJdm9pZCAqZGF0YTsKKworCXRibCA9IHJjdV9kZXJlZmVyZW5jZShodC0+dGJsKTsKKworCS8qIEFsbCBpbnNlcnRpb25zIG11c3QgZ3JhYiB0aGUgb2xkZXN0IHRhYmxlIGNvbnRhaW5pbmcKKwkgKiB0aGUgaGFzaGVkIGJ1Y2tldCB0aGF0IGlzIHlldCB0byBiZSByZWhhc2hlZC4KKwkgKi8KKwlmb3IgKDs7KSB7CisJCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBodC0+cCk7CisJCWxvY2sgPSByaHRfYnVja2V0X2xvY2sodGJsLCBoYXNoKTsKKwkJc3Bpbl9sb2NrX2JoKGxvY2spOworCisJCWlmICh0YmwtPnJlaGFzaCA8PSBoYXNoKQorCQkJYnJlYWs7CisKKwkJc3Bpbl91bmxvY2tfYmgobG9jayk7CisJCXRibCA9IHJjdV9kZXJlZmVyZW5jZSh0YmwtPmZ1dHVyZV90YmwpOworCX0KKworCWRhdGEgPSByaGFzaHRhYmxlX2xvb2t1cF9vbmUoaHQsIHRibCwgaGFzaCwga2V5LCBvYmopOworCW5ld190YmwgPSByaGFzaHRhYmxlX2luc2VydF9vbmUoaHQsIHRibCwgaGFzaCwgb2JqLCBkYXRhKTsKKwlpZiAoUFRSX0VSUihuZXdfdGJsKSAhPSAtRUVYSVNUKQorCQlkYXRhID0gRVJSX0NBU1QobmV3X3RibCk7CisKKwl3aGlsZSAoIUlTX0VSUl9PUl9OVUxMKG5ld190YmwpKSB7CisJCXRibCA9IG5ld190Ymw7CisJCWhhc2ggPSByaHRfaGVhZF9oYXNoZm4oaHQsIHRibCwgb2JqLCBodC0+cCk7CisJCXNwaW5fbG9ja19uZXN0ZWQocmh0X2J1Y2tldF9sb2NrKHRibCwgaGFzaCksCisJCQkJIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCQlkYXRhID0gcmhhc2h0YWJsZV9sb29rdXBfb25lKGh0LCB0YmwsIGhhc2gsIGtleSwgb2JqKTsKKwkJbmV3X3RibCA9IHJoYXNodGFibGVfaW5zZXJ0X29uZShodCwgdGJsLCBoYXNoLCBvYmosIGRhdGEpOworCQlpZiAoUFRSX0VSUihuZXdfdGJsKSAhPSAtRUVYSVNUKQorCQkJZGF0YSA9IEVSUl9DQVNUKG5ld190YmwpOworCisJCXNwaW5fdW5sb2NrKHJodF9idWNrZXRfbG9jayh0YmwsIGhhc2gpKTsKKwl9CisKKwlzcGluX3VubG9ja19iaChsb2NrKTsKKworCWlmIChQVFJfRVJSKGRhdGEpID09IC1FQUdBSU4pCisJCWRhdGEgPSBFUlJfUFRSKHJoYXNodGFibGVfaW5zZXJ0X3JlaGFzaChodCwgdGJsKSA/OgorCQkJICAgICAgIC1FQUdBSU4pOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3ZvaWQgKnJoYXNodGFibGVfaW5zZXJ0X3Nsb3coc3RydWN0IHJoYXNodGFibGUgKmh0LCBjb25zdCB2b2lkICprZXksCisJCQkgICAgIHN0cnVjdCByaGFzaF9oZWFkICpvYmopCit7CisJdm9pZCAqZGF0YTsKKworCWRvIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlkYXRhID0gcmhhc2h0YWJsZV90cnlfaW5zZXJ0KGh0LCBrZXksIG9iaik7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0gd2hpbGUgKFBUUl9FUlIoZGF0YSkgPT0gLUVBR0FJTik7CisKKwlyZXR1cm4gZGF0YTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfaW5zZXJ0X3Nsb3cpOworCisvKioKKyAqIHJoYXNodGFibGVfd2Fsa19lbnRlciAtIEluaXRpYWxpc2UgYW4gaXRlcmF0b3IKKyAqIEBodDoJCVRhYmxlIHRvIHdhbGsgb3ZlcgorICogQGl0ZXI6CUhhc2ggdGFibGUgSXRlcmF0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByZXBhcmVzIGEgaGFzaCB0YWJsZSB3YWxrLgorICoKKyAqIE5vdGUgdGhhdCBpZiB5b3UgcmVzdGFydCBhIHdhbGsgYWZ0ZXIgcmhhc2h0YWJsZV93YWxrX3N0b3AgeW91CisgKiBtYXkgc2VlIHRoZSBzYW1lIG9iamVjdCB0d2ljZS4gIEFsc28sIHlvdSBtYXkgbWlzcyBvYmplY3RzIGlmCisgKiB0aGVyZSBhcmUgcmVtb3ZhbHMgaW4gYmV0d2VlbiByaGFzaHRhYmxlX3dhbGtfc3RvcCBhbmQgdGhlIG5leHQKKyAqIGNhbGwgdG8gcmhhc2h0YWJsZV93YWxrX3N0YXJ0LgorICoKKyAqIEZvciBhIGNvbXBsZXRlbHkgc3RhYmxlIHdhbGsgeW91IHNob3VsZCBjb25zdHJ1Y3QgeW91ciBvd24gZGF0YQorICogc3RydWN0dXJlIG91dHNpZGUgdGhlIGhhc2ggdGFibGUuCisgKgorICogVGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgc28geW91IG11c3Qgbm90IGNhbGwgaXQgZnJvbSBpbnRlcnJ1cHQKKyAqIGNvbnRleHQgb3Igd2l0aCBzcGluIGxvY2tzIGhlbGQuCisgKgorICogWW91IG11c3QgY2FsbCByaGFzaHRhYmxlX3dhbGtfZXhpdCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCisgKi8KK3ZvaWQgcmhhc2h0YWJsZV93YWxrX2VudGVyKHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikKK3sKKwlpdGVyLT5odCA9IGh0OworCWl0ZXItPnAgPSBOVUxMOworCWl0ZXItPnNsb3QgPSAwOworCWl0ZXItPnNraXAgPSAwOworCisJc3Bpbl9sb2NrKCZodC0+bG9jayk7CisJaXRlci0+d2Fsa2VyLnRibCA9CisJCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoaHQtPnRibCwgbG9ja2RlcF9pc19oZWxkKCZodC0+bG9jaykpOworCWxpc3RfYWRkKCZpdGVyLT53YWxrZXIubGlzdCwgJml0ZXItPndhbGtlci50YmwtPndhbGtlcnMpOworCXNwaW5fdW5sb2NrKCZodC0+bG9jayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfZW50ZXIpOworCisvKioKKyAqIHJoYXNodGFibGVfd2Fsa19leGl0IC0gRnJlZSBhbiBpdGVyYXRvcgorICogQGl0ZXI6CUhhc2ggdGFibGUgSXRlcmF0b3IKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZyZWVzIHJlc291cmNlcyBhbGxvY2F0ZWQgYnkgcmhhc2h0YWJsZV93YWxrX2luaXQuCisgKi8KK3ZvaWQgcmhhc2h0YWJsZV93YWxrX2V4aXQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikKK3sKKwlzcGluX2xvY2soJml0ZXItPmh0LT5sb2NrKTsKKwlpZiAoaXRlci0+d2Fsa2VyLnRibCkKKwkJbGlzdF9kZWwoJml0ZXItPndhbGtlci5saXN0KTsKKwlzcGluX3VubG9jaygmaXRlci0+aHQtPmxvY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV93YWxrX2V4aXQpOworCisvKioKKyAqIHJoYXNodGFibGVfd2Fsa19zdGFydCAtIFN0YXJ0IGEgaGFzaCB0YWJsZSB3YWxrCisgKiBAaXRlcjoJSGFzaCB0YWJsZSBpdGVyYXRvcgorICoKKyAqIFN0YXJ0IGEgaGFzaCB0YWJsZSB3YWxrIGF0IHRoZSBjdXJyZW50IGl0ZXJhdG9yIHBvc2l0aW9uLiAgTm90ZSB0aGF0IHdlIHRha2UKKyAqIHRoZSBSQ1UgbG9jayBpbiBhbGwgY2FzZXMgaW5jbHVkaW5nIHdoZW4gd2UgcmV0dXJuIGFuIGVycm9yLiAgU28geW91IG11c3QKKyAqIGFsd2F5cyBjYWxsIHJoYXNodGFibGVfd2Fsa19zdG9wIHRvIGNsZWFuIHVwLgorICoKKyAqIFJldHVybnMgemVybyBpZiBzdWNjZXNzZnVsLgorICoKKyAqIFJldHVybnMgLUVBR0FJTiBpZiByZXNpemUgZXZlbnQgb2NjdXJlZC4gIE5vdGUgdGhhdCB0aGUgaXRlcmF0b3IKKyAqIHdpbGwgcmV3aW5kIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBhbmQgeW91IG1heSB1c2UgaXQgaW1tZWRpYXRlbHkKKyAqIGJ5IGNhbGxpbmcgcmhhc2h0YWJsZV93YWxrX25leHQuCisgKi8KK2ludCByaGFzaHRhYmxlX3dhbGtfc3RhcnQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikKKwlfX2FjcXVpcmVzKFJDVSkKK3sKKwlzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQgPSBpdGVyLT5odDsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCXNwaW5fbG9jaygmaHQtPmxvY2spOworCWlmIChpdGVyLT53YWxrZXIudGJsKQorCQlsaXN0X2RlbCgmaXRlci0+d2Fsa2VyLmxpc3QpOworCXNwaW5fdW5sb2NrKCZodC0+bG9jayk7CisKKwlpZiAoIWl0ZXItPndhbGtlci50YmwpIHsKKwkJaXRlci0+d2Fsa2VyLnRibCA9IHJodF9kZXJlZmVyZW5jZV9yY3UoaHQtPnRibCwgaHQpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfd2Fsa19zdGFydCk7CisKKy8qKgorICogcmhhc2h0YWJsZV93YWxrX25leHQgLSBSZXR1cm4gdGhlIG5leHQgb2JqZWN0IGFuZCBhZHZhbmNlIHRoZSBpdGVyYXRvcgorICogQGl0ZXI6CUhhc2ggdGFibGUgaXRlcmF0b3IKKyAqCisgKiBOb3RlIHRoYXQgeW91IG11c3QgY2FsbCByaGFzaHRhYmxlX3dhbGtfc3RvcCB3aGVuIHlvdSBhcmUgZmluaXNoZWQKKyAqIHdpdGggdGhlIHdhbGsuCisgKgorICogUmV0dXJucyB0aGUgbmV4dCBvYmplY3Qgb3IgTlVMTCB3aGVuIHRoZSBlbmQgb2YgdGhlIHRhYmxlIGlzIHJlYWNoZWQuCisgKgorICogUmV0dXJucyAtRUFHQUlOIGlmIHJlc2l6ZSBldmVudCBvY2N1cmVkLiAgTm90ZSB0aGF0IHRoZSBpdGVyYXRvcgorICogd2lsbCByZXdpbmQgYmFjayB0byB0aGUgYmVnaW5uaW5nIGFuZCB5b3UgbWF5IGNvbnRpbnVlIHRvIHVzZSBpdC4KKyAqLwordm9pZCAqcmhhc2h0YWJsZV93YWxrX25leHQoc3RydWN0IHJoYXNodGFibGVfaXRlciAqaXRlcikKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0YmwgPSBpdGVyLT53YWxrZXIudGJsOworCXN0cnVjdCByaGxpc3RfaGVhZCAqbGlzdCA9IGl0ZXItPmxpc3Q7CisJc3RydWN0IHJoYXNodGFibGUgKmh0ID0gaXRlci0+aHQ7CisJc3RydWN0IHJoYXNoX2hlYWQgKnAgPSBpdGVyLT5wOworCWJvb2wgcmhsaXN0ID0gaHQtPnJobGlzdDsKKworCWlmIChwKSB7CisJCWlmICghcmhsaXN0IHx8ICEobGlzdCA9IHJjdV9kZXJlZmVyZW5jZShsaXN0LT5uZXh0KSkpIHsKKwkJCXAgPSByY3VfZGVyZWZlcmVuY2UocC0+bmV4dCk7CisJCQlsaXN0ID0gY29udGFpbmVyX29mKHAsIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCQl9CisJCWdvdG8gbmV4dDsKKwl9CisKKwlmb3IgKDsgaXRlci0+c2xvdCA8IHRibC0+c2l6ZTsgaXRlci0+c2xvdCsrKSB7CisJCWludCBza2lwID0gaXRlci0+c2tpcDsKKworCQlyaHRfZm9yX2VhY2hfcmN1KHAsIHRibCwgaXRlci0+c2xvdCkgeworCQkJaWYgKHJobGlzdCkgeworCQkJCWxpc3QgPSBjb250YWluZXJfb2YocCwgc3RydWN0IHJobGlzdF9oZWFkLAorCQkJCQkJICAgIHJoZWFkKTsKKwkJCQlkbyB7CisJCQkJCWlmICghc2tpcCkKKwkJCQkJCWdvdG8gbmV4dDsKKwkJCQkJc2tpcC0tOworCQkJCQlsaXN0ID0gcmN1X2RlcmVmZXJlbmNlKGxpc3QtPm5leHQpOworCQkJCX0gd2hpbGUgKGxpc3QpOworCisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIXNraXApCisJCQkJYnJlYWs7CisJCQlza2lwLS07CisJCX0KKworbmV4dDoKKwkJaWYgKCFyaHRfaXNfYV9udWxscyhwKSkgeworCQkJaXRlci0+c2tpcCsrOworCQkJaXRlci0+cCA9IHA7CisJCQlpdGVyLT5saXN0ID0gbGlzdDsKKwkJCXJldHVybiByaHRfb2JqKGh0LCByaGxpc3QgPyAmbGlzdC0+cmhlYWQgOiBwKTsKKwkJfQorCisJCWl0ZXItPnNraXAgPSAwOworCX0KKworCWl0ZXItPnAgPSBOVUxMOworCisJLyogRW5zdXJlIHdlIHNlZSBhbnkgbmV3IHRhYmxlcy4gKi8KKwlzbXBfcm1iKCk7CisKKwlpdGVyLT53YWxrZXIudGJsID0gcmh0X2RlcmVmZXJlbmNlX3JjdSh0YmwtPmZ1dHVyZV90YmwsIGh0KTsKKwlpZiAoaXRlci0+d2Fsa2VyLnRibCkgeworCQlpdGVyLT5zbG90ID0gMDsKKwkJaXRlci0+c2tpcCA9IDA7CisJCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOworCX0KKworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV93YWxrX25leHQpOworCisvKioKKyAqIHJoYXNodGFibGVfd2Fsa19zdG9wIC0gRmluaXNoIGEgaGFzaCB0YWJsZSB3YWxrCisgKiBAaXRlcjoJSGFzaCB0YWJsZSBpdGVyYXRvcgorICoKKyAqIEZpbmlzaCBhIGhhc2ggdGFibGUgd2Fsay4gIERvZXMgbm90IHJlc2V0IHRoZSBpdGVyYXRvciB0byB0aGUgc3RhcnQgb2YgdGhlCisgKiBoYXNoIHRhYmxlLgorICovCit2b2lkIHJoYXNodGFibGVfd2Fsa19zdG9wKHN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgKml0ZXIpCisJX19yZWxlYXNlcyhSQ1UpCit7CisJc3RydWN0IHJoYXNodGFibGUgKmh0OworCXN0cnVjdCBidWNrZXRfdGFibGUgKnRibCA9IGl0ZXItPndhbGtlci50Ymw7CisKKwlpZiAoIXRibCkKKwkJZ290byBvdXQ7CisKKwlodCA9IGl0ZXItPmh0OworCisJc3Bpbl9sb2NrKCZodC0+bG9jayk7CisJaWYgKHRibC0+cmVoYXNoIDwgdGJsLT5zaXplKQorCQlsaXN0X2FkZCgmaXRlci0+d2Fsa2VyLmxpc3QsICZ0YmwtPndhbGtlcnMpOworCWVsc2UKKwkJaXRlci0+d2Fsa2VyLnRibCA9IE5VTEw7CisJc3Bpbl91bmxvY2soJmh0LT5sb2NrKTsKKworCWl0ZXItPnAgPSBOVUxMOworCitvdXQ6CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyaGFzaHRhYmxlX3dhbGtfc3RvcCk7CisKK3N0YXRpYyBzaXplX3Qgcm91bmRlZF9oYXNodGFibGVfc2l6ZShjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzaXplX3QgcmV0c2l6ZTsKKworCWlmIChwYXJhbXMtPm5lbGVtX2hpbnQpCisJCXJldHNpemUgPSBtYXgocm91bmR1cF9wb3dfb2ZfdHdvKHBhcmFtcy0+bmVsZW1faGludCAqIDQgLyAzKSwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKXBhcmFtcy0+bWluX3NpemUpOworCWVsc2UKKwkJcmV0c2l6ZSA9IG1heChIQVNIX0RFRkFVTFRfU0laRSwKKwkJCSAgICAgICh1bnNpZ25lZCBsb25nKXBhcmFtcy0+bWluX3NpemUpOworCisJcmV0dXJuIHJldHNpemU7Cit9CisKK3N0YXRpYyB1MzIgcmhhc2h0YWJsZV9qaGFzaDIoY29uc3Qgdm9pZCAqa2V5LCB1MzIgbGVuZ3RoLCB1MzIgc2VlZCkKK3sKKwlyZXR1cm4gamhhc2gyKGtleSwgbGVuZ3RoLCBzZWVkKTsKK30KKworLyoqCisgKiByaGFzaHRhYmxlX2luaXQgLSBpbml0aWFsaXplIGEgbmV3IGhhc2ggdGFibGUKKyAqIEBodDoJCWhhc2ggdGFibGUgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqIEBwYXJhbXM6CWNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycworICoKKyAqIEluaXRpYWxpemVzIGEgbmV3IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMuIEEgdGFibGUgY2FuIGJlIGNvbmZpZ3VyZWQgZWl0aGVyIHdpdGggYSB2YXJpYWJsZSBvcgorICogZml4ZWQgbGVuZ3RoIGtleToKKyAqCisgKiBDb25maWd1cmF0aW9uIEV4YW1wbGUgMTogRml4ZWQgbGVuZ3RoIGtleXMKKyAqIHN0cnVjdCB0ZXN0X29iaiB7CisgKglpbnQJCQlrZXk7CisgKgl2b2lkICoJCQlteV9tZW1iZXI7CisgKglzdHJ1Y3Qgcmhhc2hfaGVhZAlub2RlOworICogfTsKKyAqCisgKiBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zID0geworICoJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3Rfb2JqLCBub2RlKSwKKyAqCS5rZXlfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3Rfb2JqLCBrZXkpLAorICoJLmtleV9sZW4gPSBzaXplb2YoaW50KSwKKyAqCS5oYXNoZm4gPSBqaGFzaCwKKyAqCS5udWxsc19iYXNlID0gKDFVIDw8IFJIVF9CQVNFX1NISUZUKSwKKyAqIH07CisgKgorICogQ29uZmlndXJhdGlvbiBFeGFtcGxlIDI6IFZhcmlhYmxlIGxlbmd0aCBrZXlzCisgKiBzdHJ1Y3QgdGVzdF9vYmogeworICoJWy4uLl0KKyAqCXN0cnVjdCByaGFzaF9oZWFkCW5vZGU7CisgKiB9OworICoKKyAqIHUzMiBteV9oYXNoX2ZuKGNvbnN0IHZvaWQgKmRhdGEsIHUzMiBsZW4sIHUzMiBzZWVkKQorICogeworICoJc3RydWN0IHRlc3Rfb2JqICpvYmogPSBkYXRhOworICoKKyAqCXJldHVybiBbLi4uIGhhc2ggLi4uXTsKKyAqIH0KKyAqCisgKiBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgcGFyYW1zID0geworICoJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3Rfb2JqLCBub2RlKSwKKyAqCS5oYXNoZm4gPSBqaGFzaCwKKyAqCS5vYmpfaGFzaGZuID0gbXlfaGFzaF9mbiwKKyAqIH07CisgKi8KK2ludCByaGFzaHRhYmxlX2luaXQoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkgICAgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsOworCXNpemVfdCBzaXplOworCisJaWYgKCghcGFyYW1zLT5rZXlfbGVuICYmICFwYXJhbXMtPm9ial9oYXNoZm4pIHx8CisJICAgIChwYXJhbXMtPm9ial9oYXNoZm4gJiYgIXBhcmFtcy0+b2JqX2NtcGZuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocGFyYW1zLT5udWxsc19iYXNlICYmIHBhcmFtcy0+bnVsbHNfYmFzZSA8ICgxVSA8PCBSSFRfQkFTRV9TSElGVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KGh0LCAwLCBzaXplb2YoKmh0KSk7CisJbXV0ZXhfaW5pdCgmaHQtPm11dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmaHQtPmxvY2spOworCW1lbWNweSgmaHQtPnAsIHBhcmFtcywgc2l6ZW9mKCpwYXJhbXMpKTsKKworCWlmIChwYXJhbXMtPm1pbl9zaXplKQorCQlodC0+cC5taW5fc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhwYXJhbXMtPm1pbl9zaXplKTsKKworCS8qIENhcCB0b3RhbCBlbnRyaWVzIGF0IDJeMzEgdG8gYXZvaWQgbmVsZW1zIG92ZXJmbG93LiAqLworCWh0LT5tYXhfZWxlbXMgPSAxdSA8PCAzMTsKKworCWlmIChwYXJhbXMtPm1heF9zaXplKSB7CisJCWh0LT5wLm1heF9zaXplID0gcm91bmRkb3duX3Bvd19vZl90d28ocGFyYW1zLT5tYXhfc2l6ZSk7CisJCWlmIChodC0+cC5tYXhfc2l6ZSA8IGh0LT5tYXhfZWxlbXMgLyAyKQorCQkJaHQtPm1heF9lbGVtcyA9IGh0LT5wLm1heF9zaXplICogMjsKKwl9CisKKwlodC0+cC5taW5fc2l6ZSA9IG1heF90KHUxNiwgaHQtPnAubWluX3NpemUsIEhBU0hfTUlOX1NJWkUpOworCisJc2l6ZSA9IHJvdW5kZWRfaGFzaHRhYmxlX3NpemUoJmh0LT5wKTsKKworCWlmIChwYXJhbXMtPmxvY2tzX211bCkKKwkJaHQtPnAubG9ja3NfbXVsID0gcm91bmR1cF9wb3dfb2ZfdHdvKHBhcmFtcy0+bG9ja3NfbXVsKTsKKwllbHNlCisJCWh0LT5wLmxvY2tzX211bCA9IEJVQ0tFVF9MT0NLU19QRVJfQ1BVOworCisJaHQtPmtleV9sZW4gPSBodC0+cC5rZXlfbGVuOworCWlmICghcGFyYW1zLT5oYXNoZm4pIHsKKwkJaHQtPnAuaGFzaGZuID0gamhhc2g7CisKKwkJaWYgKCEoaHQtPmtleV9sZW4gJiAoc2l6ZW9mKHUzMikgLSAxKSkpIHsKKwkJCWh0LT5rZXlfbGVuIC89IHNpemVvZih1MzIpOworCQkJaHQtPnAuaGFzaGZuID0gcmhhc2h0YWJsZV9qaGFzaDI7CisJCX0KKwl9CisKKwl0YmwgPSBidWNrZXRfdGFibGVfYWxsb2MoaHQsIHNpemUsIEdGUF9LRVJORUwpOworCWlmICh0YmwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdG9taWNfc2V0KCZodC0+bmVsZW1zLCAwKTsKKworCVJDVV9JTklUX1BPSU5URVIoaHQtPnRibCwgdGJsKTsKKworCUlOSVRfV09SSygmaHQtPnJ1bl93b3JrLCByaHRfZGVmZXJyZWRfd29ya2VyKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmhhc2h0YWJsZV9pbml0KTsKKworLyoqCisgKiByaGx0YWJsZV9pbml0IC0gaW5pdGlhbGl6ZSBhIG5ldyBoYXNoIGxpc3QgdGFibGUKKyAqIEBobHQ6CWhhc2ggbGlzdCB0YWJsZSB0byBiZSBpbml0aWFsaXplZAorICogQHBhcmFtczoJY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCisgKgorICogSW5pdGlhbGl6ZXMgYSBuZXcgaGFzaCBsaXN0IHRhYmxlLgorICoKKyAqIFNlZSBkb2N1bWVudGF0aW9uIGZvciByaGFzaHRhYmxlX2luaXQuCisgKi8KK2ludCByaGx0YWJsZV9pbml0KHN0cnVjdCByaGx0YWJsZSAqaGx0LCBjb25zdCBzdHJ1Y3Qgcmhhc2h0YWJsZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgZXJyOworCisJLyogTm8gcmhsaXN0IE5VTExzIG1hcmtpbmcgZm9yIG5vdy4gKi8KKwlpZiAocGFyYW1zLT5udWxsc19iYXNlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHJoYXNodGFibGVfaW5pdCgmaGx0LT5odCwgcGFyYW1zKTsKKwlobHQtPmh0LnJobGlzdCA9IHRydWU7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJobHRhYmxlX2luaXQpOworCitzdGF0aWMgdm9pZCByaGFzaHRhYmxlX2ZyZWVfb25lKHN0cnVjdCByaGFzaHRhYmxlICpodCwgc3RydWN0IHJoYXNoX2hlYWQgKm9iaiwKKwkJCQl2b2lkICgqZnJlZV9mbikodm9pZCAqcHRyLCB2b2lkICphcmcpLAorCQkJCXZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcmhsaXN0X2hlYWQgKmxpc3Q7CisKKwlpZiAoIWh0LT5yaGxpc3QpIHsKKwkJZnJlZV9mbihyaHRfb2JqKGh0LCBvYmopLCBhcmcpOworCQlyZXR1cm47CisJfQorCisJbGlzdCA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCByaGxpc3RfaGVhZCwgcmhlYWQpOworCWRvIHsKKwkJb2JqID0gJmxpc3QtPnJoZWFkOworCQlsaXN0ID0gcmh0X2RlcmVmZXJlbmNlKGxpc3QtPm5leHQsIGh0KTsKKwkJZnJlZV9mbihyaHRfb2JqKGh0LCBvYmopLCBhcmcpOworCX0gd2hpbGUgKGxpc3QpOworfQorCisvKioKKyAqIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSAtIGZyZWUgZWxlbWVudHMgYW5kIGRlc3Ryb3kgaGFzaCB0YWJsZQorICogQGh0OgkJdGhlIGhhc2ggdGFibGUgdG8gZGVzdHJveQorICogQGZyZWVfZm46CWNhbGxiYWNrIHRvIHJlbGVhc2UgcmVzb3VyY2VzIG9mIGVsZW1lbnQKKyAqIEBhcmc6CXBvaW50ZXIgcGFzc2VkIHRvIGZyZWVfZm4KKyAqCisgKiBTdG9wcyBhbiBldmVudHVhbCBhc3luYyByZXNpemUuIElmIGRlZmluZWQsIGludm9rZXMgZnJlZV9mbiBmb3IgZWFjaAorICogZWxlbWVudCB0byByZWxlYXNhbCByZXNvdXJjZXMuIFBsZWFzZSBub3RlIHRoYXQgUkNVIHByb3RlY3RlZAorICogcmVhZGVycyBtYXkgc3RpbGwgYmUgYWNjZXNzaW5nIHRoZSBlbGVtZW50cy4gUmVsZWFzaW5nIG9mIHJlc291cmNlcworICogbXVzdCBvY2N1ciBpbiBhIGNvbXBhdGlibGUgbWFubmVyLiBUaGVuIGZyZWVzIHRoZSBidWNrZXQgYXJyYXkuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGV2ZW50dWFsbHkgc2xlZXAgdG8gd2FpdCBmb3IgYW4gYXN5bmMgcmVzaXplCisgKiB0byBjb21wbGV0ZS4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0aGF0IG5vIGZ1cnRoZXIgd3JpdGUgb3BlcmF0aW9ucworICogb2NjdXJzIGluIHBhcmFsbGVsLgorICovCit2b2lkIHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveShzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQsCisJCQkJIHZvaWQgKCpmcmVlX2ZuKSh2b2lkICpwdHIsIHZvaWQgKmFyZyksCisJCQkJIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYnVja2V0X3RhYmxlICp0Ymw7CisJdW5zaWduZWQgaW50IGk7CisKKwljYW5jZWxfd29ya19zeW5jKCZodC0+cnVuX3dvcmspOworCisJbXV0ZXhfbG9jaygmaHQtPm11dGV4KTsKKwl0YmwgPSByaHRfZGVyZWZlcmVuY2UoaHQtPnRibCwgaHQpOworCWlmIChmcmVlX2ZuKSB7CisJCWZvciAoaSA9IDA7IGkgPCB0YmwtPnNpemU7IGkrKykgeworCQkJc3RydWN0IHJoYXNoX2hlYWQgKnBvcywgKm5leHQ7CisKKwkJCWNvbmRfcmVzY2hlZCgpOworCQkJZm9yIChwb3MgPSByaHRfZGVyZWZlcmVuY2UoKnJodF9idWNrZXQodGJsLCBpKSwgaHQpLAorCQkJICAgICBuZXh0ID0gIXJodF9pc19hX251bGxzKHBvcykgPworCQkJCQlyaHRfZGVyZWZlcmVuY2UocG9zLT5uZXh0LCBodCkgOiBOVUxMOworCQkJICAgICAhcmh0X2lzX2FfbnVsbHMocG9zKTsKKwkJCSAgICAgcG9zID0gbmV4dCwKKwkJCSAgICAgbmV4dCA9ICFyaHRfaXNfYV9udWxscyhwb3MpID8KKwkJCQkJcmh0X2RlcmVmZXJlbmNlKHBvcy0+bmV4dCwgaHQpIDogTlVMTCkKKwkJCQlyaGFzaHRhYmxlX2ZyZWVfb25lKGh0LCBwb3MsIGZyZWVfZm4sIGFyZyk7CisJCX0KKwl9CisKKwlidWNrZXRfdGFibGVfZnJlZSh0YmwpOworCW11dGV4X3VubG9jaygmaHQtPm11dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfZnJlZV9hbmRfZGVzdHJveSk7CisKK3ZvaWQgcmhhc2h0YWJsZV9kZXN0cm95KHN0cnVjdCByaGFzaHRhYmxlICpodCkKK3sKKwlyZXR1cm4gcmhhc2h0YWJsZV9mcmVlX2FuZF9kZXN0cm95KGh0LCBOVUxMLCBOVUxMKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJoYXNodGFibGVfZGVzdHJveSk7CisKK3N0cnVjdCByaGFzaF9oZWFkIF9fcmN1ICoqcmh0X2J1Y2tldF9uZXN0ZWQoY29uc3Qgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAorCQkJCQkgICAgdW5zaWduZWQgaW50IGhhc2gpCit7CisJY29uc3QgdW5zaWduZWQgaW50IHNoaWZ0ID0gUEFHRV9TSElGVCAtIGlsb2cyKHNpemVvZih2b2lkICopKTsKKwlzdGF0aWMgc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKnJobnVsbCA9CisJCShzdHJ1Y3Qgcmhhc2hfaGVhZCBfX3JjdSAqKU5VTExTX01BUktFUigwKTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSBoYXNoICYgKCgxIDw8IHRibC0+bmVzdCkgLSAxKTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHRibC0+c2l6ZSA+PiB0YmwtPm5lc3Q7CisJdW5zaWduZWQgaW50IHN1Ymhhc2ggPSBoYXNoOworCXVuaW9uIG5lc3RlZF90YWJsZSAqbnRibDsKKworCW50YmwgPSAodW5pb24gbmVzdGVkX3RhYmxlICopcmN1X2RlcmVmZXJlbmNlX3Jhdyh0YmwtPmJ1Y2tldHNbMF0pOworCW50YmwgPSByaHRfZGVyZWZlcmVuY2VfYnVja2V0X3JjdShudGJsW2luZGV4XS50YWJsZSwgdGJsLCBoYXNoKTsKKwlzdWJoYXNoID4+PSB0YmwtPm5lc3Q7CisKKwl3aGlsZSAobnRibCAmJiBzaXplID4gKDEgPDwgc2hpZnQpKSB7CisJCWluZGV4ID0gc3ViaGFzaCAmICgoMSA8PCBzaGlmdCkgLSAxKTsKKwkJbnRibCA9IHJodF9kZXJlZmVyZW5jZV9idWNrZXRfcmN1KG50YmxbaW5kZXhdLnRhYmxlLAorCQkJCQkJICB0YmwsIGhhc2gpOworCQlzaXplID4+PSBzaGlmdDsKKwkJc3ViaGFzaCA+Pj0gc2hpZnQ7CisJfQorCisJaWYgKCFudGJsKQorCQlyZXR1cm4gJnJobnVsbDsKKworCXJldHVybiAmbnRibFtzdWJoYXNoXS5idWNrZXQ7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJodF9idWNrZXRfbmVzdGVkKTsKKworc3RydWN0IHJoYXNoX2hlYWQgX19yY3UgKipyaHRfYnVja2V0X25lc3RlZF9pbnNlcnQoc3RydWN0IHJoYXNodGFibGUgKmh0LAorCQkJCQkJICAgc3RydWN0IGJ1Y2tldF90YWJsZSAqdGJsLAorCQkJCQkJICAgdW5zaWduZWQgaW50IGhhc2gpCit7CisJY29uc3QgdW5zaWduZWQgaW50IHNoaWZ0ID0gUEFHRV9TSElGVCAtIGlsb2cyKHNpemVvZih2b2lkICopKTsKKwl1bnNpZ25lZCBpbnQgaW5kZXggPSBoYXNoICYgKCgxIDw8IHRibC0+bmVzdCkgLSAxKTsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IHRibC0+c2l6ZSA+PiB0YmwtPm5lc3Q7CisJdW5pb24gbmVzdGVkX3RhYmxlICpudGJsOworCXVuc2lnbmVkIGludCBzaGlmdGVkOworCXVuc2lnbmVkIGludCBuaGFzaDsKKworCW50YmwgPSAodW5pb24gbmVzdGVkX3RhYmxlICopcmN1X2RlcmVmZXJlbmNlX3Jhdyh0YmwtPmJ1Y2tldHNbMF0pOworCWhhc2ggPj49IHRibC0+bmVzdDsKKwluaGFzaCA9IGluZGV4OworCXNoaWZ0ZWQgPSB0YmwtPm5lc3Q7CisJbnRibCA9IG5lc3RlZF90YWJsZV9hbGxvYyhodCwgJm50YmxbaW5kZXhdLnRhYmxlLAorCQkJCSAgc2l6ZSA8PSAoMSA8PCBzaGlmdCkgPyBzaGlmdGVkIDogMCwgbmhhc2gpOworCisJd2hpbGUgKG50YmwgJiYgc2l6ZSA+ICgxIDw8IHNoaWZ0KSkgeworCQlpbmRleCA9IGhhc2ggJiAoKDEgPDwgc2hpZnQpIC0gMSk7CisJCXNpemUgPj49IHNoaWZ0OworCQloYXNoID4+PSBzaGlmdDsKKwkJbmhhc2ggfD0gaW5kZXggPDwgc2hpZnRlZDsKKwkJc2hpZnRlZCArPSBzaGlmdDsKKwkJbnRibCA9IG5lc3RlZF90YWJsZV9hbGxvYyhodCwgJm50YmxbaW5kZXhdLnRhYmxlLAorCQkJCQkgIHNpemUgPD0gKDEgPDwgc2hpZnQpID8gc2hpZnRlZCA6IDAsCisJCQkJCSAgbmhhc2gpOworCX0KKworCWlmICghbnRibCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJm50YmxbaGFzaF0uYnVja2V0OworCit9CitFWFBPUlRfU1lNQk9MX0dQTChyaHRfYnVja2V0X25lc3RlZF9pbnNlcnQpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2JpdG1hcC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2JpdG1hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNDY3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zYml0bWFwLmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgRmFjZWJvb2sKKyAqIENvcHlyaWdodCAoQykgMjAxMy0yMDE0IEplbnMgQXhib2UKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NiaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorCitpbnQgc2JpdG1hcF9pbml0X25vZGUoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgZGVwdGgsIGludCBzaGlmdCwKKwkJICAgICAgZ2ZwX3QgZmxhZ3MsIGludCBub2RlKQoreworCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkOworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHNoaWZ0IDwgMCkgeworCQlzaGlmdCA9IGlsb2cyKEJJVFNfUEVSX0xPTkcpOworCQkvKgorCQkgKiBJZiB0aGUgYml0bWFwIGlzIHNtYWxsLCBzaHJpbmsgdGhlIG51bWJlciBvZiBiaXRzIHBlciB3b3JkIHNvCisJCSAqIHdlIHNwcmVhZCBvdmVyIGEgZmV3IGNhY2hlbGluZXMsIGF0IGxlYXN0LiBJZiBsZXNzIHRoYW4gNAorCQkgKiBiaXRzLCBqdXN0IGZvcmdldCBhYm91dCBpdCwgaXQncyBub3QgZ29pbmcgdG8gd29yayBvcHRpbWFsbHkKKwkJICogYW55d2F5LgorCQkgKi8KKwkJaWYgKGRlcHRoID49IDQpIHsKKwkJCXdoaWxlICgoNFUgPDwgc2hpZnQpID4gZGVwdGgpCisJCQkJc2hpZnQtLTsKKwkJfQorCX0KKwliaXRzX3Blcl93b3JkID0gMVUgPDwgc2hpZnQ7CisJaWYgKGJpdHNfcGVyX3dvcmQgPiBCSVRTX1BFUl9MT05HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNiLT5zaGlmdCA9IHNoaWZ0OworCXNiLT5kZXB0aCA9IGRlcHRoOworCXNiLT5tYXBfbnIgPSBESVZfUk9VTkRfVVAoc2ItPmRlcHRoLCBiaXRzX3Blcl93b3JkKTsKKworCWlmIChkZXB0aCA9PSAwKSB7CisJCXNiLT5tYXAgPSBOVUxMOworCQlyZXR1cm4gMDsKKwl9CisKKwlzYi0+bWFwID0ga3phbGxvY19ub2RlKHNiLT5tYXBfbnIgKiBzaXplb2YoKnNiLT5tYXApLCBmbGFncywgbm9kZSk7CisJaWYgKCFzYi0+bWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBzYi0+bWFwX25yOyBpKyspIHsKKwkJc2ItPm1hcFtpXS5kZXB0aCA9IG1pbihkZXB0aCwgYml0c19wZXJfd29yZCk7CisJCWRlcHRoIC09IHNiLT5tYXBbaV0uZGVwdGg7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9pbml0X25vZGUpOworCit2b2lkIHNiaXRtYXBfcmVzaXplKHN0cnVjdCBzYml0bWFwICpzYiwgdW5zaWduZWQgaW50IGRlcHRoKQoreworCXVuc2lnbmVkIGludCBiaXRzX3Blcl93b3JkID0gMVUgPDwgc2ItPnNoaWZ0OworCXVuc2lnbmVkIGludCBpOworCisJc2ItPmRlcHRoID0gZGVwdGg7CisJc2ItPm1hcF9uciA9IERJVl9ST1VORF9VUChzYi0+ZGVwdGgsIGJpdHNfcGVyX3dvcmQpOworCisJZm9yIChpID0gMDsgaSA8IHNiLT5tYXBfbnI7IGkrKykgeworCQlzYi0+bWFwW2ldLmRlcHRoID0gbWluKGRlcHRoLCBiaXRzX3Blcl93b3JkKTsKKwkJZGVwdGggLT0gc2ItPm1hcFtpXS5kZXB0aDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3Jlc2l6ZSk7CisKK3N0YXRpYyBpbnQgX19zYml0bWFwX2dldF93b3JkKHVuc2lnbmVkIGxvbmcgKndvcmQsIHVuc2lnbmVkIGxvbmcgZGVwdGgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgaGludCwgYm9vbCB3cmFwKQoreworCXVuc2lnbmVkIGludCBvcmlnX2hpbnQgPSBoaW50OworCWludCBucjsKKworCXdoaWxlICgxKSB7CisJCW5yID0gZmluZF9uZXh0X3plcm9fYml0KHdvcmQsIGRlcHRoLCBoaW50KTsKKwkJaWYgKHVubGlrZWx5KG5yID49IGRlcHRoKSkgeworCQkJLyoKKwkJCSAqIFdlIHN0YXJ0ZWQgd2l0aCBhbiBvZmZzZXQsIGFuZCB3ZSBkaWRuJ3QgcmVzZXQgdGhlCisJCQkgKiBvZmZzZXQgdG8gMCBpbiBhIGZhaWx1cmUgY2FzZSwgc28gc3RhcnQgZnJvbSAwIHRvCisJCQkgKiBleGhhdXN0IHRoZSBtYXAuCisJCQkgKi8KKwkJCWlmIChvcmlnX2hpbnQgJiYgaGludCAmJiB3cmFwKSB7CisJCQkJaGludCA9IG9yaWdfaGludCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQobnIsIHdvcmQpKQorCQkJYnJlYWs7CisKKwkJaGludCA9IG5yICsgMTsKKwkJaWYgKGhpbnQgPj0gZGVwdGggLSAxKQorCQkJaGludCA9IDA7CisJfQorCisJcmV0dXJuIG5yOworfQorCitpbnQgc2JpdG1hcF9nZXQoc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgYWxsb2NfaGludCwgYm9vbCByb3VuZF9yb2JpbikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaW5kZXg7CisJaW50IG5yID0gLTE7CisKKwlpbmRleCA9IFNCX05SX1RPX0lOREVYKHNiLCBhbGxvY19oaW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBzYi0+bWFwX25yOyBpKyspIHsKKwkJbnIgPSBfX3NiaXRtYXBfZ2V0X3dvcmQoJnNiLT5tYXBbaW5kZXhdLndvcmQsCisJCQkJCXNiLT5tYXBbaW5kZXhdLmRlcHRoLAorCQkJCQlTQl9OUl9UT19CSVQoc2IsIGFsbG9jX2hpbnQpLAorCQkJCQkhcm91bmRfcm9iaW4pOworCQlpZiAobnIgIT0gLTEpIHsKKwkJCW5yICs9IGluZGV4IDw8IHNiLT5zaGlmdDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSnVtcCB0byBuZXh0IGluZGV4LiAqLworCQlpbmRleCsrOworCQlhbGxvY19oaW50ID0gaW5kZXggPDwgc2ItPnNoaWZ0OworCisJCWlmIChpbmRleCA+PSBzYi0+bWFwX25yKSB7CisJCQlpbmRleCA9IDA7CisJCQlhbGxvY19oaW50ID0gMDsKKwkJfQorCX0KKworCXJldHVybiBucjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNiaXRtYXBfZ2V0KTsKKworaW50IHNiaXRtYXBfZ2V0X3NoYWxsb3coc3RydWN0IHNiaXRtYXAgKnNiLCB1bnNpZ25lZCBpbnQgYWxsb2NfaGludCwKKwkJCXVuc2lnbmVkIGxvbmcgc2hhbGxvd19kZXB0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaW5kZXg7CisJaW50IG5yID0gLTE7CisKKwlpbmRleCA9IFNCX05SX1RPX0lOREVYKHNiLCBhbGxvY19oaW50KTsKKworCWZvciAoaSA9IDA7IGkgPCBzYi0+bWFwX25yOyBpKyspIHsKKwkJbnIgPSBfX3NiaXRtYXBfZ2V0X3dvcmQoJnNiLT5tYXBbaW5kZXhdLndvcmQsCisJCQkJCW1pbihzYi0+bWFwW2luZGV4XS5kZXB0aCwgc2hhbGxvd19kZXB0aCksCisJCQkJCVNCX05SX1RPX0JJVChzYiwgYWxsb2NfaGludCksIHRydWUpOworCQlpZiAobnIgIT0gLTEpIHsKKwkJCW5yICs9IGluZGV4IDw8IHNiLT5zaGlmdDsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSnVtcCB0byBuZXh0IGluZGV4LiAqLworCQlpbmRleCsrOworCQlhbGxvY19oaW50ID0gaW5kZXggPDwgc2ItPnNoaWZ0OworCisJCWlmIChpbmRleCA+PSBzYi0+bWFwX25yKSB7CisJCQlpbmRleCA9IDA7CisJCQlhbGxvY19oaW50ID0gMDsKKwkJfQorCX0KKworCXJldHVybiBucjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNiaXRtYXBfZ2V0X3NoYWxsb3cpOworCitib29sIHNiaXRtYXBfYW55X2JpdF9zZXQoY29uc3Qgc3RydWN0IHNiaXRtYXAgKnNiKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNiLT5tYXBfbnI7IGkrKykgeworCQlpZiAoc2ItPm1hcFtpXS53b3JkKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNiaXRtYXBfYW55X2JpdF9zZXQpOworCitib29sIHNiaXRtYXBfYW55X2JpdF9jbGVhcihjb25zdCBzdHJ1Y3Qgc2JpdG1hcCAqc2IpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2ItPm1hcF9ucjsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBzYml0bWFwX3dvcmQgKndvcmQgPSAmc2ItPm1hcFtpXTsKKwkJdW5zaWduZWQgbG9uZyByZXQ7CisKKwkJcmV0ID0gZmluZF9maXJzdF96ZXJvX2JpdCgmd29yZC0+d29yZCwgd29yZC0+ZGVwdGgpOworCQlpZiAocmV0IDwgd29yZC0+ZGVwdGgpCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9hbnlfYml0X2NsZWFyKTsKKwordW5zaWduZWQgaW50IHNiaXRtYXBfd2VpZ2h0KGNvbnN0IHN0cnVjdCBzYml0bWFwICpzYikKK3sKKwl1bnNpZ25lZCBpbnQgaSwgd2VpZ2h0ID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBzYi0+bWFwX25yOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHNiaXRtYXBfd29yZCAqd29yZCA9ICZzYi0+bWFwW2ldOworCisJCXdlaWdodCArPSBiaXRtYXBfd2VpZ2h0KCZ3b3JkLT53b3JkLCB3b3JkLT5kZXB0aCk7CisJfQorCXJldHVybiB3ZWlnaHQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3dlaWdodCk7CisKK3ZvaWQgc2JpdG1hcF9zaG93KHN0cnVjdCBzYml0bWFwICpzYiwgc3RydWN0IHNlcV9maWxlICptKQoreworCXNlcV9wcmludGYobSwgImRlcHRoPSV1XG4iLCBzYi0+ZGVwdGgpOworCXNlcV9wcmludGYobSwgImJ1c3k9JXVcbiIsIHNiaXRtYXBfd2VpZ2h0KHNiKSk7CisJc2VxX3ByaW50ZihtLCAiYml0c19wZXJfd29yZD0ldVxuIiwgMVUgPDwgc2ItPnNoaWZ0KTsKKwlzZXFfcHJpbnRmKG0sICJtYXBfbnI9JXVcbiIsIHNiLT5tYXBfbnIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9zaG93KTsKKworc3RhdGljIGlubGluZSB2b2lkIGVtaXRfYnl0ZShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGludCBvZmZzZXQsIHU4IGJ5dGUpCit7CisJaWYgKChvZmZzZXQgJiAweGYpID09IDApIHsKKwkJaWYgKG9mZnNldCAhPSAwKQorCQkJc2VxX3B1dGMobSwgJ1xuJyk7CisJCXNlcV9wcmludGYobSwgIiUwOHg6Iiwgb2Zmc2V0KTsKKwl9CisJaWYgKChvZmZzZXQgJiAweDEpID09IDApCisJCXNlcV9wdXRjKG0sICcgJyk7CisJc2VxX3ByaW50ZihtLCAiJTAyeCIsIGJ5dGUpOworfQorCit2b2lkIHNiaXRtYXBfYml0bWFwX3Nob3coc3RydWN0IHNiaXRtYXAgKnNiLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisJdTggYnl0ZSA9IDA7CisJdW5zaWduZWQgaW50IGJ5dGVfYml0cyA9IDA7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2ItPm1hcF9ucjsgaSsrKSB7CisJCXVuc2lnbmVkIGxvbmcgd29yZCA9IFJFQURfT05DRShzYi0+bWFwW2ldLndvcmQpOworCQl1bnNpZ25lZCBpbnQgd29yZF9iaXRzID0gUkVBRF9PTkNFKHNiLT5tYXBbaV0uZGVwdGgpOworCisJCXdoaWxlICh3b3JkX2JpdHMgPiAwKSB7CisJCQl1bnNpZ25lZCBpbnQgYml0cyA9IG1pbig4IC0gYnl0ZV9iaXRzLCB3b3JkX2JpdHMpOworCisJCQlieXRlIHw9ICh3b3JkICYgKEJJVChiaXRzKSAtIDEpKSA8PCBieXRlX2JpdHM7CisJCQlieXRlX2JpdHMgKz0gYml0czsKKwkJCWlmIChieXRlX2JpdHMgPT0gOCkgeworCQkJCWVtaXRfYnl0ZShtLCBvZmZzZXQsIGJ5dGUpOworCQkJCWJ5dGUgPSAwOworCQkJCWJ5dGVfYml0cyA9IDA7CisJCQkJb2Zmc2V0Kys7CisJCQl9CisJCQl3b3JkID4+PSBiaXRzOworCQkJd29yZF9iaXRzIC09IGJpdHM7CisJCX0KKwl9CisJaWYgKGJ5dGVfYml0cykgeworCQllbWl0X2J5dGUobSwgb2Zmc2V0LCBieXRlKTsKKwkJb2Zmc2V0Kys7CisJfQorCWlmIChvZmZzZXQpCisJCXNlcV9wdXRjKG0sICdcbicpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9iaXRtYXBfc2hvdyk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2JxX2NhbGNfd2FrZV9iYXRjaCh1bnNpZ25lZCBpbnQgZGVwdGgpCit7CisJdW5zaWduZWQgaW50IHdha2VfYmF0Y2g7CisKKwkvKgorCSAqIEZvciBlYWNoIGJhdGNoLCB3ZSB3YWtlIHVwIG9uZSBxdWV1ZS4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvdXIKKwkgKiBiYXRjaCBzaXplIGlzIHNtYWxsIGVub3VnaCB0aGF0IHRoZSBmdWxsIGRlcHRoIG9mIHRoZSBiaXRtYXAgaXMKKwkgKiBlbm91Z2ggdG8gd2FrZSB1cCBhbGwgb2YgdGhlIHF1ZXVlcy4KKwkgKi8KKwl3YWtlX2JhdGNoID0gU0JRX1dBS0VfQkFUQ0g7CisJaWYgKHdha2VfYmF0Y2ggPiBkZXB0aCAvIFNCUV9XQUlUX1FVRVVFUykKKwkJd2FrZV9iYXRjaCA9IG1heCgxVSwgZGVwdGggLyBTQlFfV0FJVF9RVUVVRVMpOworCisJcmV0dXJuIHdha2VfYmF0Y2g7Cit9CisKK2ludCBzYml0bWFwX3F1ZXVlX2luaXRfbm9kZShzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLCB1bnNpZ25lZCBpbnQgZGVwdGgsCisJCQkgICAgaW50IHNoaWZ0LCBib29sIHJvdW5kX3JvYmluLCBnZnBfdCBmbGFncywgaW50IG5vZGUpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKworCXJldCA9IHNiaXRtYXBfaW5pdF9ub2RlKCZzYnEtPnNiLCBkZXB0aCwgc2hpZnQsIGZsYWdzLCBub2RlKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2JxLT5hbGxvY19oaW50ID0gYWxsb2NfcGVyY3B1X2dmcCh1bnNpZ25lZCBpbnQsIGZsYWdzKTsKKwlpZiAoIXNicS0+YWxsb2NfaGludCkgeworCQlzYml0bWFwX2ZyZWUoJnNicS0+c2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZGVwdGggJiYgIXJvdW5kX3JvYmluKSB7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQorCQkJKnBlcl9jcHVfcHRyKHNicS0+YWxsb2NfaGludCwgaSkgPSBwcmFuZG9tX3UzMigpICUgZGVwdGg7CisJfQorCisJc2JxLT53YWtlX2JhdGNoID0gc2JxX2NhbGNfd2FrZV9iYXRjaChkZXB0aCk7CisJYXRvbWljX3NldCgmc2JxLT53YWtlX2luZGV4LCAwKTsKKworCXNicS0+d3MgPSBremFsbG9jX25vZGUoU0JRX1dBSVRfUVVFVUVTICogc2l6ZW9mKCpzYnEtPndzKSwgZmxhZ3MsIG5vZGUpOworCWlmICghc2JxLT53cykgeworCQlmcmVlX3BlcmNwdShzYnEtPmFsbG9jX2hpbnQpOworCQlzYml0bWFwX2ZyZWUoJnNicS0+c2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgU0JRX1dBSVRfUVVFVUVTOyBpKyspIHsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2JxLT53c1tpXS53YWl0KTsKKwkJYXRvbWljX3NldCgmc2JxLT53c1tpXS53YWl0X2NudCwgc2JxLT53YWtlX2JhdGNoKTsKKwl9CisKKwlzYnEtPnJvdW5kX3JvYmluID0gcm91bmRfcm9iaW47CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3F1ZXVlX2luaXRfbm9kZSk7CisKK3ZvaWQgc2JpdG1hcF9xdWV1ZV9yZXNpemUoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSwgdW5zaWduZWQgaW50IGRlcHRoKQoreworCXVuc2lnbmVkIGludCB3YWtlX2JhdGNoID0gc2JxX2NhbGNfd2FrZV9iYXRjaChkZXB0aCk7CisJaW50IGk7CisKKwlpZiAoc2JxLT53YWtlX2JhdGNoICE9IHdha2VfYmF0Y2gpIHsKKwkJV1JJVEVfT05DRShzYnEtPndha2VfYmF0Y2gsIHdha2VfYmF0Y2gpOworCQkvKgorCQkgKiBQYWlycyB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiBzYnFfd2FrZV91cCgpIHRvIGVuc3VyZSB0aGF0CisJCSAqIHRoZSBiYXRjaCBzaXplIGlzIHVwZGF0ZWQgYmVmb3JlIHRoZSB3YWl0IGNvdW50cy4KKwkJICovCisJCXNtcF9tYigpOworCQlmb3IgKGkgPSAwOyBpIDwgU0JRX1dBSVRfUVVFVUVTOyBpKyspCisJCQlhdG9taWNfc2V0KCZzYnEtPndzW2ldLndhaXRfY250LCAxKTsKKwl9CisJc2JpdG1hcF9yZXNpemUoJnNicS0+c2IsIGRlcHRoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNiaXRtYXBfcXVldWVfcmVzaXplKTsKKworaW50IF9fc2JpdG1hcF9xdWV1ZV9nZXQoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSkKK3sKKwl1bnNpZ25lZCBpbnQgaGludCwgZGVwdGg7CisJaW50IG5yOworCisJaGludCA9IHRoaXNfY3B1X3JlYWQoKnNicS0+YWxsb2NfaGludCk7CisJZGVwdGggPSBSRUFEX09OQ0Uoc2JxLT5zYi5kZXB0aCk7CisJaWYgKHVubGlrZWx5KGhpbnQgPj0gZGVwdGgpKSB7CisJCWhpbnQgPSBkZXB0aCA/IHByYW5kb21fdTMyKCkgJSBkZXB0aCA6IDA7CisJCXRoaXNfY3B1X3dyaXRlKCpzYnEtPmFsbG9jX2hpbnQsIGhpbnQpOworCX0KKwluciA9IHNiaXRtYXBfZ2V0KCZzYnEtPnNiLCBoaW50LCBzYnEtPnJvdW5kX3JvYmluKTsKKworCWlmIChuciA9PSAtMSkgeworCQkvKiBJZiB0aGUgbWFwIGlzIGZ1bGwsIGEgaGludCB3b24ndCBkbyB1cyBtdWNoIGdvb2QuICovCisJCXRoaXNfY3B1X3dyaXRlKCpzYnEtPmFsbG9jX2hpbnQsIDApOworCX0gZWxzZSBpZiAobnIgPT0gaGludCB8fCB1bmxpa2VseShzYnEtPnJvdW5kX3JvYmluKSkgeworCQkvKiBPbmx5IHVwZGF0ZSB0aGUgaGludCBpZiB3ZSB1c2VkIGl0LiAqLworCQloaW50ID0gbnIgKyAxOworCQlpZiAoaGludCA+PSBkZXB0aCAtIDEpCisJCQloaW50ID0gMDsKKwkJdGhpc19jcHVfd3JpdGUoKnNicS0+YWxsb2NfaGludCwgaGludCk7CisJfQorCisJcmV0dXJuIG5yOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19zYml0bWFwX3F1ZXVlX2dldCk7CisKK2ludCBfX3NiaXRtYXBfcXVldWVfZ2V0X3NoYWxsb3coc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSwKKwkJCQl1bnNpZ25lZCBpbnQgc2hhbGxvd19kZXB0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaGludCwgZGVwdGg7CisJaW50IG5yOworCisJaGludCA9IHRoaXNfY3B1X3JlYWQoKnNicS0+YWxsb2NfaGludCk7CisJZGVwdGggPSBSRUFEX09OQ0Uoc2JxLT5zYi5kZXB0aCk7CisJaWYgKHVubGlrZWx5KGhpbnQgPj0gZGVwdGgpKSB7CisJCWhpbnQgPSBkZXB0aCA/IHByYW5kb21fdTMyKCkgJSBkZXB0aCA6IDA7CisJCXRoaXNfY3B1X3dyaXRlKCpzYnEtPmFsbG9jX2hpbnQsIGhpbnQpOworCX0KKwluciA9IHNiaXRtYXBfZ2V0X3NoYWxsb3coJnNicS0+c2IsIGhpbnQsIHNoYWxsb3dfZGVwdGgpOworCisJaWYgKG5yID09IC0xKSB7CisJCS8qIElmIHRoZSBtYXAgaXMgZnVsbCwgYSBoaW50IHdvbid0IGRvIHVzIG11Y2ggZ29vZC4gKi8KKwkJdGhpc19jcHVfd3JpdGUoKnNicS0+YWxsb2NfaGludCwgMCk7CisJfSBlbHNlIGlmIChuciA9PSBoaW50IHx8IHVubGlrZWx5KHNicS0+cm91bmRfcm9iaW4pKSB7CisJCS8qIE9ubHkgdXBkYXRlIHRoZSBoaW50IGlmIHdlIHVzZWQgaXQuICovCisJCWhpbnQgPSBuciArIDE7CisJCWlmIChoaW50ID49IGRlcHRoIC0gMSkKKwkJCWhpbnQgPSAwOworCQl0aGlzX2NwdV93cml0ZSgqc2JxLT5hbGxvY19oaW50LCBoaW50KTsKKwl9CisKKwlyZXR1cm4gbnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3NiaXRtYXBfcXVldWVfZ2V0X3NoYWxsb3cpOworCitzdGF0aWMgc3RydWN0IHNicV93YWl0X3N0YXRlICpzYnFfd2FrZV9wdHIoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSkKK3sKKwlpbnQgaSwgd2FrZV9pbmRleDsKKworCXdha2VfaW5kZXggPSBhdG9taWNfcmVhZCgmc2JxLT53YWtlX2luZGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgU0JRX1dBSVRfUVVFVUVTOyBpKyspIHsKKwkJc3RydWN0IHNicV93YWl0X3N0YXRlICp3cyA9ICZzYnEtPndzW3dha2VfaW5kZXhdOworCisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3cy0+d2FpdCkpIHsKKwkJCWludCBvID0gYXRvbWljX3JlYWQoJnNicS0+d2FrZV9pbmRleCk7CisKKwkJCWlmICh3YWtlX2luZGV4ICE9IG8pCisJCQkJYXRvbWljX2NtcHhjaGcoJnNicS0+d2FrZV9pbmRleCwgbywgd2FrZV9pbmRleCk7CisJCQlyZXR1cm4gd3M7CisJCX0KKworCQl3YWtlX2luZGV4ID0gc2JxX2luZGV4X2luYyh3YWtlX2luZGV4KTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgc2JxX3dha2VfdXAoc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSkKK3sKKwlzdHJ1Y3Qgc2JxX3dhaXRfc3RhdGUgKndzOworCXVuc2lnbmVkIGludCB3YWtlX2JhdGNoOworCWludCB3YWl0X2NudDsKKworCS8qCisJICogUGFpcnMgd2l0aCB0aGUgbWVtb3J5IGJhcnJpZXIgaW4gc2V0X2N1cnJlbnRfc3RhdGUoKSB0byBlbnN1cmUgdGhlCisJICogcHJvcGVyIG9yZGVyaW5nIG9mIGNsZWFyX2JpdCgpL3dhaXRxdWV1ZV9hY3RpdmUoKSBpbiB0aGUgd2FrZXIgYW5kCisJICogdGVzdF9hbmRfc2V0X2JpdCgpL3ByZXBhcmVfdG9fd2FpdCgpL2ZpbmlzaF93YWl0KCkgaW4gdGhlIHdhaXRlci4gU2VlCisJICogdGhlIGNvbW1lbnQgb24gd2FpdHF1ZXVlX2FjdGl2ZSgpLiBUaGlzIGlzIF9fYWZ0ZXJfYXRvbWljIGJlY2F1c2Ugd2UKKwkgKiBqdXN0IGRpZCBjbGVhcl9iaXQoKSBpbiB0aGUgY2FsbGVyLgorCSAqLworCXNtcF9tYl9fYWZ0ZXJfYXRvbWljKCk7CisKKwl3cyA9IHNicV93YWtlX3B0cihzYnEpOworCWlmICghd3MpCisJCXJldHVybjsKKworCXdhaXRfY250ID0gYXRvbWljX2RlY19yZXR1cm4oJndzLT53YWl0X2NudCk7CisJaWYgKHdhaXRfY250IDw9IDApIHsKKwkJd2FrZV9iYXRjaCA9IFJFQURfT05DRShzYnEtPndha2VfYmF0Y2gpOworCQkvKgorCQkgKiBQYWlycyB3aXRoIHRoZSBtZW1vcnkgYmFycmllciBpbiBzYml0bWFwX3F1ZXVlX3Jlc2l6ZSgpIHRvCisJCSAqIGVuc3VyZSB0aGF0IHdlIHNlZSB0aGUgYmF0Y2ggc2l6ZSB1cGRhdGUgYmVmb3JlIHRoZSB3YWl0CisJCSAqIGNvdW50IGlzIHJlc2V0LgorCQkgKi8KKwkJc21wX21iX19iZWZvcmVfYXRvbWljKCk7CisJCS8qCisJCSAqIElmIHRoZXJlIGFyZSBjb25jdXJyZW50IGNhbGxlcnMgdG8gc2JxX3dha2VfdXAoKSwgdGhlIGxhc3QKKwkJICogb25lIHRvIGRlY3JlbWVudCB0aGUgd2FpdCBjb3VudCBiZWxvdyB6ZXJvIHdpbGwgYnVtcCBpdCBiYWNrCisJCSAqIHVwLiBJZiB0aGVyZSBpcyBhIGNvbmN1cnJlbnQgcmVzaXplLCB0aGUgY291bnQgcmVzZXQgd2lsbAorCQkgKiBlaXRoZXIgY2F1c2UgdGhlIGNtcHhjaGcgdG8gZmFpbCBvciBvdmVyd3JpdGUgYWZ0ZXIgdGhlCisJCSAqIGNtcHhjaGcuCisJCSAqLworCQlhdG9taWNfY21weGNoZygmd3MtPndhaXRfY250LCB3YWl0X2NudCwgd2FpdF9jbnQgKyB3YWtlX2JhdGNoKTsKKwkJc2JxX2luZGV4X2F0b21pY19pbmMoJnNicS0+d2FrZV9pbmRleCk7CisJCXdha2VfdXAoJndzLT53YWl0KTsKKwl9Cit9CisKK3ZvaWQgc2JpdG1hcF9xdWV1ZV9jbGVhcihzdHJ1Y3Qgc2JpdG1hcF9xdWV1ZSAqc2JxLCB1bnNpZ25lZCBpbnQgbnIsCisJCQkgdW5zaWduZWQgaW50IGNwdSkKK3sKKwlzYml0bWFwX2NsZWFyX2JpdCgmc2JxLT5zYiwgbnIpOworCXNicV93YWtlX3VwKHNicSk7CisJaWYgKGxpa2VseSghc2JxLT5yb3VuZF9yb2JpbiAmJiBuciA8IHNicS0+c2IuZGVwdGgpKQorCQkqcGVyX2NwdV9wdHIoc2JxLT5hbGxvY19oaW50LCBjcHUpID0gbnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3F1ZXVlX2NsZWFyKTsKKwordm9pZCBzYml0bWFwX3F1ZXVlX3dha2VfYWxsKHN0cnVjdCBzYml0bWFwX3F1ZXVlICpzYnEpCit7CisJaW50IGksIHdha2VfaW5kZXg7CisKKwkvKgorCSAqIFBhaXJzIHdpdGggdGhlIG1lbW9yeSBiYXJyaWVyIGluIHNldF9jdXJyZW50X3N0YXRlKCkgbGlrZSBpbgorCSAqIHNicV93YWtlX3VwKCkuCisJICovCisJc21wX21iKCk7CisJd2FrZV9pbmRleCA9IGF0b21pY19yZWFkKCZzYnEtPndha2VfaW5kZXgpOworCWZvciAoaSA9IDA7IGkgPCBTQlFfV0FJVF9RVUVVRVM7IGkrKykgeworCQlzdHJ1Y3Qgc2JxX3dhaXRfc3RhdGUgKndzID0gJnNicS0+d3Nbd2FrZV9pbmRleF07CisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJndzLT53YWl0KSkKKwkJCXdha2VfdXAoJndzLT53YWl0KTsKKworCQl3YWtlX2luZGV4ID0gc2JxX2luZGV4X2luYyh3YWtlX2luZGV4KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzYml0bWFwX3F1ZXVlX3dha2VfYWxsKTsKKwordm9pZCBzYml0bWFwX3F1ZXVlX3Nob3coc3RydWN0IHNiaXRtYXBfcXVldWUgKnNicSwgc3RydWN0IHNlcV9maWxlICptKQoreworCWJvb2wgZmlyc3Q7CisJaW50IGk7CisKKwlzYml0bWFwX3Nob3coJnNicS0+c2IsIG0pOworCisJc2VxX3B1dHMobSwgImFsbG9jX2hpbnQ9eyIpOworCWZpcnN0ID0gdHJ1ZTsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlpZiAoIWZpcnN0KQorCQkJc2VxX3B1dHMobSwgIiwgIik7CisJCWZpcnN0ID0gZmFsc2U7CisJCXNlcV9wcmludGYobSwgIiV1IiwgKnBlcl9jcHVfcHRyKHNicS0+YWxsb2NfaGludCwgaSkpOworCX0KKwlzZXFfcHV0cyhtLCAifVxuIik7CisKKwlzZXFfcHJpbnRmKG0sICJ3YWtlX2JhdGNoPSV1XG4iLCBzYnEtPndha2VfYmF0Y2gpOworCXNlcV9wcmludGYobSwgIndha2VfaW5kZXg9JWRcbiIsIGF0b21pY19yZWFkKCZzYnEtPndha2VfaW5kZXgpKTsKKworCXNlcV9wdXRzKG0sICJ3cz17XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgU0JRX1dBSVRfUVVFVUVTOyBpKyspIHsKKwkJc3RydWN0IHNicV93YWl0X3N0YXRlICp3cyA9ICZzYnEtPndzW2ldOworCisJCXNlcV9wcmludGYobSwgIlx0ey53YWl0X2NudD0lZCwgLndhaXQ9JXN9LFxuIiwKKwkJCSAgIGF0b21pY19yZWFkKCZ3cy0+d2FpdF9jbnQpLAorCQkJICAgd2FpdHF1ZXVlX2FjdGl2ZSgmd3MtPndhaXQpID8gImFjdGl2ZSIgOiAiaW5hY3RpdmUiKTsKKwl9CisJc2VxX3B1dHMobSwgIn1cbiIpOworCisJc2VxX3ByaW50ZihtLCAicm91bmRfcm9iaW49JWRcbiIsIHNicS0+cm91bmRfcm9iaW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2JpdG1hcF9xdWV1ZV9zaG93KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NjYXR0ZXJsaXN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zY2F0dGVybGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGM4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zY2F0dGVybGlzdC5jCkBAIC0wLDAgKzEsODk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEplbnMgQXhib2UgPGplbnMuYXhib2VAb3JhY2xlLmNvbT4KKyAqCisgKiBTY2F0dGVybGlzdCBoYW5kbGluZyBoZWxwZXJzLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW1sZWFrLmg+CisKKy8qKgorICogc2dfbmV4dCAtIHJldHVybiB0aGUgbmV4dCBzY2F0dGVybGlzdCBlbnRyeSBpbiBhIGxpc3QKKyAqIEBzZzoJCVRoZSBjdXJyZW50IHNnIGVudHJ5CisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFVzdWFsbHkgdGhlIG5leHQgZW50cnkgd2lsbCBiZSBAc2dAICsgMSwgYnV0IGlmIHRoaXMgc2cgZWxlbWVudCBpcyBwYXJ0CisgKiAgIG9mIGEgY2hhaW5lZCBzY2F0dGVybGlzdCwgaXQgY291bGQganVtcCB0byB0aGUgc3RhcnQgb2YgYSBuZXcKKyAqICAgc2NhdHRlcmxpc3QgYXJyYXkuCisgKgorICoqLworc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19uZXh0KHN0cnVjdCBzY2F0dGVybGlzdCAqc2cpCit7CisjaWZkZWYgQ09ORklHX0RFQlVHX1NHCisJQlVHX09OKHNnLT5zZ19tYWdpYyAhPSBTR19NQUdJQyk7CisjZW5kaWYKKwlpZiAoc2dfaXNfbGFzdChzZykpCisJCXJldHVybiBOVUxMOworCisJc2crKzsKKwlpZiAodW5saWtlbHkoc2dfaXNfY2hhaW4oc2cpKSkKKwkJc2cgPSBzZ19jaGFpbl9wdHIoc2cpOworCisJcmV0dXJuIHNnOworfQorRVhQT1JUX1NZTUJPTChzZ19uZXh0KTsKKworLyoqCisgKiBzZ19uZW50cyAtIHJldHVybiB0b3RhbCBjb3VudCBvZiBlbnRyaWVzIGluIHNjYXR0ZXJsaXN0CisgKiBAc2c6CQlUaGUgc2NhdHRlcmxpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFsbG93cyB0byBrbm93IGhvdyBtYW55IGVudHJpZXMgYXJlIGluIHNnLCB0YWtpbmcgaW50byBhY291bnQKKyAqIGNoYWluaW5nIGFzIHdlbGwKKyAqCisgKiovCitpbnQgc2dfbmVudHMoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlpbnQgbmVudHM7CisJZm9yIChuZW50cyA9IDA7IHNnOyBzZyA9IHNnX25leHQoc2cpKQorCQluZW50cysrOworCXJldHVybiBuZW50czsKK30KK0VYUE9SVF9TWU1CT0woc2dfbmVudHMpOworCisvKioKKyAqIHNnX25lbnRzX2Zvcl9sZW4gLSByZXR1cm4gdG90YWwgY291bnQgb2YgZW50cmllcyBpbiBzY2F0dGVybGlzdAorICogICAgICAgICAgICAgICAgICAgIG5lZWRlZCB0byBzYXRpc2Z5IHRoZSBzdXBwbGllZCBsZW5ndGgKKyAqIEBzZzoJCVRoZSBzY2F0dGVybGlzdAorICogQGxlbjoJVGhlIHRvdGFsIHJlcXVpcmVkIGxlbmd0aAorICoKKyAqIERlc2NyaXB0aW9uOgorICogRGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gc2cgdGhhdCBhcmUgcmVxdWlyZWQgdG8gbWVldAorICogdGhlIHN1cHBsaWVkIGxlbmd0aCwgdGFraW5nIGludG8gYWNvdW50IGNoYWluaW5nIGFzIHdlbGwKKyAqCisgKiBSZXR1cm5zOgorICogICB0aGUgbnVtYmVyIG9mIHNnIGVudHJpZXMgbmVlZGVkLCBuZWdhdGl2ZSBlcnJvciBvbiBmYWlsdXJlCisgKgorICoqLworaW50IHNnX25lbnRzX2Zvcl9sZW4oc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgdTY0IGxlbikKK3sKKwlpbnQgbmVudHM7CisJdTY0IHRvdGFsOworCisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJZm9yIChuZW50cyA9IDAsIHRvdGFsID0gMDsgc2c7IHNnID0gc2dfbmV4dChzZykpIHsKKwkJbmVudHMrKzsKKwkJdG90YWwgKz0gc2ctPmxlbmd0aDsKKwkJaWYgKHRvdGFsID49IGxlbikKKwkJCXJldHVybiBuZW50czsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK0VYUE9SVF9TWU1CT0woc2dfbmVudHNfZm9yX2xlbik7CisKKy8qKgorICogc2dfbGFzdCAtIHJldHVybiB0aGUgbGFzdCBzY2F0dGVybGlzdCBlbnRyeSBpbiBhIGxpc3QKKyAqIEBzZ2w6CUZpcnN0IGVudHJ5IGluIHRoZSBzY2F0dGVybGlzdAorICogQG5lbnRzOglOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2NhdHRlcmxpc3QKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqICAgU2hvdWxkIG9ubHkgYmUgdXNlZCBjYXN1YWxseSwgaXQgKGN1cnJlbnRseSkgc2NhbnMgdGhlIGVudGlyZSBsaXN0CisgKiAgIHRvIGdldCB0aGUgbGFzdCBlbnRyeS4KKyAqCisgKiAgIE5vdGUgdGhhdCB0aGUgQHNnbEAgcG9pbnRlciBwYXNzZWQgaW4gbmVlZCBub3QgYmUgdGhlIGZpcnN0IG9uZSwKKyAqICAgdGhlIGltcG9ydGFudCBiaXQgaXMgdGhhdCBAbmVudHNAIGRlbm90ZXMgdGhlIG51bWJlciBvZiBlbnRyaWVzIHRoYXQKKyAqICAgZXhpc3QgZnJvbSBAc2dsQC4KKyAqCisgKiovCitzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX2xhc3Qoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBuZW50cykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCAqcmV0ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbnRzLCBpKQorCQlyZXQgPSBzZzsKKworI2lmZGVmIENPTkZJR19ERUJVR19TRworCUJVR19PTihzZ2xbMF0uc2dfbWFnaWMgIT0gU0dfTUFHSUMpOworCUJVR19PTighc2dfaXNfbGFzdChyZXQpKTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNnX2xhc3QpOworCisvKioKKyAqIHNnX2luaXRfdGFibGUgLSBJbml0aWFsaXplIFNHIHRhYmxlCisgKiBAc2dsOgkgICBUaGUgU0cgdGFibGUKKyAqIEBuZW50czoJICAgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGFibGUKKyAqCisgKiBOb3RlczoKKyAqICAgSWYgdGhpcyBpcyBwYXJ0IG9mIGEgY2hhaW5lZCBzZyB0YWJsZSwgc2dfbWFya19lbmQoKSBzaG91bGQgYmUKKyAqICAgdXNlZCBvbmx5IG9uIHRoZSBsYXN0IHRhYmxlIHBhcnQuCisgKgorICoqLwordm9pZCBzZ19pbml0X3RhYmxlKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgbmVudHMpCit7CisJbWVtc2V0KHNnbCwgMCwgc2l6ZW9mKCpzZ2wpICogbmVudHMpOworI2lmZGVmIENPTkZJR19ERUJVR19TRworCXsKKwkJdW5zaWduZWQgaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBuZW50czsgaSsrKQorCQkJc2dsW2ldLnNnX21hZ2ljID0gU0dfTUFHSUM7CisJfQorI2VuZGlmCisJc2dfbWFya19lbmQoJnNnbFtuZW50cyAtIDFdKTsKK30KK0VYUE9SVF9TWU1CT0woc2dfaW5pdF90YWJsZSk7CisKKy8qKgorICogc2dfaW5pdF9vbmUgLSBJbml0aWFsaXplIGEgc2luZ2xlIGVudHJ5IHNnIGxpc3QKKyAqIEBzZzoJCSBTRyBlbnRyeQorICogQGJ1ZjoJIFZpcnR1YWwgYWRkcmVzcyBmb3IgSU8KKyAqIEBidWZsZW46CSBJTyBsZW5ndGgKKyAqCisgKiovCit2b2lkIHNnX2luaXRfb25lKHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbikKK3sKKwlzZ19pbml0X3RhYmxlKHNnLCAxKTsKKwlzZ19zZXRfYnVmKHNnLCBidWYsIGJ1Zmxlbik7Cit9CitFWFBPUlRfU1lNQk9MKHNnX2luaXRfb25lKTsKKworLyoKKyAqIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBzZ19hbGxvY190YWJsZSgpIGlzIHRvIHVzZSB0aGVzZSBrbWFsbG9jL2tmcmVlCisgKiBoZWxwZXJzLgorICovCitzdGF0aWMgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19rbWFsbG9jKHVuc2lnbmVkIGludCBuZW50cywgZ2ZwX3QgZ2ZwX21hc2spCit7CisJaWYgKG5lbnRzID09IFNHX01BWF9TSU5HTEVfQUxMT0MpIHsKKwkJLyoKKwkJICogS21lbWxlYWsgZG9lc24ndCB0cmFjayBwYWdlIGFsbG9jYXRpb25zIGFzIHRoZXkgYXJlIG5vdAorCQkgKiBjb21tb25seSB1c2VkIChpbiBhIHJhdyBmb3JtKSBmb3Iga2VybmVsIGRhdGEgc3RydWN0dXJlcy4KKwkJICogQXMgd2UgY2hhaW4gdG9nZXRoZXIgYSBsaXN0IG9mIHBhZ2VzIGFuZCB0aGVuIGEgbm9ybWFsCisJCSAqIGttYWxsb2MgKHRyYWNrZWQgYnkga21lbWxlYWspLCBpbiBvcmRlciB0byBmb3IgdGhhdCBsYXN0CisJCSAqIGFsbG9jYXRpb24gbm90IHRvIGJlY29tZSBkZWNvdXBsZWQgKGFuZCB0aHVzIGEKKwkJICogZmFsc2UtcG9zaXRpdmUpIHdlIG5lZWQgdG8gaW5mb3JtIGttZW1sZWFrIG9mIGFsbCB0aGUKKwkJICogaW50ZXJtZWRpYXRlIGFsbG9jYXRpb25zLgorCQkgKi8KKwkJdm9pZCAqcHRyID0gKHZvaWQgKikgX19nZXRfZnJlZV9wYWdlKGdmcF9tYXNrKTsKKwkJa21lbWxlYWtfYWxsb2MocHRyLCBQQUdFX1NJWkUsIDEsIGdmcF9tYXNrKTsKKwkJcmV0dXJuIHB0cjsKKwl9IGVsc2UKKwkJcmV0dXJuIGttYWxsb2MobmVudHMgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSwgZ2ZwX21hc2spOworfQorCitzdGF0aWMgdm9pZCBzZ19rZnJlZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbmVudHMpCit7CisJaWYgKG5lbnRzID09IFNHX01BWF9TSU5HTEVfQUxMT0MpIHsKKwkJa21lbWxlYWtfZnJlZShzZyk7CisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgc2cpOworCX0gZWxzZQorCQlrZnJlZShzZyk7Cit9CisKKy8qKgorICogX19zZ19mcmVlX3RhYmxlIC0gRnJlZSBhIHByZXZpb3VzbHkgbWFwcGVkIHNnIHRhYmxlCisgKiBAdGFibGU6CVRoZSBzZyB0YWJsZSBoZWFkZXIgdG8gdXNlCisgKiBAbWF4X2VudHM6CVRoZSBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHBlciBzaW5nbGUgc2NhdHRlcmxpc3QKKyAqIEBza2lwX2ZpcnN0X2NodW5rOiBkb24ndCBmcmVlIHRoZSAocHJlYWxsb2NhdGVkKSBmaXJzdCBzY2F0dGVybGlzdCBjaHVuaworICogQGZyZWVfZm46CUZyZWUgZnVuY3Rpb24KKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBGcmVlIGFuIHNnIHRhYmxlIHByZXZpb3VzbHkgYWxsb2NhdGVkIGFuZCBzZXR1cCB3aXRoCisgKiAgICBfX3NnX2FsbG9jX3RhYmxlKCkuICBUaGUgQG1heF9lbnRzIHZhbHVlIG11c3QgYmUgaWRlbnRpY2FsIHRvCisgKiAgICB0aGF0IHByZXZpb3VzbHkgdXNlZCB3aXRoIF9fc2dfYWxsb2NfdGFibGUoKS4KKyAqCisgKiovCit2b2lkIF9fc2dfZnJlZV90YWJsZShzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbWF4X2VudHMsCisJCSAgICAgYm9vbCBza2lwX2ZpcnN0X2NodW5rLCBzZ19mcmVlX2ZuICpmcmVlX2ZuKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCAqbmV4dDsKKworCWlmICh1bmxpa2VseSghdGFibGUtPnNnbCkpCisJCXJldHVybjsKKworCXNnbCA9IHRhYmxlLT5zZ2w7CisJd2hpbGUgKHRhYmxlLT5vcmlnX25lbnRzKSB7CisJCXVuc2lnbmVkIGludCBhbGxvY19zaXplID0gdGFibGUtPm9yaWdfbmVudHM7CisJCXVuc2lnbmVkIGludCBzZ19zaXplOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgbW9yZSB0aGFuIG1heF9lbnRzIHNlZ21lbnRzIGxlZnQsCisJCSAqIHRoZW4gYXNzaWduICduZXh0JyB0byB0aGUgc2cgdGFibGUgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lLgorCQkgKiBzZ19zaXplIGlzIHRoZW4gb25lIGxlc3MgdGhhbiBhbGxvYyBzaXplLCBzaW5jZSB0aGUgbGFzdAorCQkgKiBlbGVtZW50IGlzIHRoZSBjaGFpbiBwb2ludGVyLgorCQkgKi8KKwkJaWYgKGFsbG9jX3NpemUgPiBtYXhfZW50cykgeworCQkJbmV4dCA9IHNnX2NoYWluX3B0cigmc2dsW21heF9lbnRzIC0gMV0pOworCQkJYWxsb2Nfc2l6ZSA9IG1heF9lbnRzOworCQkJc2dfc2l6ZSA9IGFsbG9jX3NpemUgLSAxOworCQl9IGVsc2UgeworCQkJc2dfc2l6ZSA9IGFsbG9jX3NpemU7CisJCQluZXh0ID0gTlVMTDsKKwkJfQorCisJCXRhYmxlLT5vcmlnX25lbnRzIC09IHNnX3NpemU7CisJCWlmIChza2lwX2ZpcnN0X2NodW5rKQorCQkJc2tpcF9maXJzdF9jaHVuayA9IGZhbHNlOworCQllbHNlCisJCQlmcmVlX2ZuKHNnbCwgYWxsb2Nfc2l6ZSk7CisJCXNnbCA9IG5leHQ7CisJfQorCisJdGFibGUtPnNnbCA9IE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKF9fc2dfZnJlZV90YWJsZSk7CisKKy8qKgorICogc2dfZnJlZV90YWJsZSAtIEZyZWUgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzZyB0YWJsZQorICogQHRhYmxlOglUaGUgbWFwcGVkIHNnIHRhYmxlIGhlYWRlcgorICoKKyAqKi8KK3ZvaWQgc2dfZnJlZV90YWJsZShzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlKQoreworCV9fc2dfZnJlZV90YWJsZSh0YWJsZSwgU0dfTUFYX1NJTkdMRV9BTExPQywgZmFsc2UsIHNnX2tmcmVlKTsKK30KK0VYUE9SVF9TWU1CT0woc2dfZnJlZV90YWJsZSk7CisKKy8qKgorICogX19zZ19hbGxvY190YWJsZSAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIHNnIHRhYmxlIHdpdGggZ2l2ZW4gYWxsb2NhdG9yCisgKiBAdGFibGU6CVRoZSBzZyB0YWJsZSBoZWFkZXIgdG8gdXNlCisgKiBAbmVudHM6CU51bWJlciBvZiBlbnRyaWVzIGluIHNnIGxpc3QKKyAqIEBtYXhfZW50czoJVGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdGhlIGFsbG9jYXRvciByZXR1cm5zIHBlciBjYWxsCisgKiBAZ2ZwX21hc2s6CUdGUCBhbGxvY2F0aW9uIG1hc2sKKyAqIEBhbGxvY19mbjoJQWxsb2NhdG9yIHRvIHVzZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBAdGFibGUgQG5lbnRzIGxvbmcuIFRoZSBhbGxvY2F0b3IgaXMKKyAqICAgZGVmaW5lZCB0byByZXR1cm4gc2NhdHRlcmxpc3QgY2h1bmtzIG9mIG1heGltdW0gc2l6ZSBAbWF4X2VudHMuCisgKiAgIFRodXMgaWYgQG5lbnRzIGlzIGJpZ2dlciB0aGFuIEBtYXhfZW50cywgdGhlIHNjYXR0ZXJsaXN0cyB3aWxsIGJlCisgKiAgIGNoYWluZWQgaW4gdW5pdHMgb2YgQG1heF9lbnRzLgorICoKKyAqIE5vdGVzOgorICogICBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbm9uLTAgKGVnIGZhaWx1cmUpLCB0aGUgY2FsbGVyIG11c3QgY2FsbAorICogICBfX3NnX2ZyZWVfdGFibGUoKSB0byBjbGVhbnVwIGFueSBsZWZ0b3ZlciBhbGxvY2F0aW9ucy4KKyAqCisgKiovCitpbnQgX19zZ19hbGxvY190YWJsZShzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlLCB1bnNpZ25lZCBpbnQgbmVudHMsCisJCSAgICAgdW5zaWduZWQgaW50IG1heF9lbnRzLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmZpcnN0X2NodW5rLAorCQkgICAgIGdmcF90IGdmcF9tYXNrLCBzZ19hbGxvY19mbiAqYWxsb2NfZm4pCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywgKnBydjsKKwl1bnNpZ25lZCBpbnQgbGVmdDsKKworCW1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKCp0YWJsZSkpOworCisJaWYgKG5lbnRzID09IDApCisJCXJldHVybiAtRUlOVkFMOworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVNfU0dfQ0hBSU4KKwlpZiAoV0FSTl9PTl9PTkNFKG5lbnRzID4gbWF4X2VudHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKyNlbmRpZgorCisJbGVmdCA9IG5lbnRzOworCXBydiA9IE5VTEw7CisJZG8geworCQl1bnNpZ25lZCBpbnQgc2dfc2l6ZSwgYWxsb2Nfc2l6ZSA9IGxlZnQ7CisKKwkJaWYgKGFsbG9jX3NpemUgPiBtYXhfZW50cykgeworCQkJYWxsb2Nfc2l6ZSA9IG1heF9lbnRzOworCQkJc2dfc2l6ZSA9IGFsbG9jX3NpemUgLSAxOworCQl9IGVsc2UKKwkJCXNnX3NpemUgPSBhbGxvY19zaXplOworCisJCWxlZnQgLT0gc2dfc2l6ZTsKKworCQlpZiAoZmlyc3RfY2h1bmspIHsKKwkJCXNnID0gZmlyc3RfY2h1bms7CisJCQlmaXJzdF9jaHVuayA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlzZyA9IGFsbG9jX2ZuKGFsbG9jX3NpemUsIGdmcF9tYXNrKTsKKwkJfQorCQlpZiAodW5saWtlbHkoIXNnKSkgeworCQkJLyoKKwkJCSAqIEFkanVzdCBlbnRyeSBjb3VudCB0byByZWZsZWN0IHRoYXQgdGhlIGxhc3QKKwkJCSAqIGVudHJ5IG9mIHRoZSBwcmV2aW91cyB0YWJsZSB3b24ndCBiZSB1c2VkIGZvcgorCQkJICogbGlua2FnZS4gIFdpdGhvdXQgdGhpcywgc2dfa2ZyZWUoKSBtYXkgZ2V0CisJCQkgKiBjb25mdXNlZC4KKwkJCSAqLworCQkJaWYgKHBydikKKwkJCQl0YWJsZS0+bmVudHMgPSArK3RhYmxlLT5vcmlnX25lbnRzOworCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXNnX2luaXRfdGFibGUoc2csIGFsbG9jX3NpemUpOworCQl0YWJsZS0+bmVudHMgPSB0YWJsZS0+b3JpZ19uZW50cyArPSBzZ19zaXplOworCisJCS8qCisJCSAqIElmIHRoaXMgaXMgdGhlIGZpcnN0IG1hcHBpbmcsIGFzc2lnbiB0aGUgc2cgdGFibGUgaGVhZGVyLgorCQkgKiBJZiB0aGlzIGlzIG5vdCB0aGUgZmlyc3QgbWFwcGluZywgY2hhaW4gcHJldmlvdXMgcGFydC4KKwkJICovCisJCWlmIChwcnYpCisJCQlzZ19jaGFpbihwcnYsIG1heF9lbnRzLCBzZyk7CisJCWVsc2UKKwkJCXRhYmxlLT5zZ2wgPSBzZzsKKworCQkvKgorCQkgKiBJZiBubyBtb3JlIGVudHJpZXMgYWZ0ZXIgdGhpcyBvbmUsIG1hcmsgdGhlIGVuZAorCQkgKi8KKwkJaWYgKCFsZWZ0KQorCQkJc2dfbWFya19lbmQoJnNnW3NnX3NpemUgLSAxXSk7CisKKwkJcHJ2ID0gc2c7CisJfSB3aGlsZSAobGVmdCk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woX19zZ19hbGxvY190YWJsZSk7CisKKy8qKgorICogc2dfYWxsb2NfdGFibGUgLSBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBzZyB0YWJsZQorICogQHRhYmxlOglUaGUgc2cgdGFibGUgaGVhZGVyIHRvIHVzZQorICogQG5lbnRzOglOdW1iZXIgb2YgZW50cmllcyBpbiBzZyBsaXN0CisgKiBAZ2ZwX21hc2s6CUdGUCBhbGxvY2F0aW9uIG1hc2sKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBzZyB0YWJsZS4gSWYgQG5lbnRzQCBpcyBsYXJnZXIgdGhhbgorICogICAgU0dfTUFYX1NJTkdMRV9BTExPQyBhIGNoYWluZWQgc2cgdGFibGUgd2lsbCBiZSBzZXR1cC4KKyAqCisgKiovCitpbnQgc2dfYWxsb2NfdGFibGUoc3RydWN0IHNnX3RhYmxlICp0YWJsZSwgdW5zaWduZWQgaW50IG5lbnRzLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19zZ19hbGxvY190YWJsZSh0YWJsZSwgbmVudHMsIFNHX01BWF9TSU5HTEVfQUxMT0MsCisJCQkgICAgICAgTlVMTCwgZ2ZwX21hc2ssIHNnX2ttYWxsb2MpOworCWlmICh1bmxpa2VseShyZXQpKQorCQlfX3NnX2ZyZWVfdGFibGUodGFibGUsIFNHX01BWF9TSU5HTEVfQUxMT0MsIGZhbHNlLCBzZ19rZnJlZSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChzZ19hbGxvY190YWJsZSk7CisKKy8qKgorICogc2dfYWxsb2NfdGFibGVfZnJvbV9wYWdlcyAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIHNnIHRhYmxlIGZyb20KKyAqCQkJICAgICAgIGFuIGFycmF5IG9mIHBhZ2VzCisgKiBAc2d0OglUaGUgc2cgdGFibGUgaGVhZGVyIHRvIHVzZQorICogQHBhZ2VzOglQb2ludGVyIHRvIGFuIGFycmF5IG9mIHBhZ2UgcG9pbnRlcnMKKyAqIEBuX3BhZ2VzOglOdW1iZXIgb2YgcGFnZXMgaW4gdGhlIHBhZ2VzIGFycmF5CisgKiBAb2Zmc2V0OiAgICAgT2Zmc2V0IGZyb20gc3RhcnQgb2YgdGhlIGZpcnN0IHBhZ2UgdG8gdGhlIHN0YXJ0IG9mIGEgYnVmZmVyCisgKiBAc2l6ZTogICAgICAgTnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGluIHRoZSBidWZmZXIgKGFmdGVyIG9mZnNldCkKKyAqIEBnZnBfbWFzazoJR0ZQIGFsbG9jYXRpb24gbWFzaworICoKKyAqICBEZXNjcmlwdGlvbjoKKyAqICAgIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFuIHNnIHRhYmxlIGZyb20gYSBsaXN0IG9mIHBhZ2VzLiBDb250aWd1b3VzCisgKiAgICByYW5nZXMgb2YgdGhlIHBhZ2VzIGFyZSBzcXVhc2hlZCBpbnRvIGEgc2luZ2xlIHNjYXR0ZXJsaXN0IG5vZGUuIEEgdXNlcgorICogICAgbWF5IHByb3ZpZGUgYW4gb2Zmc2V0IGF0IGEgc3RhcnQgYW5kIGEgc2l6ZSBvZiB2YWxpZCBkYXRhIGluIGEgYnVmZmVyCisgKiAgICBzcGVjaWZpZWQgYnkgdGhlIHBhZ2UgYXJyYXkuIFRoZSByZXR1cm5lZCBzZyB0YWJsZSBpcyByZWxlYXNlZCBieQorICogICAgc2dfZnJlZV90YWJsZS4KKyAqCisgKiBSZXR1cm5zOgorICogICAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm9yIG9uIGZhaWx1cmUKKyAqLworaW50IHNnX2FsbG9jX3RhYmxlX2Zyb21fcGFnZXMoc3RydWN0IHNnX3RhYmxlICpzZ3QsCisJc3RydWN0IHBhZ2UgKipwYWdlcywgdW5zaWduZWQgaW50IG5fcGFnZXMsCisJdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKKwlnZnBfdCBnZnBfbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgY2h1bmtzOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBjdXJfcGFnZTsKKwlpbnQgcmV0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKKworCS8qIGNvbXB1dGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgY2h1bmtzICovCisJY2h1bmtzID0gMTsKKwlmb3IgKGkgPSAxOyBpIDwgbl9wYWdlczsgKytpKQorCQlpZiAocGFnZV90b19wZm4ocGFnZXNbaV0pICE9IHBhZ2VfdG9fcGZuKHBhZ2VzW2kgLSAxXSkgKyAxKQorCQkJKytjaHVua3M7CisKKwlyZXQgPSBzZ19hbGxvY190YWJsZShzZ3QsIGNodW5rcywgZ2ZwX21hc2spOworCWlmICh1bmxpa2VseShyZXQpKQorCQlyZXR1cm4gcmV0OworCisJLyogbWVyZ2luZyBjaHVua3MgYW5kIHB1dHRpbmcgdGhlbSBpbnRvIHRoZSBzY2F0dGVybGlzdCAqLworCWN1cl9wYWdlID0gMDsKKwlmb3JfZWFjaF9zZyhzZ3QtPnNnbCwgcywgc2d0LT5vcmlnX25lbnRzLCBpKSB7CisJCXVuc2lnbmVkIGxvbmcgY2h1bmtfc2l6ZTsKKwkJdW5zaWduZWQgaW50IGo7CisKKwkJLyogbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBjaHVuayAqLworCQlmb3IgKGogPSBjdXJfcGFnZSArIDE7IGogPCBuX3BhZ2VzOyArK2opCisJCQlpZiAocGFnZV90b19wZm4ocGFnZXNbal0pICE9CisJCQkgICAgcGFnZV90b19wZm4ocGFnZXNbaiAtIDFdKSArIDEpCisJCQkJYnJlYWs7CisKKwkJY2h1bmtfc2l6ZSA9ICgoaiAtIGN1cl9wYWdlKSA8PCBQQUdFX1NISUZUKSAtIG9mZnNldDsKKwkJc2dfc2V0X3BhZ2UocywgcGFnZXNbY3VyX3BhZ2VdLCBtaW4oc2l6ZSwgY2h1bmtfc2l6ZSksIG9mZnNldCk7CisJCXNpemUgLT0gY2h1bmtfc2l6ZTsKKwkJb2Zmc2V0ID0gMDsKKwkJY3VyX3BhZ2UgPSBqOworCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzZ19hbGxvY190YWJsZV9mcm9tX3BhZ2VzKTsKKworI2lmZGVmIENPTkZJR19TR0xfQUxMT0MKKworLyoqCisgKiBzZ2xfYWxsb2Nfb3JkZXIgLSBhbGxvY2F0ZSBhIHNjYXR0ZXJsaXN0IGFuZCBpdHMgcGFnZXMKKyAqIEBsZW5ndGg6IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgc2NhdHRlcmxpc3QuIE11c3QgYmUgYXQgbGVhc3Qgb25lCisgKiBAb3JkZXI6IFNlY29uZCBhcmd1bWVudCBmb3IgYWxsb2NfcGFnZXMoKQorICogQGNoYWluYWJsZTogV2hldGhlciBvciBub3QgdG8gYWxsb2NhdGUgYW4gZXh0cmEgZWxlbWVudCBpbiB0aGUgc2NhdHRlcmxpc3QKKyAqCWZvciBzY2F0dGVybGlzdCBjaGFpbmluZyBwdXJwb3NlcworICogQGdmcDogTWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKKyAqIEBuZW50X3A6IFtvdXRdIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzY2F0dGVybGlzdCB0aGF0IGhhdmUgcGFnZXMKKyAqCisgKiBSZXR1cm5zOiBBIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgc2NhdHRlcmxpc3Qgb3IgJU5VTEwgdXBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbF9hbGxvY19vcmRlcih1bnNpZ25lZCBsb25nIGxvbmcgbGVuZ3RoLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgb3JkZXIsIGJvb2wgY2hhaW5hYmxlLAorCQkJCSAgICBnZnBfdCBnZnAsIHVuc2lnbmVkIGludCAqbmVudF9wKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCAqc2c7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgaW50IG5lbnQsIG5hbGxvYzsKKwl1MzIgZWxlbV9sZW47CisKKwluZW50ID0gcm91bmRfdXAobGVuZ3RoLCBQQUdFX1NJWkUgPDwgb3JkZXIpID4+IChQQUdFX1NISUZUICsgb3JkZXIpOworCS8qIENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJaWYgKGxlbmd0aCA+IChuZW50IDw8IChQQUdFX1NISUZUICsgb3JkZXIpKSkKKwkJcmV0dXJuIE5VTEw7CisJbmFsbG9jID0gbmVudDsKKwlpZiAoY2hhaW5hYmxlKSB7CisJCS8qIENoZWNrIGZvciBpbnRlZ2VyIG92ZXJmbG93ICovCisJCWlmIChuYWxsb2MgKyAxIDwgbmFsbG9jKQorCQkJcmV0dXJuIE5VTEw7CisJCW5hbGxvYysrOworCX0KKwlzZ2wgPSBrbWFsbG9jX2FycmF5KG5hbGxvYywgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksCisJCQkgICAgKGdmcCAmIH5HRlBfRE1BKSB8IF9fR0ZQX1pFUk8pOworCWlmICghc2dsKQorCQlyZXR1cm4gTlVMTDsKKworCXNnX2luaXRfdGFibGUoc2dsLCBuZW50KTsKKwlzZyA9IHNnbDsKKwl3aGlsZSAobGVuZ3RoKSB7CisJCWVsZW1fbGVuID0gbWluX3QodTY0LCBsZW5ndGgsIFBBR0VfU0laRSA8PCBvcmRlcik7CisJCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnAsIG9yZGVyKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlzZ2xfZnJlZShzZ2wpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlzZ19zZXRfcGFnZShzZywgcGFnZSwgZWxlbV9sZW4sIDApOworCQlsZW5ndGggLT0gZWxlbV9sZW47CisJCXNnID0gc2dfbmV4dChzZyk7CisJfQorCVdBUk5fT05fT05DRShzZyk7CisJaWYgKG5lbnRfcCkKKwkJKm5lbnRfcCA9IG5lbnQ7CisJcmV0dXJuIHNnbDsKK30KK0VYUE9SVF9TWU1CT0woc2dsX2FsbG9jX29yZGVyKTsKKworLyoqCisgKiBzZ2xfYWxsb2MgLSBhbGxvY2F0ZSBhIHNjYXR0ZXJsaXN0IGFuZCBpdHMgcGFnZXMKKyAqIEBsZW5ndGg6IExlbmd0aCBpbiBieXRlcyBvZiB0aGUgc2NhdHRlcmxpc3QKKyAqIEBnZnA6IE1lbW9yeSBhbGxvY2F0aW9uIGZsYWdzCisgKiBAbmVudF9wOiBbb3V0XSBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgc2NhdHRlcmxpc3QKKyAqCisgKiBSZXR1cm5zOiBBIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgc2NhdHRlcmxpc3Qgb3IgJU5VTEwgdXBvbiBmYWlsdXJlLgorICovCitzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbF9hbGxvYyh1bnNpZ25lZCBsb25nIGxvbmcgbGVuZ3RoLCBnZnBfdCBnZnAsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgKm5lbnRfcCkKK3sKKwlyZXR1cm4gc2dsX2FsbG9jX29yZGVyKGxlbmd0aCwgMCwgZmFsc2UsIGdmcCwgbmVudF9wKTsKK30KK0VYUE9SVF9TWU1CT0woc2dsX2FsbG9jKTsKKworLyoqCisgKiBzZ2xfZnJlZV9vcmRlciAtIGZyZWUgYSBzY2F0dGVybGlzdCBhbmQgaXRzIHBhZ2VzCisgKiBAc2dsOiBTY2F0dGVybGlzdCB3aXRoIG9uZSBvciBtb3JlIGVsZW1lbnRzCisgKiBAb3JkZXI6IFNlY29uZCBhcmd1bWVudCBmb3IgX19mcmVlX3BhZ2VzKCkKKyAqLwordm9pZCBzZ2xfZnJlZV9vcmRlcihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgaW50IG9yZGVyKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlmb3IgKHNnID0gc2dsOyBzZzsgc2cgPSBzZ19uZXh0KHNnKSkgeworCQlwYWdlID0gc2dfcGFnZShzZyk7CisJCWlmIChwYWdlKQorCQkJX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKKwl9CisJa2ZyZWUoc2dsKTsKK30KK0VYUE9SVF9TWU1CT0woc2dsX2ZyZWVfb3JkZXIpOworCisvKioKKyAqIHNnbF9mcmVlIC0gZnJlZSBhIHNjYXR0ZXJsaXN0IGFuZCBpdHMgcGFnZXMKKyAqIEBzZ2w6IFNjYXR0ZXJsaXN0IHdpdGggb25lIG9yIG1vcmUgZWxlbWVudHMKKyAqLwordm9pZCBzZ2xfZnJlZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCkKK3sKKwlzZ2xfZnJlZV9vcmRlcihzZ2wsIDApOworfQorRVhQT1JUX1NZTUJPTChzZ2xfZnJlZSk7CisKKyNlbmRpZiAvKiBDT05GSUdfU0dMX0FMTE9DICovCisKK3ZvaWQgX19zZ19wYWdlX2l0ZXJfc3RhcnQoc3RydWN0IHNnX3BhZ2VfaXRlciAqcGl0ZXIsCisJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsaXN0LCB1bnNpZ25lZCBpbnQgbmVudHMsCisJCQkgIHVuc2lnbmVkIGxvbmcgcGdvZmZzZXQpCit7CisJcGl0ZXItPl9fcGdfYWR2YW5jZSA9IDA7CisJcGl0ZXItPl9fbmVudHMgPSBuZW50czsKKworCXBpdGVyLT5zZyA9IHNnbGlzdDsKKwlwaXRlci0+c2dfcGdvZmZzZXQgPSBwZ29mZnNldDsKK30KK0VYUE9SVF9TWU1CT0woX19zZ19wYWdlX2l0ZXJfc3RhcnQpOworCitzdGF0aWMgaW50IHNnX3BhZ2VfY291bnQoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZykKK3sKKwlyZXR1cm4gUEFHRV9BTElHTihzZy0+b2Zmc2V0ICsgc2ctPmxlbmd0aCkgPj4gUEFHRV9TSElGVDsKK30KKworYm9vbCBfX3NnX3BhZ2VfaXRlcl9uZXh0KHN0cnVjdCBzZ19wYWdlX2l0ZXIgKnBpdGVyKQoreworCWlmICghcGl0ZXItPl9fbmVudHMgfHwgIXBpdGVyLT5zZykKKwkJcmV0dXJuIGZhbHNlOworCisJcGl0ZXItPnNnX3Bnb2Zmc2V0ICs9IHBpdGVyLT5fX3BnX2FkdmFuY2U7CisJcGl0ZXItPl9fcGdfYWR2YW5jZSA9IDE7CisKKwl3aGlsZSAocGl0ZXItPnNnX3Bnb2Zmc2V0ID49IHNnX3BhZ2VfY291bnQocGl0ZXItPnNnKSkgeworCQlwaXRlci0+c2dfcGdvZmZzZXQgLT0gc2dfcGFnZV9jb3VudChwaXRlci0+c2cpOworCQlwaXRlci0+c2cgPSBzZ19uZXh0KHBpdGVyLT5zZyk7CisJCWlmICghLS1waXRlci0+X19uZW50cyB8fCAhcGl0ZXItPnNnKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChfX3NnX3BhZ2VfaXRlcl9uZXh0KTsKKworLyoqCisgKiBzZ19taXRlcl9zdGFydCAtIHN0YXJ0IG1hcHBpbmcgaXRlcmF0aW9uIG92ZXIgYSBzZyBsaXN0CisgKiBAbWl0ZXI6IHNnIG1hcHBpbmcgaXRlciB0byBiZSBzdGFydGVkCisgKiBAc2dsOiBzZyBsaXN0IHRvIGl0ZXJhdGUgb3ZlcgorICogQG5lbnRzOiBudW1iZXIgb2Ygc2cgZW50cmllcworICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTdGFydHMgbWFwcGluZyBpdGVyYXRvciBAbWl0ZXIuCisgKgorICogQ29udGV4dDoKKyAqICAgRG9uJ3QgY2FyZS4KKyAqLwordm9pZCBzZ19taXRlcl9zdGFydChzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyICptaXRlciwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCSAgICB1bnNpZ25lZCBpbnQgbmVudHMsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwltZW1zZXQobWl0ZXIsIDAsIHNpemVvZihzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyKSk7CisKKwlfX3NnX3BhZ2VfaXRlcl9zdGFydCgmbWl0ZXItPnBpdGVyLCBzZ2wsIG5lbnRzLCAwKTsKKwlXQVJOX09OKCEoZmxhZ3MgJiAoU0dfTUlURVJfVE9fU0cgfCBTR19NSVRFUl9GUk9NX1NHKSkpOworCW1pdGVyLT5fX2ZsYWdzID0gZmxhZ3M7Cit9CitFWFBPUlRfU1lNQk9MKHNnX21pdGVyX3N0YXJ0KTsKKworc3RhdGljIGJvb2wgc2dfbWl0ZXJfZ2V0X25leHRfcGFnZShzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyICptaXRlcikKK3sKKwlpZiAoIW1pdGVyLT5fX3JlbWFpbmluZykgeworCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCisJCWlmICghX19zZ19wYWdlX2l0ZXJfbmV4dCgmbWl0ZXItPnBpdGVyKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlzZyA9IG1pdGVyLT5waXRlci5zZzsKKworCQltaXRlci0+X19vZmZzZXQgPSBtaXRlci0+cGl0ZXIuc2dfcGdvZmZzZXQgPyAwIDogc2ctPm9mZnNldDsKKwkJbWl0ZXItPnBpdGVyLnNnX3Bnb2Zmc2V0ICs9IG1pdGVyLT5fX29mZnNldCA+PiBQQUdFX1NISUZUOworCQltaXRlci0+X19vZmZzZXQgJj0gUEFHRV9TSVpFIC0gMTsKKwkJbWl0ZXItPl9fcmVtYWluaW5nID0gc2ctPm9mZnNldCArIHNnLT5sZW5ndGggLQorCQkJCSAgICAgKG1pdGVyLT5waXRlci5zZ19wZ29mZnNldCA8PCBQQUdFX1NISUZUKSAtCisJCQkJICAgICBtaXRlci0+X19vZmZzZXQ7CisJCW1pdGVyLT5fX3JlbWFpbmluZyA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIG1pdGVyLT5fX3JlbWFpbmluZywKKwkJCQkJICAgUEFHRV9TSVpFIC0gbWl0ZXItPl9fb2Zmc2V0KTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBzZ19taXRlcl9za2lwIC0gcmVwb3NpdGlvbiBtYXBwaW5nIGl0ZXJhdG9yCisgKiBAbWl0ZXI6IHNnIG1hcHBpbmcgaXRlciB0byBiZSBza2lwcGVkCisgKiBAb2Zmc2V0OiBudW1iZXIgb2YgYnl0ZXMgdG8gcGx1cyB0aGUgY3VycmVudCBsb2NhdGlvbgorICoKKyAqIERlc2NyaXB0aW9uOgorICogICBTZXRzIHRoZSBvZmZzZXQgb2YgQG1pdGVyIHRvIGl0cyBjdXJyZW50IGxvY2F0aW9uIHBsdXMgQG9mZnNldCBieXRlcy4KKyAqICAgSWYgbWFwcGluZyBpdGVyYXRvciBAbWl0ZXIgaGFzIGJlZW4gcHJvY2VlZGVkIGJ5IHNnX21pdGVyX25leHQoKSwgdGhpcworICogICBzdG9wcyBAbWl0ZXIuCisgKgorICogQ29udGV4dDoKKyAqICAgRG9uJ3QgY2FyZSBpZiBAbWl0ZXIgaXMgc3RvcHBlZCwgb3Igbm90IHByb2NlZWRlZCB5ZXQuCisgKiAgIE90aGVyd2lzZSwgcHJlZW1wdGlvbiBkaXNhYmxlZCBpZiB0aGUgU0dfTUlURVJfQVRPTUlDIGlzIHNldC4KKyAqCisgKiBSZXR1cm5zOgorICogICB0cnVlIGlmIEBtaXRlciBjb250YWlucyB0aGUgdmFsaWQgbWFwcGluZy4gIGZhbHNlIGlmIGVuZCBvZiBzZworICogICBsaXN0IGlzIHJlYWNoZWQuCisgKi8KK2Jvb2wgc2dfbWl0ZXJfc2tpcChzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyICptaXRlciwgb2ZmX3Qgb2Zmc2V0KQoreworCXNnX21pdGVyX3N0b3AobWl0ZXIpOworCisJd2hpbGUgKG9mZnNldCkgeworCQlvZmZfdCBjb25zdW1lZDsKKworCQlpZiAoIXNnX21pdGVyX2dldF9uZXh0X3BhZ2UobWl0ZXIpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWNvbnN1bWVkID0gbWluX3Qob2ZmX3QsIG9mZnNldCwgbWl0ZXItPl9fcmVtYWluaW5nKTsKKwkJbWl0ZXItPl9fb2Zmc2V0ICs9IGNvbnN1bWVkOworCQltaXRlci0+X19yZW1haW5pbmcgLT0gY29uc3VtZWQ7CisJCW9mZnNldCAtPSBjb25zdW1lZDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0woc2dfbWl0ZXJfc2tpcCk7CisKKy8qKgorICogc2dfbWl0ZXJfbmV4dCAtIHByb2NlZWQgbWFwcGluZyBpdGVyYXRvciB0byB0aGUgbmV4dCBtYXBwaW5nCisgKiBAbWl0ZXI6IHNnIG1hcHBpbmcgaXRlciB0byBwcm9jZWVkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFByb2NlZWRzIEBtaXRlciB0byB0aGUgbmV4dCBtYXBwaW5nLiAgQG1pdGVyIHNob3VsZCBoYXZlIGJlZW4gc3RhcnRlZAorICogICB1c2luZyBzZ19taXRlcl9zdGFydCgpLiAgT24gc3VjY2Vzc2Z1bCByZXR1cm4sIEBtaXRlci0+cGFnZSwKKyAqICAgQG1pdGVyLT5hZGRyIGFuZCBAbWl0ZXItPmxlbmd0aCBwb2ludCB0byB0aGUgY3VycmVudCBtYXBwaW5nLgorICoKKyAqIENvbnRleHQ6CisgKiAgIFByZWVtcHRpb24gZGlzYWJsZWQgaWYgU0dfTUlURVJfQVRPTUlDLiAgUHJlZW1wdGlvbiBtdXN0IHN0YXkgZGlzYWJsZWQKKyAqICAgdGlsbCBAbWl0ZXIgaXMgc3RvcHBlZC4gIE1heSBzbGVlcCBpZiAhU0dfTUlURVJfQVRPTUlDLgorICoKKyAqIFJldHVybnM6CisgKiAgIHRydWUgaWYgQG1pdGVyIGNvbnRhaW5zIHRoZSBuZXh0IG1hcHBpbmcuICBmYWxzZSBpZiBlbmQgb2Ygc2cKKyAqICAgbGlzdCBpcyByZWFjaGVkLgorICovCitib29sIHNnX21pdGVyX25leHQoc3RydWN0IHNnX21hcHBpbmdfaXRlciAqbWl0ZXIpCit7CisJc2dfbWl0ZXJfc3RvcChtaXRlcik7CisKKwkvKgorCSAqIEdldCB0byB0aGUgbmV4dCBwYWdlIGlmIG5lY2Vzc2FyeS4KKwkgKiBfX3JlbWFpbmluZywgX19vZmZzZXQgaXMgYWRqdXN0ZWQgYnkgc2dfbWl0ZXJfc3RvcAorCSAqLworCWlmICghc2dfbWl0ZXJfZ2V0X25leHRfcGFnZShtaXRlcikpCisJCXJldHVybiBmYWxzZTsKKworCW1pdGVyLT5wYWdlID0gc2dfcGFnZV9pdGVyX3BhZ2UoJm1pdGVyLT5waXRlcik7CisJbWl0ZXItPmNvbnN1bWVkID0gbWl0ZXItPmxlbmd0aCA9IG1pdGVyLT5fX3JlbWFpbmluZzsKKworCWlmIChtaXRlci0+X19mbGFncyAmIFNHX01JVEVSX0FUT01JQykKKwkJbWl0ZXItPmFkZHIgPSBrbWFwX2F0b21pYyhtaXRlci0+cGFnZSkgKyBtaXRlci0+X19vZmZzZXQ7CisJZWxzZQorCQltaXRlci0+YWRkciA9IGttYXAobWl0ZXItPnBhZ2UpICsgbWl0ZXItPl9fb2Zmc2V0OworCisJcmV0dXJuIHRydWU7Cit9CitFWFBPUlRfU1lNQk9MKHNnX21pdGVyX25leHQpOworCisvKioKKyAqIHNnX21pdGVyX3N0b3AgLSBzdG9wIG1hcHBpbmcgaXRlcmF0aW9uCisgKiBAbWl0ZXI6IHNnIG1hcHBpbmcgaXRlciB0byBiZSBzdG9wcGVkCisgKgorICogRGVzY3JpcHRpb246CisgKiAgIFN0b3BzIG1hcHBpbmcgaXRlcmF0b3IgQG1pdGVyLiAgQG1pdGVyIHNob3VsZCBoYXZlIGJlZW4gc3RhcnRlZAorICogICB1c2luZyBzZ19taXRlcl9zdGFydCgpLiAgQSBzdG9wcGVkIGl0ZXJhdGlvbiBjYW4gYmUgcmVzdW1lZCBieQorICogICBjYWxsaW5nIHNnX21pdGVyX25leHQoKSBvbiBpdC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVzb3VyY2VzIChrbWFwKQorICogICBuZWVkIHRvIGJlIHJlbGVhc2VkIGR1cmluZyBpdGVyYXRpb24uCisgKgorICogQ29udGV4dDoKKyAqICAgUHJlZW1wdGlvbiBkaXNhYmxlZCBpZiB0aGUgU0dfTUlURVJfQVRPTUlDIGlzIHNldC4gIERvbid0IGNhcmUKKyAqICAgb3RoZXJ3aXNlLgorICovCit2b2lkIHNnX21pdGVyX3N0b3Aoc3RydWN0IHNnX21hcHBpbmdfaXRlciAqbWl0ZXIpCit7CisJV0FSTl9PTihtaXRlci0+Y29uc3VtZWQgPiBtaXRlci0+bGVuZ3RoKTsKKworCS8qIGRyb3AgcmVzb3VyY2VzIGZyb20gdGhlIGxhc3QgaXRlcmF0aW9uICovCisJaWYgKG1pdGVyLT5hZGRyKSB7CisJCW1pdGVyLT5fX29mZnNldCArPSBtaXRlci0+Y29uc3VtZWQ7CisJCW1pdGVyLT5fX3JlbWFpbmluZyAtPSBtaXRlci0+Y29uc3VtZWQ7CisKKwkJaWYgKChtaXRlci0+X19mbGFncyAmIFNHX01JVEVSX1RPX1NHKSAmJgorCQkgICAgIVBhZ2VTbGFiKG1pdGVyLT5wYWdlKSkKKwkJCWZsdXNoX2tlcm5lbF9kY2FjaGVfcGFnZShtaXRlci0+cGFnZSk7CisKKwkJaWYgKG1pdGVyLT5fX2ZsYWdzICYgU0dfTUlURVJfQVRPTUlDKSB7CisJCQlXQVJOX09OX09OQ0UocHJlZW1wdGlibGUoKSk7CisJCQlrdW5tYXBfYXRvbWljKG1pdGVyLT5hZGRyKTsKKwkJfSBlbHNlCisJCQlrdW5tYXAobWl0ZXItPnBhZ2UpOworCisJCW1pdGVyLT5wYWdlID0gTlVMTDsKKwkJbWl0ZXItPmFkZHIgPSBOVUxMOworCQltaXRlci0+bGVuZ3RoID0gMDsKKwkJbWl0ZXItPmNvbnN1bWVkID0gMDsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNnX21pdGVyX3N0b3ApOworCisvKioKKyAqIHNnX2NvcHlfYnVmZmVyIC0gQ29weSBkYXRhIGJldHdlZW4gYSBsaW5lYXIgYnVmZmVyIGFuZCBhbiBTRyBsaXN0CisgKiBAc2dsOgkJIFRoZSBTRyBsaXN0CisgKiBAbmVudHM6CQkgTnVtYmVyIG9mIFNHIGVudHJpZXMKKyAqIEBidWY6CQkgV2hlcmUgdG8gY29weSBmcm9tCisgKiBAYnVmbGVuOgkJIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogQHNraXA6CQkgTnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgYmVmb3JlIGNvcHlpbmcKKyAqIEB0b19idWZmZXI6CQkgdHJhbnNmZXIgZGlyZWN0aW9uICh0cnVlID09IGZyb20gYW4gc2cgbGlzdCB0byBhCisgKgkJCSBidWZmZXIsIGZhbHNlID09IGZyb20gYSBidWZmZXIgdG8gYW4gc2cgbGlzdAorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZWQgYnl0ZXMuCisgKgorICoqLworc2l6ZV90IHNnX2NvcHlfYnVmZmVyKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgbmVudHMsIHZvaWQgKmJ1ZiwKKwkJICAgICAgc2l6ZV90IGJ1Zmxlbiwgb2ZmX3Qgc2tpcCwgYm9vbCB0b19idWZmZXIpCit7CisJdW5zaWduZWQgaW50IG9mZnNldCA9IDA7CisJc3RydWN0IHNnX21hcHBpbmdfaXRlciBtaXRlcjsKKwl1bnNpZ25lZCBpbnQgc2dfZmxhZ3MgPSBTR19NSVRFUl9BVE9NSUM7CisKKwlpZiAodG9fYnVmZmVyKQorCQlzZ19mbGFncyB8PSBTR19NSVRFUl9GUk9NX1NHOworCWVsc2UKKwkJc2dfZmxhZ3MgfD0gU0dfTUlURVJfVE9fU0c7CisKKwlzZ19taXRlcl9zdGFydCgmbWl0ZXIsIHNnbCwgbmVudHMsIHNnX2ZsYWdzKTsKKworCWlmICghc2dfbWl0ZXJfc2tpcCgmbWl0ZXIsIHNraXApKQorCQlyZXR1cm4gZmFsc2U7CisKKwl3aGlsZSAoKG9mZnNldCA8IGJ1ZmxlbikgJiYgc2dfbWl0ZXJfbmV4dCgmbWl0ZXIpKSB7CisJCXVuc2lnbmVkIGludCBsZW47CisKKwkJbGVuID0gbWluKG1pdGVyLmxlbmd0aCwgYnVmbGVuIC0gb2Zmc2V0KTsKKworCQlpZiAodG9fYnVmZmVyKQorCQkJbWVtY3B5KGJ1ZiArIG9mZnNldCwgbWl0ZXIuYWRkciwgbGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KG1pdGVyLmFkZHIsIGJ1ZiArIG9mZnNldCwgbGVuKTsKKworCQlvZmZzZXQgKz0gbGVuOworCX0KKworCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKKworCXJldHVybiBvZmZzZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHNnX2NvcHlfYnVmZmVyKTsKKworLyoqCisgKiBzZ19jb3B5X2Zyb21fYnVmZmVyIC0gQ29weSBmcm9tIGEgbGluZWFyIGJ1ZmZlciB0byBhbiBTRyBsaXN0CisgKiBAc2dsOgkJIFRoZSBTRyBsaXN0CisgKiBAbmVudHM6CQkgTnVtYmVyIG9mIFNHIGVudHJpZXMKKyAqIEBidWY6CQkgV2hlcmUgdG8gY29weSBmcm9tCisgKiBAYnVmbGVuOgkJIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb3BpZWQgYnl0ZXMuCisgKgorICoqLworc2l6ZV90IHNnX2NvcHlfZnJvbV9idWZmZXIoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBuZW50cywKKwkJCSAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKK3sKKwlyZXR1cm4gc2dfY29weV9idWZmZXIoc2dsLCBuZW50cywgKHZvaWQgKilidWYsIGJ1ZmxlbiwgMCwgZmFsc2UpOworfQorRVhQT1JUX1NZTUJPTChzZ19jb3B5X2Zyb21fYnVmZmVyKTsKKworLyoqCisgKiBzZ19jb3B5X3RvX2J1ZmZlciAtIENvcHkgZnJvbSBhbiBTRyBsaXN0IHRvIGEgbGluZWFyIGJ1ZmZlcgorICogQHNnbDoJCSBUaGUgU0cgbGlzdAorICogQG5lbnRzOgkJIE51bWJlciBvZiBTRyBlbnRyaWVzCisgKiBAYnVmOgkJIFdoZXJlIHRvIGNvcHkgdG8KKyAqIEBidWZsZW46CQkgVGhlIG51bWJlciBvZiBieXRlcyB0byBjb3B5CisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcGllZCBieXRlcy4KKyAqCisgKiovCitzaXplX3Qgc2dfY29weV90b19idWZmZXIoc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBuZW50cywKKwkJCSB2b2lkICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJcmV0dXJuIHNnX2NvcHlfYnVmZmVyKHNnbCwgbmVudHMsIGJ1ZiwgYnVmbGVuLCAwLCB0cnVlKTsKK30KK0VYUE9SVF9TWU1CT0woc2dfY29weV90b19idWZmZXIpOworCisvKioKKyAqIHNnX3Bjb3B5X2Zyb21fYnVmZmVyIC0gQ29weSBmcm9tIGEgbGluZWFyIGJ1ZmZlciB0byBhbiBTRyBsaXN0CisgKiBAc2dsOgkJIFRoZSBTRyBsaXN0CisgKiBAbmVudHM6CQkgTnVtYmVyIG9mIFNHIGVudHJpZXMKKyAqIEBidWY6CQkgV2hlcmUgdG8gY29weSBmcm9tCisgKiBAYnVmbGVuOgkJIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weQorICogQHNraXA6CQkgTnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgYmVmb3JlIGNvcHlpbmcKKyAqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29waWVkIGJ5dGVzLgorICoKKyAqKi8KK3NpemVfdCBzZ19wY29weV9mcm9tX2J1ZmZlcihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IG5lbnRzLAorCQkJICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbiwgb2ZmX3Qgc2tpcCkKK3sKKwlyZXR1cm4gc2dfY29weV9idWZmZXIoc2dsLCBuZW50cywgKHZvaWQgKilidWYsIGJ1Zmxlbiwgc2tpcCwgZmFsc2UpOworfQorRVhQT1JUX1NZTUJPTChzZ19wY29weV9mcm9tX2J1ZmZlcik7CisKKy8qKgorICogc2dfcGNvcHlfdG9fYnVmZmVyIC0gQ29weSBmcm9tIGFuIFNHIGxpc3QgdG8gYSBsaW5lYXIgYnVmZmVyCisgKiBAc2dsOgkJIFRoZSBTRyBsaXN0CisgKiBAbmVudHM6CQkgTnVtYmVyIG9mIFNHIGVudHJpZXMKKyAqIEBidWY6CQkgV2hlcmUgdG8gY29weSB0bworICogQGJ1ZmxlbjoJCSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqIEBza2lwOgkJIE51bWJlciBvZiBieXRlcyB0byBza2lwIGJlZm9yZSBjb3B5aW5nCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvcGllZCBieXRlcy4KKyAqCisgKiovCitzaXplX3Qgc2dfcGNvcHlfdG9fYnVmZmVyKHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgbmVudHMsCisJCQkgIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbiwgb2ZmX3Qgc2tpcCkKK3sKKwlyZXR1cm4gc2dfY29weV9idWZmZXIoc2dsLCBuZW50cywgYnVmLCBidWZsZW4sIHNraXAsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChzZ19wY29weV90b19idWZmZXIpOworCisvKioKKyAqIHNnX3plcm9fYnVmZmVyIC0gWmVyby1vdXQgYSBwYXJ0IG9mIGEgU0cgbGlzdAorICogQHNnbDoJCSBUaGUgU0cgbGlzdAorICogQG5lbnRzOgkJIE51bWJlciBvZiBTRyBlbnRyaWVzCisgKiBAYnVmbGVuOgkJIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gemVybyBvdXQKKyAqIEBza2lwOgkJIE51bWJlciBvZiBieXRlcyB0byBza2lwIGJlZm9yZSB6ZXJvaW5nCisgKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHplcm9lZC4KKyAqKi8KK3NpemVfdCBzZ196ZXJvX2J1ZmZlcihzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IG5lbnRzLAorCQkgICAgICAgc2l6ZV90IGJ1Zmxlbiwgb2ZmX3Qgc2tpcCkKK3sKKwl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gMDsKKwlzdHJ1Y3Qgc2dfbWFwcGluZ19pdGVyIG1pdGVyOworCXVuc2lnbmVkIGludCBzZ19mbGFncyA9IFNHX01JVEVSX0FUT01JQyB8IFNHX01JVEVSX1RPX1NHOworCisJc2dfbWl0ZXJfc3RhcnQoJm1pdGVyLCBzZ2wsIG5lbnRzLCBzZ19mbGFncyk7CisKKwlpZiAoIXNnX21pdGVyX3NraXAoJm1pdGVyLCBza2lwKSkKKwkJcmV0dXJuIGZhbHNlOworCisJd2hpbGUgKG9mZnNldCA8IGJ1ZmxlbiAmJiBzZ19taXRlcl9uZXh0KCZtaXRlcikpIHsKKwkJdW5zaWduZWQgaW50IGxlbjsKKworCQlsZW4gPSBtaW4obWl0ZXIubGVuZ3RoLCBidWZsZW4gLSBvZmZzZXQpOworCQltZW1zZXQobWl0ZXIuYWRkciwgMCwgbGVuKTsKKworCQlvZmZzZXQgKz0gbGVuOworCX0KKworCXNnX21pdGVyX3N0b3AoJm1pdGVyKTsKKwlyZXR1cm4gb2Zmc2V0OworfQorRVhQT1JUX1NZTUJPTChzZ196ZXJvX2J1ZmZlcik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zZXFfYnVmLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zZXFfYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFhYmI2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NlcV9idWYuYwpAQCAtMCwwICsxLDMzMCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBzZXFfYnVmLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgUmVkIEhhdCBJbmMsIFN0ZXZlbiBSb3N0ZWR0IDxzcm9zdGVkdEByZWRoYXQuY29tPgorICoKKyAqIFRoZSBzZXFfYnVmIGlzIGEgaGFuZHkgdG9vbCB0aGF0IGFsbG93cyB5b3UgdG8gcGFzcyBhIGRlc2NyaXB0b3IgYXJvdW5kCisgKiB0byBhIGJ1ZmZlciB0aGF0IG90aGVyIGZ1bmN0aW9ucyBjYW4gd3JpdGUgdG8uIEl0IGlzIHNpbWlsYXIgdG8gdGhlCisgKiBzZXFfZmlsZSBmdW5jdGlvbmFsaXR5IGJ1dCBoYXMgc29tZSBkaWZmZXJlbmNlcy4KKyAqCisgKiBUbyB1c2UgaXQsIHRoZSBzZXFfYnVmIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCBzZXFfYnVmX2luaXQoKS4KKyAqIFRoaXMgd2lsbCBzZXQgdXAgdGhlIGNvdW50ZXJzIHdpdGhpbiB0aGUgZGVzY3JpcHRvci4gWW91IGNhbiBjYWxsCisgKiBzZXFfYnVmX2luaXQoKSBtb3JlIHRoYW4gb25jZSB0byByZXNldCB0aGUgc2VxX2J1ZiB0byBzdGFydAorICogZnJvbSBzY3JhdGNoLgorICovCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2J1Zi5oPgorCisvKioKKyAqIHNlcV9idWZfY2FuX2ZpdCAtIGNhbiB0aGUgbmV3IGRhdGEgZml0IGluIHRoZSBjdXJyZW50IGJ1ZmZlcj8KKyAqIEBzOiB0aGUgc2VxX2J1ZiBkZXNjcmlwdG9yCisgKiBAbGVuOiBUaGUgbGVuZ3RoIHRvIHNlZSBpZiBpdCBjYW4gZml0IGluIHRoZSBjdXJyZW50IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSdzIGVub3VnaCB1bnVzZWQgc3BhY2UgaW4gdGhlIHNlcV9idWYgYnVmZmVyCisgKiB0byBmaXQgdGhlIGFtb3VudCBvZiBuZXcgZGF0YSBhY2NvcmRpbmcgdG8gQGxlbi4KKyAqLworc3RhdGljIGJvb2wgc2VxX2J1Zl9jYW5fZml0KHN0cnVjdCBzZXFfYnVmICpzLCBzaXplX3QgbGVuKQoreworCXJldHVybiBzLT5sZW4gKyBsZW4gPD0gcy0+c2l6ZTsKK30KKworLyoqCisgKiBzZXFfYnVmX3ByaW50X3NlcSAtIG1vdmUgdGhlIGNvbnRlbnRzIG9mIHNlcV9idWYgaW50byBhIHNlcV9maWxlCisgKiBAbTogdGhlIHNlcV9maWxlIGRlc2NyaXB0b3IgdGhhdCBpcyB0aGUgZGVzdGluYXRpb24KKyAqIEBzOiB0aGUgc2VxX2J1ZiBkZXNjcmlwdG9yIHRoYXQgaXMgdGhlIHNvdXJjZS4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2Vzcywgbm9uIHplcm8gb3RoZXJ3aXNlCisgKi8KK2ludCBzZXFfYnVmX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzZXFfYnVmICpzKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBzZXFfYnVmX3VzZWQocyk7CisKKwlyZXR1cm4gc2VxX3dyaXRlKG0sIHMtPmJ1ZmZlciwgbGVuKTsKK30KKworLyoqCisgKiBzZXFfYnVmX3ZwcmludGYgLSBzZXF1ZW5jZSBwcmludGluZyBvZiBpbmZvcm1hdGlvbi4KKyAqIEBzOiBzZXFfYnVmIGRlc2NyaXB0b3IKKyAqIEBmbXQ6IHByaW50ZiBmb3JtYXQgc3RyaW5nCisgKiBAYXJnczogdmFfbGlzdCBvZiBhcmd1bWVudHMgZnJvbSBhIHByaW50ZigpIHR5cGUgZnVuY3Rpb24KKyAqCisgKiBXcml0ZXMgYSB2bnByaW50ZigpIGZvcm1hdCBpbnRvIHRoZSBzZXF1ZW5jY2UgYnVmZmVyLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBvdmVyZmxvdy4KKyAqLworaW50IHNlcV9idWZfdnByaW50ZihzdHJ1Y3Qgc2VxX2J1ZiAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IGxlbjsKKworCVdBUk5fT04ocy0+c2l6ZSA9PSAwKTsKKworCWlmIChzLT5sZW4gPCBzLT5zaXplKSB7CisJCWxlbiA9IHZzbnByaW50ZihzLT5idWZmZXIgKyBzLT5sZW4sIHMtPnNpemUgLSBzLT5sZW4sIGZtdCwgYXJncyk7CisJCWlmIChzLT5sZW4gKyBsZW4gPCBzLT5zaXplKSB7CisJCQlzLT5sZW4gKz0gbGVuOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJc2VxX2J1Zl9zZXRfb3ZlcmZsb3cocyk7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIHNlcV9idWZfcHJpbnRmIC0gc2VxdWVuY2UgcHJpbnRpbmcgb2YgaW5mb3JtYXRpb24KKyAqIEBzOiBzZXFfYnVmIGRlc2NyaXB0b3IKKyAqIEBmbXQ6IHByaW50ZiBmb3JtYXQgc3RyaW5nCisgKgorICogV3JpdGVzIGEgcHJpbnRmKCkgZm9ybWF0IGludG8gdGhlIHNlcXVlbmNlIGJ1ZmZlci4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgb24gb3ZlcmZsb3cuCisgKi8KK2ludCBzZXFfYnVmX3ByaW50ZihzdHJ1Y3Qgc2VxX2J1ZiAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmV0OworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmV0ID0gc2VxX2J1Zl92cHJpbnRmKHMsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX0JJTkFSWV9QUklOVEYKKy8qKgorICogc2VxX2J1Zl9icHJpbnRmIC0gV3JpdGUgdGhlIHByaW50ZiBzdHJpbmcgZnJvbSBiaW5hcnkgYXJndW1lbnRzCisgKiBAczogc2VxX2J1ZiBkZXNjcmlwdG9yCisgKiBAZm10OiBUaGUgZm9ybWF0IHN0cmluZyBmb3IgdGhlIEBiaW5hcnkgYXJndW1lbnRzCisgKiBAYmluYXJ5OiBUaGUgYmluYXJ5IGFyZ3VtZW50cyBmb3IgQGZtdC4KKyAqCisgKiBXaGVuIHJlY29yZGluZyBpbiBhIGZhc3QgcGF0aCwgYSBwcmludGYgbWF5IGJlIHJlY29yZGVkIHdpdGgganVzdAorICogc2F2aW5nIHRoZSBmb3JtYXQgYW5kIHRoZSBhcmd1bWVudHMgYXMgdGhleSB3ZXJlIHBhc3NlZCB0byB0aGUKKyAqIGZ1bmN0aW9uLCBpbnN0ZWFkIG9mIHdhc3RpbmcgY3ljbGVzIGNvbnZlcnRpbmcgdGhlIGFyZ3VtZW50cyBpbnRvCisgKiBBU0NJSSBjaGFyYWN0ZXJzLiBJbnN0ZWFkLCB0aGUgYXJndW1lbnRzIGFyZSBzYXZlZCBpbiBhIDMyIGJpdAorICogd29yZCBhcnJheSB0aGF0IGlzIGRlZmluZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgY29uc3RyYWludHMuCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgdGhlIGZvcm1hdCBhbmQgdGhlIGJpbmFyeSBhcnJheSBhbmQgZmluaXNoCisgKiB0aGUgY29udmVyc2lvbiBpbnRvIHRoZSBBU0NJSSBzdHJpbmcgd2l0aGluIHRoZSBidWZmZXIuCisgKgorICogUmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIC0xIG9uIG92ZXJmbG93LgorICovCitpbnQgc2VxX2J1Zl9icHJpbnRmKHN0cnVjdCBzZXFfYnVmICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KQoreworCXVuc2lnbmVkIGludCBsZW4gPSBzZXFfYnVmX2J1ZmZlcl9sZWZ0KHMpOworCWludCByZXQ7CisKKwlXQVJOX09OKHMtPnNpemUgPT0gMCk7CisKKwlpZiAocy0+bGVuIDwgcy0+c2l6ZSkgeworCQlyZXQgPSBic3RyX3ByaW50ZihzLT5idWZmZXIgKyBzLT5sZW4sIGxlbiwgZm10LCBiaW5hcnkpOworCQlpZiAocy0+bGVuICsgcmV0IDwgcy0+c2l6ZSkgeworCQkJcy0+bGVuICs9IHJldDsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXNlcV9idWZfc2V0X292ZXJmbG93KHMpOworCXJldHVybiAtMTsKK30KKyNlbmRpZiAvKiBDT05GSUdfQklOQVJZX1BSSU5URiAqLworCisvKioKKyAqIHNlcV9idWZfcHV0cyAtIHNlcXVlbmNlIHByaW50aW5nIG9mIHNpbXBsZSBzdHJpbmcKKyAqIEBzOiBzZXFfYnVmIGRlc2NyaXB0b3IKKyAqIEBzdHI6IHNpbXBsZSBzdHJpbmcgdG8gcmVjb3JkCisgKgorICogQ29weSBhIHNpbXBsZSBzdHJpbmcgaW50byB0aGUgc2VxdWVuY2UgYnVmZmVyLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBvdmVyZmxvdworICovCitpbnQgc2VxX2J1Zl9wdXRzKHN0cnVjdCBzZXFfYnVmICpzLCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IHN0cmxlbihzdHIpOworCisJV0FSTl9PTihzLT5zaXplID09IDApOworCisJLyogQWRkIDEgdG8gbGVuIGZvciB0aGUgdHJhaWxpbmcgbnVsbCBieXRlIHdoaWNoIG11c3QgYmUgdGhlcmUgKi8KKwlsZW4gKz0gMTsKKworCWlmIChzZXFfYnVmX2Nhbl9maXQocywgbGVuKSkgeworCQltZW1jcHkocy0+YnVmZmVyICsgcy0+bGVuLCBzdHIsIGxlbik7CisJCS8qIERvbid0IGNvdW50IHRoZSB0cmFpbGluZyBudWxsIGJ5dGUgYWdhaW5zdCB0aGUgY2FwYWNpdHkgKi8KKwkJcy0+bGVuICs9IGxlbiAtIDE7CisJCXJldHVybiAwOworCX0KKwlzZXFfYnVmX3NldF9vdmVyZmxvdyhzKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogc2VxX2J1Zl9wdXRjIC0gc2VxdWVuY2UgcHJpbnRpbmcgb2Ygc2ltcGxlIGNoYXJhY3RlcgorICogQHM6IHNlcV9idWYgZGVzY3JpcHRvcgorICogQGM6IHNpbXBsZSBjaGFyYWN0ZXIgdG8gcmVjb3JkCisgKgorICogQ29weSBhIHNpbmdsZSBjaGFyYWN0ZXIgaW50byB0aGUgc2VxdWVuY2UgYnVmZmVyLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBvdmVyZmxvdworICovCitpbnQgc2VxX2J1Zl9wdXRjKHN0cnVjdCBzZXFfYnVmICpzLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJV0FSTl9PTihzLT5zaXplID09IDApOworCisJaWYgKHNlcV9idWZfY2FuX2ZpdChzLCAxKSkgeworCQlzLT5idWZmZXJbcy0+bGVuKytdID0gYzsKKwkJcmV0dXJuIDA7CisJfQorCXNlcV9idWZfc2V0X292ZXJmbG93KHMpOworCXJldHVybiAtMTsKK30KKworLyoqCisgKiBzZXFfYnVmX3B1dG1lbSAtIHdyaXRlIHJhdyBkYXRhIGludG8gdGhlIHNlcXVlbmMgYnVmZmVyCisgKiBAczogc2VxX2J1ZiBkZXNjcmlwdG9yCisgKiBAbWVtOiBUaGUgcmF3IG1lbW9yeSB0byBjb3B5IGludG8gdGhlIGJ1ZmZlcgorICogQGxlbjogVGhlIGxlbmd0aCBvZiB0aGUgcmF3IG1lbW9yeSB0byBjb3B5IChpbiBieXRlcykKKyAqCisgKiBUaGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgcmF3IG1lbW9yeSBuZWVkcyB0byBiZSB3cml0dGVuIGludG8gdGhlCisgKiBidWZmZXIgYW5kIGEgc3RyY3B5KCkgd291bGQgbm90IHdvcmsuIFVzaW5nIHRoaXMgZnVuY3Rpb24gYWxsb3dzCisgKiBmb3Igc3VjaCBjYXNlcy4KKyAqCisgKiBSZXR1cm5zIHplcm8gb24gc3VjY2VzcywgLTEgb24gb3ZlcmZsb3cKKyAqLworaW50IHNlcV9idWZfcHV0bWVtKHN0cnVjdCBzZXFfYnVmICpzLCBjb25zdCB2b2lkICptZW0sIHVuc2lnbmVkIGludCBsZW4pCit7CisJV0FSTl9PTihzLT5zaXplID09IDApOworCisJaWYgKHNlcV9idWZfY2FuX2ZpdChzLCBsZW4pKSB7CisJCW1lbWNweShzLT5idWZmZXIgKyBzLT5sZW4sIG1lbSwgbGVuKTsKKwkJcy0+bGVuICs9IGxlbjsKKwkJcmV0dXJuIDA7CisJfQorCXNlcV9idWZfc2V0X292ZXJmbG93KHMpOworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBNQVhfTUVNSEVYX0JZVEVTCThVCisjZGVmaW5lIEhFWF9DSEFSUwkJKE1BWF9NRU1IRVhfQllURVMqMiArIDEpCisKKy8qKgorICogc2VxX2J1Zl9wdXRtZW1faGV4IC0gd3JpdGUgcmF3IG1lbW9yeSBpbnRvIHRoZSBidWZmZXIgaW4gQVNDSUkgaGV4CisgKiBAczogc2VxX2J1ZiBkZXNjcmlwdG9yCisgKiBAbWVtOiBUaGUgcmF3IG1lbW9yeSB0byB3cml0ZSBpdHMgaGV4IEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mCisgKiBAbGVuOiBUaGUgbGVuZ3RoIG9mIHRoZSByYXcgbWVtb3J5IHRvIGNvcHkgKGluIGJ5dGVzKQorICoKKyAqIFRoaXMgaXMgc2ltaWxhciB0byBzZXFfYnVmX3B1dG1lbSgpIGV4Y2VwdCBpbnN0ZWFkIG9mIGp1c3QgY29weWluZyB0aGUKKyAqIHJhdyBtZW1vcnkgaW50byB0aGUgYnVmZmVyIGl0IHdyaXRlcyBpdHMgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgaXQKKyAqIGluIGhleCBjaGFyYWN0ZXJzLgorICoKKyAqIFJldHVybnMgemVybyBvbiBzdWNjZXNzLCAtMSBvbiBvdmVyZmxvdworICovCitpbnQgc2VxX2J1Zl9wdXRtZW1faGV4KHN0cnVjdCBzZXFfYnVmICpzLCBjb25zdCB2b2lkICptZW0sCisJCSAgICAgICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGNoYXIgaGV4W0hFWF9DSEFSU107CisJY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSA9IG1lbTsKKwl1bnNpZ25lZCBpbnQgc3RhcnRfbGVuOworCWludCBpLCBqOworCisJV0FSTl9PTihzLT5zaXplID09IDApOworCisJd2hpbGUgKGxlbikgeworCQlzdGFydF9sZW4gPSBtaW4obGVuLCBIRVhfQ0hBUlMgLSAxKTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJZm9yIChpID0gMCwgaiA9IDA7IGkgPCBzdGFydF9sZW47IGkrKykgeworI2Vsc2UKKwkJZm9yIChpID0gc3RhcnRfbGVuLTEsIGogPSAwOyBpID49IDA7IGktLSkgeworI2VuZGlmCisJCQloZXhbaisrXSA9IGhleF9hc2NfaGkoZGF0YVtpXSk7CisJCQloZXhbaisrXSA9IGhleF9hc2NfbG8oZGF0YVtpXSk7CisJCX0KKwkJaWYgKFdBUk5fT05fT05DRShqID09IDAgfHwgai8yID4gbGVuKSkKKwkJCWJyZWFrOworCisJCS8qIGogaW5jcmVtZW50cyB0d2ljZSBwZXIgbG9vcCAqLworCQlsZW4gLT0gaiAvIDI7CisJCWhleFtqKytdID0gJyAnOworCisJCXNlcV9idWZfcHV0bWVtKHMsIGhleCwgaik7CisJCWlmIChzZXFfYnVmX2hhc19vdmVyZmxvd2VkKHMpKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzZXFfYnVmX3BhdGggLSBjb3B5IGEgcGF0aCBpbnRvIHRoZSBzZXF1ZW5jZSBidWZmZXIKKyAqIEBzOiBzZXFfYnVmIGRlc2NyaXB0b3IKKyAqIEBwYXRoOiBwYXRoIHRvIHdyaXRlIGludG8gdGhlIHNlcXVlbmNlIGJ1ZmZlci4KKyAqIEBlc2M6IHNldCBvZiBjaGFyYWN0ZXJzIHRvIGVzY2FwZSBpbiB0aGUgb3V0cHV0CisgKgorICogV3JpdGUgYSBwYXRoIG5hbWUgaW50byB0aGUgc2VxdWVuY2UgYnVmZmVyLgorICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3cml0dGVuIGJ5dGVzIG9uIHN1Y2Nlc3MsIC0xIG9uIG92ZXJmbG93CisgKi8KK2ludCBzZXFfYnVmX3BhdGgoc3RydWN0IHNlcV9idWYgKnMsIGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLCBjb25zdCBjaGFyICplc2MpCit7CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplID0gc2VxX2J1Zl9nZXRfYnVmKHMsICZidWYpOworCWludCByZXMgPSAtMTsKKworCVdBUk5fT04ocy0+c2l6ZSA9PSAwKTsKKworCWlmIChzaXplKSB7CisJCWNoYXIgKnAgPSBkX3BhdGgocGF0aCwgYnVmLCBzaXplKTsKKwkJaWYgKCFJU19FUlIocCkpIHsKKwkJCWNoYXIgKmVuZCA9IG1hbmdsZV9wYXRoKGJ1ZiwgcCwgZXNjKTsKKwkJCWlmIChlbmQpCisJCQkJcmVzID0gZW5kIC0gYnVmOworCQl9CisJfQorCXNlcV9idWZfY29tbWl0KHMsIHJlcyk7CisKKwlyZXR1cm4gcmVzOworfQorCisvKioKKyAqIHNlcV9idWZfdG9fdXNlciAtIGNvcHkgdGhlIHNxdWVuY2UgYnVmZmVyIHRvIHVzZXIgc3BhY2UKKyAqIEBzOiBzZXFfYnVmIGRlc2NyaXB0b3IKKyAqIEB1YnVmOiBUaGUgdXNlcnNwYWNlIG1lbW9yeSBsb2NhdGlvbiB0byBjb3B5IHRvCisgKiBAY250OiBUaGUgYW1vdW50IHRvIGNvcHkKKyAqCisgKiBDb3BpZXMgdGhlIHNlcXVlbmNlIGJ1ZmZlciBpbnRvIHRoZSB1c2Vyc3BhY2UgbWVtb3J5IHBvaW50ZWQgdG8KKyAqIGJ5IEB1YnVmLiBJdCBzdGFydHMgZnJvbSB0aGUgbGFzdCByZWFkIHBvc2l0aW9uIChAcy0+cmVhZHBvcykKKyAqIGFuZCB3cml0ZXMgdXAgdG8gQGNudCBjaGFyYWN0ZXJzIG9yIHRpbGwgaXQgcmVhY2hlcyB0aGUgZW5kIG9mCisgKiB0aGUgY29udGVudCBpbiB0aGUgYnVmZmVyIChAcy0+bGVuKSwgd2hpY2ggZXZlciBjb21lcyBmaXJzdC4KKyAqCisgKiBPbiBzdWNjZXNzLCBpdCByZXR1cm5zIGEgcG9zaXRpdmUgbnVtYmVyIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMKKyAqIGl0IGNvcGllZC4KKyAqCisgKiBPbiBmYWlsdXJlIGl0IHJldHVybnMgLUVCVVNZIGlmIGFsbCBvZiB0aGUgY29udGVudCBpbiB0aGUKKyAqIHNlcXVlbmNlIGhhcyBiZWVuIGFscmVhZHkgcmVhZCwgd2hpY2ggaW5jbHVkZXMgbm90aGluZyBpbiB0aGUKKyAqIHNlcXVlbmNlIChAcy0+bGVuID09IEBzLT5yZWFkcG9zKS4KKyAqCisgKiBSZXR1cm5zIC1FRkFVTFQgaWYgdGhlIGNvcHkgdG8gdXNlcnNwYWNlIGZhaWxzLgorICovCitpbnQgc2VxX2J1Zl90b191c2VyKHN0cnVjdCBzZXFfYnVmICpzLCBjaGFyIF9fdXNlciAqdWJ1ZiwgaW50IGNudCkKK3sKKwlpbnQgbGVuOworCWludCByZXQ7CisKKwlpZiAoIWNudCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBzZXFfYnVmX3VzZWQocyk7CisKKwlpZiAobGVuIDw9IHMtPnJlYWRwb3MpCisJCXJldHVybiAtRUJVU1k7CisKKwlsZW4gLT0gcy0+cmVhZHBvczsKKwlpZiAoY250ID4gbGVuKQorCQljbnQgPSBsZW47CisJcmV0ID0gY29weV90b191c2VyKHVidWYsIHMtPmJ1ZmZlciArIHMtPnJlYWRwb3MsIGNudCk7CisJaWYgKHJldCA9PSBjbnQpCisJCXJldHVybiAtRUZBVUxUOworCisJY250IC09IHJldDsKKworCXMtPnJlYWRwb3MgKz0gY250OworCXJldHVybiBjbnQ7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zZ19wb29sLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zZ19wb29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMzA2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NnX3Bvb2wuYwpAQCAtMCwwICsxLDE3MiBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2RlZmluZSBTR19NRU1QT09MX05SCQlBUlJBWV9TSVpFKHNnX3Bvb2xzKQorI2RlZmluZSBTR19NRU1QT09MX1NJWkUJCTIKKworc3RydWN0IHNnX3Bvb2wgeworCXNpemVfdAkJc2l6ZTsKKwljaGFyCQkqbmFtZTsKKwlzdHJ1Y3Qga21lbV9jYWNoZQkqc2xhYjsKKwltZW1wb29sX3QJKnBvb2w7Cit9OworCisjZGVmaW5lIFNQKHgpIHsgLnNpemUgPSB4LCAic2dwb29sLSIgX19zdHJpbmdpZnkoeCkgfQorI2lmIChTR19DSFVOS19TSVpFIDwgMzIpCisjZXJyb3IgU0dfQ0hVTktfU0laRSBpcyB0b28gc21hbGwgKG11c3QgYmUgMzIgb3IgZ3JlYXRlcikKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBzZ19wb29sIHNnX3Bvb2xzW10gPSB7CisJU1AoOCksCisJU1AoMTYpLAorI2lmIChTR19DSFVOS19TSVpFID4gMzIpCisJU1AoMzIpLAorI2lmIChTR19DSFVOS19TSVpFID4gNjQpCisJU1AoNjQpLAorI2lmIChTR19DSFVOS19TSVpFID4gMTI4KQorCVNQKDEyOCksCisjaWYgKFNHX0NIVU5LX1NJWkUgPiAyNTYpCisjZXJyb3IgU0dfQ0hVTktfU0laRSBpcyB0b28gbGFyZ2UgKDI1NiBNQVgpCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKwlTUChTR19DSFVOS19TSVpFKQorfTsKKyN1bmRlZiBTUAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBzZ19wb29sX2luZGV4KHVuc2lnbmVkIHNob3J0IG5lbnRzKQoreworCXVuc2lnbmVkIGludCBpbmRleDsKKworCUJVR19PTihuZW50cyA+IFNHX0NIVU5LX1NJWkUpOworCisJaWYgKG5lbnRzIDw9IDgpCisJCWluZGV4ID0gMDsKKwllbHNlCisJCWluZGV4ID0gZ2V0X2NvdW50X29yZGVyKG5lbnRzKSAtIDM7CisKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIHNnX3Bvb2xfZnJlZShzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IG5lbnRzKQoreworCXN0cnVjdCBzZ19wb29sICpzZ3A7CisKKwlzZ3AgPSBzZ19wb29scyArIHNnX3Bvb2xfaW5kZXgobmVudHMpOworCW1lbXBvb2xfZnJlZShzZ2wsIHNncC0+cG9vbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3Bvb2xfYWxsb2ModW5zaWduZWQgaW50IG5lbnRzLCBnZnBfdCBnZnBfbWFzaykKK3sKKwlzdHJ1Y3Qgc2dfcG9vbCAqc2dwOworCisJc2dwID0gc2dfcG9vbHMgKyBzZ19wb29sX2luZGV4KG5lbnRzKTsKKwlyZXR1cm4gbWVtcG9vbF9hbGxvYyhzZ3AtPnBvb2wsIGdmcF9tYXNrKTsKK30KKworLyoqCisgKiBzZ19mcmVlX3RhYmxlX2NoYWluZWQgLSBGcmVlIGEgcHJldmlvdXNseSBtYXBwZWQgc2cgdGFibGUKKyAqIEB0YWJsZToJVGhlIHNnIHRhYmxlIGhlYWRlciB0byB1c2UKKyAqIEBmaXJzdF9jaHVuazogd2FzIGZpcnN0X2NodW5rIG5vdCBOVUxMIGluIHNnX2FsbG9jX3RhYmxlX2NoYWluZWQ/CisgKgorICogIERlc2NyaXB0aW9uOgorICogICAgRnJlZSBhbiBzZyB0YWJsZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBhbmQgc2V0dXAgd2l0aAorICogICAgc2dfYWxsb2NfdGFibGVfY2hhaW5lZCgpLgorICoKKyAqKi8KK3ZvaWQgc2dfZnJlZV90YWJsZV9jaGFpbmVkKHN0cnVjdCBzZ190YWJsZSAqdGFibGUsIGJvb2wgZmlyc3RfY2h1bmspCit7CisJaWYgKGZpcnN0X2NodW5rICYmIHRhYmxlLT5vcmlnX25lbnRzIDw9IFNHX0NIVU5LX1NJWkUpCisJCXJldHVybjsKKwlfX3NnX2ZyZWVfdGFibGUodGFibGUsIFNHX0NIVU5LX1NJWkUsIGZpcnN0X2NodW5rLCBzZ19wb29sX2ZyZWUpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc2dfZnJlZV90YWJsZV9jaGFpbmVkKTsKKworLyoqCisgKiBzZ19hbGxvY190YWJsZV9jaGFpbmVkIC0gQWxsb2NhdGUgYW5kIGNoYWluIFNHTHMgaW4gYW4gc2cgdGFibGUKKyAqIEB0YWJsZToJVGhlIHNnIHRhYmxlIGhlYWRlciB0byB1c2UKKyAqIEBuZW50czoJTnVtYmVyIG9mIGVudHJpZXMgaW4gc2cgbGlzdAorICogQGZpcnN0X2NodW5rOiBmaXJzdCBTR0wKKyAqCisgKiAgRGVzY3JpcHRpb246CisgKiAgICBBbGxvY2F0ZSBhbmQgY2hhaW4gU0dMcyBpbiBhbiBzZyB0YWJsZS4gSWYgQG5lbnRzQCBpcyBsYXJnZXIgdGhhbgorICogICAgU0dfQ0hVTktfU0laRSBhIGNoYWluZWQgc2cgdGFibGUgd2lsbCBiZSBzZXR1cC4KKyAqCisgKiovCitpbnQgc2dfYWxsb2NfdGFibGVfY2hhaW5lZChzdHJ1Y3Qgc2dfdGFibGUgKnRhYmxlLCBpbnQgbmVudHMsCisJCXN0cnVjdCBzY2F0dGVybGlzdCAqZmlyc3RfY2h1bmspCit7CisJaW50IHJldDsKKworCUJVR19PTighbmVudHMpOworCisJaWYgKGZpcnN0X2NodW5rKSB7CisJCWlmIChuZW50cyA8PSBTR19DSFVOS19TSVpFKSB7CisJCQl0YWJsZS0+bmVudHMgPSB0YWJsZS0+b3JpZ19uZW50cyA9IG5lbnRzOworCQkJc2dfaW5pdF90YWJsZSh0YWJsZS0+c2dsLCBuZW50cyk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldCA9IF9fc2dfYWxsb2NfdGFibGUodGFibGUsIG5lbnRzLCBTR19DSFVOS19TSVpFLAorCQkJICAgICAgIGZpcnN0X2NodW5rLCBHRlBfQVRPTUlDLCBzZ19wb29sX2FsbG9jKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJc2dfZnJlZV90YWJsZV9jaGFpbmVkKHRhYmxlLCAoYm9vbClmaXJzdF9jaHVuayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNnX2FsbG9jX3RhYmxlX2NoYWluZWQpOworCitzdGF0aWMgX19pbml0IGludCBzZ19wb29sX2luaXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBTR19NRU1QT09MX05SOyBpKyspIHsKKwkJc3RydWN0IHNnX3Bvb2wgKnNncCA9IHNnX3Bvb2xzICsgaTsKKwkJaW50IHNpemUgPSBzZ3AtPnNpemUgKiBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KTsKKworCQlzZ3AtPnNsYWIgPSBrbWVtX2NhY2hlX2NyZWF0ZShzZ3AtPm5hbWUsIHNpemUsIDAsCisJCQkJU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKKwkJaWYgKCFzZ3AtPnNsYWIpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0dfUE9PTDogY2FuJ3QgaW5pdCBzZyBzbGFiICVzXG4iLAorCQkJCQlzZ3AtPm5hbWUpOworCQkJZ290byBjbGVhbnVwX3NkYjsKKwkJfQorCisJCXNncC0+cG9vbCA9IG1lbXBvb2xfY3JlYXRlX3NsYWJfcG9vbChTR19NRU1QT09MX1NJWkUsCisJCQkJCQkgICAgIHNncC0+c2xhYik7CisJCWlmICghc2dwLT5wb29sKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIlNHX1BPT0w6IGNhbid0IGluaXQgc2cgbWVtcG9vbCAlc1xuIiwKKwkJCQkJc2dwLT5uYW1lKTsKKwkJCWdvdG8gY2xlYW51cF9zZGI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworY2xlYW51cF9zZGI6CisJZm9yIChpID0gMDsgaSA8IFNHX01FTVBPT0xfTlI7IGkrKykgeworCQlzdHJ1Y3Qgc2dfcG9vbCAqc2dwID0gc2dfcG9vbHMgKyBpOworCQlpZiAoc2dwLT5wb29sKQorCQkJbWVtcG9vbF9kZXN0cm95KHNncC0+cG9vbCk7CisJCWlmIChzZ3AtPnNsYWIpCisJCQlrbWVtX2NhY2hlX2Rlc3Ryb3koc2dwLT5zbGFiKTsKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIHNnX3Bvb2xfZXhpdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNHX01FTVBPT0xfTlI7IGkrKykgeworCQlzdHJ1Y3Qgc2dfcG9vbCAqc2dwID0gc2dfcG9vbHMgKyBpOworCQltZW1wb29sX2Rlc3Ryb3koc2dwLT5wb29sKTsKKwkJa21lbV9jYWNoZV9kZXN0cm95KHNncC0+c2xhYik7CisJfQorfQorCittb2R1bGVfaW5pdChzZ19wb29sX2luaXQpOworbW9kdWxlX2V4aXQoc2dfcG9vbF9leGl0KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NnX3NwbGl0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zZ19zcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjM0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zZ19zcGxpdC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFJvYmVydCBKYXJ6bWlrIDxyb2JlcnQuamFyem1pa0BmcmVlLmZyPgorICoKKyAqIFNjYXR0ZXJsaXN0IHNwbGl0dGluZyBoZWxwZXJzLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogVmVyc2lvbiAyLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2F0dGVybGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RydWN0IHNnX3NwbGl0dGVyIHsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmluX3NnMDsKKwlpbnQgbmVudHM7CisJb2ZmX3Qgc2tpcF9zZzA7CisJdW5zaWduZWQgaW50IGxlbmd0aF9sYXN0X3NnOworCisJc3RydWN0IHNjYXR0ZXJsaXN0ICpvdXRfc2c7Cit9OworCitzdGF0aWMgaW50IHNnX2NhbGN1bGF0ZV9zcGxpdChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmluLCBpbnQgbmVudHMsIGludCBuYl9zcGxpdHMsCisJCQkgICAgICBvZmZfdCBza2lwLCBjb25zdCBzaXplX3QgKnNpemVzLAorCQkJICAgICAgc3RydWN0IHNnX3NwbGl0dGVyICpzcGxpdHRlcnMsIGJvb2wgbWFwcGVkKQoreworCWludCBpOworCXVuc2lnbmVkIGludCBzZ2xlbjsKKwlzaXplX3Qgc2l6ZSA9IHNpemVzWzBdLCBsZW47CisJc3RydWN0IHNnX3NwbGl0dGVyICpjdXJyID0gc3BsaXR0ZXJzOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJfc3BsaXRzOyBpKyspIHsKKwkJc3BsaXR0ZXJzW2ldLmluX3NnMCA9IE5VTEw7CisJCXNwbGl0dGVyc1tpXS5uZW50cyA9IDA7CisJfQorCisJZm9yX2VhY2hfc2coaW4sIHNnLCBuZW50cywgaSkgeworCQlzZ2xlbiA9IG1hcHBlZCA/IHNnX2RtYV9sZW4oc2cpIDogc2ctPmxlbmd0aDsKKwkJaWYgKHNraXAgPiBzZ2xlbikgeworCQkJc2tpcCAtPSBzZ2xlbjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGVuID0gbWluX3Qoc2l6ZV90LCBzaXplLCBzZ2xlbiAtIHNraXApOworCQlpZiAoIWN1cnItPmluX3NnMCkgeworCQkJY3Vyci0+aW5fc2cwID0gc2c7CisJCQljdXJyLT5za2lwX3NnMCA9IHNraXA7CisJCX0KKwkJc2l6ZSAtPSBsZW47CisJCWN1cnItPm5lbnRzKys7CisJCWN1cnItPmxlbmd0aF9sYXN0X3NnID0gbGVuOworCisJCXdoaWxlICghc2l6ZSAmJiAoc2tpcCArIGxlbiA8IHNnbGVuKSAmJiAoLS1uYl9zcGxpdHMgPiAwKSkgeworCQkJY3VycisrOworCQkJc2l6ZSA9ICooKytzaXplcyk7CisJCQlza2lwICs9IGxlbjsKKwkJCWxlbiA9IG1pbl90KHNpemVfdCwgc2l6ZSwgc2dsZW4gLSBza2lwKTsKKworCQkJY3Vyci0+aW5fc2cwID0gc2c7CisJCQljdXJyLT5za2lwX3NnMCA9IHNraXA7CisJCQljdXJyLT5uZW50cyA9IDE7CisJCQljdXJyLT5sZW5ndGhfbGFzdF9zZyA9IGxlbjsKKwkJCXNpemUgLT0gbGVuOworCQl9CisJCXNraXAgPSAwOworCisJCWlmICghc2l6ZSAmJiAtLW5iX3NwbGl0cyA+IDApIHsKKwkJCWN1cnIrKzsKKwkJCXNpemUgPSAqKCsrc2l6ZXMpOworCQl9CisKKwkJaWYgKCFuYl9zcGxpdHMpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gKHNpemUgfHwgIXNwbGl0dGVyc1swXS5pbl9zZzApID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNnX3NwbGl0X3BoeXMoc3RydWN0IHNnX3NwbGl0dGVyICpzcGxpdHRlcnMsIGNvbnN0IGludCBuYl9zcGxpdHMpCit7CisJaW50IGksIGo7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICppbl9zZywgKm91dF9zZzsKKwlzdHJ1Y3Qgc2dfc3BsaXR0ZXIgKnNwbGl0OworCisJZm9yIChpID0gMCwgc3BsaXQgPSBzcGxpdHRlcnM7IGkgPCBuYl9zcGxpdHM7IGkrKywgc3BsaXQrKykgeworCQlpbl9zZyA9IHNwbGl0LT5pbl9zZzA7CisJCW91dF9zZyA9IHNwbGl0LT5vdXRfc2c7CisJCWZvciAoaiA9IDA7IGogPCBzcGxpdC0+bmVudHM7IGorKywgb3V0X3NnKyspIHsKKwkJCSpvdXRfc2cgPSAqaW5fc2c7CisJCQlpZiAoIWopIHsKKwkJCQlvdXRfc2ctPm9mZnNldCArPSBzcGxpdC0+c2tpcF9zZzA7CisJCQkJb3V0X3NnLT5sZW5ndGggLT0gc3BsaXQtPnNraXBfc2cwOworCQkJfSBlbHNlIHsKKwkJCQlvdXRfc2ctPm9mZnNldCA9IDA7CisJCQl9CisJCQlzZ19kbWFfYWRkcmVzcyhvdXRfc2cpID0gMDsKKwkJCXNnX2RtYV9sZW4ob3V0X3NnKSA9IDA7CisJCQlpbl9zZyA9IHNnX25leHQoaW5fc2cpOworCQl9CisJCW91dF9zZ1stMV0ubGVuZ3RoID0gc3BsaXQtPmxlbmd0aF9sYXN0X3NnOworCQlzZ19tYXJrX2VuZChvdXRfc2cgLSAxKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNnX3NwbGl0X21hcHBlZChzdHJ1Y3Qgc2dfc3BsaXR0ZXIgKnNwbGl0dGVycywgY29uc3QgaW50IG5iX3NwbGl0cykKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmluX3NnLCAqb3V0X3NnOworCXN0cnVjdCBzZ19zcGxpdHRlciAqc3BsaXQ7CisKKwlmb3IgKGkgPSAwLCBzcGxpdCA9IHNwbGl0dGVyczsgaSA8IG5iX3NwbGl0czsgaSsrLCBzcGxpdCsrKSB7CisJCWluX3NnID0gc3BsaXQtPmluX3NnMDsKKwkJb3V0X3NnID0gc3BsaXQtPm91dF9zZzsKKwkJZm9yIChqID0gMDsgaiA8IHNwbGl0LT5uZW50czsgaisrLCBvdXRfc2crKykgeworCQkJc2dfZG1hX2FkZHJlc3Mob3V0X3NnKSA9IHNnX2RtYV9hZGRyZXNzKGluX3NnKTsKKwkJCXNnX2RtYV9sZW4ob3V0X3NnKSA9IHNnX2RtYV9sZW4oaW5fc2cpOworCQkJaWYgKCFqKSB7CisJCQkJc2dfZG1hX2FkZHJlc3Mob3V0X3NnKSArPSBzcGxpdC0+c2tpcF9zZzA7CisJCQkJc2dfZG1hX2xlbihvdXRfc2cpIC09IHNwbGl0LT5za2lwX3NnMDsKKwkJCX0KKwkJCWluX3NnID0gc2dfbmV4dChpbl9zZyk7CisJCX0KKwkJc2dfZG1hX2xlbigtLW91dF9zZykgPSBzcGxpdC0+bGVuZ3RoX2xhc3Rfc2c7CisJfQorfQorCisvKioKKyAqIHNnX3NwbGl0IC0gc3BsaXQgYSBzY2F0dGVybGlzdCBpbnRvIHNldmVyYWwgc2NhdHRlcmxpc3RzCisgKiBAaW46IHRoZSBpbnB1dCBzZyBsaXN0CisgKiBAaW5fbWFwcGVkX25lbnRzOiB0aGUgcmVzdWx0IG9mIGEgZG1hX21hcF9zZyhpbiwgLi4uKSwgb3IgMCBpZiBub3QgbWFwcGVkLgorICogQHNraXA6IHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcCBpbiB0aGUgaW5wdXQgc2cgbGlzdAorICogQG5iX3NwbGl0czogdGhlIG51bWJlciBvZiBkZXNpcmVkIHNnIG91dHB1dHMKKyAqIEBzcGxpdF9zaXplczogdGhlIHJlc3BlY3RpdmUgc2l6ZSBvZiBlYWNoIG91dHB1dCBzZyBsaXN0IGluIGJ5dGVzCisgKiBAb3V0OiBhbiBhcnJheSB3aGVyZSB0byBzdG9yZSB0aGUgYWxsb2NhdGVkIG91dHB1dCBzZyBsaXN0cworICogQG91dF9tYXBwZWRfbmVudHM6IHRoZSByZXN1bHRpbmcgc2cgbGlzdHMgbWFwcGVkIG51bWJlciBvZiBzZyBlbnRyaWVzLiBNaWdodAorICogICAgICAgICAgICAgICAgICAgIGJlIE5VTEwgaWYgc2dsaXN0IG5vdCBhbHJlYWR5IG1hcHBlZCAoaW5fbWFwcGVkX25lbnRzID0gMCkKKyAqIEBnZnBfbWFzazogdGhlIGFsbG9jYXRpb24gZmxhZworICoKKyAqIFRoaXMgZnVuY3Rpb24gc3BsaXRzIHRoZSBpbnB1dCBzZyBsaXN0IGludG8gbmJfc3BsaXRzIHNnIGxpc3RzLCB3aGljaCBhcmUKKyAqIGFsbG9jYXRlZCBhbmQgc3RvcmVkIGludG8gb3V0LgorICogVGhlIEBpbiBpcyBzcGxpdCBpbnRvIDoKKyAqICAtIEBvdXRbMF0sIHdoaWNoIGNvdmVycyBieXRlcyBbQHNraXAgLi4gQHNraXAgKyBAc3BsaXRfc2l6ZXNbMF0gLSAxXSBvZiBAaW4KKyAqICAtIEBvdXRbMV0sIHdoaWNoIGNvdmVycyBieXRlcyBbQHNraXAgKyBzcGxpdF9zaXplc1swXSAuLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAc2tpcCArIEBzcGxpdF9zaXplc1swXSArIEBzcGxpdF9zaXplc1sxXSAtMV0KKyAqIGV0YyAuLi4KKyAqIEl0IHdpbGwgYmUgdGhlIGNhbGxlcidzIGR1dHkgdG8ga2ZyZWUoKSBvdXQgYXJyYXkgbWVtYmVycy4KKyAqCisgKiBSZXR1cm5zIDAgdXBvbiBzdWNjZXNzLCBvciBlcnJvciBjb2RlCisgKi8KK2ludCBzZ19zcGxpdChzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmluLCBjb25zdCBpbnQgaW5fbWFwcGVkX25lbnRzLAorCSAgICAgY29uc3Qgb2ZmX3Qgc2tpcCwgY29uc3QgaW50IG5iX3NwbGl0cywKKwkgICAgIGNvbnN0IHNpemVfdCAqc3BsaXRfc2l6ZXMsCisJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKipvdXQsIGludCAqb3V0X21hcHBlZF9uZW50cywKKwkgICAgIGdmcF90IGdmcF9tYXNrKQoreworCWludCBpLCByZXQ7CisJc3RydWN0IHNnX3NwbGl0dGVyICpzcGxpdHRlcnM7CisKKwlzcGxpdHRlcnMgPSBrY2FsbG9jKG5iX3NwbGl0cywgc2l6ZW9mKCpzcGxpdHRlcnMpLCBnZnBfbWFzayk7CisJaWYgKCFzcGxpdHRlcnMpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0ID0gc2dfY2FsY3VsYXRlX3NwbGl0KGluLCBzZ19uZW50cyhpbiksIG5iX3NwbGl0cywgc2tpcCwgc3BsaXRfc2l6ZXMsCisJCQkgICBzcGxpdHRlcnMsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXQgPSAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBuYl9zcGxpdHM7IGkrKykgeworCQlzcGxpdHRlcnNbaV0ub3V0X3NnID0ga21hbGxvY19hcnJheShzcGxpdHRlcnNbaV0ubmVudHMsCisJCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBzY2F0dGVybGlzdCksCisJCQkJCQkgICAgZ2ZwX21hc2spOworCQlpZiAoIXNwbGl0dGVyc1tpXS5vdXRfc2cpCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIFRoZSBvcmRlciBvZiB0aGVzZSAzIGNhbGxzIGlzIGltcG9ydGFudCBhbmQgc2hvdWxkIGJlIGtlcHQuCisJICovCisJc2dfc3BsaXRfcGh5cyhzcGxpdHRlcnMsIG5iX3NwbGl0cyk7CisJcmV0ID0gc2dfY2FsY3VsYXRlX3NwbGl0KGluLCBpbl9tYXBwZWRfbmVudHMsIG5iX3NwbGl0cywgc2tpcCwKKwkJCQkgc3BsaXRfc2l6ZXMsIHNwbGl0dGVycywgdHJ1ZSk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCXNnX3NwbGl0X21hcHBlZChzcGxpdHRlcnMsIG5iX3NwbGl0cyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJfc3BsaXRzOyBpKyspIHsKKwkJb3V0W2ldID0gc3BsaXR0ZXJzW2ldLm91dF9zZzsKKwkJaWYgKG91dF9tYXBwZWRfbmVudHMpCisJCQlvdXRfbWFwcGVkX25lbnRzW2ldID0gc3BsaXR0ZXJzW2ldLm5lbnRzOworCX0KKworCWtmcmVlKHNwbGl0dGVycyk7CisJcmV0dXJuIDA7CisKK2VycjoKKwlmb3IgKGkgPSAwOyBpIDwgbmJfc3BsaXRzOyBpKyspCisJCWtmcmVlKHNwbGl0dGVyc1tpXS5vdXRfc2cpOworCWtmcmVlKHNwbGl0dGVycyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woc2dfc3BsaXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2hhMS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2hhMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTZkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zaGExLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogU0hBMSByb3V0aW5lIG9wdGltaXplZCB0byBkbyB3b3JkIGFjY2Vzc2VzIHJhdGhlciB0aGFuIGJ5dGUgYWNjZXNzZXMsCisgKiBhbmQgdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29waWVzIGludG8gdGhlIGNvbnRleHQgYXJyYXkuCisgKgorICogVGhpcyB3YXMgYmFzZWQgb24gdGhlIGdpdCBTSEExIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jcnlwdG9oYXNoLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorCisvKgorICogSWYgeW91IGhhdmUgMzIgcmVnaXN0ZXJzIG9yIG1vcmUsIHRoZSBjb21waWxlciBjYW4gKGFuZCBzaG91bGQpCisgKiB0cnkgdG8gY2hhbmdlIHRoZSBhcnJheVtdIGFjY2Vzc2VzIGludG8gcmVnaXN0ZXJzLiBIb3dldmVyLCBvbgorICogbWFjaGluZXMgd2l0aCBsZXNzIHRoYW4gfjI1IHJlZ2lzdGVycywgdGhhdCB3b24ndCByZWFsbHkgd29yaywKKyAqIGFuZCBhdCBsZWFzdCBnY2Mgd2lsbCBtYWtlIGFuIHVuaG9seSBtZXNzIG9mIGl0LgorICoKKyAqIFNvIHRvIGF2b2lkIHRoYXQgbWVzcyB3aGljaCBqdXN0IHNsb3dzIHRoaW5ncyBkb3duLCB3ZSBmb3JjZQorICogdGhlIHN0b3JlcyB0byBtZW1vcnkgdG8gYWN0dWFsbHkgaGFwcGVuICh3ZSBtaWdodCBiZSBiZXR0ZXIgb2ZmCisgKiB3aXRoIGEgJ1codCk9KHZhbCk7YXNtKCIiOiIrbSIgKFcodCkpJyB0aGVyZSBpbnN0ZWFkLCBhcworICogc3VnZ2VzdGVkIGJ5IEFydHVyIFNrYXdpbmEgLSB0aGF0IHdpbGwgYWxzbyBtYWtlIGdjYyB1bmFibGUgdG8KKyAqIHRyeSB0byBkbyB0aGUgc2lsbHkgIm9wdGltaXplIGF3YXkgbG9hZHMiIHBhcnQgYmVjYXVzZSBpdCB3b24ndAorICogc2VlIHdoYXQgdGhlIHZhbHVlIHdpbGwgYmUpLgorICoKKyAqIEJlbiBIZXJyZW5zY2htaWR0IHJlcG9ydHMgdGhhdCBvbiBQUEMsIHRoZSBDIHZlcnNpb24gY29tZXMgY2xvc2UKKyAqIHRvIHRoZSBvcHRpbWl6ZWQgYXNtIHdpdGggdGhpcyAoaWUgb24gUFBDIHlvdSBkb24ndCB3YW50IHRoYXQKKyAqICd2b2xhdGlsZScsIHNpbmNlIHRoZXJlIGFyZSBsb3RzIG9mIHJlZ2lzdGVycykuCisgKgorICogT24gQVJNIHdlIGdldCB0aGUgYmVzdCBjb2RlIGdlbmVyYXRpb24gYnkgZm9yY2luZyBhIGZ1bGwgbWVtb3J5IGJhcnJpZXIKKyAqIGJldHdlZW4gZWFjaCBTSEFfUk9VTkQsIG90aGVyd2lzZSBnY2MgaGFwcGlseSBnZXQgd2lsZCB3aXRoIHNwaWxsaW5nIGFuZAorICogdGhlIHN0YWNrIGZyYW1lIHNpemUgc2ltcGx5IGV4cGxvZGUgYW5kIHBlcmZvcm1hbmNlIGdvZXMgZG93biB0aGUgZHJhaW4uCisgKi8KKworI2lmZGVmIENPTkZJR19YODYKKyAgI2RlZmluZSBzZXRXKHgsIHZhbCkgKCoodm9sYXRpbGUgX191MzIgKikmVyh4KSA9ICh2YWwpKQorI2VsaWYgZGVmaW5lZChDT05GSUdfQVJNKQorICAjZGVmaW5lIHNldFcoeCwgdmFsKSBkbyB7IFcoeCkgPSAodmFsKTsgX19hc21fXygiIjo6OiJtZW1vcnkiKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisgICNkZWZpbmUgc2V0Vyh4LCB2YWwpIChXKHgpID0gKHZhbCkpCisjZW5kaWYKKworLyogVGhpcyAicm9sbHMiIG92ZXIgdGhlIDUxMi1iaXQgYXJyYXkgKi8KKyNkZWZpbmUgVyh4KSAoYXJyYXlbKHgpJjE1XSkKKworLyoKKyAqIFdoZXJlIGRvIHdlIGdldCB0aGUgc291cmNlIGZyb20/IFRoZSBmaXJzdCAxNiBpdGVyYXRpb25zIGdldCBpdCBmcm9tCisgKiB0aGUgaW5wdXQgZGF0YSwgdGhlIG5leHQgbWl4IGl0IGZyb20gdGhlIDUxMi1iaXQgYXJyYXkuCisgKi8KKyNkZWZpbmUgU0hBX1NSQyh0KSBnZXRfdW5hbGlnbmVkX2JlMzIoKF9fdTMyICopZGF0YSArIHQpCisjZGVmaW5lIFNIQV9NSVgodCkgcm9sMzIoVyh0KzEzKSBeIFcodCs4KSBeIFcodCsyKSBeIFcodCksIDEpCisKKyNkZWZpbmUgU0hBX1JPVU5EKHQsIGlucHV0LCBmbiwgY29uc3RhbnQsIEEsIEIsIEMsIEQsIEUpIGRvIHsgXAorCV9fdTMyIFRFTVAgPSBpbnB1dCh0KTsgc2V0Vyh0LCBURU1QKTsgXAorCUUgKz0gVEVNUCArIHJvbDMyKEEsNSkgKyAoZm4pICsgKGNvbnN0YW50KTsgXAorCUIgPSByb3IzMihCLCAyKTsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBUXzBfMTUodCwgQSwgQiwgQywgRCwgRSkgIFNIQV9ST1VORCh0LCBTSEFfU1JDLCAoKChDXkQpJkIpXkQpICwgMHg1YTgyNzk5OSwgQSwgQiwgQywgRCwgRSApCisjZGVmaW5lIFRfMTZfMTkodCwgQSwgQiwgQywgRCwgRSkgU0hBX1JPVU5EKHQsIFNIQV9NSVgsICgoKENeRCkmQileRCkgLCAweDVhODI3OTk5LCBBLCBCLCBDLCBELCBFICkKKyNkZWZpbmUgVF8yMF8zOSh0LCBBLCBCLCBDLCBELCBFKSBTSEFfUk9VTkQodCwgU0hBX01JWCwgKEJeQ15EKSAsIDB4NmVkOWViYTEsIEEsIEIsIEMsIEQsIEUgKQorI2RlZmluZSBUXzQwXzU5KHQsIEEsIEIsIEMsIEQsIEUpIFNIQV9ST1VORCh0LCBTSEFfTUlYLCAoKEImQykrKEQmKEJeQykpKSAsIDB4OGYxYmJjZGMsIEEsIEIsIEMsIEQsIEUgKQorI2RlZmluZSBUXzYwXzc5KHQsIEEsIEIsIEMsIEQsIEUpIFNIQV9ST1VORCh0LCBTSEFfTUlYLCAoQl5DXkQpICwgIDB4Y2E2MmMxZDYsIEEsIEIsIEMsIEQsIEUgKQorCisvKioKKyAqIHNoYV90cmFuc2Zvcm0gLSBzaW5nbGUgYmxvY2sgU0hBMSB0cmFuc2Zvcm0KKyAqCisgKiBAZGlnZXN0OiAxNjAgYml0IGRpZ2VzdCB0byB1cGRhdGUKKyAqIEBkYXRhOiAgIDUxMiBiaXRzIG9mIGRhdGEgdG8gaGFzaAorICogQGFycmF5OiAgMTYgd29yZHMgb2Ygd29ya3NwYWNlIChzZWUgbm90ZSkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIFNIQTEgZGlnZXN0IGZvciBhIHNpbmdsZSA1MTItYml0IGJsb2NrLgorICogQmUgd2FybmVkLCBpdCBkb2VzIG5vdCBoYW5kbGUgcGFkZGluZyBhbmQgbWVzc2FnZSBkaWdlc3QsIGRvIG5vdAorICogY29uZnVzZSBpdCB3aXRoIHRoZSBmdWxsIEZJUFMgMTgwLTEgZGlnZXN0IGFsZ29yaXRobSBmb3IgdmFyaWFibGUKKyAqIGxlbmd0aCBtZXNzYWdlcy4KKyAqCisgKiBOb3RlOiBJZiB0aGUgaGFzaCBpcyBzZWN1cml0eSBzZW5zaXRpdmUsIHRoZSBjYWxsZXIgc2hvdWxkIGJlIHN1cmUKKyAqIHRvIGNsZWFyIHRoZSB3b3Jrc3BhY2UuIFRoaXMgaXMgbGVmdCB0byB0aGUgY2FsbGVyIHRvIGF2b2lkCisgKiB1bm5lY2Vzc2FyeSBjbGVhcnMgYmV0d2VlbiBjaGFpbmVkIGhhc2hpbmcgb3BlcmF0aW9ucy4KKyAqLwordm9pZCBzaGFfdHJhbnNmb3JtKF9fdTMyICpkaWdlc3QsIGNvbnN0IGNoYXIgKmRhdGEsIF9fdTMyICphcnJheSkKK3sKKwlfX3UzMiBBLCBCLCBDLCBELCBFOworCisJQSA9IGRpZ2VzdFswXTsKKwlCID0gZGlnZXN0WzFdOworCUMgPSBkaWdlc3RbMl07CisJRCA9IGRpZ2VzdFszXTsKKwlFID0gZGlnZXN0WzRdOworCisJLyogUm91bmQgMSAtIGl0ZXJhdGlvbnMgMC0xNiB0YWtlIHRoZWlyIGlucHV0IGZyb20gJ2RhdGEnICovCisJVF8wXzE1KCAwLCBBLCBCLCBDLCBELCBFKTsKKwlUXzBfMTUoIDEsIEUsIEEsIEIsIEMsIEQpOworCVRfMF8xNSggMiwgRCwgRSwgQSwgQiwgQyk7CisJVF8wXzE1KCAzLCBDLCBELCBFLCBBLCBCKTsKKwlUXzBfMTUoIDQsIEIsIEMsIEQsIEUsIEEpOworCVRfMF8xNSggNSwgQSwgQiwgQywgRCwgRSk7CisJVF8wXzE1KCA2LCBFLCBBLCBCLCBDLCBEKTsKKwlUXzBfMTUoIDcsIEQsIEUsIEEsIEIsIEMpOworCVRfMF8xNSggOCwgQywgRCwgRSwgQSwgQik7CisJVF8wXzE1KCA5LCBCLCBDLCBELCBFLCBBKTsKKwlUXzBfMTUoMTAsIEEsIEIsIEMsIEQsIEUpOworCVRfMF8xNSgxMSwgRSwgQSwgQiwgQywgRCk7CisJVF8wXzE1KDEyLCBELCBFLCBBLCBCLCBDKTsKKwlUXzBfMTUoMTMsIEMsIEQsIEUsIEEsIEIpOworCVRfMF8xNSgxNCwgQiwgQywgRCwgRSwgQSk7CisJVF8wXzE1KDE1LCBBLCBCLCBDLCBELCBFKTsKKworCS8qIFJvdW5kIDEgLSB0YWlsLiBJbnB1dCBmcm9tIDUxMi1iaXQgbWl4aW5nIGFycmF5ICovCisJVF8xNl8xOSgxNiwgRSwgQSwgQiwgQywgRCk7CisJVF8xNl8xOSgxNywgRCwgRSwgQSwgQiwgQyk7CisJVF8xNl8xOSgxOCwgQywgRCwgRSwgQSwgQik7CisJVF8xNl8xOSgxOSwgQiwgQywgRCwgRSwgQSk7CisKKwkvKiBSb3VuZCAyICovCisJVF8yMF8zOSgyMCwgQSwgQiwgQywgRCwgRSk7CisJVF8yMF8zOSgyMSwgRSwgQSwgQiwgQywgRCk7CisJVF8yMF8zOSgyMiwgRCwgRSwgQSwgQiwgQyk7CisJVF8yMF8zOSgyMywgQywgRCwgRSwgQSwgQik7CisJVF8yMF8zOSgyNCwgQiwgQywgRCwgRSwgQSk7CisJVF8yMF8zOSgyNSwgQSwgQiwgQywgRCwgRSk7CisJVF8yMF8zOSgyNiwgRSwgQSwgQiwgQywgRCk7CisJVF8yMF8zOSgyNywgRCwgRSwgQSwgQiwgQyk7CisJVF8yMF8zOSgyOCwgQywgRCwgRSwgQSwgQik7CisJVF8yMF8zOSgyOSwgQiwgQywgRCwgRSwgQSk7CisJVF8yMF8zOSgzMCwgQSwgQiwgQywgRCwgRSk7CisJVF8yMF8zOSgzMSwgRSwgQSwgQiwgQywgRCk7CisJVF8yMF8zOSgzMiwgRCwgRSwgQSwgQiwgQyk7CisJVF8yMF8zOSgzMywgQywgRCwgRSwgQSwgQik7CisJVF8yMF8zOSgzNCwgQiwgQywgRCwgRSwgQSk7CisJVF8yMF8zOSgzNSwgQSwgQiwgQywgRCwgRSk7CisJVF8yMF8zOSgzNiwgRSwgQSwgQiwgQywgRCk7CisJVF8yMF8zOSgzNywgRCwgRSwgQSwgQiwgQyk7CisJVF8yMF8zOSgzOCwgQywgRCwgRSwgQSwgQik7CisJVF8yMF8zOSgzOSwgQiwgQywgRCwgRSwgQSk7CisKKwkvKiBSb3VuZCAzICovCisJVF80MF81OSg0MCwgQSwgQiwgQywgRCwgRSk7CisJVF80MF81OSg0MSwgRSwgQSwgQiwgQywgRCk7CisJVF80MF81OSg0MiwgRCwgRSwgQSwgQiwgQyk7CisJVF80MF81OSg0MywgQywgRCwgRSwgQSwgQik7CisJVF80MF81OSg0NCwgQiwgQywgRCwgRSwgQSk7CisJVF80MF81OSg0NSwgQSwgQiwgQywgRCwgRSk7CisJVF80MF81OSg0NiwgRSwgQSwgQiwgQywgRCk7CisJVF80MF81OSg0NywgRCwgRSwgQSwgQiwgQyk7CisJVF80MF81OSg0OCwgQywgRCwgRSwgQSwgQik7CisJVF80MF81OSg0OSwgQiwgQywgRCwgRSwgQSk7CisJVF80MF81OSg1MCwgQSwgQiwgQywgRCwgRSk7CisJVF80MF81OSg1MSwgRSwgQSwgQiwgQywgRCk7CisJVF80MF81OSg1MiwgRCwgRSwgQSwgQiwgQyk7CisJVF80MF81OSg1MywgQywgRCwgRSwgQSwgQik7CisJVF80MF81OSg1NCwgQiwgQywgRCwgRSwgQSk7CisJVF80MF81OSg1NSwgQSwgQiwgQywgRCwgRSk7CisJVF80MF81OSg1NiwgRSwgQSwgQiwgQywgRCk7CisJVF80MF81OSg1NywgRCwgRSwgQSwgQiwgQyk7CisJVF80MF81OSg1OCwgQywgRCwgRSwgQSwgQik7CisJVF80MF81OSg1OSwgQiwgQywgRCwgRSwgQSk7CisKKwkvKiBSb3VuZCA0ICovCisJVF82MF83OSg2MCwgQSwgQiwgQywgRCwgRSk7CisJVF82MF83OSg2MSwgRSwgQSwgQiwgQywgRCk7CisJVF82MF83OSg2MiwgRCwgRSwgQSwgQiwgQyk7CisJVF82MF83OSg2MywgQywgRCwgRSwgQSwgQik7CisJVF82MF83OSg2NCwgQiwgQywgRCwgRSwgQSk7CisJVF82MF83OSg2NSwgQSwgQiwgQywgRCwgRSk7CisJVF82MF83OSg2NiwgRSwgQSwgQiwgQywgRCk7CisJVF82MF83OSg2NywgRCwgRSwgQSwgQiwgQyk7CisJVF82MF83OSg2OCwgQywgRCwgRSwgQSwgQik7CisJVF82MF83OSg2OSwgQiwgQywgRCwgRSwgQSk7CisJVF82MF83OSg3MCwgQSwgQiwgQywgRCwgRSk7CisJVF82MF83OSg3MSwgRSwgQSwgQiwgQywgRCk7CisJVF82MF83OSg3MiwgRCwgRSwgQSwgQiwgQyk7CisJVF82MF83OSg3MywgQywgRCwgRSwgQSwgQik7CisJVF82MF83OSg3NCwgQiwgQywgRCwgRSwgQSk7CisJVF82MF83OSg3NSwgQSwgQiwgQywgRCwgRSk7CisJVF82MF83OSg3NiwgRSwgQSwgQiwgQywgRCk7CisJVF82MF83OSg3NywgRCwgRSwgQSwgQiwgQyk7CisJVF82MF83OSg3OCwgQywgRCwgRSwgQSwgQik7CisJVF82MF83OSg3OSwgQiwgQywgRCwgRSwgQSk7CisKKwlkaWdlc3RbMF0gKz0gQTsKKwlkaWdlc3RbMV0gKz0gQjsKKwlkaWdlc3RbMl0gKz0gQzsKKwlkaWdlc3RbM10gKz0gRDsKKwlkaWdlc3RbNF0gKz0gRTsKK30KK0VYUE9SVF9TWU1CT0woc2hhX3RyYW5zZm9ybSk7CisKKy8qKgorICogc2hhX2luaXQgLSBpbml0aWFsaXplIHRoZSB2ZWN0b3JzIGZvciBhIFNIQTEgZGlnZXN0CisgKiBAYnVmOiB2ZWN0b3IgdG8gaW5pdGlhbGl6ZQorICovCit2b2lkIHNoYV9pbml0KF9fdTMyICpidWYpCit7CisJYnVmWzBdID0gMHg2NzQ1MjMwMTsKKwlidWZbMV0gPSAweGVmY2RhYjg5OworCWJ1ZlsyXSA9IDB4OThiYWRjZmU7CisJYnVmWzNdID0gMHgxMDMyNTQ3NjsKKwlidWZbNF0gPSAweGMzZDJlMWYwOworfQorRVhQT1JUX1NZTUJPTChzaGFfaW5pdCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zaG93X21lbS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2hvd19tZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVhYTFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2hvd19tZW0uYwpAQCAtMCwwICsxLDUyIEBACisvKgorICogR2VuZXJpYyBzaG93X21lbSgpIGltcGxlbWVudGF0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEpvaGFubmVzIFdlaW5lciA8aGFubmVzQHNhZXVyZWJhZC5kZT4KKyAqIEFsbCBjb2RlIHN1YmplY3QgdG8gdGhlIEdQTCB2ZXJzaW9uIDIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcXVpY2tsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvY21hLmg+CisKK3ZvaWQgc2hvd19tZW0odW5zaWduZWQgaW50IGZpbHRlciwgbm9kZW1hc2tfdCAqbm9kZW1hc2spCit7CisJcGdfZGF0YV90ICpwZ2RhdDsKKwl1bnNpZ25lZCBsb25nIHRvdGFsID0gMCwgcmVzZXJ2ZWQgPSAwLCBoaWdobWVtID0gMDsKKworCXByaW50aygiTWVtLUluZm86XG4iKTsKKwlzaG93X2ZyZWVfYXJlYXMoZmlsdGVyLCBub2RlbWFzayk7CisKKwlmb3JfZWFjaF9vbmxpbmVfcGdkYXQocGdkYXQpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJaW50IHpvbmVpZDsKKworCQlwZ2RhdF9yZXNpemVfbG9jayhwZ2RhdCwgJmZsYWdzKTsKKwkJZm9yICh6b25laWQgPSAwOyB6b25laWQgPCBNQVhfTlJfWk9ORVM7IHpvbmVpZCsrKSB7CisJCQlzdHJ1Y3Qgem9uZSAqem9uZSA9ICZwZ2RhdC0+bm9kZV96b25lc1t6b25laWRdOworCQkJaWYgKCFwb3B1bGF0ZWRfem9uZSh6b25lKSkKKwkJCQljb250aW51ZTsKKworCQkJdG90YWwgKz0gem9uZS0+cHJlc2VudF9wYWdlczsKKwkJCXJlc2VydmVkICs9IHpvbmUtPnByZXNlbnRfcGFnZXMgLSB6b25lLT5tYW5hZ2VkX3BhZ2VzOworCisJCQlpZiAoaXNfaGlnaG1lbV9pZHgoem9uZWlkKSkKKwkJCQloaWdobWVtICs9IHpvbmUtPnByZXNlbnRfcGFnZXM7CisJCX0KKwkJcGdkYXRfcmVzaXplX3VubG9jayhwZ2RhdCwgJmZsYWdzKTsKKwl9CisKKwlwcmludGsoIiVsdSBwYWdlcyBSQU1cbiIsIHRvdGFsKTsKKwlwcmludGsoIiVsdSBwYWdlcyBIaWdoTWVtL01vdmFibGVPbmx5XG4iLCBoaWdobWVtKTsKKwlwcmludGsoIiVsdSBwYWdlcyByZXNlcnZlZFxuIiwgcmVzZXJ2ZWQpOworI2lmZGVmIENPTkZJR19DTUEKKwlwcmludGsoIiVsdSBwYWdlcyBjbWEgcmVzZXJ2ZWRcbiIsIHRvdGFsY21hX3BhZ2VzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19RVUlDS0xJU1QKKwlwcmludGsoIiVsdSBwYWdlcyBpbiBwYWdldGFibGUgY2FjaGVcbiIsCisJCXF1aWNrbGlzdF90b3RhbF9zaXplKCkpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX01FTU9SWV9GQUlMVVJFCisJcHJpbnRrKCIlbHUgcGFnZXMgaHdwb2lzb25lZFxuIiwgYXRvbWljX2xvbmdfcmVhZCgmbnVtX3BvaXNvbmVkX3BhZ2VzKSk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NpcGhhc2guYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NpcGhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWU1OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc2lwaGFzaC5jCkBAIC0wLDAgKzEsNTUxIEBACisvKiBDb3B5cmlnaHQgKEMpIDIwMTYgSmFzb24gQS4gRG9uZW5mZWxkIDxKYXNvbkB6eDJjNC5jb20+LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuCisgKgorICogU2lwSGFzaDogYSBmYXN0IHNob3J0LWlucHV0IFBSRgorICogaHR0cHM6Ly8xMzEwMDIubmV0L3NpcGhhc2gvCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzcGVjaWZpY2FsbHkgZm9yIFNpcEhhc2gyLTQgZm9yIGEgc2VjdXJlIFBSRgorICogYW5kIEhhbGZTaXBIYXNoMS0zL1NpcEhhc2gxLTMgZm9yIGFuIGluc2VjdXJlIFBSRiBvbmx5IHN1aXRhYmxlIGZvcgorICogaGFzaHRhYmxlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvc2lwaGFzaC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0RDQUNIRV9XT1JEX0FDQ0VTUykgJiYgQklUU19QRVJfTE9ORyA9PSA2NAorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGFzbS93b3JkLWF0LWEtdGltZS5oPgorI2VuZGlmCisKKyNkZWZpbmUgU0lQUk9VTkQgXAorCWRvIHsgXAorCXYwICs9IHYxOyB2MSA9IHJvbDY0KHYxLCAxMyk7IHYxIF49IHYwOyB2MCA9IHJvbDY0KHYwLCAzMik7IFwKKwl2MiArPSB2MzsgdjMgPSByb2w2NCh2MywgMTYpOyB2MyBePSB2MjsgXAorCXYwICs9IHYzOyB2MyA9IHJvbDY0KHYzLCAyMSk7IHYzIF49IHYwOyBcCisJdjIgKz0gdjE7IHYxID0gcm9sNjQodjEsIDE3KTsgdjEgXj0gdjI7IHYyID0gcm9sNjQodjIsIDMyKTsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgUFJFQU1CTEUobGVuKSBcCisJdTY0IHYwID0gMHg3MzZmNmQ2NTcwNzM2NTc1VUxMOyBcCisJdTY0IHYxID0gMHg2NDZmNzI2MTZlNjQ2ZjZkVUxMOyBcCisJdTY0IHYyID0gMHg2Yzc5Njc2NTZlNjU3MjYxVUxMOyBcCisJdTY0IHYzID0gMHg3NDY1NjQ2Mjc5NzQ2NTczVUxMOyBcCisJdTY0IGIgPSAoKHU2NCkobGVuKSkgPDwgNTY7IFwKKwl2MyBePSBrZXktPmtleVsxXTsgXAorCXYyIF49IGtleS0+a2V5WzBdOyBcCisJdjEgXj0ga2V5LT5rZXlbMV07IFwKKwl2MCBePSBrZXktPmtleVswXTsKKworI2RlZmluZSBQT1NUQU1CTEUgXAorCXYzIF49IGI7IFwKKwlTSVBST1VORDsgXAorCVNJUFJPVU5EOyBcCisJdjAgXj0gYjsgXAorCXYyIF49IDB4ZmY7IFwKKwlTSVBST1VORDsgXAorCVNJUFJPVU5EOyBcCisJU0lQUk9VTkQ7IFwKKwlTSVBST1VORDsgXAorCXJldHVybiAodjAgXiB2MSkgXiAodjIgXiB2Myk7CisKK3U2NCBfX3NpcGhhc2hfYWxpZ25lZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCBjb25zdCBzaXBoYXNoX2tleV90ICprZXkpCit7CisJY29uc3QgdTggKmVuZCA9IGRhdGEgKyBsZW4gLSAobGVuICUgc2l6ZW9mKHU2NCkpOworCWNvbnN0IHU4IGxlZnQgPSBsZW4gJiAoc2l6ZW9mKHU2NCkgLSAxKTsKKwl1NjQgbTsKKwlQUkVBTUJMRShsZW4pCisJZm9yICg7IGRhdGEgIT0gZW5kOyBkYXRhICs9IHNpemVvZih1NjQpKSB7CisJCW0gPSBsZTY0X3RvX2NwdXAoZGF0YSk7CisJCXYzIF49IG07CisJCVNJUFJPVU5EOworCQlTSVBST1VORDsKKwkJdjAgXj0gbTsKKwl9CisjaWYgZGVmaW5lZChDT05GSUdfRENBQ0hFX1dPUkRfQUNDRVNTKSAmJiBCSVRTX1BFUl9MT05HID09IDY0CisJaWYgKGxlZnQpCisJCWIgfD0gbGU2NF90b19jcHUoKF9fZm9yY2UgX19sZTY0KShsb2FkX3VuYWxpZ25lZF96ZXJvcGFkKGRhdGEpICYKKwkJCQkJCSAgYnl0ZW1hc2tfZnJvbV9jb3VudChsZWZ0KSkpOworI2Vsc2UKKwlzd2l0Y2ggKGxlZnQpIHsKKwljYXNlIDc6IGIgfD0gKCh1NjQpZW5kWzZdKSA8PCA0ODsKKwljYXNlIDY6IGIgfD0gKCh1NjQpZW5kWzVdKSA8PCA0MDsKKwljYXNlIDU6IGIgfD0gKCh1NjQpZW5kWzRdKSA8PCAzMjsKKwljYXNlIDQ6IGIgfD0gbGUzMl90b19jcHVwKGRhdGEpOyBicmVhazsKKwljYXNlIDM6IGIgfD0gKCh1NjQpZW5kWzJdKSA8PCAxNjsKKwljYXNlIDI6IGIgfD0gbGUxNl90b19jcHVwKGRhdGEpOyBicmVhazsKKwljYXNlIDE6IGIgfD0gZW5kWzBdOworCX0KKyNlbmRpZgorCVBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChfX3NpcGhhc2hfYWxpZ25lZCk7CisKKyNpZm5kZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKK3U2NCBfX3NpcGhhc2hfdW5hbGlnbmVkKGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4sIGNvbnN0IHNpcGhhc2hfa2V5X3QgKmtleSkKK3sKKwljb25zdCB1OCAqZW5kID0gZGF0YSArIGxlbiAtIChsZW4gJSBzaXplb2YodTY0KSk7CisJY29uc3QgdTggbGVmdCA9IGxlbiAmIChzaXplb2YodTY0KSAtIDEpOworCXU2NCBtOworCVBSRUFNQkxFKGxlbikKKwlmb3IgKDsgZGF0YSAhPSBlbmQ7IGRhdGEgKz0gc2l6ZW9mKHU2NCkpIHsKKwkJbSA9IGdldF91bmFsaWduZWRfbGU2NChkYXRhKTsKKwkJdjMgXj0gbTsKKwkJU0lQUk9VTkQ7CisJCVNJUFJPVU5EOworCQl2MCBePSBtOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19EQ0FDSEVfV09SRF9BQ0NFU1MpICYmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwlpZiAobGVmdCkKKwkJYiB8PSBsZTY0X3RvX2NwdSgoX19mb3JjZSBfX2xlNjQpKGxvYWRfdW5hbGlnbmVkX3plcm9wYWQoZGF0YSkgJgorCQkJCQkJICBieXRlbWFza19mcm9tX2NvdW50KGxlZnQpKSk7CisjZWxzZQorCXN3aXRjaCAobGVmdCkgeworCWNhc2UgNzogYiB8PSAoKHU2NCllbmRbNl0pIDw8IDQ4OworCWNhc2UgNjogYiB8PSAoKHU2NCllbmRbNV0pIDw8IDQwOworCWNhc2UgNTogYiB8PSAoKHU2NCllbmRbNF0pIDw8IDMyOworCWNhc2UgNDogYiB8PSBnZXRfdW5hbGlnbmVkX2xlMzIoZW5kKTsgYnJlYWs7CisJY2FzZSAzOiBiIHw9ICgodTY0KWVuZFsyXSkgPDwgMTY7CisJY2FzZSAyOiBiIHw9IGdldF91bmFsaWduZWRfbGUxNihlbmQpOyBicmVhazsKKwljYXNlIDE6IGIgfD0gZW5kWzBdOworCX0KKyNlbmRpZgorCVBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChfX3NpcGhhc2hfdW5hbGlnbmVkKTsKKyNlbmRpZgorCisvKioKKyAqIHNpcGhhc2hfMXU2NCAtIGNvbXB1dGUgNjQtYml0IHNpcGhhc2ggUFJGIHZhbHVlIG9mIGEgdTY0CisgKiBAZmlyc3Q6IGZpcnN0IHU2NAorICogQGtleTogdGhlIHNpcGhhc2gga2V5CisgKi8KK3U2NCBzaXBoYXNoXzF1NjQoY29uc3QgdTY0IGZpcnN0LCBjb25zdCBzaXBoYXNoX2tleV90ICprZXkpCit7CisJUFJFQU1CTEUoOCkKKwl2MyBePSBmaXJzdDsKKwlTSVBST1VORDsKKwlTSVBST1VORDsKKwl2MCBePSBmaXJzdDsKKwlQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woc2lwaGFzaF8xdTY0KTsKKworLyoqCisgKiBzaXBoYXNoXzJ1NjQgLSBjb21wdXRlIDY0LWJpdCBzaXBoYXNoIFBSRiB2YWx1ZSBvZiAyIHU2NAorICogQGZpcnN0OiBmaXJzdCB1NjQKKyAqIEBzZWNvbmQ6IHNlY29uZCB1NjQKKyAqIEBrZXk6IHRoZSBzaXBoYXNoIGtleQorICovCit1NjQgc2lwaGFzaF8ydTY0KGNvbnN0IHU2NCBmaXJzdCwgY29uc3QgdTY0IHNlY29uZCwgY29uc3Qgc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCVBSRUFNQkxFKDE2KQorCXYzIF49IGZpcnN0OworCVNJUFJPVU5EOworCVNJUFJPVU5EOworCXYwIF49IGZpcnN0OworCXYzIF49IHNlY29uZDsKKwlTSVBST1VORDsKKwlTSVBST1VORDsKKwl2MCBePSBzZWNvbmQ7CisJUE9TVEFNQkxFCit9CitFWFBPUlRfU1lNQk9MKHNpcGhhc2hfMnU2NCk7CisKKy8qKgorICogc2lwaGFzaF8zdTY0IC0gY29tcHV0ZSA2NC1iaXQgc2lwaGFzaCBQUkYgdmFsdWUgb2YgMyB1NjQKKyAqIEBmaXJzdDogZmlyc3QgdTY0CisgKiBAc2Vjb25kOiBzZWNvbmQgdTY0CisgKiBAdGhpcmQ6IHRoaXJkIHU2NAorICogQGtleTogdGhlIHNpcGhhc2gga2V5CisgKi8KK3U2NCBzaXBoYXNoXzN1NjQoY29uc3QgdTY0IGZpcnN0LCBjb25zdCB1NjQgc2Vjb25kLCBjb25zdCB1NjQgdGhpcmQsCisJCSBjb25zdCBzaXBoYXNoX2tleV90ICprZXkpCit7CisJUFJFQU1CTEUoMjQpCisJdjMgXj0gZmlyc3Q7CisJU0lQUk9VTkQ7CisJU0lQUk9VTkQ7CisJdjAgXj0gZmlyc3Q7CisJdjMgXj0gc2Vjb25kOworCVNJUFJPVU5EOworCVNJUFJPVU5EOworCXYwIF49IHNlY29uZDsKKwl2MyBePSB0aGlyZDsKKwlTSVBST1VORDsKKwlTSVBST1VORDsKKwl2MCBePSB0aGlyZDsKKwlQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woc2lwaGFzaF8zdTY0KTsKKworLyoqCisgKiBzaXBoYXNoXzR1NjQgLSBjb21wdXRlIDY0LWJpdCBzaXBoYXNoIFBSRiB2YWx1ZSBvZiA0IHU2NAorICogQGZpcnN0OiBmaXJzdCB1NjQKKyAqIEBzZWNvbmQ6IHNlY29uZCB1NjQKKyAqIEB0aGlyZDogdGhpcmQgdTY0CisgKiBAZm9ydGg6IGZvcnRoIHU2NAorICogQGtleTogdGhlIHNpcGhhc2gga2V5CisgKi8KK3U2NCBzaXBoYXNoXzR1NjQoY29uc3QgdTY0IGZpcnN0LCBjb25zdCB1NjQgc2Vjb25kLCBjb25zdCB1NjQgdGhpcmQsCisJCSBjb25zdCB1NjQgZm9ydGgsIGNvbnN0IHNpcGhhc2hfa2V5X3QgKmtleSkKK3sKKwlQUkVBTUJMRSgzMikKKwl2MyBePSBmaXJzdDsKKwlTSVBST1VORDsKKwlTSVBST1VORDsKKwl2MCBePSBmaXJzdDsKKwl2MyBePSBzZWNvbmQ7CisJU0lQUk9VTkQ7CisJU0lQUk9VTkQ7CisJdjAgXj0gc2Vjb25kOworCXYzIF49IHRoaXJkOworCVNJUFJPVU5EOworCVNJUFJPVU5EOworCXYwIF49IHRoaXJkOworCXYzIF49IGZvcnRoOworCVNJUFJPVU5EOworCVNJUFJPVU5EOworCXYwIF49IGZvcnRoOworCVBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChzaXBoYXNoXzR1NjQpOworCit1NjQgc2lwaGFzaF8xdTMyKGNvbnN0IHUzMiBmaXJzdCwgY29uc3Qgc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCVBSRUFNQkxFKDQpCisJYiB8PSBmaXJzdDsKKwlQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woc2lwaGFzaF8xdTMyKTsKKwordTY0IHNpcGhhc2hfM3UzMihjb25zdCB1MzIgZmlyc3QsIGNvbnN0IHUzMiBzZWNvbmQsIGNvbnN0IHUzMiB0aGlyZCwKKwkJIGNvbnN0IHNpcGhhc2hfa2V5X3QgKmtleSkKK3sKKwl1NjQgY29tYmluZWQgPSAodTY0KXNlY29uZCA8PCAzMiB8IGZpcnN0OworCVBSRUFNQkxFKDEyKQorCXYzIF49IGNvbWJpbmVkOworCVNJUFJPVU5EOworCVNJUFJPVU5EOworCXYwIF49IGNvbWJpbmVkOworCWIgfD0gdGhpcmQ7CisJUE9TVEFNQkxFCit9CitFWFBPUlRfU1lNQk9MKHNpcGhhc2hfM3UzMik7CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisvKiBOb3RlIHRoYXQgb24gNjQtYml0LCB3ZSBtYWtlIEhhbGZTaXBIYXNoMS0zIGFjdHVhbGx5IGJlIFNpcEhhc2gxLTMsIGZvcgorICogcGVyZm9ybWFuY2UgcmVhc29ucy4gT24gMzItYml0LCBiZWxvdywgd2UgYWN0dWFsbHkgaW1wbGVtZW50IEhhbGZTaXBIYXNoMS0zLgorICovCisKKyNkZWZpbmUgSFNJUFJPVU5EIFNJUFJPVU5ECisjZGVmaW5lIEhQUkVBTUJMRShsZW4pIFBSRUFNQkxFKGxlbikKKyNkZWZpbmUgSFBPU1RBTUJMRSBcCisJdjMgXj0gYjsgXAorCUhTSVBST1VORDsgXAorCXYwIF49IGI7IFwKKwl2MiBePSAweGZmOyBcCisJSFNJUFJPVU5EOyBcCisJSFNJUFJPVU5EOyBcCisJSFNJUFJPVU5EOyBcCisJcmV0dXJuICh2MCBeIHYxKSBeICh2MiBeIHYzKTsKKwordTMyIF9faHNpcGhhc2hfYWxpZ25lZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCWNvbnN0IHU4ICplbmQgPSBkYXRhICsgbGVuIC0gKGxlbiAlIHNpemVvZih1NjQpKTsKKwljb25zdCB1OCBsZWZ0ID0gbGVuICYgKHNpemVvZih1NjQpIC0gMSk7CisJdTY0IG07CisJSFBSRUFNQkxFKGxlbikKKwlmb3IgKDsgZGF0YSAhPSBlbmQ7IGRhdGEgKz0gc2l6ZW9mKHU2NCkpIHsKKwkJbSA9IGxlNjRfdG9fY3B1cChkYXRhKTsKKwkJdjMgXj0gbTsKKwkJSFNJUFJPVU5EOworCQl2MCBePSBtOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19EQ0FDSEVfV09SRF9BQ0NFU1MpICYmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwlpZiAobGVmdCkKKwkJYiB8PSBsZTY0X3RvX2NwdSgoX19mb3JjZSBfX2xlNjQpKGxvYWRfdW5hbGlnbmVkX3plcm9wYWQoZGF0YSkgJgorCQkJCQkJICBieXRlbWFza19mcm9tX2NvdW50KGxlZnQpKSk7CisjZWxzZQorCXN3aXRjaCAobGVmdCkgeworCWNhc2UgNzogYiB8PSAoKHU2NCllbmRbNl0pIDw8IDQ4OworCWNhc2UgNjogYiB8PSAoKHU2NCllbmRbNV0pIDw8IDQwOworCWNhc2UgNTogYiB8PSAoKHU2NCllbmRbNF0pIDw8IDMyOworCWNhc2UgNDogYiB8PSBsZTMyX3RvX2NwdXAoZGF0YSk7IGJyZWFrOworCWNhc2UgMzogYiB8PSAoKHU2NCllbmRbMl0pIDw8IDE2OworCWNhc2UgMjogYiB8PSBsZTE2X3RvX2NwdXAoZGF0YSk7IGJyZWFrOworCWNhc2UgMTogYiB8PSBlbmRbMF07CisJfQorI2VuZGlmCisJSFBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChfX2hzaXBoYXNoX2FsaWduZWQpOworCisjaWZuZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCit1MzIgX19oc2lwaGFzaF91bmFsaWduZWQoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbiwKKwkJCSBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCWNvbnN0IHU4ICplbmQgPSBkYXRhICsgbGVuIC0gKGxlbiAlIHNpemVvZih1NjQpKTsKKwljb25zdCB1OCBsZWZ0ID0gbGVuICYgKHNpemVvZih1NjQpIC0gMSk7CisJdTY0IG07CisJSFBSRUFNQkxFKGxlbikKKwlmb3IgKDsgZGF0YSAhPSBlbmQ7IGRhdGEgKz0gc2l6ZW9mKHU2NCkpIHsKKwkJbSA9IGdldF91bmFsaWduZWRfbGU2NChkYXRhKTsKKwkJdjMgXj0gbTsKKwkJSFNJUFJPVU5EOworCQl2MCBePSBtOworCX0KKyNpZiBkZWZpbmVkKENPTkZJR19EQ0FDSEVfV09SRF9BQ0NFU1MpICYmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKwlpZiAobGVmdCkKKwkJYiB8PSBsZTY0X3RvX2NwdSgoX19mb3JjZSBfX2xlNjQpKGxvYWRfdW5hbGlnbmVkX3plcm9wYWQoZGF0YSkgJgorCQkJCQkJICBieXRlbWFza19mcm9tX2NvdW50KGxlZnQpKSk7CisjZWxzZQorCXN3aXRjaCAobGVmdCkgeworCWNhc2UgNzogYiB8PSAoKHU2NCllbmRbNl0pIDw8IDQ4OworCWNhc2UgNjogYiB8PSAoKHU2NCllbmRbNV0pIDw8IDQwOworCWNhc2UgNTogYiB8PSAoKHU2NCllbmRbNF0pIDw8IDMyOworCWNhc2UgNDogYiB8PSBnZXRfdW5hbGlnbmVkX2xlMzIoZW5kKTsgYnJlYWs7CisJY2FzZSAzOiBiIHw9ICgodTY0KWVuZFsyXSkgPDwgMTY7CisJY2FzZSAyOiBiIHw9IGdldF91bmFsaWduZWRfbGUxNihlbmQpOyBicmVhazsKKwljYXNlIDE6IGIgfD0gZW5kWzBdOworCX0KKyNlbmRpZgorCUhQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woX19oc2lwaGFzaF91bmFsaWduZWQpOworI2VuZGlmCisKKy8qKgorICogaHNpcGhhc2hfMXUzMiAtIGNvbXB1dGUgNjQtYml0IGhzaXBoYXNoIFBSRiB2YWx1ZSBvZiBhIHUzMgorICogQGZpcnN0OiBmaXJzdCB1MzIKKyAqIEBrZXk6IHRoZSBoc2lwaGFzaCBrZXkKKyAqLwordTMyIGhzaXBoYXNoXzF1MzIoY29uc3QgdTMyIGZpcnN0LCBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCUhQUkVBTUJMRSg0KQorCWIgfD0gZmlyc3Q7CisJSFBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChoc2lwaGFzaF8xdTMyKTsKKworLyoqCisgKiBoc2lwaGFzaF8ydTMyIC0gY29tcHV0ZSAzMi1iaXQgaHNpcGhhc2ggUFJGIHZhbHVlIG9mIDIgdTMyCisgKiBAZmlyc3Q6IGZpcnN0IHUzMgorICogQHNlY29uZDogc2Vjb25kIHUzMgorICogQGtleTogdGhlIGhzaXBoYXNoIGtleQorICovCit1MzIgaHNpcGhhc2hfMnUzMihjb25zdCB1MzIgZmlyc3QsIGNvbnN0IHUzMiBzZWNvbmQsIGNvbnN0IGhzaXBoYXNoX2tleV90ICprZXkpCit7CisJdTY0IGNvbWJpbmVkID0gKHU2NClzZWNvbmQgPDwgMzIgfCBmaXJzdDsKKwlIUFJFQU1CTEUoOCkKKwl2MyBePSBjb21iaW5lZDsKKwlIU0lQUk9VTkQ7CisJdjAgXj0gY29tYmluZWQ7CisJSFBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChoc2lwaGFzaF8ydTMyKTsKKworLyoqCisgKiBoc2lwaGFzaF8zdTMyIC0gY29tcHV0ZSAzMi1iaXQgaHNpcGhhc2ggUFJGIHZhbHVlIG9mIDMgdTMyCisgKiBAZmlyc3Q6IGZpcnN0IHUzMgorICogQHNlY29uZDogc2Vjb25kIHUzMgorICogQHRoaXJkOiB0aGlyZCB1MzIKKyAqIEBrZXk6IHRoZSBoc2lwaGFzaCBrZXkKKyAqLwordTMyIGhzaXBoYXNoXzN1MzIoY29uc3QgdTMyIGZpcnN0LCBjb25zdCB1MzIgc2Vjb25kLCBjb25zdCB1MzIgdGhpcmQsCisJCSAgY29uc3QgaHNpcGhhc2hfa2V5X3QgKmtleSkKK3sKKwl1NjQgY29tYmluZWQgPSAodTY0KXNlY29uZCA8PCAzMiB8IGZpcnN0OworCUhQUkVBTUJMRSgxMikKKwl2MyBePSBjb21iaW5lZDsKKwlIU0lQUk9VTkQ7CisJdjAgXj0gY29tYmluZWQ7CisJYiB8PSB0aGlyZDsKKwlIUE9TVEFNQkxFCit9CitFWFBPUlRfU1lNQk9MKGhzaXBoYXNoXzN1MzIpOworCisvKioKKyAqIGhzaXBoYXNoXzR1MzIgLSBjb21wdXRlIDMyLWJpdCBoc2lwaGFzaCBQUkYgdmFsdWUgb2YgNCB1MzIKKyAqIEBmaXJzdDogZmlyc3QgdTMyCisgKiBAc2Vjb25kOiBzZWNvbmQgdTMyCisgKiBAdGhpcmQ6IHRoaXJkIHUzMgorICogQGZvcnRoOiBmb3J0aCB1MzIKKyAqIEBrZXk6IHRoZSBoc2lwaGFzaCBrZXkKKyAqLwordTMyIGhzaXBoYXNoXzR1MzIoY29uc3QgdTMyIGZpcnN0LCBjb25zdCB1MzIgc2Vjb25kLCBjb25zdCB1MzIgdGhpcmQsCisJCSAgY29uc3QgdTMyIGZvcnRoLCBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCXU2NCBjb21iaW5lZCA9ICh1NjQpc2Vjb25kIDw8IDMyIHwgZmlyc3Q7CisJSFBSRUFNQkxFKDE2KQorCXYzIF49IGNvbWJpbmVkOworCUhTSVBST1VORDsKKwl2MCBePSBjb21iaW5lZDsKKwljb21iaW5lZCA9ICh1NjQpZm9ydGggPDwgMzIgfCB0aGlyZDsKKwl2MyBePSBjb21iaW5lZDsKKwlIU0lQUk9VTkQ7CisJdjAgXj0gY29tYmluZWQ7CisJSFBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChoc2lwaGFzaF80dTMyKTsKKyNlbHNlCisjZGVmaW5lIEhTSVBST1VORCBcCisJZG8geyBcCisJdjAgKz0gdjE7IHYxID0gcm9sMzIodjEsIDUpOyB2MSBePSB2MDsgdjAgPSByb2wzMih2MCwgMTYpOyBcCisJdjIgKz0gdjM7IHYzID0gcm9sMzIodjMsIDgpOyB2MyBePSB2MjsgXAorCXYwICs9IHYzOyB2MyA9IHJvbDMyKHYzLCA3KTsgdjMgXj0gdjA7IFwKKwl2MiArPSB2MTsgdjEgPSByb2wzMih2MSwgMTMpOyB2MSBePSB2MjsgdjIgPSByb2wzMih2MiwgMTYpOyBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBIUFJFQU1CTEUobGVuKSBcCisJdTMyIHYwID0gMDsgXAorCXUzMiB2MSA9IDA7IFwKKwl1MzIgdjIgPSAweDZjNzk2NzY1VTsgXAorCXUzMiB2MyA9IDB4NzQ2NTY0NjJVOyBcCisJdTMyIGIgPSAoKHUzMikobGVuKSkgPDwgMjQ7IFwKKwl2MyBePSBrZXktPmtleVsxXTsgXAorCXYyIF49IGtleS0+a2V5WzBdOyBcCisJdjEgXj0ga2V5LT5rZXlbMV07IFwKKwl2MCBePSBrZXktPmtleVswXTsKKworI2RlZmluZSBIUE9TVEFNQkxFIFwKKwl2MyBePSBiOyBcCisJSFNJUFJPVU5EOyBcCisJdjAgXj0gYjsgXAorCXYyIF49IDB4ZmY7IFwKKwlIU0lQUk9VTkQ7IFwKKwlIU0lQUk9VTkQ7IFwKKwlIU0lQUk9VTkQ7IFwKKwlyZXR1cm4gdjEgXiB2MzsKKwordTMyIF9faHNpcGhhc2hfYWxpZ25lZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLCBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCWNvbnN0IHU4ICplbmQgPSBkYXRhICsgbGVuIC0gKGxlbiAlIHNpemVvZih1MzIpKTsKKwljb25zdCB1OCBsZWZ0ID0gbGVuICYgKHNpemVvZih1MzIpIC0gMSk7CisJdTMyIG07CisJSFBSRUFNQkxFKGxlbikKKwlmb3IgKDsgZGF0YSAhPSBlbmQ7IGRhdGEgKz0gc2l6ZW9mKHUzMikpIHsKKwkJbSA9IGxlMzJfdG9fY3B1cChkYXRhKTsKKwkJdjMgXj0gbTsKKwkJSFNJUFJPVU5EOworCQl2MCBePSBtOworCX0KKwlzd2l0Y2ggKGxlZnQpIHsKKwljYXNlIDM6IGIgfD0gKCh1MzIpZW5kWzJdKSA8PCAxNjsKKwljYXNlIDI6IGIgfD0gbGUxNl90b19jcHVwKGRhdGEpOyBicmVhazsKKwljYXNlIDE6IGIgfD0gZW5kWzBdOworCX0KKwlIUE9TVEFNQkxFCit9CitFWFBPUlRfU1lNQk9MKF9faHNpcGhhc2hfYWxpZ25lZCk7CisKKyNpZm5kZWYgQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MKK3UzMiBfX2hzaXBoYXNoX3VuYWxpZ25lZChjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuLAorCQkJIGNvbnN0IGhzaXBoYXNoX2tleV90ICprZXkpCit7CisJY29uc3QgdTggKmVuZCA9IGRhdGEgKyBsZW4gLSAobGVuICUgc2l6ZW9mKHUzMikpOworCWNvbnN0IHU4IGxlZnQgPSBsZW4gJiAoc2l6ZW9mKHUzMikgLSAxKTsKKwl1MzIgbTsKKwlIUFJFQU1CTEUobGVuKQorCWZvciAoOyBkYXRhICE9IGVuZDsgZGF0YSArPSBzaXplb2YodTMyKSkgeworCQltID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGRhdGEpOworCQl2MyBePSBtOworCQlIU0lQUk9VTkQ7CisJCXYwIF49IG07CisJfQorCXN3aXRjaCAobGVmdCkgeworCWNhc2UgMzogYiB8PSAoKHUzMillbmRbMl0pIDw8IDE2OworCWNhc2UgMjogYiB8PSBnZXRfdW5hbGlnbmVkX2xlMTYoZW5kKTsgYnJlYWs7CisJY2FzZSAxOiBiIHw9IGVuZFswXTsKKwl9CisJSFBPU1RBTUJMRQorfQorRVhQT1JUX1NZTUJPTChfX2hzaXBoYXNoX3VuYWxpZ25lZCk7CisjZW5kaWYKKworLyoqCisgKiBoc2lwaGFzaF8xdTMyIC0gY29tcHV0ZSAzMi1iaXQgaHNpcGhhc2ggUFJGIHZhbHVlIG9mIGEgdTMyCisgKiBAZmlyc3Q6IGZpcnN0IHUzMgorICogQGtleTogdGhlIGhzaXBoYXNoIGtleQorICovCit1MzIgaHNpcGhhc2hfMXUzMihjb25zdCB1MzIgZmlyc3QsIGNvbnN0IGhzaXBoYXNoX2tleV90ICprZXkpCit7CisJSFBSRUFNQkxFKDQpCisJdjMgXj0gZmlyc3Q7CisJSFNJUFJPVU5EOworCXYwIF49IGZpcnN0OworCUhQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woaHNpcGhhc2hfMXUzMik7CisKKy8qKgorICogaHNpcGhhc2hfMnUzMiAtIGNvbXB1dGUgMzItYml0IGhzaXBoYXNoIFBSRiB2YWx1ZSBvZiAyIHUzMgorICogQGZpcnN0OiBmaXJzdCB1MzIKKyAqIEBzZWNvbmQ6IHNlY29uZCB1MzIKKyAqIEBrZXk6IHRoZSBoc2lwaGFzaCBrZXkKKyAqLwordTMyIGhzaXBoYXNoXzJ1MzIoY29uc3QgdTMyIGZpcnN0LCBjb25zdCB1MzIgc2Vjb25kLCBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCUhQUkVBTUJMRSg4KQorCXYzIF49IGZpcnN0OworCUhTSVBST1VORDsKKwl2MCBePSBmaXJzdDsKKwl2MyBePSBzZWNvbmQ7CisJSFNJUFJPVU5EOworCXYwIF49IHNlY29uZDsKKwlIUE9TVEFNQkxFCit9CitFWFBPUlRfU1lNQk9MKGhzaXBoYXNoXzJ1MzIpOworCisvKioKKyAqIGhzaXBoYXNoXzN1MzIgLSBjb21wdXRlIDMyLWJpdCBoc2lwaGFzaCBQUkYgdmFsdWUgb2YgMyB1MzIKKyAqIEBmaXJzdDogZmlyc3QgdTMyCisgKiBAc2Vjb25kOiBzZWNvbmQgdTMyCisgKiBAdGhpcmQ6IHRoaXJkIHUzMgorICogQGtleTogdGhlIGhzaXBoYXNoIGtleQorICovCit1MzIgaHNpcGhhc2hfM3UzMihjb25zdCB1MzIgZmlyc3QsIGNvbnN0IHUzMiBzZWNvbmQsIGNvbnN0IHUzMiB0aGlyZCwKKwkJICBjb25zdCBoc2lwaGFzaF9rZXlfdCAqa2V5KQoreworCUhQUkVBTUJMRSgxMikKKwl2MyBePSBmaXJzdDsKKwlIU0lQUk9VTkQ7CisJdjAgXj0gZmlyc3Q7CisJdjMgXj0gc2Vjb25kOworCUhTSVBST1VORDsKKwl2MCBePSBzZWNvbmQ7CisJdjMgXj0gdGhpcmQ7CisJSFNJUFJPVU5EOworCXYwIF49IHRoaXJkOworCUhQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woaHNpcGhhc2hfM3UzMik7CisKKy8qKgorICogaHNpcGhhc2hfNHUzMiAtIGNvbXB1dGUgMzItYml0IGhzaXBoYXNoIFBSRiB2YWx1ZSBvZiA0IHUzMgorICogQGZpcnN0OiBmaXJzdCB1MzIKKyAqIEBzZWNvbmQ6IHNlY29uZCB1MzIKKyAqIEB0aGlyZDogdGhpcmQgdTMyCisgKiBAZm9ydGg6IGZvcnRoIHUzMgorICogQGtleTogdGhlIGhzaXBoYXNoIGtleQorICovCit1MzIgaHNpcGhhc2hfNHUzMihjb25zdCB1MzIgZmlyc3QsIGNvbnN0IHUzMiBzZWNvbmQsIGNvbnN0IHUzMiB0aGlyZCwKKwkJICBjb25zdCB1MzIgZm9ydGgsIGNvbnN0IGhzaXBoYXNoX2tleV90ICprZXkpCit7CisJSFBSRUFNQkxFKDE2KQorCXYzIF49IGZpcnN0OworCUhTSVBST1VORDsKKwl2MCBePSBmaXJzdDsKKwl2MyBePSBzZWNvbmQ7CisJSFNJUFJPVU5EOworCXYwIF49IHNlY29uZDsKKwl2MyBePSB0aGlyZDsKKwlIU0lQUk9VTkQ7CisJdjAgXj0gdGhpcmQ7CisJdjMgXj0gZm9ydGg7CisJSFNJUFJPVU5EOworCXYwIF49IGZvcnRoOworCUhQT1NUQU1CTEUKK30KK0VYUE9SVF9TWU1CT0woaHNpcGhhc2hfNHUzMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NtcF9wcm9jZXNzb3JfaWQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NtcF9wcm9jZXNzb3JfaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzVjYzZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc21wX3Byb2Nlc3Nvcl9pZC5jCkBAIC0wLDAgKzEsNjUgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogbGliL3NtcF9wcm9jZXNzb3JfaWQuYworICoKKyAqIERFQlVHX1BSRUVNUFQgdmFyaWFudCBvZiBzbXBfcHJvY2Vzc29yX2lkKCkuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK25vdHJhY2Ugc3RhdGljIHVuc2lnbmVkIGludCBjaGVja19wcmVlbXB0aW9uX2Rpc2FibGVkKGNvbnN0IGNoYXIgKndoYXQxLAorCQkJCQkJCWNvbnN0IGNoYXIgKndoYXQyKQoreworCWludCB0aGlzX2NwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAobGlrZWx5KHByZWVtcHRfY291bnQoKSkpCisJCWdvdG8gb3V0OworCisJaWYgKGlycXNfZGlzYWJsZWQoKSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIEtlcm5lbCB0aHJlYWRzIGJvdW5kIHRvIGEgc2luZ2xlIENQVSBjYW4gc2FmZWx5IHVzZQorCSAqIHNtcF9wcm9jZXNzb3JfaWQoKToKKwkgKi8KKwlpZiAoY3B1bWFza19lcXVhbCgmY3VycmVudC0+Y3B1c19hbGxvd2VkLCBjcHVtYXNrX29mKHRoaXNfY3B1KSkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJdCBpcyB2YWxpZCB0byBhc3N1bWUgQ1BVLWxvY2FsaXR5IGR1cmluZyBlYXJseSBib290dXA6CisJICovCisJaWYgKHN5c3RlbV9zdGF0ZSA8IFNZU1RFTV9TQ0hFRFVMSU5HKQorCQlnb3RvIG91dDsKKworCS8qCisJICogQXZvaWQgcmVjdXJzaW9uOgorCSAqLworCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7CisKKwlpZiAoIXByaW50a19yYXRlbGltaXQoKSkKKwkJZ290byBvdXRfZW5hYmxlOworCisJcHJpbnRrKEtFUk5fRVJSICJCVUc6IHVzaW5nICVzJXMoKSBpbiBwcmVlbXB0aWJsZSBbJTA4eF0gY29kZTogJXMvJWRcbiIsCisJCXdoYXQxLCB3aGF0MiwgcHJlZW1wdF9jb3VudCgpIC0gMSwgY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkKTsKKworCXByaW50X3N5bWJvbCgiY2FsbGVyIGlzICVzXG4iLCAobG9uZylfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkpOworCWR1bXBfc3RhY2soKTsKKworb3V0X2VuYWJsZToKKwlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkX25vdHJhY2UoKTsKK291dDoKKwlyZXR1cm4gdGhpc19jcHU7Cit9CisKK25vdHJhY2UgdW5zaWduZWQgaW50IGRlYnVnX3NtcF9wcm9jZXNzb3JfaWQodm9pZCkKK3sKKwlyZXR1cm4gY2hlY2tfcHJlZW1wdGlvbl9kaXNhYmxlZCgic21wX3Byb2Nlc3Nvcl9pZCIsICIiKTsKK30KK0VYUE9SVF9TWU1CT0woZGVidWdfc21wX3Byb2Nlc3Nvcl9pZCk7CisKK25vdHJhY2Ugdm9pZCBfX3RoaXNfY3B1X3ByZWVtcHRfY2hlY2soY29uc3QgY2hhciAqb3ApCit7CisJY2hlY2tfcHJlZW1wdGlvbl9kaXNhYmxlZCgiX190aGlzX2NwdV8iLCBvcCk7Cit9CitFWFBPUlRfU1lNQk9MKF9fdGhpc19jcHVfcHJlZW1wdF9jaGVjayk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zb3J0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiN2EyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3NvcnQuYwpAQCAtMCwwICsxLDEwNiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBBIGZhc3QsIHNtYWxsLCBub24tcmVjdXJzaXZlIE8obmxvZyBuKSBzb3J0IGZvciB0aGUgTGludXgga2VybmVsCisgKgorICogSmFuIDIzIDIwMDUgIE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ydC5oPgorCitzdGF0aWMgaW50IGFsaWdubWVudF9vayhjb25zdCB2b2lkICpiYXNlLCBpbnQgYWxpZ24pCit7CisJcmV0dXJuIElTX0VOQUJMRUQoQ09ORklHX0hBVkVfRUZGSUNJRU5UX1VOQUxJR05FRF9BQ0NFU1MpIHx8CisJCSgodW5zaWduZWQgbG9uZyliYXNlICYgKGFsaWduIC0gMSkpID09IDA7Cit9CisKK3N0YXRpYyB2b2lkIHUzMl9zd2FwKHZvaWQgKmEsIHZvaWQgKmIsIGludCBzaXplKQoreworCXUzMiB0ID0gKih1MzIgKilhOworCSoodTMyICopYSA9ICoodTMyICopYjsKKwkqKHUzMiAqKWIgPSB0OworfQorCitzdGF0aWMgdm9pZCB1NjRfc3dhcCh2b2lkICphLCB2b2lkICpiLCBpbnQgc2l6ZSkKK3sKKwl1NjQgdCA9ICoodTY0ICopYTsKKwkqKHU2NCAqKWEgPSAqKHU2NCAqKWI7CisJKih1NjQgKiliID0gdDsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJpY19zd2FwKHZvaWQgKmEsIHZvaWQgKmIsIGludCBzaXplKQoreworCWNoYXIgdDsKKworCWRvIHsKKwkJdCA9ICooY2hhciAqKWE7CisJCSooY2hhciAqKWErKyA9ICooY2hhciAqKWI7CisJCSooY2hhciAqKWIrKyA9IHQ7CisJfSB3aGlsZSAoLS1zaXplID4gMCk7Cit9CisKKy8qKgorICogc29ydCAtIHNvcnQgYW4gYXJyYXkgb2YgZWxlbWVudHMKKyAqIEBiYXNlOiBwb2ludGVyIHRvIGRhdGEgdG8gc29ydAorICogQG51bTogbnVtYmVyIG9mIGVsZW1lbnRzCisgKiBAc2l6ZTogc2l6ZSBvZiBlYWNoIGVsZW1lbnQKKyAqIEBjbXBfZnVuYzogcG9pbnRlciB0byBjb21wYXJpc29uIGZ1bmN0aW9uCisgKiBAc3dhcF9mdW5jOiBwb2ludGVyIHRvIHN3YXAgZnVuY3Rpb24gb3IgTlVMTAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyBhIGhlYXBzb3J0IG9uIHRoZSBnaXZlbiBhcnJheS4gWW91IG1heSBwcm92aWRlIGEKKyAqIHN3YXBfZnVuYyBmdW5jdGlvbiBvcHRpbWl6ZWQgdG8geW91ciBlbGVtZW50IHR5cGUuCisgKgorICogU29ydGluZyB0aW1lIGlzIE8obiBsb2cgbikgYm90aCBvbiBhdmVyYWdlIGFuZCB3b3JzdC1jYXNlLiBXaGlsZQorICogcXNvcnQgaXMgYWJvdXQgMjAlIGZhc3RlciBvbiBhdmVyYWdlLCBpdCBzdWZmZXJzIGZyb20gZXhwbG9pdGFibGUKKyAqIE8obipuKSB3b3JzdC1jYXNlIGJlaGF2aW9yIGFuZCBleHRyYSBtZW1vcnkgcmVxdWlyZW1lbnRzIHRoYXQgbWFrZQorICogaXQgbGVzcyBzdWl0YWJsZSBmb3Iga2VybmVsIHVzZS4KKyAqLworCit2b2lkIHNvcnQodm9pZCAqYmFzZSwgc2l6ZV90IG51bSwgc2l6ZV90IHNpemUsCisJICBpbnQgKCpjbXBfZnVuYykoY29uc3Qgdm9pZCAqLCBjb25zdCB2b2lkICopLAorCSAgdm9pZCAoKnN3YXBfZnVuYykodm9pZCAqLCB2b2lkICosIGludCBzaXplKSkKK3sKKwkvKiBwcmUtc2NhbGUgY291bnRlcnMgZm9yIHBlcmZvcm1hbmNlICovCisJaW50IGkgPSAobnVtLzIgLSAxKSAqIHNpemUsIG4gPSBudW0gKiBzaXplLCBjLCByOworCisJaWYgKCFzd2FwX2Z1bmMpIHsKKwkJaWYgKHNpemUgPT0gNCAmJiBhbGlnbm1lbnRfb2soYmFzZSwgNCkpCisJCQlzd2FwX2Z1bmMgPSB1MzJfc3dhcDsKKwkJZWxzZSBpZiAoc2l6ZSA9PSA4ICYmIGFsaWdubWVudF9vayhiYXNlLCA4KSkKKwkJCXN3YXBfZnVuYyA9IHU2NF9zd2FwOworCQllbHNlCisJCQlzd2FwX2Z1bmMgPSBnZW5lcmljX3N3YXA7CisJfQorCisJLyogaGVhcGlmeSAqLworCWZvciAoIDsgaSA+PSAwOyBpIC09IHNpemUpIHsKKwkJZm9yIChyID0gaTsgciAqIDIgKyBzaXplIDwgbjsgciAgPSBjKSB7CisJCQljID0gciAqIDIgKyBzaXplOworCQkJaWYgKGMgPCBuIC0gc2l6ZSAmJgorCQkJCQljbXBfZnVuYyhiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCisJCQkJYyArPSBzaXplOworCQkJaWYgKGNtcF9mdW5jKGJhc2UgKyByLCBiYXNlICsgYykgPj0gMCkKKwkJCQlicmVhazsKKwkJCXN3YXBfZnVuYyhiYXNlICsgciwgYmFzZSArIGMsIHNpemUpOworCQl9CisJfQorCisJLyogc29ydCAqLworCWZvciAoaSA9IG4gLSBzaXplOyBpID4gMDsgaSAtPSBzaXplKSB7CisJCXN3YXBfZnVuYyhiYXNlLCBiYXNlICsgaSwgc2l6ZSk7CisJCWZvciAociA9IDA7IHIgKiAyICsgc2l6ZSA8IGk7IHIgPSBjKSB7CisJCQljID0gciAqIDIgKyBzaXplOworCQkJaWYgKGMgPCBpIC0gc2l6ZSAmJgorCQkJCQljbXBfZnVuYyhiYXNlICsgYywgYmFzZSArIGMgKyBzaXplKSA8IDApCisJCQkJYyArPSBzaXplOworCQkJaWYgKGNtcF9mdW5jKGJhc2UgKyByLCBiYXNlICsgYykgPj0gMCkKKwkJCQlicmVhazsKKwkJCXN3YXBfZnVuYyhiYXNlICsgciwgYmFzZSArIGMsIHNpemUpOworCQl9CisJfQorfQorCitFWFBPUlRfU1lNQk9MKHNvcnQpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3RhY2tkZXBvdC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3RhY2tkZXBvdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OWZmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdGFja2RlcG90LmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBHZW5lcmljIHN0YWNrIGRlcG90IGZvciBzdG9yaW5nIHN0YWNrIHRyYWNlcy4KKyAqCisgKiBTb21lIGRlYnVnZ2luZyB0b29scyBuZWVkIHRvIHNhdmUgc3RhY2sgdHJhY2VzIG9mIGNlcnRhaW4gZXZlbnRzIHdoaWNoIGNhbgorICogYmUgbGF0ZXIgcHJlc2VudGVkIHRvIHRoZSB1c2VyLiBGb3IgZXhhbXBsZSwgS0FTQU4gbmVlZHMgdG8gc2FmZSBhbGxvYyBhbmQKKyAqIGZyZWUgc3RhY2tzIGZvciBlYWNoIG9iamVjdCwgYnV0IHN0b3JpbmcgdHdvIHN0YWNrIHRyYWNlcyBwZXIgb2JqZWN0CisgKiByZXF1aXJlcyB0b28gbXVjaCBtZW1vcnkgKGUuZy4gU0xVQl9ERUJVRyBuZWVkcyAyNTYgYnl0ZXMgcGVyIG9iamVjdCBmb3IKKyAqIHRoYXQpLgorICoKKyAqIEluc3RlYWQsIHN0YWNrIGRlcG90IG1haW50YWlucyBhIGhhc2h0YWJsZSBvZiB1bmlxdWUgc3RhY2t0cmFjZXMuIFNpbmNlIGFsbG9jCisgKiBhbmQgZnJlZSBzdGFja3MgcmVwZWF0IGEgbG90LCB3ZSBzYXZlIGFib3V0IDEwMHggc3BhY2UuCisgKiBTdGFja3MgYXJlIG5ldmVyIHJlbW92ZWQgZnJvbSBkZXBvdCwgc28gd2Ugc3RvcmUgdGhlbSBjb250aWd1b3VzbHkgb25lIGFmdGVyCisgKiBhbm90aGVyIGluIGEgY29udGlndW9zIG1lbW9yeSBhbGxvY2F0aW9uLgorICoKKyAqIEF1dGhvcjogQWxleGFuZGVyIFBvdGFwZW5rbyA8Z2xpZGVyQGdvb2dsZS5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgR29vZ2xlLCBJbmMuCisgKgorICogQmFzZWQgb24gY29kZSBieSBEbWl0cnkgQ2hlcm5lbmtvdi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YWNrdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGFja2RlcG90Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworI2RlZmluZSBERVBPVF9TVEFDS19CSVRTIChzaXplb2YoZGVwb3Rfc3RhY2tfaGFuZGxlX3QpICogOCkKKworI2RlZmluZSBTVEFDS19BTExPQ19OVUxMX1BST1RFQ1RJT05fQklUUyAxCisjZGVmaW5lIFNUQUNLX0FMTE9DX09SREVSIDIgLyogJ1NsYWInIHNpemUgb3JkZXIgZm9yIHN0YWNrIGRlcG90LCA0IHBhZ2VzICovCisjZGVmaW5lIFNUQUNLX0FMTE9DX1NJWkUgKDFMTCA8PCAoUEFHRV9TSElGVCArIFNUQUNLX0FMTE9DX09SREVSKSkKKyNkZWZpbmUgU1RBQ0tfQUxMT0NfQUxJR04gNAorI2RlZmluZSBTVEFDS19BTExPQ19PRkZTRVRfQklUUyAoU1RBQ0tfQUxMT0NfT1JERVIgKyBQQUdFX1NISUZUIC0gXAorCQkJCQlTVEFDS19BTExPQ19BTElHTikKKyNkZWZpbmUgU1RBQ0tfQUxMT0NfSU5ERVhfQklUUyAoREVQT1RfU1RBQ0tfQklUUyAtIFwKKwkJU1RBQ0tfQUxMT0NfTlVMTF9QUk9URUNUSU9OX0JJVFMgLSBTVEFDS19BTExPQ19PRkZTRVRfQklUUykKKyNkZWZpbmUgU1RBQ0tfQUxMT0NfU0xBQlNfQ0FQIDgxOTIKKyNkZWZpbmUgU1RBQ0tfQUxMT0NfTUFYX1NMQUJTIFwKKwkoKCgxTEwgPDwgKFNUQUNLX0FMTE9DX0lOREVYX0JJVFMpKSA8IFNUQUNLX0FMTE9DX1NMQUJTX0NBUCkgPyBcCisJICgxTEwgPDwgKFNUQUNLX0FMTE9DX0lOREVYX0JJVFMpKSA6IFNUQUNLX0FMTE9DX1NMQUJTX0NBUCkKKworLyogVGhlIGNvbXBhY3Qgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSByZWZlcmVuY2UgdG8gc3RhY2tzLiAqLwordW5pb24gaGFuZGxlX3BhcnRzIHsKKwlkZXBvdF9zdGFja19oYW5kbGVfdCBoYW5kbGU7CisJc3RydWN0IHsKKwkJdTMyIHNsYWJpbmRleCA6IFNUQUNLX0FMTE9DX0lOREVYX0JJVFM7CisJCXUzMiBvZmZzZXQgOiBTVEFDS19BTExPQ19PRkZTRVRfQklUUzsKKwkJdTMyIHZhbGlkIDogU1RBQ0tfQUxMT0NfTlVMTF9QUk9URUNUSU9OX0JJVFM7CisJfTsKK307CisKK3N0cnVjdCBzdGFja19yZWNvcmQgeworCXN0cnVjdCBzdGFja19yZWNvcmQgKm5leHQ7CS8qIExpbmsgaW4gdGhlIGhhc2h0YWJsZSAqLworCXUzMiBoYXNoOwkJCS8qIEhhc2ggaW4gdGhlIGhhc3RhYmxlICovCisJdTMyIHNpemU7CQkJLyogTnVtYmVyIG9mIGZyYW1lcyBpbiB0aGUgc3RhY2sgKi8KKwl1bmlvbiBoYW5kbGVfcGFydHMgaGFuZGxlOworCXVuc2lnbmVkIGxvbmcgZW50cmllc1sxXTsJLyogVmFyaWFibGUtc2l6ZWQgYXJyYXkgb2YgZW50cmllcy4gKi8KK307CisKK3N0YXRpYyB2b2lkICpzdGFja19zbGFic1tTVEFDS19BTExPQ19NQVhfU0xBQlNdOworCitzdGF0aWMgaW50IGRlcG90X2luZGV4Oworc3RhdGljIGludCBuZXh0X3NsYWJfaW5pdGVkOworc3RhdGljIHNpemVfdCBkZXBvdF9vZmZzZXQ7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRlcG90X2xvY2spOworCitzdGF0aWMgYm9vbCBpbml0X3N0YWNrX3NsYWIodm9pZCAqKnByZWFsbG9jKQoreworCWlmICghKnByZWFsbG9jKQorCQlyZXR1cm4gZmFsc2U7CisJLyoKKwkgKiBUaGlzIHNtcF9sb2FkX2FjcXVpcmUoKSBwYWlycyB3aXRoIHNtcF9zdG9yZV9yZWxlYXNlKCkgdG8KKwkgKiB8bmV4dF9zbGFiX2luaXRlZHwgYmVsb3cgYW5kIGluIGRlcG90X2FsbG9jX3N0YWNrKCkuCisJICovCisJaWYgKHNtcF9sb2FkX2FjcXVpcmUoJm5leHRfc2xhYl9pbml0ZWQpKQorCQlyZXR1cm4gdHJ1ZTsKKwlpZiAoc3RhY2tfc2xhYnNbZGVwb3RfaW5kZXhdID09IE5VTEwpIHsKKwkJc3RhY2tfc2xhYnNbZGVwb3RfaW5kZXhdID0gKnByZWFsbG9jOworCQkqcHJlYWxsb2MgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIElmIHRoaXMgaXMgdGhlIGxhc3QgZGVwb3Qgc2xhYiwgZG8gbm90IHRvdWNoIHRoZSBuZXh0IG9uZS4gKi8KKwkJaWYgKGRlcG90X2luZGV4ICsgMSA8IFNUQUNLX0FMTE9DX01BWF9TTEFCUykgeworCQkJc3RhY2tfc2xhYnNbZGVwb3RfaW5kZXggKyAxXSA9ICpwcmVhbGxvYzsKKwkJCSpwcmVhbGxvYyA9IE5VTEw7CisJCX0KKwkJLyoKKwkJICogVGhpcyBzbXBfc3RvcmVfcmVsZWFzZSBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tCisJCSAqIHxuZXh0X3NsYWJfaW5pdGVkfCBhYm92ZSBhbmQgaW4gZGVwb3Rfc2F2ZV9zdGFjaygpLgorCQkgKi8KKwkJc21wX3N0b3JlX3JlbGVhc2UoJm5leHRfc2xhYl9pbml0ZWQsIDEpOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyogQWxsb2NhdGlvbiBvZiBhIG5ldyBzdGFjayBpbiByYXcgc3RvcmFnZSAqLworc3RhdGljIHN0cnVjdCBzdGFja19yZWNvcmQgKmRlcG90X2FsbG9jX3N0YWNrKHVuc2lnbmVkIGxvbmcgKmVudHJpZXMsIGludCBzaXplLAorCQl1MzIgaGFzaCwgdm9pZCAqKnByZWFsbG9jLCBnZnBfdCBhbGxvY19mbGFncykKK3sKKwlpbnQgcmVxdWlyZWRfc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBzdGFja19yZWNvcmQsIGVudHJpZXMpICsKKwkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogc2l6ZTsKKwlzdHJ1Y3Qgc3RhY2tfcmVjb3JkICpzdGFjazsKKworCXJlcXVpcmVkX3NpemUgPSBBTElHTihyZXF1aXJlZF9zaXplLCAxIDw8IFNUQUNLX0FMTE9DX0FMSUdOKTsKKworCWlmICh1bmxpa2VseShkZXBvdF9vZmZzZXQgKyByZXF1aXJlZF9zaXplID4gU1RBQ0tfQUxMT0NfU0laRSkpIHsKKwkJaWYgKHVubGlrZWx5KGRlcG90X2luZGV4ICsgMSA+PSBTVEFDS19BTExPQ19NQVhfU0xBQlMpKSB7CisJCQlXQVJOX09OQ0UoMSwgIlN0YWNrIGRlcG90IHJlYWNoZWQgbGltaXQgY2FwYWNpdHkiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWRlcG90X2luZGV4Kys7CisJCWRlcG90X29mZnNldCA9IDA7CisJCS8qCisJCSAqIHNtcF9zdG9yZV9yZWxlYXNlKCkgaGVyZSBwYWlycyB3aXRoIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tCisJCSAqIHxuZXh0X3NsYWJfaW5pdGVkfCBpbiBkZXBvdF9zYXZlX3N0YWNrKCkgYW5kCisJCSAqIGluaXRfc3RhY2tfc2xhYigpLgorCQkgKi8KKwkJaWYgKGRlcG90X2luZGV4ICsgMSA8IFNUQUNLX0FMTE9DX01BWF9TTEFCUykKKwkJCXNtcF9zdG9yZV9yZWxlYXNlKCZuZXh0X3NsYWJfaW5pdGVkLCAwKTsKKwl9CisJaW5pdF9zdGFja19zbGFiKHByZWFsbG9jKTsKKwlpZiAoc3RhY2tfc2xhYnNbZGVwb3RfaW5kZXhdID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJc3RhY2sgPSBzdGFja19zbGFic1tkZXBvdF9pbmRleF0gKyBkZXBvdF9vZmZzZXQ7CisKKwlzdGFjay0+aGFzaCA9IGhhc2g7CisJc3RhY2stPnNpemUgPSBzaXplOworCXN0YWNrLT5oYW5kbGUuc2xhYmluZGV4ID0gZGVwb3RfaW5kZXg7CisJc3RhY2stPmhhbmRsZS5vZmZzZXQgPSBkZXBvdF9vZmZzZXQgPj4gU1RBQ0tfQUxMT0NfQUxJR047CisJc3RhY2stPmhhbmRsZS52YWxpZCA9IDE7CisJbWVtY3B5KHN0YWNrLT5lbnRyaWVzLCBlbnRyaWVzLCBzaXplICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwlkZXBvdF9vZmZzZXQgKz0gcmVxdWlyZWRfc2l6ZTsKKworCXJldHVybiBzdGFjazsKK30KKworI2RlZmluZSBTVEFDS19IQVNIX09SREVSIDIwCisjZGVmaW5lIFNUQUNLX0hBU0hfU0laRSAoMUwgPDwgU1RBQ0tfSEFTSF9PUkRFUikKKyNkZWZpbmUgU1RBQ0tfSEFTSF9NQVNLIChTVEFDS19IQVNIX1NJWkUgLSAxKQorI2RlZmluZSBTVEFDS19IQVNIX1NFRUQgMHg5NzQ3YjI4YworCitzdGF0aWMgc3RydWN0IHN0YWNrX3JlY29yZCAqc3RhY2tfdGFibGVbU1RBQ0tfSEFTSF9TSVpFXSA9IHsKKwlbMCAuLi4JU1RBQ0tfSEFTSF9TSVpFIC0gMV0gPSBOVUxMCit9OworCisvKiBDYWxjdWxhdGUgaGFzaCBmb3IgYSBzdGFjayAqLworc3RhdGljIGlubGluZSB1MzIgaGFzaF9zdGFjayh1bnNpZ25lZCBsb25nICplbnRyaWVzLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlyZXR1cm4gamhhc2gyKCh1MzIgKillbnRyaWVzLAorCQkJICAgICAgIHNpemUgKiBzaXplb2YodW5zaWduZWQgbG9uZykgLyBzaXplb2YodTMyKSwKKwkJCSAgICAgICBTVEFDS19IQVNIX1NFRUQpOworfQorCisvKiBGaW5kIGEgc3RhY2sgdGhhdCBpcyBlcXVhbCB0byB0aGUgb25lIHN0b3JlZCBpbiBlbnRyaWVzIGluIHRoZSBoYXNoICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzdGFja19yZWNvcmQgKmZpbmRfc3RhY2soc3RydWN0IHN0YWNrX3JlY29yZCAqYnVja2V0LAorCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKmVudHJpZXMsIGludCBzaXplLAorCQkJCQkgICAgIHUzMiBoYXNoKQoreworCXN0cnVjdCBzdGFja19yZWNvcmQgKmZvdW5kOworCisJZm9yIChmb3VuZCA9IGJ1Y2tldDsgZm91bmQ7IGZvdW5kID0gZm91bmQtPm5leHQpIHsKKwkJaWYgKGZvdW5kLT5oYXNoID09IGhhc2ggJiYKKwkJICAgIGZvdW5kLT5zaXplID09IHNpemUgJiYKKwkJICAgICFtZW1jbXAoZW50cmllcywgZm91bmQtPmVudHJpZXMsCisJCQkgICAgc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkpIHsKKwkJCXJldHVybiBmb3VuZDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBkZXBvdF9mZXRjaF9zdGFjayhkZXBvdF9zdGFja19oYW5kbGVfdCBoYW5kbGUsIHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UpCit7CisJdW5pb24gaGFuZGxlX3BhcnRzIHBhcnRzID0geyAuaGFuZGxlID0gaGFuZGxlIH07CisJdm9pZCAqc2xhYiA9IHN0YWNrX3NsYWJzW3BhcnRzLnNsYWJpbmRleF07CisJc2l6ZV90IG9mZnNldCA9IHBhcnRzLm9mZnNldCA8PCBTVEFDS19BTExPQ19BTElHTjsKKwlzdHJ1Y3Qgc3RhY2tfcmVjb3JkICpzdGFjayA9IHNsYWIgKyBvZmZzZXQ7CisKKwl0cmFjZS0+bnJfZW50cmllcyA9IHRyYWNlLT5tYXhfZW50cmllcyA9IHN0YWNrLT5zaXplOworCXRyYWNlLT5lbnRyaWVzID0gc3RhY2stPmVudHJpZXM7CisJdHJhY2UtPnNraXAgPSAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVwb3RfZmV0Y2hfc3RhY2spOworCisvKioKKyAqIGRlcG90X3NhdmVfc3RhY2sgLSBzYXZlIHN0YWNrIGluIGEgc3RhY2sgZGVwb3QuCisgKiBAdHJhY2UgLSB0aGUgc3RhY2t0cmFjZSB0byBzYXZlLgorICogQGFsbG9jX2ZsYWdzIC0gZmxhZ3MgZm9yIGFsbG9jYXRpbmcgYWRkaXRpb25hbCBtZW1vcnkgaWYgcmVxdWlyZWQuCisgKgorICogUmV0dXJucyB0aGUgaGFuZGxlIG9mIHRoZSBzdGFjayBzdHJ1Y3Qgc3RvcmVkIGluIGRlcG90LgorICovCitkZXBvdF9zdGFja19oYW5kbGVfdCBkZXBvdF9zYXZlX3N0YWNrKHN0cnVjdCBzdGFja190cmFjZSAqdHJhY2UsCisJCQkJICAgIGdmcF90IGFsbG9jX2ZsYWdzKQoreworCXUzMiBoYXNoOworCWRlcG90X3N0YWNrX2hhbmRsZV90IHJldHZhbCA9IDA7CisJc3RydWN0IHN0YWNrX3JlY29yZCAqZm91bmQgPSBOVUxMLCAqKmJ1Y2tldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwl2b2lkICpwcmVhbGxvYyA9IE5VTEw7CisKKwlpZiAodW5saWtlbHkodHJhY2UtPm5yX2VudHJpZXMgPT0gMCkpCisJCWdvdG8gZmFzdF9leGl0OworCisJaGFzaCA9IGhhc2hfc3RhY2sodHJhY2UtPmVudHJpZXMsIHRyYWNlLT5ucl9lbnRyaWVzKTsKKwlidWNrZXQgPSAmc3RhY2tfdGFibGVbaGFzaCAmIFNUQUNLX0hBU0hfTUFTS107CisKKwkvKgorCSAqIEZhc3QgcGF0aDogbG9vayB0aGUgc3RhY2sgdHJhY2UgdXAgd2l0aG91dCBsb2NraW5nLgorCSAqIFRoZSBzbXBfbG9hZF9hY3F1aXJlKCkgaGVyZSBwYWlycyB3aXRoIHNtcF9zdG9yZV9yZWxlYXNlKCkgdG8KKwkgKiB8YnVja2V0fCBiZWxvdy4KKwkgKi8KKwlmb3VuZCA9IGZpbmRfc3RhY2soc21wX2xvYWRfYWNxdWlyZShidWNrZXQpLCB0cmFjZS0+ZW50cmllcywKKwkJCSAgIHRyYWNlLT5ucl9lbnRyaWVzLCBoYXNoKTsKKwlpZiAoZm91bmQpCisJCWdvdG8gZXhpdDsKKworCS8qCisJICogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgb3IgdGhlIG5leHQgc3RhY2sgc2xhYiBuZWVkIHRvIGJlIGluaXRpYWxpemVkLgorCSAqIElmIHNvLCBhbGxvY2F0ZSB0aGUgbWVtb3J5IC0gd2Ugd29uJ3QgYmUgYWJsZSB0byBkbyB0aGF0IHVuZGVyIHRoZQorCSAqIGxvY2suCisJICoKKwkgKiBUaGUgc21wX2xvYWRfYWNxdWlyZSgpIGhlcmUgcGFpcnMgd2l0aCBzbXBfc3RvcmVfcmVsZWFzZSgpIHRvCisJICogfG5leHRfc2xhYl9pbml0ZWR8IGluIGRlcG90X2FsbG9jX3N0YWNrKCkgYW5kIGluaXRfc3RhY2tfc2xhYigpLgorCSAqLworCWlmICh1bmxpa2VseSghc21wX2xvYWRfYWNxdWlyZSgmbmV4dF9zbGFiX2luaXRlZCkpKSB7CisJCS8qCisJCSAqIFplcm8gb3V0IHpvbmUgbW9kaWZpZXJzLCBhcyB3ZSBkb24ndCBoYXZlIHNwZWNpZmljIHpvbmUKKwkJICogcmVxdWlyZW1lbnRzLiBLZWVwIHRoZSBmbGFncyByZWxhdGVkIHRvIGFsbG9jYXRpb24gaW4gYXRvbWljCisJCSAqIGNvbnRleHRzIGFuZCBJL08uCisJCSAqLworCQlhbGxvY19mbGFncyAmPSB+R0ZQX1pPTkVNQVNLOworCQlhbGxvY19mbGFncyAmPSAoR0ZQX0FUT01JQyB8IEdGUF9LRVJORUwpOworCQlhbGxvY19mbGFncyB8PSBfX0dGUF9OT1dBUk47CisJCXBhZ2UgPSBhbGxvY19wYWdlcyhhbGxvY19mbGFncywgU1RBQ0tfQUxMT0NfT1JERVIpOworCQlpZiAocGFnZSkKKwkJCXByZWFsbG9jID0gcGFnZV9hZGRyZXNzKHBhZ2UpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXBvdF9sb2NrLCBmbGFncyk7CisKKwlmb3VuZCA9IGZpbmRfc3RhY2soKmJ1Y2tldCwgdHJhY2UtPmVudHJpZXMsIHRyYWNlLT5ucl9lbnRyaWVzLCBoYXNoKTsKKwlpZiAoIWZvdW5kKSB7CisJCXN0cnVjdCBzdGFja19yZWNvcmQgKm5ldyA9CisJCQlkZXBvdF9hbGxvY19zdGFjayh0cmFjZS0+ZW50cmllcywgdHJhY2UtPm5yX2VudHJpZXMsCisJCQkJCSAgaGFzaCwgJnByZWFsbG9jLCBhbGxvY19mbGFncyk7CisJCWlmIChuZXcpIHsKKwkJCW5ldy0+bmV4dCA9ICpidWNrZXQ7CisJCQkvKgorCQkJICogVGhpcyBzbXBfc3RvcmVfcmVsZWFzZSgpIHBhaXJzIHdpdGgKKwkJCSAqIHNtcF9sb2FkX2FjcXVpcmUoKSBmcm9tIHxidWNrZXR8IGFib3ZlLgorCQkJICovCisJCQlzbXBfc3RvcmVfcmVsZWFzZShidWNrZXQsIG5ldyk7CisJCQlmb3VuZCA9IG5ldzsKKwkJfQorCX0gZWxzZSBpZiAocHJlYWxsb2MpIHsKKwkJLyoKKwkJICogV2UgZGlkbid0IG5lZWQgdG8gc3RvcmUgdGhpcyBzdGFjayB0cmFjZSwgYnV0IGxldCdzIGtlZXAKKwkJICogdGhlIHByZWFsbG9jYXRlZCBtZW1vcnkgZm9yIHRoZSBmdXR1cmUuCisJCSAqLworCQlXQVJOX09OKCFpbml0X3N0YWNrX3NsYWIoJnByZWFsbG9jKSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGVwb3RfbG9jaywgZmxhZ3MpOworZXhpdDoKKwlpZiAocHJlYWxsb2MpIHsKKwkJLyogTm9ib2R5IHVzZWQgdGhpcyBtZW1vcnksIG9rIHRvIGZyZWUgaXQuICovCisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpcHJlYWxsb2MsIFNUQUNLX0FMTE9DX09SREVSKTsKKwl9CisJaWYgKGZvdW5kKQorCQlyZXR2YWwgPSBmb3VuZC0+aGFuZGxlLmhhbmRsZTsKK2Zhc3RfZXhpdDoKKwlyZXR1cm4gcmV0dmFsOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZGVwb3Rfc2F2ZV9zdGFjayk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdG1wX2RldmljZS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3RtcF9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTA0NjU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3RtcF9kZXZpY2UuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5IEFSTSBMaW1pdGVkCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgRGVlcCBCbHVlIFNvbHV0aW9ucyBMdGQKKyAqIENvcHlyaWdodCAyMDA2LTIwMDcsMjAxMCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMDggSnVlcmdlbiBCZWlzZXJ0LCBrZXJuZWxAcGVuZ3V0cm9uaXguZGUKKyAqIENvcHlyaWdodCAyMDA5IElseWEgWWFub2ssIEVtY3JhZnQgU3lzdGVtcyBMdGQsIHlhbm9rQGVtY3JhZnQuY29tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgV29sZnJhbSBTYW5nLCBQZW5ndXRyb25peCBlLksuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zdG1wX2RldmljZS5oPgorCisjZGVmaW5lIFNUTVBfTU9EVUxFX0NMS0dBVEUJKDEgPDwgMzApCisjZGVmaW5lIFNUTVBfTU9EVUxFX1NGVFJTVAkoMSA8PCAzMSkKKworLyoKKyAqIENsZWFyIHRoZSBiaXQgYW5kIHBvbGwgaXQgY2xlYXJlZC4gIFRoaXMgaXMgdXN1YWxseSBjYWxsZWQgd2l0aAorICogYSByZXNldCBhZGRyZXNzIGFuZCBtYXNrIGJlaW5nIGVpdGhlciBTRlRSU1QoYml0IDMxKSBvciBDTEtHQVRFCisgKiAoYml0IDMwKS4KKyAqLworc3RhdGljIGludCBzdG1wX2NsZWFyX3BvbGxfYml0KHZvaWQgX19pb21lbSAqYWRkciwgdTMyIG1hc2spCit7CisJaW50IHRpbWVvdXQgPSAweDQwMDsKKworCXdyaXRlbChtYXNrLCBhZGRyICsgU1RNUF9PRkZTRVRfUkVHX0NMUik7CisJdWRlbGF5KDEpOworCXdoaWxlICgocmVhZGwoYWRkcikgJiBtYXNrKSAmJiAtLXRpbWVvdXQpCisJCS8qIG5vdGhpbmcgKi87CisKKwlyZXR1cm4gIXRpbWVvdXQ7Cit9CisKK2ludCBzdG1wX3Jlc2V0X2Jsb2NrKHZvaWQgX19pb21lbSAqcmVzZXRfYWRkcikKK3sKKwlpbnQgcmV0OworCWludCB0aW1lb3V0ID0gMHg0MDA7CisKKwkvKiBjbGVhciBhbmQgcG9sbCBTRlRSU1QgKi8KKwlyZXQgPSBzdG1wX2NsZWFyX3BvbGxfYml0KHJlc2V0X2FkZHIsIFNUTVBfTU9EVUxFX1NGVFJTVCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjbGVhciBDTEtHQVRFICovCisJd3JpdGVsKFNUTVBfTU9EVUxFX0NMS0dBVEUsIHJlc2V0X2FkZHIgKyBTVE1QX09GRlNFVF9SRUdfQ0xSKTsKKworCS8qIHNldCBTRlRSU1QgdG8gcmVzZXQgdGhlIGJsb2NrICovCisJd3JpdGVsKFNUTVBfTU9EVUxFX1NGVFJTVCwgcmVzZXRfYWRkciArIFNUTVBfT0ZGU0VUX1JFR19TRVQpOworCXVkZWxheSgxKTsKKworCS8qIHBvbGwgQ0xLR0FURSBiZWNvbWluZyBzZXQgKi8KKwl3aGlsZSAoKCEocmVhZGwocmVzZXRfYWRkcikgJiBTVE1QX01PRFVMRV9DTEtHQVRFKSkgJiYgLS10aW1lb3V0KQorCQkvKiBub3RoaW5nICovOworCWlmICh1bmxpa2VseSghdGltZW91dCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjbGVhciBhbmQgcG9sbCBTRlRSU1QgKi8KKwlyZXQgPSBzdG1wX2NsZWFyX3BvbGxfYml0KHJlc2V0X2FkZHIsIFNUTVBfTU9EVUxFX1NGVFJTVCk7CisJaWYgKHVubGlrZWx5KHJldCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBjbGVhciBhbmQgcG9sbCBDTEtHQVRFICovCisJcmV0ID0gc3RtcF9jbGVhcl9wb2xsX2JpdChyZXNldF9hZGRyLCBTVE1QX01PRFVMRV9DTEtHQVRFKTsKKwlpZiAodW5saWtlbHkocmV0KSkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlwcl9lcnIoIiVzKCVwKTogbW9kdWxlIHJlc2V0IHRpbWVvdXRcbiIsIF9fZnVuY19fLCByZXNldF9hZGRyKTsKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KK0VYUE9SVF9TWU1CT0woc3RtcF9yZXNldF9ibG9jayk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdHJpbmcuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWFiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdHJpbmcuYwpAQCAtMCwwICsxLDEyMzkgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogIGxpbnV4L2xpYi9zdHJpbmcuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyoKKyAqIHN0dXBpZCBsaWJyYXJ5IHJvdXRpbmVzLi4gVGhlIG9wdGltaXplZCB2ZXJzaW9ucyBzaG91bGQgZ2VuZXJhbGx5IGJlIGZvdW5kCisgKiBhcyBpbmxpbmUgY29kZSBpbiA8YXNtLXh4L3N0cmluZy5oPgorICoKKyAqIFRoZXNlIGFyZSBidWdneSBhcyB3ZWxsLi4KKyAqCisgKiAqIEZyaSBKdW4gMjUgMTk5OSwgSW5nbyBPZXNlciA8aW9lQGluZm9ybWF0aWsudHUtY2hlbW5pdHouZGU+CisgKiAtICBBZGRlZCBzdHJzZXAoKSB3aGljaCB3aWxsIHJlcGxhY2Ugc3RydG9rKCkgc29vbiAoYmVjYXVzZSBzdHJzZXAoKSBpcworICogICAgcmVlbnRyYW50IGFuZCBzaG91bGQgYmUgZmFzdGVyKS4gVXNlIG9ubHkgc3Ryc2VwKCkgaW4gbmV3IGNvZGUsIHBsZWFzZS4KKyAqCisgKiAqIFNhdCBGZWIgMDkgMjAwMiwgSmFzb24gVGhvbWFzIDxqYXNvbkB0b3BpYy5jb20uYXU+LAorICogICAgICAgICAgICAgICAgICAgIE1hdHRoZXcgSGF3a2lucyA8bWF0dEBtaC5kcm9wYmVhci5pZC5hdT4KKyAqIC0gIEtpc3NlZCBzdHJ0b2soKSBnb29kYnllCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorCisjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgorI2luY2x1ZGUgPGFzbS93b3JkLWF0LWEtdGltZS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNBU0VDTVAKKy8qKgorICogc3RybmNhc2VjbXAgLSBDYXNlIGluc2Vuc2l0aXZlLCBsZW5ndGgtbGltaXRlZCBzdHJpbmcgY29tcGFyaXNvbgorICogQHMxOiBPbmUgc3RyaW5nCisgKiBAczI6IFRoZSBvdGhlciBzdHJpbmcKKyAqIEBsZW46IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGNvbXBhcmUKKyAqLworaW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IGxlbikKK3sKKwkvKiBZZXMsIFZpcmdpbmlhLCBpdCBoYWQgYmV0dGVyIGJlIHVuc2lnbmVkICovCisJdW5zaWduZWQgY2hhciBjMSwgYzI7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlkbyB7CisJCWMxID0gKnMxKys7CisJCWMyID0gKnMyKys7CisJCWlmICghYzEgfHwgIWMyKQorCQkJYnJlYWs7CisJCWlmIChjMSA9PSBjMikKKwkJCWNvbnRpbnVlOworCQljMSA9IHRvbG93ZXIoYzEpOworCQljMiA9IHRvbG93ZXIoYzIpOworCQlpZiAoYzEgIT0gYzIpCisJCQlicmVhazsKKwl9IHdoaWxlICgtLWxlbik7CisJcmV0dXJuIChpbnQpYzEgLSAoaW50KWMyOworfQorRVhQT1JUX1NZTUJPTChzdHJuY2FzZWNtcCk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVNFQ01QCitpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJaW50IGMxLCBjMjsKKworCWRvIHsKKwkJYzEgPSB0b2xvd2VyKCpzMSsrKTsKKwkJYzIgPSB0b2xvd2VyKCpzMisrKTsKKwl9IHdoaWxlIChjMSA9PSBjMiAmJiBjMSAhPSAwKTsKKwlyZXR1cm4gYzEgLSBjMjsKK30KK0VYUE9SVF9TWU1CT0woc3RyY2FzZWNtcCk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDUFkKKy8qKgorICogc3RyY3B5IC0gQ29weSBhICVOVUwgdGVybWluYXRlZCBzdHJpbmcKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgdGhlIHN0cmluZyBmcm9tCisgKi8KKyN1bmRlZiBzdHJjcHkKK2NoYXIgKnN0cmNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqdG1wID0gZGVzdDsKKworCXdoaWxlICgoKmRlc3QrKyA9ICpzcmMrKykgIT0gJ1wwJykKKwkJLyogbm90aGluZyAqLzsKKwlyZXR1cm4gdG1wOworfQorRVhQT1JUX1NZTUJPTChzdHJjcHkpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNQWQorLyoqCisgKiBzdHJuY3B5IC0gQ29weSBhIGxlbmd0aC1saW1pdGVkLCBDLXN0cmluZworICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdGhlIHN0cmluZyB0bworICogQHNyYzogV2hlcmUgdG8gY29weSB0aGUgc3RyaW5nIGZyb20KKyAqIEBjb3VudDogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKKyAqCisgKiBUaGUgcmVzdWx0IGlzIG5vdCAlTlVMLXRlcm1pbmF0ZWQgaWYgdGhlIHNvdXJjZSBleGNlZWRzCisgKiBAY291bnQgYnl0ZXMuCisgKgorICogSW4gdGhlIGNhc2Ugd2hlcmUgdGhlIGxlbmd0aCBvZiBAc3JjIGlzIGxlc3MgdGhhbiAgdGhhdCAgb2YKKyAqIGNvdW50LCB0aGUgcmVtYWluZGVyIG9mIEBkZXN0IHdpbGwgYmUgcGFkZGVkIHdpdGggJU5VTC4KKyAqCisgKi8KK2NoYXIgKnN0cm5jcHkoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3QgY291bnQpCit7CisJY2hhciAqdG1wID0gZGVzdDsKKworCXdoaWxlIChjb3VudCkgeworCQlpZiAoKCp0bXAgPSAqc3JjKSAhPSAwKQorCQkJc3JjKys7CisJCXRtcCsrOworCQljb3VudC0tOworCX0KKwlyZXR1cm4gZGVzdDsKK30KK0VYUE9SVF9TWU1CT0woc3RybmNweSk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJMQ1BZCisvKioKKyAqIHN0cmxjcHkgLSBDb3B5IGEgQy1zdHJpbmcgaW50byBhIHNpemVkIGJ1ZmZlcgorICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdGhlIHN0cmluZyB0bworICogQHNyYzogV2hlcmUgdG8gY29weSB0aGUgc3RyaW5nIGZyb20KKyAqIEBzaXplOiBzaXplIG9mIGRlc3RpbmF0aW9uIGJ1ZmZlcgorICoKKyAqIENvbXBhdGlibGUgd2l0aCBgYCpCU0RgYDogdGhlIHJlc3VsdCBpcyBhbHdheXMgYSB2YWxpZAorICogTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRoYXQgZml0cyBpbiB0aGUgYnVmZmVyICh1bmxlc3MsCisgKiBvZiBjb3Vyc2UsIHRoZSBidWZmZXIgc2l6ZSBpcyB6ZXJvKS4gSXQgZG9lcyBub3QgcGFkCisgKiBvdXQgdGhlIHJlc3VsdCBsaWtlIHN0cm5jcHkoKSBkb2VzLgorICovCitzaXplX3Qgc3RybGNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKQoreworCXNpemVfdCByZXQgPSBzdHJsZW4oc3JjKTsKKworCWlmIChzaXplKSB7CisJCXNpemVfdCBsZW4gPSAocmV0ID49IHNpemUpID8gc2l6ZSAtIDEgOiByZXQ7CisJCW1lbWNweShkZXN0LCBzcmMsIGxlbik7CisJCWRlc3RbbGVuXSA9ICdcMCc7CisJfQorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKHN0cmxjcHkpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU0NQWQorLyoqCisgKiBzdHJzY3B5IC0gQ29weSBhIEMtc3RyaW5nIGludG8gYSBzaXplZCBidWZmZXIKKyAqIEBkZXN0OiBXaGVyZSB0byBjb3B5IHRoZSBzdHJpbmcgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgdGhlIHN0cmluZyBmcm9tCisgKiBAY291bnQ6IFNpemUgb2YgZGVzdGluYXRpb24gYnVmZmVyCisgKgorICogQ29weSB0aGUgc3RyaW5nLCBvciBhcyBtdWNoIG9mIGl0IGFzIGZpdHMsIGludG8gdGhlIGRlc3QgYnVmZmVyLgorICogVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkIChub3QgaW5jbHVkaW5nCisgKiB0aGUgdHJhaWxpbmcgTlVMKSBvciAtRTJCSUcgaWYgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB3YXNuJ3QgYmlnIGVub3VnaC4KKyAqIFRoZSBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIHN0cmluZyBidWZmZXJzIG92ZXJsYXAuCisgKiBUaGUgZGVzdGluYXRpb24gYnVmZmVyIGlzIGFsd2F5cyBOVUwgdGVybWluYXRlZCwgdW5sZXNzIGl0J3MgemVyby1zaXplZC4KKyAqCisgKiBQcmVmZXJyZWQgdG8gc3RybGNweSgpIHNpbmNlIHRoZSBBUEkgZG9lc24ndCByZXF1aXJlIHJlYWRpbmcgbWVtb3J5CisgKiBmcm9tIHRoZSBzcmMgc3RyaW5nIGJleW9uZCB0aGUgc3BlY2lmaWVkICJjb3VudCIgYnl0ZXMsIGFuZCBzaW5jZQorICogdGhlIHJldHVybiB2YWx1ZSBpcyBlYXNpZXIgdG8gZXJyb3ItY2hlY2sgdGhhbiBzdHJsY3B5KCkncy4KKyAqIEluIGFkZGl0aW9uLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgcm9idXN0IHRvIHRoZSBzdHJpbmcgY2hhbmdpbmcgb3V0CisgKiBmcm9tIHVuZGVybmVhdGggaXQsIHVubGlrZSB0aGUgY3VycmVudCBzdHJsY3B5KCkgaW1wbGVtZW50YXRpb24uCisgKgorICogUHJlZmVycmVkIHRvIHN0cm5jcHkoKSBzaW5jZSBpdCBhbHdheXMgcmV0dXJucyBhIHZhbGlkIHN0cmluZywgYW5kCisgKiBkb2Vzbid0IHVubmVjZXNzYXJpbHkgZm9yY2UgdGhlIHRhaWwgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciB0byBiZQorICogemVyb2VkLiAgSWYgdGhlIHplcm9pbmcgaXMgZGVzaXJlZCwgaXQncyBsaWtlbHkgY2xlYW5lciB0byB1c2Ugc3Ryc2NweSgpCisgKiB3aXRoIGFuIG92ZXJmbG93IHRlc3QsIHRoZW4ganVzdCBtZW1zZXQoKSB0aGUgdGFpbCBvZiB0aGUgZGVzdCBidWZmZXIuCisgKi8KK3NzaXplX3Qgc3Ryc2NweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBzdHJ1Y3Qgd29yZF9hdF9hX3RpbWUgY29uc3RhbnRzID0gV09SRF9BVF9BX1RJTUVfQ09OU1RBTlRTOworCXNpemVfdCBtYXggPSBjb3VudDsKKwlsb25nIHJlcyA9IDA7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIC1FMkJJRzsKKworI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCisJLyoKKwkgKiBJZiBzcmMgaXMgdW5hbGlnbmVkLCBkb24ndCBjcm9zcyBhIHBhZ2UgYm91bmRhcnksCisJICogc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgbmV4dCBwYWdlIGlzIG1hcHBlZC4KKwkgKi8KKwlpZiAoKGxvbmcpc3JjICYgKHNpemVvZihsb25nKSAtIDEpKSB7CisJCXNpemVfdCBsaW1pdCA9IFBBR0VfU0laRSAtICgobG9uZylzcmMgJiAoUEFHRV9TSVpFIC0gMSkpOworCQlpZiAobGltaXQgPCBtYXgpCisJCQltYXggPSBsaW1pdDsKKwl9CisjZWxzZQorCS8qIElmIHNyYyBvciBkZXN0IGlzIHVuYWxpZ25lZCwgZG9uJ3QgZG8gd29yZC1hdC1hLXRpbWUuICovCisJaWYgKCgobG9uZykgZGVzdCB8IChsb25nKSBzcmMpICYgKHNpemVvZihsb25nKSAtIDEpKQorCQltYXggPSAwOworI2VuZGlmCisKKwl3aGlsZSAobWF4ID49IHNpemVvZih1bnNpZ25lZCBsb25nKSkgeworCQl1bnNpZ25lZCBsb25nIGMsIGRhdGE7CisKKwkJYyA9IHJlYWRfd29yZF9hdF9hX3RpbWUoc3JjK3Jlcyk7CisJCWlmIChoYXNfemVybyhjLCAmZGF0YSwgJmNvbnN0YW50cykpIHsKKwkJCWRhdGEgPSBwcmVwX3plcm9fbWFzayhjLCBkYXRhLCAmY29uc3RhbnRzKTsKKwkJCWRhdGEgPSBjcmVhdGVfemVyb19tYXNrKGRhdGEpOworCQkJKih1bnNpZ25lZCBsb25nICopKGRlc3QrcmVzKSA9IGMgJiB6ZXJvX2J5dGVtYXNrKGRhdGEpOworCQkJcmV0dXJuIHJlcyArIGZpbmRfemVybyhkYXRhKTsKKwkJfQorCQkqKHVuc2lnbmVkIGxvbmcgKikoZGVzdCtyZXMpID0gYzsKKwkJcmVzICs9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwkJY291bnQgLT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQltYXggLT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCX0KKworCXdoaWxlIChjb3VudCkgeworCQljaGFyIGM7CisKKwkJYyA9IHNyY1tyZXNdOworCQlkZXN0W3Jlc10gPSBjOworCQlpZiAoIWMpCisJCQlyZXR1cm4gcmVzOworCQlyZXMrKzsKKwkJY291bnQtLTsKKwl9CisKKwkvKiBIaXQgYnVmZmVyIGxlbmd0aCB3aXRob3V0IGZpbmRpbmcgYSBOVUw7IGZvcmNlIE5VTC10ZXJtaW5hdGlvbi4gKi8KKwlpZiAocmVzKQorCQlkZXN0W3Jlcy0xXSA9ICdcMCc7CisKKwlyZXR1cm4gLUUyQklHOworfQorRVhQT1JUX1NZTUJPTChzdHJzY3B5KTsKKyNlbmRpZgorCisvKioKKyAqIHN0cGNweSAtIGNvcHkgYSBzdHJpbmcgZnJvbSBzcmMgdG8gZGVzdCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIHRoZSBuZXcgZW5kCisgKiAgICAgICAgICBvZiBkZXN0LCBpbmNsdWRpbmcgc3JjJ3MgJU5VTC10ZXJtaW5hdG9yLiBNYXkgb3ZlcnJ1biBkZXN0LgorICogQGRlc3Q6IHBvaW50ZXIgdG8gZW5kIG9mIHN0cmluZyBiZWluZyBjb3BpZWQgaW50by4gTXVzdCBiZSBsYXJnZSBlbm91Z2gKKyAqICAgICAgICB0byByZWNlaXZlIGNvcHkuCisgKiBAc3JjOiBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3RyaW5nIGJlaW5nIGNvcGllZCBmcm9tLiBNdXN0IG5vdCBvdmVybGFwCisgKiAgICAgICBkZXN0LgorICoKKyAqIHN0cGNweSBkaWZmZXJzIGZyb20gc3RyY3B5IGluIGEga2V5IHdheTogdGhlIHJldHVybiB2YWx1ZSBpcyBhIHBvaW50ZXIKKyAqIHRvIHRoZSBuZXcgJU5VTC10ZXJtaW5hdGluZyBjaGFyYWN0ZXIgaW4gQGRlc3QuIChGb3Igc3RyY3B5LCB0aGUgcmV0dXJuCisgKiB2YWx1ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIEBkZXN0KS4gVGhpcyBpbnRlcmZhY2UgaXMgY29uc2lkZXJlZAorICogdW5zYWZlIGFzIGl0IGRvZXNuJ3QgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcgb2YgdGhlIGlucHV0cy4gQXMgc3VjaCBpdCdzCisgKiBub3QgcmVjb21tZW5kZWQgZm9yIHVzYWdlLiBJbnN0ZWFkLCBpdHMgZGVmaW5pdGlvbiBpcyBwcm92aWRlZCBpbiBjYXNlCisgKiB0aGUgY29tcGlsZXIgbG93ZXJzIG90aGVyIGxpYmNhbGxzIHRvIHN0cGNweS4KKyAqLworY2hhciAqc3RwY3B5KGNoYXIgKl9fcmVzdHJpY3RfXyBkZXN0LCBjb25zdCBjaGFyICpfX3Jlc3RyaWN0X18gc3JjKTsKK2NoYXIgKnN0cGNweShjaGFyICpfX3Jlc3RyaWN0X18gZGVzdCwgY29uc3QgY2hhciAqX19yZXN0cmljdF9fIHNyYykKK3sKKwl3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisJCS8qIG5vdGhpbmcgKi87CisJcmV0dXJuIC0tZGVzdDsKK30KK0VYUE9SVF9TWU1CT0woc3RwY3B5KTsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJDQVQKKy8qKgorICogc3RyY2F0IC0gQXBwZW5kIG9uZSAlTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGFub3RoZXIKKyAqIEBkZXN0OiBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvCisgKiBAc3JjOiBUaGUgc3RyaW5nIHRvIGFwcGVuZCB0byBpdAorICovCisjdW5kZWYgc3RyY2F0CitjaGFyICpzdHJjYXQoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwl3aGlsZSAoKmRlc3QpCisJCWRlc3QrKzsKKwl3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9ICdcMCcpCisJCTsKKwlyZXR1cm4gdG1wOworfQorRVhQT1JUX1NZTUJPTChzdHJjYXQpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNBVAorLyoqCisgKiBzdHJuY2F0IC0gQXBwZW5kIGEgbGVuZ3RoLWxpbWl0ZWQsIEMtc3RyaW5nIHRvIGFub3RoZXIKKyAqIEBkZXN0OiBUaGUgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvCisgKiBAc3JjOiBUaGUgc3RyaW5nIHRvIGFwcGVuZCB0byBpdAorICogQGNvdW50OiBUaGUgbWF4aW11bSBudW1iZXJzIG9mIGJ5dGVzIHRvIGNvcHkKKyAqCisgKiBOb3RlIHRoYXQgaW4gY29udHJhc3QgdG8gc3RybmNweSgpLCBzdHJuY2F0KCkgZW5zdXJlcyB0aGUgcmVzdWx0IGlzCisgKiB0ZXJtaW5hdGVkLgorICovCitjaGFyICpzdHJuY2F0KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisKKwlpZiAoY291bnQpIHsKKwkJd2hpbGUgKCpkZXN0KQorCQkJZGVzdCsrOworCQl3aGlsZSAoKCpkZXN0KysgPSAqc3JjKyspICE9IDApIHsKKwkJCWlmICgtLWNvdW50ID09IDApIHsKKwkJCQkqZGVzdCA9ICdcMCc7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHRtcDsKK30KK0VYUE9SVF9TWU1CT0woc3RybmNhdCk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJMQ0FUCisvKioKKyAqIHN0cmxjYXQgLSBBcHBlbmQgYSBsZW5ndGgtbGltaXRlZCwgQy1zdHJpbmcgdG8gYW5vdGhlcgorICogQGRlc3Q6IFRoZSBzdHJpbmcgdG8gYmUgYXBwZW5kZWQgdG8KKyAqIEBzcmM6IFRoZSBzdHJpbmcgdG8gYXBwZW5kIHRvIGl0CisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKi8KK3NpemVfdCBzdHJsY2F0KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IGNvdW50KQoreworCXNpemVfdCBkc2l6ZSA9IHN0cmxlbihkZXN0KTsKKwlzaXplX3QgbGVuID0gc3RybGVuKHNyYyk7CisJc2l6ZV90IHJlcyA9IGRzaXplICsgbGVuOworCisJLyogVGhpcyB3b3VsZCBiZSBhIGJ1ZyAqLworCUJVR19PTihkc2l6ZSA+PSBjb3VudCk7CisKKwlkZXN0ICs9IGRzaXplOworCWNvdW50IC09IGRzaXplOworCWlmIChsZW4gPj0gY291bnQpCisJCWxlbiA9IGNvdW50LTE7CisJbWVtY3B5KGRlc3QsIHNyYywgbGVuKTsKKwlkZXN0W2xlbl0gPSAwOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKHN0cmxjYXQpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ01QCisvKioKKyAqIHN0cmNtcCAtIENvbXBhcmUgdHdvIHN0cmluZ3MKKyAqIEBjczogT25lIHN0cmluZworICogQGN0OiBBbm90aGVyIHN0cmluZworICovCisjdW5kZWYgc3RyY21wCitpbnQgc3RyY21wKGNvbnN0IGNoYXIgKmNzLCBjb25zdCBjaGFyICpjdCkKK3sKKwl1bnNpZ25lZCBjaGFyIGMxLCBjMjsKKworCXdoaWxlICgxKSB7CisJCWMxID0gKmNzKys7CisJCWMyID0gKmN0Kys7CisJCWlmIChjMSAhPSBjMikKKwkJCXJldHVybiBjMSA8IGMyID8gLTEgOiAxOworCQlpZiAoIWMxKQorCQkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzdHJjbXApOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNNUAorLyoqCisgKiBzdHJuY21wIC0gQ29tcGFyZSB0d28gbGVuZ3RoLWxpbWl0ZWQgc3RyaW5ncworICogQGNzOiBPbmUgc3RyaW5nCisgKiBAY3Q6IEFub3RoZXIgc3RyaW5nCisgKiBAY291bnQ6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBjb21wYXJlCisgKi8KK2ludCBzdHJuY21wKGNvbnN0IGNoYXIgKmNzLCBjb25zdCBjaGFyICpjdCwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgYzEsIGMyOworCisJd2hpbGUgKGNvdW50KSB7CisJCWMxID0gKmNzKys7CisJCWMyID0gKmN0Kys7CisJCWlmIChjMSAhPSBjMikKKwkJCXJldHVybiBjMSA8IGMyID8gLTEgOiAxOworCQlpZiAoIWMxKQorCQkJYnJlYWs7CisJCWNvdW50LS07CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChzdHJuY21wKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkNIUgorLyoqCisgKiBzdHJjaHIgLSBGaW5kIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgY2hhcmFjdGVyIGluIGEgc3RyaW5nCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGM6IFRoZSBjaGFyYWN0ZXIgdG8gc2VhcmNoIGZvcgorICovCitjaGFyICpzdHJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisJZm9yICg7ICpzICE9IChjaGFyKWM7ICsrcykKKwkJaWYgKCpzID09ICdcMCcpCisJCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gKGNoYXIgKilzOworfQorRVhQT1JUX1NZTUJPTChzdHJjaHIpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ0hSTlVMCisvKioKKyAqIHN0cmNocm51bCAtIEZpbmQgYW5kIHJldHVybiBhIGNoYXJhY3RlciBpbiBhIHN0cmluZywgb3IgZW5kIG9mIHN0cmluZworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjOiBUaGUgY2hhcmFjdGVyIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBSZXR1cm5zIHBvaW50ZXIgdG8gZmlyc3Qgb2NjdXJyZW5jZSBvZiAnYycgaW4gcy4gSWYgYyBpcyBub3QgZm91bmQsIHRoZW4KKyAqIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG51bGwgYnl0ZSBhdCB0aGUgZW5kIG9mIHMuCisgKi8KK2NoYXIgKnN0cmNocm51bChjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwl3aGlsZSAoKnMgJiYgKnMgIT0gKGNoYXIpYykKKwkJcysrOworCXJldHVybiAoY2hhciAqKXM7Cit9CitFWFBPUlRfU1lNQk9MKHN0cmNocm51bCk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJSQ0hSCisvKioKKyAqIHN0cnJjaHIgLSBGaW5kIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAYzogVGhlIGNoYXJhY3RlciB0byBzZWFyY2ggZm9yCisgKi8KK2NoYXIgKnN0cnJjaHIoY29uc3QgY2hhciAqcywgaW50IGMpCit7CisJY29uc3QgY2hhciAqbGFzdCA9IE5VTEw7CisJZG8geworCQlpZiAoKnMgPT0gKGNoYXIpYykKKwkJCWxhc3QgPSBzOworCX0gd2hpbGUgKCpzKyspOworCXJldHVybiAoY2hhciAqKWxhc3Q7Cit9CitFWFBPUlRfU1lNQk9MKHN0cnJjaHIpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkNIUgorLyoqCisgKiBzdHJuY2hyIC0gRmluZCBhIGNoYXJhY3RlciBpbiBhIGxlbmd0aCBsaW1pdGVkIHN0cmluZworICogQHM6IFRoZSBzdHJpbmcgdG8gYmUgc2VhcmNoZWQKKyAqIEBjb3VudDogVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHNlYXJjaGVkCisgKiBAYzogVGhlIGNoYXJhY3RlciB0byBzZWFyY2ggZm9yCisgKi8KK2NoYXIgKnN0cm5jaHIoY29uc3QgY2hhciAqcywgc2l6ZV90IGNvdW50LCBpbnQgYykKK3sKKwlmb3IgKDsgY291bnQtLSAmJiAqcyAhPSAnXDAnOyArK3MpCisJCWlmICgqcyA9PSAoY2hhciljKQorCQkJcmV0dXJuIChjaGFyICopczsKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3RybmNocik7CisjZW5kaWYKKworLyoqCisgKiBza2lwX3NwYWNlcyAtIFJlbW92ZXMgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gQHN0ci4KKyAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gYmUgc3RyaXBwZWQuCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBAc3RyLgorICovCitjaGFyICpza2lwX3NwYWNlcyhjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKGlzc3BhY2UoKnN0cikpCisJCSsrc3RyOworCXJldHVybiAoY2hhciAqKXN0cjsKK30KK0VYUE9SVF9TWU1CT0woc2tpcF9zcGFjZXMpOworCisvKioKKyAqIHN0cmltIC0gUmVtb3ZlcyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gQHMuCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzdHJpcHBlZC4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIGZpcnN0IHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgcmVwbGFjZWQgd2l0aCBhICVOVUwtdGVybWluYXRvcgorICogaW4gdGhlIGdpdmVuIHN0cmluZyBAcy4gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlCisgKiBjaGFyYWN0ZXIgaW4gQHMuCisgKi8KK2NoYXIgKnN0cmltKGNoYXIgKnMpCit7CisJc2l6ZV90IHNpemU7CisJY2hhciAqZW5kOworCisJc2l6ZSA9IHN0cmxlbihzKTsKKwlpZiAoIXNpemUpCisJCXJldHVybiBzOworCisJZW5kID0gcyArIHNpemUgLSAxOworCXdoaWxlIChlbmQgPj0gcyAmJiBpc3NwYWNlKCplbmQpKQorCQllbmQtLTsKKwkqKGVuZCArIDEpID0gJ1wwJzsKKworCXJldHVybiBza2lwX3NwYWNlcyhzKTsKK30KK0VYUE9SVF9TWU1CT0woc3RyaW0pOworCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUkxFTgorLyoqCisgKiBzdHJsZW4gLSBGaW5kIHRoZSBsZW5ndGggb2YgYSBzdHJpbmcKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNpemVkCisgKi8KK3NpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqcykKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyAqc2MgIT0gJ1wwJzsgKytzYykKKwkJLyogbm90aGluZyAqLzsKKwlyZXR1cm4gc2MgLSBzOworfQorRVhQT1JUX1NZTUJPTChzdHJsZW4pOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSTkxFTgorLyoqCisgKiBzdHJubGVuIC0gRmluZCB0aGUgbGVuZ3RoIG9mIGEgbGVuZ3RoLWxpbWl0ZWQgc3RyaW5nCisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzaXplZAorICogQGNvdW50OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gc2VhcmNoCisgKi8KK3NpemVfdCBzdHJubGVuKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBjb3VudCkKK3sKKwljb25zdCBjaGFyICpzYzsKKworCWZvciAoc2MgPSBzOyBjb3VudC0tICYmICpzYyAhPSAnXDAnOyArK3NjKQorCQkvKiBub3RoaW5nICovOworCXJldHVybiBzYyAtIHM7Cit9CitFWFBPUlRfU1lNQk9MKHN0cm5sZW4pOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSU1BOCisvKioKKyAqIHN0cnNwbiAtIENhbGN1bGF0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBpbml0aWFsIHN1YnN0cmluZyBvZiBAcyB3aGljaCBvbmx5IGNvbnRhaW4gbGV0dGVycyBpbiBAYWNjZXB0CisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQGFjY2VwdDogVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yCisgKi8KK3NpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqYWNjZXB0KQoreworCWNvbnN0IGNoYXIgKnA7CisJY29uc3QgY2hhciAqYTsKKwlzaXplX3QgY291bnQgPSAwOworCisJZm9yIChwID0gczsgKnAgIT0gJ1wwJzsgKytwKSB7CisJCWZvciAoYSA9IGFjY2VwdDsgKmEgIT0gJ1wwJzsgKythKSB7CisJCQlpZiAoKnAgPT0gKmEpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCphID09ICdcMCcpCisJCQlyZXR1cm4gY291bnQ7CisJCSsrY291bnQ7CisJfQorCXJldHVybiBjb3VudDsKK30KKworRVhQT1JUX1NZTUJPTChzdHJzcG4pOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfU1RSQ1NQTgorLyoqCisgKiBzdHJjc3BuIC0gQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIGluaXRpYWwgc3Vic3RyaW5nIG9mIEBzIHdoaWNoIGRvZXMgbm90IGNvbnRhaW4gbGV0dGVycyBpbiBAcmVqZWN0CisgKiBAczogVGhlIHN0cmluZyB0byBiZSBzZWFyY2hlZAorICogQHJlamVjdDogVGhlIHN0cmluZyB0byBhdm9pZAorICovCitzaXplX3Qgc3RyY3Nwbihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpyZWplY3QpCit7CisJY29uc3QgY2hhciAqcDsKKwljb25zdCBjaGFyICpyOworCXNpemVfdCBjb3VudCA9IDA7CisKKwlmb3IgKHAgPSBzOyAqcCAhPSAnXDAnOyArK3ApIHsKKwkJZm9yIChyID0gcmVqZWN0OyAqciAhPSAnXDAnOyArK3IpIHsKKwkJCWlmICgqcCA9PSAqcikKKwkJCQlyZXR1cm4gY291bnQ7CisJCX0KKwkJKytjb3VudDsKKwl9CisJcmV0dXJuIGNvdW50OworfQorRVhQT1JUX1NZTUJPTChzdHJjc3BuKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUlBCUksKKy8qKgorICogc3RycGJyayAtIEZpbmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzZXQgb2YgY2hhcmFjdGVycworICogQGNzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqLworY2hhciAqc3RycGJyayhjb25zdCBjaGFyICpjcywgY29uc3QgY2hhciAqY3QpCit7CisJY29uc3QgY2hhciAqc2MxLCAqc2MyOworCisJZm9yIChzYzEgPSBjczsgKnNjMSAhPSAnXDAnOyArK3NjMSkgeworCQlmb3IgKHNjMiA9IGN0OyAqc2MyICE9ICdcMCc7ICsrc2MyKSB7CisJCQlpZiAoKnNjMSA9PSAqc2MyKQorCQkJCXJldHVybiAoY2hhciAqKXNjMTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3RycGJyayk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTRVAKKy8qKgorICogc3Ryc2VwIC0gU3BsaXQgYSBzdHJpbmcgaW50byB0b2tlbnMKKyAqIEBzOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAY3Q6IFRoZSBjaGFyYWN0ZXJzIHRvIHNlYXJjaCBmb3IKKyAqCisgKiBzdHJzZXAoKSB1cGRhdGVzIEBzIHRvIHBvaW50IGFmdGVyIHRoZSB0b2tlbiwgcmVhZHkgZm9yIHRoZSBuZXh0IGNhbGwuCisgKgorICogSXQgcmV0dXJucyBlbXB0eSB0b2tlbnMsIHRvbywgYmVoYXZpbmcgZXhhY3RseSBsaWtlIHRoZSBsaWJjIGZ1bmN0aW9uCisgKiBvZiB0aGF0IG5hbWUuIEluIGZhY3QsIGl0IHdhcyBzdG9sZW4gZnJvbSBnbGliYzIgYW5kIGRlLWZhbmN5LWZpZWQuCisgKiBTYW1lIHNlbWFudGljcywgc2xpbW1lciBzaGFwZS4gOykKKyAqLworY2hhciAqc3Ryc2VwKGNoYXIgKipzLCBjb25zdCBjaGFyICpjdCkKK3sKKwljaGFyICpzYmVnaW4gPSAqczsKKwljaGFyICplbmQ7CisKKwlpZiAoc2JlZ2luID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJZW5kID0gc3RycGJyayhzYmVnaW4sIGN0KTsKKwlpZiAoZW5kKQorCQkqZW5kKysgPSAnXDAnOworCSpzID0gZW5kOworCXJldHVybiBzYmVnaW47Cit9CitFWFBPUlRfU1lNQk9MKHN0cnNlcCk7CisjZW5kaWYKKworLyoqCisgKiBzeXNmc19zdHJlcSAtIHJldHVybiB0cnVlIGlmIHN0cmluZ3MgYXJlIGVxdWFsLCBtb2R1bG8gdHJhaWxpbmcgbmV3bGluZQorICogQHMxOiBvbmUgc3RyaW5nCisgKiBAczI6IGFub3RoZXIgc3RyaW5nCisgKgorICogVGhpcyByb3V0aW5lIHJldHVybnMgdHJ1ZSBpZmYgdHdvIHN0cmluZ3MgYXJlIGVxdWFsLCB0cmVhdGluZyBib3RoCisgKiBOVUwgYW5kIG5ld2xpbmUtdGhlbi1OVUwgYXMgZXF1aXZhbGVudCBzdHJpbmcgdGVybWluYXRpb25zLiAgSXQncworICogZ2VhcmVkIGZvciB1c2Ugd2l0aCBzeXNmcyBpbnB1dCBzdHJpbmdzLCB3aGljaCBnZW5lcmFsbHkgdGVybWluYXRlCisgKiB3aXRoIG5ld2xpbmVzIGJ1dCBhcmUgY29tcGFyZWQgYWdhaW5zdCB2YWx1ZXMgd2l0aG91dCBuZXdsaW5lcy4KKyAqLworYm9vbCBzeXNmc19zdHJlcShjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCit7CisJd2hpbGUgKCpzMSAmJiAqczEgPT0gKnMyKSB7CisJCXMxKys7CisJCXMyKys7CisJfQorCisJaWYgKCpzMSA9PSAqczIpCisJCXJldHVybiB0cnVlOworCWlmICghKnMxICYmICpzMiA9PSAnXG4nICYmICFzMlsxXSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKCpzMSA9PSAnXG4nICYmICFzMVsxXSAmJiAhKnMyKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CitFWFBPUlRfU1lNQk9MKHN5c2ZzX3N0cmVxKTsKKworLyoqCisgKiBtYXRjaF9zdHJpbmcgLSBtYXRjaGVzIGdpdmVuIHN0cmluZyBpbiBhbiBhcnJheQorICogQGFycmF5OglhcnJheSBvZiBzdHJpbmdzCisgKiBAbjoJCW51bWJlciBvZiBzdHJpbmdzIGluIHRoZSBhcnJheSBvciAtMSBmb3IgTlVMTCB0ZXJtaW5hdGVkIGFycmF5cworICogQHN0cmluZzoJc3RyaW5nIHRvIG1hdGNoIHdpdGgKKyAqCisgKiBSZXR1cm46CisgKiBpbmRleCBvZiBhIEBzdHJpbmcgaW4gdGhlIEBhcnJheSBpZiBtYXRjaGVzLCBvciAlLUVJTlZBTCBvdGhlcndpc2UuCisgKi8KK2ludCBtYXRjaF9zdHJpbmcoY29uc3QgY2hhciAqIGNvbnN0ICphcnJheSwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpbnQgaW5kZXg7CisJY29uc3QgY2hhciAqaXRlbTsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG47IGluZGV4KyspIHsKKwkJaXRlbSA9IGFycmF5W2luZGV4XTsKKwkJaWYgKCFpdGVtKQorCQkJYnJlYWs7CisJCWlmICghc3RyY21wKGl0ZW0sIHN0cmluZykpCisJCQlyZXR1cm4gaW5kZXg7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MKG1hdGNoX3N0cmluZyk7CisKKy8qKgorICogX19zeXNmc19tYXRjaF9zdHJpbmcgLSBtYXRjaGVzIGdpdmVuIHN0cmluZyBpbiBhbiBhcnJheQorICogQGFycmF5OiBhcnJheSBvZiBzdHJpbmdzCisgKiBAbjogbnVtYmVyIG9mIHN0cmluZ3MgaW4gdGhlIGFycmF5IG9yIC0xIGZvciBOVUxMIHRlcm1pbmF0ZWQgYXJyYXlzCisgKiBAc3RyOiBzdHJpbmcgdG8gbWF0Y2ggd2l0aAorICoKKyAqIFJldHVybnMgaW5kZXggb2YgQHN0ciBpbiB0aGUgQGFycmF5IG9yIC1FSU5WQUwsIGp1c3QgbGlrZSBtYXRjaF9zdHJpbmcoKS4KKyAqIFVzZXMgc3lzZnNfc3RyZXEgaW5zdGVhZCBvZiBzdHJjbXAgZm9yIG1hdGNoaW5nLgorICovCitpbnQgX19zeXNmc19tYXRjaF9zdHJpbmcoY29uc3QgY2hhciAqIGNvbnN0ICphcnJheSwgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICppdGVtOworCWludCBpbmRleDsKKworCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IG47IGluZGV4KyspIHsKKwkJaXRlbSA9IGFycmF5W2luZGV4XTsKKwkJaWYgKCFpdGVtKQorCQkJYnJlYWs7CisJCWlmIChzeXNmc19zdHJlcShpdGVtLCBzdHIpKQorCQkJcmV0dXJuIGluZGV4OworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorRVhQT1JUX1NZTUJPTChfX3N5c2ZzX21hdGNoX3N0cmluZyk7CisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0VUCisvKioKKyAqIG1lbXNldCAtIEZpbGwgYSByZWdpb24gb2YgbWVtb3J5IHdpdGggdGhlIGdpdmVuIHZhbHVlCisgKiBAczogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGFyZWEuCisgKiBAYzogVGhlIGJ5dGUgdG8gZmlsbCB0aGUgYXJlYSB3aXRoCisgKiBAY291bnQ6IFRoZSBzaXplIG9mIHRoZSBhcmVhLgorICoKKyAqIERvIG5vdCB1c2UgbWVtc2V0KCkgdG8gYWNjZXNzIElPIHNwYWNlLCB1c2UgbWVtc2V0X2lvKCkgaW5zdGVhZC4KKyAqLwordm9pZCAqbWVtc2V0KHZvaWQgKnMsIGludCBjLCBzaXplX3QgY291bnQpCit7CisJY2hhciAqeHMgPSBzOworCisJd2hpbGUgKGNvdW50LS0pCisJCSp4cysrID0gYzsKKwlyZXR1cm4gczsKK30KK0VYUE9SVF9TWU1CT0wobWVtc2V0KTsKKyNlbmRpZgorCisvKioKKyAqIG1lbXplcm9fZXhwbGljaXQgLSBGaWxsIGEgcmVnaW9uIG9mIG1lbW9yeSAoZS5nLiBzZW5zaXRpdmUKKyAqCQkgICAgICBrZXlpbmcgZGF0YSkgd2l0aCAwcy4KKyAqIEBzOiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYXJlYS4KKyAqIEBjb3VudDogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogTm90ZTogdXN1YWxseSB1c2luZyBtZW1zZXQoKSBpcyBqdXN0IGZpbmUgKCEpLCBidXQgaW4gY2FzZXMKKyAqIHdoZXJlIGNsZWFyaW5nIG91dCBfbG9jYWxfIGRhdGEgYXQgdGhlIGVuZCBvZiBhIHNjb3BlIGlzCisgKiBuZWNlc3NhcnksIG1lbXplcm9fZXhwbGljaXQoKSBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIGluCisgKiBvcmRlciB0byBwcmV2ZW50IHRoZSBjb21waWxlciBmcm9tIG9wdGltaXNpbmcgYXdheSB6ZXJvaW5nLgorICoKKyAqIG1lbXplcm9fZXhwbGljaXQoKSBkb2Vzbid0IG5lZWQgYW4gYXJjaC1zcGVjaWZpYyB2ZXJzaW9uIGFzCisgKiBpdCBqdXN0IGludm9rZXMgdGhlIG9uZSBvZiBtZW1zZXQoKSBpbXBsaWNpdGx5LgorICovCit2b2lkIG1lbXplcm9fZXhwbGljaXQodm9pZCAqcywgc2l6ZV90IGNvdW50KQoreworCW1lbXNldChzLCAwLCBjb3VudCk7CisJYmFycmllcl9kYXRhKHMpOworfQorRVhQT1JUX1NZTUJPTChtZW16ZXJvX2V4cGxpY2l0KTsKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1TRVQxNgorLyoqCisgKiBtZW1zZXQxNigpIC0gRmlsbCBhIG1lbW9yeSBhcmVhIHdpdGggYSB1aW50MTZfdAorICogQHM6IFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBhcmVhLgorICogQHY6IFRoZSB2YWx1ZSB0byBmaWxsIHRoZSBhcmVhIHdpdGgKKyAqIEBjb3VudDogVGhlIG51bWJlciBvZiB2YWx1ZXMgdG8gc3RvcmUKKyAqCisgKiBEaWZmZXJzIGZyb20gbWVtc2V0KCkgaW4gdGhhdCBpdCBmaWxscyB3aXRoIGEgdWludDE2X3QgaW5zdGVhZAorICogb2YgYSBieXRlLiAgUmVtZW1iZXIgdGhhdCBAY291bnQgaXMgdGhlIG51bWJlciBvZiB1aW50MTZfdHMgdG8KKyAqIHN0b3JlLCBub3QgdGhlIG51bWJlciBvZiBieXRlcy4KKyAqLwordm9pZCAqbWVtc2V0MTYodWludDE2X3QgKnMsIHVpbnQxNl90IHYsIHNpemVfdCBjb3VudCkKK3sKKwl1aW50MTZfdCAqeHMgPSBzOworCisJd2hpbGUgKGNvdW50LS0pCisJCSp4cysrID0gdjsKKwlyZXR1cm4gczsKK30KK0VYUE9SVF9TWU1CT0wobWVtc2V0MTYpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0VUMzIKKy8qKgorICogbWVtc2V0MzIoKSAtIEZpbGwgYSBtZW1vcnkgYXJlYSB3aXRoIGEgdWludDMyX3QKKyAqIEBzOiBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYXJlYS4KKyAqIEB2OiBUaGUgdmFsdWUgdG8gZmlsbCB0aGUgYXJlYSB3aXRoCisgKiBAY291bnQ6IFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIHN0b3JlCisgKgorICogRGlmZmVycyBmcm9tIG1lbXNldCgpIGluIHRoYXQgaXQgZmlsbHMgd2l0aCBhIHVpbnQzMl90IGluc3RlYWQKKyAqIG9mIGEgYnl0ZS4gIFJlbWVtYmVyIHRoYXQgQGNvdW50IGlzIHRoZSBudW1iZXIgb2YgdWludDMyX3RzIHRvCisgKiBzdG9yZSwgbm90IHRoZSBudW1iZXIgb2YgYnl0ZXMuCisgKi8KK3ZvaWQgKm1lbXNldDMyKHVpbnQzMl90ICpzLCB1aW50MzJfdCB2LCBzaXplX3QgY291bnQpCit7CisJdWludDMyX3QgKnhzID0gczsKKworCXdoaWxlIChjb3VudC0tKQorCQkqeHMrKyA9IHY7CisJcmV0dXJuIHM7Cit9CitFWFBPUlRfU1lNQk9MKG1lbXNldDMyKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX01FTVNFVDY0CisvKioKKyAqIG1lbXNldDY0KCkgLSBGaWxsIGEgbWVtb3J5IGFyZWEgd2l0aCBhIHVpbnQ2NF90CisgKiBAczogUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGFyZWEuCisgKiBAdjogVGhlIHZhbHVlIHRvIGZpbGwgdGhlIGFyZWEgd2l0aAorICogQGNvdW50OiBUaGUgbnVtYmVyIG9mIHZhbHVlcyB0byBzdG9yZQorICoKKyAqIERpZmZlcnMgZnJvbSBtZW1zZXQoKSBpbiB0aGF0IGl0IGZpbGxzIHdpdGggYSB1aW50NjRfdCBpbnN0ZWFkCisgKiBvZiBhIGJ5dGUuICBSZW1lbWJlciB0aGF0IEBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHVpbnQ2NF90cyB0bworICogc3RvcmUsIG5vdCB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorICovCit2b2lkICptZW1zZXQ2NCh1aW50NjRfdCAqcywgdWludDY0X3Qgdiwgc2l6ZV90IGNvdW50KQoreworCXVpbnQ2NF90ICp4cyA9IHM7CisKKwl3aGlsZSAoY291bnQtLSkKKwkJKnhzKysgPSB2OworCXJldHVybiBzOworfQorRVhQT1JUX1NZTUJPTChtZW1zZXQ2NCk7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DUFkKKy8qKgorICogbWVtY3B5IC0gQ29weSBvbmUgYXJlYSBvZiBtZW1vcnkgdG8gYW5vdGhlcgorICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgZnJvbQorICogQGNvdW50OiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmdW5jdGlvbiB0byBhY2Nlc3MgSU8gc3BhY2UsIHVzZSBtZW1jcHlfdG9pbygpCisgKiBvciBtZW1jcHlfZnJvbWlvKCkgaW5zdGVhZC4KKyAqLwordm9pZCAqbWVtY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcCA9IGRlc3Q7CisJY29uc3QgY2hhciAqcyA9IHNyYzsKKworCXdoaWxlIChjb3VudC0tKQorCQkqdG1wKysgPSAqcysrOworCXJldHVybiBkZXN0OworfQorRVhQT1JUX1NZTUJPTChtZW1jcHkpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNTU9WRQorLyoqCisgKiBtZW1tb3ZlIC0gQ29weSBvbmUgYXJlYSBvZiBtZW1vcnkgdG8gYW5vdGhlcgorICogQGRlc3Q6IFdoZXJlIHRvIGNvcHkgdG8KKyAqIEBzcmM6IFdoZXJlIHRvIGNvcHkgZnJvbQorICogQGNvdW50OiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqCisgKiBVbmxpa2UgbWVtY3B5KCksIG1lbW1vdmUoKSBjb3BlcyB3aXRoIG92ZXJsYXBwaW5nIGFyZWFzLgorICovCit2b2lkICptZW1tb3ZlKHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnRtcDsKKwljb25zdCBjaGFyICpzOworCisJaWYgKGRlc3QgPD0gc3JjKSB7CisJCXRtcCA9IGRlc3Q7CisJCXMgPSBzcmM7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKnRtcCsrID0gKnMrKzsKKwl9IGVsc2UgeworCQl0bXAgPSBkZXN0OworCQl0bXAgKz0gY291bnQ7CisJCXMgPSBzcmM7CisJCXMgKz0gY291bnQ7CisJCXdoaWxlIChjb3VudC0tKQorCQkJKi0tdG1wID0gKi0tczsKKwl9CisJcmV0dXJuIGRlc3Q7Cit9CitFWFBPUlRfU1lNQk9MKG1lbW1vdmUpOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNQ01QCisvKioKKyAqIG1lbWNtcCAtIENvbXBhcmUgdHdvIGFyZWFzIG9mIG1lbW9yeQorICogQGNzOiBPbmUgYXJlYSBvZiBtZW1vcnkKKyAqIEBjdDogQW5vdGhlciBhcmVhIG9mIG1lbW9yeQorICogQGNvdW50OiBUaGUgc2l6ZSBvZiB0aGUgYXJlYS4KKyAqLworI3VuZGVmIG1lbWNtcAorX192aXNpYmxlIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqY3MsIGNvbnN0IHZvaWQgKmN0LCBzaXplX3QgY291bnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqc3UxLCAqc3UyOworCWludCByZXMgPSAwOworCisJZm9yIChzdTEgPSBjcywgc3UyID0gY3Q7IDAgPCBjb3VudDsgKytzdTEsICsrc3UyLCBjb3VudC0tKQorCQlpZiAoKHJlcyA9ICpzdTEgLSAqc3UyKSAhPSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0wobWVtY21wKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX0JDTVAKKy8qKgorICogYmNtcCAtIHJldHVybnMgMCBpZiBhbmQgb25seSBpZiB0aGUgYnVmZmVycyBoYXZlIGlkZW50aWNhbCBjb250ZW50cy4KKyAqIEBhOiBwb2ludGVyIHRvIGZpcnN0IGJ1ZmZlci4KKyAqIEBiOiBwb2ludGVyIHRvIHNlY29uZCBidWZmZXIuCisgKiBAbGVuOiBzaXplIG9mIGJ1ZmZlcnMuCisgKgorICogVGhlIHNpZ24gb3IgbWFnbml0dWRlIG9mIGEgbm9uLXplcm8gcmV0dXJuIHZhbHVlIGhhcyBubyBwYXJ0aWN1bGFyCisgKiBtZWFuaW5nLCBhbmQgYXJjaGl0ZWN0dXJlcyBtYXkgaW1wbGVtZW50IHRoZWlyIG93biBtb3JlIGVmZmljaWVudCBiY21wKCkuIFNvCisgKiB3aGlsZSB0aGlzIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gaXMgYSBzaW1wbGUgKHRhaWwpIGNhbGwgdG8gbWVtY21wLCBkbworICogbm90IHJlbHkgb24gYW55dGhpbmcgYnV0IHdoZXRoZXIgdGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIG9yIG5vbi16ZXJvLgorICovCisjdW5kZWYgYmNtcAoraW50IGJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYiwgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbWVtY21wKGEsIGIsIGxlbik7Cit9CitFWFBPUlRfU1lNQk9MKGJjbXApOworI2VuZGlmCisKKyNpZm5kZWYgX19IQVZFX0FSQ0hfTUVNU0NBTgorLyoqCisgKiBtZW1zY2FuIC0gRmluZCBhIGNoYXJhY3RlciBpbiBhbiBhcmVhIG9mIG1lbW9yeS4KKyAqIEBhZGRyOiBUaGUgbWVtb3J5IGFyZWEKKyAqIEBjOiBUaGUgYnl0ZSB0byBzZWFyY2ggZm9yCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBAYywgb3IgMSBieXRlIHBhc3QKKyAqIHRoZSBhcmVhIGlmIEBjIGlzIG5vdCBmb3VuZAorICovCit2b2lkICptZW1zY2FuKHZvaWQgKmFkZHIsIGludCBjLCBzaXplX3Qgc2l6ZSkKK3sKKwl1bnNpZ25lZCBjaGFyICpwID0gYWRkcjsKKworCXdoaWxlIChzaXplKSB7CisJCWlmICgqcCA9PSBjKQorCQkJcmV0dXJuICh2b2lkICopcDsKKwkJcCsrOworCQlzaXplLS07CisJfQorICAJcmV0dXJuICh2b2lkICopcDsKK30KK0VYUE9SVF9TWU1CT0wobWVtc2Nhbik7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9TVFJTVFIKKy8qKgorICogc3Ryc3RyIC0gRmluZCB0aGUgZmlyc3Qgc3Vic3RyaW5nIGluIGEgJU5VTCB0ZXJtaW5hdGVkIHN0cmluZworICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAczI6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICovCitjaGFyICpzdHJzdHIoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKQoreworCXNpemVfdCBsMSwgbDI7CisKKwlsMiA9IHN0cmxlbihzMik7CisJaWYgKCFsMikKKwkJcmV0dXJuIChjaGFyICopczE7CisJbDEgPSBzdHJsZW4oczEpOworCXdoaWxlIChsMSA+PSBsMikgeworCQlsMS0tOworCQlpZiAoIW1lbWNtcChzMSwgczIsIGwyKSkKKwkJCXJldHVybiAoY2hhciAqKXMxOworCQlzMSsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3Ryc3RyKTsKKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUUk5TVFIKKy8qKgorICogc3RybnN0ciAtIEZpbmQgdGhlIGZpcnN0IHN1YnN0cmluZyBpbiBhIGxlbmd0aC1saW1pdGVkIHN0cmluZworICogQHMxOiBUaGUgc3RyaW5nIHRvIGJlIHNlYXJjaGVkCisgKiBAczI6IFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvcgorICogQGxlbjogdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gc2VhcmNoCisgKi8KK2NoYXIgKnN0cm5zdHIoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbGVuKQoreworCXNpemVfdCBsMjsKKworCWwyID0gc3RybGVuKHMyKTsKKwlpZiAoIWwyKQorCQlyZXR1cm4gKGNoYXIgKilzMTsKKwl3aGlsZSAobGVuID49IGwyKSB7CisJCWxlbi0tOworCQlpZiAoIW1lbWNtcChzMSwgczIsIGwyKSkKKwkJCXJldHVybiAoY2hhciAqKXMxOworCQlzMSsrOworCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3RybnN0cik7CisjZW5kaWYKKworI2lmbmRlZiBfX0hBVkVfQVJDSF9NRU1DSFIKKy8qKgorICogbWVtY2hyIC0gRmluZCBhIGNoYXJhY3RlciBpbiBhbiBhcmVhIG9mIG1lbW9yeS4KKyAqIEBzOiBUaGUgbWVtb3J5IGFyZWEKKyAqIEBjOiBUaGUgYnl0ZSB0byBzZWFyY2ggZm9yCisgKiBAbjogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBAYywgb3IgJU5VTEwKKyAqIGlmIEBjIGlzIG5vdCBmb3VuZAorICovCit2b2lkICptZW1jaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnAgPSBzOworCXdoaWxlIChuLS0gIT0gMCkgeworICAgICAgICAJaWYgKCh1bnNpZ25lZCBjaGFyKWMgPT0gKnArKykgeworCQkJcmV0dXJuICh2b2lkICopKHAgLSAxKTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0wobWVtY2hyKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCAqY2hlY2tfYnl0ZXM4KGNvbnN0IHU4ICpzdGFydCwgdTggdmFsdWUsIHVuc2lnbmVkIGludCBieXRlcykKK3sKKwl3aGlsZSAoYnl0ZXMpIHsKKwkJaWYgKCpzdGFydCAhPSB2YWx1ZSkKKwkJCXJldHVybiAodm9pZCAqKXN0YXJ0OworCQlzdGFydCsrOworCQlieXRlcy0tOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyoqCisgKiBtZW1jaHJfaW52IC0gRmluZCBhbiB1bm1hdGNoaW5nIGNoYXJhY3RlciBpbiBhbiBhcmVhIG9mIG1lbW9yeS4KKyAqIEBzdGFydDogVGhlIG1lbW9yeSBhcmVhCisgKiBAYzogRmluZCBhIGNoYXJhY3RlciBvdGhlciB0aGFuIGMKKyAqIEBieXRlczogVGhlIHNpemUgb2YgdGhlIGFyZWEuCisgKgorICogcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG90aGVyIHRoYW4gQGMsIG9yICVOVUxMCisgKiBpZiB0aGUgd2hvbGUgYnVmZmVyIGNvbnRhaW5zIGp1c3QgQGMuCisgKi8KK3ZvaWQgKm1lbWNocl9pbnYoY29uc3Qgdm9pZCAqc3RhcnQsIGludCBjLCBzaXplX3QgYnl0ZXMpCit7CisJdTggdmFsdWUgPSBjOworCXU2NCB2YWx1ZTY0OworCXVuc2lnbmVkIGludCB3b3JkcywgcHJlZml4OworCisJaWYgKGJ5dGVzIDw9IDE2KQorCQlyZXR1cm4gY2hlY2tfYnl0ZXM4KHN0YXJ0LCB2YWx1ZSwgYnl0ZXMpOworCisJdmFsdWU2NCA9IHZhbHVlOworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSEFTX0ZBU1RfTVVMVElQTElFUikgJiYgQklUU19QRVJfTE9ORyA9PSA2NAorCXZhbHVlNjQgKj0gMHgwMTAxMDEwMTAxMDEwMTAxVUxMOworI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9IQVNfRkFTVF9NVUxUSVBMSUVSKQorCXZhbHVlNjQgKj0gMHgwMTAxMDEwMTsKKwl2YWx1ZTY0IHw9IHZhbHVlNjQgPDwgMzI7CisjZWxzZQorCXZhbHVlNjQgfD0gdmFsdWU2NCA8PCA4OworCXZhbHVlNjQgfD0gdmFsdWU2NCA8PCAxNjsKKwl2YWx1ZTY0IHw9IHZhbHVlNjQgPDwgMzI7CisjZW5kaWYKKworCXByZWZpeCA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0ICUgODsKKwlpZiAocHJlZml4KSB7CisJCXU4ICpyOworCisJCXByZWZpeCA9IDggLSBwcmVmaXg7CisJCXIgPSBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBwcmVmaXgpOworCQlpZiAocikKKwkJCXJldHVybiByOworCQlzdGFydCArPSBwcmVmaXg7CisJCWJ5dGVzIC09IHByZWZpeDsKKwl9CisKKwl3b3JkcyA9IGJ5dGVzIC8gODsKKworCXdoaWxlICh3b3JkcykgeworCQlpZiAoKih1NjQgKilzdGFydCAhPSB2YWx1ZTY0KQorCQkJcmV0dXJuIGNoZWNrX2J5dGVzOChzdGFydCwgdmFsdWUsIDgpOworCQlzdGFydCArPSA4OworCQl3b3Jkcy0tOworCX0KKworCXJldHVybiBjaGVja19ieXRlczgoc3RhcnQsIHZhbHVlLCBieXRlcyAlIDgpOworfQorRVhQT1JUX1NZTUJPTChtZW1jaHJfaW52KTsKKworLyoqCisgKiBzdHJyZXBsYWNlIC0gUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgY2hhcmFjdGVyIGluIHN0cmluZy4KKyAqIEBzOiBUaGUgc3RyaW5nIHRvIG9wZXJhdGUgb24uCisgKiBAb2xkOiBUaGUgY2hhcmFjdGVyIGJlaW5nIHJlcGxhY2VkLgorICogQG5ldzogVGhlIGNoYXJhY3RlciBAb2xkIGlzIHJlcGxhY2VkIHdpdGguCisgKgorICogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBudWwgYnl0ZSBhdCB0aGUgZW5kIG9mIEBzLgorICovCitjaGFyICpzdHJyZXBsYWNlKGNoYXIgKnMsIGNoYXIgb2xkLCBjaGFyIG5ldykKK3sKKwlmb3IgKDsgKnM7ICsrcykKKwkJaWYgKCpzID09IG9sZCkKKwkJCSpzID0gbmV3OworCXJldHVybiBzOworfQorRVhQT1JUX1NZTUJPTChzdHJyZXBsYWNlKTsKKwordm9pZCBmb3J0aWZ5X3BhbmljKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcHJfZW1lcmcoImRldGVjdGVkIGJ1ZmZlciBvdmVyZmxvdyBpbiAlc1xuIiwgbmFtZSk7CisJQlVHKCk7Cit9CitFWFBPUlRfU1lNQk9MKGZvcnRpZnlfcGFuaWMpOworCisjaWZkZWYgQ09ORklHX1NUUklOR19TRUxGVEVTVAorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworc3RhdGljIF9faW5pdCBpbnQgbWVtc2V0MTZfc2VsZnRlc3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBpLCBqLCBrOworCXUxNiB2LCAqcDsKKworCXAgPSBrbWFsbG9jKDI1NiAqIDIgKiAyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKwkJCW1lbXNldChwLCAweGExLCAyNTYgKiAyICogc2l6ZW9mKHYpKTsKKwkJCW1lbXNldDE2KHAgKyBpLCAweGIxYjIsIGopOworCQkJZm9yIChrID0gMDsgayA8IDUxMjsgaysrKSB7CisJCQkJdiA9IHBba107CisJCQkJaWYgKGsgPCBpKSB7CisJCQkJCWlmICh2ICE9IDB4YTFhMSkKKwkJCQkJCWdvdG8gZmFpbDsKKwkJCQl9IGVsc2UgaWYgKGsgPCBpICsgaikgeworCQkJCQlpZiAodiAhPSAweGIxYjIpCisJCQkJCQlnb3RvIGZhaWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHYgIT0gMHhhMWExKQorCQkJCQkJZ290byBmYWlsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworZmFpbDoKKwlrZnJlZShwKTsKKwlpZiAoaSA8IDI1NikKKwkJcmV0dXJuIChpIDw8IDI0KSB8IChqIDw8IDE2KSB8IGs7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IG1lbXNldDMyX3NlbGZ0ZXN0KHZvaWQpCit7CisJdW5zaWduZWQgaSwgaiwgazsKKwl1MzIgdiwgKnA7CisKKwlwID0ga21hbGxvYygyNTYgKiAyICogNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IDI1NjsgaisrKSB7CisJCQltZW1zZXQocCwgMHhhMSwgMjU2ICogMiAqIHNpemVvZih2KSk7CisJCQltZW1zZXQzMihwICsgaSwgMHhiMWIyYjNiNCwgaik7CisJCQlmb3IgKGsgPSAwOyBrIDwgNTEyOyBrKyspIHsKKwkJCQl2ID0gcFtrXTsKKwkJCQlpZiAoayA8IGkpIHsKKwkJCQkJaWYgKHYgIT0gMHhhMWExYTFhMSkKKwkJCQkJCWdvdG8gZmFpbDsKKwkJCQl9IGVsc2UgaWYgKGsgPCBpICsgaikgeworCQkJCQlpZiAodiAhPSAweGIxYjJiM2I0KQorCQkJCQkJZ290byBmYWlsOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICh2ICE9IDB4YTFhMWExYTEpCisJCQkJCQlnb3RvIGZhaWw7CisJCQkJfQorCQkJfQorCQl9CisJfQorCitmYWlsOgorCWtmcmVlKHApOworCWlmIChpIDwgMjU2KQorCQlyZXR1cm4gKGkgPDwgMjQpIHwgKGogPDwgMTYpIHwgazsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5pdCBpbnQgbWVtc2V0NjRfc2VsZnRlc3Qodm9pZCkKK3sKKwl1bnNpZ25lZCBpLCBqLCBrOworCXU2NCB2LCAqcDsKKworCXAgPSBrbWFsbG9jKDI1NiAqIDIgKiA4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKwkJCW1lbXNldChwLCAweGExLCAyNTYgKiAyICogc2l6ZW9mKHYpKTsKKwkJCW1lbXNldDY0KHAgKyBpLCAweGIxYjJiM2I0YjViNmI3YjhVTEwsIGopOworCQkJZm9yIChrID0gMDsgayA8IDUxMjsgaysrKSB7CisJCQkJdiA9IHBba107CisJCQkJaWYgKGsgPCBpKSB7CisJCQkJCWlmICh2ICE9IDB4YTFhMWExYTFhMWExYTFhMVVMTCkKKwkJCQkJCWdvdG8gZmFpbDsKKwkJCQl9IGVsc2UgaWYgKGsgPCBpICsgaikgeworCQkJCQlpZiAodiAhPSAweGIxYjJiM2I0YjViNmI3YjhVTEwpCisJCQkJCQlnb3RvIGZhaWw7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKHYgIT0gMHhhMWExYTFhMWExYTFhMWExVUxMKQorCQkJCQkJZ290byBmYWlsOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworZmFpbDoKKwlrZnJlZShwKTsKKwlpZiAoaSA8IDI1NikKKwkJcmV0dXJuIChpIDw8IDI0KSB8IChqIDw8IDE2KSB8IGs7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgaW50IHN0cmluZ19zZWxmdGVzdF9pbml0KHZvaWQpCit7CisJaW50IHRlc3QsIHN1YnRlc3Q7CisKKwl0ZXN0ID0gMTsKKwlzdWJ0ZXN0ID0gbWVtc2V0MTZfc2VsZnRlc3QoKTsKKwlpZiAoc3VidGVzdCkKKwkJZ290byBmYWlsOworCisJdGVzdCA9IDI7CisJc3VidGVzdCA9IG1lbXNldDMyX3NlbGZ0ZXN0KCk7CisJaWYgKHN1YnRlc3QpCisJCWdvdG8gZmFpbDsKKworCXRlc3QgPSAzOworCXN1YnRlc3QgPSBtZW1zZXQ2NF9zZWxmdGVzdCgpOworCWlmIChzdWJ0ZXN0KQorCQlnb3RvIGZhaWw7CisKKwlwcl9pbmZvKCJTdHJpbmcgc2VsZnRlc3RzIHN1Y2NlZWRlZFxuIik7CisJcmV0dXJuIDA7CitmYWlsOgorCXByX2NyaXQoIlN0cmluZyBzZWxmdGVzdCBmYWlsdXJlICVkLiUwOHhcbiIsIHRlc3QsIHN1YnRlc3QpOworCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChzdHJpbmdfc2VsZnRlc3RfaW5pdCk7CisjZW5kaWYJLyogQ09ORklHX1NUUklOR19TRUxGVEVTVCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3RyaW5nX2hlbHBlcnMuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N0cmluZ19oZWxwZXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljNDkwZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N0cmluZ19oZWxwZXJzLmMKQEAgLTAsMCArMSw2MjggQEAKKy8qCisgKiBIZWxwZXJzIGZvciBmb3JtYXR0aW5nIGFuZCBwcmludGluZyBzdHJpbmdzCisgKgorICogQ29weXJpZ2h0IDMxIEF1Z3VzdCAyMDA4IEphbWVzIEJvdHRvbWxleQorICogQ29weXJpZ2h0IChDKSAyMDEzLCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nX2hlbHBlcnMuaD4KKworLyoqCisgKiBzdHJpbmdfZ2V0X3NpemUgLSBnZXQgdGhlIHNpemUgaW4gdGhlIHNwZWNpZmllZCB1bml0cworICogQHNpemU6CVRoZSBzaXplIHRvIGJlIGNvbnZlcnRlZCBpbiBibG9ja3MKKyAqIEBibGtfc2l6ZToJU2l6ZSBvZiB0aGUgYmxvY2sgKHVzZSAxIGZvciBzaXplIGluIGJ5dGVzKQorICogQHVuaXRzOgl1bml0cyB0byB1c2UgKHBvd2VycyBvZiAxMDAwIG9yIDEwMjQpCisgKiBAYnVmOglidWZmZXIgdG8gZm9ybWF0IHRvCisgKiBAbGVuOglsZW5ndGggb2YgYnVmZmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgc3RyaW5nIGZvcm1hdHRlZCB0byAzIHNpZ25pZmljYW50IGZpZ3VyZXMKKyAqIGdpdmluZyB0aGUgc2l6ZSBpbiB0aGUgcmVxdWlyZWQgdW5pdHMuICBAYnVmIHNob3VsZCBoYXZlIHJvb20gZm9yCisgKiBhdCBsZWFzdCA5IGJ5dGVzIGFuZCB3aWxsIGFsd2F5cyBiZSB6ZXJvIHRlcm1pbmF0ZWQuCisgKgorICovCit2b2lkIHN0cmluZ19nZXRfc2l6ZSh1NjQgc2l6ZSwgdTY0IGJsa19zaXplLCBjb25zdCBlbnVtIHN0cmluZ19zaXplX3VuaXRzIHVuaXRzLAorCQkgICAgIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdW5pdHNfMTBbXSA9IHsKKwkJIkIiLCAia0IiLCAiTUIiLCAiR0IiLCAiVEIiLCAiUEIiLCAiRUIiLCAiWkIiLCAiWUIiCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdW5pdHNfMltdID0geworCQkiQiIsICJLaUIiLCAiTWlCIiwgIkdpQiIsICJUaUIiLCAiUGlCIiwgIkVpQiIsICJaaUIiLCAiWWlCIgorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0ICpjb25zdCB1bml0c19zdHJbXSA9IHsKKwkJW1NUUklOR19VTklUU18xMF0gPSB1bml0c18xMCwKKwkJW1NUUklOR19VTklUU18yXSA9IHVuaXRzXzIsCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGRpdmlzb3JbXSA9IHsKKwkJW1NUUklOR19VTklUU18xMF0gPSAxMDAwLAorCQlbU1RSSU5HX1VOSVRTXzJdID0gMTAyNCwKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcm91bmRpbmdbXSA9IHsgNTAwLCA1MCwgNSB9OworCWludCBpID0gMCwgajsKKwl1MzIgcmVtYWluZGVyID0gMCwgc2ZfY2FwOworCWNoYXIgdG1wWzhdOworCWNvbnN0IGNoYXIgKnVuaXQ7CisKKwl0bXBbMF0gPSAnXDAnOworCisJaWYgKGJsa19zaXplID09IDApCisJCXNpemUgPSAwOworCWlmIChzaXplID09IDApCisJCWdvdG8gb3V0OworCisJLyogVGhpcyBpcyBOYXBpZXIncyBhbGdvcml0aG0uICBSZWR1Y2UgdGhlIG9yaWdpbmFsIGJsb2NrIHNpemUgdG8KKwkgKgorCSAqIGNvZWZmaWNpZW50ICogZGl2aXNvclt1bml0c11eaQorCSAqCisJICogd2UgZG8gdGhlIHJlZHVjdGlvbiBzbyBib3RoIGNvZWZmaWNpZW50cyBhcmUganVzdCB1bmRlciAzMiBiaXRzIHNvCisJICogdGhhdCBtdWx0aXBseWluZyB0aGVtIHRvZ2V0aGVyIHdvbid0IG92ZXJmbG93IDY0IGJpdHMgYW5kIHdlIGtlZXAKKwkgKiBhcyBtdWNoIHByZWNpc2lvbiBhcyBwb3NzaWJsZSBpbiB0aGUgbnVtYmVycy4KKwkgKgorCSAqIE5vdGU6IGl0J3Mgc2FmZSB0byB0aHJvdyBhd2F5IHRoZSByZW1haW5kZXJzIGhlcmUgYmVjYXVzZSBhbGwgdGhlCisJICogcHJlY2lzaW9uIGlzIGluIHRoZSBjb2VmZmljaWVudHMuCisJICovCisJd2hpbGUgKGJsa19zaXplID4+IDMyKSB7CisJCWRvX2RpdihibGtfc2l6ZSwgZGl2aXNvclt1bml0c10pOworCQlpKys7CisJfQorCisJd2hpbGUgKHNpemUgPj4gMzIpIHsKKwkJZG9fZGl2KHNpemUsIGRpdmlzb3JbdW5pdHNdKTsKKwkJaSsrOworCX0KKworCS8qIG5vdyBwZXJmb3JtIHRoZSBhY3R1YWwgbXVsdGlwbGljYXRpb24ga2VlcGluZyBpIGFzIHRoZSBzdW0gb2YgdGhlCisJICogdHdvIGxvZ2FyaXRobXMgKi8KKwlzaXplICo9IGJsa19zaXplOworCisJLyogYW5kIGxvZ2FyaXRobWljYWxseSByZWR1Y2UgaXQgdW50aWwgaXQncyBqdXN0IHVuZGVyIHRoZSBkaXZpc29yICovCisJd2hpbGUgKHNpemUgPj0gZGl2aXNvclt1bml0c10pIHsKKwkJcmVtYWluZGVyID0gZG9fZGl2KHNpemUsIGRpdmlzb3JbdW5pdHNdKTsKKwkJaSsrOworCX0KKworCS8qIHdvcmsgb3V0IGluIGogaG93IG1hbnkgZGlnaXRzIG9mIHByZWNpc2lvbiB3ZSBuZWVkIGZyb20gdGhlCisJICogcmVtYWluZGVyICovCisJc2ZfY2FwID0gc2l6ZTsKKwlmb3IgKGogPSAwOyBzZl9jYXAqMTAgPCAxMDAwOyBqKyspCisJCXNmX2NhcCAqPSAxMDsKKworCWlmICh1bml0cyA9PSBTVFJJTkdfVU5JVFNfMikgeworCQkvKiBleHByZXNzIHRoZSByZW1haW5kZXIgYXMgYSBkZWNpbWFsLiAgSXQncyBjdXJyZW50bHkgdGhlCisJCSAqIG51bWVyYXRvciBvZiBhIGZyYWN0aW9uIHdob3NlIGRlbm9taW5hdG9yIGlzCisJCSAqIGRpdmlzb3JbdW5pdHNdLCB3aGljaCBpcyAxIDw8IDEwIGZvciBTVFJJTkdfVU5JVFNfMiAqLworCQlyZW1haW5kZXIgKj0gMTAwMDsKKwkJcmVtYWluZGVyID4+PSAxMDsKKwl9CisKKwkvKiBhZGQgYSA1IHRvIHRoZSBkaWdpdCBiZWxvdyB3aGF0IHdpbGwgYmUgcHJpbnRlZCB0byBlbnN1cmUKKwkgKiBhbiBhcml0aG1ldGljYWwgcm91bmQgdXAgYW5kIGNhcnJ5IGl0IHRocm91Z2ggdG8gc2l6ZSAqLworCXJlbWFpbmRlciArPSByb3VuZGluZ1tqXTsKKwlpZiAocmVtYWluZGVyID49IDEwMDApIHsKKwkJcmVtYWluZGVyIC09IDEwMDA7CisJCXNpemUgKz0gMTsKKwl9CisKKwlpZiAoaikgeworCQlzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiLiUwM3UiLCByZW1haW5kZXIpOworCQl0bXBbaisxXSA9ICdcMCc7CisJfQorCisgb3V0OgorCWlmIChpID49IEFSUkFZX1NJWkUodW5pdHNfMikpCisJCXVuaXQgPSAiVU5LIjsKKwllbHNlCisJCXVuaXQgPSB1bml0c19zdHJbdW5pdHNdW2ldOworCisJc25wcmludGYoYnVmLCBsZW4sICIldSVzICVzIiwgKHUzMilzaXplLAorCQkgdG1wLCB1bml0KTsKK30KK0VYUE9SVF9TWU1CT0woc3RyaW5nX2dldF9zaXplKTsKKworc3RhdGljIGJvb2wgdW5lc2NhcGVfc3BhY2UoY2hhciAqKnNyYywgY2hhciAqKmRzdCkKK3sKKwljaGFyICpwID0gKmRzdCwgKnEgPSAqc3JjOworCisJc3dpdGNoICgqcSkgeworCWNhc2UgJ24nOgorCQkqcCA9ICdcbic7CisJCWJyZWFrOworCWNhc2UgJ3InOgorCQkqcCA9ICdccic7CisJCWJyZWFrOworCWNhc2UgJ3QnOgorCQkqcCA9ICdcdCc7CisJCWJyZWFrOworCWNhc2UgJ3YnOgorCQkqcCA9ICdcdic7CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQkqcCA9ICdcZic7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJKmRzdCArPSAxOworCSpzcmMgKz0gMTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdW5lc2NhcGVfb2N0YWwoY2hhciAqKnNyYywgY2hhciAqKmRzdCkKK3sKKwljaGFyICpwID0gKmRzdCwgKnEgPSAqc3JjOworCXU4IG51bTsKKworCWlmIChpc29kaWdpdCgqcSkgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOworCisJbnVtID0gKCpxKyspICYgNzsKKwl3aGlsZSAobnVtIDwgMzIgJiYgaXNvZGlnaXQoKnEpICYmIChxIC0gKnNyYyA8IDMpKSB7CisJCW51bSA8PD0gMzsKKwkJbnVtICs9ICgqcSsrKSAmIDc7CisJfQorCSpwID0gbnVtOworCSpkc3QgKz0gMTsKKwkqc3JjID0gcTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdW5lc2NhcGVfaGV4KGNoYXIgKipzcmMsIGNoYXIgKipkc3QpCit7CisJY2hhciAqcCA9ICpkc3QsICpxID0gKnNyYzsKKwlpbnQgZGlnaXQ7CisJdTggbnVtOworCisJaWYgKCpxKysgIT0gJ3gnKQorCQlyZXR1cm4gZmFsc2U7CisKKwludW0gPSBkaWdpdCA9IGhleF90b19iaW4oKnErKyk7CisJaWYgKGRpZ2l0IDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJZGlnaXQgPSBoZXhfdG9fYmluKCpxKTsKKwlpZiAoZGlnaXQgPj0gMCkgeworCQlxKys7CisJCW51bSA9IChudW0gPDwgNCkgfCBkaWdpdDsKKwl9CisJKnAgPSBudW07CisJKmRzdCArPSAxOworCSpzcmMgPSBxOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCB1bmVzY2FwZV9zcGVjaWFsKGNoYXIgKipzcmMsIGNoYXIgKipkc3QpCit7CisJY2hhciAqcCA9ICpkc3QsICpxID0gKnNyYzsKKworCXN3aXRjaCAoKnEpIHsKKwljYXNlICdcIic6CisJCSpwID0gJ1wiJzsKKwkJYnJlYWs7CisJY2FzZSAnXFwnOgorCQkqcCA9ICdcXCc7CisJCWJyZWFrOworCWNhc2UgJ2EnOgorCQkqcCA9ICdcYSc7CisJCWJyZWFrOworCWNhc2UgJ2UnOgorCQkqcCA9ICdcZSc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisJKmRzdCArPSAxOworCSpzcmMgKz0gMTsKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBzdHJpbmdfdW5lc2NhcGUgLSB1bnF1b3RlIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZworICogQHNyYzoJc291cmNlIGJ1ZmZlciAoZXNjYXBlZCkKKyAqIEBkc3Q6CWRlc3RpbmF0aW9uIGJ1ZmZlciAodW5lc2NhcGVkKQorICogQHNpemU6CXNpemUgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciAoMCB0byB1bmxpbWl0KQorICogQGZsYWdzOgljb21iaW5hdGlvbiBvZiB0aGUgZmxhZ3MgKGJpdHdpc2UgT1IpOgorICoJJVVORVNDQVBFX1NQQUNFOgorICoJCSdcZicgLSBmb3JtIGZlZWQKKyAqCQknXG4nIC0gbmV3IGxpbmUKKyAqCQknXHInIC0gY2FycmlhZ2UgcmV0dXJuCisgKgkJJ1x0JyAtIGhvcml6b250YWwgdGFiCisgKgkJJ1x2JyAtIHZlcnRpY2FsIHRhYgorICoJJVVORVNDQVBFX09DVEFMOgorICoJCSdcTk5OJyAtIGJ5dGUgd2l0aCBvY3RhbCB2YWx1ZSBOTk4gKDEgdG8gMyBkaWdpdHMpCisgKgklVU5FU0NBUEVfSEVYOgorICoJCSdceEhIJyAtIGJ5dGUgd2l0aCBoZXhhZGVjaW1hbCB2YWx1ZSBISCAoMSB0byAyIGRpZ2l0cykKKyAqCSVVTkVTQ0FQRV9TUEVDSUFMOgorICoJCSdcIicgLSBkb3VibGUgcXVvdGUKKyAqCQknXFwnIC0gYmFja3NsYXNoCisgKgkJJ1xhJyAtIGFsZXJ0IChCRUwpCisgKgkJJ1xlJyAtIGVzY2FwZQorICoJJVVORVNDQVBFX0FOWToKKyAqCQlhbGwgcHJldmlvdXMgdG9nZXRoZXIKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoZSBmdW5jdGlvbiB1bnF1b3RlcyBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBzdHJpbmcuCisgKgorICogQmVjYXVzZSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgYXMgb3IgbGVzcyB0aGFuIHRoZSBzaXplIG9mCisgKiB0aGUgaW5wdXQsIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXkgYmUgcGVyZm9ybWVkIGluIHBsYWNlLgorICoKKyAqIENhbGxlciBtdXN0IHByb3ZpZGUgdmFsaWQgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBwb2ludGVycy4gQmUgYXdhcmUgdGhhdAorICogZGVzdGluYXRpb24gYnVmZmVyIHdpbGwgYWx3YXlzIGJlIE5VTEwtdGVybWluYXRlZC4gU291cmNlIHN0cmluZyBtdXN0IGJlCisgKiBOVUxMLXRlcm1pbmF0ZWQgYXMgd2VsbC4KKyAqCisgKiBSZXR1cm46CisgKiBUaGUgYW1vdW50IG9mIHRoZSBjaGFyYWN0ZXJzIHByb2Nlc3NlZCB0byB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGV4Y2x1ZGluZworICogdHJhaWxpbmcgJ1wwJyBpcyByZXR1cm5lZC4KKyAqLworaW50IHN0cmluZ191bmVzY2FwZShjaGFyICpzcmMsIGNoYXIgKmRzdCwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwljaGFyICpvdXQgPSBkc3Q7CisKKwl3aGlsZSAoKnNyYyAmJiAtLXNpemUpIHsKKwkJaWYgKHNyY1swXSA9PSAnXFwnICYmIHNyY1sxXSAhPSAnXDAnICYmIHNpemUgPiAxKSB7CisJCQlzcmMrKzsKKwkJCXNpemUtLTsKKworCQkJaWYgKGZsYWdzICYgVU5FU0NBUEVfU1BBQ0UgJiYKKwkJCQkJdW5lc2NhcGVfc3BhY2UoJnNyYywgJm91dCkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChmbGFncyAmIFVORVNDQVBFX09DVEFMICYmCisJCQkJCXVuZXNjYXBlX29jdGFsKCZzcmMsICZvdXQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmxhZ3MgJiBVTkVTQ0FQRV9IRVggJiYKKwkJCQkJdW5lc2NhcGVfaGV4KCZzcmMsICZvdXQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmxhZ3MgJiBVTkVTQ0FQRV9TUEVDSUFMICYmCisJCQkJCXVuZXNjYXBlX3NwZWNpYWwoJnNyYywgJm91dCkpCisJCQkJY29udGludWU7CisKKwkJCSpvdXQrKyA9ICdcXCc7CisJCX0KKwkJKm91dCsrID0gKnNyYysrOworCX0KKwkqb3V0ID0gJ1wwJzsKKworCXJldHVybiBvdXQgLSBkc3Q7Cit9CitFWFBPUlRfU1lNQk9MKHN0cmluZ191bmVzY2FwZSk7CisKK3N0YXRpYyBib29sIGVzY2FwZV9wYXNzdGhyb3VnaCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIGNoYXIgKmVuZCkKK3sKKwljaGFyICpvdXQgPSAqZHN0OworCisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9IGM7CisJKmRzdCA9IG91dCArIDE7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIGVzY2FwZV9zcGFjZSh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIGNoYXIgKmVuZCkKK3sKKwljaGFyICpvdXQgPSAqZHN0OworCXVuc2lnbmVkIGNoYXIgdG87CisKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICdcbic6CisJCXRvID0gJ24nOworCQlicmVhazsKKwljYXNlICdccic6CisJCXRvID0gJ3InOworCQlicmVhazsKKwljYXNlICdcdCc6CisJCXRvID0gJ3QnOworCQlicmVhazsKKwljYXNlICdcdic6CisJCXRvID0gJ3YnOworCQlicmVhazsKKwljYXNlICdcZic6CisJCXRvID0gJ2YnOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9ICdcXCc7CisJKytvdXQ7CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9IHRvOworCSsrb3V0OworCisJKmRzdCA9IG91dDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZXNjYXBlX3NwZWNpYWwodW5zaWduZWQgY2hhciBjLCBjaGFyICoqZHN0LCBjaGFyICplbmQpCit7CisJY2hhciAqb3V0ID0gKmRzdDsKKwl1bnNpZ25lZCBjaGFyIHRvOworCisJc3dpdGNoIChjKSB7CisJY2FzZSAnXFwnOgorCQl0byA9ICdcXCc7CisJCWJyZWFrOworCWNhc2UgJ1xhJzoKKwkJdG8gPSAnYSc7CisJCWJyZWFrOworCWNhc2UgJ1xlJzoKKwkJdG8gPSAnZSc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gJ1xcJzsKKwkrK291dDsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gdG87CisJKytvdXQ7CisKKwkqZHN0ID0gb3V0OworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBlc2NhcGVfbnVsbCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIGNoYXIgKmVuZCkKK3sKKwljaGFyICpvdXQgPSAqZHN0OworCisJaWYgKGMpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAnXFwnOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAnMCc7CisJKytvdXQ7CisKKwkqZHN0ID0gb3V0OworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgYm9vbCBlc2NhcGVfb2N0YWwodW5zaWduZWQgY2hhciBjLCBjaGFyICoqZHN0LCBjaGFyICplbmQpCit7CisJY2hhciAqb3V0ID0gKmRzdDsKKworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAnXFwnOworCSsrb3V0OworCWlmIChvdXQgPCBlbmQpCisJCSpvdXQgPSAoKGMgPj4gNikgJiAweDA3KSArICcwJzsKKwkrK291dDsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gKChjID4+IDMpICYgMHgwNykgKyAnMCc7CisJKytvdXQ7CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9ICgoYyA+PiAwKSAmIDB4MDcpICsgJzAnOworCSsrb3V0OworCisJKmRzdCA9IG91dDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZXNjYXBlX2hleCh1bnNpZ25lZCBjaGFyIGMsIGNoYXIgKipkc3QsIGNoYXIgKmVuZCkKK3sKKwljaGFyICpvdXQgPSAqZHN0OworCisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9ICdcXCc7CisJKytvdXQ7CisJaWYgKG91dCA8IGVuZCkKKwkJKm91dCA9ICd4JzsKKwkrK291dDsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gaGV4X2FzY19oaShjKTsKKwkrK291dDsKKwlpZiAob3V0IDwgZW5kKQorCQkqb3V0ID0gaGV4X2FzY19sbyhjKTsKKwkrK291dDsKKworCSpkc3QgPSBvdXQ7CisJcmV0dXJuIHRydWU7Cit9CisKKy8qKgorICogc3RyaW5nX2VzY2FwZV9tZW0gLSBxdW90ZSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyCisgKiBAc3JjOglzb3VyY2UgYnVmZmVyICh1bmVzY2FwZWQpCisgKiBAaXN6Oglzb3VyY2UgYnVmZmVyIHNpemUKKyAqIEBkc3Q6CWRlc3RpbmF0aW9uIGJ1ZmZlciAoZXNjYXBlZCkKKyAqIEBvc3o6CWRlc3RpbmF0aW9uIGJ1ZmZlciBzaXplCisgKiBAZmxhZ3M6CWNvbWJpbmF0aW9uIG9mIHRoZSBmbGFncyAoYml0d2lzZSBPUik6CisgKgklRVNDQVBFX1NQQUNFOiAoc3BlY2lhbCB3aGl0ZSBzcGFjZSwgbm90IHNwYWNlIGl0c2VsZikKKyAqCQknXGYnIC0gZm9ybSBmZWVkCisgKgkJJ1xuJyAtIG5ldyBsaW5lCisgKgkJJ1xyJyAtIGNhcnJpYWdlIHJldHVybgorICoJCSdcdCcgLSBob3Jpem9udGFsIHRhYgorICoJCSdcdicgLSB2ZXJ0aWNhbCB0YWIKKyAqCSVFU0NBUEVfU1BFQ0lBTDoKKyAqCQknXFwnIC0gYmFja3NsYXNoCisgKgkJJ1xhJyAtIGFsZXJ0IChCRUwpCisgKgkJJ1xlJyAtIGVzY2FwZQorICoJJUVTQ0FQRV9OVUxMOgorICoJCSdcMCcgLSBudWxsCisgKgklRVNDQVBFX09DVEFMOgorICoJCSdcTk5OJyAtIGJ5dGUgd2l0aCBvY3RhbCB2YWx1ZSBOTk4gKDMgZGlnaXRzKQorICoJJUVTQ0FQRV9BTlk6CisgKgkJYWxsIHByZXZpb3VzIHRvZ2V0aGVyCisgKgklRVNDQVBFX05QOgorICoJCWVzY2FwZSBvbmx5IG5vbi1wcmludGFibGUgY2hhcmFjdGVycyAoY2hlY2tlZCBieSBpc3ByaW50KQorICoJJUVTQ0FQRV9BTllfTlA6CisgKgkJYWxsIHByZXZpb3VzIHRvZ2V0aGVyCisgKgklRVNDQVBFX0hFWDoKKyAqCQknXHhISCcgLSBieXRlIHdpdGggaGV4YWRlY2ltYWwgdmFsdWUgSEggKDIgZGlnaXRzKQorICogQG9ubHk6CU5VTEwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBjaGFyYWN0ZXJzIHVzZWQgdG8gbGltaXQKKyAqCQl0aGUgc2VsZWN0ZWQgZXNjYXBlIGNsYXNzLiBJZiBjaGFyYWN0ZXJzIGFyZSBpbmNsdWRlZCBpbiBAb25seQorICoJCXRoYXQgd291bGQgbm90IG5vcm1hbGx5IGJlIGVzY2FwZWQgYnkgdGhlIGNsYXNzZXMgc2VsZWN0ZWQKKyAqCQlpbiBAZmxhZ3MsIHRoZXkgd2lsbCBiZSBjb3BpZWQgdG8gQGRzdCB1bmVzY2FwZWQuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGUgcHJvY2VzcyBvZiBlc2NhcGluZyBieXRlIGJ1ZmZlciBpbmNsdWRlcyBzZXZlcmFsIHBhcnRzLiBUaGV5IGFyZSBhcHBsaWVkCisgKiBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlLgorICoJMS4gVGhlIGNoYXJhY3RlciBpcyBtYXRjaGVkIHRvIHRoZSBwcmludGFibGUgY2xhc3MsIGlmIGFza2VkLCBhbmQgaW4KKyAqCSAgIGNhc2Ugb2YgbWF0Y2ggaXQgcGFzc2VzIHRocm91Z2ggdG8gdGhlIG91dHB1dC4KKyAqCTIuIFRoZSBjaGFyYWN0ZXIgaXMgbm90IG1hdGNoZWQgdG8gdGhlIG9uZSBmcm9tIEBvbmx5IHN0cmluZyBhbmQgdGh1cworICoJICAgbXVzdCBnbyBhcy1pcyB0byB0aGUgb3V0cHV0LgorICoJMy4gVGhlIGNoYXJhY3RlciBpcyBjaGVja2VkIGlmIGl0IGZhbGxzIGludG8gdGhlIGNsYXNzIGdpdmVuIGJ5IEBmbGFncy4KKyAqCSAgICVFU0NBUEVfT0NUQUwgYW5kICVFU0NBUEVfSEVYIGFyZSBnb2luZyBsYXN0IHNpbmNlIHRoZXkgY292ZXIgYW55CisgKgkgICBjaGFyYWN0ZXIuIE5vdGUgdGhhdCB0aGV5IGFjdHVhbGx5IGNhbid0IGdvIHRvZ2V0aGVyLCBvdGhlcndpc2UKKyAqCSAgICVFU0NBUEVfSEVYIHdpbGwgYmUgaWdub3JlZC4KKyAqCisgKiBDYWxsZXIgbXVzdCBwcm92aWRlIHZhbGlkIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9pbnRlcnMuIEJlIGF3YXJlIHRoYXQKKyAqIGRlc3RpbmF0aW9uIGJ1ZmZlciB3aWxsIG5vdCBiZSBOVUxMLXRlcm1pbmF0ZWQsIHRodXMgY2FsbGVyIGhhdmUgdG8gYXBwZW5kCisgKiBpdCBpZiBuZWVkcy4KKyAqCisgKiBSZXR1cm46CisgKiBUaGUgdG90YWwgc2l6ZSBvZiB0aGUgZXNjYXBlZCBvdXRwdXQgdGhhdCB3b3VsZCBiZSBnZW5lcmF0ZWQgZm9yCisgKiB0aGUgZ2l2ZW4gaW5wdXQgYW5kIGZsYWdzLiBUbyBjaGVjayB3aGV0aGVyIHRoZSBvdXRwdXQgd2FzCisgKiB0cnVuY2F0ZWQsIGNvbXBhcmUgdGhlIHJldHVybiB2YWx1ZSB0byBvc3ouIFRoZXJlIGlzIHJvb20gbGVmdCBpbgorICogZHN0IGZvciBhICdcMCcgdGVybWluYXRvciBpZiBhbmQgb25seSBpZiByZXQgPCBvc3ouCisgKi8KK2ludCBzdHJpbmdfZXNjYXBlX21lbShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBpc3osIGNoYXIgKmRzdCwgc2l6ZV90IG9zeiwKKwkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBjaGFyICpvbmx5KQoreworCWNoYXIgKnAgPSBkc3Q7CisJY2hhciAqZW5kID0gcCArIG9zejsKKwlib29sIGlzX2RpY3QgPSBvbmx5ICYmICpvbmx5OworCisJd2hpbGUgKGlzei0tKSB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpzcmMrKzsKKworCQkvKgorCQkgKiBBcHBseSBydWxlcyBpbiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOgorCQkgKgktIHRoZSBjaGFyYWN0ZXIgaXMgcHJpbnRhYmxlLCB3aGVuIEBmbGFncyBoYXMKKwkJICoJICAlRVNDQVBFX05QIGJpdCBzZXQKKwkJICoJLSB0aGUgQG9ubHkgc3RyaW5nIGlzIHN1cHBsaWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGEKKwkJICoJICBjaGFyYWN0ZXIgdW5kZXIgcXVlc3Rpb24KKwkJICoJLSB0aGUgY2hhcmFjdGVyIGRvZXNuJ3QgZmFsbCBpbnRvIGEgY2xhc3Mgb2Ygc3ltYm9scworCQkgKgkgIGRlZmluZWQgYnkgZ2l2ZW4gQGZsYWdzCisJCSAqIEluIHRoZXNlIGNhc2VzIHdlIGp1c3QgcGFzcyB0aHJvdWdoIGEgY2hhcmFjdGVyIHRvIHRoZQorCQkgKiBvdXRwdXQgYnVmZmVyLgorCQkgKi8KKwkJaWYgKChmbGFncyAmIEVTQ0FQRV9OUCAmJiBpc3ByaW50KGMpKSB8fAorCQkgICAgKGlzX2RpY3QgJiYgIXN0cmNocihvbmx5LCBjKSkpIHsKKwkJCS8qIGRvIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChmbGFncyAmIEVTQ0FQRV9TUEFDRSAmJiBlc2NhcGVfc3BhY2UoYywgJnAsIGVuZCkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChmbGFncyAmIEVTQ0FQRV9TUEVDSUFMICYmIGVzY2FwZV9zcGVjaWFsKGMsICZwLCBlbmQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmxhZ3MgJiBFU0NBUEVfTlVMTCAmJiBlc2NhcGVfbnVsbChjLCAmcCwgZW5kKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogRVNDQVBFX09DVEFMIGFuZCBFU0NBUEVfSEVYIGFsd2F5cyBnbyBsYXN0ICovCisJCQlpZiAoZmxhZ3MgJiBFU0NBUEVfT0NUQUwgJiYgZXNjYXBlX29jdGFsKGMsICZwLCBlbmQpKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoZmxhZ3MgJiBFU0NBUEVfSEVYICYmIGVzY2FwZV9oZXgoYywgJnAsIGVuZCkpCisJCQkJY29udGludWU7CisJCX0KKworCQllc2NhcGVfcGFzc3Rocm91Z2goYywgJnAsIGVuZCk7CisJfQorCisJcmV0dXJuIHAgLSBkc3Q7Cit9CitFWFBPUlRfU1lNQk9MKHN0cmluZ19lc2NhcGVfbWVtKTsKKworLyoKKyAqIFJldHVybiBhbiBhbGxvY2F0ZWQgc3RyaW5nIHRoYXQgaGFzIGJlZW4gZXNjYXBlZCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMKKyAqIGFuZCBkb3VibGUgcXVvdGVzLCBtYWtpbmcgaXQgc2FmZSB0byBsb2cgaW4gcXVvdGVzLgorICovCitjaGFyICprc3RyZHVwX3F1b3RhYmxlKGNvbnN0IGNoYXIgKnNyYywgZ2ZwX3QgZ2ZwKQoreworCXNpemVfdCBzbGVuLCBkbGVuOworCWNoYXIgKmRzdDsKKwljb25zdCBpbnQgZmxhZ3MgPSBFU0NBUEVfSEVYOworCWNvbnN0IGNoYXIgZXNjW10gPSAiXGZcblxyXHRcdlxhXGVcXFwiIjsKKworCWlmICghc3JjKQorCQlyZXR1cm4gTlVMTDsKKwlzbGVuID0gc3RybGVuKHNyYyk7CisKKwlkbGVuID0gc3RyaW5nX2VzY2FwZV9tZW0oc3JjLCBzbGVuLCBOVUxMLCAwLCBmbGFncywgZXNjKTsKKwlkc3QgPSBrbWFsbG9jKGRsZW4gKyAxLCBnZnApOworCWlmICghZHN0KQorCQlyZXR1cm4gTlVMTDsKKworCVdBUk5fT04oc3RyaW5nX2VzY2FwZV9tZW0oc3JjLCBzbGVuLCBkc3QsIGRsZW4sIGZsYWdzLCBlc2MpICE9IGRsZW4pOworCWRzdFtkbGVuXSA9ICdcMCc7CisKKwlyZXR1cm4gZHN0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3N0cmR1cF9xdW90YWJsZSk7CisKKy8qCisgKiBSZXR1cm5zIGFsbG9jYXRlZCBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgcHJvY2VzcworICogY29tbWFuZCBsaW5lLCB3aXRoIGludGVyLWFyZ3VtZW50IE5VTExzIHJlcGxhY2VkIHdpdGggc3BhY2VzLAorICogYW5kIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyBlc2NhcGVkLgorICovCitjaGFyICprc3RyZHVwX3F1b3RhYmxlX2NtZGxpbmUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBnZnBfdCBnZnApCit7CisJY2hhciAqYnVmZmVyLCAqcXVvdGVkOworCWludCBpLCByZXM7CisKKwlidWZmZXIgPSBrbWFsbG9jKFBBR0VfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiBOVUxMOworCisJcmVzID0gZ2V0X2NtZGxpbmUodGFzaywgYnVmZmVyLCBQQUdFX1NJWkUgLSAxKTsKKwlidWZmZXJbcmVzXSA9ICdcMCc7CisKKwkvKiBDb2xsYXBzZSB0cmFpbGluZyBOVUxMcywgbGVhdmUgcmVzIHBvaW50aW5nIHRvIGxhc3Qgbm9uLU5VTEwuICovCisJd2hpbGUgKC0tcmVzID49IDAgJiYgYnVmZmVyW3Jlc10gPT0gJ1wwJykKKwkJOworCisJLyogUmVwbGFjZSBpbnRlci1hcmd1bWVudCBOVUxMcy4gKi8KKwlmb3IgKGkgPSAwOyBpIDw9IHJlczsgaSsrKQorCQlpZiAoYnVmZmVyW2ldID09ICdcMCcpCisJCQlidWZmZXJbaV0gPSAnICc7CisKKwkvKiBNYWtlIHN1cmUgcmVzdWx0IGlzIHByaW50YWJsZS4gKi8KKwlxdW90ZWQgPSBrc3RyZHVwX3F1b3RhYmxlKGJ1ZmZlciwgZ2ZwKTsKKwlrZnJlZShidWZmZXIpOworCXJldHVybiBxdW90ZWQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChrc3RyZHVwX3F1b3RhYmxlX2NtZGxpbmUpOworCisvKgorICogUmV0dXJucyBhbGxvY2F0ZWQgTlVMTC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHBhdGhuYW1lLAorICogd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMgZXNjYXBlZCwgYWJsZSB0byBiZSBzYWZlbHkgbG9nZ2VkLiBJZgorICogdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBsZWFkaW5nIGNoYXJhY3RlciB3aWxsIGJlICI8Ii4KKyAqLworY2hhciAqa3N0cmR1cF9xdW90YWJsZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBnZnBfdCBnZnApCit7CisJY2hhciAqdGVtcCwgKnBhdGhuYW1lOworCisJaWYgKCFmaWxlKQorCQlyZXR1cm4ga3N0cmR1cCgiPHVua25vd24+IiwgZ2ZwKTsKKworCS8qIFdlIGFkZCAxMSBzcGFjZXMgZm9yICcgKGRlbGV0ZWQpJyB0byBiZSBhcHBlbmRlZCAqLworCXRlbXAgPSBrbWFsbG9jKFBBVEhfTUFYICsgMTEsIEdGUF9LRVJORUwpOworCWlmICghdGVtcCkKKwkJcmV0dXJuIGtzdHJkdXAoIjxub19tZW1vcnk+IiwgZ2ZwKTsKKworCXBhdGhuYW1lID0gZmlsZV9wYXRoKGZpbGUsIHRlbXAsIFBBVEhfTUFYICsgMTEpOworCWlmIChJU19FUlIocGF0aG5hbWUpKQorCQlwYXRobmFtZSA9IGtzdHJkdXAoIjx0b29fbG9uZz4iLCBnZnApOworCWVsc2UKKwkJcGF0aG5hbWUgPSBrc3RyZHVwX3F1b3RhYmxlKHBhdGhuYW1lLCBnZnApOworCisJa2ZyZWUodGVtcCk7CisJcmV0dXJuIHBhdGhuYW1lOworfQorRVhQT1JUX1NZTUJPTF9HUEwoa3N0cmR1cF9xdW90YWJsZV9maWxlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N0cm5jcHlfZnJvbV91c2VyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdHJuY3B5X2Zyb21fdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWIxZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdHJuY3B5X2Zyb21fdXNlci5jCkBAIC0wLDAgKzEsMTI2IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgva2FzYW4tY2hlY2tzLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkX2luZm8uaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKworI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KKyNpbmNsdWRlIDxhc20vd29yZC1hdC1hLXRpbWUuaD4KKworI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCisjZGVmaW5lIElTX1VOQUxJR05FRChzcmMsIGRzdCkJMAorI2Vsc2UKKyNkZWZpbmUgSVNfVU5BTElHTkVEKHNyYywgZHN0KQlcCisJKCgobG9uZykgZHN0IHwgKGxvbmcpIHNyYykgJiAoc2l6ZW9mKGxvbmcpIC0gMSkpCisjZW5kaWYKKworLyoKKyAqIERvIGEgc3RybmNweSwgcmV0dXJuIGxlbmd0aCBvZiBzdHJpbmcgd2l0aG91dCBmaW5hbCAnXDAnLgorICogJ2NvdW50JyBpcyB0aGUgdXNlci1zdXBwbGllZCBjb3VudCAocmV0dXJuICdjb3VudCcgaWYgd2UKKyAqIGhpdCBpdCksICdtYXgnIGlzIHRoZSBhZGRyZXNzIHNwYWNlIG1heGltdW0gKGFuZCB3ZSByZXR1cm4KKyAqIC1FRkFVTFQgaWYgd2UgaGl0IGl0KS4KKyAqLworc3RhdGljIGlubGluZSBsb25nIGRvX3N0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywKKwkJCQkJdW5zaWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyBtYXgpCit7CisJY29uc3Qgc3RydWN0IHdvcmRfYXRfYV90aW1lIGNvbnN0YW50cyA9IFdPUkRfQVRfQV9USU1FX0NPTlNUQU5UUzsKKwl1bnNpZ25lZCBsb25nIHJlcyA9IDA7CisKKwlpZiAoSVNfVU5BTElHTkVEKHNyYywgZHN0KSkKKwkJZ290byBieXRlX2F0X2FfdGltZTsKKworCXdoaWxlIChtYXggPj0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSB7CisJCXVuc2lnbmVkIGxvbmcgYywgZGF0YTsKKworCQkvKiBGYWxsIGJhY2sgdG8gYnl0ZS1hdC1hLXRpbWUgaWYgd2UgZ2V0IGEgcGFnZSBmYXVsdCAqLworCQl1bnNhZmVfZ2V0X3VzZXIoYywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopKHNyYytyZXMpLCBieXRlX2F0X2FfdGltZSk7CisKKwkJKih1bnNpZ25lZCBsb25nICopKGRzdCtyZXMpID0gYzsKKwkJaWYgKGhhc196ZXJvKGMsICZkYXRhLCAmY29uc3RhbnRzKSkgeworCQkJZGF0YSA9IHByZXBfemVyb19tYXNrKGMsIGRhdGEsICZjb25zdGFudHMpOworCQkJZGF0YSA9IGNyZWF0ZV96ZXJvX21hc2soZGF0YSk7CisJCQlyZXR1cm4gcmVzICsgZmluZF96ZXJvKGRhdGEpOworCQl9CisJCXJlcyArPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCW1heCAtPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJfQorCitieXRlX2F0X2FfdGltZToKKwl3aGlsZSAobWF4KSB7CisJCWNoYXIgYzsKKworCQl1bnNhZmVfZ2V0X3VzZXIoYyxzcmMrcmVzLCBlZmF1bHQpOworCQlkc3RbcmVzXSA9IGM7CisJCWlmICghYykKKwkJCXJldHVybiByZXM7CisJCXJlcysrOworCQltYXgtLTsKKwl9CisKKwkvKgorCSAqIFVoaHVoLiBXZSBoaXQgJ21heCcuIEJ1dCB3YXMgdGhhdCB0aGUgdXNlci1zcGVjaWZpZWQgbWF4aW11bQorCSAqIHRvbz8gSWYgc28sIHRoYXQncyBvayAtIHdlIGdvdCBhcyBtdWNoIGFzIHRoZSB1c2VyIGFza2VkIGZvci4KKwkgKi8KKwlpZiAocmVzID49IGNvdW50KQorCQlyZXR1cm4gcmVzOworCisJLyoKKwkgKiBOb3BlOiB3ZSBoaXQgdGhlIGFkZHJlc3Mgc3BhY2UgbGltaXQsIGFuZCB3ZSBzdGlsbCBoYWQgbW9yZQorCSAqIGNoYXJhY3RlcnMgdGhlIGNhbGxlciB3b3VsZCBoYXZlIHdhbnRlZC4gVGhhdCdzIGFuIEVGQVVMVC4KKwkgKi8KK2VmYXVsdDoKKwlyZXR1cm4gLUVGQVVMVDsKK30KKworLyoqCisgKiBzdHJuY3B5X2Zyb21fdXNlcjogLSBDb3B5IGEgTlVMIHRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlLgorICogQGRzdDogICBEZXN0aW5hdGlvbiBhZGRyZXNzLCBpbiBrZXJuZWwgc3BhY2UuICBUaGlzIGJ1ZmZlciBtdXN0IGJlIGF0CisgKiAgICAgICAgIGxlYXN0IEBjb3VudCBieXRlcyBsb25nLgorICogQHNyYzogICBTb3VyY2UgYWRkcmVzcywgaW4gdXNlciBzcGFjZS4KKyAqIEBjb3VudDogTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBOVUwuCisgKgorICogQ29waWVzIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGZyb20gdXNlcnNwYWNlIHRvIGtlcm5lbCBzcGFjZS4KKyAqCisgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyAobm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcKKyAqIE5VTCkuCisgKgorICogSWYgYWNjZXNzIHRvIHVzZXJzcGFjZSBmYWlscywgcmV0dXJucyAtRUZBVUxUIChzb21lIGRhdGEgbWF5IGhhdmUgYmVlbgorICogY29waWVkKS4KKyAqCisgKiBJZiBAY291bnQgaXMgc21hbGxlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgY29waWVzIEBjb3VudCBieXRlcworICogYW5kIHJldHVybnMgQGNvdW50LgorICovCitsb25nIHN0cm5jcHlfZnJvbV91c2VyKGNoYXIgKmRzdCwgY29uc3QgY2hhciBfX3VzZXIgKnNyYywgbG9uZyBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIG1heF9hZGRyLCBzcmNfYWRkcjsKKworCWlmICh1bmxpa2VseShjb3VudCA8PSAwKSkKKwkJcmV0dXJuIDA7CisKKwltYXhfYWRkciA9IHVzZXJfYWRkcl9tYXgoKTsKKwlzcmNfYWRkciA9ICh1bnNpZ25lZCBsb25nKXNyYzsKKwlpZiAobGlrZWx5KHNyY19hZGRyIDwgbWF4X2FkZHIpKSB7CisJCXVuc2lnbmVkIGxvbmcgbWF4ID0gbWF4X2FkZHIgLSBzcmNfYWRkcjsKKwkJbG9uZyByZXR2YWw7CisKKwkJLyoKKwkJICogVHJ1bmNhdGUgJ21heCcgdG8gdGhlIHVzZXItc3BlY2lmaWVkIGxpbWl0LCBzbyB0aGF0CisJCSAqIHdlIG9ubHkgaGF2ZSBvbmUgbGltaXQgd2UgbmVlZCB0byBjaGVjayBpbiB0aGUgbG9vcAorCQkgKi8KKwkJaWYgKG1heCA+IGNvdW50KQorCQkJbWF4ID0gY291bnQ7CisKKwkJa2FzYW5fY2hlY2tfd3JpdGUoZHN0LCBjb3VudCk7CisJCWNoZWNrX29iamVjdF9zaXplKGRzdCwgY291bnQsIGZhbHNlKTsKKwkJaWYgKHVzZXJfYWNjZXNzX2JlZ2luKFZFUklGWV9SRUFELCBzcmMsIG1heCkpIHsKKwkJCXJldHZhbCA9IGRvX3N0cm5jcHlfZnJvbV91c2VyKGRzdCwgc3JjLCBjb3VudCwgbWF4KTsKKwkJCXVzZXJfYWNjZXNzX2VuZCgpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlyZXR1cm4gLUVGQVVMVDsKK30KK0VYUE9SVF9TWU1CT0woc3RybmNweV9mcm9tX3VzZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3Rybmxlbl91c2VyLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zdHJubGVuX3VzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmY3YzA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3Rybmxlbl91c2VyLmMKQEAgLTAsMCArMSwxMjUgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL3dvcmQtYXQtYS10aW1lLmg+CisKKy8qIFNldCBiaXRzIGluIHRoZSBmaXJzdCAnbicgYnl0ZXMgd2hlbiBsb2FkZWQgZnJvbSBtZW1vcnkgKi8KKyNpZmRlZiBfX0xJVFRMRV9FTkRJQU4KKyMgIGRlZmluZSBhbGlnbmVkX2J5dGVfbWFzayhuKSAoKDF1bCA8PCA4KihuKSktMSkKKyNlbHNlCisjICBkZWZpbmUgYWxpZ25lZF9ieXRlX21hc2sobikgKH4weGZmdWwgPDwgKEJJVFNfUEVSX0xPTkcgLSA4IC0gOCoobikpKQorI2VuZGlmCisKKy8qCisgKiBEbyBhIHN0cm5sZW4sIHJldHVybiBsZW5ndGggb2Ygc3RyaW5nICp3aXRoKiBmaW5hbCAnXDAnLgorICogJ2NvdW50JyBpcyB0aGUgdXNlci1zdXBwbGllZCBjb3VudCwgd2hpbGUgJ21heCcgaXMgdGhlCisgKiBhZGRyZXNzIHNwYWNlIG1heGltdW0uCisgKgorICogUmV0dXJuIDAgZm9yIGV4Y2VwdGlvbnMgKHdoaWNoIGluY2x1ZGVzIGhpdHRpbmcgdGhlIGFkZHJlc3MKKyAqIHNwYWNlIG1heGltdW0pLCBvciAnY291bnQrMScgaWYgaGl0dGluZyB0aGUgdXNlci1zdXBwbGllZAorICogbWF4aW11bSBjb3VudC4KKyAqCisgKiBOT1RFISBXZSBjYW4gc29tZXRpbWVzIG92ZXJzaG9vdCB0aGUgdXNlci1zdXBwbGllZCBtYXhpbXVtCisgKiBpZiBpdCBmaXRzIGluIGEgYWxpZ25lZCAnbG9uZycuIFRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2sKKyAqIHRoZSByZXR1cm4gdmFsdWUgYWdhaW5zdCAiPiBtYXgiLgorICovCitzdGF0aWMgaW5saW5lIGxvbmcgZG9fc3Rybmxlbl91c2VyKGNvbnN0IGNoYXIgX191c2VyICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQsIHVuc2lnbmVkIGxvbmcgbWF4KQoreworCWNvbnN0IHN0cnVjdCB3b3JkX2F0X2FfdGltZSBjb25zdGFudHMgPSBXT1JEX0FUX0FfVElNRV9DT05TVEFOVFM7CisJdW5zaWduZWQgbG9uZyBhbGlnbiwgcmVzID0gMDsKKwl1bnNpZ25lZCBsb25nIGM7CisKKwkvKgorCSAqIERvIGV2ZXJ5dGhpbmcgYWxpZ25lZC4gQnV0IHRoYXQgbWVhbnMgdGhhdCB3ZQorCSAqIG5lZWQgdG8gYWxzbyBleHBhbmQgdGhlIG1heGltdW0uLgorCSAqLworCWFsaWduID0gKHNpemVvZih1bnNpZ25lZCBsb25nKSAtIDEpICYgKHVuc2lnbmVkIGxvbmcpc3JjOworCXNyYyAtPSBhbGlnbjsKKwltYXggKz0gYWxpZ247CisKKwl1bnNhZmVfZ2V0X3VzZXIoYywgKHVuc2lnbmVkIGxvbmcgX191c2VyICopc3JjLCBlZmF1bHQpOworCWMgfD0gYWxpZ25lZF9ieXRlX21hc2soYWxpZ24pOworCisJZm9yICg7OykgeworCQl1bnNpZ25lZCBsb25nIGRhdGE7CisJCWlmIChoYXNfemVybyhjLCAmZGF0YSwgJmNvbnN0YW50cykpIHsKKwkJCWRhdGEgPSBwcmVwX3plcm9fbWFzayhjLCBkYXRhLCAmY29uc3RhbnRzKTsKKwkJCWRhdGEgPSBjcmVhdGVfemVyb19tYXNrKGRhdGEpOworCQkJcmV0dXJuIHJlcyArIGZpbmRfemVybyhkYXRhKSArIDEgLSBhbGlnbjsKKwkJfQorCQlyZXMgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkvKiBXZSBhbHJlYWR5IGhhbmRsZWQgJ3Vuc2lnbmVkIGxvbmcnIGJ5dGVzLiBEaWQgd2UgZG8gaXQgYWxsID8gKi8KKwkJaWYgKHVubGlrZWx5KG1heCA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpKQorCQkJYnJlYWs7CisJCW1heCAtPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCXVuc2FmZV9nZXRfdXNlcihjLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikoc3JjK3JlcyksIGVmYXVsdCk7CisJfQorCXJlcyAtPSBhbGlnbjsKKworCS8qCisJICogVWhodWguIFdlIGhpdCAnbWF4Jy4gQnV0IHdhcyB0aGF0IHRoZSB1c2VyLXNwZWNpZmllZCBtYXhpbXVtCisJICogdG9vPyBJZiBzbywgcmV0dXJuIHRoZSBtYXJrZXIgZm9yICJ0b28gbG9uZyIuCisJICovCisJaWYgKHJlcyA+PSBjb3VudCkKKwkJcmV0dXJuIGNvdW50KzE7CisKKwkvKgorCSAqIE5vcGU6IHdlIGhpdCB0aGUgYWRkcmVzcyBzcGFjZSBsaW1pdCwgYW5kIHdlIHN0aWxsIGhhZCBtb3JlCisJICogY2hhcmFjdGVycyB0aGUgY2FsbGVyIHdvdWxkIGhhdmUgd2FudGVkLiBUaGF0J3MgMC4KKwkgKi8KK2VmYXVsdDoKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzdHJubGVuX3VzZXI6IC0gR2V0IHRoZSBzaXplIG9mIGEgdXNlciBzdHJpbmcgSU5DTFVESU5HIGZpbmFsIE5VTC4KKyAqIEBzdHI6IFRoZSBzdHJpbmcgdG8gbWVhc3VyZS4KKyAqIEBjb3VudDogTWF4aW11bSBjb3VudCAoaW5jbHVkaW5nIE5VTCBjaGFyYWN0ZXIpCisgKgorICogQ29udGV4dDogVXNlciBjb250ZXh0IG9ubHkuIFRoaXMgZnVuY3Rpb24gbWF5IHNsZWVwIGlmIHBhZ2VmYXVsdHMgYXJlCisgKiAgICAgICAgICBlbmFibGVkLgorICoKKyAqIEdldCB0aGUgc2l6ZSBvZiBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyBpbiB1c2VyIHNwYWNlLgorICoKKyAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHN0cmluZyBJTkNMVURJTkcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAqIElmIHRoZSBzdHJpbmcgaXMgdG9vIGxvbmcsIHJldHVybnMgYSBudW1iZXIgbGFyZ2VyIHRoYW4gQGNvdW50LiBVc2VyCisgKiBoYXMgdG8gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBhZ2FpbnN0ICI+IGNvdW50Ii4KKyAqIE9uIGV4Y2VwdGlvbiAob3IgaW52YWxpZCBjb3VudCksIHJldHVybnMgMC4KKyAqCisgKiBOT1RFISBZb3Ugc2hvdWxkIGJhc2ljYWxseSBuZXZlciB1c2UgdGhpcyBmdW5jdGlvbi4gVGhlcmUgaXMKKyAqIGFsbW9zdCBuZXZlciBhbnkgdmFsaWQgY2FzZSBmb3IgdXNpbmcgdGhlIGxlbmd0aCBvZiBhIHVzZXIgc3BhY2UKKyAqIHN0cmluZywgc2luY2UgdGhlIHN0cmluZyBjYW4gYmUgY2hhbmdlZCBhdCBhbnkgdGltZSBieSBvdGhlcgorICogdGhyZWFkcy4gVXNlICJzdHJuY3B5X2Zyb21fdXNlcigpIiBpbnN0ZWFkIHRvIGdldCBhIHN0YWJsZSBjb3B5CisgKiBvZiB0aGUgc3RyaW5nLgorICovCitsb25nIHN0cm5sZW5fdXNlcihjb25zdCBjaGFyIF9fdXNlciAqc3RyLCBsb25nIGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgbWF4X2FkZHIsIHNyY19hZGRyOworCisJaWYgKHVubGlrZWx5KGNvdW50IDw9IDApKQorCQlyZXR1cm4gMDsKKworCW1heF9hZGRyID0gdXNlcl9hZGRyX21heCgpOworCXNyY19hZGRyID0gKHVuc2lnbmVkIGxvbmcpc3RyOworCWlmIChsaWtlbHkoc3JjX2FkZHIgPCBtYXhfYWRkcikpIHsKKwkJdW5zaWduZWQgbG9uZyBtYXggPSBtYXhfYWRkciAtIHNyY19hZGRyOworCQlsb25nIHJldHZhbDsKKworCQkvKgorCQkgKiBUcnVuY2F0ZSAnbWF4JyB0byB0aGUgdXNlci1zcGVjaWZpZWQgbGltaXQsIHNvIHRoYXQKKwkJICogd2Ugb25seSBoYXZlIG9uZSBsaW1pdCB3ZSBuZWVkIHRvIGNoZWNrIGluIHRoZSBsb29wCisJCSAqLworCQlpZiAobWF4ID4gY291bnQpCisJCQltYXggPSBjb3VudDsKKworCQlpZiAodXNlcl9hY2Nlc3NfYmVnaW4oVkVSSUZZX1JFQUQsIHN0ciwgbWF4KSkgeworCQkJcmV0dmFsID0gZG9fc3Rybmxlbl91c2VyKHN0ciwgY291bnQsIG1heCk7CisJCQl1c2VyX2FjY2Vzc19lbmQoKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHN0cm5sZW5fdXNlcik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zd2lvdGxiLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi9zd2lvdGxiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjNzY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N3aW90bGIuYwpAQCAtMCwwICsxLDEwODYgQEAKKy8qCisgKiBEeW5hbWljIERNQSBtYXBwaW5nIHN1cHBvcnQuCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIGZhbGxiYWNrIGZvciBwbGF0Zm9ybXMgdGhhdCBkbyBub3Qgc3VwcG9ydAorICogSS9PIFRMQnMgKGFrYSBETUEgYWRkcmVzcyB0cmFuc2xhdGlvbiBoYXJkd2FyZSkuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQXNpdCBNYWxsaWNrIDxBc2l0LksuTWFsbGlja0BpbnRlbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgR291dGhhbSBSYW8gPGdvdXRoYW0ucmFvQGludGVsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwMCwgMjAwMyBIZXdsZXR0LVBhY2thcmQgQ28KKyAqCURhdmlkIE1vc2Jlcmdlci1UYW5nIDxkYXZpZG1AaHBsLmhwLmNvbT4KKyAqCisgKiAwMy8wNS8wNyBkYXZpZG0JU3dpdGNoIGZyb20gUENJLURNQSB0byBnZW5lcmljIGRldmljZSBETUEgQVBJLgorICogMDAvMTIvMTMgZGF2aWRtCVJlbmFtZSB0byBzd2lvdGxiLmMgYW5kIGFkZCBtYXJrX2NsZWFuKCkgdG8gYXZvaWQKKyAqCQkJdW5uZWNlc3NhcnkgaS1jYWNoZSBmbHVzaGluZy4KKyAqIDA0LzA3Ly4uIGFrCQlCZXR0ZXIgb3ZlcmZsb3cgaGFuZGxpbmcuIEFzc29ydGVkIGZpeGVzLgorICogMDUvMDkvMTAgbGludmlsbGUJQWRkIHN1cHBvcnQgZm9yIHN5bmNpbmcgcmFuZ2VzLCBzdXBwb3J0IHN5bmNpbmcgZm9yCisgKgkJCURNQV9CSURJUkVDVElPTkFMIG1hcHBpbmdzLCBtaXNjZWxsYW5lb3VzIGNsZWFudXAuCisgKiAwOC8xMi8xMSBiZWNreWIJQWRkIGhpZ2htZW0gc3VwcG9ydAorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgInNvZnR3YXJlIElPIFRMQjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3dpb3RsYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Bmbi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CisjaW5jbHVkZSA8bGludXgvc2NhdHRlcmxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tZW1fZW5jcnlwdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pb21tdS1oZWxwZXIuaD4KKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3N3aW90bGIuaD4KKworI2RlZmluZSBPRkZTRVQodmFsLGFsaWduKSAoKHVuc2lnbmVkIGxvbmcpCVwKKwkgICAgICAgICAgICAgICAgICAgKCAodmFsKSAmICggKGFsaWduKSAtIDEpKSkKKworI2RlZmluZSBTTEFCU19QRVJfUEFHRSAoMSA8PCAoUEFHRV9TSElGVCAtIElPX1RMQl9TSElGVCkpCisKKy8qCisgKiBNaW5pbXVtIElPIFRMQiBzaXplIHRvIGJvdGhlciBib290aW5nIHdpdGguICBTeXN0ZW1zIHdpdGggbWFpbmx5CisgKiA2NGJpdCBjYXBhYmxlIGNhcmRzIHdpbGwgb25seSBsaWdodGx5IHVzZSB0aGUgc3dpb3RsYi4gIElmIHdlIGNhbid0CisgKiBhbGxvY2F0ZSBhIGNvbnRpZ3VvdXMgMU1CLCB3ZSdyZSBwcm9iYWJseSBpbiB0cm91YmxlIGFueXdheS4KKyAqLworI2RlZmluZSBJT19UTEJfTUlOX1NMQUJTICgoMTw8MjApID4+IElPX1RMQl9TSElGVCkKKworZW51bSBzd2lvdGxiX2ZvcmNlIHN3aW90bGJfZm9yY2U7CisKKy8qCisgKiBVc2VkIHRvIGRvIGEgcXVpY2sgcmFuZ2UgY2hlY2sgaW4gc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlIGFuZAorICogc3dpb3RsYl90Ymxfc3luY19zaW5nbGVfKiwgdG8gc2VlIGlmIHRoZSBtZW1vcnkgd2FzIGluIGZhY3QgYWxsb2NhdGVkIGJ5IHRoaXMKKyAqIEFQSS4KKyAqLworc3RhdGljIHBoeXNfYWRkcl90IGlvX3RsYl9zdGFydCwgaW9fdGxiX2VuZDsKKworLyoKKyAqIFRoZSBudW1iZXIgb2YgSU8gVExCIGJsb2NrcyAoaW4gZ3JvdXBzIG9mIDY0KSBiZXR3ZWVuIGlvX3RsYl9zdGFydCBhbmQKKyAqIGlvX3RsYl9lbmQuICBUaGlzIGlzIGNvbW1hbmQgbGluZSBhZGp1c3RhYmxlIHZpYSBzZXR1cF9pb190bGJfbnBhZ2VzLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb190bGJfbnNsYWJzOworCisvKgorICogV2hlbiB0aGUgSU9NTVUgb3ZlcmZsb3dzIHdlIHJldHVybiBhIGZhbGxiYWNrIGJ1ZmZlci4gVGhpcyBzZXRzIHRoZSBzaXplLgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBpb190bGJfb3ZlcmZsb3cgPSAzMioxMDI0OworCitzdGF0aWMgcGh5c19hZGRyX3QgaW9fdGxiX292ZXJmbG93X2J1ZmZlcjsKKworLyoKKyAqIFRoaXMgaXMgYSBmcmVlIGxpc3QgZGVzY3JpYmluZyB0aGUgbnVtYmVyIG9mIGZyZWUgZW50cmllcyBhdmFpbGFibGUgZnJvbQorICogZWFjaCBpbmRleAorICovCitzdGF0aWMgdW5zaWduZWQgaW50ICppb190bGJfbGlzdDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaW9fdGxiX2luZGV4OworCisvKgorICogTWF4IHNlZ21lbnQgdGhhdCB3ZSBjYW4gcHJvdmlkZSB3aGljaCAoaWYgcGFnZXMgYXJlIGNvbnRpbmdvdXMpIHdpbGwKKyAqIG5vdCBiZSBib3VuY2VkICh1bmxlc3MgU1dJT1RMQl9GT1JDRSBpcyBzZXQpLgorICovCit1bnNpZ25lZCBpbnQgbWF4X3NlZ21lbnQ7CisKKy8qCisgKiBXZSBuZWVkIHRvIHNhdmUgYXdheSB0aGUgb3JpZ2luYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIGEgbWFwcGVkIGVudHJ5CisgKiBmb3IgdGhlIHN5bmMgb3BlcmF0aW9ucy4KKyAqLworI2RlZmluZSBJTlZBTElEX1BIWVNfQUREUiAofihwaHlzX2FkZHJfdCkwKQorc3RhdGljIHBoeXNfYWRkcl90ICppb190bGJfb3JpZ19hZGRyOworCisvKgorICogUHJvdGVjdCB0aGUgYWJvdmUgZGF0YSBzdHJ1Y3R1cmVzIGluIHRoZSBtYXAgYW5kIHVubWFwIGNhbGxzCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soaW9fdGxiX2xvY2spOworCitzdGF0aWMgaW50IGxhdGVfYWxsb2M7CisKK3N0YXRpYyBpbnQgX19pbml0CitzZXR1cF9pb190bGJfbnBhZ2VzKGNoYXIgKnN0cikKK3sKKwlpZiAoaXNkaWdpdCgqc3RyKSkgeworCQlpb190bGJfbnNsYWJzID0gc2ltcGxlX3N0cnRvdWwoc3RyLCAmc3RyLCAwKTsKKwkJLyogYXZvaWQgdGFpbCBzZWdtZW50IG9mIHNpemUgPCBJT19UTEJfU0VHU0laRSAqLworCQlpb190bGJfbnNsYWJzID0gQUxJR04oaW9fdGxiX25zbGFicywgSU9fVExCX1NFR1NJWkUpOworCX0KKwlpZiAoKnN0ciA9PSAnLCcpCisJCSsrc3RyOworCWlmICghc3RyY21wKHN0ciwgImZvcmNlIikpIHsKKwkJc3dpb3RsYl9mb3JjZSA9IFNXSU9UTEJfRk9SQ0U7CisJfSBlbHNlIGlmICghc3RyY21wKHN0ciwgIm5vZm9yY2UiKSkgeworCQlzd2lvdGxiX2ZvcmNlID0gU1dJT1RMQl9OT19GT1JDRTsKKwkJaW9fdGxiX25zbGFicyA9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgic3dpb3RsYiIsIHNldHVwX2lvX3RsYl9ucGFnZXMpOworLyogbWFrZSBpb190bGJfb3ZlcmZsb3cgdHVuYWJsZSB0b28/ICovCisKK3Vuc2lnbmVkIGxvbmcgc3dpb3RsYl9ucl90Ymwodm9pZCkKK3sKKwlyZXR1cm4gaW9fdGxiX25zbGFiczsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfbnJfdGJsKTsKKwordW5zaWduZWQgaW50IHN3aW90bGJfbWF4X3NlZ21lbnQodm9pZCkKK3sKKwlyZXR1cm4gbWF4X3NlZ21lbnQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX21heF9zZWdtZW50KTsKKwordm9pZCBzd2lvdGxiX3NldF9tYXhfc2VnbWVudCh1bnNpZ25lZCBpbnQgdmFsKQoreworCWlmIChzd2lvdGxiX2ZvcmNlID09IFNXSU9UTEJfRk9SQ0UpCisJCW1heF9zZWdtZW50ID0gMTsKKwllbHNlCisJCW1heF9zZWdtZW50ID0gcm91bmRkb3duKHZhbCwgUEFHRV9TSVpFKTsKK30KKworLyogZGVmYXVsdCB0byA2NE1CICovCisjZGVmaW5lIElPX1RMQl9ERUZBVUxUX1NJWkUgKDY0VUw8PDIwKQordW5zaWduZWQgbG9uZyBzd2lvdGxiX3NpemVfb3JfZGVmYXVsdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCXNpemUgPSBpb190bGJfbnNsYWJzIDw8IElPX1RMQl9TSElGVDsKKworCXJldHVybiBzaXplID8gc2l6ZSA6IChJT19UTEJfREVGQVVMVF9TSVpFKTsKK30KKwordm9pZCBfX3dlYWsgc3dpb3RsYl9zZXRfbWVtX2F0dHJpYnV0ZXModm9pZCAqdmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkgeyB9CisKKy8qIEZvciBzd2lvdGxiLCBjbGVhciBtZW1vcnkgZW5jcnlwdGlvbiBtYXNrIGZyb20gZG1hIGFkZHJlc3NlcyAqLworc3RhdGljIGRtYV9hZGRyX3Qgc3dpb3RsYl9waHlzX3RvX2RtYShzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQkgICAgICBwaHlzX2FkZHJfdCBhZGRyZXNzKQoreworCXJldHVybiBfX3NtZV9jbHIocGh5c190b19kbWEoaHdkZXYsIGFkZHJlc3MpKTsKK30KKworLyogTm90ZSB0aGF0IHRoaXMgZG9lc24ndCB3b3JrIHdpdGggaGlnaG1lbSBwYWdlICovCitzdGF0aWMgZG1hX2FkZHJfdCBzd2lvdGxiX3ZpcnRfdG9fYnVzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkJCSAgICAgIHZvbGF0aWxlIHZvaWQgKmFkZHJlc3MpCit7CisJcmV0dXJuIHBoeXNfdG9fZG1hKGh3ZGV2LCB2aXJ0X3RvX3BoeXMoYWRkcmVzcykpOworfQorCitzdGF0aWMgYm9vbCBub19pb3RsYl9tZW1vcnk7CisKK3ZvaWQgc3dpb3RsYl9wcmludF9pbmZvKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBieXRlcyA9IGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUOworCisJaWYgKG5vX2lvdGxiX21lbW9yeSkgeworCQlwcl93YXJuKCJObyBsb3cgbWVtXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByX2luZm8oIm1hcHBlZCBbbWVtICUjMDEwbGx4LSUjMDEwbGx4XSAoJWx1TUIpXG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWlvX3RsYl9zdGFydCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylpb190bGJfZW5kLAorCSAgICAgICBieXRlcyA+PiAyMCk7Cit9CisKKy8qCisgKiBFYXJseSBTV0lPVExCIGFsbG9jYXRpb24gbWF5IGJlIHRvbyBlYXJseSB0byBhbGxvdyBhbiBhcmNoaXRlY3R1cmUgdG8KKyAqIHBlcmZvcm0gdGhlIGRlc2lyZWQgb3BlcmF0aW9ucy4gIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRoZSBhcmNoaXRlY3R1cmUgdG8KKyAqIGNhbGwgU1dJT1RMQiB3aGVuIHRoZSBvcGVyYXRpb25zIGFyZSBwb3NzaWJsZS4gIEl0IG5lZWRzIHRvIGJlIGNhbGxlZAorICogYmVmb3JlIHRoZSBTV0lPVExCIG1lbW9yeSBpcyB1c2VkLgorICovCit2b2lkIF9faW5pdCBzd2lvdGxiX3VwZGF0ZV9tZW1fYXR0cmlidXRlcyh2b2lkKQoreworCXZvaWQgKnZhZGRyOworCXVuc2lnbmVkIGxvbmcgYnl0ZXM7CisKKwlpZiAobm9faW90bGJfbWVtb3J5IHx8IGxhdGVfYWxsb2MpCisJCXJldHVybjsKKworCXZhZGRyID0gcGh5c190b192aXJ0KGlvX3RsYl9zdGFydCk7CisJYnl0ZXMgPSBQQUdFX0FMSUdOKGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUKTsKKwlzd2lvdGxiX3NldF9tZW1fYXR0cmlidXRlcyh2YWRkciwgYnl0ZXMpOworCW1lbXNldCh2YWRkciwgMCwgYnl0ZXMpOworCisJdmFkZHIgPSBwaHlzX3RvX3ZpcnQoaW9fdGxiX292ZXJmbG93X2J1ZmZlcik7CisJYnl0ZXMgPSBQQUdFX0FMSUdOKGlvX3RsYl9vdmVyZmxvdyk7CisJc3dpb3RsYl9zZXRfbWVtX2F0dHJpYnV0ZXModmFkZHIsIGJ5dGVzKTsKKwltZW1zZXQodmFkZHIsIDAsIGJ5dGVzKTsKK30KKworaW50IF9faW5pdCBzd2lvdGxiX2luaXRfd2l0aF90YmwoY2hhciAqdGxiLCB1bnNpZ25lZCBsb25nIG5zbGFicywgaW50IHZlcmJvc2UpCit7CisJdm9pZCAqdl9vdmVyZmxvd19idWZmZXI7CisJdW5zaWduZWQgbG9uZyBpLCBieXRlczsKKworCWJ5dGVzID0gbnNsYWJzIDw8IElPX1RMQl9TSElGVDsKKworCWlvX3RsYl9uc2xhYnMgPSBuc2xhYnM7CisJaW9fdGxiX3N0YXJ0ID0gX19wYSh0bGIpOworCWlvX3RsYl9lbmQgPSBpb190bGJfc3RhcnQgKyBieXRlczsKKworCS8qCisJICogR2V0IHRoZSBvdmVyZmxvdyBlbWVyZ2VuY3kgYnVmZmVyCisJICovCisJdl9vdmVyZmxvd19idWZmZXIgPSBtZW1ibG9ja192aXJ0X2FsbG9jX2xvd19ub3BhbmljKAorCQkJCQkJUEFHRV9BTElHTihpb190bGJfb3ZlcmZsb3cpLAorCQkJCQkJUEFHRV9TSVpFKTsKKwlpZiAoIXZfb3ZlcmZsb3dfYnVmZmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlvX3RsYl9vdmVyZmxvd19idWZmZXIgPSBfX3BhKHZfb3ZlcmZsb3dfYnVmZmVyKTsKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCBhcnJheS4gIFRoaXMgYXJyYXkgaXMgdXNlZAorCSAqIHRvIGZpbmQgY29udGlndW91cyBmcmVlIG1lbW9yeSByZWdpb25zIG9mIHNpemUgdXAgdG8gSU9fVExCX1NFR1NJWkUKKwkgKiBiZXR3ZWVuIGlvX3RsYl9zdGFydCBhbmQgaW9fdGxiX2VuZC4KKwkgKi8KKwlpb190bGJfbGlzdCA9IG1lbWJsb2NrX3ZpcnRfYWxsb2MoCisJCQkJUEFHRV9BTElHTihpb190bGJfbnNsYWJzICogc2l6ZW9mKGludCkpLAorCQkJCVBBR0VfU0laRSk7CisJaW9fdGxiX29yaWdfYWRkciA9IG1lbWJsb2NrX3ZpcnRfYWxsb2MoCisJCQkJUEFHRV9BTElHTihpb190bGJfbnNsYWJzICogc2l6ZW9mKHBoeXNfYWRkcl90KSksCisJCQkJUEFHRV9TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgaW9fdGxiX25zbGFiczsgaSsrKSB7CisJCWlvX3RsYl9saXN0W2ldID0gSU9fVExCX1NFR1NJWkUgLSBPRkZTRVQoaSwgSU9fVExCX1NFR1NJWkUpOworCQlpb190bGJfb3JpZ19hZGRyW2ldID0gSU5WQUxJRF9QSFlTX0FERFI7CisJfQorCWlvX3RsYl9pbmRleCA9IDA7CisKKwlpZiAodmVyYm9zZSkKKwkJc3dpb3RsYl9wcmludF9pbmZvKCk7CisKKwlzd2lvdGxiX3NldF9tYXhfc2VnbWVudChpb190bGJfbnNsYWJzIDw8IElPX1RMQl9TSElGVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdGF0aWNhbGx5IHJlc2VydmUgYm91bmNlIGJ1ZmZlciBzcGFjZSBhbmQgaW5pdGlhbGl6ZSBib3VuY2UgYnVmZmVyIGRhdGEKKyAqIHN0cnVjdHVyZXMgZm9yIHRoZSBzb2Z0d2FyZSBJTyBUTEIgdXNlZCB0byBpbXBsZW1lbnQgdGhlIERNQSBBUEkuCisgKi8KK3ZvaWQgIF9faW5pdAorc3dpb3RsYl9pbml0KGludCB2ZXJib3NlKQoreworCXNpemVfdCBkZWZhdWx0X3NpemUgPSBJT19UTEJfREVGQVVMVF9TSVpFOworCXVuc2lnbmVkIGNoYXIgKnZzdGFydDsKKwl1bnNpZ25lZCBsb25nIGJ5dGVzOworCisJaWYgKCFpb190bGJfbnNsYWJzKSB7CisJCWlvX3RsYl9uc2xhYnMgPSAoZGVmYXVsdF9zaXplID4+IElPX1RMQl9TSElGVCk7CisJCWlvX3RsYl9uc2xhYnMgPSBBTElHTihpb190bGJfbnNsYWJzLCBJT19UTEJfU0VHU0laRSk7CisJfQorCisJYnl0ZXMgPSBpb190bGJfbnNsYWJzIDw8IElPX1RMQl9TSElGVDsKKworCS8qIEdldCBJTyBUTEIgbWVtb3J5IGZyb20gdGhlIGxvdyBwYWdlcyAqLworCXZzdGFydCA9IG1lbWJsb2NrX3ZpcnRfYWxsb2NfbG93X25vcGFuaWMoUEFHRV9BTElHTihieXRlcyksIFBBR0VfU0laRSk7CisJaWYgKHZzdGFydCAmJiAhc3dpb3RsYl9pbml0X3dpdGhfdGJsKHZzdGFydCwgaW9fdGxiX25zbGFicywgdmVyYm9zZSkpCisJCXJldHVybjsKKworCWlmIChpb190bGJfc3RhcnQpCisJCW1lbWJsb2NrX2ZyZWVfZWFybHkoaW9fdGxiX3N0YXJ0LAorCQkJCSAgICBQQUdFX0FMSUdOKGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUKSk7CisJcHJfd2FybigiQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciIpOworCW5vX2lvdGxiX21lbW9yeSA9IHRydWU7Cit9CisKKy8qCisgKiBTeXN0ZW1zIHdpdGggbGFyZ2VyIERNQSB6b25lcyAodGhvc2UgdGhhdCBkb24ndCBzdXBwb3J0IElTQSkgY2FuCisgKiBpbml0aWFsaXplIHRoZSBzd2lvdGxiIGxhdGVyIHVzaW5nIHRoZSBzbGFiIGFsbG9jYXRvciBpZiBuZWVkZWQuCisgKiBUaGlzIHNob3VsZCBiZSBqdXN0IGxpa2UgYWJvdmUsIGJ1dCB3aXRoIHNvbWUgZXJyb3IgY2F0Y2hpbmcuCisgKi8KK2ludAorc3dpb3RsYl9sYXRlX2luaXRfd2l0aF9kZWZhdWx0X3NpemUoc2l6ZV90IGRlZmF1bHRfc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJ5dGVzLCByZXFfbnNsYWJzID0gaW9fdGxiX25zbGFiczsKKwl1bnNpZ25lZCBjaGFyICp2c3RhcnQgPSBOVUxMOworCXVuc2lnbmVkIGludCBvcmRlcjsKKwlpbnQgcmMgPSAwOworCisJaWYgKCFpb190bGJfbnNsYWJzKSB7CisJCWlvX3RsYl9uc2xhYnMgPSAoZGVmYXVsdF9zaXplID4+IElPX1RMQl9TSElGVCk7CisJCWlvX3RsYl9uc2xhYnMgPSBBTElHTihpb190bGJfbnNsYWJzLCBJT19UTEJfU0VHU0laRSk7CisJfQorCisJLyoKKwkgKiBHZXQgSU8gVExCIG1lbW9yeSBmcm9tIHRoZSBsb3cgcGFnZXMKKwkgKi8KKwlvcmRlciA9IGdldF9vcmRlcihpb190bGJfbnNsYWJzIDw8IElPX1RMQl9TSElGVCk7CisJaW9fdGxiX25zbGFicyA9IFNMQUJTX1BFUl9QQUdFIDw8IG9yZGVyOworCWJ5dGVzID0gaW9fdGxiX25zbGFicyA8PCBJT19UTEJfU0hJRlQ7CisKKwl3aGlsZSAoKFNMQUJTX1BFUl9QQUdFIDw8IG9yZGVyKSA+IElPX1RMQl9NSU5fU0xBQlMpIHsKKwkJdnN0YXJ0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4sCisJCQkJCQkgIG9yZGVyKTsKKwkJaWYgKHZzdGFydCkKKwkJCWJyZWFrOworCQlvcmRlci0tOworCX0KKworCWlmICghdnN0YXJ0KSB7CisJCWlvX3RsYl9uc2xhYnMgPSByZXFfbnNsYWJzOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJaWYgKG9yZGVyICE9IGdldF9vcmRlcihieXRlcykpIHsKKwkJcHJfd2Fybigib25seSBhYmxlIHRvIGFsbG9jYXRlICVsZCBNQlxuIiwKKwkJCShQQUdFX1NJWkUgPDwgb3JkZXIpID4+IDIwKTsKKwkJaW9fdGxiX25zbGFicyA9IFNMQUJTX1BFUl9QQUdFIDw8IG9yZGVyOworCX0KKwlyYyA9IHN3aW90bGJfbGF0ZV9pbml0X3dpdGhfdGJsKHZzdGFydCwgaW9fdGxiX25zbGFicyk7CisJaWYgKHJjKQorCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXZzdGFydCwgb3JkZXIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQKK3N3aW90bGJfbGF0ZV9pbml0X3dpdGhfdGJsKGNoYXIgKnRsYiwgdW5zaWduZWQgbG9uZyBuc2xhYnMpCit7CisJdW5zaWduZWQgbG9uZyBpLCBieXRlczsKKwl1bnNpZ25lZCBjaGFyICp2X292ZXJmbG93X2J1ZmZlcjsKKworCWJ5dGVzID0gbnNsYWJzIDw8IElPX1RMQl9TSElGVDsKKworCWlvX3RsYl9uc2xhYnMgPSBuc2xhYnM7CisJaW9fdGxiX3N0YXJ0ID0gdmlydF90b19waHlzKHRsYik7CisJaW9fdGxiX2VuZCA9IGlvX3RsYl9zdGFydCArIGJ5dGVzOworCisJc3dpb3RsYl9zZXRfbWVtX2F0dHJpYnV0ZXModGxiLCBieXRlcyk7CisJbWVtc2V0KHRsYiwgMCwgYnl0ZXMpOworCisJLyoKKwkgKiBHZXQgdGhlIG92ZXJmbG93IGVtZXJnZW5jeSBidWZmZXIKKwkgKi8KKwl2X292ZXJmbG93X2J1ZmZlciA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfRE1BLAorCQkJCQkJICAgICBnZXRfb3JkZXIoaW9fdGxiX292ZXJmbG93KSk7CisJaWYgKCF2X292ZXJmbG93X2J1ZmZlcikKKwkJZ290byBjbGVhbnVwMjsKKworCXN3aW90bGJfc2V0X21lbV9hdHRyaWJ1dGVzKHZfb3ZlcmZsb3dfYnVmZmVyLCBpb190bGJfb3ZlcmZsb3cpOworCW1lbXNldCh2X292ZXJmbG93X2J1ZmZlciwgMCwgaW9fdGxiX292ZXJmbG93KTsKKwlpb190bGJfb3ZlcmZsb3dfYnVmZmVyID0gdmlydF90b19waHlzKHZfb3ZlcmZsb3dfYnVmZmVyKTsKKworCS8qCisJICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgdGhlIGZyZWUgbGlzdCBhcnJheS4gIFRoaXMgYXJyYXkgaXMgdXNlZAorCSAqIHRvIGZpbmQgY29udGlndW91cyBmcmVlIG1lbW9yeSByZWdpb25zIG9mIHNpemUgdXAgdG8gSU9fVExCX1NFR1NJWkUKKwkgKiBiZXR3ZWVuIGlvX3RsYl9zdGFydCBhbmQgaW9fdGxiX2VuZC4KKwkgKi8KKwlpb190bGJfbGlzdCA9ICh1bnNpZ25lZCBpbnQgKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKiBzaXplb2YoaW50KSkpOworCWlmICghaW9fdGxiX2xpc3QpCisJCWdvdG8gY2xlYW51cDM7CisKKwlpb190bGJfb3JpZ19hZGRyID0gKHBoeXNfYWRkcl90ICopCisJCV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwKKwkJCQkgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgKgorCQkJCQkgICBzaXplb2YocGh5c19hZGRyX3QpKSk7CisJaWYgKCFpb190bGJfb3JpZ19hZGRyKQorCQlnb3RvIGNsZWFudXA0OworCisJZm9yIChpID0gMDsgaSA8IGlvX3RsYl9uc2xhYnM7IGkrKykgeworCQlpb190bGJfbGlzdFtpXSA9IElPX1RMQl9TRUdTSVpFIC0gT0ZGU0VUKGksIElPX1RMQl9TRUdTSVpFKTsKKwkJaW9fdGxiX29yaWdfYWRkcltpXSA9IElOVkFMSURfUEhZU19BRERSOworCX0KKwlpb190bGJfaW5kZXggPSAwOworCisJc3dpb3RsYl9wcmludF9pbmZvKCk7CisKKwlsYXRlX2FsbG9jID0gMTsKKworCXN3aW90bGJfc2V0X21heF9zZWdtZW50KGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUKTsKKworCXJldHVybiAwOworCitjbGVhbnVwNDoKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9saXN0LCBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpbnQpKSk7CisJaW9fdGxiX2xpc3QgPSBOVUxMOworY2xlYW51cDM6CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2X292ZXJmbG93X2J1ZmZlciwKKwkJICAgZ2V0X29yZGVyKGlvX3RsYl9vdmVyZmxvdykpOworCWlvX3RsYl9vdmVyZmxvd19idWZmZXIgPSAwOworY2xlYW51cDI6CisJaW9fdGxiX2VuZCA9IDA7CisJaW9fdGxiX3N0YXJ0ID0gMDsKKwlpb190bGJfbnNsYWJzID0gMDsKKwltYXhfc2VnbWVudCA9IDA7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3ZvaWQgX19pbml0IHN3aW90bGJfZnJlZSh2b2lkKQoreworCWlmICghaW9fdGxiX29yaWdfYWRkcikKKwkJcmV0dXJuOworCisJaWYgKGxhdGVfYWxsb2MpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZylwaHlzX3RvX3ZpcnQoaW9fdGxiX292ZXJmbG93X2J1ZmZlciksCisJCQkgICBnZXRfb3JkZXIoaW9fdGxiX292ZXJmbG93KSk7CisJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpaW9fdGxiX29yaWdfYWRkciwKKwkJCSAgIGdldF9vcmRlcihpb190bGJfbnNsYWJzICogc2l6ZW9mKHBoeXNfYWRkcl90KSkpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWlvX3RsYl9saXN0LCBnZXRfb3JkZXIoaW9fdGxiX25zbGFicyAqCisJCQkJCQkJCSBzaXplb2YoaW50KSkpOworCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXBoeXNfdG9fdmlydChpb190bGJfc3RhcnQpLAorCQkJICAgZ2V0X29yZGVyKGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUKSk7CisJfSBlbHNlIHsKKwkJbWVtYmxvY2tfZnJlZV9sYXRlKGlvX3RsYl9vdmVyZmxvd19idWZmZXIsCisJCQkJICAgUEFHRV9BTElHTihpb190bGJfb3ZlcmZsb3cpKTsKKwkJbWVtYmxvY2tfZnJlZV9sYXRlKF9fcGEoaW9fdGxiX29yaWdfYWRkciksCisJCQkJICAgUEFHRV9BTElHTihpb190bGJfbnNsYWJzICogc2l6ZW9mKHBoeXNfYWRkcl90KSkpOworCQltZW1ibG9ja19mcmVlX2xhdGUoX19wYShpb190bGJfbGlzdCksCisJCQkJICAgUEFHRV9BTElHTihpb190bGJfbnNsYWJzICogc2l6ZW9mKGludCkpKTsKKwkJbWVtYmxvY2tfZnJlZV9sYXRlKGlvX3RsYl9zdGFydCwKKwkJCQkgICBQQUdFX0FMSUdOKGlvX3RsYl9uc2xhYnMgPDwgSU9fVExCX1NISUZUKSk7CisJfQorCWlvX3RsYl9uc2xhYnMgPSAwOworCW1heF9zZWdtZW50ID0gMDsKK30KKworaW50IGlzX3N3aW90bGJfYnVmZmVyKHBoeXNfYWRkcl90IHBhZGRyKQoreworCXJldHVybiBwYWRkciA+PSBpb190bGJfc3RhcnQgJiYgcGFkZHIgPCBpb190bGJfZW5kOworfQorCisvKgorICogQm91bmNlOiBjb3B5IHRoZSBzd2lvdGxiIGJ1ZmZlciBiYWNrIHRvIHRoZSBvcmlnaW5hbCBkbWEgbG9jYXRpb24KKyAqLworc3RhdGljIHZvaWQgc3dpb3RsYl9ib3VuY2UocGh5c19hZGRyX3Qgb3JpZ19hZGRyLCBwaHlzX2FkZHJfdCB0bGJfYWRkciwKKwkJCSAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBQRk5fRE9XTihvcmlnX2FkZHIpOworCXVuc2lnbmVkIGNoYXIgKnZhZGRyID0gcGh5c190b192aXJ0KHRsYl9hZGRyKTsKKworCWlmIChQYWdlSGlnaE1lbShwZm5fdG9fcGFnZShwZm4pKSkgeworCQkvKiBUaGUgYnVmZmVyIGRvZXMgbm90IGhhdmUgYSBtYXBwaW5nLiAgTWFwIGl0IGluIGFuZCBjb3B5ICovCisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBvcmlnX2FkZHIgJiB+UEFHRV9NQVNLOworCQljaGFyICpidWZmZXI7CisJCXVuc2lnbmVkIGludCBzeiA9IDA7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJd2hpbGUgKHNpemUpIHsKKwkJCXN6ID0gbWluX3Qoc2l6ZV90LCBQQUdFX1NJWkUgLSBvZmZzZXQsIHNpemUpOworCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCQlidWZmZXIgPSBrbWFwX2F0b21pYyhwZm5fdG9fcGFnZShwZm4pKTsKKwkJCWlmIChkaXIgPT0gRE1BX1RPX0RFVklDRSkKKwkJCQltZW1jcHkodmFkZHIsIGJ1ZmZlciArIG9mZnNldCwgc3opOworCQkJZWxzZQorCQkJCW1lbWNweShidWZmZXIgKyBvZmZzZXQsIHZhZGRyLCBzeik7CisJCQlrdW5tYXBfYXRvbWljKGJ1ZmZlcik7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisKKwkJCXNpemUgLT0gc3o7CisJCQlwZm4rKzsKKwkJCXZhZGRyICs9IHN6OworCQkJb2Zmc2V0ID0gMDsKKwkJfQorCX0gZWxzZSBpZiAoZGlyID09IERNQV9UT19ERVZJQ0UpIHsKKwkJbWVtY3B5KHZhZGRyLCBwaHlzX3RvX3ZpcnQob3JpZ19hZGRyKSwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJbWVtY3B5KHBoeXNfdG9fdmlydChvcmlnX2FkZHIpLCB2YWRkciwgc2l6ZSk7CisJfQorfQorCitwaHlzX2FkZHJfdCBzd2lvdGxiX3RibF9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LAorCQkJCSAgIGRtYV9hZGRyX3QgdGJsX2RtYV9hZGRyLAorCQkJCSAgIHBoeXNfYWRkcl90IG9yaWdfYWRkciwgc2l6ZV90IHNpemUsCisJCQkJICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlwaHlzX2FkZHJfdCB0bGJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnNsb3RzLCBzdHJpZGUsIGluZGV4LCB3cmFwOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwl1bnNpZ25lZCBsb25nIG9mZnNldF9zbG90czsKKwl1bnNpZ25lZCBsb25nIG1heF9zbG90czsKKworCWlmIChub19pb3RsYl9tZW1vcnkpCisJCXBhbmljKCJDYW4gbm90IGFsbG9jYXRlIFNXSU9UTEIgYnVmZmVyIGVhcmxpZXIgYW5kIGNhbid0IG5vdyBwcm92aWRlIHlvdSB3aXRoIHRoZSBETUEgYm91bmNlIGJ1ZmZlciIpOworCisJaWYgKHNtZV9hY3RpdmUoKSkKKwkJcHJfd2Fybl9vbmNlKCJTTUUgaXMgYWN0aXZlIGFuZCBzeXN0ZW0gaXMgdXNpbmcgRE1BIGJvdW5jZSBidWZmZXJzXG4iKTsKKworCW1hc2sgPSBkbWFfZ2V0X3NlZ19ib3VuZGFyeShod2Rldik7CisKKwl0YmxfZG1hX2FkZHIgJj0gbWFzazsKKworCW9mZnNldF9zbG90cyA9IEFMSUdOKHRibF9kbWFfYWRkciwgMSA8PCBJT19UTEJfU0hJRlQpID4+IElPX1RMQl9TSElGVDsKKworCS8qCisgCSAqIENhcmVmdWxseSBoYW5kbGUgaW50ZWdlciBvdmVyZmxvdyB3aGljaCBjYW4gb2NjdXIgd2hlbiBtYXNrID09IH4wVUwuCisgCSAqLworCW1heF9zbG90cyA9IG1hc2sgKyAxCisJCSAgICA/IEFMSUdOKG1hc2sgKyAxLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUCisJCSAgICA6IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIElPX1RMQl9TSElGVCk7CisKKwkvKgorCSAqIEZvciBtYXBwaW5ncyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBwYWdlLCB3ZSBsaW1pdCB0aGUgc3RyaWRlCisJICogKGFuZCBoZW5jZSBhbGlnbm1lbnQpIHRvIGEgcGFnZSBzaXplLgorCSAqLworCW5zbG90cyA9IEFMSUdOKHNpemUsIDEgPDwgSU9fVExCX1NISUZUKSA+PiBJT19UTEJfU0hJRlQ7CisJaWYgKHNpemUgPj0gUEFHRV9TSVpFKQorCQlzdHJpZGUgPSAoMSA8PCAoUEFHRV9TSElGVCAtIElPX1RMQl9TSElGVCkpOworCWVsc2UKKwkJc3RyaWRlID0gMTsKKworCUJVR19PTighbnNsb3RzKTsKKworCS8qCisJICogRmluZCBzdWl0YWJsZSBudW1iZXIgb2YgSU8gVExCIGVudHJpZXMgc2l6ZSB0aGF0IHdpbGwgZml0IHRoaXMKKwkgKiByZXF1ZXN0IGFuZCBhbGxvY2F0ZSBhIGJ1ZmZlciBmcm9tIHRoYXQgSU8gVExCIHBvb2wuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvX3RsYl9sb2NrLCBmbGFncyk7CisJaW5kZXggPSBBTElHTihpb190bGJfaW5kZXgsIHN0cmlkZSk7CisJaWYgKGluZGV4ID49IGlvX3RsYl9uc2xhYnMpCisJCWluZGV4ID0gMDsKKwl3cmFwID0gaW5kZXg7CisKKwlkbyB7CisJCXdoaWxlIChpb21tdV9pc19zcGFuX2JvdW5kYXJ5KGluZGV4LCBuc2xvdHMsIG9mZnNldF9zbG90cywKKwkJCQkJICAgICAgbWF4X3Nsb3RzKSkgeworCQkJaW5kZXggKz0gc3RyaWRlOworCQkJaWYgKGluZGV4ID49IGlvX3RsYl9uc2xhYnMpCisJCQkJaW5kZXggPSAwOworCQkJaWYgKGluZGV4ID09IHdyYXApCisJCQkJZ290byBub3RfZm91bmQ7CisJCX0KKworCQkvKgorCQkgKiBJZiB3ZSBmaW5kIGEgc2xvdCB0aGF0IGluZGljYXRlcyB3ZSBoYXZlICduc2xvdHMnIG51bWJlciBvZgorCQkgKiBjb250aWd1b3VzIGJ1ZmZlcnMsIHdlIGFsbG9jYXRlIHRoZSBidWZmZXJzIGZyb20gdGhhdCBzbG90CisJCSAqIGFuZCBtYXJrIHRoZSBlbnRyaWVzIGFzICcwJyBpbmRpY2F0aW5nIHVuYXZhaWxhYmxlLgorCQkgKi8KKwkJaWYgKGlvX3RsYl9saXN0W2luZGV4XSA+PSBuc2xvdHMpIHsKKwkJCWludCBjb3VudCA9IDA7CisKKwkJCWZvciAoaSA9IGluZGV4OyBpIDwgKGludCkgKGluZGV4ICsgbnNsb3RzKTsgaSsrKQorCQkJCWlvX3RsYl9saXN0W2ldID0gMDsKKwkJCWZvciAoaSA9IGluZGV4IC0gMTsgKE9GRlNFVChpLCBJT19UTEJfU0VHU0laRSkgIT0gSU9fVExCX1NFR1NJWkUgLSAxKSAmJiBpb190bGJfbGlzdFtpXTsgaS0tKQorCQkJCWlvX3RsYl9saXN0W2ldID0gKytjb3VudDsKKwkJCXRsYl9hZGRyID0gaW9fdGxiX3N0YXJ0ICsgKGluZGV4IDw8IElPX1RMQl9TSElGVCk7CisKKwkJCS8qCisJCQkgKiBVcGRhdGUgdGhlIGluZGljZXMgdG8gYXZvaWQgc2VhcmNoaW5nIGluIHRoZSBuZXh0CisJCQkgKiByb3VuZC4KKwkJCSAqLworCQkJaW9fdGxiX2luZGV4ID0gKChpbmRleCArIG5zbG90cykgPCBpb190bGJfbnNsYWJzCisJCQkJCT8gKGluZGV4ICsgbnNsb3RzKSA6IDApOworCisJCQlnb3RvIGZvdW5kOworCQl9CisJCWluZGV4ICs9IHN0cmlkZTsKKwkJaWYgKGluZGV4ID49IGlvX3RsYl9uc2xhYnMpCisJCQlpbmRleCA9IDA7CisJfSB3aGlsZSAoaW5kZXggIT0gd3JhcCk7CisKK25vdF9mb3VuZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb190bGJfbG9jaywgZmxhZ3MpOworCWlmICghKGF0dHJzICYgRE1BX0FUVFJfTk9fV0FSTikgJiYgcHJpbnRrX3JhdGVsaW1pdCgpKQorCQlkZXZfd2Fybihod2RldiwgInN3aW90bGIgYnVmZmVyIGlzIGZ1bGwgKHN6OiAlemQgYnl0ZXMpXG4iLCBzaXplKTsKKwlyZXR1cm4gU1dJT1RMQl9NQVBfRVJST1I7Citmb3VuZDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpb190bGJfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBTYXZlIGF3YXkgdGhlIG1hcHBpbmcgZnJvbSB0aGUgb3JpZ2luYWwgYWRkcmVzcyB0byB0aGUgRE1BIGFkZHJlc3MuCisJICogVGhpcyBpcyBuZWVkZWQgd2hlbiB3ZSBzeW5jIHRoZSBtZW1vcnkuICBUaGVuIHdlIHN5bmMgdGhlIGJ1ZmZlciBpZgorCSAqIG5lZWRlZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnNsb3RzOyBpKyspCisJCWlvX3RsYl9vcmlnX2FkZHJbaW5kZXgraV0gPSBvcmlnX2FkZHIgKyAoaSA8PCBJT19UTEJfU0hJRlQpOworCWlmICghKGF0dHJzICYgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQykgJiYKKwkgICAgKGRpciA9PSBETUFfVE9fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpCisJCXN3aW90bGJfYm91bmNlKG9yaWdfYWRkciwgdGxiX2FkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UpOworCisJcmV0dXJuIHRsYl9hZGRyOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc3dpb3RsYl90YmxfbWFwX3NpbmdsZSk7CisKKy8qCisgKiBBbGxvY2F0ZXMgYm91bmNlIGJ1ZmZlciBhbmQgcmV0dXJucyBpdHMga2VybmVsIHZpcnR1YWwgYWRkcmVzcy4KKyAqLworCitzdGF0aWMgcGh5c19hZGRyX3QKK21hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIHBoeXNfYWRkcl90IHBoeXMsIHNpemVfdCBzaXplLAorCSAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlkbWFfYWRkcl90IHN0YXJ0X2RtYV9hZGRyOworCisJaWYgKHN3aW90bGJfZm9yY2UgPT0gU1dJT1RMQl9OT19GT1JDRSkgeworCQlkZXZfd2Fybl9yYXRlbGltaXRlZChod2RldiwgIkNhbm5vdCBkbyBETUEgdG8gYWRkcmVzcyAlcGFcbiIsCisJCQkJICAgICAmcGh5cyk7CisJCXJldHVybiBTV0lPVExCX01BUF9FUlJPUjsKKwl9CisKKwlzdGFydF9kbWFfYWRkciA9IHN3aW90bGJfcGh5c190b19kbWEoaHdkZXYsIGlvX3RsYl9zdGFydCk7CisJcmV0dXJuIHN3aW90bGJfdGJsX21hcF9zaW5nbGUoaHdkZXYsIHN0YXJ0X2RtYV9hZGRyLCBwaHlzLCBzaXplLAorCQkJCSAgICAgIGRpciwgYXR0cnMpOworfQorCisvKgorICogZG1hX2FkZHIgaXMgdGhlIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJvdW5jZSBidWZmZXIgdG8gdW5tYXAuCisgKi8KK3ZvaWQgc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCB0bGJfYWRkciwKKwkJCSAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGNvdW50LCBuc2xvdHMgPSBBTElHTihzaXplLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUOworCWludCBpbmRleCA9ICh0bGJfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOworCXBoeXNfYWRkcl90IG9yaWdfYWRkciA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOworCisJLyoKKwkgKiBGaXJzdCwgc3luYyB0aGUgbWVtb3J5IGJlZm9yZSB1bm1hcHBpbmcgdGhlIGVudHJ5CisJICovCisJaWYgKG9yaWdfYWRkciAhPSBJTlZBTElEX1BIWVNfQUREUiAmJgorCSAgICAhKGF0dHJzICYgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQykgJiYKKwkgICAgKChkaXIgPT0gRE1BX0ZST01fREVWSUNFKSB8fCAoZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkpCisJCXN3aW90bGJfYm91bmNlKG9yaWdfYWRkciwgdGxiX2FkZHIsIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisKKwkvKgorCSAqIFJldHVybiB0aGUgYnVmZmVyIHRvIHRoZSBmcmVlIGxpc3QgYnkgc2V0dGluZyB0aGUgY29ycmVzcG9uZGluZworCSAqIGVudHJpZXMgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGVudHJpZXMgYXZhaWxhYmxlLgorCSAqIFdoaWxlIHJldHVybmluZyB0aGUgZW50cmllcyB0byB0aGUgZnJlZSBsaXN0LCB3ZSBtZXJnZSB0aGUgZW50cmllcworCSAqIHdpdGggc2xvdHMgYmVsb3cgYW5kIGFib3ZlIHRoZSBwb29sIGJlaW5nIHJldHVybmVkLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpb190bGJfbG9jaywgZmxhZ3MpOworCXsKKwkJY291bnQgPSAoKGluZGV4ICsgbnNsb3RzKSA8IEFMSUdOKGluZGV4ICsgMSwgSU9fVExCX1NFR1NJWkUpID8KKwkJCSBpb190bGJfbGlzdFtpbmRleCArIG5zbG90c10gOiAwKTsKKwkJLyoKKwkJICogU3RlcCAxOiByZXR1cm4gdGhlIHNsb3RzIHRvIHRoZSBmcmVlIGxpc3QsIG1lcmdpbmcgdGhlCisJCSAqIHNsb3RzIHdpdGggc3VwZXJjZWVkaW5nIHNsb3RzCisJCSAqLworCQlmb3IgKGkgPSBpbmRleCArIG5zbG90cyAtIDE7IGkgPj0gaW5kZXg7IGktLSkgeworCQkJaW9fdGxiX2xpc3RbaV0gPSArK2NvdW50OworCQkJaW9fdGxiX29yaWdfYWRkcltpXSA9IElOVkFMSURfUEhZU19BRERSOworCQl9CisJCS8qCisJCSAqIFN0ZXAgMjogbWVyZ2UgdGhlIHJldHVybmVkIHNsb3RzIHdpdGggdGhlIHByZWNlZGluZyBzbG90cywKKwkJICogaWYgYXZhaWxhYmxlIChub24gemVybykKKwkJICovCisJCWZvciAoaSA9IGluZGV4IC0gMTsgKE9GRlNFVChpLCBJT19UTEJfU0VHU0laRSkgIT0gSU9fVExCX1NFR1NJWkUgLTEpICYmIGlvX3RsYl9saXN0W2ldOyBpLS0pCisJCQlpb190bGJfbGlzdFtpXSA9ICsrY291bnQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvX3RsYl9sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3RibF91bm1hcF9zaW5nbGUpOworCit2b2lkIHN3aW90bGJfdGJsX3N5bmNfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBwaHlzX2FkZHJfdCB0bGJfYWRkciwKKwkJCSAgICAgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCSAgICAgZW51bSBkbWFfc3luY190YXJnZXQgdGFyZ2V0KQoreworCWludCBpbmRleCA9ICh0bGJfYWRkciAtIGlvX3RsYl9zdGFydCkgPj4gSU9fVExCX1NISUZUOworCXBoeXNfYWRkcl90IG9yaWdfYWRkciA9IGlvX3RsYl9vcmlnX2FkZHJbaW5kZXhdOworCisJaWYgKG9yaWdfYWRkciA9PSBJTlZBTElEX1BIWVNfQUREUikKKwkJcmV0dXJuOworCW9yaWdfYWRkciArPSAodW5zaWduZWQgbG9uZyl0bGJfYWRkciAmICgoMSA8PCBJT19UTEJfU0hJRlQpIC0gMSk7CisKKwlzd2l0Y2ggKHRhcmdldCkgeworCWNhc2UgU1lOQ19GT1JfQ1BVOgorCQlpZiAobGlrZWx5KGRpciA9PSBETUFfRlJPTV9ERVZJQ0UgfHwgZGlyID09IERNQV9CSURJUkVDVElPTkFMKSkKKwkJCXN3aW90bGJfYm91bmNlKG9yaWdfYWRkciwgdGxiX2FkZHIsCisJCQkJICAgICAgIHNpemUsIERNQV9GUk9NX0RFVklDRSk7CisJCWVsc2UKKwkJCUJVR19PTihkaXIgIT0gRE1BX1RPX0RFVklDRSk7CisJCWJyZWFrOworCWNhc2UgU1lOQ19GT1JfREVWSUNFOgorCQlpZiAobGlrZWx5KGRpciA9PSBETUFfVE9fREVWSUNFIHx8IGRpciA9PSBETUFfQklESVJFQ1RJT05BTCkpCisJCQlzd2lvdGxiX2JvdW5jZShvcmlnX2FkZHIsIHRsYl9hZGRyLAorCQkJCSAgICAgICBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJZWxzZQorCQkJQlVHX09OKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3RibF9zeW5jX3NpbmdsZSk7CisKK3ZvaWQgKgorc3dpb3RsYl9hbGxvY19jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsCisJCSAgICAgICBkbWFfYWRkcl90ICpkbWFfaGFuZGxlLCBnZnBfdCBmbGFncykKK3sKKwlib29sIHdhcm4gPSAhKGZsYWdzICYgX19HRlBfTk9XQVJOKTsKKwlkbWFfYWRkcl90IGRldl9hZGRyOworCXZvaWQgKnJldDsKKwlpbnQgb3JkZXIgPSBnZXRfb3JkZXIoc2l6ZSk7CisJdTY0IGRtYV9tYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKKworCWlmIChod2RldiAmJiBod2Rldi0+Y29oZXJlbnRfZG1hX21hc2spCisJCWRtYV9tYXNrID0gaHdkZXYtPmNvaGVyZW50X2RtYV9tYXNrOworCisJcmV0ID0gKHZvaWQgKilfX2dldF9mcmVlX3BhZ2VzKGZsYWdzLCBvcmRlcik7CisJaWYgKHJldCkgeworCQlkZXZfYWRkciA9IHN3aW90bGJfdmlydF90b19idXMoaHdkZXYsIHJldCk7CisJCWlmIChkZXZfYWRkciArIHNpemUgLSAxID4gZG1hX21hc2spIHsKKwkJCS8qCisJCQkgKiBUaGUgYWxsb2NhdGVkIG1lbW9yeSBpc24ndCByZWFjaGFibGUgYnkgdGhlIGRldmljZS4KKwkJCSAqLworCQkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcmV0LCBvcmRlcik7CisJCQlyZXQgPSBOVUxMOworCQl9CisJfQorCWlmICghcmV0KSB7CisJCS8qCisJCSAqIFdlIGFyZSBlaXRoZXIgb3V0IG9mIG1lbW9yeSBvciB0aGUgZGV2aWNlIGNhbid0IERNQSB0bworCQkgKiBHRlBfRE1BIG1lbW9yeTsgZmFsbCBiYWNrIG9uIG1hcF9zaW5nbGUoKSwgd2hpY2gKKwkJICogd2lsbCBncmFiIG1lbW9yeSBmcm9tIHRoZSBsb3dlc3QgYXZhaWxhYmxlIGFkZHJlc3MgcmFuZ2UuCisJCSAqLworCQlwaHlzX2FkZHJfdCBwYWRkciA9IG1hcF9zaW5nbGUoaHdkZXYsIDAsIHNpemUsIERNQV9GUk9NX0RFVklDRSwKKwkJCQkJICAgICAgIHdhcm4gPyAwIDogRE1BX0FUVFJfTk9fV0FSTik7CisJCWlmIChwYWRkciA9PSBTV0lPVExCX01BUF9FUlJPUikKKwkJCWdvdG8gZXJyX3dhcm47CisKKwkJcmV0ID0gcGh5c190b192aXJ0KHBhZGRyKTsKKwkJZGV2X2FkZHIgPSBzd2lvdGxiX3BoeXNfdG9fZG1hKGh3ZGV2LCBwYWRkcik7CisKKwkJLyogQ29uZmlybSBhZGRyZXNzIGNhbiBiZSBETUEnZCBieSBkZXZpY2UgKi8KKwkJaWYgKGRldl9hZGRyICsgc2l6ZSAtIDEgPiBkbWFfbWFzaykgeworCQkJcHJpbnRrKCJod2RldiBETUEgbWFzayA9IDB4JTAxNkx4LCBkZXZfYWRkciA9IDB4JTAxNkx4XG4iLAorCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZG1hX21hc2ssCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZfYWRkcik7CisKKwkJCS8qCisJCQkgKiBETUFfVE9fREVWSUNFIHRvIGF2b2lkIG1lbWNweSBpbiB1bm1hcF9zaW5nbGUuCisJCQkgKiBUaGUgRE1BX0FUVFJfU0tJUF9DUFVfU1lOQyBpcyBvcHRpb25hbC4KKwkJCSAqLworCQkJc3dpb3RsYl90YmxfdW5tYXBfc2luZ2xlKGh3ZGV2LCBwYWRkciwKKwkJCQkJCSBzaXplLCBETUFfVE9fREVWSUNFLAorCQkJCQkJIERNQV9BVFRSX1NLSVBfQ1BVX1NZTkMpOworCQkJZ290byBlcnJfd2FybjsKKwkJfQorCX0KKworCSpkbWFfaGFuZGxlID0gZGV2X2FkZHI7CisJbWVtc2V0KHJldCwgMCwgc2l6ZSk7CisKKwlyZXR1cm4gcmV0OworCitlcnJfd2FybjoKKwlpZiAod2FybiAmJiBwcmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJcHJfd2FybigiY29oZXJlbnQgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGRldmljZSAlcyBzaXplPSV6dVxuIiwKKwkJCWRldl9uYW1lKGh3ZGV2KSwgc2l6ZSk7CisJCWR1bXBfc3RhY2soKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9hbGxvY19jb2hlcmVudCk7CisKK3ZvaWQKK3N3aW90bGJfZnJlZV9jb2hlcmVudChzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc2l6ZV90IHNpemUsIHZvaWQgKnZhZGRyLAorCQkgICAgICBkbWFfYWRkcl90IGRldl9hZGRyKQoreworCXBoeXNfYWRkcl90IHBhZGRyID0gZG1hX3RvX3BoeXMoaHdkZXYsIGRldl9hZGRyKTsKKworCVdBUk5fT04oaXJxc19kaXNhYmxlZCgpKTsKKwlpZiAoIWlzX3N3aW90bGJfYnVmZmVyKHBhZGRyKSkKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKKwllbHNlCisJCS8qCisJCSAqIERNQV9UT19ERVZJQ0UgdG8gYXZvaWQgbWVtY3B5IGluIHN3aW90bGJfdGJsX3VubWFwX3NpbmdsZS4KKwkJICogRE1BX0FUVFJfU0tJUF9DUFVfU1lOQyBpcyBvcHRpb25hbC4KKwkJICovCisJCXN3aW90bGJfdGJsX3VubWFwX3NpbmdsZShod2RldiwgcGFkZHIsIHNpemUsIERNQV9UT19ERVZJQ0UsCisJCQkJCSBETUFfQVRUUl9TS0lQX0NQVV9TWU5DKTsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9mcmVlX2NvaGVyZW50KTsKKworc3RhdGljIHZvaWQKK3N3aW90bGJfZnVsbChzdHJ1Y3QgZGV2aWNlICpkZXYsIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJICAgICBpbnQgZG9fcGFuaWMpCit7CisJaWYgKHN3aW90bGJfZm9yY2UgPT0gU1dJT1RMQl9OT19GT1JDRSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSYW4gb3V0IG9mIElPTU1VIHNwYWNlIGZvciB0aGlzIG9wZXJhdGlvbi4gVGhpcyBpcyB2ZXJ5IGJhZC4KKwkgKiBVbmZvcnR1bmF0ZWx5IHRoZSBkcml2ZXJzIGNhbm5vdCBoYW5kbGUgdGhpcyBvcGVyYXRpb24gcHJvcGVybHkuCisJICogdW5sZXNzIHRoZXkgY2hlY2sgZm9yIGRtYV9tYXBwaW5nX2Vycm9yIChtb3N0IGRvbid0KQorCSAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgc21hbGwgZW5vdWdoIHJldHVybiBhIHN0YXRpYyBidWZmZXIgdG8gbGltaXQKKwkgKiB0aGUgZGFtYWdlLCBvciBwYW5pYyB3aGVuIHRoZSB0cmFuc2ZlciBpcyB0b28gYmlnLgorCSAqLworCWRldl9lcnJfcmF0ZWxpbWl0ZWQoZGV2LCAiRE1BOiBPdXQgb2YgU1ctSU9NTVUgc3BhY2UgZm9yICV6dSBieXRlc1xuIiwKKwkJCSAgICBzaXplKTsKKworCWlmIChzaXplIDw9IGlvX3RsYl9vdmVyZmxvdyB8fCAhZG9fcGFuaWMpCisJCXJldHVybjsKKworCWlmIChkaXIgPT0gRE1BX0JJRElSRUNUSU9OQUwpCisJCXBhbmljKCJETUE6IFJhbmRvbSBtZW1vcnkgY291bGQgYmUgRE1BIGFjY2Vzc2VkXG4iKTsKKwlpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKKwkJcGFuaWMoIkRNQTogUmFuZG9tIG1lbW9yeSBjb3VsZCBiZSBETUEgd3JpdHRlblxuIik7CisJaWYgKGRpciA9PSBETUFfVE9fREVWSUNFKQorCQlwYW5pYygiRE1BOiBSYW5kb20gbWVtb3J5IGNvdWxkIGJlIERNQSByZWFkXG4iKTsKK30KKworLyoKKyAqIE1hcCBhIHNpbmdsZSBidWZmZXIgb2YgdGhlIGluZGljYXRlZCBzaXplIGZvciBETUEgaW4gc3RyZWFtaW5nIG1vZGUuICBUaGUKKyAqIHBoeXNpY2FsIGFkZHJlc3MgdG8gdXNlIGlzIHJldHVybmVkLgorICoKKyAqIE9uY2UgdGhlIGRldmljZSBpcyBnaXZlbiB0aGUgZG1hIGFkZHJlc3MsIHRoZSBkZXZpY2Ugb3ducyB0aGlzIG1lbW9yeSB1bnRpbAorICogZWl0aGVyIHN3aW90bGJfdW5tYXBfcGFnZSBvciBzd2lvdGxiX2RtYV9zeW5jX3NpbmdsZSBpcyBwZXJmb3JtZWQuCisgKi8KK2RtYV9hZGRyX3Qgc3dpb3RsYl9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKwkJCSAgICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCQkgICAgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlwaHlzX2FkZHJfdCBtYXAsIHBoeXMgPSBwYWdlX3RvX3BoeXMocGFnZSkgKyBvZmZzZXQ7CisJZG1hX2FkZHJfdCBkZXZfYWRkciA9IHBoeXNfdG9fZG1hKGRldiwgcGh5cyk7CisKKwlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKwkvKgorCSAqIElmIHRoZSBhZGRyZXNzIGhhcHBlbnMgdG8gYmUgaW4gdGhlIGRldmljZSdzIERNQSB3aW5kb3csCisJICogd2UgY2FuIHNhZmVseSByZXR1cm4gdGhlIGRldmljZSBhZGRyIGFuZCBub3Qgd29ycnkgYWJvdXQgYm91bmNlCisJICogYnVmZmVyaW5nIGl0LgorCSAqLworCWlmIChkbWFfY2FwYWJsZShkZXYsIGRldl9hZGRyLCBzaXplKSAmJiBzd2lvdGxiX2ZvcmNlICE9IFNXSU9UTEJfRk9SQ0UpCisJCXJldHVybiBkZXZfYWRkcjsKKworCXRyYWNlX3N3aW90bGJfYm91bmNlZChkZXYsIGRldl9hZGRyLCBzaXplLCBzd2lvdGxiX2ZvcmNlKTsKKworCS8qIE9oIHdlbGwsIGhhdmUgdG8gYWxsb2NhdGUgYW5kIG1hcCBhIGJvdW5jZSBidWZmZXIuICovCisJbWFwID0gbWFwX3NpbmdsZShkZXYsIHBoeXMsIHNpemUsIGRpciwgYXR0cnMpOworCWlmIChtYXAgPT0gU1dJT1RMQl9NQVBfRVJST1IpIHsKKwkJc3dpb3RsYl9mdWxsKGRldiwgc2l6ZSwgZGlyLCAxKTsKKwkJcmV0dXJuIHN3aW90bGJfcGh5c190b19kbWEoZGV2LCBpb190bGJfb3ZlcmZsb3dfYnVmZmVyKTsKKwl9CisKKwlkZXZfYWRkciA9IHN3aW90bGJfcGh5c190b19kbWEoZGV2LCBtYXApOworCisJLyogRW5zdXJlIHRoYXQgdGhlIGFkZHJlc3MgcmV0dXJuZWQgaXMgRE1BJ2JsZSAqLworCWlmIChkbWFfY2FwYWJsZShkZXYsIGRldl9hZGRyLCBzaXplKSkKKwkJcmV0dXJuIGRldl9hZGRyOworCisJYXR0cnMgfD0gRE1BX0FUVFJfU0tJUF9DUFVfU1lOQzsKKwlzd2lvdGxiX3RibF91bm1hcF9zaW5nbGUoZGV2LCBtYXAsIHNpemUsIGRpciwgYXR0cnMpOworCisJcmV0dXJuIHN3aW90bGJfcGh5c190b19kbWEoZGV2LCBpb190bGJfb3ZlcmZsb3dfYnVmZmVyKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfbWFwX3BhZ2UpOworCisvKgorICogVW5tYXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAgVGhlIGRtYV9hZGRyIGFuZCBzaXplIG11c3QKKyAqIG1hdGNoIHdoYXQgd2FzIHByb3ZpZGVkIGZvciBpbiBhIHByZXZpb3VzIHN3aW90bGJfbWFwX3BhZ2UgY2FsbC4gIEFsbAorICogb3RoZXIgdXNhZ2VzIGFyZSB1bmRlZmluZWQuCisgKgorICogQWZ0ZXIgdGhpcyBjYWxsLCByZWFkcyBieSB0aGUgY3B1IHRvIHRoZSBidWZmZXIgYXJlIGd1YXJhbnRlZWQgdG8gc2VlCisgKiB3aGF0ZXZlciB0aGUgZGV2aWNlIHdyb3RlIHRoZXJlLgorICovCitzdGF0aWMgdm9pZCB1bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCQkgc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCSB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCXBoeXNfYWRkcl90IHBhZGRyID0gZG1hX3RvX3BoeXMoaHdkZXYsIGRldl9hZGRyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJaWYgKGlzX3N3aW90bGJfYnVmZmVyKHBhZGRyKSkgeworCQlzd2lvdGxiX3RibF91bm1hcF9zaW5nbGUoaHdkZXYsIHBhZGRyLCBzaXplLCBkaXIsIGF0dHJzKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkaXIgIT0gRE1BX0ZST01fREVWSUNFKQorCQlyZXR1cm47CisKKwkvKgorCSAqIHBoeXNfdG9fdmlydCBkb2Vzbid0IHdvcmsgd2l0aCBoaWhnbWVtIHBhZ2UgYnV0IHdlIGNvdWxkCisJICogY2FsbCBkbWFfbWFya19jbGVhbigpIHdpdGggaGloZ21lbSBwYWdlIGhlcmUuIEhvd2V2ZXIsIHdlCisJICogYXJlIGZpbmUgc2luY2UgZG1hX21hcmtfY2xlYW4oKSBpcyBudWxsIG9uIFBPV0VSUEMuIFdlIGNhbgorCSAqIG1ha2UgZG1hX21hcmtfY2xlYW4oKSB0YWtlIGEgcGh5c2ljYWwgYWRkcmVzcyBpZiBuZWNlc3NhcnkuCisJICovCisJZG1hX21hcmtfY2xlYW4ocGh5c190b192aXJ0KHBhZGRyKSwgc2l6ZSk7Cit9CisKK3ZvaWQgc3dpb3RsYl91bm1hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJc2l6ZV90IHNpemUsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwKKwkJCXVuc2lnbmVkIGxvbmcgYXR0cnMpCit7CisJdW5tYXBfc2luZ2xlKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSwgZGlyLCBhdHRycyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzd2lvdGxiX3VubWFwX3BhZ2UpOworCisvKgorICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uCisgKiBhZnRlciBhIHRyYW5zZmVyLgorICoKKyAqIElmIHlvdSBwZXJmb3JtIGEgc3dpb3RsYl9tYXBfcGFnZSgpIGJ1dCB3aXNoIHRvIGludGVycm9nYXRlIHRoZSBidWZmZXIKKyAqIHVzaW5nIHRoZSBjcHUsIHlldCBkbyBub3Qgd2lzaCB0byB0ZWFyZG93biB0aGUgZG1hIG1hcHBpbmcsIHlvdSBtdXN0CisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGRvaW5nIHNvLiAgQXQgdGhlIG5leHQgcG9pbnQgeW91IGdpdmUgdGhlIGRtYQorICogYWRkcmVzcyBiYWNrIHRvIHRoZSBjYXJkLCB5b3UgbXVzdCBmaXJzdCBwZXJmb3JtIGEKKyAqIHN3aW90bGJfZG1hX3N5bmNfZm9yX2RldmljZSwgYW5kIHRoZW4gdGhlIGRldmljZSBhZ2FpbiBvd25zIHRoZSBidWZmZXIKKyAqLworc3RhdGljIHZvaWQKK3N3aW90bGJfc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCisJCSAgICBzaXplX3Qgc2l6ZSwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQkgICAgZW51bSBkbWFfc3luY190YXJnZXQgdGFyZ2V0KQoreworCXBoeXNfYWRkcl90IHBhZGRyID0gZG1hX3RvX3BoeXMoaHdkZXYsIGRldl9hZGRyKTsKKworCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOworCisJaWYgKGlzX3N3aW90bGJfYnVmZmVyKHBhZGRyKSkgeworCQlzd2lvdGxiX3RibF9zeW5jX3NpbmdsZShod2RldiwgcGFkZHIsIHNpemUsIGRpciwgdGFyZ2V0KTsKKwkJcmV0dXJuOworCX0KKworCWlmIChkaXIgIT0gRE1BX0ZST01fREVWSUNFKQorCQlyZXR1cm47CisKKwlkbWFfbWFya19jbGVhbihwaHlzX3RvX3ZpcnQocGFkZHIpLCBzaXplKTsKK30KKwordm9pZAorc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NpbmdsZShod2RldiwgZGV2X2FkZHIsIHNpemUsIGRpciwgU1lOQ19GT1JfQ1BVKTsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfY3B1KTsKKwordm9pZAorc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJICAgICAgIHNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCit7CisJc3dpb3RsYl9zeW5jX3NpbmdsZShod2RldiwgZGV2X2FkZHIsIHNpemUsIGRpciwgU1lOQ19GT1JfREVWSUNFKTsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKTsKKworLyoKKyAqIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBzY2F0dGVybGlzdCBpbiBzdHJlYW1pbmcgbW9kZSBmb3IgRE1BLgorICogVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUgYWJvdmUgc3dpb3RsYl9tYXBfcGFnZQorICogaW50ZXJmYWNlLiAgSGVyZSB0aGUgc2NhdHRlciBnYXRoZXIgbGlzdCBlbGVtZW50cyBhcmUgZWFjaCB0YWdnZWQgd2l0aCB0aGUKKyAqIGFwcHJvcHJpYXRlIGRtYSBhZGRyZXNzIGFuZCBsZW5ndGguICBUaGV5IGFyZSBvYnRhaW5lZCB2aWEKKyAqIHNnX2RtYV97YWRkcmVzcyxsZW5ndGh9KFNHKS4KKyAqCisgKiBOT1RFOiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgYWJsZSB0byB1c2UgYSBzbWFsbGVyIG51bWJlciBvZgorICogICAgICAgRE1BIGFkZHJlc3MvbGVuZ3RoIHBhaXJzIHRoYW4gdGhlcmUgYXJlIFNHIHRhYmxlIGVsZW1lbnRzLgorICogICAgICAgKGZvciBleGFtcGxlIHZpYSB2aXJ0dWFsIG1hcHBpbmcgY2FwYWJpbGl0aWVzKQorICogICAgICAgVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGFkZHIvbGVuZ3RoIHBhaXJzIGFjdHVhbGx5CisgKiAgICAgICB1c2VkLCBhdCBtb3N0IG5lbnRzLgorICoKKyAqIERldmljZSBvd25lcnNoaXAgaXNzdWVzIGFzIG1lbnRpb25lZCBhYm92ZSBmb3Igc3dpb3RsYl9tYXBfcGFnZSBhcmUgdGhlCisgKiBzYW1lIGhlcmUuCisgKi8KK2ludAorc3dpb3RsYl9tYXBfc2dfYXR0cnMoc3RydWN0IGRldmljZSAqaHdkZXYsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCBpbnQgbmVsZW1zLAorCQkgICAgIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyBhdHRycykKK3sKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBpOworCisJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CisKKwlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpIHsKKwkJcGh5c19hZGRyX3QgcGFkZHIgPSBzZ19waHlzKHNnKTsKKwkJZG1hX2FkZHJfdCBkZXZfYWRkciA9IHBoeXNfdG9fZG1hKGh3ZGV2LCBwYWRkcik7CisKKwkJaWYgKHN3aW90bGJfZm9yY2UgPT0gU1dJT1RMQl9GT1JDRSB8fAorCQkgICAgIWRtYV9jYXBhYmxlKGh3ZGV2LCBkZXZfYWRkciwgc2ctPmxlbmd0aCkpIHsKKwkJCXBoeXNfYWRkcl90IG1hcCA9IG1hcF9zaW5nbGUoaHdkZXYsIHNnX3BoeXMoc2cpLAorCQkJCQkJICAgICBzZy0+bGVuZ3RoLCBkaXIsIGF0dHJzKTsKKwkJCWlmIChtYXAgPT0gU1dJT1RMQl9NQVBfRVJST1IpIHsKKwkJCQkvKiBEb24ndCBwYW5pYyBoZXJlLCB3ZSBleHBlY3QgbWFwX3NnIHVzZXJzCisJCQkJICAgdG8gZG8gcHJvcGVyIGVycm9yIGhhbmRsaW5nLiAqLworCQkJCXN3aW90bGJfZnVsbChod2Rldiwgc2ctPmxlbmd0aCwgZGlyLCAwKTsKKwkJCQlhdHRycyB8PSBETUFfQVRUUl9TS0lQX0NQVV9TWU5DOworCQkJCXN3aW90bGJfdW5tYXBfc2dfYXR0cnMoaHdkZXYsIHNnbCwgaSwgZGlyLAorCQkJCQkJICAgICAgIGF0dHJzKTsKKwkJCQlzZ19kbWFfbGVuKHNnbCkgPSAwOworCQkJCXJldHVybiAwOworCQkJfQorCQkJc2ctPmRtYV9hZGRyZXNzID0gc3dpb3RsYl9waHlzX3RvX2RtYShod2RldiwgbWFwKTsKKwkJfSBlbHNlCisJCQlzZy0+ZG1hX2FkZHJlc3MgPSBkZXZfYWRkcjsKKwkJc2dfZG1hX2xlbihzZykgPSBzZy0+bGVuZ3RoOworCX0KKwlyZXR1cm4gbmVsZW1zOworfQorRVhQT1JUX1NZTUJPTChzd2lvdGxiX21hcF9zZ19hdHRycyk7CisKKy8qCisgKiBVbm1hcCBhIHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zLiAgQWdhaW4sIGNwdSByZWFkIHJ1bGVzCisgKiBjb25jZXJuaW5nIGNhbGxzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIGZvciBzd2lvdGxiX3VubWFwX3BhZ2UoKSBhYm92ZS4KKyAqLwordm9pZAorc3dpb3RsYl91bm1hcF9zZ19hdHRycyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCSAgICAgICBpbnQgbmVsZW1zLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGF0dHJzKQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJaW50IGk7CisKKwlCVUdfT04oZGlyID09IERNQV9OT05FKTsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkKKwkJdW5tYXBfc2luZ2xlKGh3ZGV2LCBzZy0+ZG1hX2FkZHJlc3MsIHNnX2RtYV9sZW4oc2cpLCBkaXIsCisJCQkgICAgIGF0dHJzKTsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zZ19hdHRycyk7CisKKy8qCisgKiBNYWtlIHBoeXNpY2FsIG1lbW9yeSBjb25zaXN0ZW50IGZvciBhIHNldCBvZiBzdHJlYW1pbmcgbW9kZSBETUEgdHJhbnNsYXRpb25zCisgKiBhZnRlciBhIHRyYW5zZmVyLgorICoKKyAqIFRoZSBzYW1lIGFzIHN3aW90bGJfc3luY19zaW5nbGVfKiBidXQgZm9yIGEgc2NhdHRlci1nYXRoZXIgbGlzdCwgc2FtZSBydWxlcworICogYW5kIHVzYWdlLgorICovCitzdGF0aWMgdm9pZAorc3dpb3RsYl9zeW5jX3NnKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKKwkJaW50IG5lbGVtcywgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyLAorCQllbnVtIGRtYV9zeW5jX3RhcmdldCB0YXJnZXQpCit7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkKKwkJc3dpb3RsYl9zeW5jX3NpbmdsZShod2Rldiwgc2ctPmRtYV9hZGRyZXNzLAorCQkJCSAgICBzZ19kbWFfbGVuKHNnKSwgZGlyLCB0YXJnZXQpOworfQorCit2b2lkCitzd2lvdGxiX3N5bmNfc2dfZm9yX2NwdShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCWludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzd2lvdGxiX3N5bmNfc2coaHdkZXYsIHNnLCBuZWxlbXMsIGRpciwgU1lOQ19GT1JfQ1BVKTsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NnX2Zvcl9jcHUpOworCit2b2lkCitzd2lvdGxiX3N5bmNfc2dfZm9yX2RldmljZShzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKKwkJCSAgIGludCBuZWxlbXMsIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcikKK3sKKwlzd2lvdGxiX3N5bmNfc2coaHdkZXYsIHNnLCBuZWxlbXMsIGRpciwgU1lOQ19GT1JfREVWSUNFKTsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9zeW5jX3NnX2Zvcl9kZXZpY2UpOworCitpbnQKK3N3aW90bGJfZG1hX21hcHBpbmdfZXJyb3Ioc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJcmV0dXJuIChkbWFfYWRkciA9PSBzd2lvdGxiX3BoeXNfdG9fZG1hKGh3ZGV2LCBpb190bGJfb3ZlcmZsb3dfYnVmZmVyKSk7Cit9CitFWFBPUlRfU1lNQk9MKHN3aW90bGJfZG1hX21hcHBpbmdfZXJyb3IpOworCisvKgorICogUmV0dXJuIHdoZXRoZXIgdGhlIGdpdmVuIGRldmljZSBETUEgYWRkcmVzcyBtYXNrIGNhbiBiZSBzdXBwb3J0ZWQKKyAqIHByb3Blcmx5LiAgRm9yIGV4YW1wbGUsIGlmIHlvdXIgZGV2aWNlIGNhbiBvbmx5IGRyaXZlIHRoZSBsb3cgMjQtYml0cworICogZHVyaW5nIGJ1cyBtYXN0ZXJpbmcsIHRoZW4geW91IHdvdWxkIHBhc3MgMHgwMGZmZmZmZiBhcyB0aGUgbWFzayB0bworICogdGhpcyBmdW5jdGlvbi4KKyAqLworaW50Citzd2lvdGxiX2RtYV9zdXBwb3J0ZWQoc3RydWN0IGRldmljZSAqaHdkZXYsIHU2NCBtYXNrKQoreworCXJldHVybiBzd2lvdGxiX3BoeXNfdG9fZG1hKGh3ZGV2LCBpb190bGJfZW5kIC0gMSkgPD0gbWFzazsKK30KK0VYUE9SVF9TWU1CT0woc3dpb3RsYl9kbWFfc3VwcG9ydGVkKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N5c2NhbGwuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3N5c2NhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTcwNzdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvc3lzY2FsbC5jCkBAIC0wLDAgKzEsODggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC90YXNrX3N0YWNrLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGwuaD4KKworc3RhdGljIGludCBjb2xsZWN0X3N5c2NhbGwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGxvbmcgKmNhbGxubywKKwkJCSAgIHVuc2lnbmVkIGxvbmcgYXJnc1s2XSwgdW5zaWduZWQgaW50IG1heGFyZ3MsCisJCQkgICB1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyAqcGMpCit7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3M7CisKKwlpZiAoIXRyeV9nZXRfdGFza19zdGFjayh0YXJnZXQpKSB7CisJCS8qIFRhc2sgaGFzIG5vIHN0YWNrLCBzbyB0aGUgdGFzayBpc24ndCBpbiBhIHN5c2NhbGwuICovCisJCSpzcCA9ICpwYyA9IDA7CisJCSpjYWxsbm8gPSAtMTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmVncyA9IHRhc2tfcHRfcmVncyh0YXJnZXQpOworCWlmICh1bmxpa2VseSghcmVncykpIHsKKwkJcHV0X3Rhc2tfc3RhY2sodGFyZ2V0KTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJKnNwID0gdXNlcl9zdGFja19wb2ludGVyKHJlZ3MpOworCSpwYyA9IGluc3RydWN0aW9uX3BvaW50ZXIocmVncyk7CisKKwkqY2FsbG5vID0gc3lzY2FsbF9nZXRfbnIodGFyZ2V0LCByZWdzKTsKKwlpZiAoKmNhbGxubyAhPSAtMUwgJiYgbWF4YXJncyA+IDApCisJCXN5c2NhbGxfZ2V0X2FyZ3VtZW50cyh0YXJnZXQsIHJlZ3MsIDAsIG1heGFyZ3MsIGFyZ3MpOworCisJcHV0X3Rhc2tfc3RhY2sodGFyZ2V0KTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB0YXNrX2N1cnJlbnRfc3lzY2FsbCAtIERpc2NvdmVyIHdoYXQgYSBibG9ja2VkIHRhc2sgaXMgZG9pbmcuCisgKiBAdGFyZ2V0OgkJdGhyZWFkIHRvIGV4YW1pbmUKKyAqIEBjYWxsbm86CQlmaWxsZWQgd2l0aCBzeXN0ZW0gY2FsbCBudW1iZXIgb3IgLTEKKyAqIEBhcmdzOgkJZmlsbGVkIHdpdGggQG1heGFyZ3Mgc3lzdGVtIGNhbGwgYXJndW1lbnRzCisgKiBAbWF4YXJnczoJCW51bWJlciBvZiBlbGVtZW50cyBpbiBAYXJncyB0byBmaWxsCisgKiBAc3A6CQkJZmlsbGVkIHdpdGggdXNlciBzdGFjayBwb2ludGVyCisgKiBAcGM6CQkJZmlsbGVkIHdpdGggdXNlciBQQworICoKKyAqIElmIEB0YXJnZXQgaXMgYmxvY2tlZCBpbiBhIHN5c3RlbSBjYWxsLCByZXR1cm5zIHplcm8gd2l0aCAqQGNhbGxubworICogc2V0IHRvIHRoZSB0aGUgY2FsbCdzIG51bWJlciBhbmQgQGFyZ3MgZmlsbGVkIGluIHdpdGggaXRzIGFyZ3VtZW50cy4KKyAqIFJlZ2lzdGVycyBub3QgdXNlZCBmb3Igc3lzdGVtIGNhbGwgYXJndW1lbnRzIG1heSBub3QgYmUgYXZhaWxhYmxlIGFuZAorICogaXQgaXMgbm90IGtvc2hlciB0byB1c2UgJnN0cnVjdCB1c2VyX3JlZ3NldCBjYWxscyB3aGlsZSB0aGUgc3lzdGVtCisgKiBjYWxsIGlzIHN0aWxsIGluIHByb2dyZXNzLiAgTm90ZSB3ZSBtYXkgZ2V0IHRoaXMgcmVzdWx0IGlmIEB0YXJnZXQKKyAqIGhhcyBmaW5pc2hlZCBpdHMgc3lzdGVtIGNhbGwgYnV0IG5vdCB5ZXQgcmV0dXJuZWQgdG8gdXNlciBtb2RlLCBzdWNoCisgKiBhcyB3aGVuIGl0J3Mgc3RvcHBlZCBmb3Igc2lnbmFsIGhhbmRsaW5nIG9yIHN5c2NhbGwgZXhpdCB0cmFjaW5nLgorICoKKyAqIElmIEB0YXJnZXQgaXMgYmxvY2tlZCBpbiB0aGUga2VybmVsIGR1cmluZyBhIGZhdWx0IG9yIGV4Y2VwdGlvbiwKKyAqIHJldHVybnMgemVybyB3aXRoICpAY2FsbG5vIHNldCB0byAtMSBhbmQgZG9lcyBub3QgZmlsbCBpbiBAYXJncy4KKyAqIElmIHNvLCBpdCdzIG5vdyBzYWZlIHRvIGV4YW1pbmUgQHRhcmdldCB1c2luZyAmc3RydWN0IHVzZXJfcmVnc2V0CisgKiBnZXQoKSBjYWxscyBhcyBsb25nIGFzIHdlJ3JlIHN1cmUgQHRhcmdldCB3b24ndCByZXR1cm4gdG8gdXNlciBtb2RlLgorICoKKyAqIFJldHVybnMgLSVFQUdBSU4gaWYgQHRhcmdldCBkb2VzIG5vdCByZW1haW4gYmxvY2tlZC4KKyAqCisgKiBSZXR1cm5zIC0lRUlOVkFMIGlmIEBtYXhhcmdzIGlzIHRvbyBsYXJnZSAobWF4aW11bSBpcyBzaXgpLgorICovCitpbnQgdGFza19jdXJyZW50X3N5c2NhbGwoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsIGxvbmcgKmNhbGxubywKKwkJCSB1bnNpZ25lZCBsb25nIGFyZ3NbNl0sIHVuc2lnbmVkIGludCBtYXhhcmdzLAorCQkJIHVuc2lnbmVkIGxvbmcgKnNwLCB1bnNpZ25lZCBsb25nICpwYykKK3sKKwlsb25nIHN0YXRlOworCXVuc2lnbmVkIGxvbmcgbmNzdzsKKworCWlmICh1bmxpa2VseShtYXhhcmdzID4gNikpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRhcmdldCA9PSBjdXJyZW50KQorCQlyZXR1cm4gY29sbGVjdF9zeXNjYWxsKHRhcmdldCwgY2FsbG5vLCBhcmdzLCBtYXhhcmdzLCBzcCwgcGMpOworCisJc3RhdGUgPSB0YXJnZXQtPnN0YXRlOworCWlmICh1bmxpa2VseSghc3RhdGUpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCW5jc3cgPSB3YWl0X3Rhc2tfaW5hY3RpdmUodGFyZ2V0LCBzdGF0ZSk7CisJaWYgKHVubGlrZWx5KCFuY3N3KSB8fAorCSAgICB1bmxpa2VseShjb2xsZWN0X3N5c2NhbGwodGFyZ2V0LCBjYWxsbm8sIGFyZ3MsIG1heGFyZ3MsIHNwLCBwYykpIHx8CisJICAgIHVubGlrZWx5KHdhaXRfdGFza19pbmFjdGl2ZSh0YXJnZXQsIHN0YXRlKSAhPSBuY3N3KSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Qta3N0cnRveC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdC1rc3RydG94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1NWY2NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Qta3N0cnRveC5jCkBAIC0wLDAgKzEsNzM1IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjZGVmaW5lIGZvcl9lYWNoX3Rlc3QoaSwgdGVzdCkJXAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3QpOyBpKyspCisKK3N0cnVjdCB0ZXN0X2ZhaWwgeworCWNvbnN0IGNoYXIgKnN0cjsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKK307CisKKyNkZWZpbmUgREVGSU5FX1RFU1RfRkFJTCh0ZXN0KQlcCisJY29uc3Qgc3RydWN0IHRlc3RfZmFpbCB0ZXN0W10gX19pbml0Y29uc3QKKworI2RlZmluZSBERUNMQVJFX1RFU1RfT0sodHlwZSwgdGVzdF90eXBlKQlcCisJdGVzdF90eXBlIHsJCQkJXAorCQljb25zdCBjaGFyICpzdHI7CQlcCisJCXVuc2lnbmVkIGludCBiYXNlOwkJXAorCQl0eXBlIGV4cGVjdGVkX3JlczsJCVwKKwl9CisKKyNkZWZpbmUgREVGSU5FX1RFU1RfT0sodHlwZSwgdGVzdCkJXAorCWNvbnN0IHR5cGUgdGVzdFtdIF9faW5pdGNvbnN0CisKKyNkZWZpbmUgVEVTVF9GQUlMKGZuLCB0eXBlLCBmbXQsIHRlc3QpCQkJCQlcCit7CQkJCQkJCQkJXAorCXVuc2lnbmVkIGludCBpOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJZm9yX2VhY2hfdGVzdChpLCB0ZXN0KSB7CQkJCQlcCisJCWNvbnN0IHN0cnVjdCB0ZXN0X2ZhaWwgKnQgPSAmdGVzdFtpXTsJCQlcCisJCXR5cGUgdG1wOwkJCQkJCVwKKwkJaW50IHJ2OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJCXRtcCA9IDA7CQkJCQkJXAorCQlydiA9IGZuKHQtPnN0ciwgdC0+YmFzZSwgJnRtcCk7CQkJCVwKKwkJaWYgKHJ2ID49IDApIHsJCQkJCQlcCisJCQlXQVJOKDEsICJzdHIgJyVzJywgYmFzZSAldSwgZXhwZWN0ZWQgLUUsIGdvdCAlZC8iIGZtdCAiXG4iLAlcCisJCQkJdC0+c3RyLCB0LT5iYXNlLCBydiwgdG1wKTsJCVwKKwkJCWNvbnRpbnVlOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKKyNkZWZpbmUgVEVTVF9PSyhmbiwgdHlwZSwgZm10LCB0ZXN0KQkJCQkJXAorewkJCQkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgaTsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWZvcl9lYWNoX3Rlc3QoaSwgdGVzdCkgewkJCQkJXAorCQljb25zdCB0eXBlb2YodGVzdFswXSkgKnQgPSAmdGVzdFtpXTsJCQlcCisJCXR5cGUgcmVzOwkJCQkJCVwKKwkJaW50IHJ2OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJCXJ2ID0gZm4odC0+c3RyLCB0LT5iYXNlLCAmcmVzKTsJCQkJXAorCQlpZiAocnYgIT0gMCkgewkJCQkJCVwKKwkJCVdBUk4oMSwgInN0ciAnJXMnLCBiYXNlICV1LCBleHBlY3RlZCAwLyIgZm10ICIsIGdvdCAlZFxuIiwJXAorCQkJCXQtPnN0ciwgdC0+YmFzZSwgdC0+ZXhwZWN0ZWRfcmVzLCBydik7CVwKKwkJCWNvbnRpbnVlOwkJCQkJXAorCQl9CQkJCQkJCVwKKwkJaWYgKHJlcyAhPSB0LT5leHBlY3RlZF9yZXMpIHsJCQkJXAorCQkJV0FSTigxLCAic3RyICclcycsIGJhc2UgJXUsIGV4cGVjdGVkICIgZm10ICIsIGdvdCAiIGZtdCAiXG4iLAlcCisJCQkJdC0+c3RyLCB0LT5iYXNlLCB0LT5leHBlY3RlZF9yZXMsIHJlcyk7CVwKKwkJCWNvbnRpbnVlOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9CQkJCQkJCQlcCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3VsbF9vayh2b2lkKQoreworCURFQ0xBUkVfVEVTVF9PSyh1bnNpZ25lZCBsb25nIGxvbmcsIHN0cnVjdCB0ZXN0X3VsbCk7CisJc3RhdGljIERFRklORV9URVNUX09LKHN0cnVjdCB0ZXN0X3VsbCwgdGVzdF91bGxfb2spID0geworCQl7IjAiLAkxMCwJMFVMTH0sCisJCXsiMSIsCTEwLAkxVUxMfSwKKwkJeyIxMjciLAkxMCwJMTI3VUxMfSwKKwkJeyIxMjgiLAkxMCwJMTI4VUxMfSwKKwkJeyIxMjkiLAkxMCwJMTI5VUxMfSwKKwkJeyIyNTUiLAkxMCwJMjU1VUxMfSwKKwkJeyIyNTYiLAkxMCwJMjU2VUxMfSwKKwkJeyIyNTciLAkxMCwJMjU3VUxMfSwKKwkJeyIzMjc2NyIsCTEwLAkzMjc2N1VMTH0sCisJCXsiMzI3NjgiLAkxMCwJMzI3NjhVTEx9LAorCQl7IjMyNzY5IiwJMTAsCTMyNzY5VUxMfSwKKwkJeyI2NTUzNSIsCTEwLAk2NTUzNVVMTH0sCisJCXsiNjU1MzYiLAkxMCwJNjU1MzZVTEx9LAorCQl7IjY1NTM3IiwJMTAsCTY1NTM3VUxMfSwKKwkJeyIyMTQ3NDgzNjQ3IiwJMTAsCTIxNDc0ODM2NDdVTEx9LAorCQl7IjIxNDc0ODM2NDgiLAkxMCwJMjE0NzQ4MzY0OFVMTH0sCisJCXsiMjE0NzQ4MzY0OSIsCTEwLAkyMTQ3NDgzNjQ5VUxMfSwKKwkJeyI0Mjk0OTY3Mjk1IiwJMTAsCTQyOTQ5NjcyOTVVTEx9LAorCQl7IjQyOTQ5NjcyOTYiLAkxMCwJNDI5NDk2NzI5NlVMTH0sCisJCXsiNDI5NDk2NzI5NyIsCTEwLAk0Mjk0OTY3Mjk3VUxMfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA3IiwJMTAsCTkyMjMzNzIwMzY4NTQ3NzU4MDdVTEx9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDgiLAkxMCwJOTIyMzM3MjAzNjg1NDc3NTgwOFVMTH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOSIsCTEwLAk5MjIzMzcyMDM2ODU0Nzc1ODA5VUxMfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNCIsCTEwLAkxODQ0Njc0NDA3MzcwOTU1MTYxNFVMTH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLAkxMCwJMTg0NDY3NDQwNzM3MDk1NTE2MTVVTEx9LAorCisJCXsiMDAiLAkJOCwJMDBVTEx9LAorCQl7IjAxIiwJCTgsCTAxVUxMfSwKKwkJeyIwMTc3IiwJOCwJMDE3N1VMTH0sCisJCXsiMDIwMCIsCTgsCTAyMDBVTEx9LAorCQl7IjAyMDEiLAk4LAkwMjAxVUxMfSwKKwkJeyIwMzc3IiwJOCwJMDM3N1VMTH0sCisJCXsiMDQwMCIsCTgsCTA0MDBVTEx9LAorCQl7IjA0MDEiLAk4LAkwNDAxVUxMfSwKKwkJeyIwNzc3NzciLAk4LAkwNzc3NzdVTEx9LAorCQl7IjAxMDAwMDAiLAk4LAkwMTAwMDAwVUxMfSwKKwkJeyIwMTAwMDAxIiwJOCwJMDEwMDAwMVVMTH0sCisJCXsiMDE3Nzc3NyIsCTgsCTAxNzc3NzdVTEx9LAorCQl7IjAyMDAwMDAiLAk4LAkwMjAwMDAwVUxMfSwKKwkJeyIwMjAwMDAxIiwJOCwJMDIwMDAwMVVMTH0sCisJCXsiMDE3Nzc3Nzc3Nzc3IiwJOCwJMDE3Nzc3Nzc3Nzc3VUxMfSwKKwkJeyIwMjAwMDAwMDAwMDAiLAk4LAkwMjAwMDAwMDAwMDBVTEx9LAorCQl7IjAyMDAwMDAwMDAwMSIsCTgsCTAyMDAwMDAwMDAwMVVMTH0sCisJCXsiMDM3Nzc3Nzc3Nzc3IiwJOCwJMDM3Nzc3Nzc3Nzc3VUxMfSwKKwkJeyIwNDAwMDAwMDAwMDAiLAk4LAkwNDAwMDAwMDAwMDBVTEx9LAorCQl7IjA0MDAwMDAwMDAwMSIsCTgsCTA0MDAwMDAwMDAwMVVMTH0sCisJCXsiMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyIsCTgsCTA3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzdVTEx9LAorCQl7IjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwJOCwJMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDBVTEx9LAorCQl7IjAxMDAwMDAwMDAwMDAwMDAwMDAwMDAxIiwJOCwJMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDFVTEx9LAorCQl7IjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc2IiwJOCwJMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzZVTEx9LAorCQl7IjAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3IiwJOCwJMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzdVTEx9LAorCisJCXsiMHgwIiwJCTE2LAkweDBVTEx9LAorCQl7IjB4MSIsCQkxNiwJMHgxVUxMfSwKKwkJeyIweDdmIiwJMTYsCTB4N2ZVTEx9LAorCQl7IjB4ODAiLAkxNiwJMHg4MFVMTH0sCisJCXsiMHg4MSIsCTE2LAkweDgxVUxMfSwKKwkJeyIweGZmIiwJMTYsCTB4ZmZVTEx9LAorCQl7IjB4MTAwIiwJMTYsCTB4MTAwVUxMfSwKKwkJeyIweDEwMSIsCTE2LAkweDEwMVVMTH0sCisJCXsiMHg3ZmZmIiwJMTYsCTB4N2ZmZlVMTH0sCisJCXsiMHg4MDAwIiwJMTYsCTB4ODAwMFVMTH0sCisJCXsiMHg4MDAxIiwJMTYsCTB4ODAwMVVMTH0sCisJCXsiMHhmZmZmIiwJMTYsCTB4ZmZmZlVMTH0sCisJCXsiMHgxMDAwMCIsCTE2LAkweDEwMDAwVUxMfSwKKwkJeyIweDEwMDAxIiwJMTYsCTB4MTAwMDFVTEx9LAorCQl7IjB4N2ZmZmZmZmYiLAkxNiwJMHg3ZmZmZmZmZlVMTH0sCisJCXsiMHg4MDAwMDAwMCIsCTE2LAkweDgwMDAwMDAwVUxMfSwKKwkJeyIweDgwMDAwMDAxIiwJMTYsCTB4ODAwMDAwMDFVTEx9LAorCQl7IjB4ZmZmZmZmZmYiLAkxNiwJMHhmZmZmZmZmZlVMTH0sCisJCXsiMHgxMDAwMDAwMDAiLAkxNiwJMHgxMDAwMDAwMDBVTEx9LAorCQl7IjB4MTAwMDAwMDAxIiwJMTYsCTB4MTAwMDAwMDAxVUxMfSwKKwkJeyIweDdmZmZmZmZmZmZmZmZmZmYiLAkxNiwJMHg3ZmZmZmZmZmZmZmZmZmZmVUxMfSwKKwkJeyIweDgwMDAwMDAwMDAwMDAwMDAiLAkxNiwJMHg4MDAwMDAwMDAwMDAwMDAwVUxMfSwKKwkJeyIweDgwMDAwMDAwMDAwMDAwMDEiLAkxNiwJMHg4MDAwMDAwMDAwMDAwMDAxVUxMfSwKKwkJeyIweGZmZmZmZmZmZmZmZmZmZmUiLAkxNiwJMHhmZmZmZmZmZmZmZmZmZmZlVUxMfSwKKwkJeyIweGZmZmZmZmZmZmZmZmZmZmYiLAkxNiwJMHhmZmZmZmZmZmZmZmZmZmZmVUxMfSwKKworCQl7IjBcbiIsCTAsCTBVTEx9LAorCX07CisJVEVTVF9PSyhrc3RydG91bGwsIHVuc2lnbmVkIGxvbmcgbG9uZywgIiVsbHUiLCB0ZXN0X3VsbF9vayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3VsbF9mYWlsKHZvaWQpCit7CisJc3RhdGljIERFRklORV9URVNUX0ZBSUwodGVzdF91bGxfZmFpbCkgPSB7CisJCXsiIiwJMH0sCisJCXsiIiwJOH0sCisJCXsiIiwJMTB9LAorCQl7IiIsCTE2fSwKKwkJeyJcbiIsCTB9LAorCQl7IlxuIiwJOH0sCisJCXsiXG4iLAkxMH0sCisJCXsiXG4iLAkxNn0sCisJCXsiXG4wIiwJMH0sCisJCXsiXG4wIiwJOH0sCisJCXsiXG4wIiwJMTB9LAorCQl7IlxuMCIsCTE2fSwKKwkJeyIrIiwJMH0sCisJCXsiKyIsCTh9LAorCQl7IisiLAkxMH0sCisJCXsiKyIsCTE2fSwKKwkJeyItIiwJMH0sCisJCXsiLSIsCTh9LAorCQl7Ii0iLAkxMH0sCisJCXsiLSIsCTE2fSwKKwkJeyIweCIsCTB9LAorCQl7IjB4IiwJMTZ9LAorCQl7IjBYIiwJMH0sCisJCXsiMFgiLAkxNn0sCisJCXsiMCAiLAkwfSwKKwkJeyIxKyIsCTB9LAorCQl7IjEtIiwJMH0sCisJCXsiIDIiLAkwfSwKKwkJLyogYmFzZSBhdXRvZGV0ZWN0aW9uICovCisJCXsiMHgweiIsCTB9LAorCQl7IjB6IiwJCTB9LAorCQl7ImEiLAkJMH0sCisJCS8qIGRpZ2l0ID49IGJhc2UgKi8KKwkJeyIyIiwJMn0sCisJCXsiOCIsCTh9LAorCQl7ImEiLAkxMH0sCisJCXsiQSIsCTEwfSwKKwkJeyJnIiwJMTZ9LAorCQl7IkciLAkxNn0sCisJCS8qIG92ZXJmbG93ICovCisJCXsiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLAkyfSwKKwkJeyIyMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwJOH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTYiLAkxMH0sCisJCXsiMTAwMDAwMDAwMDAwMDAwMDAiLAkxNn0sCisJCS8qIG5lZ2F0aXZlICovCisJCXsiLTAiLCAwfSwKKwkJeyItMCIsIDh9LAorCQl7Ii0wIiwgMTB9LAorCQl7Ii0wIiwgMTZ9LAorCQl7Ii0xIiwgMH0sCisJCXsiLTEiLCA4fSwKKwkJeyItMSIsIDEwfSwKKwkJeyItMSIsIDE2fSwKKwkJLyogc2lnbiBpcyBmaXJzdCBjaGFyYWN0ZXIgaWYgYW55ICovCisJCXsiLSsxIiwgMH0sCisJCXsiLSsxIiwgOH0sCisJCXsiLSsxIiwgMTB9LAorCQl7Ii0rMSIsIDE2fSwKKwkJLyogbm90aGluZyBhZnRlciBcbiAqLworCQl7IjBcbjAiLCAwfSwKKwkJeyIwXG4wIiwgOH0sCisJCXsiMFxuMCIsIDEwfSwKKwkJeyIwXG4wIiwgMTZ9LAorCQl7IjBcbisiLCAwfSwKKwkJeyIwXG4rIiwgOH0sCisJCXsiMFxuKyIsIDEwfSwKKwkJeyIwXG4rIiwgMTZ9LAorCQl7IjBcbi0iLCAwfSwKKwkJeyIwXG4tIiwgOH0sCisJCXsiMFxuLSIsIDEwfSwKKwkJeyIwXG4tIiwgMTZ9LAorCQl7IjBcbiAiLCAwfSwKKwkJeyIwXG4gIiwgOH0sCisJCXsiMFxuICIsIDEwfSwKKwkJeyIwXG4gIiwgMTZ9LAorCX07CisJVEVTVF9GQUlMKGtzdHJ0b3VsbCwgdW5zaWduZWQgbG9uZyBsb25nLCAiJWxsdSIsIHRlc3RfdWxsX2ZhaWwpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9rc3RydG9sbF9vayh2b2lkKQoreworCURFQ0xBUkVfVEVTVF9PSyhsb25nIGxvbmcsIHN0cnVjdCB0ZXN0X2xsKTsKKwlzdGF0aWMgREVGSU5FX1RFU1RfT0soc3RydWN0IHRlc3RfbGwsIHRlc3RfbGxfb2spID0geworCQl7IjAiLAkxMCwJMExMfSwKKwkJeyIxIiwJMTAsCTFMTH0sCisJCXsiMTI3IiwJMTAsCTEyN0xMfSwKKwkJeyIxMjgiLAkxMCwJMTI4TEx9LAorCQl7IjEyOSIsCTEwLAkxMjlMTH0sCisJCXsiMjU1IiwJMTAsCTI1NUxMfSwKKwkJeyIyNTYiLAkxMCwJMjU2TEx9LAorCQl7IjI1NyIsCTEwLAkyNTdMTH0sCisJCXsiMzI3NjciLAkxMCwJMzI3NjdMTH0sCisJCXsiMzI3NjgiLAkxMCwJMzI3NjhMTH0sCisJCXsiMzI3NjkiLAkxMCwJMzI3NjlMTH0sCisJCXsiNjU1MzUiLAkxMCwJNjU1MzVMTH0sCisJCXsiNjU1MzYiLAkxMCwJNjU1MzZMTH0sCisJCXsiNjU1MzciLAkxMCwJNjU1MzdMTH0sCisJCXsiMjE0NzQ4MzY0NyIsCTEwLAkyMTQ3NDgzNjQ3TEx9LAorCQl7IjIxNDc0ODM2NDgiLAkxMCwJMjE0NzQ4MzY0OExMfSwKKwkJeyIyMTQ3NDgzNjQ5IiwJMTAsCTIxNDc0ODM2NDlMTH0sCisJCXsiNDI5NDk2NzI5NSIsCTEwLAk0Mjk0OTY3Mjk1TEx9LAorCQl7IjQyOTQ5NjcyOTYiLAkxMCwJNDI5NDk2NzI5NkxMfSwKKwkJeyI0Mjk0OTY3Mjk3IiwJMTAsCTQyOTQ5NjcyOTdMTH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwNyIsCTEwLAk5MjIzMzcyMDM2ODU0Nzc1ODA3TEx9LAorCisJCXsiLTAiLAkxMCwJMExMfSwKKwkJeyItMSIsCTEwLAktMUxMfSwKKwkJeyItMiIsCTEwLAktMkxMfSwKKwkJeyItOTIyMzM3MjAzNjg1NDc3NTgwOCIsCTEwLAlMTE9OR19NSU59LAorCX07CisJVEVTVF9PSyhrc3RydG9sbCwgbG9uZyBsb25nLCAiJWxsZCIsIHRlc3RfbGxfb2spOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9rc3RydG9sbF9mYWlsKHZvaWQpCit7CisJc3RhdGljIERFRklORV9URVNUX0ZBSUwodGVzdF9sbF9mYWlsKSA9IHsKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA4IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDkiLAkxMH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTQiLAkxMH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLAkxMH0sCisJCXsiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiLAkxMH0sCisJCXsiLTE4NDQ2NzQ0MDczNzA5NTUxNjE0IiwJMTB9LAorCQl7Ii0xODQ0Njc0NDA3MzcwOTU1MTYxNSIsCTEwfSwKKwkJLyogc2lnbiBpcyBmaXJzdCBjaGFyYWN0ZXIgaWYgYW55ICovCisJCXsiLSsxIiwgMH0sCisJCXsiLSsxIiwgOH0sCisJCXsiLSsxIiwgMTB9LAorCQl7Ii0rMSIsIDE2fSwKKwl9OworCVRFU1RfRkFJTChrc3RydG9sbCwgbG9uZyBsb25nLCAiJWxsZCIsIHRlc3RfbGxfZmFpbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3U2NF9vayh2b2lkKQoreworCURFQ0xBUkVfVEVTVF9PSyh1NjQsIHN0cnVjdCB0ZXN0X3U2NCk7CisJc3RhdGljIERFRklORV9URVNUX09LKHN0cnVjdCB0ZXN0X3U2NCwgdGVzdF91NjRfb2spID0geworCQl7IjAiLAkxMCwJMH0sCisJCXsiMSIsCTEwLAkxfSwKKwkJeyIxMjYiLAkxMCwJMTI2fSwKKwkJeyIxMjciLAkxMCwJMTI3fSwKKwkJeyIxMjgiLAkxMCwJMTI4fSwKKwkJeyIxMjkiLAkxMCwJMTI5fSwKKwkJeyIyNTQiLAkxMCwJMjU0fSwKKwkJeyIyNTUiLAkxMCwJMjU1fSwKKwkJeyIyNTYiLAkxMCwJMjU2fSwKKwkJeyIyNTciLAkxMCwJMjU3fSwKKwkJeyIzMjc2NiIsCTEwLAkzMjc2Nn0sCisJCXsiMzI3NjciLAkxMCwJMzI3Njd9LAorCQl7IjMyNzY4IiwJMTAsCTMyNzY4fSwKKwkJeyIzMjc2OSIsCTEwLAkzMjc2OX0sCisJCXsiNjU1MzQiLAkxMCwJNjU1MzR9LAorCQl7IjY1NTM1IiwJMTAsCTY1NTM1fSwKKwkJeyI2NTUzNiIsCTEwLAk2NTUzNn0sCisJCXsiNjU1MzciLAkxMCwJNjU1Mzd9LAorCQl7IjIxNDc0ODM2NDYiLAkxMCwJMjE0NzQ4MzY0Nn0sCisJCXsiMjE0NzQ4MzY0NyIsCTEwLAkyMTQ3NDgzNjQ3fSwKKwkJeyIyMTQ3NDgzNjQ4IiwJMTAsCTIxNDc0ODM2NDhVTEx9LAorCQl7IjIxNDc0ODM2NDkiLAkxMCwJMjE0NzQ4MzY0OVVMTH0sCisJCXsiNDI5NDk2NzI5NCIsCTEwLAk0Mjk0OTY3Mjk0VUxMfSwKKwkJeyI0Mjk0OTY3Mjk1IiwJMTAsCTQyOTQ5NjcyOTVVTEx9LAorCQl7IjQyOTQ5NjcyOTYiLAkxMCwJNDI5NDk2NzI5NlVMTH0sCisJCXsiNDI5NDk2NzI5NyIsCTEwLAk0Mjk0OTY3Mjk3VUxMfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA2IiwJMTAsCTkyMjMzNzIwMzY4NTQ3NzU4MDZVTEx9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDciLAkxMCwJOTIyMzM3MjAzNjg1NDc3NTgwN1VMTH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOCIsCTEwLAk5MjIzMzcyMDM2ODU0Nzc1ODA4VUxMfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA5IiwJMTAsCTkyMjMzNzIwMzY4NTQ3NzU4MDlVTEx9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE0IiwJMTAsCTE4NDQ2NzQ0MDczNzA5NTUxNjE0VUxMfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCTEwLAkxODQ0Njc0NDA3MzcwOTU1MTYxNVVMTH0sCisJfTsKKwlURVNUX09LKGtzdHJ0b3U2NCwgdTY0LCAiJWxsdSIsIHRlc3RfdTY0X29rKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvdTY0X2ZhaWwodm9pZCkKK3sKKwlzdGF0aWMgREVGSU5FX1RFU1RfRkFJTCh0ZXN0X3U2NF9mYWlsKSA9IHsKKwkJeyItMiIsCTEwfSwKKwkJeyItMSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNyIsCTEwfSwKKwl9OworCVRFU1RfRkFJTChrc3RydG91NjQsIHU2NCwgIiVsbHUiLCB0ZXN0X3U2NF9mYWlsKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvczY0X29rKHZvaWQpCit7CisJREVDTEFSRV9URVNUX09LKHM2NCwgc3RydWN0IHRlc3RfczY0KTsKKwlzdGF0aWMgREVGSU5FX1RFU1RfT0soc3RydWN0IHRlc3RfczY0LCB0ZXN0X3M2NF9vaykgPSB7CisJCXsiLTEyOCIsCTEwLAktMTI4fSwKKwkJeyItMTI3IiwJMTAsCS0xMjd9LAorCQl7Ii0xIiwJMTAsCS0xfSwKKwkJeyIwIiwJMTAsCTB9LAorCQl7IjEiLAkxMCwJMX0sCisJCXsiMTI2IiwJMTAsCTEyNn0sCisJCXsiMTI3IiwJMTAsCTEyN30sCisJCXsiMTI4IiwJMTAsCTEyOH0sCisJCXsiMTI5IiwJMTAsCTEyOX0sCisJCXsiMjU0IiwJMTAsCTI1NH0sCisJCXsiMjU1IiwJMTAsCTI1NX0sCisJCXsiMjU2IiwJMTAsCTI1Nn0sCisJCXsiMjU3IiwJMTAsCTI1N30sCisJCXsiMzI3NjYiLAkxMCwJMzI3NjZ9LAorCQl7IjMyNzY3IiwJMTAsCTMyNzY3fSwKKwkJeyIzMjc2OCIsCTEwLAkzMjc2OH0sCisJCXsiMzI3NjkiLAkxMCwJMzI3Njl9LAorCQl7IjY1NTM0IiwJMTAsCTY1NTM0fSwKKwkJeyI2NTUzNSIsCTEwLAk2NTUzNX0sCisJCXsiNjU1MzYiLAkxMCwJNjU1MzZ9LAorCQl7IjY1NTM3IiwJMTAsCTY1NTM3fSwKKwkJeyIyMTQ3NDgzNjQ2IiwJMTAsCTIxNDc0ODM2NDZ9LAorCQl7IjIxNDc0ODM2NDciLAkxMCwJMjE0NzQ4MzY0N30sCisJCXsiMjE0NzQ4MzY0OCIsCTEwLAkyMTQ3NDgzNjQ4TEx9LAorCQl7IjIxNDc0ODM2NDkiLAkxMCwJMjE0NzQ4MzY0OUxMfSwKKwkJeyI0Mjk0OTY3Mjk0IiwJMTAsCTQyOTQ5NjcyOTRMTH0sCisJCXsiNDI5NDk2NzI5NSIsCTEwLAk0Mjk0OTY3Mjk1TEx9LAorCQl7IjQyOTQ5NjcyOTYiLAkxMCwJNDI5NDk2NzI5NkxMfSwKKwkJeyI0Mjk0OTY3Mjk3IiwJMTAsCTQyOTQ5NjcyOTdMTH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwNiIsCTEwLAk5MjIzMzcyMDM2ODU0Nzc1ODA2TEx9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDciLAkxMCwJOTIyMzM3MjAzNjg1NDc3NTgwN0xMfSwKKwl9OworCVRFU1RfT0soa3N0cnRvczY0LCBzNjQsICIlbGxkIiwgdGVzdF9zNjRfb2spOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9rc3RydG9zNjRfZmFpbCh2b2lkKQoreworCXN0YXRpYyBERUZJTkVfVEVTVF9GQUlMKHRlc3RfczY0X2ZhaWwpID0geworCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDgiLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNCIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNyIsCTEwfSwKKwl9OworCVRFU1RfRkFJTChrc3RydG9zNjQsIHM2NCwgIiVsbGQiLCB0ZXN0X3M2NF9mYWlsKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvdTMyX29rKHZvaWQpCit7CisJREVDTEFSRV9URVNUX09LKHUzMiwgc3RydWN0IHRlc3RfdTMyKTsKKwlzdGF0aWMgREVGSU5FX1RFU1RfT0soc3RydWN0IHRlc3RfdTMyLCB0ZXN0X3UzMl9vaykgPSB7CisJCXsiMCIsCTEwLAkwfSwKKwkJeyIxIiwJMTAsCTF9LAorCQl7IjEyNiIsCTEwLAkxMjZ9LAorCQl7IjEyNyIsCTEwLAkxMjd9LAorCQl7IjEyOCIsCTEwLAkxMjh9LAorCQl7IjEyOSIsCTEwLAkxMjl9LAorCQl7IjI1NCIsCTEwLAkyNTR9LAorCQl7IjI1NSIsCTEwLAkyNTV9LAorCQl7IjI1NiIsCTEwLAkyNTZ9LAorCQl7IjI1NyIsCTEwLAkyNTd9LAorCQl7IjMyNzY2IiwJMTAsCTMyNzY2fSwKKwkJeyIzMjc2NyIsCTEwLAkzMjc2N30sCisJCXsiMzI3NjgiLAkxMCwJMzI3Njh9LAorCQl7IjMyNzY5IiwJMTAsCTMyNzY5fSwKKwkJeyI2NTUzNCIsCTEwLAk2NTUzNH0sCisJCXsiNjU1MzUiLAkxMCwJNjU1MzV9LAorCQl7IjY1NTM2IiwJMTAsCTY1NTM2fSwKKwkJeyI2NTUzNyIsCTEwLAk2NTUzN30sCisJCXsiMjE0NzQ4MzY0NiIsCTEwLAkyMTQ3NDgzNjQ2fSwKKwkJeyIyMTQ3NDgzNjQ3IiwJMTAsCTIxNDc0ODM2NDd9LAorCQl7IjIxNDc0ODM2NDgiLAkxMCwJMjE0NzQ4MzY0OFV9LAorCQl7IjIxNDc0ODM2NDkiLAkxMCwJMjE0NzQ4MzY0OVV9LAorCQl7IjQyOTQ5NjcyOTQiLAkxMCwJNDI5NDk2NzI5NFV9LAorCQl7IjQyOTQ5NjcyOTUiLAkxMCwJNDI5NDk2NzI5NVV9LAorCX07CisJVEVTVF9PSyhrc3RydG91MzIsIHUzMiwgIiV1IiwgdGVzdF91MzJfb2spOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9rc3RydG91MzJfZmFpbCh2b2lkKQoreworCXN0YXRpYyBERUZJTkVfVEVTVF9GQUlMKHRlc3RfdTMyX2ZhaWwpID0geworCQl7Ii0yIiwJMTB9LAorCQl7Ii0xIiwJMTB9LAorCQl7IjQyOTQ5NjcyOTYiLAkxMH0sCisJCXsiNDI5NDk2NzI5NyIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA2IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDciLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOCIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA5IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE0IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE2IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE3IiwJMTB9LAorCX07CisJVEVTVF9GQUlMKGtzdHJ0b3UzMiwgdTMyLCAiJXUiLCB0ZXN0X3UzMl9mYWlsKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvczMyX29rKHZvaWQpCit7CisJREVDTEFSRV9URVNUX09LKHMzMiwgc3RydWN0IHRlc3RfczMyKTsKKwlzdGF0aWMgREVGSU5FX1RFU1RfT0soc3RydWN0IHRlc3RfczMyLCB0ZXN0X3MzMl9vaykgPSB7CisJCXsiLTEyOCIsCTEwLAktMTI4fSwKKwkJeyItMTI3IiwJMTAsCS0xMjd9LAorCQl7Ii0xIiwJMTAsCS0xfSwKKwkJeyIwIiwJMTAsCTB9LAorCQl7IjEiLAkxMCwJMX0sCisJCXsiMTI2IiwJMTAsCTEyNn0sCisJCXsiMTI3IiwJMTAsCTEyN30sCisJCXsiMTI4IiwJMTAsCTEyOH0sCisJCXsiMTI5IiwJMTAsCTEyOX0sCisJCXsiMjU0IiwJMTAsCTI1NH0sCisJCXsiMjU1IiwJMTAsCTI1NX0sCisJCXsiMjU2IiwJMTAsCTI1Nn0sCisJCXsiMjU3IiwJMTAsCTI1N30sCisJCXsiMzI3NjYiLAkxMCwJMzI3NjZ9LAorCQl7IjMyNzY3IiwJMTAsCTMyNzY3fSwKKwkJeyIzMjc2OCIsCTEwLAkzMjc2OH0sCisJCXsiMzI3NjkiLAkxMCwJMzI3Njl9LAorCQl7IjY1NTM0IiwJMTAsCTY1NTM0fSwKKwkJeyI2NTUzNSIsCTEwLAk2NTUzNX0sCisJCXsiNjU1MzYiLAkxMCwJNjU1MzZ9LAorCQl7IjY1NTM3IiwJMTAsCTY1NTM3fSwKKwkJeyIyMTQ3NDgzNjQ2IiwJMTAsCTIxNDc0ODM2NDZ9LAorCQl7IjIxNDc0ODM2NDciLAkxMCwJMjE0NzQ4MzY0N30sCisJfTsKKwlURVNUX09LKGtzdHJ0b3MzMiwgczMyLCAiJWQiLCB0ZXN0X3MzMl9vayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3MzMl9mYWlsKHZvaWQpCit7CisJc3RhdGljIERFRklORV9URVNUX0ZBSUwodGVzdF9zMzJfZmFpbCkgPSB7CisJCXsiMjE0NzQ4MzY0OCIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ5IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTQiLAkxMH0sCisJCXsiNDI5NDk2NzI5NSIsCTEwfSwKKwkJeyI0Mjk0OTY3Mjk2IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTciLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwNiIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA3IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDgiLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNCIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNyIsCTEwfSwKKwl9OworCVRFU1RfRkFJTChrc3RydG9zMzIsIHMzMiwgIiVkIiwgdGVzdF9zMzJfZmFpbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3UxNl9vayh2b2lkKQoreworCURFQ0xBUkVfVEVTVF9PSyh1MTYsIHN0cnVjdCB0ZXN0X3UxNik7CisJc3RhdGljIERFRklORV9URVNUX09LKHN0cnVjdCB0ZXN0X3UxNiwgdGVzdF91MTZfb2spID0geworCQl7IjAiLAkxMCwJMH0sCisJCXsiMSIsCTEwLAkxfSwKKwkJeyIxMjYiLAkxMCwJMTI2fSwKKwkJeyIxMjciLAkxMCwJMTI3fSwKKwkJeyIxMjgiLAkxMCwJMTI4fSwKKwkJeyIxMjkiLAkxMCwJMTI5fSwKKwkJeyIyNTQiLAkxMCwJMjU0fSwKKwkJeyIyNTUiLAkxMCwJMjU1fSwKKwkJeyIyNTYiLAkxMCwJMjU2fSwKKwkJeyIyNTciLAkxMCwJMjU3fSwKKwkJeyIzMjc2NiIsCTEwLAkzMjc2Nn0sCisJCXsiMzI3NjciLAkxMCwJMzI3Njd9LAorCQl7IjMyNzY4IiwJMTAsCTMyNzY4fSwKKwkJeyIzMjc2OSIsCTEwLAkzMjc2OX0sCisJCXsiNjU1MzQiLAkxMCwJNjU1MzR9LAorCQl7IjY1NTM1IiwJMTAsCTY1NTM1fSwKKwl9OworCVRFU1RfT0soa3N0cnRvdTE2LCB1MTYsICIlaHUiLCB0ZXN0X3UxNl9vayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3UxNl9mYWlsKHZvaWQpCit7CisJc3RhdGljIERFRklORV9URVNUX0ZBSUwodGVzdF91MTZfZmFpbCkgPSB7CisJCXsiLTIiLAkxMH0sCisJCXsiLTEiLAkxMH0sCisJCXsiNjU1MzYiLAkxMH0sCisJCXsiNjU1MzciLAkxMH0sCisJCXsiMjE0NzQ4MzY0NiIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ3IiwJMTB9LAorCQl7IjIxNDc0ODM2NDgiLAkxMH0sCisJCXsiMjE0NzQ4MzY0OSIsCTEwfSwKKwkJeyI0Mjk0OTY3Mjk0IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTUiLAkxMH0sCisJCXsiNDI5NDk2NzI5NiIsCTEwfSwKKwkJeyI0Mjk0OTY3Mjk3IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDYiLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwNyIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA4IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDkiLAkxMH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTQiLAkxMH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLAkxMH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTYiLAkxMH0sCisJCXsiMTg0NDY3NDQwNzM3MDk1NTE2MTciLAkxMH0sCisJfTsKKwlURVNUX0ZBSUwoa3N0cnRvdTE2LCB1MTYsICIlaHUiLCB0ZXN0X3UxNl9mYWlsKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvczE2X29rKHZvaWQpCit7CisJREVDTEFSRV9URVNUX09LKHMxNiwgc3RydWN0IHRlc3RfczE2KTsKKwlzdGF0aWMgREVGSU5FX1RFU1RfT0soc3RydWN0IHRlc3RfczE2LCB0ZXN0X3MxNl9vaykgPSB7CisJCXsiLTEzMCIsCTEwLAktMTMwfSwKKwkJeyItMTI5IiwJMTAsCS0xMjl9LAorCQl7Ii0xMjgiLAkxMCwJLTEyOH0sCisJCXsiLTEyNyIsCTEwLAktMTI3fSwKKwkJeyItMSIsCTEwLAktMX0sCisJCXsiMCIsCTEwLAkwfSwKKwkJeyIxIiwJMTAsCTF9LAorCQl7IjEyNiIsCTEwLAkxMjZ9LAorCQl7IjEyNyIsCTEwLAkxMjd9LAorCQl7IjEyOCIsCTEwLAkxMjh9LAorCQl7IjEyOSIsCTEwLAkxMjl9LAorCQl7IjI1NCIsCTEwLAkyNTR9LAorCQl7IjI1NSIsCTEwLAkyNTV9LAorCQl7IjI1NiIsCTEwLAkyNTZ9LAorCQl7IjI1NyIsCTEwLAkyNTd9LAorCQl7IjMyNzY2IiwJMTAsCTMyNzY2fSwKKwkJeyIzMjc2NyIsCTEwLAkzMjc2N30sCisJfTsKKwlURVNUX09LKGtzdHJ0b3MxNiwgczE2LCAiJWhkIiwgdGVzdF9zMTZfb2spOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9rc3RydG9zMTZfZmFpbCh2b2lkKQoreworCXN0YXRpYyBERUZJTkVfVEVTVF9GQUlMKHRlc3RfczE2X2ZhaWwpID0geworCQl7IjMyNzY4IiwJMTB9LAorCQl7IjMyNzY5IiwJMTB9LAorCQl7IjY1NTM0IiwJMTB9LAorCQl7IjY1NTM1IiwJMTB9LAorCQl7IjY1NTM2IiwJMTB9LAorCQl7IjY1NTM3IiwJMTB9LAorCQl7IjIxNDc0ODM2NDYiLAkxMH0sCisJCXsiMjE0NzQ4MzY0NyIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ4IiwJMTB9LAorCQl7IjIxNDc0ODM2NDkiLAkxMH0sCisJCXsiNDI5NDk2NzI5NCIsCTEwfSwKKwkJeyI0Mjk0OTY3Mjk1IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTYiLAkxMH0sCisJCXsiNDI5NDk2NzI5NyIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA2IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDciLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOCIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA5IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE0IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE2IiwJMTB9LAorCQl7IjE4NDQ2NzQ0MDczNzA5NTUxNjE3IiwJMTB9LAorCX07CisJVEVTVF9GQUlMKGtzdHJ0b3MxNiwgczE2LCAiJWhkIiwgdGVzdF9zMTZfZmFpbCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3U4X29rKHZvaWQpCit7CisJREVDTEFSRV9URVNUX09LKHU4LCBzdHJ1Y3QgdGVzdF91OCk7CisJc3RhdGljIERFRklORV9URVNUX09LKHN0cnVjdCB0ZXN0X3U4LCB0ZXN0X3U4X29rKSA9IHsKKwkJeyIwIiwJMTAsCTB9LAorCQl7IjEiLAkxMCwJMX0sCisJCXsiMTI2IiwJMTAsCTEyNn0sCisJCXsiMTI3IiwJMTAsCTEyN30sCisJCXsiMTI4IiwJMTAsCTEyOH0sCisJCXsiMTI5IiwJMTAsCTEyOX0sCisJCXsiMjU0IiwJMTAsCTI1NH0sCisJCXsiMjU1IiwJMTAsCTI1NX0sCisJfTsKKwlURVNUX09LKGtzdHJ0b3U4LCB1OCwgIiVoaHUiLCB0ZXN0X3U4X29rKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvdThfZmFpbCh2b2lkKQoreworCXN0YXRpYyBERUZJTkVfVEVTVF9GQUlMKHRlc3RfdThfZmFpbCkgPSB7CisJCXsiLTIiLAkxMH0sCisJCXsiLTEiLAkxMH0sCisJCXsiMjU2IiwJMTB9LAorCQl7IjI1NyIsCTEwfSwKKwkJeyIzMjc2NiIsCTEwfSwKKwkJeyIzMjc2NyIsCTEwfSwKKwkJeyIzMjc2OCIsCTEwfSwKKwkJeyIzMjc2OSIsCTEwfSwKKwkJeyI2NTUzNCIsCTEwfSwKKwkJeyI2NTUzNSIsCTEwfSwKKwkJeyI2NTUzNiIsCTEwfSwKKwkJeyI2NTUzNyIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ2IiwJMTB9LAorCQl7IjIxNDc0ODM2NDciLAkxMH0sCisJCXsiMjE0NzQ4MzY0OCIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ5IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTQiLAkxMH0sCisJCXsiNDI5NDk2NzI5NSIsCTEwfSwKKwkJeyI0Mjk0OTY3Mjk2IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTciLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwNiIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA3IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDgiLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNCIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNyIsCTEwfSwKKwl9OworCVRFU1RfRkFJTChrc3RydG91OCwgdTgsICIlaGh1IiwgdGVzdF91OF9mYWlsKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3Rfa3N0cnRvczhfb2sodm9pZCkKK3sKKwlERUNMQVJFX1RFU1RfT0soczgsIHN0cnVjdCB0ZXN0X3M4KTsKKwlzdGF0aWMgREVGSU5FX1RFU1RfT0soc3RydWN0IHRlc3RfczgsIHRlc3Rfczhfb2spID0geworCQl7Ii0xMjgiLAkxMCwJLTEyOH0sCisJCXsiLTEyNyIsCTEwLAktMTI3fSwKKwkJeyItMSIsCTEwLAktMX0sCisJCXsiMCIsCTEwLAkwfSwKKwkJeyIxIiwJMTAsCTF9LAorCQl7IjEyNiIsCTEwLAkxMjZ9LAorCQl7IjEyNyIsCTEwLAkxMjd9LAorCX07CisJVEVTVF9PSyhrc3RydG9zOCwgczgsICIlaGhkIiwgdGVzdF9zOF9vayk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2tzdHJ0b3M4X2ZhaWwodm9pZCkKK3sKKwlzdGF0aWMgREVGSU5FX1RFU1RfRkFJTCh0ZXN0X3M4X2ZhaWwpID0geworCQl7Ii0xMzAiLAkxMH0sCisJCXsiLTEyOSIsCTEwfSwKKwkJeyIxMjgiLAkxMH0sCisJCXsiMTI5IiwJMTB9LAorCQl7IjI1NCIsCTEwfSwKKwkJeyIyNTUiLAkxMH0sCisJCXsiMjU2IiwJMTB9LAorCQl7IjI1NyIsCTEwfSwKKwkJeyIzMjc2NiIsCTEwfSwKKwkJeyIzMjc2NyIsCTEwfSwKKwkJeyIzMjc2OCIsCTEwfSwKKwkJeyIzMjc2OSIsCTEwfSwKKwkJeyI2NTUzNCIsCTEwfSwKKwkJeyI2NTUzNSIsCTEwfSwKKwkJeyI2NTUzNiIsCTEwfSwKKwkJeyI2NTUzNyIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ2IiwJMTB9LAorCQl7IjIxNDc0ODM2NDciLAkxMH0sCisJCXsiMjE0NzQ4MzY0OCIsCTEwfSwKKwkJeyIyMTQ3NDgzNjQ5IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTQiLAkxMH0sCisJCXsiNDI5NDk2NzI5NSIsCTEwfSwKKwkJeyI0Mjk0OTY3Mjk2IiwJMTB9LAorCQl7IjQyOTQ5NjcyOTciLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwNiIsCTEwfSwKKwkJeyI5MjIzMzcyMDM2ODU0Nzc1ODA3IiwJMTB9LAorCQl7IjkyMjMzNzIwMzY4NTQ3NzU4MDgiLAkxMH0sCisJCXsiOTIyMzM3MjAzNjg1NDc3NTgwOSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNCIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNiIsCTEwfSwKKwkJeyIxODQ0Njc0NDA3MzcwOTU1MTYxNyIsCTEwfSwKKwl9OworCVRFU1RfRkFJTChrc3RydG9zOCwgczgsICIlaGhkIiwgdGVzdF9zOF9mYWlsKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdGVzdF9rc3RydG94X2luaXQodm9pZCkKK3sKKwl0ZXN0X2tzdHJ0b3VsbF9vaygpOworCXRlc3Rfa3N0cnRvdWxsX2ZhaWwoKTsKKwl0ZXN0X2tzdHJ0b2xsX29rKCk7CisJdGVzdF9rc3RydG9sbF9mYWlsKCk7CisKKwl0ZXN0X2tzdHJ0b3U2NF9vaygpOworCXRlc3Rfa3N0cnRvdTY0X2ZhaWwoKTsKKwl0ZXN0X2tzdHJ0b3M2NF9vaygpOworCXRlc3Rfa3N0cnRvczY0X2ZhaWwoKTsKKworCXRlc3Rfa3N0cnRvdTMyX29rKCk7CisJdGVzdF9rc3RydG91MzJfZmFpbCgpOworCXRlc3Rfa3N0cnRvczMyX29rKCk7CisJdGVzdF9rc3RydG9zMzJfZmFpbCgpOworCisJdGVzdF9rc3RydG91MTZfb2soKTsKKwl0ZXN0X2tzdHJ0b3UxNl9mYWlsKCk7CisJdGVzdF9rc3RydG9zMTZfb2soKTsKKwl0ZXN0X2tzdHJ0b3MxNl9mYWlsKCk7CisKKwl0ZXN0X2tzdHJ0b3U4X29rKCk7CisJdGVzdF9rc3RydG91OF9mYWlsKCk7CisJdGVzdF9rc3RydG9zOF9vaygpOworCXRlc3Rfa3N0cnRvczhfZmFpbCgpOworCXJldHVybiAtRUlOVkFMOworfQorbW9kdWxlX2luaXQodGVzdF9rc3RydG94X2luaXQpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdC1zdHJpbmdfaGVscGVycy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdC1zdHJpbmdfaGVscGVycy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjVjYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0LXN0cmluZ19oZWxwZXJzLmMKQEAgLTAsMCArMSw0MTcgQEAKKy8qCisgKiBUZXN0IGNhc2VzIGZvciBsaWIvc3RyaW5nX2hlbHBlcnMuYyBtb2R1bGUuCisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nX2hlbHBlcnMuaD4KKworc3RhdGljIF9faW5pdCBib29sIHRlc3Rfc3RyaW5nX2NoZWNrX2J1Zihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJCSBjaGFyICppbiwgc2l6ZV90IHAsCisJCQkJCSBjaGFyICpvdXRfcmVhbCwgc2l6ZV90IHFfcmVhbCwKKwkJCQkJIGNoYXIgKm91dF90ZXN0LCBzaXplX3QgcV90ZXN0KQoreworCWlmIChxX3JlYWwgPT0gcV90ZXN0ICYmICFtZW1jbXAob3V0X3Rlc3QsIG91dF9yZWFsLCBxX3Rlc3QpKQorCQlyZXR1cm4gdHJ1ZTsKKworCXByX3dhcm4oIlRlc3QgJyVzJyBmYWlsZWQ6IGZsYWdzID0gJXVcbiIsIG5hbWUsIGZsYWdzKTsKKworCXByaW50X2hleF9kdW1wKEtFUk5fV0FSTklORywgIklucHV0OiAiLCBEVU1QX1BSRUZJWF9OT05FLCAxNiwgMSwKKwkJICAgICAgIGluLCBwLCB0cnVlKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX1dBUk5JTkcsICJFeHBlY3RlZDogIiwgRFVNUF9QUkVGSVhfTk9ORSwgMTYsIDEsCisJCSAgICAgICBvdXRfdGVzdCwgcV90ZXN0LCB0cnVlKTsKKwlwcmludF9oZXhfZHVtcChLRVJOX1dBUk5JTkcsICJHb3Q6ICIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLAorCQkgICAgICAgb3V0X3JlYWwsIHFfcmVhbCwgdHJ1ZSk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0cnVjdCB0ZXN0X3N0cmluZyB7CisJY29uc3QgY2hhciAqaW47CisJY29uc3QgY2hhciAqb3V0OworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9zdHJpbmcgc3RyaW5nc1tdIF9faW5pdGNvbnN0ID0geworCXsKKwkJLmluID0gIlxcZlxcIFxcblxcclxcdFxcdiIsCisJCS5vdXQgPSAiXGZcXCBcblxyXHRcdiIsCisJCS5mbGFncyA9IFVORVNDQVBFX1NQQUNFLAorCX0sCisJeworCQkuaW4gPSAiXFw0MFxcMVxcMzg3XFwwMDY0XFwwNVxcMDQwXFw4YVxcMTEwXFw3NzciLAorCQkub3V0ID0gIiBcMDAxXDAwMzg3XDAwNjRcMDA1IFxcOGFIPzciLAorCQkuZmxhZ3MgPSBVTkVTQ0FQRV9PQ1RBTCwKKwl9LAorCXsKKwkJLmluID0gIlxceHZcXHhhXFx4MmNcXHhEXFx4NmYyIiwKKwkJLm91dCA9ICJcXHh2XG4sXHJvMiIsCisJCS5mbGFncyA9IFVORVNDQVBFX0hFWCwKKwl9LAorCXsKKwkJLmluID0gIlxcaFxcXFxcXFwiXFxhXFxlXFwiLAorCQkub3V0ID0gIlxcaFxcXCJcYVxlXFwiLAorCQkuZmxhZ3MgPSBVTkVTQ0FQRV9TUEVDSUFMLAorCX0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9zdHJpbmdfdW5lc2NhcGUoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgaW50IGZsYWdzLAorCQkJCQlib29sIGlucGxhY2UpCit7CisJaW50IHFfcmVhbCA9IDI1NjsKKwljaGFyICppbiA9IGttYWxsb2MocV9yZWFsLCBHRlBfS0VSTkVMKTsKKwljaGFyICpvdXRfdGVzdCA9IGttYWxsb2MocV9yZWFsLCBHRlBfS0VSTkVMKTsKKwljaGFyICpvdXRfcmVhbCA9IGttYWxsb2MocV9yZWFsLCBHRlBfS0VSTkVMKTsKKwlpbnQgaSwgcCA9IDAsIHFfdGVzdCA9IDA7CisKKwlpZiAoIWluIHx8ICFvdXRfdGVzdCB8fCAhb3V0X3JlYWwpCisJCWdvdG8gb3V0OworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RyaW5ncyk7IGkrKykgeworCQljb25zdCBjaGFyICpzID0gc3RyaW5nc1tpXS5pbjsKKwkJaW50IGxlbiA9IHN0cmxlbihzdHJpbmdzW2ldLmluKTsKKworCQkvKiBDb3B5IHN0cmluZyB0byBpbiBidWZmZXIgKi8KKwkJbWVtY3B5KCZpbltwXSwgcywgbGVuKTsKKwkJcCArPSBsZW47CisKKwkJLyogQ29weSBleHBlY3RlZCByZXN1bHQgZm9yIGdpdmVuIGZsYWdzICovCisJCWlmIChmbGFncyAmIHN0cmluZ3NbaV0uZmxhZ3MpIHsKKwkJCXMgPSBzdHJpbmdzW2ldLm91dDsKKwkJCWxlbiA9IHN0cmxlbihzdHJpbmdzW2ldLm91dCk7CisJCX0KKwkJbWVtY3B5KCZvdXRfdGVzdFtxX3Rlc3RdLCBzLCBsZW4pOworCQlxX3Rlc3QgKz0gbGVuOworCX0KKwlpbltwKytdID0gJ1wwJzsKKworCS8qIENhbGwgc3RyaW5nX3VuZXNjYXBlIGFuZCBjb21wYXJlIHJlc3VsdCAqLworCWlmIChpbnBsYWNlKSB7CisJCW1lbWNweShvdXRfcmVhbCwgaW4sIHApOworCQlpZiAoZmxhZ3MgPT0gVU5FU0NBUEVfQU5ZKQorCQkJcV9yZWFsID0gc3RyaW5nX3VuZXNjYXBlX2FueV9pbnBsYWNlKG91dF9yZWFsKTsKKwkJZWxzZQorCQkJcV9yZWFsID0gc3RyaW5nX3VuZXNjYXBlX2lucGxhY2Uob3V0X3JlYWwsIGZsYWdzKTsKKwl9IGVsc2UgaWYgKGZsYWdzID09IFVORVNDQVBFX0FOWSkgeworCQlxX3JlYWwgPSBzdHJpbmdfdW5lc2NhcGVfYW55KGluLCBvdXRfcmVhbCwgcV9yZWFsKTsKKwl9IGVsc2UgeworCQlxX3JlYWwgPSBzdHJpbmdfdW5lc2NhcGUoaW4sIG91dF9yZWFsLCBxX3JlYWwsIGZsYWdzKTsKKwl9CisKKwl0ZXN0X3N0cmluZ19jaGVja19idWYobmFtZSwgZmxhZ3MsIGluLCBwIC0gMSwgb3V0X3JlYWwsIHFfcmVhbCwKKwkJCSAgICAgIG91dF90ZXN0LCBxX3Rlc3QpOworb3V0OgorCWtmcmVlKG91dF9yZWFsKTsKKwlrZnJlZShvdXRfdGVzdCk7CisJa2ZyZWUoaW4pOworfQorCitzdHJ1Y3QgdGVzdF9zdHJpbmdfMSB7CisJY29uc3QgY2hhciAqb3V0OworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKKyNkZWZpbmUJVEVTVF9TVFJJTkdfMl9NQVhfUzEJCTMyCitzdHJ1Y3QgdGVzdF9zdHJpbmdfMiB7CisJY29uc3QgY2hhciAqaW47CisJc3RydWN0IHRlc3Rfc3RyaW5nXzEgczFbVEVTVF9TVFJJTkdfMl9NQVhfUzFdOworfTsKKworI2RlZmluZQlURVNUX1NUUklOR18yX0RJQ1RfMAkJTlVMTAorc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X3N0cmluZ18yIGVzY2FwZTBbXSBfX2luaXRjb25zdCA9IHt7CisJLmluID0gIlxmXFwgXG5cclx0XHYiLAorCS5zMSA9IHt7CisJCS5vdXQgPSAiXFxmXFwgXFxuXFxyXFx0XFx2IiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQQUNFLAorCX0seworCQkub3V0ID0gIlxcZlxcMTM0XFwwNDBcXG5cXHJcXHRcXHYiLAorCQkuZmxhZ3MgPSBFU0NBUEVfU1BBQ0UgfCBFU0NBUEVfT0NUQUwsCisJfSx7CisJCS5vdXQgPSAiXFxmXFx4NWNcXHgyMFxcblxcclxcdFxcdiIsCisJCS5mbGFncyA9IEVTQ0FQRV9TUEFDRSB8IEVTQ0FQRV9IRVgsCisJfSx7CisJCS8qIHRlcm1pbmF0b3IgKi8KKwl9fSwKK30seworCS5pbiA9ICJcXGhcXFwiXGFcZVxcIiwKKwkuczEgPSB7eworCQkub3V0ID0gIlxcXFxoXFxcXFwiXFxhXFxlXFxcXCIsCisJCS5mbGFncyA9IEVTQ0FQRV9TUEVDSUFMLAorCX0seworCQkub3V0ID0gIlxcXFxcXDE1MFxcXFxcXDA0MlxcYVxcZVxcXFwiLAorCQkuZmxhZ3MgPSBFU0NBUEVfU1BFQ0lBTCB8IEVTQ0FQRV9PQ1RBTCwKKwl9LHsKKwkJLm91dCA9ICJcXFxcXFx4NjhcXFxcXFx4MjJcXGFcXGVcXFxcIiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQRUNJQUwgfCBFU0NBUEVfSEVYLAorCX0seworCQkvKiB0ZXJtaW5hdG9yICovCisJfX0sCit9LHsKKwkuaW4gPSAiXGViIFxcQ1wwMDdcIlx4OTBccl0iLAorCS5zMSA9IHt7CisJCS5vdXQgPSAiXGViIFxcQ1wwMDdcIlx4OTBcXHJdIiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQQUNFLAorCX0seworCQkub3V0ID0gIlxcZWIgXFxcXENcXGFcIlx4OTBccl0iLAorCQkuZmxhZ3MgPSBFU0NBUEVfU1BFQ0lBTCwKKwl9LHsKKwkJLm91dCA9ICJcXGViIFxcXFxDXFxhXCJceDkwXFxyXSIsCisJCS5mbGFncyA9IEVTQ0FQRV9TUEFDRSB8IEVTQ0FQRV9TUEVDSUFMLAorCX0seworCQkub3V0ID0gIlxcMDMzXFwxNDJcXDA0MFxcMTM0XFwxMDNcXDAwN1xcMDQyXFwyMjBcXDAxNVxcMTM1IiwKKwkJLmZsYWdzID0gRVNDQVBFX09DVEFMLAorCX0seworCQkub3V0ID0gIlxcMDMzXFwxNDJcXDA0MFxcMTM0XFwxMDNcXDAwN1xcMDQyXFwyMjBcXHJcXDEzNSIsCisJCS5mbGFncyA9IEVTQ0FQRV9TUEFDRSB8IEVTQ0FQRV9PQ1RBTCwKKwl9LHsKKwkJLm91dCA9ICJcXGVcXDE0MlxcMDQwXFxcXFxcMTAzXFxhXFwwNDJcXDIyMFxcMDE1XFwxMzUiLAorCQkuZmxhZ3MgPSBFU0NBUEVfU1BFQ0lBTCB8IEVTQ0FQRV9PQ1RBTCwKKwl9LHsKKwkJLm91dCA9ICJcXGVcXDE0MlxcMDQwXFxcXFxcMTAzXFxhXFwwNDJcXDIyMFxcclxcMTM1IiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQQUNFIHwgRVNDQVBFX1NQRUNJQUwgfCBFU0NBUEVfT0NUQUwsCisJfSx7CisJCS5vdXQgPSAiXGViIFxcQ1wwMDdcIlx4OTBccl0iLAorCQkuZmxhZ3MgPSBFU0NBUEVfTlAsCisJfSx7CisJCS5vdXQgPSAiXGViIFxcQ1wwMDdcIlx4OTBcXHJdIiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQQUNFIHwgRVNDQVBFX05QLAorCX0seworCQkub3V0ID0gIlxcZWIgXFxDXFxhXCJceDkwXHJdIiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQRUNJQUwgfCBFU0NBUEVfTlAsCisJfSx7CisJCS5vdXQgPSAiXFxlYiBcXENcXGFcIlx4OTBcXHJdIiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQQUNFIHwgRVNDQVBFX1NQRUNJQUwgfCBFU0NBUEVfTlAsCisJfSx7CisJCS5vdXQgPSAiXFwwMzNiIFxcQ1xcMDA3XCJcXDIyMFxcMDE1XSIsCisJCS5mbGFncyA9IEVTQ0FQRV9PQ1RBTCB8IEVTQ0FQRV9OUCwKKwl9LHsKKwkJLm91dCA9ICJcXDAzM2IgXFxDXFwwMDdcIlxcMjIwXFxyXSIsCisJCS5mbGFncyA9IEVTQ0FQRV9TUEFDRSB8IEVTQ0FQRV9PQ1RBTCB8IEVTQ0FQRV9OUCwKKwl9LHsKKwkJLm91dCA9ICJcXGViIFxcQ1xcYVwiXFwyMjBcXHJdIiwKKwkJLmZsYWdzID0gRVNDQVBFX1NQRUNJQUwgfCBFU0NBUEVfU1BBQ0UgfCBFU0NBUEVfT0NUQUwgfAorCQkJIEVTQ0FQRV9OUCwKKwl9LHsKKwkJLm91dCA9ICJcXHgxYmIgXFxDXFx4MDdcIlxceDkwXFx4MGRdIiwKKwkJLmZsYWdzID0gRVNDQVBFX05QIHwgRVNDQVBFX0hFWCwKKwl9LHsKKwkJLyogdGVybWluYXRvciAqLworCX19LAorfSx7CisJLyogdGVybWluYXRvciAqLworfX07CisKKyNkZWZpbmUJVEVTVF9TVFJJTkdfMl9ESUNUXzEJCSJiXFwgXHRcciIKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9zdHJpbmdfMiBlc2NhcGUxW10gX19pbml0Y29uc3QgPSB7eworCS5pbiA9ICJcZlxcIFxuXHJcdFx2IiwKKwkuczEgPSB7eworCQkub3V0ID0gIlxmXFwxMzRcXDA0MFxuXFwwMTVcXDAxMVx2IiwKKwkJLmZsYWdzID0gRVNDQVBFX09DVEFMLAorCX0seworCQkub3V0ID0gIlxmXFx4NWNcXHgyMFxuXFx4MGRcXHgwOVx2IiwKKwkJLmZsYWdzID0gRVNDQVBFX0hFWCwKKwl9LHsKKwkJLyogdGVybWluYXRvciAqLworCX19LAorfSx7CisJLmluID0gIlxcaFxcXCJcYVxlXFwiLAorCS5zMSA9IHt7CisJCS5vdXQgPSAiXFwxMzRoXFwxMzRcIlxhXGVcXDEzNCIsCisJCS5mbGFncyA9IEVTQ0FQRV9PQ1RBTCwKKwl9LHsKKwkJLyogdGVybWluYXRvciAqLworCX19LAorfSx7CisJLmluID0gIlxlYiBcXENcMDA3XCJceDkwXHJdIiwKKwkuczEgPSB7eworCQkub3V0ID0gIlxlXFwxNDJcXDA0MFxcMTM0Q1wwMDdcIlx4OTBcXDAxNV0iLAorCQkuZmxhZ3MgPSBFU0NBUEVfT0NUQUwsCisJfSx7CisJCS8qIHRlcm1pbmF0b3IgKi8KKwl9fSwKK30seworCS8qIHRlcm1pbmF0b3IgKi8KK319OworCitzdGF0aWMgX19pbml0IGNvbnN0IGNoYXIgKnRlc3Rfc3RyaW5nX2ZpbmRfbWF0Y2goY29uc3Qgc3RydWN0IHRlc3Rfc3RyaW5nXzIgKnMyLAorCQkJCQkJIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwljb25zdCBzdHJ1Y3QgdGVzdF9zdHJpbmdfMSAqczEgPSBzMi0+czE7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAoIWZsYWdzKQorCQlyZXR1cm4gczItPmluOworCisJLyogVGVzdCBjYXNlcyBhcmUgTlVMTC1hd2FyZSAqLworCWZsYWdzICY9IH5FU0NBUEVfTlVMTDsKKworCS8qIEVTQ0FQRV9PQ1RBTCBoYXMgYSBoaWdoZXIgcHJpb3JpdHkgKi8KKwlpZiAoZmxhZ3MgJiBFU0NBUEVfT0NUQUwpCisJCWZsYWdzICY9IH5FU0NBUEVfSEVYOworCisJZm9yIChpID0gMDsgaSA8IFRFU1RfU1RSSU5HXzJfTUFYX1MxICYmIHMxLT5vdXQ7IGkrKywgczErKykKKwkJaWYgKHMxLT5mbGFncyA9PSBmbGFncykKKwkJCXJldHVybiBzMS0+b3V0OworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgX19pbml0IHZvaWQKK3Rlc3Rfc3RyaW5nX2VzY2FwZV9vdmVyZmxvdyhjb25zdCBjaGFyICppbiwgaW50IHAsIHVuc2lnbmVkIGludCBmbGFncywgY29uc3QgY2hhciAqZXNjLAorCQkJICAgIGludCBxX3Rlc3QsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHFfcmVhbDsKKworCXFfcmVhbCA9IHN0cmluZ19lc2NhcGVfbWVtKGluLCBwLCBOVUxMLCAwLCBmbGFncywgZXNjKTsKKwlpZiAocV9yZWFsICE9IHFfdGVzdCkKKwkJcHJfd2FybigiVGVzdCAnJXMnIGZhaWxlZDogZmxhZ3MgPSAldSwgb3N6ID0gMCwgZXhwZWN0ZWQgJWQsIGdvdCAlZFxuIiwKKwkJCW5hbWUsIGZsYWdzLCBxX3Rlc3QsIHFfcmVhbCk7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCB0ZXN0X3N0cmluZ19lc2NhcGUoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgdGVzdF9zdHJpbmdfMiAqczIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IGZsYWdzLCBjb25zdCBjaGFyICplc2MpCit7CisJc2l6ZV90IG91dF9zaXplID0gNTEyOworCWNoYXIgKm91dF90ZXN0ID0ga21hbGxvYyhvdXRfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJY2hhciAqb3V0X3JlYWwgPSBrbWFsbG9jKG91dF9zaXplLCBHRlBfS0VSTkVMKTsKKwljaGFyICppbiA9IGttYWxsb2MoMjU2LCBHRlBfS0VSTkVMKTsKKwlpbnQgcCA9IDAsIHFfdGVzdCA9IDA7CisJaW50IHFfcmVhbDsKKworCWlmICghb3V0X3Rlc3QgfHwgIW91dF9yZWFsIHx8ICFpbikKKwkJZ290byBvdXQ7CisKKwlmb3IgKDsgczItPmluOyBzMisrKSB7CisJCWNvbnN0IGNoYXIgKm91dDsKKwkJaW50IGxlbjsKKworCQkvKiBOVUxMIGluamVjdGlvbiAqLworCQlpZiAoZmxhZ3MgJiBFU0NBUEVfTlVMTCkgeworCQkJaW5bcCsrXSA9ICdcMCc7CisJCQlvdXRfdGVzdFtxX3Rlc3QrK10gPSAnXFwnOworCQkJb3V0X3Rlc3RbcV90ZXN0KytdID0gJzAnOworCQl9CisKKwkJLyogRG9uJ3QgdHJ5IHN0cmluZ3MgdGhhdCBoYXZlIG5vIG91dHB1dCAqLworCQlvdXQgPSB0ZXN0X3N0cmluZ19maW5kX21hdGNoKHMyLCBmbGFncyk7CisJCWlmICghb3V0KQorCQkJY29udGludWU7CisKKwkJLyogQ29weSBzdHJpbmcgdG8gaW4gYnVmZmVyICovCisJCWxlbiA9IHN0cmxlbihzMi0+aW4pOworCQltZW1jcHkoJmluW3BdLCBzMi0+aW4sIGxlbik7CisJCXAgKz0gbGVuOworCisJCS8qIENvcHkgZXhwZWN0ZWQgcmVzdWx0IGZvciBnaXZlbiBmbGFncyAqLworCQlsZW4gPSBzdHJsZW4ob3V0KTsKKwkJbWVtY3B5KCZvdXRfdGVzdFtxX3Rlc3RdLCBvdXQsIGxlbik7CisJCXFfdGVzdCArPSBsZW47CisJfQorCisJcV9yZWFsID0gc3RyaW5nX2VzY2FwZV9tZW0oaW4sIHAsIG91dF9yZWFsLCBvdXRfc2l6ZSwgZmxhZ3MsIGVzYyk7CisKKwl0ZXN0X3N0cmluZ19jaGVja19idWYobmFtZSwgZmxhZ3MsIGluLCBwLCBvdXRfcmVhbCwgcV9yZWFsLCBvdXRfdGVzdCwKKwkJCSAgICAgIHFfdGVzdCk7CisKKwl0ZXN0X3N0cmluZ19lc2NhcGVfb3ZlcmZsb3coaW4sIHAsIGZsYWdzLCBlc2MsIHFfdGVzdCwgbmFtZSk7CisKK291dDoKKwlrZnJlZShpbik7CisJa2ZyZWUob3V0X3JlYWwpOworCWtmcmVlKG91dF90ZXN0KTsKK30KKworI2RlZmluZSBzdHJpbmdfZ2V0X3NpemVfbWF4YnVmIDE2CisjZGVmaW5lIHRlc3Rfc3RyaW5nX2dldF9zaXplX29uZShzaXplLCBibGtfc2l6ZSwgZXhwX3Jlc3VsdDEwLCBleHBfcmVzdWx0MikgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKGV4cF9yZXN1bHQxMCkgPj0gc3RyaW5nX2dldF9zaXplX21heGJ1Zik7ICBcCisJCUJVSUxEX0JVR19PTihzaXplb2YoZXhwX3Jlc3VsdDIpID49IHN0cmluZ19nZXRfc2l6ZV9tYXhidWYpOyAgIFwKKwkJX190ZXN0X3N0cmluZ19nZXRfc2l6ZSgoc2l6ZSksIChibGtfc2l6ZSksIChleHBfcmVzdWx0MTApLCAgICAgXAorCQkJCSAgICAgICAoZXhwX3Jlc3VsdDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisKKworc3RhdGljIF9faW5pdCB2b2lkIHRlc3Rfc3RyaW5nX2dldF9zaXplX2NoZWNrKGNvbnN0IGNoYXIgKnVuaXRzLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpleHAsCisJCQkJCSAgICAgIGNoYXIgKnJlcywKKwkJCQkJICAgICAgY29uc3QgdTY0IHNpemUsCisJCQkJCSAgICAgIGNvbnN0IHU2NCBibGtfc2l6ZSkKK3sKKwlpZiAoIW1lbWNtcChyZXMsIGV4cCwgc3RybGVuKGV4cCkgKyAxKSkKKwkJcmV0dXJuOworCisJcmVzW3N0cmluZ19nZXRfc2l6ZV9tYXhidWYgLSAxXSA9ICdcMCc7CisKKwlwcl93YXJuKCJUZXN0ICd0ZXN0X3N0cmluZ19nZXRfc2l6ZScgZmFpbGVkIVxuIik7CisJcHJfd2Fybigic3RyaW5nX2dldF9zaXplKHNpemUgPSAlbGx1LCBibGtfc2l6ZSA9ICVsbHUsIHVuaXRzID0gJXMpXG4iLAorCQlzaXplLCBibGtfc2l6ZSwgdW5pdHMpOworCXByX3dhcm4oImV4cGVjdGVkOiAnJXMnLCBnb3QgJyVzJ1xuIiwgZXhwLCByZXMpOworfQorCitzdGF0aWMgX19pbml0IHZvaWQgX190ZXN0X3N0cmluZ19nZXRfc2l6ZShjb25zdCB1NjQgc2l6ZSwgY29uc3QgdTY0IGJsa19zaXplLAorCQkJCQkgIGNvbnN0IGNoYXIgKmV4cF9yZXN1bHQxMCwKKwkJCQkJICBjb25zdCBjaGFyICpleHBfcmVzdWx0MikKK3sKKwljaGFyIGJ1ZjEwW3N0cmluZ19nZXRfc2l6ZV9tYXhidWZdOworCWNoYXIgYnVmMltzdHJpbmdfZ2V0X3NpemVfbWF4YnVmXTsKKworCXN0cmluZ19nZXRfc2l6ZShzaXplLCBibGtfc2l6ZSwgU1RSSU5HX1VOSVRTXzEwLCBidWYxMCwgc2l6ZW9mKGJ1ZjEwKSk7CisJc3RyaW5nX2dldF9zaXplKHNpemUsIGJsa19zaXplLCBTVFJJTkdfVU5JVFNfMiwgYnVmMiwgc2l6ZW9mKGJ1ZjIpKTsKKworCXRlc3Rfc3RyaW5nX2dldF9zaXplX2NoZWNrKCJTVFJJTkdfVU5JVFNfMTAiLCBleHBfcmVzdWx0MTAsIGJ1ZjEwLAorCQkJCSAgIHNpemUsIGJsa19zaXplKTsKKworCXRlc3Rfc3RyaW5nX2dldF9zaXplX2NoZWNrKCJTVFJJTkdfVU5JVFNfMiIsIGV4cF9yZXN1bHQyLCBidWYyLAorCQkJCSAgIHNpemUsIGJsa19zaXplKTsKK30KKworc3RhdGljIF9faW5pdCB2b2lkIHRlc3Rfc3RyaW5nX2dldF9zaXplKHZvaWQpCit7CisJLyogc21hbGwgdmFsdWVzICovCisJdGVzdF9zdHJpbmdfZ2V0X3NpemVfb25lKDAsIDUxMiwgIjAgQiIsICIwIEIiKTsKKwl0ZXN0X3N0cmluZ19nZXRfc2l6ZV9vbmUoMSwgNTEyLCAiNTEyIEIiLCAiNTEyIEIiKTsKKwl0ZXN0X3N0cmluZ19nZXRfc2l6ZV9vbmUoMTEwMCwgMSwgIjEuMTAga0IiLCAiMS4wNyBLaUIiKTsKKworCS8qIG5vcm1hbCB2YWx1ZXMgKi8KKwl0ZXN0X3N0cmluZ19nZXRfc2l6ZV9vbmUoMTYzODQsIDUxMiwgIjguMzkgTUIiLCAiOC4wMCBNaUIiKTsKKwl0ZXN0X3N0cmluZ19nZXRfc2l6ZV9vbmUoNTAwMTE4MTkyLCA1MTIsICIyNTYgR0IiLCAiMjM4IEdpQiIpOworCXRlc3Rfc3RyaW5nX2dldF9zaXplX29uZSg4MTkyLCA0MDk2LCAiMzMuNiBNQiIsICIzMi4wIE1pQiIpOworCisJLyogd2VpcmQgYmxvY2sgc2l6ZXMgKi8KKwl0ZXN0X3N0cmluZ19nZXRfc2l6ZV9vbmUoMzAwMCwgMTkwMCwgIjUuNzAgTUIiLCAiNS40NCBNaUIiKTsKKworCS8qIGh1Z2UgdmFsdWVzICovCisJdGVzdF9zdHJpbmdfZ2V0X3NpemVfb25lKFU2NF9NQVgsIDQwOTYsICI3NS42IFpCIiwgIjY0LjAgWmlCIik7CisJdGVzdF9zdHJpbmdfZ2V0X3NpemVfb25lKDQwOTYsIFU2NF9NQVgsICI3NS42IFpCIiwgIjY0LjAgWmlCIik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3Rfc3RyaW5nX2hlbHBlcnNfaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGludCBpOworCisJcHJfaW5mbygiUnVubmluZyB0ZXN0cy4uLlxuIik7CisJZm9yIChpID0gMDsgaSA8IFVORVNDQVBFX0FOWSArIDE7IGkrKykKKwkJdGVzdF9zdHJpbmdfdW5lc2NhcGUoInVuZXNjYXBlIiwgaSwgZmFsc2UpOworCXRlc3Rfc3RyaW5nX3VuZXNjYXBlKCJ1bmVzY2FwZSBpbnBsYWNlIiwKKwkJCSAgICAgZ2V0X3JhbmRvbV9pbnQoKSAlIChVTkVTQ0FQRV9BTlkgKyAxKSwgdHJ1ZSk7CisKKwkvKiBXaXRob3V0IGRpY3Rpb25hcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgKEVTQ0FQRV9BTllfTlAgfCBFU0NBUEVfSEVYKSArIDE7IGkrKykKKwkJdGVzdF9zdHJpbmdfZXNjYXBlKCJlc2NhcGUgMCIsIGVzY2FwZTAsIGksIFRFU1RfU1RSSU5HXzJfRElDVF8wKTsKKworCS8qIFdpdGggZGljdGlvbmFyeSAqLworCWZvciAoaSA9IDA7IGkgPCAoRVNDQVBFX0FOWV9OUCB8IEVTQ0FQRV9IRVgpICsgMTsgaSsrKQorCQl0ZXN0X3N0cmluZ19lc2NhcGUoImVzY2FwZSAxIiwgZXNjYXBlMSwgaSwgVEVTVF9TVFJJTkdfMl9ESUNUXzEpOworCisJLyogVGVzdCBzdHJpbmdfZ2V0X3NpemUoKSAqLworCXRlc3Rfc3RyaW5nX2dldF9zaXplKCk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KK21vZHVsZV9pbml0KHRlc3Rfc3RyaW5nX2hlbHBlcnNfaW5pdCk7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2JpdG1hcC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9iaXRtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTZmNDkyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9iaXRtYXAuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIFRlc3QgY2FzZXMgZm9yIHByaW50ZiBmYWNpbGl0eS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitzdGF0aWMgdW5zaWduZWQgdG90YWxfdGVzdHMgX19pbml0ZGF0YTsKK3N0YXRpYyB1bnNpZ25lZCBmYWlsZWRfdGVzdHMgX19pbml0ZGF0YTsKKworc3RhdGljIGNoYXIgcGJsX2J1ZmZlcltQQUdFX1NJWkVdIF9faW5pdGRhdGE7CisKKworc3RhdGljIGJvb2wgX19pbml0CitfX2NoZWNrX2VxX3VpbnQoY29uc3QgY2hhciAqc3JjZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCisJCWNvbnN0IHVuc2lnbmVkIGludCBleHBfdWludCwgdW5zaWduZWQgaW50IHgpCit7CisJaWYgKGV4cF91aW50ICE9IHgpIHsKKwkJcHJfd2FybigiWyVzOiV1XSBleHBlY3RlZCAldSwgZ290ICV1XG4iLAorCQkJc3JjZmlsZSwgbGluZSwgZXhwX3VpbnQsIHgpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCisKK3N0YXRpYyBib29sIF9faW5pdAorX19jaGVja19lcV9iaXRtYXAoY29uc3QgY2hhciAqc3JjZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCisJCSAgY29uc3QgdW5zaWduZWQgbG9uZyAqZXhwX2JtYXAsIHVuc2lnbmVkIGludCBleHBfbmJpdHMsCisJCSAgY29uc3QgdW5zaWduZWQgbG9uZyAqYm1hcCwgdW5zaWduZWQgaW50IG5iaXRzKQoreworCWlmIChleHBfbmJpdHMgIT0gbmJpdHMpIHsKKwkJcHJfd2FybigiWyVzOiV1XSBiaXRtYXAgbGVuZ3RoIG1pc21hdGNoOiBleHBlY3RlZCAldSwgZ290ICV1XG4iLAorCQkJc3JjZmlsZSwgbGluZSwgZXhwX25iaXRzLCBuYml0cyk7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlpZiAoIWJpdG1hcF9lcXVhbChleHBfYm1hcCwgYm1hcCwgbmJpdHMpKSB7CisJCXByX3dhcm4oIlslczoldV0gYml0bWFwcyBjb250ZW50cyBkaWZmZXI6IGV4cGVjdGVkIFwiJSpwYmxcIiwgZ290IFwiJSpwYmxcIlxuIiwKKwkJCXNyY2ZpbGUsIGxpbmUsCisJCQlleHBfbmJpdHMsIGV4cF9ibWFwLCBuYml0cywgYm1hcCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIF9faW5pdAorX19jaGVja19lcV9wYmwoY29uc3QgY2hhciAqc3JjZmlsZSwgdW5zaWduZWQgaW50IGxpbmUsCisJICAgICAgIGNvbnN0IGNoYXIgKmV4cGVjdGVkX3BibCwKKwkgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqYml0bWFwLCB1bnNpZ25lZCBpbnQgbmJpdHMpCit7CisJc25wcmludGYocGJsX2J1ZmZlciwgc2l6ZW9mKHBibF9idWZmZXIpLCAiJSpwYmwiLCBuYml0cywgYml0bWFwKTsKKwlpZiAoc3RyY21wKGV4cGVjdGVkX3BibCwgcGJsX2J1ZmZlcikpIHsKKwkJcHJfd2FybigiWyVzOiV1XSBleHBlY3RlZCBcIiVzXCIsIGdvdCBcIiVzXCJcbiIsCisJCQlzcmNmaWxlLCBsaW5lLAorCQkJZXhwZWN0ZWRfcGJsLCBwYmxfYnVmZmVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgX19pbml0CitfX2NoZWNrX2VxX3UzMl9hcnJheShjb25zdCBjaGFyICpzcmNmaWxlLCB1bnNpZ25lZCBpbnQgbGluZSwKKwkJICAgICBjb25zdCB1MzIgKmV4cF9hcnIsIHVuc2lnbmVkIGludCBleHBfbGVuLAorCQkgICAgIGNvbnN0IHUzMiAqYXJyLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWlmIChleHBfbGVuICE9IGxlbikgeworCQlwcl93YXJuKCJbJXM6JXVdIGFycmF5IGxlbmd0aCBkaWZmZXI6IGV4cGVjdGVkICV1LCBnb3QgJXVcbiIsCisJCQlzcmNmaWxlLCBsaW5lLAorCQkJZXhwX2xlbiwgbGVuKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmIChtZW1jbXAoZXhwX2FyciwgYXJyLCBsZW4qc2l6ZW9mKCphcnIpKSkgeworCQlwcl93YXJuKCJbJXM6JXVdIGFycmF5IGNvbnRlbnRzIGRpZmZlclxuIiwgc3JjZmlsZSwgbGluZSk7CisJCXByaW50X2hleF9kdW1wKEtFUk5fV0FSTklORywgIiAgZXhwOiAgIiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJICAgICAgIDMyLCA0LCBleHBfYXJyLCBleHBfbGVuKnNpemVvZigqZXhwX2FyciksIGZhbHNlKTsKKwkJcHJpbnRfaGV4X2R1bXAoS0VSTl9XQVJOSU5HLCAiICBnb3Q6ICAiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkgICAgICAgMzIsIDQsIGFyciwgbGVuKnNpemVvZigqYXJyKSwgZmFsc2UpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgX19leHBlY3RfZXEoc3VmZml4LCAuLi4pCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkJaW50IHJlc3VsdCA9IDA7CQkJCQkJXAorCQl0b3RhbF90ZXN0cysrOwkJCQkJCVwKKwkJaWYgKCFfX2NoZWNrX2VxXyAjIyBzdWZmaXgoX19GSUxFX18sIF9fTElORV9fLAkJXAorCQkJCQkgICAjI19fVkFfQVJHU19fKSkgewkJXAorCQkJZmFpbGVkX3Rlc3RzKys7CQkJCQlcCisJCQlyZXN1bHQgPSAxOwkJCQkJXAorCQl9CQkJCQkJCVwKKwkJcmVzdWx0OwkJCQkJCQlcCisJfSkKKworI2RlZmluZSBleHBlY3RfZXFfdWludCguLi4pCQlfX2V4cGVjdF9lcSh1aW50LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBleHBlY3RfZXFfYml0bWFwKC4uLikJCV9fZXhwZWN0X2VxKGJpdG1hcCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZXhwZWN0X2VxX3BibCguLi4pCQlfX2V4cGVjdF9lcShwYmwsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIGV4cGVjdF9lcV91MzJfYXJyYXkoLi4uKQlfX2V4cGVjdF9lcSh1MzJfYXJyYXksICMjX19WQV9BUkdTX18pCisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X3plcm9fZmlsbF9jb3B5KHZvaWQpCit7CisJREVDTEFSRV9CSVRNQVAoYm1hcDEsIDEwMjQpOworCURFQ0xBUkVfQklUTUFQKGJtYXAyLCAxMDI0KTsKKworCWJpdG1hcF96ZXJvKGJtYXAxLCAxMDI0KTsKKwliaXRtYXBfemVybyhibWFwMiwgMTAyNCk7CisKKwkvKiBzaW5nbGUtd29yZCBiaXRtYXBzICovCisJZXhwZWN0X2VxX3BibCgiIiwgYm1hcDEsIDIzKTsKKworCWJpdG1hcF9maWxsKGJtYXAxLCAxOSk7CisJZXhwZWN0X2VxX3BibCgiMC0xOCIsIGJtYXAxLCAxMDI0KTsKKworCWJpdG1hcF9jb3B5KGJtYXAyLCBibWFwMSwgMjMpOworCWV4cGVjdF9lcV9wYmwoIjAtMTgiLCBibWFwMiwgMTAyNCk7CisKKwliaXRtYXBfZmlsbChibWFwMiwgMjMpOworCWV4cGVjdF9lcV9wYmwoIjAtMjIiLCBibWFwMiwgMTAyNCk7CisKKwliaXRtYXBfY29weShibWFwMiwgYm1hcDEsIDIzKTsKKwlleHBlY3RfZXFfcGJsKCIwLTE4IiwgYm1hcDIsIDEwMjQpOworCisJYml0bWFwX3plcm8oYm1hcDEsIDIzKTsKKwlleHBlY3RfZXFfcGJsKCIiLCBibWFwMSwgMTAyNCk7CisKKwkvKiBtdWx0aS13b3JkIGJpdG1hcHMgKi8KKwliaXRtYXBfemVybyhibWFwMSwgMTAyNCk7CisJZXhwZWN0X2VxX3BibCgiIiwgYm1hcDEsIDEwMjQpOworCisJYml0bWFwX2ZpbGwoYm1hcDEsIDEwOSk7CisJZXhwZWN0X2VxX3BibCgiMC0xMDgiLCBibWFwMSwgMTAyNCk7CisKKwliaXRtYXBfY29weShibWFwMiwgYm1hcDEsIDEwMjQpOworCWV4cGVjdF9lcV9wYmwoIjAtMTA4IiwgYm1hcDIsIDEwMjQpOworCisJYml0bWFwX2ZpbGwoYm1hcDIsIDEwMjQpOworCWV4cGVjdF9lcV9wYmwoIjAtMTAyMyIsIGJtYXAyLCAxMDI0KTsKKworCWJpdG1hcF9jb3B5KGJtYXAyLCBibWFwMSwgMTAyNCk7CisJZXhwZWN0X2VxX3BibCgiMC0xMDgiLCBibWFwMiwgMTAyNCk7CisKKwkvKiB0aGUgZm9sbG93aW5nIHRlc3RzIGFzc3VtZSBhIDMyLSBvciA2NC1iaXQgYXJjaCAoZXZlbiAxMjhiCisJICogaWYgd2UgY2FyZSkKKwkgKi8KKworCWJpdG1hcF9maWxsKGJtYXAyLCAxMDI0KTsKKwliaXRtYXBfY29weShibWFwMiwgYm1hcDEsIDEwOSk7ICAvKiAuLi4gYnV0IDAtcGFkZGVkIHRpbCB3b3JkIGxlbmd0aCAqLworCWV4cGVjdF9lcV9wYmwoIjAtMTA4LDEyOC0xMDIzIiwgYm1hcDIsIDEwMjQpOworCisJYml0bWFwX2ZpbGwoYm1hcDIsIDEwMjQpOworCWJpdG1hcF9jb3B5KGJtYXAyLCBibWFwMSwgOTcpOyAgLyogLi4uIGJ1dCBhbGlnbmVkIG9uIHdvcmQgbGVuZ3RoICovCisJZXhwZWN0X2VxX3BibCgiMC0xMDgsMTI4LTEwMjMiLCBibWFwMiwgMTAyNCk7CisKKwliaXRtYXBfemVybyhibWFwMiwgOTcpOyAgLyogLi4uIGJ1dCAwLXBhZGRlZCB0aWwgd29yZCBsZW5ndGggKi8KKwlleHBlY3RfZXFfcGJsKCIxMjgtMTAyMyIsIGJtYXAyLCAxMDI0KTsKK30KKworI2RlZmluZSBQQVJTRV9USU1FIDB4MQorCitzdHJ1Y3QgdGVzdF9iaXRtYXBfcGFyc2VsaXN0eworCWNvbnN0IGludCBlcnJubzsKKwljb25zdCBjaGFyICppbjsKKwljb25zdCB1bnNpZ25lZCBsb25nICpleHBlY3RlZDsKKwljb25zdCBpbnQgbmJpdHM7CisJY29uc3QgaW50IGZsYWdzOworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgZXhwW10gX19pbml0Y29uc3QgPSB7CisJQklUTUFQX0ZST01fVTY0KDEpLAorCUJJVE1BUF9GUk9NX1U2NCgyKSwKKwlCSVRNQVBfRlJPTV9VNjQoMHgwMDAwZmZmZiksCisJQklUTUFQX0ZST01fVTY0KDB4ZmZmZjAwMDApLAorCUJJVE1BUF9GUk9NX1U2NCgweDU1NTU1NTU1KSwKKwlCSVRNQVBfRlJPTV9VNjQoMHhhYWFhYWFhYSksCisJQklUTUFQX0ZST01fVTY0KDB4MTExMTExMTEpLAorCUJJVE1BUF9GUk9NX1U2NCgweDIyMjIyMjIyKSwKKwlCSVRNQVBfRlJPTV9VNjQoMHhmZmZmZmZmZiksCisJQklUTUFQX0ZST01fVTY0KDB4ZmZmZmZmZmUpLAorCUJJVE1BUF9GUk9NX1U2NCgweDMzMzMzMzMzMTExMTExMTFVTEwpLAorCUJJVE1BUF9GUk9NX1U2NCgweGZmZmZmZmZmNzc3Nzc3NzdVTEwpCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBleHAyW10gX19pbml0Y29uc3QgPSB7CisJQklUTUFQX0ZST01fVTY0KDB4MzMzMzMzMzMxMTExMTExMVVMTCksCisJQklUTUFQX0ZST01fVTY0KDB4ZmZmZmZmZmY3Nzc3Nzc3N1VMTCkKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVzdF9iaXRtYXBfcGFyc2VsaXN0IHBhcnNlbGlzdF90ZXN0c1tdIF9faW5pdGNvbnN0ID0geworI2RlZmluZSBzdGVwIChzaXplb2YodTY0KSAvIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworCXswLCAiMCIsCQkJJmV4cFswXSwgOCwgMH0sCisJezAsICIxIiwJCQkmZXhwWzEgKiBzdGVwXSwgOCwgMH0sCisJezAsICIwLTE1IiwJCQkmZXhwWzIgKiBzdGVwXSwgMzIsIDB9LAorCXswLCAiMTYtMzEiLAkJCSZleHBbMyAqIHN0ZXBdLCAzMiwgMH0sCisJezAsICIwLTMxOjEvMiIsCQkJJmV4cFs0ICogc3RlcF0sIDMyLCAwfSwKKwl7MCwgIjEtMzE6MS8yIiwJCQkmZXhwWzUgKiBzdGVwXSwgMzIsIDB9LAorCXswLCAiMC0zMToxLzQiLAkJCSZleHBbNiAqIHN0ZXBdLCAzMiwgMH0sCisJezAsICIxLTMxOjEvNCIsCQkJJmV4cFs3ICogc3RlcF0sIDMyLCAwfSwKKwl7MCwgIjAtMzE6NC80IiwJCQkmZXhwWzggKiBzdGVwXSwgMzIsIDB9LAorCXswLCAiMS0zMTo0LzQiLAkJCSZleHBbOSAqIHN0ZXBdLCAzMiwgMH0sCisJezAsICIwLTMxOjEvNCwzMi02MzoyLzQiLAkmZXhwWzEwICogc3RlcF0sIDY0LCAwfSwKKwl7MCwgIjAtMzE6My80LDMyLTYzOjQvNCIsCSZleHBbMTEgKiBzdGVwXSwgNjQsIDB9LAorCisJezAsICIwLTMxOjEvNCwzMi02MzoyLzQsNjQtOTU6My80LDk2LTEyNzo0LzQiLAlleHAyLCAxMjgsIDB9LAorCisJezAsICIwLTIwNDc6MTI4LzI1NiIsIE5VTEwsIDIwNDgsIFBBUlNFX1RJTUV9LAorCisJey1FSU5WQUwsICItMSIsCU5VTEwsIDgsIDB9LAorCXstRUlOVkFMLCAiLTAiLAlOVUxMLCA4LCAwfSwKKwl7LUVJTlZBTCwgIjEwLTEiLCBOVUxMLCA4LCAwfSwKKwl7LUVJTlZBTCwgIjAtMzE6IiwgTlVMTCwgOCwgMH0sCisJey1FSU5WQUwsICIwLTMxOjAiLCBOVUxMLCA4LCAwfSwKKwl7LUVJTlZBTCwgIjAtMzE6MC8wIiwgTlVMTCwgOCwgMH0sCisJey1FSU5WQUwsICIwLTMxOjEvMCIsIE5VTEwsIDgsIDB9LAorCXstRUlOVkFMLCAiMC0zMToxMC8xIiwgTlVMTCwgOCwgMH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9iaXRtYXBfcGFyc2VsaXN0KHZvaWQpCit7CisJaW50IGk7CisJaW50IGVycjsKKwljeWNsZXNfdCBjeWNsZXM7CisJREVDTEFSRV9CSVRNQVAoYm1hcCwgMjA0OCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYXJzZWxpc3RfdGVzdHMpOyBpKyspIHsKKyNkZWZpbmUgcHRlc3QgcGFyc2VsaXN0X3Rlc3RzW2ldCisKKwkJY3ljbGVzID0gZ2V0X2N5Y2xlcygpOworCQllcnIgPSBiaXRtYXBfcGFyc2VsaXN0KHB0ZXN0LmluLCBibWFwLCBwdGVzdC5uYml0cyk7CisJCWN5Y2xlcyA9IGdldF9jeWNsZXMoKSAtIGN5Y2xlczsKKworCQlpZiAoZXJyICE9IHB0ZXN0LmVycm5vKSB7CisJCQlwcl9lcnIoInRlc3QgJWQ6IGlucHV0IGlzICVzLCBlcnJubyBpcyAlZCwgZXhwZWN0ZWQgJWRcbiIsCisJCQkJCWksIHB0ZXN0LmluLCBlcnIsIHB0ZXN0LmVycm5vKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFlcnIgJiYgcHRlc3QuZXhwZWN0ZWQKKwkJCSAmJiAhX19iaXRtYXBfZXF1YWwoYm1hcCwgcHRlc3QuZXhwZWN0ZWQsIHB0ZXN0Lm5iaXRzKSkgeworCQkJcHJfZXJyKCJ0ZXN0ICVkOiBpbnB1dCBpcyAlcywgcmVzdWx0IGlzIDB4JWx4LCBleHBlY3RlZCAweCVseFxuIiwKKwkJCQkJaSwgcHRlc3QuaW4sIGJtYXBbMF0sICpwdGVzdC5leHBlY3RlZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChwdGVzdC5mbGFncyAmIFBBUlNFX1RJTUUpCisJCQlwcl9lcnIoInRlc3QgJWQ6IGlucHV0IGlzICclcycgT0ssIFRpbWU6ICVsbHVcbiIsCisJCQkJCWksIHB0ZXN0LmluLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWN5Y2xlcyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9iaXRtYXBfdTMyX2FycmF5X2NvbnZlcnNpb25zKHZvaWQpCit7CisJREVDTEFSRV9CSVRNQVAoYm1hcDEsIDEwMjQpOworCURFQ0xBUkVfQklUTUFQKGJtYXAyLCAxMDI0KTsKKwl1MzIgZXhwX2FyclszMl0sIGFyclszMl07CisJdW5zaWduZWQgbmJpdHM7CisKKwlmb3IgKG5iaXRzID0gMCA7IG5iaXRzIDwgMjU3IDsgKytuYml0cykgeworCQljb25zdCB1bnNpZ25lZCBpbnQgdXNlZF91MzJzID0gRElWX1JPVU5EX1VQKG5iaXRzLCAzMik7CisJCXVuc2lnbmVkIGludCBpLCBydjsKKworCQliaXRtYXBfemVybyhibWFwMSwgbmJpdHMpOworCQliaXRtYXBfc2V0KGJtYXAxLCBuYml0cywgMTAyNCAtIG5iaXRzKTsgIC8qIGdhcmJhZ2UgKi8KKworCQltZW1zZXQoYXJyLCAweGZmLCBzaXplb2YoYXJyKSk7CisJCXJ2ID0gYml0bWFwX3RvX3UzMmFycmF5KGFyciwgdXNlZF91MzJzLCBibWFwMSwgbmJpdHMpOworCQlleHBlY3RfZXFfdWludChuYml0cywgcnYpOworCisJCW1lbXNldChleHBfYXJyLCAweGZmLCBzaXplb2YoZXhwX2FycikpOworCQltZW1zZXQoZXhwX2FyciwgMCwgdXNlZF91MzJzKnNpemVvZigqZXhwX2FycikpOworCQlleHBlY3RfZXFfdTMyX2FycmF5KGV4cF9hcnIsIDMyLCBhcnIsIDMyKTsKKworCQliaXRtYXBfZmlsbChibWFwMiwgMTAyNCk7CisJCXJ2ID0gYml0bWFwX2Zyb21fdTMyYXJyYXkoYm1hcDIsIG5iaXRzLCBhcnIsIHVzZWRfdTMycyk7CisJCWV4cGVjdF9lcV91aW50KG5iaXRzLCBydik7CisJCWV4cGVjdF9lcV9iaXRtYXAoYm1hcDEsIDEwMjQsIGJtYXAyLCAxMDI0KTsKKworCQlmb3IgKGkgPSAwIDsgaSA8IG5iaXRzIDsgKytpKSB7CisJCQkvKgorCQkJICogdGVzdCBjb252ZXJzaW9uIGJpdG1hcCAtPiB1MzJbXQorCQkJICovCisKKwkJCWJpdG1hcF96ZXJvKGJtYXAxLCAxMDI0KTsKKwkJCV9fc2V0X2JpdChpLCBibWFwMSk7CisJCQliaXRtYXBfc2V0KGJtYXAxLCBuYml0cywgMTAyNCAtIG5iaXRzKTsgIC8qIGdhcmJhZ2UgKi8KKworCQkJbWVtc2V0KGFyciwgMHhmZiwgc2l6ZW9mKGFycikpOworCQkJcnYgPSBiaXRtYXBfdG9fdTMyYXJyYXkoYXJyLCB1c2VkX3UzMnMsIGJtYXAxLCBuYml0cyk7CisJCQlleHBlY3RfZXFfdWludChuYml0cywgcnYpOworCisJCQkvKiAxc3QgdXNlZCB1MzIgd29yZHMgY29udGFpbiBleHBlY3RlZCBiaXQgc2V0LCB0aGUKKwkJCSAqIHJlbWFpbmluZyB3b3JkcyBhcmUgbGVmdCB1bmNoYW5nZWQgKDB4ZmYpCisJCQkgKi8KKwkJCW1lbXNldChleHBfYXJyLCAweGZmLCBzaXplb2YoZXhwX2FycikpOworCQkJbWVtc2V0KGV4cF9hcnIsIDAsIHVzZWRfdTMycypzaXplb2YoKmV4cF9hcnIpKTsKKwkJCWV4cF9hcnJbaS8zMl0gPSAoMVU8PChpJTMyKSk7CisJCQlleHBlY3RfZXFfdTMyX2FycmF5KGV4cF9hcnIsIDMyLCBhcnIsIDMyKTsKKworCisJCQkvKiBzYW1lLCB3aXRoIGxvbmdlciBhcnJheSB0byBmaWxsCisJCQkgKi8KKwkJCW1lbXNldChhcnIsIDB4ZmYsIHNpemVvZihhcnIpKTsKKwkJCXJ2ID0gYml0bWFwX3RvX3UzMmFycmF5KGFyciwgMzIsIGJtYXAxLCBuYml0cyk7CisJCQlleHBlY3RfZXFfdWludChuYml0cywgcnYpOworCisJCQkvKiAxc3QgdXNlZCB1MzIgd29yZHMgY29udGFpbiBleHBlY3RlZCBiaXQgc2V0LCB0aGUKKwkJCSAqIHJlbWFpbmluZyB3b3JkcyBhcmUgYWxsIDBzCisJCQkgKi8KKwkJCW1lbXNldChleHBfYXJyLCAwLCBzaXplb2YoZXhwX2FycikpOworCQkJZXhwX2FycltpLzMyXSA9ICgxVTw8KGklMzIpKTsKKwkJCWV4cGVjdF9lcV91MzJfYXJyYXkoZXhwX2FyciwgMzIsIGFyciwgMzIpOworCisJCQkvKgorCQkJICogdGVzdCBjb252ZXJzaW9uIHUzMltdIC0+IGJpdG1hcAorCQkJICovCisKKwkJCS8qIHRoZSAxc3QgbmJpdHMgb2YgYm1hcDIgYXJlIGlkZW50aWNhbCB0bworCQkJICogYm1hcDEsIHRoZSByZW1haW5pbmcgYml0cyBvZiBibWFwMiBhcmUgbGVmdAorCQkJICogdW5jaGFuZ2VkIChhbGwgMXMpCisJCQkgKi8KKwkJCWJpdG1hcF9maWxsKGJtYXAyLCAxMDI0KTsKKwkJCXJ2ID0gYml0bWFwX2Zyb21fdTMyYXJyYXkoYm1hcDIsIG5iaXRzLAorCQkJCQkJICBleHBfYXJyLCB1c2VkX3UzMnMpOworCQkJZXhwZWN0X2VxX3VpbnQobmJpdHMsIHJ2KTsKKworCQkJZXhwZWN0X2VxX2JpdG1hcChibWFwMSwgMTAyNCwgYm1hcDIsIDEwMjQpOworCisJCQkvKiBzYW1lLCB3aXRoIG1vcmUgYml0cyB0byBmaWxsCisJCQkgKi8KKwkJCW1lbXNldChhcnIsIDB4ZmYsIHNpemVvZihhcnIpKTsgIC8qIGdhcmJhZ2UgKi8KKwkJCW1lbXNldChhcnIsIDAsIHVzZWRfdTMycypzaXplb2YodTMyKSk7CisJCQlhcnJbaS8zMl0gPSAoMVU8PChpJTMyKSk7CisKKwkJCWJpdG1hcF9maWxsKGJtYXAyLCAxMDI0KTsKKwkJCXJ2ID0gYml0bWFwX2Zyb21fdTMyYXJyYXkoYm1hcDIsIDEwMjQsIGFyciwgdXNlZF91MzJzKTsKKwkJCWV4cGVjdF9lcV91aW50KHVzZWRfdTMycyozMiwgcnYpOworCisJCQkvKiB0aGUgMXN0IG5iaXRzIG9mIGJtYXAyIGFyZSBpZGVudGljYWwgdG8KKwkJCSAqIGJtYXAxLCB0aGUgcmVtYWluaW5nIGJpdHMgb2YgYm1hcDIgYXJlIGNsZWFyZWQKKwkJCSAqLworCQkJYml0bWFwX3plcm8oYm1hcDEsIDEwMjQpOworCQkJX19zZXRfYml0KGksIGJtYXAxKTsKKwkJCWV4cGVjdF9lcV9iaXRtYXAoYm1hcDEsIDEwMjQsIGJtYXAyLCAxMDI0KTsKKworCisJCQkvKgorCQkJICogdGVzdCBzaG9ydCBjb252ZXJzaW9uIGJpdG1hcCAtPiB1MzJbXSAoMQorCQkJICogd29yZCB0b28gc2hvcnQpCisJCQkgKi8KKwkJCWlmICh1c2VkX3UzMnMgPiAxKSB7CisJCQkJYml0bWFwX3plcm8oYm1hcDEsIDEwMjQpOworCQkJCV9fc2V0X2JpdChpLCBibWFwMSk7CisJCQkJYml0bWFwX3NldChibWFwMSwgbmJpdHMsCisJCQkJCSAgIDEwMjQgLSBuYml0cyk7ICAvKiBnYXJiYWdlICovCisJCQkJbWVtc2V0KGFyciwgMHhmZiwgc2l6ZW9mKGFycikpOworCisJCQkJcnYgPSBiaXRtYXBfdG9fdTMyYXJyYXkoYXJyLCB1c2VkX3UzMnMgLSAxLAorCQkJCQkJCWJtYXAxLCBuYml0cyk7CisJCQkJZXhwZWN0X2VxX3VpbnQoKHVzZWRfdTMycyAtIDEpKjMyLCBydik7CisKKwkJCQkvKiAxc3QgdXNlZCB1MzIgd29yZHMgY29udGFpbiBleHBlY3RlZAorCQkJCSAqIGJpdCBzZXQsIHRoZSByZW1haW5pbmcgd29yZHMgYXJlCisJCQkJICogbGVmdCB1bmNoYW5nZWQgKDB4ZmYpCisJCQkJICovCisJCQkJbWVtc2V0KGV4cF9hcnIsIDB4ZmYsIHNpemVvZihleHBfYXJyKSk7CisJCQkJbWVtc2V0KGV4cF9hcnIsIDAsCisJCQkJICAgICAgICh1c2VkX3UzMnMtMSkqc2l6ZW9mKCpleHBfYXJyKSk7CisJCQkJaWYgKChpLzMyKSA8ICh1c2VkX3UzMnMgLSAxKSkKKwkJCQkJZXhwX2FycltpLzMyXSA9ICgxVTw8KGklMzIpKTsKKwkJCQlleHBlY3RfZXFfdTMyX2FycmF5KGV4cF9hcnIsIDMyLCBhcnIsIDMyKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIHRlc3Qgc2hvcnQgY29udmVyc2lvbiB1MzJbXSAtPiBiaXRtYXAgKDMKKwkJCSAqIGJpdHMgdG9vIHNob3J0KQorCQkJICovCisJCQlpZiAobmJpdHMgPiAzKSB7CisJCQkJbWVtc2V0KGFyciwgMHhmZiwgc2l6ZW9mKGFycikpOyAgLyogZ2FyYmFnZSAqLworCQkJCW1lbXNldChhcnIsIDAsIHVzZWRfdTMycypzaXplb2YoKmFycikpOworCQkJCWFycltpLzMyXSA9ICgxVTw8KGklMzIpKTsKKworCQkJCWJpdG1hcF96ZXJvKGJtYXAxLCAxMDI0KTsKKwkJCQlydiA9IGJpdG1hcF9mcm9tX3UzMmFycmF5KGJtYXAxLCBuYml0cyAtIDMsCisJCQkJCQkJICBhcnIsIHVzZWRfdTMycyk7CisJCQkJZXhwZWN0X2VxX3VpbnQobmJpdHMgLSAzLCBydik7CisKKwkJCQkvKiB3ZSBhcmUgZXhwZWN0aW5nIHRoZSBiaXQgPCBuYml0cyAtCisJCQkJICogMyAobm9uZSBvdGhlcndpc2UpLCBhbmQgdGhlIHJlc3Qgb2YKKwkJCQkgKiBibWFwMSB1bmNoYW5nZWQgKDAtZmlsbGVkKQorCQkJCSAqLworCQkJCWJpdG1hcF96ZXJvKGJtYXAyLCAxMDI0KTsKKwkJCQlpZiAoaSA8IG5iaXRzIC0gMykKKwkJCQkJX19zZXRfYml0KGksIGJtYXAyKTsKKwkJCQlleHBlY3RfZXFfYml0bWFwKGJtYXAyLCAxMDI0LCBibWFwMSwgMTAyNCk7CisKKwkJCQkvKiBkbyB0aGUgc2FtZSB3aXRoIGJtYXAxIGluaXRpYWxseQorCQkJCSAqIDEtZmlsbGVkCisJCQkJICovCisKKwkJCQliaXRtYXBfZmlsbChibWFwMSwgMTAyNCk7CisJCQkJcnYgPSBiaXRtYXBfZnJvbV91MzJhcnJheShibWFwMSwgbmJpdHMgLSAzLAorCQkJCQkJCSBhcnIsIHVzZWRfdTMycyk7CisJCQkJZXhwZWN0X2VxX3VpbnQobmJpdHMgLSAzLCBydik7CisKKwkJCQkvKiB3ZSBhcmUgZXhwZWN0aW5nIHRoZSBiaXQgPCBuYml0cyAtCisJCQkJICogMyAobm9uZSBvdGhlcndpc2UpLCBhbmQgdGhlIHJlc3Qgb2YKKwkJCQkgKiBibWFwMSB1bmNoYW5nZWQgKDEtZmlsbGVkKQorCQkJCSAqLworCQkJCWJpdG1hcF96ZXJvKGJtYXAyLCAxMDI0KTsKKwkJCQlpZiAoaSA8IG5iaXRzIC0gMykKKwkJCQkJX19zZXRfYml0KGksIGJtYXAyKTsKKwkJCQliaXRtYXBfc2V0KGJtYXAyLCBuYml0cy0zLCAxMDI0IC0gbmJpdHMgKyAzKTsKKwkJCQlleHBlY3RfZXFfYml0bWFwKGJtYXAyLCAxMDI0LCBibWFwMSwgMTAyNCk7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5vaW5saW5lIF9faW5pdCB0ZXN0X21lbV9vcHRpbWlzYXRpb25zKHZvaWQpCit7CisJREVDTEFSRV9CSVRNQVAoYm1hcDEsIDEwMjQpOworCURFQ0xBUkVfQklUTUFQKGJtYXAyLCAxMDI0KTsKKwl1bnNpZ25lZCBpbnQgc3RhcnQsIG5iaXRzOworCisJZm9yIChzdGFydCA9IDA7IHN0YXJ0IDwgMTAyNDsgc3RhcnQgKz0gOCkgeworCQlmb3IgKG5iaXRzID0gMDsgbmJpdHMgPCAxMDI0IC0gc3RhcnQ7IG5iaXRzICs9IDgpIHsKKwkJCW1lbXNldChibWFwMSwgMHg1YSwgc2l6ZW9mKGJtYXAxKSk7CisJCQltZW1zZXQoYm1hcDIsIDB4NWEsIHNpemVvZihibWFwMikpOworCisJCQliaXRtYXBfc2V0KGJtYXAxLCBzdGFydCwgbmJpdHMpOworCQkJX19iaXRtYXBfc2V0KGJtYXAyLCBzdGFydCwgbmJpdHMpOworCQkJaWYgKCFiaXRtYXBfZXF1YWwoYm1hcDEsIGJtYXAyLCAxMDI0KSkgeworCQkJCXByaW50aygic2V0IG5vdCBlcXVhbCAlZCAlZFxuIiwgc3RhcnQsIG5iaXRzKTsKKwkJCQlmYWlsZWRfdGVzdHMrKzsKKwkJCX0KKwkJCWlmICghX19iaXRtYXBfZXF1YWwoYm1hcDEsIGJtYXAyLCAxMDI0KSkgeworCQkJCXByaW50aygic2V0IG5vdCBfX2VxdWFsICVkICVkXG4iLCBzdGFydCwgbmJpdHMpOworCQkJCWZhaWxlZF90ZXN0cysrOworCQkJfQorCisJCQliaXRtYXBfY2xlYXIoYm1hcDEsIHN0YXJ0LCBuYml0cyk7CisJCQlfX2JpdG1hcF9jbGVhcihibWFwMiwgc3RhcnQsIG5iaXRzKTsKKwkJCWlmICghYml0bWFwX2VxdWFsKGJtYXAxLCBibWFwMiwgMTAyNCkpIHsKKwkJCQlwcmludGsoImNsZWFyIG5vdCBlcXVhbCAlZCAlZFxuIiwgc3RhcnQsIG5iaXRzKTsKKwkJCQlmYWlsZWRfdGVzdHMrKzsKKwkJCX0KKwkJCWlmICghX19iaXRtYXBfZXF1YWwoYm1hcDEsIGJtYXAyLCAxMDI0KSkgeworCQkJCXByaW50aygiY2xlYXIgbm90IF9fZXF1YWwgJWQgJWRcbiIsIHN0YXJ0LAorCQkJCQkJCQkJbmJpdHMpOworCQkJCWZhaWxlZF90ZXN0cysrOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X2JpdG1hcF9pbml0KHZvaWQpCit7CisJdGVzdF96ZXJvX2ZpbGxfY29weSgpOworCXRlc3RfYml0bWFwX3UzMl9hcnJheV9jb252ZXJzaW9ucygpOworCXRlc3RfYml0bWFwX3BhcnNlbGlzdCgpOworCXRlc3RfbWVtX29wdGltaXNhdGlvbnMoKTsKKworCWlmIChmYWlsZWRfdGVzdHMgPT0gMCkKKwkJcHJfaW5mbygiYWxsICV1IHRlc3RzIHBhc3NlZFxuIiwgdG90YWxfdGVzdHMpOworCWVsc2UKKwkJcHJfd2FybigiZmFpbGVkICV1IG91dCBvZiAldSB0ZXN0c1xuIiwKKwkJCWZhaWxlZF90ZXN0cywgdG90YWxfdGVzdHMpOworCisJcmV0dXJuIGZhaWxlZF90ZXN0cyA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVzdF9iaXRtYXBfY2xlYW51cCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdCh0ZXN0X2JpdG1hcF9pbml0KTsKK21vZHVsZV9leGl0KHRlc3RfYml0bWFwX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJkYXZpZCBkZWNvdGlnbnkgPGRhdmlkLmRlY290aWdueUBnb29nbGVycy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2JwZi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9icGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWViZjJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9icGYuYwpAQCAtMCwwICsxLDY0OTQgQEAKKy8qCisgKiBUZXN0c3VpdGUgZm9yIEJQRiBpbnRlcnByZXRlciBhbmQgQlBGIEpJVCBjb21waWxlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDE0IFBMVU1ncmlkLCBodHRwOi8vcGx1bWdyaWQuY29tCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisKKy8qIEdlbmVyYWwgdGVzdCBzcGVjaWZpYyBzZXR0aW5ncyAqLworI2RlZmluZSBNQVhfU1VCVEVTVFMJMworI2RlZmluZSBNQVhfVEVTVFJVTlMJMTAwMDAKKyNkZWZpbmUgTUFYX0RBVEEJMTI4CisjZGVmaW5lIE1BWF9JTlNOUwk1MTIKKyNkZWZpbmUgTUFYX0sJCTB4ZmZmZkZGRkYKKworLyogRmV3IGNvbnN0YW50cyB1c2VkIHRvIGluaXQgdGVzdCAnc2tiJyAqLworI2RlZmluZSBTS0JfVFlQRQkzCisjZGVmaW5lIFNLQl9NQVJLCTB4MTIzNGFhYWEKKyNkZWZpbmUgU0tCX0hBU0gJMHgxMjM0YWFhYgorI2RlZmluZSBTS0JfUVVFVUVfTUFQCTEyMworI2RlZmluZSBTS0JfVkxBTl9UQ0kJMHhmZmZmCisjZGVmaW5lIFNLQl9ERVZfSUZJTkRFWAk1NzcKKyNkZWZpbmUgU0tCX0RFVl9UWVBFCTU4OAorCisvKiBSZWRlZmluZSBSRUdzIHRvIG1ha2UgdGVzdHMgbGVzcyB2ZXJib3NlICovCisjZGVmaW5lIFIwCQlCUEZfUkVHXzAKKyNkZWZpbmUgUjEJCUJQRl9SRUdfMQorI2RlZmluZSBSMgkJQlBGX1JFR18yCisjZGVmaW5lIFIzCQlCUEZfUkVHXzMKKyNkZWZpbmUgUjQJCUJQRl9SRUdfNAorI2RlZmluZSBSNQkJQlBGX1JFR181CisjZGVmaW5lIFI2CQlCUEZfUkVHXzYKKyNkZWZpbmUgUjcJCUJQRl9SRUdfNworI2RlZmluZSBSOAkJQlBGX1JFR184CisjZGVmaW5lIFI5CQlCUEZfUkVHXzkKKyNkZWZpbmUgUjEwCQlCUEZfUkVHXzEwCisKKy8qIEZsYWdzIHRoYXQgY2FuIGJlIHBhc3NlZCB0byB0ZXN0IGNhc2VzICovCisjZGVmaW5lIEZMQUdfTk9fREFUQQkJQklUKDApCisjZGVmaW5lIEZMQUdfRVhQRUNURURfRkFJTAlCSVQoMSkKKyNkZWZpbmUgRkxBR19TS0JfRlJBRwkJQklUKDIpCisKK2VudW0geworCUNMQVNTSUMgID0gQklUKDYpLAkvKiBPbGQgQlBGIGluc3RydWN0aW9ucyBvbmx5LiAqLworCUlOVEVSTkFMID0gQklUKDcpLAkvKiBFeHRlbmRlZCBpbnN0cnVjdGlvbiBzZXQuICAqLworfTsKKworI2RlZmluZSBURVNUX1RZUEVfTUFTSwkJKENMQVNTSUMgfCBJTlRFUk5BTCkKKworc3RydWN0IGJwZl90ZXN0IHsKKwljb25zdCBjaGFyICpkZXNjcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrX2ZpbHRlciBpbnNuc1tNQVhfSU5TTlNdOworCQlzdHJ1Y3QgYnBmX2luc24gaW5zbnNfaW50W01BWF9JTlNOU107CisJCXN0cnVjdCB7CisJCQl2b2lkICppbnNuczsKKwkJCXVuc2lnbmVkIGludCBsZW47CisJCX0gcHRyOworCX0gdTsKKwlfX3U4IGF1eDsKKwlfX3U4IGRhdGFbTUFYX0RBVEFdOworCXN0cnVjdCB7CisJCWludCBkYXRhX3NpemU7CisJCV9fdTMyIHJlc3VsdDsKKwl9IHRlc3RbTUFYX1NVQlRFU1RTXTsKKwlpbnQgKCpmaWxsX2hlbHBlcikoc3RydWN0IGJwZl90ZXN0ICpzZWxmKTsKKwlpbnQgZXhwZWN0ZWRfZXJyY29kZTsgLyogdXNlZCB3aGVuIEZMQUdfRVhQRUNURURfRkFJTCBpcyBzZXQgaW4gdGhlIGF1eCAqLworCV9fdTggZnJhZ19kYXRhW01BWF9EQVRBXTsKKwlpbnQgc3RhY2tfZGVwdGg7IC8qIGZvciBlQlBGIG9ubHksIHNpbmNlIHRlc3RzIGRvbid0IGNhbGwgdmVyaWZpZXIgKi8KK307CisKKy8qIExhcmdlIHRlc3QgY2FzZXMgbmVlZCBzZXBhcmF0ZSBhbGxvY2F0aW9uIGFuZCBmaWxsIGhhbmRsZXIuICovCisKK3N0YXRpYyBpbnQgYnBmX2ZpbGxfbWF4aW5zbnMxKHN0cnVjdCBicGZfdGVzdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gQlBGX01BWElOU05TOworCXN0cnVjdCBzb2NrX2ZpbHRlciAqaW5zbjsKKwlfX3UzMiBrID0gfjA7CisJaW50IGk7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyssIGstLSkKKwkJaW5zbltpXSA9IF9fQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCBrKTsKKworCXNlbGYtPnUucHRyLmluc25zID0gaW5zbjsKKwlzZWxmLT51LnB0ci5sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmlsbF9tYXhpbnNuczIoc3RydWN0IGJwZl90ZXN0ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBCUEZfTUFYSU5TTlM7CisJc3RydWN0IHNvY2tfZmlsdGVyICppbnNuOworCWludCBpOworCisJaW5zbiA9IGttYWxsb2NfYXJyYXkobGVuLCBzaXplb2YoKmluc24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc24pCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlpbnNuW2ldID0gX19CUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4ZmVmZWZlZmUpOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX21heGluc25zMyhzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IEJQRl9NQVhJTlNOUzsKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmluc247CisJc3RydWN0IHJuZF9zdGF0ZSBybmQ7CisJaW50IGk7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcmFuZG9tX3NlZWRfc3RhdGUoJnJuZCwgMzE0MTU5MjY1MzU4OTc5MzIzOFVMTCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7CisJCV9fdTMyIGsgPSBwcmFuZG9tX3UzMl9zdGF0ZSgmcm5kKTsKKworCQlpbnNuW2ldID0gX19CUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LLCBrKTsKKwl9CisKKwlpbnNuW2xlbiAtIDFdID0gX19CUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX21heGluc25zNChzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IEJQRl9NQVhJTlNOUyArIDE7CisJc3RydWN0IHNvY2tfZmlsdGVyICppbnNuOworCWludCBpOworCisJaW5zbiA9IGttYWxsb2NfYXJyYXkobGVuLCBzaXplb2YoKmluc24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc24pCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlpbnNuW2ldID0gX19CUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4ZmVmZWZlZmUpOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX21heGluc25zNShzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IEJQRl9NQVhJTlNOUzsKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmluc247CisJaW50IGk7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnNuWzBdID0gX19CUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pBLCBsZW4gLSAyLCAwLCAwKTsKKworCWZvciAoaSA9IDE7IGkgPCBsZW4gLSAxOyBpKyspCisJCWluc25baV0gPSBfX0JQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMHhmZWZlZmVmZSk7CisKKwlpbnNuW2xlbiAtIDFdID0gX19CUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4YWJhYmFiYWIpOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX21heGluc25zNihzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IEJQRl9NQVhJTlNOUzsKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmluc247CisJaW50IGk7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKQorCQlpbnNuW2ldID0gX19CUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsIFNLRl9BRF9PRkYgKworCQkJCSAgICAgU0tGX0FEX1ZMQU5fVEFHX1BSRVNFTlQpOworCisJaW5zbltsZW4gLSAxXSA9IF9fQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKTsKKworCXNlbGYtPnUucHRyLmluc25zID0gaW5zbjsKKwlzZWxmLT51LnB0ci5sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmlsbF9tYXhpbnNuczcoc3RydWN0IGJwZl90ZXN0ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBCUEZfTUFYSU5TTlM7CisJc3RydWN0IHNvY2tfZmlsdGVyICppbnNuOworCWludCBpOworCisJaW5zbiA9IGttYWxsb2NfYXJyYXkobGVuLCBzaXplb2YoKmluc24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc24pCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAtIDQ7IGkrKykKKwkJaW5zbltpXSA9IF9fQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLCBTS0ZfQURfT0ZGICsKKwkJCQkgICAgIFNLRl9BRF9DUFUpOworCisJaW5zbltsZW4gLSA0XSA9IF9fQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKTsKKwlpbnNuW2xlbiAtIDNdID0gX19CUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsIFNLRl9BRF9PRkYgKworCQkJCSAgIFNLRl9BRF9DUFUpOworCWluc25bbGVuIC0gMl0gPSBfX0JQRl9TVE1UKEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1gsIDApOworCWluc25bbGVuIC0gMV0gPSBfX0JQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCk7CisKKwlzZWxmLT51LnB0ci5pbnNucyA9IGluc247CisJc2VsZi0+dS5wdHIubGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ZpbGxfbWF4aW5zbnM4KHN0cnVjdCBicGZfdGVzdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gQlBGX01BWElOU05TOworCXN0cnVjdCBzb2NrX2ZpbHRlciAqaW5zbjsKKwlpbnQgaSwgam1wX29mZiA9IGxlbiAtIDM7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnNuWzBdID0gX19CUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAweGZmZmZmZmZmKTsKKworCWZvciAoaSA9IDE7IGkgPCBsZW4gLSAxOyBpKyspCisJCWluc25baV0gPSBfX0JQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdULCAweGZmZmZmZmZmLCBqbXBfb2ZmLS0sIDApOworCisJaW5zbltsZW4gLSAxXSA9IF9fQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKTsKKworCXNlbGYtPnUucHRyLmluc25zID0gaW5zbjsKKwlzZWxmLT51LnB0ci5sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBicGZfZmlsbF9tYXhpbnNuczkoc3RydWN0IGJwZl90ZXN0ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBCUEZfTUFYSU5TTlM7CisJc3RydWN0IGJwZl9pbnNuICppbnNuOworCWludCBpOworCisJaW5zbiA9IGttYWxsb2NfYXJyYXkobGVuLCBzaXplb2YoKmluc24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc24pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5zblswXSA9IEJQRl9KTVBfSU1NKEJQRl9KQSwgMCwgMCwgbGVuIC0gMik7CisJaW5zblsxXSA9IEJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDB4Y2JhYmFiYWIpOworCWluc25bMl0gPSBCUEZfRVhJVF9JTlNOKCk7CisKKwlmb3IgKGkgPSAzOyBpIDwgbGVuIC0gMjsgaSsrKQorCQlpbnNuW2ldID0gQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMHhmZWZlZmVmZSk7CisKKwlpbnNuW2xlbiAtIDJdID0gQlBGX0VYSVRfSU5TTigpOworCWluc25bbGVuIC0gMV0gPSBCUEZfSk1QX0lNTShCUEZfSkEsIDAsIDAsIC0obGVuIC0gMSkpOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX21heGluc25zMTAoc3RydWN0IGJwZl90ZXN0ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBCUEZfTUFYSU5TTlMsIGhsZW4gPSBsZW4gLSAyOworCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKKwlpbnQgaTsKKworCWluc24gPSBrbWFsbG9jX2FycmF5KGxlbiwgc2l6ZW9mKCppbnNuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnNuKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBobGVuIC8gMjsgaSsrKQorCQlpbnNuW2ldID0gQlBGX0pNUF9JTU0oQlBGX0pBLCAwLCAwLCBobGVuIC0gMiAtIDIgKiBpKTsKKwlmb3IgKGkgPSBobGVuIC0gMTsgaSA+IGhsZW4gLyAyOyBpLS0pCisJCWluc25baV0gPSBCUEZfSk1QX0lNTShCUEZfSkEsIDAsIDAsIGhsZW4gLSAxIC0gMiAqIGkpOworCisJaW5zbltobGVuIC8gMl0gPSBCUEZfSk1QX0lNTShCUEZfSkEsIDAsIDAsIGhsZW4gLyAyIC0gMSk7CisJaW5zbltobGVuXSAgICAgPSBCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAweGFiYWJhYmFjKTsKKwlpbnNuW2hsZW4gKyAxXSA9IEJQRl9FWElUX0lOU04oKTsKKworCXNlbGYtPnUucHRyLmluc25zID0gaW5zbjsKKwlzZWxmLT51LnB0ci5sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2JwZl9maWxsX2phKHN0cnVjdCBicGZfdGVzdCAqc2VsZiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCSB1bnNpZ25lZCBpbnQgcGxlbikKK3sKKwlzdHJ1Y3Qgc29ja19maWx0ZXIgKmluc247CisJdW5zaWduZWQgaW50IHJsZW47CisJaW50IGksIGo7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlybGVuID0gKGxlbiAlIHBsZW4pIC0gMTsKKworCWZvciAoaSA9IDA7IGkgKyBwbGVuIDwgbGVuOyBpICs9IHBsZW4pCisJCWZvciAoaiA9IDA7IGogPCBwbGVuOyBqKyspCisJCQlpbnNuW2kgKyBqXSA9IF9fQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KQSwKKwkJCQkJCSBwbGVuIC0gMSAtIGosIDAsIDApOworCWZvciAoaiA9IDA7IGogPCBybGVuOyBqKyspCisJCWluc25baSArIGpdID0gX19CUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pBLCBybGVuIC0gMSAtIGosCisJCQkJCSAwLCAwKTsKKworCWluc25bbGVuIC0gMV0gPSBfX0JQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMHhhYmFiY2JhYyk7CisKKwlzZWxmLT51LnB0ci5pbnNucyA9IGluc247CisJc2VsZi0+dS5wdHIubGVuID0gbGVuOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnBmX2ZpbGxfbWF4aW5zbnMxMShzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJLyogSGl0cyA3MCBwYXNzZXMgb24geDg2XzY0LCBzbyBjYW5ub3QgZ2V0IEpJVGVkIHRoZXJlLiAqLworCXJldHVybiBfX2JwZl9maWxsX2phKHNlbGYsIEJQRl9NQVhJTlNOUywgNjgpOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX2phKHN0cnVjdCBicGZfdGVzdCAqc2VsZikKK3sKKwkvKiBIaXRzIGV4YWN0bHkgMTEgcGFzc2VzIG9uIHg4Nl82NCBKSVQuICovCisJcmV0dXJuIF9fYnBmX2ZpbGxfamEoc2VsZiwgMTIsIDkpOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX2xkX2Fic19nZXRfcHJvY2Vzc29yX2lkKHN0cnVjdCBicGZfdGVzdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gQlBGX01BWElOU05TOworCXN0cnVjdCBzb2NrX2ZpbHRlciAqaW5zbjsKKwlpbnQgaTsKKworCWluc24gPSBrbWFsbG9jX2FycmF5KGxlbiwgc2l6ZW9mKCppbnNuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnNuKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW4gLSAxOyBpICs9IDIpIHsKKwkJaW5zbltpXSA9IF9fQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAwKTsKKwkJaW5zbltpICsgMV0gPSBfX0JQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfQ1BVKTsKKwl9CisKKwlpbnNuW2xlbiAtIDFdID0gX19CUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4YmVlKTsKKworCXNlbGYtPnUucHRyLmluc25zID0gaW5zbjsKKwlzZWxmLT51LnB0ci5sZW4gPSBsZW47CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBQVVNIX0NOVCA2OAorLyogdGVzdDoge3NrYi0+ZGF0YVswXSwgdmxhbl9wdXNofSB4IDY4ICsge3NrYi0+ZGF0YVswXSwgdmxhbl9wb3B9IHggNjggKi8KK3N0YXRpYyBpbnQgYnBmX2ZpbGxfbGRfYWJzX3ZsYW5fcHVzaF9wb3Aoc3RydWN0IGJwZl90ZXN0ICpzZWxmKQoreworCXVuc2lnbmVkIGludCBsZW4gPSBCUEZfTUFYSU5TTlM7CisJc3RydWN0IGJwZl9pbnNuICppbnNuOworCWludCBpID0gMCwgaiwgayA9IDA7CisKKwlpbnNuID0ga21hbGxvY19hcnJheShsZW4sIHNpemVvZigqaW5zbiksIEdGUF9LRVJORUwpOworCWlmICghaW5zbikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbnNuW2krK10gPSBCUEZfTU9WNjRfUkVHKFI2LCBSMSk7Citsb29wOgorCWZvciAoaiA9IDA7IGogPCBQVVNIX0NOVDsgaisrKSB7CisJCWluc25baSsrXSA9IEJQRl9MRF9BQlMoQlBGX0IsIDApOworCQlpbnNuW2ldID0gQlBGX0pNUF9JTU0oQlBGX0pORSwgUjAsIDB4MzQsIGxlbiAtIGkgLSAyKTsKKwkJaSsrOworCQlpbnNuW2krK10gPSBCUEZfTU9WNjRfUkVHKFIxLCBSNik7CisJCWluc25baSsrXSA9IEJQRl9NT1Y2NF9JTU0oUjIsIDEpOworCQlpbnNuW2krK10gPSBCUEZfTU9WNjRfSU1NKFIzLCAyKTsKKwkJaW5zbltpKytdID0gQlBGX1JBV19JTlNOKEJQRl9KTVAgfCBCUEZfQ0FMTCwgMCwgMCwgMCwKKwkJCQkJIGJwZl9za2Jfdmxhbl9wdXNoX3Byb3RvLmZ1bmMgLSBfX2JwZl9jYWxsX2Jhc2UpOworCQlpbnNuW2ldID0gQlBGX0pNUF9JTU0oQlBGX0pORSwgUjAsIDAsIGxlbiAtIGkgLSAyKTsKKwkJaSsrOworCX0KKworCWZvciAoaiA9IDA7IGogPCBQVVNIX0NOVDsgaisrKSB7CisJCWluc25baSsrXSA9IEJQRl9MRF9BQlMoQlBGX0IsIDApOworCQlpbnNuW2ldID0gQlBGX0pNUF9JTU0oQlBGX0pORSwgUjAsIDB4MzQsIGxlbiAtIGkgLSAyKTsKKwkJaSsrOworCQlpbnNuW2krK10gPSBCUEZfTU9WNjRfUkVHKFIxLCBSNik7CisJCWluc25baSsrXSA9IEJQRl9SQVdfSU5TTihCUEZfSk1QIHwgQlBGX0NBTEwsIDAsIDAsIDAsCisJCQkJCSBicGZfc2tiX3ZsYW5fcG9wX3Byb3RvLmZ1bmMgLSBfX2JwZl9jYWxsX2Jhc2UpOworCQlpbnNuW2ldID0gQlBGX0pNUF9JTU0oQlBGX0pORSwgUjAsIDAsIGxlbiAtIGkgLSAyKTsKKwkJaSsrOworCX0KKwlpZiAoKytrIDwgNSkKKwkJZ290byBsb29wOworCisJZm9yICg7IGkgPCBsZW4gLSAxOyBpKyspCisJCWluc25baV0gPSBCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAweGJlZik7CisKKwlpbnNuW2xlbiAtIDFdID0gQlBGX0VYSVRfSU5TTigpOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX2p1bXBfYXJvdW5kX2xkX2FicyhzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJdW5zaWduZWQgaW50IGxlbiA9IEJQRl9NQVhJTlNOUzsKKwlzdHJ1Y3QgYnBmX2luc24gKmluc247CisJaW50IGkgPSAwOworCisJaW5zbiA9IGttYWxsb2NfYXJyYXkobGVuLCBzaXplb2YoKmluc24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWluc24pCisJCXJldHVybiAtRU5PTUVNOworCisJaW5zbltpKytdID0gQlBGX01PVjY0X1JFRyhSNiwgUjEpOworCWluc25baSsrXSA9IEJQRl9MRF9BQlMoQlBGX0IsIDApOworCWluc25baV0gPSBCUEZfSk1QX0lNTShCUEZfSkVRLCBSMCwgMTAsIGxlbiAtIGkgLSAyKTsKKwlpKys7CisJd2hpbGUgKGkgPCBsZW4gLSAxKQorCQlpbnNuW2krK10gPSBCUEZfTERfQUJTKEJQRl9CLCAxKTsKKwlpbnNuW2ldID0gQlBGX0VYSVRfSU5TTigpOworCisJc2VsZi0+dS5wdHIuaW5zbnMgPSBpbnNuOworCXNlbGYtPnUucHRyLmxlbiA9IGxlbjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYnBmX2ZpbGxfc3R4ZHcoc3RydWN0IGJwZl90ZXN0ICpzZWxmLCBpbnQgc2l6ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbGVuID0gQlBGX01BWElOU05TOworCXN0cnVjdCBicGZfaW5zbiAqaW5zbjsKKwlpbnQgaTsKKworCWluc24gPSBrbWFsbG9jX2FycmF5KGxlbiwgc2l6ZW9mKCppbnNuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnNuKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluc25bMF0gPSBCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKTsKKwlpbnNuWzFdID0gQlBGX1NUX01FTShzaXplLCBSMTAsIC00MCwgNDIpOworCisJZm9yIChpID0gMjsgaSA8IGxlbiAtIDI7IGkrKykKKwkJaW5zbltpXSA9IEJQRl9TVFhfWEFERChzaXplLCBSMTAsIFIwLCAtNDApOworCisJaW5zbltsZW4gLSAyXSA9IEJQRl9MRFhfTUVNKHNpemUsIFIwLCBSMTAsIC00MCk7CisJaW5zbltsZW4gLSAxXSA9IEJQRl9FWElUX0lOU04oKTsKKworCXNlbGYtPnUucHRyLmluc25zID0gaW5zbjsKKwlzZWxmLT51LnB0ci5sZW4gPSBsZW47CisJc2VsZi0+c3RhY2tfZGVwdGggPSA0MDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJwZl9maWxsX3N0eHcoc3RydWN0IGJwZl90ZXN0ICpzZWxmKQoreworCXJldHVybiBfX2JwZl9maWxsX3N0eGR3KHNlbGYsIEJQRl9XKTsKK30KKworc3RhdGljIGludCBicGZfZmlsbF9zdHhkdyhzdHJ1Y3QgYnBmX3Rlc3QgKnNlbGYpCit7CisJcmV0dXJuIF9fYnBmX2ZpbGxfc3R4ZHcoc2VsZiwgQlBGX0RXKTsKK30KKworc3RhdGljIHN0cnVjdCBicGZfdGVzdCB0ZXN0c1tdID0geworCXsKKwkJIlRBWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTkVHLCAwKSwgLyogQSA9PSAtMyAqLworCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLCAvKiBYID09IGxlbiAtIDMgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMTAsIDIwLCAzMCwgNDAsIDUwIH0sCisJCXsgeyAyLCAxMCB9LCB7IDMsIDIwIH0sIHsgNCwgMzAgfSB9LAorCX0sCisJeworCQkiVFhBIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0xFTiwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApIC8qIEEgPT0gbGVuICogMiAqLworCQl9LAorCQlDTEFTU0lDLAorCQl7IDEwLCAyMCwgMzAsIDQwLCA1MCB9LAorCQl7IHsgMSwgMiB9LCB7IDMsIDYgfSwgeyA0LCA4IH0gfSwKKwl9LAorCXsKKwkJIkFERF9TVUJfTVVMX0siLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSywgMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMyksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDB4ZmZmZmZmZmYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfSywgMyksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmQgfSB9CisJfSwKKwl7CisJCSJESVZfTU9EX0tYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCA4KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX0ssIDIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDB4ZmZmZmZmZmYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMHhmZmZmZmZmZiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LLCAweDcwMDAwMDAwKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDB4ZmZmZmZmZmYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfSywgMHg3MDAwMDAwMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHgyMDAwMDAwMCB9IH0KKwl9LAorCXsKKwkJIkFORF9PUl9MU0hfSyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMHhmZiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9LLCAweGYwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0ssIDI3KSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAweGYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LLCAweGYwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBLAorCQl7IH0sCisJCXsgeyAwLCAweDgwMDAwMGZmIH0sIHsgMSwgMHg4MDAwMDBmZiB9IH0sCisJfSwKKwl7CisJCSJMRF9JTU1fMCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMCksIC8qIGxkICMwICovCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAwLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpLAorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCAxIH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfSU5ELCBNQVhfSyksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeyB7IDEsIDAgfSwgeyAxMCwgMCB9LCB7IDYwLCAwIH0gfSwKKwl9LAorCXsKKwkJIkxEX0FCUyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLCAxMDAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMSkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgMCB9LCB7IDEwLCAwIH0sIHsgNjAsIDAgfSB9LAorCX0sCisJeworCQkiTERfQUJTX0xMIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIFNLRl9MTF9PRkYpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgU0tGX0xMX09GRiArIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMSwgMiwgMyB9LAorCQl7IHsgMSwgMCB9LCB7IDIsIDMgfSB9LAorCX0sCisJeworCQkiTERfSU5EX0xMIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCBTS0ZfTExfT0ZGIC0gMSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0xFTiwgMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9JTkQsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IDEsIDIsIDMsIDB4ZmYgfSwKKwkJeyB7IDEsIDEgfSwgeyAzLCAzIH0sIHsgNCwgMHhmZiB9IH0sCisJfSwKKwl7CisJCSJMRF9BQlNfTkVUIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIFNLRl9ORVRfT0ZGKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIFNLRl9ORVRfT0ZGICsgMSksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAyLCAzIH0sCisJCXsgeyAxNSwgMCB9LCB7IDE2LCAzIH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORF9ORVQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIFNLRl9ORVRfT0ZGIC0gMTUpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfSU5ELCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAyLCAzIH0sCisJCXsgeyAxNCwgMCB9LCB7IDE1LCAxIH0sIHsgMTcsIDMgfSB9LAorCX0sCisJeworCQkiTERfUEtUVFlQRSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1BLVFRZUEUpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgU0tCX1RZUEUsIDEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QS1RUWVBFKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIFNLQl9UWVBFLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUEtUVFlQRSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCBTS0JfVFlQRSwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCAzIH0sIHsgMTAsIDMgfSB9LAorCX0sCisJeworCQkiTERfTUFSSyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX01BUkspLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCBTS0JfTUFSS30sIHsgMTAsIFNLQl9NQVJLfSB9LAorCX0sCisJeworCQkiTERfUlhIQVNIIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUlhIQVNIKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgU0tCX0hBU0h9LCB7IDEwLCBTS0JfSEFTSH0gfSwKKwl9LAorCXsKKwkJIkxEX1FVRVVFIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfUVVFVUUpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCBTS0JfUVVFVUVfTUFQIH0sIHsgMTAsIFNLQl9RVUVVRV9NQVAgfSB9LAorCX0sCisJeworCQkiTERfUFJPVE9DT0wiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMCwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1BST1RPQ09MKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMzAsIDEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RYQSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMTAsIDIwLCAzMCB9LAorCQl7IHsgMTAsIEVUSF9QX0lQIH0sIHsgMTAwLCBFVEhfUF9JUCB9IH0sCisJfSwKKwl7CisJCSJMRF9WTEFOX1RBRyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX1ZMQU5fVEFHKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7CisJCQl7IDEsIFNLQl9WTEFOX1RDSSAmIH5WTEFOX1RBR19QUkVTRU5UIH0sCisJCQl7IDEwLCBTS0JfVkxBTl9UQ0kgJiB+VkxBTl9UQUdfUFJFU0VOVCB9CisJCX0sCisJfSwKKwl7CisJCSJMRF9WTEFOX1RBR19QUkVTRU5UIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfVkxBTl9UQUdfUFJFU0VOVCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeworCQkJeyAxLCAhIShTS0JfVkxBTl9UQ0kgJiBWTEFOX1RBR19QUkVTRU5UKSB9LAorCQkJeyAxMCwgISEoU0tCX1ZMQU5fVENJICYgVkxBTl9UQUdfUFJFU0VOVCkgfQorCQl9LAorCX0sCisJeworCQkiTERfSUZJTkRFWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX0lGSU5ERVgpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCBTS0JfREVWX0lGSU5ERVggfSwgeyAxMCwgU0tCX0RFVl9JRklOREVYIH0gfSwKKwl9LAorCXsKKwkJIkxEX0hBVFlQRSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX0hBVFlQRSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeyB7IDEsIFNLQl9ERVZfVFlQRSB9LCB7IDEwLCBTS0JfREVWX1RZUEUgfSB9LAorCX0sCisJeworCQkiTERfQ1BVIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfQ1BVKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfQ1BVKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCAwIH0sIHsgMTAsIDAgfSB9LAorCX0sCisJeworCQkiTERfTkxBVFRSIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDMpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX1cgfCBCUEZfQUJTLAorCQkJCSBTS0ZfQURfT0ZGICsgU0tGX0FEX05MQVRUUiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDApCisJCX0sCisJCUNMQVNTSUMsCisjaWZkZWYgX19CSUdfRU5ESUFOCisJCXsgMHhmZiwgMHhmZiwgMCwgNCwgMCwgMiwgMCwgNCwgMCwgMyB9LAorI2Vsc2UKKwkJeyAweGZmLCAweGZmLCA0LCAwLCAyLCAwLCA0LCAwLCAzLCAwIH0sCisjZW5kaWYKKwkJeyB7IDQsIDAgfSwgeyAyMCwgNiB9IH0sCisJfSwKKwl7CisJCSJMRF9OTEFUVFJfTkVTVCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMyksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTkxBVFRSX05FU1QpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorI2lmZGVmIF9fQklHX0VORElBTgorCQl7IDB4ZmYsIDB4ZmYsIDAsIDEyLCAwLCAxLCAwLCA0LCAwLCAyLCAwLCA0LCAwLCAzIH0sCisjZWxzZQorCQl7IDB4ZmYsIDB4ZmYsIDEyLCAwLCAxLCAwLCA0LCAwLCAyLCAwLCA0LCAwLCAzLCAwIH0sCisjZW5kaWYKKwkJeyB7IDQsIDAgfSwgeyAyMCwgMTAgfSB9LAorCX0sCisJeworCQkiTERfUEFZTE9BRF9PRkYiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0FCUywKKwkJCQkgU0tGX0FEX09GRiArIFNLRl9BRF9QQVlfT0ZGU0VUKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJLyogMDA6MDA6MDA6MDA6MDA6MDAgPiAwMDowMDowMDowMDowMDowMCwgZXRodHlwZSBJUHY0ICgweDA4MDApLAorCQkgKiBsZW5ndGggOTg6IDEyNy4wLjAuMSA+IDEyNy4wLjAuMTogSUNNUCBlY2hvIHJlcXVlc3QsCisJCSAqIGlkIDk3MzcsIHNlcSAxLCBsZW5ndGggNjQKKwkJICovCisJCXsgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCQkgIDB4MDgsIDB4MDAsCisJCSAgMHg0NSwgMHgwMCwgMHgwMCwgMHg1NCwgMHhhYywgMHg4YiwgMHg0MCwgMHgwMCwgMHg0MCwKKwkJICAweDAxLCAweDkwLCAweDFiLCAweDdmLCAweDAwLCAweDAwLCAweDAxIH0sCisJCXsgeyAzMCwgMCB9LCB7IDEwMCwgNDIgfSB9LAorCX0sCisJeworCQkiTERfQU5DX1hPUiIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMTApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDMwMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfQUxVX1hPUl9YKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgNCwgMTAgXiAzMDAgfSwgeyAyMCwgMTAgXiAzMDAgfSB9LAorCX0sCisJeworCQkiU1BJTExfRklMTCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1JTSCwgMSksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVCwgMSksIC8qIE0xID0gMSBeIGxlbiAqLworCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfSywgMHg4MDAwMDAwMCksCisJCQlCUEZfU1RNVChCUEZfU1QsIDIpLCAvKiBNMiA9IDEgXiBsZW4gXiAweDgwMDAwMDAwICovCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNSksIC8qIE0zID0gbGVuICovCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMSksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfTUVNLCAyKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE1KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IH0sCisJCXsgeyAxLCAweDgwMDAwMDAxIH0sIHsgMiwgMHg4MDAwMDAwMiB9LCB7IDYwLCAweDgwMDAwMDAwIF4gNjAgfSB9CisJfSwKKwl7CisJCSJKRVEiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTEVOLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YLCAwLCAwLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIE1BWF9LKQorCQl9LAorCQlDTEFTU0lDLAorCQl7IDMsIDMsIDMsIDMsIDMgfSwKKwkJeyB7IDEsIDAgfSwgeyAzLCAxIH0sIHsgNCwgTUFYX0sgfSB9LAorCX0sCisJeworCQkiSkdUIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0xFTiwgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfWCwgMCwgMCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCBNQVhfSykKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyA0LCA0LCA0LCAzLCAzIH0sCisJCXsgeyAyLCAwIH0sIHsgMywgMSB9LCB7IDQsIE1BWF9LIH0gfSwKKwl9LAorCXsKKwkJIkpHRSAoanQgMCksIHRlc3QgMSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAyKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1gsIDAsIDAsIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgTUFYX0spCisJCX0sCisJCUNMQVNTSUMsCisJCXsgNCwgNCwgNCwgMywgMyB9LAorCQl7IHsgMiwgMCB9LCB7IDMsIDEgfSwgeyA0LCAxIH0gfSwKKwl9LAorCXsKKwkJIkpHRSAoanQgMCksIHRlc3QgMiIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0IgfCBCUEZfQUJTLCAyKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1gsIDAsIDAsIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgTUFYX0spCisJCX0sCisJCUNMQVNTSUMsCisJCXsgNCwgNCwgNSwgMywgMyB9LAorCQl7IHsgNCwgMSB9LCB7IDUsIDEgfSwgeyA2LCBNQVhfSyB9IH0sCisJfSwKKwl7CisJCSJKR0UiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTEVOLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgTUFYX0spLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSywgMSwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0ssIDIsIDEsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAyMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LLCAzLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSywgNCwgMSwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDQwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgTUFYX0spCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMSwgMiwgMywgNCwgNSB9LAorCQl7IHsgMSwgMjAgfSwgeyAzLCA0MCB9LCB7IDUsIE1BWF9LIH0gfSwKKwl9LAorCXsKKwkJIkpTRVQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkEsIDAsIDAsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KQSwgMSwgMSwgMSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pBLCAwLCAwLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkEsIDAsIDAsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX0ssIDQpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9XIHwgQlBGX0lORCwgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSywgMSwgMCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDEwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LLCAweDgwMDAwMDAwLCAwLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMjApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX0ssIDB4ZmZmZmZmLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMzApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCBNQVhfSykKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyAwLCAweEFBLCAweDU1LCAxIH0sCisJCXsgeyA0LCAxMCB9LCB7IDUsIDIwIH0sIHsgNiwgTUFYX0sgfSB9LAorCX0sCisJeworCQkidGNwZHVtcCBwb3J0IDIyIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDEyKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4ODZkZCwgMCwgOCksIC8qIElQdjYgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMjApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHg4NCwgMiwgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAweDYsIDEsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHgxMSwgMCwgMTcpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCA1NCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMiwgMTQsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCA1NiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMiwgMTIsIDEzKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4MDgwMCwgMCwgMTIpLCAvKiBJUHY0ICovCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIzKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4ODQsIDIsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHg2LCAxLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4MTEsIDAsIDgpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAyMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSywgMHgxZmZmLCA2LCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfQiB8IEJQRl9NU0gsIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0lORCwgMTQpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMjIsIDIsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfSU5ELCAxNiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAyMiwgMCwgMSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4ZmZmZiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDApLAorCQl9LAorCQlDTEFTU0lDLAorCQkvKiAzYzowNzo1NDo0MzplNTo3NiA+IDEwOmJmOjQ4OmQ2OjQzOmQ2LCBldGhlcnR5cGUgSVB2NCgweDA4MDApCisJCSAqIGxlbmd0aCAxMTQ6IDEwLjEuMS4xNDkuNDk3MDAgPiAxMC4xLjIuMTAuMjI6IEZsYWdzIFtQLl0sCisJCSAqIHNlcSAxMzA1NjkyOTc5OjEzMDU2OTMwMjcsIGFjayAzNjUwNDY3MDM3LCB3aW4gNjU1MzUsCisJCSAqIG9wdGlvbnMgW25vcCxub3AsVFMgdmFsIDI1MDI2NDU0MDAgZWNyIDM5NzExMzhdLCBsZW5ndGggNDgKKwkJICovCisJCXsgMHgxMCwgMHhiZiwgMHg0OCwgMHhkNiwgMHg0MywgMHhkNiwKKwkJICAweDNjLCAweDA3LCAweDU0LCAweDQzLCAweGU1LCAweDc2LAorCQkgIDB4MDgsIDB4MDAsCisJCSAgMHg0NSwgMHgxMCwgMHgwMCwgMHg2NCwgMHg3NSwgMHhiNSwKKwkJICAweDQwLCAweDAwLCAweDQwLCAweDA2LCAweGFkLCAweDJlLCAvKiBJUCBoZWFkZXIgKi8KKwkJICAweDBhLCAweDAxLCAweDAxLCAweDk1LCAvKiBpcCBzcmMgKi8KKwkJICAweDBhLCAweDAxLCAweDAyLCAweDBhLCAvKiBpcCBkc3QgKi8KKwkJICAweGMyLCAweDI0LAorCQkgIDB4MDAsIDB4MTYgLyogZHN0IHBvcnQgKi8gfSwKKwkJeyB7IDEwLCAwIH0sIHsgMzAsIDAgfSwgeyAxMDAsIDY1NTM1IH0gfSwKKwl9LAorCXsKKwkJInRjcGR1bXAgY29tcGxleCIsCisJCS51Lmluc25zID0geworCQkJLyogdGNwZHVtcCAtbmVpIGV0aDAgJ3RjcCBwb3J0IDIyIGFuZCAoKChpcFsyOjJdIC0KKwkJCSAqICgoaXBbMF0mMHhmKTw8MikpIC0gKCh0Y3BbMTJdJjB4ZjApPj4yKSkgIT0gMCkgYW5kCisJCQkgKiAobGVuID4gMTE1IG9yIGxlbiA8IDMwMDAwMDAwMDAwKScgLWQKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAxMiksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LLCAweDg2ZGQsIDMwLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4ODAwLCAwLCAyOSksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQiB8IEJQRl9BQlMsIDIzKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDB4NiwgMCwgMjcpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAyMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSywgMHgxZmZmLCAyNSwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0IgfCBCUEZfTVNILCAxNCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9JTkQsIDE0KSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0ssIDIyLCAyLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0lORCwgMTYpLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMjIsIDAsIDIwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMTYpLAorCQkJQlBGX1NUTVQoQlBGX1NULCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0FCUywgMTQpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSywgMHhmKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0ssIDIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAweDUpLCAvKiBsaWJwY2FwIGVtaXRzIEsgb24gVEFYICovCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfTUVNLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1NULCA1KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfQiB8IEJQRl9NU0gsIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9CIHwgQlBGX0lORCwgMjYpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSywgMHhmMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LLCAyKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMHg5KSwgLyogbGlicGNhcCBlbWl0cyBLIG9uIFRBWCAqLworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX01FTSwgNSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YLCAwLCA0LCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9MRU4sIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSywgMHg3MywgMSwgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSB8IEJQRl9LLCAweGZjMjNhYzAwLCAxLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMHhmZmZmKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCksCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMHgxMCwgMHhiZiwgMHg0OCwgMHhkNiwgMHg0MywgMHhkNiwKKwkJICAweDNjLCAweDA3LCAweDU0LCAweDQzLCAweGU1LCAweDc2LAorCQkgIDB4MDgsIDB4MDAsCisJCSAgMHg0NSwgMHgxMCwgMHgwMCwgMHg2NCwgMHg3NSwgMHhiNSwKKwkJICAweDQwLCAweDAwLCAweDQwLCAweDA2LCAweGFkLCAweDJlLCAvKiBJUCBoZWFkZXIgKi8KKwkJICAweDBhLCAweDAxLCAweDAxLCAweDk1LCAvKiBpcCBzcmMgKi8KKwkJICAweDBhLCAweDAxLCAweDAyLCAweDBhLCAvKiBpcCBkc3QgKi8KKwkJICAweGMyLCAweDI0LAorCQkgIDB4MDAsIDB4MTYgLyogZHN0IHBvcnQgKi8gfSwKKwkJeyB7IDEwLCAwIH0sIHsgMzAsIDAgfSwgeyAxMDAsIDY1NTM1IH0gfSwKKwl9LAorCXsKKwkJIlJFVF9BIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKiBjaGVjayB0aGF0IHVuaXRpYWxpemVkIFggYW5kIEEgY29udGFpbiB6ZXJvcyAqLworCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCkKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsxLCAwfSwgezIsIDB9IH0sCisJfSwKKwl7CisJCSJJTlQ6IEFERCB0cml2aWFsIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMSwgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIxLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMSwgUjIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgLTEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTVVMLCBSMSwgMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmZmZmZmZkIH0gfQorCX0sCisJeworCQkiSU5UOiBNVUxfWCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIC0xKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjEsIC0xKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDB4ZmZmZmZmZmQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfQorCX0sCisJeworCQkiSU5UOiBNVUxfWDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIyLCAzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjEsIFIyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjEsIDgpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDB4MmZmZmZmZiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9CisJfSwKKwl7CisJCSJJTlQ6IE1VTDMyX1giLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAtMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIyLCAzKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01VTCwgUjEsIFIyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjEsIDgpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDB4ZmZmZmZmLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0KKwl9LAorCXsKKwkJLyogSGF2ZSB0byB0ZXN0IGFsbCByZWdpc3RlciBjb21iaW5hdGlvbnMsIHNpbmNlCisJCSAqIEpJVGluZyBvZiBkaWZmZXJlbnQgcmVnaXN0ZXJzIHdpbGwgcHJvZHVjZQorCQkgKiBkaWZmZXJlbnQgYXNtIGNvZGUuCisJCSAqLworCQkiSU5UOiBBREQgNjQtYml0IiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI0LCA0KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjUsIDUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNiwgNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCA3KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIDgpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOSwgOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIwLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIxLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIzLCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI0LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI1LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI2LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI3LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI4LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI5LCAyMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIwLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIxLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIyLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIzLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI0LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI1LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI2LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI3LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI4LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFI5LCAxMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSOSksIC8qIFIwID09IDE1NSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDE1NSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIxLCBSOSksIC8qIFIxID09IDQ1NiAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDQ1NiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIyLCBSOSksIC8qIFIyID09IDEzNTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIyLCAxMzU4LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjMsIFI5KSwgLyogUjMgPT0gNDA2MyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjMsIDQwNjMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSNCwgUjkpLCAvKiBSNCA9PSAxMjE3NyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDEyMTc3LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FERCwgUjUsIFI5KSwgLyogUjUgPT0gMzY1MTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFI1LCAzNjUxOCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI2LCBSOSksIC8qIFI2ID09IDEwOTU0MCAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjYsIDEwOTU0MCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI3LCBSOSksIC8qIFI3ID09IDMyODYwNSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjcsIDMyODYwNSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI4LCBSOSksIC8qIFI4ID09IDk4NTc5OSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjgsIDk4NTc5OSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFI5LCBSOSksIC8qIFI5ID09IDI5NTczODAgKi8KKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjAsIFI5KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDI5NTczODAgfSB9CisJfSwKKwl7CisJCSJJTlQ6IEFERCAzMi1iaXQiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAyMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMywgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFI0LCA0KSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjUsIDUpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSNiwgNiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFI3LCA3KSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjgsIDgpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSOSwgOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIxLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIzLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI0LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI1LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI2LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI3LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI4LCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFI5LCAxMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSOSksIC8qIFIwID09IDE1NSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDE1NSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIxLCBSOSksIC8qIFIxID09IDQ1NiAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjEsIDQ1NiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIyLCBSOSksIC8qIFIyID09IDEzNTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIyLCAxMzU4LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIwKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFIzKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI0KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI1KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI2KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI3KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI4KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjMsIFI5KSwgLyogUjMgPT0gNDA2MyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjMsIDQwNjMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjApLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjEpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjIpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjMpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjQpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjUpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjYpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjcpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjgpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSNCwgUjkpLCAvKiBSNCA9PSAxMjE3NyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDEyMTc3LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIwKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFIzKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI0KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI1KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI2KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI3KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI4KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjUsIFI5KSwgLyogUjUgPT0gMzY1MTggKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFI1LCAzNjUxOCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI2LCBSOSksIC8qIFI2ID09IDEwOTU0MCAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjYsIDEwOTU0MCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI3LCBSOSksIC8qIFI3ID09IDMyODYwNSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjcsIDMyODYwNSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI4LCBSOSksIC8qIFI4ID09IDk4NTc5OSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjgsIDk4NTc5OSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSNyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSOCksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFI5LCBSOSksIC8qIFI5ID09IDI5NTczODAgKi8KKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01PViwgUjAsIFI5KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDI5NTczODAgfSB9CisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIklOVDogU1VCIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI0LCA0KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjUsIDUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNiwgNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCA3KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIDgpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOSwgOSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIwLCAxMCksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBSMCwgLTU1LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjEsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjIsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjIsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjMsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjMsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjQsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjQsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjUsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjUsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjYsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjYsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjcsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjcsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjgsIDEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjksIFI4KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjksIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjAsIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX05FRywgUjAsIDApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjkpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMTEgfSB9CisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIklOVDogWE9SIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSMSwgUjEpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjAsIFIxLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjEsIC0xKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjEsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1hPUiwgUjIsIFIyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIyLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFIzLCBSMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIwLCAxMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMywgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSNCwgUjQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMiwgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI1LCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMywgUjQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSNCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSNSwgUjUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSNSwgUjQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNSwgMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFI1LCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFI2LCBSNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIC0xKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFI1LCBSNiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFI2LCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFI3LCBSNyksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSNywgUjYsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSNywgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSOCwgUjgpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjcsIFI4LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjgsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1hPUiwgUjksIFI5KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFI5LCBSOCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFI5LCBSOSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9YT1IsIFIwLCBSMCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSOSwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMSwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfWE9SLCBSMCwgUjApLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjksIFIwLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfQorCX0sCisJewkvKiBNYWlubHkgY2hlY2tpbmcgSklUIGhlcmUuICovCisJCSJJTlQ6IE1VTCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDExKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjEsIDEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMiwgMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIzLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjQsIDQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNSwgNSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI2LCA2KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjcsIDcpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOCwgOCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI5LCA5KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjAsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjAsIDEwKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIwLCA0MzkwODQ4MDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTVVMLCBSMSwgUjkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTVVMLCBSMSwgMTApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBSMiwgUjEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfUlNILCBSMiwgMzIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjIsIDB4NWE5MjQsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTFNILCBSMSwgMzIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQVJTSCwgUjEsIDMyKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIxLCAweGViYjkwMDAwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFIwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFIxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFIzKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI0KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI4KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01VTCwgUjIsIFI5KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjIsIDEwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjIsIDMyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjAsIFIyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MzVkOTdlZjIgfSB9CisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIk1PViBSRUc2NCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX01PVjY0X1JFRyhSMSwgUjApLAorCQkJQlBGX01PVjY0X1JFRyhSMiwgUjEpLAorCQkJQlBGX01PVjY0X1JFRyhSMywgUjIpLAorCQkJQlBGX01PVjY0X1JFRyhSNCwgUjMpLAorCQkJQlBGX01PVjY0X1JFRyhSNSwgUjQpLAorCQkJQlBGX01PVjY0X1JFRyhSNiwgUjUpLAorCQkJQlBGX01PVjY0X1JFRyhSNywgUjYpLAorCQkJQlBGX01PVjY0X1JFRyhSOCwgUjcpLAorCQkJQlBGX01PVjY0X1JFRyhSOSwgUjgpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIxLCAwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSMywgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI0LCAwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjUsIDApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSNiwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFI3LCAwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjgsIDApLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9WLCBSOSwgMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSNyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSOCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSOSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIwLCAweGZlZmUpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZWZlIH0gfQorCX0sCisJewkvKiBNYWlubHkgY2hlY2tpbmcgSklUIGhlcmUuICovCisJCSJNT1YgUkVHMzIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjEsIFIwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjIsIFIxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjMsIFIyKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjQsIFIzKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjUsIFI0KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjYsIFI1KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjcsIFI2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjgsIFI3KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjksIFI4KSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIyLCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjMsIDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSNCwgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFI1LCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjYsIDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSNywgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFI4LCAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjksIDApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMCwgMHhmZWZlKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmVmZSB9IH0KKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiTEQgSU1NNjQiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjEsIFIwKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjIsIFIxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjMsIFIyKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjQsIFIzKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjUsIFI0KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjYsIFI1KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjcsIFI2KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjgsIFI3KSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjksIFI4KSwKKwkJCUJQRl9MRF9JTU02NChSMCwgMHgwTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAweDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MExMKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHgwTEwpLAorCQkJQlBGX0xEX0lNTTY0KFI0LCAweDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjUsIDB4MExMKSwKKwkJCUJQRl9MRF9JTU02NChSNiwgMHgwTEwpLAorCQkJQlBGX0xEX0lNTTY0KFI3LCAweDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjgsIDB4MExMKSwKKwkJCUJQRl9MRF9JTU02NChSOSwgMHgwTEwpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjMpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjYpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjcpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjgpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjkpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMCwgMHhmZWZlKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmVmZSB9IH0KKwl9LAorCXsKKwkJIklOVDogQUxVIE1JWCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDExKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgUjAsIC0xKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfWE9SLCBSMiwgMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9ESVYsIFIwLCBSMiksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBSMCwgMTAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTU9ELCBSMCwgMyksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBSMCwgMSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIwLCAtMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAtMSB9IH0KKwl9LAorCXsKKwkJIklOVDogc2hpZnRzIGJ5IHJlZ2lzdGVyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX01PVjY0X0lNTShSMCwgLTEyMzQpLAorCQkJQlBGX01PVjY0X0lNTShSMSwgMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9SU0gsIFIwLCBSMSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBSMCwgMHg3ZmZmZmQ5NywgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WNjRfSU1NKFIyLCAxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0xTSCwgUjAsIFIyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjQsIC0xMjM0KSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIwLCBSNCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BTkQsIFI0LCA2MyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9MU0gsIFIwLCBSNCksIC8qIFIwIDw9IDQ2ICovCisJCQlCUEZfTU9WNjRfSU1NKFIzLCA0NyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BUlNILCBSMCwgUjMpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIC02MTcsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjY0X0lNTShSMiwgMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9MU0gsIFI0LCBSMiksIC8qIFI0ID0gNDYgPDwgMSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDkyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1Y2NF9JTU0oUjQsIDQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTFNILCBSNCwgUjQpLCAvKiBSNCA9IDQgPDwgNCAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDY0LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1Y2NF9JTU0oUjQsIDUpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfTFNILCBSNCwgUjQpLCAvKiBSNCA9IDUgPDwgNSAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjQsIDE2MCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WNjRfSU1NKFIwLCAtMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAtMSB9IH0KKwl9LAorCXsKKwkJIklOVDogRElWICsgQUJTIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBSNiwgUjEpLAorCQkJQlBGX0xEX0FCUyhCUEZfQiwgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIyLCAyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0RJViwgUjAsIFIyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjgsIFIwKSwKKwkJCUJQRl9MRF9BQlMoQlBGX0IsIDQpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSOCwgUjApLAorCQkJQlBGX0xEX0lORChCUEZfQiwgUjgsIC03MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IDEwLCAyMCwgMzAsIDQwLCA1MCB9LAorCQl7IHsgNCwgMCB9LCB7IDUsIDEwIH0gfQorCX0sCisJeworCQkiSU5UOiBESVYgYnkgemVybyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjYsIFIxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjcsIDApLAorCQkJQlBGX0xEX0FCUyhCUEZfQiwgMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9ESVYsIFIwLCBSNyksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IDEwLCAyMCwgMzAsIDQwLCA1MCB9LAorCQl7IHsgMywgMCB9LCB7IDQsIDAgfSB9CisJfSwKKwl7CisJCSJjaGVjazogbWlzc2luZyByZXQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDEpLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBIHwgRkxBR19FWFBFQ1RFRF9GQUlMLAorCQl7IH0sCisJCXsgfSwKKwkJLmZpbGxfaGVscGVyID0gTlVMTCwKKwkJLmV4cGVjdGVkX2VycmNvZGUgPSAtRUlOVkFMLAorCX0sCisJeworCQkiY2hlY2s6IGRpdl9rXzAiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX0ssIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAwKQorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBIHwgRkxBR19FWFBFQ1RFRF9GQUlMLAorCQl7IH0sCisJCXsgfSwKKwkJLmZpbGxfaGVscGVyID0gTlVMTCwKKwkJLmV4cGVjdGVkX2VycmNvZGUgPSAtRUlOVkFMLAorCX0sCisJeworCQkiY2hlY2s6IHVua25vd24gaW5zbiIsCisJCS51Lmluc25zID0geworCQkJLyogc2VjY29tcCBpbnNuLCByZWplY3RlZCBpbiBzb2NrZXQgZmlsdGVyICovCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX1cgfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMCkKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfRVhQRUNURURfRkFJTCwKKwkJeyB9LAorCQl7IH0sCisJCS5maWxsX2hlbHBlciA9IE5VTEwsCisJCS5leHBlY3RlZF9lcnJjb2RlID0gLUVJTlZBTCwKKwl9LAorCXsKKwkJImNoZWNrOiBvdXQgb2YgcmFuZ2Ugc3BpbGwvZmlsbCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX1NUWCwgMTYpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAwKQorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBIHwgRkxBR19FWFBFQ1RFRF9GQUlMLAorCQl7IH0sCisJCXsgfSwKKwkJLmZpbGxfaGVscGVyID0gTlVMTCwKKwkJLmV4cGVjdGVkX2VycmNvZGUgPSAtRUlOVkFMLAorCX0sCisJeworCQkiSlVNUFMgKyBIT0xFUyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkdFLCAwLCAxMywgMTUpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9KVU1QKEJQRl9KTVAgfCBCUEZfSkVRLCAweDkwYzI4OTRkLCAzLCA0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSwgMHg5MGMyODk0ZCwgMSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UsIDAsIDE0LCAxNSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSwgMCwgMTMsIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSwgMHgyYWMyODM0OSwgMiwgMyksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSwgMHgyYWMyODM0OSwgMSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KR0UsIDAsIDE0LCAxNSksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pHRSwgMCwgMTMsIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0ggfCBCUEZfQUJTLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9IIHwgQlBGX0FCUywgMCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSwgMHg5MGQyZmY0MSwgMiwgMyksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSwgMHg5MGQyZmY0MSwgMSwgMiksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSCB8IEJQRl9BQlMsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCksCisJCX0sCisJCUNMQVNTSUMsCisJCXsgMHgwMCwgMHgxYiwgMHgyMSwgMHgzYywgMHg5ZCwgMHhmOCwKKwkJICAweDkwLCAweGUyLCAweGJhLCAweDBhLCAweDU2LCAweGI0LAorCQkgIDB4MDgsIDB4MDAsCisJCSAgMHg0NSwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHgwMCwKKwkJICAweDIwLCAweDAwLCAweDQwLCAweDExLCAweDAwLCAweDAwLCAvKiBJUCBoZWFkZXIgKi8KKwkJICAweGMwLCAweGE4LCAweDMzLCAweDAxLAorCQkgIDB4YzAsIDB4YTgsIDB4MzMsIDB4MDIsCisJCSAgMHhiYiwgMHhiNiwKKwkJICAweGE5LCAweGZhLAorCQkgIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsCisJCSAgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJICAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLAorCQkgIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJICAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLCAweGNjLAorCQkgIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsIDB4Y2MsCisJCSAgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywgMHhjYywKKwkJICAweGNjLCAweGNjLCAweGNjLCAweGNjIH0sCisJCXsgeyA4OCwgMHgwMDFiIH0gfQorCX0sCisJeworCQkiY2hlY2s6IFJFVCBYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX1gsIDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBIHwgRkxBR19FWFBFQ1RFRF9GQUlMLAorCQl7IH0sCisJCXsgfSwKKwkJLmZpbGxfaGVscGVyID0gTlVMTCwKKwkJLmV4cGVjdGVkX2VycmNvZGUgPSAtRUlOVkFMLAorCX0sCisJeworCQkiY2hlY2s6IExEWCArIFJFVCBYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgNDIpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9YLCAwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSB8IEZMQUdfRVhQRUNURURfRkFJTCwKKwkJeyB9LAorCQl7IH0sCisJCS5maWxsX2hlbHBlciA9IE5VTEwsCisJCS5leHBlY3RlZF9lcnJjb2RlID0gLUVJTlZBTCwKKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiTVtdOiBhbHQgU1RYICsgTERYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMTAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDApLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDEpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDMpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDMpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDQpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDQpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDUpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDUpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDYpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDYpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDcpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDcpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDgpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDgpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDkpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDkpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDEwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAxMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMTEpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDExKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RYQSwgMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMTIpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDEzKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAxMyksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSywgMSksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UQVgsIDApLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMTQpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RYQSwgMCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9NSVNDIHwgQlBGX1RBWCwgMCksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMTUpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVFhBLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0ssIDEpLAorCQkJQlBGX1NUTVQoQlBGX01JU0MgfCBCUEZfVEFYLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDExNiB9IH0sCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIk1bXTogZnVsbCBTVFggKyBmdWxsIExEWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YmFkZmVlZGIpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhlY2FiZWRhZSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweGFmY2NmZWFmKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDIpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YmZmZGNlZGMpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgMyksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhmYmJiZGNjYiksCisJCQlCUEZfU1RNVChCUEZfU1RYLCA0KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweGZiYWJjYmRhKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDUpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YWVkZWNiZGIpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgNiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhhZGViYmFkZSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCA3KSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweGZjZmNmYWVjKSwKKwkJCUJQRl9TVE1UKEJQRl9TVFgsIDgpLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4YmNkZGRiZGMpLAorCQkJQlBGX1NUTVQoQlBGX1NUWCwgOSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhmZWVmZGZhYyksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhjZGRjZGVlYSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhhY2NmYWViYiksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMiksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhiZGNjY2RjZiksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxMyksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhhYWVkZWNkZSksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHhmYWVhY2RhZCksCisJCQlCUEZfU1RNVChCUEZfU1RYLCAxNSksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMCksCisJCQlCUEZfU1RNVChCUEZfTUlTQyB8IEJQRl9UWEEsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgMiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCAzKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDQpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgNSksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCA2KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDcpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX01FTSwgOCksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfTUVNLCA5KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEwKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDExKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEyKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDEzKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE0KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9NRU0sIDE1KSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHgyYTVhNWU1IH0gfSwKKwl9LAorCXsKKwkJImNoZWNrOiBTS0ZfQURfTUFYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgKyBTS0ZfQURfTUFYKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEgfCBGTEFHX0VYUEVDVEVEX0ZBSUwsCisJCXsgfSwKKwkJeyB9LAorCQkuZmlsbF9oZWxwZXIgPSBOVUxMLAorCQkuZXhwZWN0ZWRfZXJyY29kZSA9IC1FSU5WQUwsCisJfSwKKwl7CS8qIFBhc3NlcyBjaGVja2VyIGJ1dCBmYWlscyBkdXJpbmcgcnVudGltZS4gKi8KKwkJIkxEIFtTS0ZfQURfT0ZGLTFdIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfVyB8IEJQRl9BQlMsCisJCQkJIFNLRl9BRF9PRkYgLSAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMSksCisJCX0sCisJCUNMQVNTSUMsCisJCXsgfSwKKwkJeyB7IDEsIDAgfSB9LAorCX0sCisJeworCQkibG9hZCA2NC1iaXQgaW1tZWRpYXRlIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIxLCAweDU2NzgwMDAwMTIzNExMKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjIsIFIxKSwKKwkJCUJQRl9NT1Y2NF9SRUcoUjMsIFIyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjIsIDMyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0xTSCwgUjMsIDMyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjMsIDMyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjIsIDB4NTY3OCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfSk1QX0lNTShCUEZfSkVRLCBSMywgMHgxMjM0LCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9MRF9JTU02NChSMCwgMHgxZmZmZmZmZmZMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9SU0gsIFIwLCAzMiksIC8qIFIwID0gMSAqLworCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0KKwl9LAorCXsKKwkJIm5tYXAgcmVkdWNlZCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9NT1Y2NF9SRUcoUjYsIFIxKSwKKwkJCUJQRl9MRF9BQlMoQlBGX0gsIDEyKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KTkUsIFIwLCAweDgwNiwgMjgpLAorCQkJQlBGX0xEX0FCUyhCUEZfSCwgMTIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pORSwgUjAsIDB4ODA2LCAyNiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxOCksCisJCQlCUEZfU1RYX01FTShCUEZfVywgUjEwLCBSMCwgLTY0KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBSNywgUjEwLCAtNjQpLAorCQkJQlBGX0xEX0lORChCUEZfVywgUjcsIDE0KSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9XLCBSMTAsIFIwLCAtNjApLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMjgwOTcxNDc4KSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9XLCBSMTAsIFIwLCAtNTYpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIFI3LCBSMTAsIC01NiksCisJCQlCUEZfTERYX01FTShCUEZfVywgUjAsIFIxMCwgLTYwKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX1NVQiwgUjAsIFI3KSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KTkUsIFIwLCAwLCAxNSksCisJCQlCUEZfTERfQUJTKEJQRl9ILCAxMiksCisJCQlCUEZfSk1QX0lNTShCUEZfSk5FLCBSMCwgMHg4MDYsIDEzKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIyKSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9XLCBSMTAsIFIwLCAtNTYpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIFI3LCBSMTAsIC01NiksCisJCQlCUEZfTERfSU5EKEJQRl9ILCBSNywgMTQpLAorCQkJQlBGX1NUWF9NRU0oQlBGX1csIFIxMCwgUjAsIC01MiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxNzM2NiksCisJCQlCUEZfU1RYX01FTShCUEZfVywgUjEwLCBSMCwgLTQ4KSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBSNywgUjEwLCAtNDgpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIFIwLCBSMTAsIC01MiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9TVUIsIFIwLCBSNyksCisJCQlCUEZfSk1QX0lNTShCUEZfSk5FLCBSMCwgMCwgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyNTYpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB4MDgsIDB4MDYsIDAsIDAsCisJCSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJICAweDEwLCAweGJmLCAweDQ4LCAweGQ2LCAweDQzLCAweGQ2fSwKKwkJeyB7IDM4LCAyNTYgfSB9LAorCQkuc3RhY2tfZGVwdGggPSA2NCwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfTU9WIHwgQlBGX1ggKi8KKwl7CisJCSJBTFVfTU9WX1g6IGRzdCA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01PViwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVX01PVl9YOiBkc3QgPSA0Mjk0OTY3Mjk1IiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgNDI5NDk2NzI5NVUpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfTU9WLCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgNDI5NDk2NzI5NVUgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9WX1g6IGRzdCA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9WX1g6IGRzdCA9IDQyOTQ5NjcyOTUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCA0Mjk0OTY3Mjk1VSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCA0Mjk0OTY3Mjk1VSB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9LICovCisJeworCQkiQUxVX01PVl9LOiBkc3QgPSAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAyIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9NT1ZfSzogZHN0ID0gNDI5NDk2NzI5NSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDQyOTQ5NjcyOTVVKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDQyOTQ5NjcyOTVVIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9NT1ZfSzogMHgwMDAwZmZmZmZmZmYwMDAwID0gMHgwMDAwMDAwMGZmZmZmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDAwMDBmZmZmZmZmZjAwMDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4MDAwMDAwMDBmZmZmZmZmZkxMKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9WX0s6IGRzdCA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9WX0s6IGRzdCA9IDIxNDc0ODM2NDciLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIwLCAyMTQ3NDgzNjQ3KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIxNDc0ODM2NDcgfSB9LAorCX0sCisJeworCQkiQUxVNjRfT1JfSzogZHN0ID0gMHgwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDAwMDBmZmZmZmZmZjAwMDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4MCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT1YsIFIyLCAweDApLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9WX0s6IGRzdCA9IC0xIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDAwMDBmZmZmZmZmZjAwMDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01PViwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfWCAqLworCXsKKwkJIkFMVV9BRERfWDogMSArIDIgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDIpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQURELCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFVfQUREX1g6IDEgKyA0Mjk0OTY3Mjk0ID0gNDI5NDk2NzI5NSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCA0Mjk0OTY3Mjk0VSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCA0Mjk0OTY3Mjk1VSB9IH0sCisJfSwKKwl7CisJCSJBTFVfQUREX1g6IDIgKyA0Mjk0OTY3Mjk0ID0gMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMiksCisJCQlCUEZfTERfSU1NNjQoUjEsIDQyOTQ5NjcyOTRVKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjAsIFIxKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIwLCAwLCAyKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9YOiAxICsgMiA9IDMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9YOiAxICsgNDI5NDk2NzI5NCA9IDQyOTQ5NjcyOTUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgNDI5NDk2NzI5NFUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfQURELCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgNDI5NDk2NzI5NVUgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQUREX1g6IDIgKyA0Mjk0OTY3Mjk0ID0gNDI5NDk2NzI5NiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMiksCisJCQlCUEZfTERfSU1NNjQoUjEsIDQyOTQ5NjcyOTRVKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgNDI5NDk2NzI5NlVMTCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BREQsIFIwLCBSMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMCwgUjIsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9BREQgfCBCUEZfSyAqLworCXsKKwkJIkFMVV9BRERfSzogMSArIDIgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0FERCwgUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFVfQUREX0s6IDMgKyAwID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9BREQsIFIwLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDMgfSB9LAorCX0sCisJeworCQkiQUxVX0FERF9LOiAxICsgNDI5NDk2NzI5NCA9IDQyOTQ5NjcyOTUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfQURELCBSMCwgNDI5NDk2NzI5NFUpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgNDI5NDk2NzI5NVUgfSB9LAorCX0sCisJeworCQkiQUxVX0FERF9LOiA0Mjk0OTY3Mjk0ICsgMiA9IDAiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDQyOTQ5NjcyOTRVKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0FERCwgUjAsIDIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pFUSwgUjAsIDAsIDIpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVX0FERF9LOiAwICsgKC0xKSA9IDB4MDAwMDAwMDBmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgwKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHgwMDAwMDAwMGZmZmZmZmZmKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0FERCwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVX0FERF9LOiAwICsgMHhmZmZmID0gMHhmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDApLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweGZmZmYpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfQURELCBSMiwgMHhmZmZmKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9BRERfSzogMCArIDB4N2ZmZmZmZmYgPSAweDdmZmZmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDApLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweDdmZmZmZmZmKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0FERCwgUjIsIDB4N2ZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVX0FERF9LOiAwICsgMHg4MDAwMDAwMCA9IDB4ODAwMDAwMDAiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ODAwMDAwMDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfQURELCBSMiwgMHg4MDAwMDAwMCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwl7CisJCSJBTFVfQUREX0s6IDAgKyAweDgwMDA4MDAwID0gMHg4MDAwODAwMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgwKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHg4MDAwODAwMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9BREQsIFIyLCAweDgwMDA4MDAwKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9LOiAxICsgMiA9IDMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9LOiAzICsgMCA9IDMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDMpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9LOiAxICsgMjE0NzQ4MzY0NiA9IDIxNDc0ODM2NDciLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMCwgMjE0NzQ4MzY0NiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAyMTQ3NDgzNjQ3IH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9LOiA0Mjk0OTY3Mjk0ICsgMiA9IDQyOTQ5NjcyOTYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDQyOTQ5NjcyOTRVKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgNDI5NDk2NzI5NlVMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIwLCAyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIwLCBSMSwgMiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9BRERfSzogMjE0NzQ4MzY0NiArIC0yMTQ3NDgzNjQ3ID0gLTEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDIxNDc0ODM2NDYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMCwgLTIxNDc0ODM2NDcpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgLTEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQUREX0s6IDEgKyAwID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgxKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHgxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgUjIsIDB4MCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9BRERfSzogMCArICgtMSkgPSAweGZmZmZmZmZmZmZmZmZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FERCwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQUREX0s6IDAgKyAweGZmZmYgPSAweGZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ZmZmZiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAweGZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQUREX0s6IDAgKyAweDdmZmZmZmZmID0gMHg3ZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgwKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHg3ZmZmZmZmZiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAweDdmZmZmZmZmKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0FERF9LOiAwICsgMHg4MDAwMDAwMCA9IDB4ZmZmZmZmZmY4MDAwMDAwMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgwKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHhmZmZmZmZmZjgwMDAwMDAwTEwpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMiwgMHg4MDAwMDAwMCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwl7CisJCSJBTFVfQUREX0s6IDAgKyAweDgwMDA4MDAwID0gMHhmZmZmZmZmZjgwMDA4MDAwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDApLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweGZmZmZmZmZmODAwMDgwMDBMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BREQsIFIyLCAweDgwMDA4MDAwKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfU1VCIHwgQlBGX1ggKi8KKwl7CisJCSJBTFVfU1VCX1g6IDMgLSAxID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX1NVQiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVX1NVQl9YOiA0Mjk0OTY3Mjk1IC0gNDI5NDk2NzI5NCA9IDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDQyOTQ5NjcyOTVVKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDQyOTQ5NjcyOTRVKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX1NVQiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfU1VCX1g6IDMgLSAxID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfU1VCX1g6IDQyOTQ5NjcyOTUgLSA0Mjk0OTY3Mjk0ID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNDI5NDk2NzI5NVUpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgNDI5NDk2NzI5NFUpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfU1VCLCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LICovCisJeworCQkiQUxVX1NVQl9LOiAzIC0gMSA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDMpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfU1VCLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAyIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9TVUJfSzogMyAtIDAgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX1NVQiwgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFVfU1VCX0s6IDQyOTQ5NjcyOTUgLSA0Mjk0OTY3Mjk0ID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNDI5NDk2NzI5NVUpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfU1VCLCBSMCwgNDI5NDk2NzI5NFUpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9TVUJfSzogMyAtIDEgPSAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMiB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9TVUJfSzogMyAtIDAgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9TVUJfSzogNDI5NDk2NzI5NCAtIDQyOTQ5NjcyOTUgPSAtMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNDI5NDk2NzI5NFUpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfU1VCLCBSMCwgNDI5NDk2NzI5NVUpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgLTEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQUREX0s6IDIxNDc0ODM2NDYgLSAyMTQ3NDgzNjQ3ID0gLTEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDIxNDc0ODM2NDYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfU1VCLCBSMCwgMjE0NzQ4MzY0NyksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAtMSB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9YICovCisJeworCQkiQUxVX01VTF9YOiAyICogMyA9IDYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDIpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMyksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9NVUwsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCA2IH0gfSwKKwl9LAorCXsKKwkJIkFMVV9NVUxfWDogMiAqIDB4N0ZGRkZGRjggPSAweEZGRkZGRkYwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAyKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDB4N0ZGRkZGRjgpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfTVVMLCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhGRkZGRkZGMCB9IH0sCisJfSwKKwl7CisJCSJBTFVfTVVMX1g6IC0xICogLTEgPSAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAtMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAtMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9NVUwsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X01VTF9YOiAyICogMyA9IDYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDIpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NVUwsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCA2IH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X01VTF9YOiAxICogMjE0NzQ4MzY0NyA9IDIxNDc0ODM2NDciLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMjE0NzQ4MzY0NyksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NVUwsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAyMTQ3NDgzNjQ3IH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX0sgKi8KKwl7CisJCSJBTFVfTVVMX0s6IDIgKiAzID0gNiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NVUwsIFIwLCAzKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDYgfSB9LAorCX0sCisJeworCQkiQUxVX01VTF9LOiAzICogMSA9IDMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDMpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTVVMLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9NVUxfSzogMiAqIDB4N0ZGRkZGRjggPSAweEZGRkZGRkYwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAyKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01VTCwgUjAsIDB4N0ZGRkZGRjgpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhGRkZGRkZGMCB9IH0sCisJfSwKKwl7CisJCSJBTFVfTVVMX0s6IDEgKiAoLTEpID0gMHgwMDAwMDAwMGZmZmZmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDEpLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweDAwMDAwMDAwZmZmZmZmZmYpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTVVMLCBSMiwgMHhmZmZmZmZmZiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9NVUxfSzogMiAqIDMgPSA2IiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjAsIDMpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgNiB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9NVUxfSzogMyAqIDEgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9NVUxfSzogMSAqIDIxNDc0ODM2NDcgPSAyMTQ3NDgzNjQ3IiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX01VTCwgUjAsIDIxNDc0ODM2NDcpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMjE0NzQ4MzY0NyB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9NVUxfSzogMSAqIC0yMTQ3NDgzNjQ3ID0gLTIxNDc0ODM2NDciLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfTVVMLCBSMCwgLTIxNDc0ODM2NDcpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgLTIxNDc0ODM2NDcgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTVVMX0s6IDEgKiAoLTEpID0gMHhmZmZmZmZmZmZmZmZmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDEpLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweGZmZmZmZmZmZmZmZmZmZmZMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NVUwsIFIyLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBGX1ggKi8KKwl7CisJCSJBTFVfRElWX1g6IDYgLyAyID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0RJViwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDMgfSB9LAorCX0sCisJeworCQkiQUxVX0RJVl9YOiA0Mjk0OTY3Mjk1IC8gNDI5NDk2NzI5NSA9IDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDQyOTQ5NjcyOTVVKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDQyOTQ5NjcyOTVVKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0RJViwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfRElWX1g6IDYgLyAyID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0RJViwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDMgfSB9LAorCX0sCisJeworCQkiQUxVNjRfRElWX1g6IDIxNDc0ODM2NDcgLyAyMTQ3NDgzNjQ3ID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMjE0NzQ4MzY0NyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyMTQ3NDgzNjQ3KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0RJViwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfRElWX1g6IDB4ZmZmZmZmZmZmZmZmZmZmZiAvICgtMSkgPSAweDAwMDAwMDAwMDAwMDAwMDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9MRF9JTU02NChSNCwgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweDAwMDAwMDAwMDAwMDAwMDFMTCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9ESVYsIFIyLCBSNCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX0RJViB8IEJQRl9LICovCisJeworCQkiQUxVX0RJVl9LOiA2IC8gMiA9IDMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDYpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfRElWLCBSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9ESVZfSzogMyAvIDEgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0RJViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFVfRElWX0s6IDQyOTQ5NjcyOTUgLyA0Mjk0OTY3Mjk1ID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNDI5NDk2NzI5NVUpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfRElWLCBSMCwgNDI5NDk2NzI5NVUpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFVfRElWX0s6IDB4ZmZmZmZmZmZmZmZmZmZmZiAvICgtMSkgPSAweDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHgxVUwpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfRElWLCBSMiwgMHhmZmZmZmZmZiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9ESVZfSzogNiAvIDIgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCA2KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0RJViwgUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9ESVZfSzogMyAvIDEgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0RJViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9ESVZfSzogMjE0NzQ4MzY0NyAvIDIxNDc0ODM2NDcgPSAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAyMTQ3NDgzNjQ3KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0RJViwgUjAsIDIxNDc0ODM2NDcpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9ESVZfSzogMHhmZmZmZmZmZmZmZmZmZmZmIC8gKC0xKSA9IDB4MDAwMDAwMDAwMDAwMDAwMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweDAwMDAwMDAwMDAwMDAwMDFMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9ESVYsIFIyLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX1ggKi8KKwl7CisJCSJBTFVfTU9EX1g6IDMgJSAyID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01PRCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVX01PRF9YOiA0Mjk0OTY3Mjk1ICUgNDI5NDk2NzI5MyA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDQyOTQ5NjcyOTVVKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDQyOTQ5NjcyOTNVKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX01PRCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9EX1g6IDMgJSAyID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PRCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9EX1g6IDIxNDc0ODM2NDcgJSAyMTQ3NDgzNjQ1ID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMjE0NzQ4MzY0NyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyMTQ3NDgzNjQ1KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PRCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfSyAqLworCXsKKwkJIkFMVV9NT0RfSzogMyAlIDIgPSAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PRCwgUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFVfTU9EX0s6IDMgJSAxID0gMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT0QsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDAgfSB9LAorCX0sCisJeworCQkiQUxVX01PRF9LOiA0Mjk0OTY3Mjk1ICUgNDI5NDk2NzI5MyA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDQyOTQ5NjcyOTVVKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PRCwgUjAsIDQyOTQ5NjcyOTNVKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9EX0s6IDMgJSAyID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT0QsIFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9EX0s6IDMgJSAxID0gMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT0QsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDAgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTU9EX0s6IDIxNDc0ODM2NDcgJSAyMTQ3NDgzNjQ1ID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMjE0NzQ4MzY0NyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9NT0QsIFIwLCAyMTQ3NDgzNjQ1KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfWCAqLworCXsKKwkJIkFMVV9BTkRfWDogMyAmIDIgPSAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDIpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfQU5ELCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMiB9IH0sCisJfSwKKwl7CisJCSJBTFVfQU5EX1g6IDB4ZmZmZmZmZmYgJiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHhmZmZmZmZmZiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FORCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX1g6IDMgJiAyID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FORCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX1g6IDB4ZmZmZmZmZmYgJiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHhmZmZmZmZmZiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX0FORCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSyAqLworCXsKKwkJIkFMVV9BTkRfSzogMyAmIDIgPSAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX0FORCwgUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMiB9IH0sCisJfSwKKwl7CisJCSJBTFVfQU5EX0s6IDB4ZmZmZmZmZmYgJiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHhmZmZmZmZmZiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9BTkQsIFIwLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX0s6IDMgJiAyID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMyksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BTkQsIFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX0s6IDB4ZmZmZmZmZmYgJiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHhmZmZmZmZmZiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BTkQsIFIwLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX0s6IDB4MDAwMGZmZmZmZmZmMDAwMCAmIDB4MCA9IDB4MDAwMGZmZmYwMDAwMDAwMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgwMDAwZmZmZmZmZmYwMDAwTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweDAwMDAwMDAwMDAwMDAwMDBMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9BTkQsIFIyLCAweDApLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX0s6IDB4MDAwMGZmZmZmZmZmMDAwMCAmIC0xID0gMHgwMDAwZmZmZmZmZmZmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDAwMDBmZmZmZmZmZjAwMDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4MDAwMGZmZmZmZmZmMDAwMExMKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FORCwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfQU5EX0s6IDB4ZmZmZmZmZmZmZmZmZmZmZiAmIC0xID0gMHhmZmZmZmZmZmZmZmZmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweGZmZmZmZmZmZmZmZmZmZmZMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0FORCwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9YICovCisJeworCQkiQUxVX09SX1g6IDEgfCAyID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX09SLCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFVfT1JfWDogMHgwIHwgMHhmZmZmZmZmZiA9IDB4ZmZmZmZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMHhmZmZmZmZmZiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9PUiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCX0sCisJeworCQkiQUxVNjRfT1JfWDogMSB8IDIgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDIpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfT1IsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X09SX1g6IDAgfCAweGZmZmZmZmZmID0gMHhmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX09SLCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmZmZmZiB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX0sgKi8KKwl7CisJCSJBTFVfT1JfSzogMSB8IDIgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX09SLCBSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9PUl9LOiAwICYgMHhmZmZmZmZmZiA9IDB4ZmZmZmZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfT1IsIFIwLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCX0sCisJeworCQkiQUxVNjRfT1JfSzogMSB8IDIgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX09SLCBSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X09SX0s6IDAgJiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9PUiwgUjAsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmZmZmZiB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9PUl9LOiAweDAwMDBmZmZmZmZmZjAwMDAgfCAweDAgPSAweDAwMDBmZmZmMDAwMDAwMDAiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MDAwMGZmZmZmZmZmMDAwMExMKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHgwMDAwZmZmZmZmZmYwMDAwTEwpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfT1IsIFIyLCAweDApLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfT1JfSzogMHgwMDAwZmZmZmZmZmYwMDAwIHwgLTEgPSAweGZmZmZmZmZmZmZmZmZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MDAwMGZmZmZmZmZmMDAwMExMKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfT1IsIFIyLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X09SX0s6IDB4MDAwMDAwMDAwMDAwMDAwIHwgLTEgPSAweGZmZmZmZmZmZmZmZmZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MDAwMDAwMDAwMDAwMDAwMExMKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfT1IsIFIyLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KRVEsIFIyLCBSMywgMiksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAyKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfWE9SIHwgQlBGX1ggKi8KKwl7CisJCSJBTFVfWE9SX1g6IDUgXiA2ID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCA2KSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX1hPUiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDMgfSB9LAorCX0sCisJeworCQkiQUxVX1hPUl9YOiAweDEgXiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX1hPUiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmUgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX1g6IDUgXiA2ID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCA2KSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1hPUiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDMgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX1g6IDEgXiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1hPUiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmUgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9YT1IgfCBCUEZfSyAqLworCXsKKwkJIkFMVV9YT1JfSzogNSBeIDYgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCA1KSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX1hPUiwgUjAsIDYpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwl7CisJCSJBTFVfWE9SX0s6IDEgXiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9YT1IsIFIwLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmUgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX0s6IDUgXiA2ID0gMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgNSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9YT1IsIFIwLCA2KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDMgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX0s6IDEgJiAweGZmZmZmZmZmID0gMHhmZmZmZmZmZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9YT1IsIFIwLCAweGZmZmZmZmZmKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmUgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX0s6IDB4MDAwMGZmZmZmZmZmMDAwMCBeIDB4MCA9IDB4MDAwMGZmZmZmZmZmMDAwMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMiwgMHgwMDAwZmZmZmZmZmYwMDAwTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIzLCAweDAwMDBmZmZmZmZmZjAwMDBMTCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9YT1IsIFIyLCAweDApLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX0s6IDB4MDAwMGZmZmZmZmZmMDAwMCBeIC0xID0gMHhmZmZmMDAwMDAwMDBmZmZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweDAwMDBmZmZmZmZmZjAwMDBMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ZmZmZjAwMDAwMDAwZmZmZkxMKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1hPUiwgUjIsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjIsIFIzLCAyKSwKKwkJCUJQRl9NT1YzMl9JTU0oUjAsIDIpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfWE9SX0s6IDB4MDAwMDAwMDAwMDAwMDAwIF4gLTEgPSAweGZmZmZmZmZmZmZmZmZmZmYiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjIsIDB4MDAwMDAwMDAwMDAwMDAwMExMKSwKKwkJCUJQRl9MRF9JTU02NChSMywgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfWE9SLCBSMiwgMHhmZmZmZmZmZiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9YICovCisJeworCQkiQUxVX0xTSF9YOiAxIDw8IDEgPSAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDEpLAorCQkJQlBGX0FMVTMyX1JFRyhCUEZfTFNILCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMiB9IH0sCisJfSwKKwl7CisJCSJBTFVfTFNIX1g6IDEgPDwgMzEgPSAweDgwMDAwMDAwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDMxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0xTSCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ODAwMDAwMDAgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTFNIX1g6IDEgPDwgMSA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9MU0gsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAyIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X0xTSF9YOiAxIDw8IDMxID0gMHg4MDAwMDAwMCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAzMSksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9MU0gsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDgwMDAwMDAwIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfTFNIIHwgQlBGX0sgKi8KKwl7CisJCSJBTFVfTFNIX0s6IDEgPDwgMSA9IDIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTFNILCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAyIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9MU0hfSzogMSA8PCAzMSA9IDB4ODAwMDAwMDAiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDEpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTFNILCBSMCwgMzEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHg4MDAwMDAwMCB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9MU0hfSzogMSA8PCAxID0gMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMSksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9MU0gsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDIgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTFNIX0s6IDEgPDwgMzEgPSAweDgwMDAwMDAwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAxKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX0xTSCwgUjAsIDMxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ODAwMDAwMDAgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9SU0ggfCBCUEZfWCAqLworCXsKKwkJIkFMVV9SU0hfWDogMiA+PiAxID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMiksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAxKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX1JTSCwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVX1JTSF9YOiAweDgwMDAwMDAwID4+IDMxID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHg4MDAwMDAwMCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCAzMSksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9SU0gsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X1JTSF9YOiAyID4+IDEgPSAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAyKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjEsIDEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfUlNILCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFU2NF9SU0hfWDogMHg4MDAwMDAwMCA+PiAzMSA9IDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ODAwMDAwMDApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMSwgMzEpLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfUlNILCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9LICovCisJeworCQkiQUxVX1JTSF9LOiAyID4+IDEgPSAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAyKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX1JTSCwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJBTFVfUlNIX0s6IDB4ODAwMDAwMDAgPj4gMzEgPSAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAweDgwMDAwMDAwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX1JTSCwgUjAsIDMxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiQUxVNjRfUlNIX0s6IDIgPj4gMSA9IDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfUlNILCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X1JTSF9LOiAweDgwMDAwMDAwID4+IDMxID0gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHg4MDAwMDAwMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9SU0gsIFIwLCAzMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfQVJTSCB8IEJQRl9YICovCisJeworCQkiQUxVX0FSU0hfWDogMHhmZjAwZmYwMDAwMDAwMDAwID4+IDQwID0gMHhmZmZmZmZmZmZmZmYwMGZmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAweGZmMDBmZjAwMDAwMDAwMDBMTCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIxLCA0MCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9BUlNILCBSMCwgUjEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmMDBmZiB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX0FSU0ggfCBCUEZfSyAqLworCXsKKwkJIkFMVV9BUlNIX0s6IDB4ZmYwMGZmMDAwMDAwMDAwMCA+PiA0MCA9IDB4ZmZmZmZmZmZmZmZmMDBmZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHhmZjAwZmYwMDAwMDAwMDAwTEwpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQVJTSCwgUjAsIDQwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZjAwZmYgfSB9LAorCX0sCisJLyogQlBGX0FMVSB8IEJQRl9ORUcgKi8KKwl7CisJCSJBTFVfTkVHOiAtKDMpID0gLTMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAzKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX05FRywgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgLTMgfSB9LAorCX0sCisJeworCQkiQUxVX05FRzogLSgtMykgPSAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgLTMpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTkVHLCBSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAzIH0gfSwKKwl9LAorCXsKKwkJIkFMVTY0X05FRzogLSgzKSA9IC0zIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAzKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX05FRywgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgLTMgfSB9LAorCX0sCisJeworCQkiQUxVNjRfTkVHOiAtKC0zKSA9IDMiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIC0zKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX05FRywgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMyB9IH0sCisJfSwKKwkvKiBCUEZfQUxVIHwgQlBGX0VORCB8IEJQRl9GUk9NX0JFICovCisJeworCQkiQUxVX0VORF9GUk9NX0JFIDE2OiAweDAxMjM0NTY3ODlhYmNkZWYgLT4gMHhjZGVmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAweDAxMjM0NTY3ODlhYmNkZWZMTCksCisJCQlCUEZfRU5ESUFOKEJQRl9GUk9NX0JFLCBSMCwgMTYpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgIGNwdV90b19iZTE2KDB4Y2RlZikgfSB9LAorCX0sCisJeworCQkiQUxVX0VORF9GUk9NX0JFIDMyOiAweDAxMjM0NTY3ODlhYmNkZWYgLT4gMHg4OWFiY2RlZiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHgwMTIzNDU2Nzg5YWJjZGVmTEwpLAorCQkJQlBGX0VORElBTihCUEZfRlJPTV9CRSwgUjAsIDMyKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjEsIFIwKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1JTSCwgUjEsIDMyKSwKKwkJCUJQRl9BTFUzMl9SRUcoQlBGX0FERCwgUjAsIFIxKSwgLyogUjEgPSAwICovCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCBjcHVfdG9fYmUzMigweDg5YWJjZGVmKSB9IH0sCisJfSwKKwl7CisJCSJBTFVfRU5EX0ZST01fQkUgNjQ6IDB4MDEyMzQ1Njc4OWFiY2RlZiAtPiAweDg5YWJjZGVmIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAweDAxMjM0NTY3ODlhYmNkZWZMTCksCisJCQlCUEZfRU5ESUFOKEJQRl9GUk9NX0JFLCBSMCwgNjQpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgKHUzMikgY3B1X3RvX2JlNjQoMHgwMTIzNDU2Nzg5YWJjZGVmTEwpIH0gfSwKKwl9LAorCS8qIEJQRl9BTFUgfCBCUEZfRU5EIHwgQlBGX0ZST01fTEUgKi8KKwl7CisJCSJBTFVfRU5EX0ZST01fTEUgMTY6IDB4MDEyMzQ1Njc4OWFiY2RlZiAtPiAweGVmY2QiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDB4MDEyMzQ1Njc4OWFiY2RlZkxMKSwKKwkJCUJQRl9FTkRJQU4oQlBGX0ZST01fTEUsIFIwLCAxNiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCBjcHVfdG9fbGUxNigweGNkZWYpIH0gfSwKKwl9LAorCXsKKwkJIkFMVV9FTkRfRlJPTV9MRSAzMjogMHgwMTIzNDU2Nzg5YWJjZGVmIC0+IDB4ZWZjZGFiODkiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDB4MDEyMzQ1Njc4OWFiY2RlZkxMKSwKKwkJCUJQRl9FTkRJQU4oQlBGX0ZST01fTEUsIFIwLCAzMiksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFIxLCBSMCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9SU0gsIFIxLCAzMiksCisJCQlCUEZfQUxVMzJfUkVHKEJQRl9BREQsIFIwLCBSMSksIC8qIFIxID0gMCAqLworCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgY3B1X3RvX2xlMzIoMHg4OWFiY2RlZikgfSB9LAorCX0sCisJeworCQkiQUxVX0VORF9GUk9NX0xFIDY0OiAweDAxMjM0NTY3ODlhYmNkZWYgLT4gMHg2NzQ1MjMwMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMHgwMTIzNDU2Nzg5YWJjZGVmTEwpLAorCQkJQlBGX0VORElBTihCUEZfRlJPTV9MRSwgUjAsIDY0KSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsICh1MzIpIGNwdV90b19sZTY0KDB4MDEyMzQ1Njc4OWFiY2RlZkxMKSB9IH0sCisJfSwKKwkvKiBCUEZfU1QoWCkgfCBCUEZfTUVNIHwgQlBGX0IvSC9XL0RXICovCisJeworCQkiU1RfTUVNX0I6IFN0b3JlL0xvYWQgYnl0ZTogbWF4IG5lZ2F0aXZlIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfU1RfTUVNKEJQRl9CLCBSMTAsIC00MCwgMHhmZiksCisJCQlCUEZfTERYX01FTShCUEZfQiwgUjAsIFIxMCwgLTQwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmYgfSB9LAorCQkuc3RhY2tfZGVwdGggPSA0MCwKKwl9LAorCXsKKwkJIlNUX01FTV9COiBTdG9yZS9Mb2FkIGJ5dGU6IG1heCBwb3NpdGl2ZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX1NUX01FTShCUEZfSCwgUjEwLCAtNDAsIDB4N2YpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0gsIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDdmIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVFhfTUVNX0I6IFN0b3JlL0xvYWQgYnl0ZTogbWF4IG5lZ2F0aXZlIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMHhmZkxMKSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9CLCBSMTAsIFIxLCAtNDApLAorCQkJQlBGX0xEWF9NRU0oQlBGX0IsIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVF9NRU1fSDogU3RvcmUvTG9hZCBoYWxmIHdvcmQ6IG1heCBuZWdhdGl2ZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX1NUX01FTShCUEZfSCwgUjEwLCAtNDAsIDB4ZmZmZiksCisJCQlCUEZfTERYX01FTShCUEZfSCwgUjAsIFIxMCwgLTQwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZiB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJeworCQkiU1RfTUVNX0g6IFN0b3JlL0xvYWQgaGFsZiB3b3JkOiBtYXggcG9zaXRpdmUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0gsIFIxMCwgLTQwLCAweDdmZmYpLAorCQkJQlBGX0xEWF9NRU0oQlBGX0gsIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDdmZmYgfSB9LAorCQkuc3RhY2tfZGVwdGggPSA0MCwKKwl9LAorCXsKKwkJIlNUWF9NRU1fSDogU3RvcmUvTG9hZCBoYWxmIHdvcmQ6IG1heCBuZWdhdGl2ZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDB4ZmZmZkxMKSwKKwkJCUJQRl9TVFhfTUVNKEJQRl9ILCBSMTAsIFIxLCAtNDApLAorCQkJQlBGX0xEWF9NRU0oQlBGX0gsIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmZmYgfSB9LAorCQkuc3RhY2tfZGVwdGggPSA0MCwKKwl9LAorCXsKKwkJIlNUX01FTV9XOiBTdG9yZS9Mb2FkIHdvcmQ6IG1heCBuZWdhdGl2ZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX1NUX01FTShCUEZfVywgUjEwLCAtNDAsIDB4ZmZmZmZmZmYpLAorCQkJQlBGX0xEWF9NRU0oQlBGX1csIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmZmZmZmZmIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVF9NRU1fVzogU3RvcmUvTG9hZCB3b3JkOiBtYXggcG9zaXRpdmUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX1csIFIxMCwgLTQwLCAweDdmZmZmZmZmKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBSMCwgUjEwLCAtNDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHg3ZmZmZmZmZiB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJeworCQkiU1RYX01FTV9XOiBTdG9yZS9Mb2FkIHdvcmQ6IG1heCBuZWdhdGl2ZSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9MRF9JTU02NChSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDB4ZmZmZmZmZmZMTCksCisJCQlCUEZfU1RYX01FTShCUEZfVywgUjEwLCBSMSwgLTQwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBSMCwgUjEwLCAtNDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmZmZmZiB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJeworCQkiU1RfTUVNX0RXOiBTdG9yZS9Mb2FkIGRvdWJsZSB3b3JkOiBtYXggbmVnYXRpdmUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBSMTAsIC00MCwgMHhmZmZmZmZmZiksCisJCQlCUEZfTERYX01FTShCUEZfRFcsIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmZmZmZmZmIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVF9NRU1fRFc6IFN0b3JlL0xvYWQgZG91YmxlIHdvcmQ6IG1heCBuZWdhdGl2ZSAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0xEX0lNTTY0KFIyLCAweGZmZmYwMDAwMDAwMGZmZmZMTCksCisJCQlCUEZfTERfSU1NNjQoUjMsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBSMTAsIC00MCwgMHhmZmZmZmZmZiksCisJCQlCUEZfTERYX01FTShCUEZfRFcsIFIyLCBSMTAsIC00MCksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkVRLCBSMiwgUjMsIDIpLAorCQkJQlBGX01PVjMyX0lNTShSMCwgMiksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfTU9WMzJfSU1NKFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MSB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJeworCQkiU1RfTUVNX0RXOiBTdG9yZS9Mb2FkIGRvdWJsZSB3b3JkOiBtYXggcG9zaXRpdmUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBSMTAsIC00MCwgMHg3ZmZmZmZmZiksCisJCQlCUEZfTERYX01FTShCUEZfRFcsIFIwLCBSMTAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDdmZmZmZmZmIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVFhfTUVNX0RXOiBTdG9yZS9Mb2FkIGRvdWJsZSB3b3JkOiBtYXggbmVnYXRpdmUiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfTERfSU1NNjQoUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAweGZmZmZmZmZmZmZmZmZmZmZMTCksCisJCQlCUEZfU1RYX01FTShCUEZfVywgUjEwLCBSMSwgLTQwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBSMCwgUjEwLCAtNDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmZmZmZiB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJLyogQlBGX1NUWCB8IEJQRl9YQUREIHwgQlBGX1cvRFcgKi8KKwl7CisJCSJTVFhfWEFERF9XOiBUZXN0OiAweDEyICsgMHgxMCA9IDB4MjIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAweDEyKSwKKwkJCUJQRl9TVF9NRU0oQlBGX1csIFIxMCwgLTQwLCAweDEwKSwKKwkJCUJQRl9TVFhfWEFERChCUEZfVywgUjEwLCBSMCwgLTQwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9XLCBSMCwgUjEwLCAtNDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgyMiB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJeworCQkiU1RYX1hBRERfVzogVGVzdCBzaWRlLWVmZmVjdHMsIHIxMDogMHgxMiArIDB4MTAgPSAweDIyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBSMSwgUjEwKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDB4MTIpLAorCQkJQlBGX1NUX01FTShCUEZfVywgUjEwLCAtNDAsIDB4MTApLAorCQkJQlBGX1NUWF9YQUREKEJQRl9XLCBSMTAsIFIwLCAtNDApLAorCQkJQlBGX0FMVTY0X1JFRyhCUEZfTU9WLCBSMCwgUjEwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX1NVQiwgUjAsIFIxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDAgfSB9LAorCQkuc3RhY2tfZGVwdGggPSA0MCwKKwl9LAorCXsKKwkJIlNUWF9YQUREX1c6IFRlc3Qgc2lkZS1lZmZlY3RzLCByMDogMHgxMiArIDB4MTAgPSAweDIyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMHgxMiksCisJCQlCUEZfU1RfTUVNKEJQRl9XLCBSMTAsIC00MCwgMHgxMCksCisJCQlCUEZfU1RYX1hBREQoQlBGX1csIFIxMCwgUjAsIC00MCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweDEyIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVFhfWEFERF9XOiBYICsgMSArIDEgKyAxICsgLi4uIiwKKwkJeyB9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgNDEzNCB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX3N0eHcsCisJfSwKKwl7CisJCSJTVFhfWEFERF9EVzogVGVzdDogMHgxMiArIDB4MTAgPSAweDIyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMHgxMiksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgUjEwLCAtNDAsIDB4MTApLAorCQkJQlBGX1NUWF9YQUREKEJQRl9EVywgUjEwLCBSMCwgLTQwKSwKKwkJCUJQRl9MRFhfTUVNKEJQRl9EVywgUjAsIFIxMCwgLTQwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDB4MjIgfSB9LAorCQkuc3RhY2tfZGVwdGggPSA0MCwKKwl9LAorCXsKKwkJIlNUWF9YQUREX0RXOiBUZXN0IHNpZGUtZWZmZWN0cywgcjEwOiAweDEyICsgMHgxMCA9IDB4MjIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVNjRfUkVHKEJQRl9NT1YsIFIxLCBSMTApLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMHgxMiksCisJCQlCUEZfU1RfTUVNKEJQRl9EVywgUjEwLCAtNDAsIDB4MTApLAorCQkJQlBGX1NUWF9YQUREKEJQRl9EVywgUjEwLCBSMCwgLTQwKSwKKwkJCUJQRl9BTFU2NF9SRUcoQlBGX01PViwgUjAsIFIxMCksCisJCQlCUEZfQUxVNjRfUkVHKEJQRl9TVUIsIFIwLCBSMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAwIH0gfSwKKwkJLnN0YWNrX2RlcHRoID0gNDAsCisJfSwKKwl7CisJCSJTVFhfWEFERF9EVzogVGVzdCBzaWRlLWVmZmVjdHMsIHIwOiAweDEyICsgMHgxMCA9IDB4MjIiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAweDEyKSwKKwkJCUJQRl9TVF9NRU0oQlBGX0RXLCBSMTAsIC00MCwgMHgxMCksCisJCQlCUEZfU1RYX1hBREQoQlBGX0RXLCBSMTAsIFIwLCAtNDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHgxMiB9IH0sCisJCS5zdGFja19kZXB0aCA9IDQwLAorCX0sCisJeworCQkiU1RYX1hBRERfRFc6IFggKyAxICsgMSArIDEgKyAuLi4iLAorCQl7IH0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCA0MTM0IH0gfSwKKwkJLmZpbGxfaGVscGVyID0gYnBmX2ZpbGxfc3R4ZHcsCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0VYSVQgKi8KKwl7CisJCSJKTVBfRVhJVCIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDB4NDcxMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAweDQ3MTIpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHg0NzExIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSkEgKi8KKwl7CisJCSJKTVBfSkE6IFVuY29uZGl0aW9uYWwganVtcDogaWYgKHRydWUpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfSk1QX0lNTShCUEZfSkEsIDAsIDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSlNMVCB8IEJQRl9LICovCisJeworCQkiSk1QX0pTTFRfSzogU2lnbmVkIGp1bXA6IGlmICgtMiA8IC0xKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAweGZmZmZmZmZmZmZmZmZmZmVMTCksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNMVCwgUjEsIC0xLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSlNMVF9LOiBTaWduZWQganVtcDogaWYgKC0xIDwgLTEpIHJldHVybiAwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfTERfSU1NNjQoUjEsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0xULCBSMSwgLTEsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSlNHVCB8IEJQRl9LICovCisJeworCQkiSk1QX0pTR1RfSzogU2lnbmVkIGp1bXA6IGlmICgtMSA+IC0yKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAweGZmZmZmZmZmZmZmZmZmZmZMTCksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHVCwgUjEsIC0yLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSlNHVF9LOiBTaWduZWQganVtcDogaWYgKC0xID4gLTEpIHJldHVybiAwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfTERfSU1NNjQoUjEsIDB4ZmZmZmZmZmZmZmZmZmZmZkxMKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0dULCBSMSwgLTEsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSlNMRSB8IEJQRl9LICovCisJeworCQkiSk1QX0pTTEVfSzogU2lnbmVkIGp1bXA6IGlmICgtMiA8PSAtMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMHhmZmZmZmZmZmZmZmZmZmZlTEwpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTTEUsIFIxLCAtMSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiSk1QX0pTTEVfSzogU2lnbmVkIGp1bXA6IGlmICgtMSA8PSAtMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTTEUsIFIxLCAtMSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiSk1QX0pTTEVfSzogU2lnbmVkIGp1bXA6IHZhbHVlIHdhbGsgMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0xFLCBSMSwgMCwgNiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIxLCAxKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0xFLCBSMSwgMCwgNCksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIxLCAxKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0xFLCBSMSwgMCwgMiksCisJCQlCUEZfQUxVNjRfSU1NKEJQRl9TVUIsIFIxLCAxKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KU0xFLCBSMSwgMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCQkvKiBiYWQgZXhpdCAqLworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCS8qIGdvb2QgZXhpdCAqLworCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSlNMRV9LOiBTaWduZWQganVtcDogdmFsdWUgd2FsayAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTTEUsIFIxLCAwLCA0KSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjEsIDIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTTEUsIFIxLCAwLCAyKSwKKwkJCUJQRl9BTFU2NF9JTU0oQlBGX1NVQiwgUjEsIDIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTTEUsIFIxLCAwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwJCS8qIGJhZCBleGl0ICovCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwJLyogZ29vZCBleGl0ICovCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSlNHRSB8IEJQRl9LICovCisJeworCQkiSk1QX0pTR0VfSzogU2lnbmVkIGp1bXA6IGlmICgtMSA+PSAtMikgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTR0UsIFIxLCAtMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiSk1QX0pTR0VfSzogU2lnbmVkIGp1bXA6IGlmICgtMSA+PSAtMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMHhmZmZmZmZmZmZmZmZmZmZmTEwpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTR0UsIFIxLCAtMSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiSk1QX0pTR0VfSzogU2lnbmVkIGp1bXA6IHZhbHVlIHdhbGsgMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAtMyksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDYpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgMSksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgMSksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgMSksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAkJLyogYmFkIGV4aXQgKi8KKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAkvKiBnb29kIGV4aXQgKi8KKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiSk1QX0pTR0VfSzogU2lnbmVkIGp1bXA6IHZhbHVlIHdhbGsgMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAtMyksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDQpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgMiksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDIpLAorCQkJQlBGX0FMVTY0X0lNTShCUEZfQURELCBSMSwgMiksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNHRSwgUjEsIDAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAkJLyogYmFkIGV4aXQgKi8KKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAkvKiBnb29kIGV4aXQgKi8KKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfSyAqLworCXsKKwkJIkpNUF9KR1RfSzogaWYgKDMgPiAyKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR1QsIFIxLCAyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkdUX0s6IFVuc2lnbmVkIGp1bXA6IGlmICgtMSA+IDEpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIC0xKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KR1QsIFIxLCAxLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0pMVCB8IEJQRl9LICovCisJeworCQkiSk1QX0pMVF9LOiBpZiAoMiA8IDMpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pMVCwgUjEsIDMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KR1RfSzogVW5zaWduZWQganVtcDogaWYgKDEgPCAtMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMSksCisJCQlCUEZfSk1QX0lNTShCUEZfSkxULCBSMSwgLTEsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX0sgKi8KKwl7CisJCSJKTVBfSkdFX0s6IGlmICgzID49IDIpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pHRSwgUjEsIDIsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSkxFIHwgQlBGX0sgKi8KKwl7CisJCSJKTVBfSkxFX0s6IGlmICgyIDw9IDMpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDIpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pMRSwgUjEsIDMsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX0sganVtcCBiYWNrd2FyZHMgKi8KKwl7CisJCSJKTVBfSkdUX0s6IGlmICgzID4gMikgcmV0dXJuIDEgKGp1bXAgYmFja3dhcmRzKSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9KTVBfSU1NKEJQRl9KQSwgMCwgMCwgMiksIC8qIGdvdG8gc3RhcnQgKi8KKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLCAvKiBvdXQ6ICovCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwgLyogc3RhcnQ6ICovCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLCAvKiBub3RlOiB0aGlzIHRha2VzIDIgaW5zbnMgKi8KKwkJCUJQRl9KTVBfSU1NKEJQRl9KR1QsIFIxLCAyLCAtNiksIC8qIGdvdG8gb3V0ICovCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KR0VfSzogaWYgKDMgPj0gMykgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMyksCisJCQlCUEZfSk1QX0lNTShCUEZfSkdFLCBSMSwgMywgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KTFQgfCBCUEZfSyBqdW1wIGJhY2t3YXJkcyAqLworCXsKKwkJIkpNUF9KR1RfSzogaWYgKDIgPCAzKSByZXR1cm4gMSAoanVtcCBiYWNrd2FyZHMpIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0pNUF9JTU0oQlBGX0pBLCAwLCAwLCAyKSwgLyogZ290byBzdGFydCAqLworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksIC8qIG91dDogKi8KKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLCAvKiBzdGFydDogKi8KKwkJCUJQRl9MRF9JTU02NChSMSwgMiksIC8qIG5vdGU6IHRoaXMgdGFrZXMgMiBpbnNucyAqLworCQkJQlBGX0pNUF9JTU0oQlBGX0pMVCwgUjEsIDMsIC02KSwgLyogZ290byBvdXQgKi8KKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkiSk1QX0pMRV9LOiBpZiAoMyA8PSAzKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KTEUsIFIxLCAzLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0pORSB8IEJQRl9LICovCisJeworCQkiSk1QX0pORV9LOiBpZiAoMyAhPSAyKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KTkUsIFIxLCAyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9LICovCisJeworCQkiSk1QX0pFUV9LOiBpZiAoMyA9PSAzKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9KTVBfSU1NKEJQRl9KRVEsIFIxLCAzLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfSyAqLworCXsKKwkJIkpNUF9KU0VUX0s6IGlmICgweDMgJiAweDIpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0pNUF9JTU0oQlBGX0pTRVQsIFIxLCAyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSlNFVF9LOiBpZiAoMHgzICYgMHhmZmZmZmZmZikgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMyksCisJCQlCUEZfSk1QX0lNTShCUEZfSlNFVCwgUjEsIDB4ZmZmZmZmZmYsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSlNHVCB8IEJQRl9YICovCisJeworCQkiSk1QX0pTR1RfWDogU2lnbmVkIGp1bXA6IGlmICgtMSA+IC0yKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAtMSksCisJCQlCUEZfTERfSU1NNjQoUjIsIC0yKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KU0dULCBSMSwgUjIsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KU0dUX1g6IFNpZ25lZCBqdW1wOiBpZiAoLTEgPiAtMSkgcmV0dXJuIDAiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgLTEpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAtMSksCisJCQlCUEZfSk1QX1JFRyhCUEZfSlNHVCwgUjEsIFIyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KU0xUX1g6IFNpZ25lZCBqdW1wOiBpZiAoLTIgPCAtMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgLTEpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAtMiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSlNMVCwgUjIsIFIxLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSlNMVF9YOiBTaWduZWQganVtcDogaWYgKC0xIDwgLTEpIHJldHVybiAwIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfTERfSU1NNjQoUjEsIC0xKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgLTEpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTTFQsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KU0dFIHwgQlBGX1ggKi8KKwl7CisJCSJKTVBfSlNHRV9YOiBTaWduZWQganVtcDogaWYgKC0xID49IC0yKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAtMSksCisJCQlCUEZfTERfSU1NNjQoUjIsIC0yKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KU0dFLCBSMSwgUjIsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KU0dFX1g6IFNpZ25lZCBqdW1wOiBpZiAoLTEgPj0gLTEpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIC0xKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgLTEpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTR0UsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KU0xFIHwgQlBGX1ggKi8KKwl7CisJCSJKTVBfSlNMRV9YOiBTaWduZWQganVtcDogaWYgKC0yIDw9IC0xKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAtMSksCisJCQlCUEZfTERfSU1NNjQoUjIsIC0yKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KU0xFLCBSMiwgUjEsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KU0xFX1g6IFNpZ25lZCBqdW1wOiBpZiAoLTEgPD0gLTEpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIC0xKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgLTEpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pTTEUsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KR1QgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KR1RfWDogaWYgKDMgPiAyKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgMiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdULCBSMSwgUjIsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KR1RfWDogVW5zaWduZWQganVtcDogaWYgKC0xID4gMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgLTEpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAxKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR1QsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KTFQgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KTFRfWDogaWYgKDIgPCAzKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgMiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkxULCBSMiwgUjEsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KTFRfWDogVW5zaWduZWQganVtcDogaWYgKDEgPCAtMSkgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgLTEpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAxKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KTFQsIFIyLCBSMSwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KR0VfWDogaWYgKDMgPj0gMikgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMyksCisJCQlCUEZfTERfSU1NNjQoUjIsIDIpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pHRSwgUjEsIFIyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkdFX1g6IGlmICgzID49IDMpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAzKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KR0UsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KTEUgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KTEVfWDogaWYgKDIgPD0gMykgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMyksCisJCQlCUEZfTERfSU1NNjQoUjIsIDIpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pMRSwgUjIsIFIxLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkxFX1g6IGlmICgzIDw9IDMpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAzKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KTEUsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJeworCQkvKiBNYWlubHkgdGVzdGluZyBKSVQgKyBpbW02NCBoZXJlLiAqLworCQkiSk1QX0pHRV9YOiBsZGltbTY0IHRlc3QgMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgMiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBSMSwgUjIsIDIpLAorCQkJQlBGX0xEX0lNTTY0KFIwLCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIwLCAweGVlZWVlZWVlZWVlZWVlZWVVTEwpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhlZWVlZWVlZVUgfSB9LAorCX0sCisJeworCQkiSk1QX0pHRV9YOiBsZGltbTY0IHRlc3QgMiIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgMiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBSMSwgUjIsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIwLCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmZmZmZlUgfSB9LAorCX0sCisJeworCQkiSk1QX0pHRV9YOiBsZGltbTY0IHRlc3QgMyIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgMiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSkdFLCBSMSwgUjIsIDQpLAorCQkJQlBGX0xEX0lNTTY0KFIwLCAweGZmZmZmZmZmZmZmZmZmZmZVTEwpLAorCQkJQlBGX0xEX0lNTTY0KFIwLCAweGVlZWVlZWVlZWVlZWVlZWVVTEwpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkxFX1g6IGxkaW1tNjQgdGVzdCAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KTEUsIFIyLCBSMSwgMiksCisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCksCisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZWVlZWVlZWVlZWVlZWVlZVVMTCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGVlZWVlZWVlVSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkxFX1g6IGxkaW1tNjQgdGVzdCAyIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KTEUsIFIyLCBSMSwgMCksCisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAweGZmZmZmZmZmVSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkxFX1g6IGxkaW1tNjQgdGVzdCAzIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KTEUsIFIyLCBSMSwgNCksCisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZmZmZmZmZmZmZmZmZmZmZlVMTCksCisJCQlCUEZfTERfSU1NNjQoUjAsIDB4ZWVlZWVlZWVlZWVlZWVlZVVMTCksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCS8qIEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1ggKi8KKwl7CisJCSJKTVBfSk5FX1g6IGlmICgzICE9IDIpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KTkUsIFIxLCBSMiwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJfSwKKwkJSU5URVJOQUwsCisJCXsgfSwKKwkJeyB7IDAsIDEgfSB9LAorCX0sCisJLyogQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KRVFfWDogaWYgKDMgPT0gMykgcmV0dXJuIDEiLAorCQkudS5pbnNuc19pbnQgPSB7CisJCQlCUEZfQUxVMzJfSU1NKEJQRl9NT1YsIFIwLCAwKSwKKwkJCUJQRl9MRF9JTU02NChSMSwgMyksCisJCQlCUEZfTERfSU1NNjQoUjIsIDMpLAorCQkJQlBGX0pNUF9SRUcoQlBGX0pFUSwgUjEsIFIyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwkvKiBCUEZfSk1QIHwgQlBGX0pTRVQgfCBCUEZfWCAqLworCXsKKwkJIkpNUF9KU0VUX1g6IGlmICgweDMgJiAweDIpIHJldHVybiAxIiwKKwkJLnUuaW5zbnNfaW50ID0geworCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMCksCisJCQlCUEZfTERfSU1NNjQoUjEsIDMpLAorCQkJQlBGX0xEX0lNTTY0KFIyLCAyKSwKKwkJCUJQRl9KTVBfUkVHKEJQRl9KU0VULCBSMSwgUjIsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQkJQlBGX0FMVTMyX0lNTShCUEZfTU9WLCBSMCwgMSksCisJCQlCUEZfRVhJVF9JTlNOKCksCisJCX0sCisJCUlOVEVSTkFMLAorCQl7IH0sCisJCXsgeyAwLCAxIH0gfSwKKwl9LAorCXsKKwkJIkpNUF9KU0VUX1g6IGlmICgweDMgJiAweGZmZmZmZmZmKSByZXR1cm4gMSIsCisJCS51Lmluc25zX2ludCA9IHsKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDApLAorCQkJQlBGX0xEX0lNTTY0KFIxLCAzKSwKKwkJCUJQRl9MRF9JTU02NChSMiwgMHhmZmZmZmZmZiksCisJCQlCUEZfSk1QX1JFRyhCUEZfSlNFVCwgUjEsIFIyLCAxKSwKKwkJCUJQRl9FWElUX0lOU04oKSwKKwkJCUJQRl9BTFUzMl9JTU0oQlBGX01PViwgUjAsIDEpLAorCQkJQlBGX0VYSVRfSU5TTigpLAorCQl9LAorCQlJTlRFUk5BTCwKKwkJeyB9LAorCQl7IHsgMCwgMSB9IH0sCisJfSwKKwl7CisJCSJKTVBfSkE6IEp1bXAsIGdhcCwganVtcCwgLi4uIiwKKwkJeyB9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBLAorCQl7IH0sCisJCXsgeyAwLCAweGFiYWJjYmFjIH0gfSwKKwkJLmZpbGxfaGVscGVyID0gYnBmX2ZpbGxfamEsCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIkJQRl9NQVhJTlNOUzogTWF4aW11bSBwb3NzaWJsZSBsaXRlcmFscyIsCisJCXsgfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZmZmZmZmZiB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX21heGluc25zMSwKKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiQlBGX01BWElOU05TOiBTaW5nbGUgbGl0ZXJhbCIsCisJCXsgfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHhmZWZlZmVmZSB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX21heGluc25zMiwKKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiQlBGX01BWElOU05TOiBSdW4vYWRkIHVudGlsIGVuZCIsCisJCXsgfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHg5NDdiZjM2OCB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX21heGluc25zMywKKwl9LAorCXsKKwkJIkJQRl9NQVhJTlNOUzogVG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIiwKKwkJeyB9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBIHwgRkxBR19FWFBFQ1RFRF9GQUlMLAorCQl7IH0sCisJCXsgfSwKKwkJLmZpbGxfaGVscGVyID0gYnBmX2ZpbGxfbWF4aW5zbnM0LAorCQkuZXhwZWN0ZWRfZXJyY29kZSA9IC1FSU5WQUwsCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIkJQRl9NQVhJTlNOUzogVmVyeSBsb25nIGp1bXAiLAorCQl7IH0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDB4YWJhYmFiYWIgfSB9LAorCQkuZmlsbF9oZWxwZXIgPSBicGZfZmlsbF9tYXhpbnNuczUsCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIkJQRl9NQVhJTlNOUzogQ3R4IGhlYXZ5IHRyYW5zZm9ybWF0aW9ucyIsCisJCXsgfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7CisJCQl7ICAxLCAhIShTS0JfVkxBTl9UQ0kgJiBWTEFOX1RBR19QUkVTRU5UKSB9LAorCQkJeyAxMCwgISEoU0tCX1ZMQU5fVENJICYgVkxBTl9UQUdfUFJFU0VOVCkgfQorCQl9LAorCQkuZmlsbF9oZWxwZXIgPSBicGZfZmlsbF9tYXhpbnNuczYsCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIkJQRl9NQVhJTlNOUzogQ2FsbCBoZWF2eSB0cmFuc2Zvcm1hdGlvbnMiLAorCQl7IH0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDEsIDAgfSwgeyAxMCwgMCB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX21heGluc25zNywKKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiQlBGX01BWElOU05TOiBKdW1wIGhlYXZ5IHRlc3QiLAorCQl7IH0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXsgfSwKKwkJeyB7IDAsIDB4ZmZmZmZmZmYgfSB9LAorCQkuZmlsbF9oZWxwZXIgPSBicGZfZmlsbF9tYXhpbnNuczgsCisJfSwKKwl7CS8qIE1haW5seSBjaGVja2luZyBKSVQgaGVyZS4gKi8KKwkJIkJQRl9NQVhJTlNOUzogVmVyeSBsb25nIGp1bXAgYmFja3dhcmRzIiwKKwkJeyB9LAorCQlJTlRFUk5BTCB8IEZMQUdfTk9fREFUQSwKKwkJeyB9LAorCQl7IHsgMCwgMHhjYmFiYWJhYiB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX21heGluc25zOSwKKwl9LAorCXsJLyogTWFpbmx5IGNoZWNraW5nIEpJVCBoZXJlLiAqLworCQkiQlBGX01BWElOU05TOiBFZGdlIGhvcHBpbmcgbnV0aG91c2UiLAorCQl7IH0sCisJCUlOVEVSTkFMIHwgRkxBR19OT19EQVRBLAorCQl7IH0sCisJCXsgeyAwLCAweGFiYWJhYmFjIH0gfSwKKwkJLmZpbGxfaGVscGVyID0gYnBmX2ZpbGxfbWF4aW5zbnMxMCwKKwl9LAorCXsKKwkJIkJQRl9NQVhJTlNOUzogSnVtcCwgZ2FwLCBqdW1wLCAuLi4iLAorCQl7IH0sCisjaWYgZGVmaW5lZChDT05GSUdfQlBGX0pJVF9BTFdBWVNfT04pICYmIGRlZmluZWQoQ09ORklHX1g4NikKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSB8IEZMQUdfRVhQRUNURURfRkFJTCwKKyNlbHNlCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisjZW5kaWYKKwkJeyB9LAorCQl7IHsgMCwgMHhhYmFiY2JhYyB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX21heGluc25zMTEsCisJCS5leHBlY3RlZF9lcnJjb2RlID0gLUVOT1RTVVBQLAorCX0sCisJeworCQkiQlBGX01BWElOU05TOiBsZF9hYnMrZ2V0X3Byb2Nlc3Nvcl9pZCIsCisJCXsgfSwKKwkJQ0xBU1NJQywKKwkJeyB9LAorCQl7IHsgMSwgMHhiZWUgfSB9LAorCQkuZmlsbF9oZWxwZXIgPSBicGZfZmlsbF9sZF9hYnNfZ2V0X3Byb2Nlc3Nvcl9pZCwKKwl9LAorCXsKKwkJIkJQRl9NQVhJTlNOUzogbGRfYWJzK3ZsYW5fcHVzaC9wb3AiLAorCQl7IH0sCisJCUlOVEVSTkFMLAorCQl7IDB4MzQgfSwKKwkJeyB7IEVUSF9ITEVOLCAweGJlZiB9IH0sCisJCS5maWxsX2hlbHBlciA9IGJwZl9maWxsX2xkX2Fic192bGFuX3B1c2hfcG9wLAorCX0sCisJeworCQkiQlBGX01BWElOU05TOiBqdW1wIGFyb3VuZCBsZF9hYnMiLAorCQl7IH0sCisJCUlOVEVSTkFMLAorCQl7IDEwLCAxMSB9LAorCQl7IHsgMiwgMTAgfSB9LAorCQkuZmlsbF9oZWxwZXIgPSBicGZfZmlsbF9qdW1wX2Fyb3VuZF9sZF9hYnMsCisJfSwKKwkvKgorCSAqIExEX0lORCAvIExEX0FCUyBvbiBmcmFnbWVudGVkIFNLQnMKKwkgKi8KKwl7CisJCSJMRF9JTkQgYnl0ZSBmcmFnIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHg0MCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0IsIDB4MCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX1NLQl9GUkFHLAorCQl7IH0sCisJCXsgezB4NDAsIDB4NDJ9IH0sCisJCS5mcmFnX2RhdGEgPSB7CisJCQkweDQyLCAweDAwLCAweDAwLCAweDAwLAorCQkJMHg0MywgMHg0NCwgMHgwMCwgMHgwMCwKKwkJCTB4MjEsIDB4MDcsIDB4MTksIDB4ODMsCisJCX0sCisJfSwKKwl7CisJCSJMRF9JTkQgaGFsZndvcmQgZnJhZyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4NDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9ILCAweDQpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19TS0JfRlJBRywKKwkJeyB9LAorCQl7IHsweDQwLCAweDQzNDR9IH0sCisJCS5mcmFnX2RhdGEgPSB7CisJCQkweDQyLCAweDAwLCAweDAwLCAweDAwLAorCQkJMHg0MywgMHg0NCwgMHgwMCwgMHgwMCwKKwkJCTB4MjEsIDB4MDcsIDB4MTksIDB4ODMsCisJCX0sCisJfSwKKwl7CisJCSJMRF9JTkQgd29yZCBmcmFnIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHg0MCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX1csIDB4OCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX1NLQl9GUkFHLAorCQl7IH0sCisJCXsgezB4NDAsIDB4MjEwNzE5ODN9IH0sCisJCS5mcmFnX2RhdGEgPSB7CisJCQkweDQyLCAweDAwLCAweDAwLCAweDAwLAorCQkJMHg0MywgMHg0NCwgMHgwMCwgMHgwMCwKKwkJCTB4MjEsIDB4MDcsIDB4MTksIDB4ODMsCisJCX0sCisJfSwKKwl7CisJCSJMRF9JTkQgaGFsZndvcmQgbWl4ZWQgaGVhZC9mcmFnIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHg0MCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0gsIC0weDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19TS0JfRlJBRywKKwkJeyBbMHgzZV0gPSAweDI1LCBbMHgzZl0gPSAweDA1LCB9LAorCQl7IHsweDQwLCAweDA1MTl9IH0sCisJCS5mcmFnX2RhdGEgPSB7IDB4MTksIDB4ODIgfSwKKwl9LAorCXsKKwkJIkxEX0lORCB3b3JkIG1peGVkIGhlYWQvZnJhZyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4NDApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9XLCAtMHgyKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfU0tCX0ZSQUcsCisJCXsgWzB4M2VdID0gMHgyNSwgWzB4M2ZdID0gMHgwNSwgfSwKKwkJeyB7MHg0MCwgMHgyNTA1MTk4Mn0gfSwKKwkJLmZyYWdfZGF0YSA9IHsgMHgxOSwgMHg4MiB9LAorCX0sCisJeworCQkiTERfQUJTIGJ5dGUgZnJhZyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9CLCAweDQwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfU0tCX0ZSQUcsCisJCXsgfSwKKwkJeyB7MHg0MCwgMHg0Mn0gfSwKKwkJLmZyYWdfZGF0YSA9IHsKKwkJCTB4NDIsIDB4MDAsIDB4MDAsIDB4MDAsCisJCQkweDQzLCAweDQ0LCAweDAwLCAweDAwLAorCQkJMHgyMSwgMHgwNywgMHgxOSwgMHg4MywKKwkJfSwKKwl9LAorCXsKKwkJIkxEX0FCUyBoYWxmd29yZCBmcmFnIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0gsIDB4NDQpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19TS0JfRlJBRywKKwkJeyB9LAorCQl7IHsweDQwLCAweDQzNDR9IH0sCisJCS5mcmFnX2RhdGEgPSB7CisJCQkweDQyLCAweDAwLCAweDAwLCAweDAwLAorCQkJMHg0MywgMHg0NCwgMHgwMCwgMHgwMCwKKwkJCTB4MjEsIDB4MDcsIDB4MTksIDB4ODMsCisJCX0sCisJfSwKKwl7CisJCSJMRF9BQlMgd29yZCBmcmFnIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX1csIDB4NDgpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19TS0JfRlJBRywKKwkJeyB9LAorCQl7IHsweDQwLCAweDIxMDcxOTgzfSB9LAorCQkuZnJhZ19kYXRhID0geworCQkJMHg0MiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJCTB4NDMsIDB4NDQsIDB4MDAsIDB4MDAsCisJCQkweDIxLCAweDA3LCAweDE5LCAweDgzLAorCQl9LAorCX0sCisJeworCQkiTERfQUJTIGhhbGZ3b3JkIG1peGVkIGhlYWQvZnJhZyIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9ILCAweDNmKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfU0tCX0ZSQUcsCisJCXsgWzB4M2VdID0gMHgyNSwgWzB4M2ZdID0gMHgwNSwgfSwKKwkJeyB7MHg0MCwgMHgwNTE5fSB9LAorCQkuZnJhZ19kYXRhID0geyAweDE5LCAweDgyIH0sCisJfSwKKwl7CisJCSJMRF9BQlMgd29yZCBtaXhlZCBoZWFkL2ZyYWciLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9BQlMgfCBCUEZfVywgMHgzZSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX1NLQl9GUkFHLAorCQl7IFsweDNlXSA9IDB4MjUsIFsweDNmXSA9IDB4MDUsIH0sCisJCXsgezB4NDAsIDB4MjUwNTE5ODJ9IH0sCisJCS5mcmFnX2RhdGEgPSB7IDB4MTksIDB4ODIgfSwKKwl9LAorCS8qCisJICogTERfSU5EIC8gTERfQUJTIG9uIG5vbiBmcmFnbWVudGVkIFNLQnMKKwkgKi8KKwl7CisJCS8qCisJCSAqIHRoaXMgdGVzdHMgdGhhdCB0aGUgSklUL2ludGVycHJldGVyIGNvcnJlY3RseSByZXNldHMgWAorCQkgKiBiZWZvcmUgdXNpbmcgaXQgaW4gYW4gTERfSU5EIGluc3RydWN0aW9uLgorCQkgKi8KKwkJIkxEX0lORCBieXRlIGRlZmF1bHQgWCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9CLCAweDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7IFsweDFdID0gMHg0MiB9LAorCQl7IHsweDQwLCAweDQyIH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORCBieXRlIHBvc2l0aXZlIG9mZnNldCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4M2UpLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9CLCAweDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7IFsweDNjXSA9IDB4MjUsIFsweDNkXSA9IDB4MDUsICBbMHgzZV0gPSAweDE5LCBbMHgzZl0gPSAweDgyIH0sCisJCXsgezB4NDAsIDB4ODIgfSB9LAorCX0sCisJeworCQkiTERfSU5EIGJ5dGUgbmVnYXRpdmUgb2Zmc2V0IiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHgzZSksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX0IsIC0weDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7IFsweDNjXSA9IDB4MjUsIFsweDNkXSA9IDB4MDUsICBbMHgzZV0gPSAweDE5LCBbMHgzZl0gPSAweDgyIH0sCisJCXsgezB4NDAsIDB4MDUgfSB9LAorCX0sCisJeworCQkiTERfSU5EIGhhbGZ3b3JkIHBvc2l0aXZlIG9mZnNldCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4MjApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9ILCAweDIpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7CisJCQlbMHgxY10gPSAweGFhLCBbMHgxZF0gPSAweDU1LAorCQkJWzB4MWVdID0gMHhiYiwgWzB4MWZdID0gMHg2NiwKKwkJCVsweDIwXSA9IDB4Y2MsIFsweDIxXSA9IDB4NzcsCisJCQlbMHgyMl0gPSAweGRkLCBbMHgyM10gPSAweDg4LAorCQl9LAorCQl7IHsweDQwLCAweGRkODggfSB9LAorCX0sCisJeworCQkiTERfSU5EIGhhbGZ3b3JkIG5lZ2F0aXZlIG9mZnNldCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4MjApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9ILCAtMHgyKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeworCQkJWzB4MWNdID0gMHhhYSwgWzB4MWRdID0gMHg1NSwKKwkJCVsweDFlXSA9IDB4YmIsIFsweDFmXSA9IDB4NjYsCisJCQlbMHgyMF0gPSAweGNjLCBbMHgyMV0gPSAweDc3LAorCQkJWzB4MjJdID0gMHhkZCwgWzB4MjNdID0gMHg4OCwKKwkJfSwKKwkJeyB7MHg0MCwgMHhiYjY2IH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORCBoYWxmd29yZCB1bmFsaWduZWQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweDIwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTkQgfCBCUEZfSCwgLTB4MSksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMsCisJCXsKKwkJCVsweDFjXSA9IDB4YWEsIFsweDFkXSA9IDB4NTUsCisJCQlbMHgxZV0gPSAweGJiLCBbMHgxZl0gPSAweDY2LAorCQkJWzB4MjBdID0gMHhjYywgWzB4MjFdID0gMHg3NywKKwkJCVsweDIyXSA9IDB4ZGQsIFsweDIzXSA9IDB4ODgsCisJCX0sCisJCXsgezB4NDAsIDB4NjZjYyB9IH0sCisJfSwKKwl7CisJCSJMRF9JTkQgd29yZCBwb3NpdGl2ZSBvZmZzZXQiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweDIwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTkQgfCBCUEZfVywgMHg0KSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeworCQkJWzB4MWNdID0gMHhhYSwgWzB4MWRdID0gMHg1NSwKKwkJCVsweDFlXSA9IDB4YmIsIFsweDFmXSA9IDB4NjYsCisJCQlbMHgyMF0gPSAweGNjLCBbMHgyMV0gPSAweDc3LAorCQkJWzB4MjJdID0gMHhkZCwgWzB4MjNdID0gMHg4OCwKKwkJCVsweDI0XSA9IDB4ZWUsIFsweDI1XSA9IDB4OTksCisJCQlbMHgyNl0gPSAweGZmLCBbMHgyN10gPSAweGFhLAorCQl9LAorCQl7IHsweDQwLCAweGVlOTlmZmFhIH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORCB3b3JkIG5lZ2F0aXZlIG9mZnNldCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4MjApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9XLCAtMHg0KSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeworCQkJWzB4MWNdID0gMHhhYSwgWzB4MWRdID0gMHg1NSwKKwkJCVsweDFlXSA9IDB4YmIsIFsweDFmXSA9IDB4NjYsCisJCQlbMHgyMF0gPSAweGNjLCBbMHgyMV0gPSAweDc3LAorCQkJWzB4MjJdID0gMHhkZCwgWzB4MjNdID0gMHg4OCwKKwkJCVsweDI0XSA9IDB4ZWUsIFsweDI1XSA9IDB4OTksCisJCQlbMHgyNl0gPSAweGZmLCBbMHgyN10gPSAweGFhLAorCQl9LAorCQl7IHsweDQwLCAweGFhNTViYjY2IH0gfSwKKwl9LAorCXsKKwkJIkxEX0lORCB3b3JkIHVuYWxpZ25lZCAoYWRkciAmIDMgPT0gMikiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRFggfCBCUEZfSU1NLCAweDIwKSwKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTkQgfCBCUEZfVywgLTB4MiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMsCisJCXsKKwkJCVsweDFjXSA9IDB4YWEsIFsweDFkXSA9IDB4NTUsCisJCQlbMHgxZV0gPSAweGJiLCBbMHgxZl0gPSAweDY2LAorCQkJWzB4MjBdID0gMHhjYywgWzB4MjFdID0gMHg3NywKKwkJCVsweDIyXSA9IDB4ZGQsIFsweDIzXSA9IDB4ODgsCisJCQlbMHgyNF0gPSAweGVlLCBbMHgyNV0gPSAweDk5LAorCQkJWzB4MjZdID0gMHhmZiwgWzB4MjddID0gMHhhYSwKKwkJfSwKKwkJeyB7MHg0MCwgMHhiYjY2Y2M3NyB9IH0sCisJfSwKKwl7CisJCSJMRF9JTkQgd29yZCB1bmFsaWduZWQgKGFkZHIgJiAzID09IDEpIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTERYIHwgQlBGX0lNTSwgMHgyMCksCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU5EIHwgQlBGX1csIC0weDMpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7CisJCQlbMHgxY10gPSAweGFhLCBbMHgxZF0gPSAweDU1LAorCQkJWzB4MWVdID0gMHhiYiwgWzB4MWZdID0gMHg2NiwKKwkJCVsweDIwXSA9IDB4Y2MsIFsweDIxXSA9IDB4NzcsCisJCQlbMHgyMl0gPSAweGRkLCBbMHgyM10gPSAweDg4LAorCQkJWzB4MjRdID0gMHhlZSwgWzB4MjVdID0gMHg5OSwKKwkJCVsweDI2XSA9IDB4ZmYsIFsweDI3XSA9IDB4YWEsCisJCX0sCisJCXsgezB4NDAsIDB4NTViYjY2Y2MgfSB9LAorCX0sCisJeworCQkiTERfSU5EIHdvcmQgdW5hbGlnbmVkIChhZGRyICYgMyA9PSAzKSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEWCB8IEJQRl9JTU0sIDB4MjApLAorCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lORCB8IEJQRl9XLCAtMHgxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeworCQkJWzB4MWNdID0gMHhhYSwgWzB4MWRdID0gMHg1NSwKKwkJCVsweDFlXSA9IDB4YmIsIFsweDFmXSA9IDB4NjYsCisJCQlbMHgyMF0gPSAweGNjLCBbMHgyMV0gPSAweDc3LAorCQkJWzB4MjJdID0gMHhkZCwgWzB4MjNdID0gMHg4OCwKKwkJCVsweDI0XSA9IDB4ZWUsIFsweDI1XSA9IDB4OTksCisJCQlbMHgyNl0gPSAweGZmLCBbMHgyN10gPSAweGFhLAorCQl9LAorCQl7IHsweDQwLCAweDY2Y2M3N2RkIH0gfSwKKwl9LAorCXsKKwkJIkxEX0FCUyBieXRlIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0IsIDB4MjApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7CisJCQlbMHgxY10gPSAweGFhLCBbMHgxZF0gPSAweDU1LAorCQkJWzB4MWVdID0gMHhiYiwgWzB4MWZdID0gMHg2NiwKKwkJCVsweDIwXSA9IDB4Y2MsIFsweDIxXSA9IDB4NzcsCisJCQlbMHgyMl0gPSAweGRkLCBbMHgyM10gPSAweDg4LAorCQkJWzB4MjRdID0gMHhlZSwgWzB4MjVdID0gMHg5OSwKKwkJCVsweDI2XSA9IDB4ZmYsIFsweDI3XSA9IDB4YWEsCisJCX0sCisJCXsgezB4NDAsIDB4Y2MgfSB9LAorCX0sCisJeworCQkiTERfQUJTIGhhbGZ3b3JkIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0gsIDB4MjIpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7CisJCQlbMHgxY10gPSAweGFhLCBbMHgxZF0gPSAweDU1LAorCQkJWzB4MWVdID0gMHhiYiwgWzB4MWZdID0gMHg2NiwKKwkJCVsweDIwXSA9IDB4Y2MsIFsweDIxXSA9IDB4NzcsCisJCQlbMHgyMl0gPSAweGRkLCBbMHgyM10gPSAweDg4LAorCQkJWzB4MjRdID0gMHhlZSwgWzB4MjVdID0gMHg5OSwKKwkJCVsweDI2XSA9IDB4ZmYsIFsweDI3XSA9IDB4YWEsCisJCX0sCisJCXsgezB4NDAsIDB4ZGQ4OCB9IH0sCisJfSwKKwl7CisJCSJMRF9BQlMgaGFsZndvcmQgdW5hbGlnbmVkIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX0gsIDB4MjUpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7CisJCQlbMHgxY10gPSAweGFhLCBbMHgxZF0gPSAweDU1LAorCQkJWzB4MWVdID0gMHhiYiwgWzB4MWZdID0gMHg2NiwKKwkJCVsweDIwXSA9IDB4Y2MsIFsweDIxXSA9IDB4NzcsCisJCQlbMHgyMl0gPSAweGRkLCBbMHgyM10gPSAweDg4LAorCQkJWzB4MjRdID0gMHhlZSwgWzB4MjVdID0gMHg5OSwKKwkJCVsweDI2XSA9IDB4ZmYsIFsweDI3XSA9IDB4YWEsCisJCX0sCisJCXsgezB4NDAsIDB4OTlmZiB9IH0sCisJfSwKKwl7CisJCSJMRF9BQlMgd29yZCIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9XLCAweDFjKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeworCQkJWzB4MWNdID0gMHhhYSwgWzB4MWRdID0gMHg1NSwKKwkJCVsweDFlXSA9IDB4YmIsIFsweDFmXSA9IDB4NjYsCisJCQlbMHgyMF0gPSAweGNjLCBbMHgyMV0gPSAweDc3LAorCQkJWzB4MjJdID0gMHhkZCwgWzB4MjNdID0gMHg4OCwKKwkJCVsweDI0XSA9IDB4ZWUsIFsweDI1XSA9IDB4OTksCisJCQlbMHgyNl0gPSAweGZmLCBbMHgyN10gPSAweGFhLAorCQl9LAorCQl7IHsweDQwLCAweGFhNTViYjY2IH0gfSwKKwl9LAorCXsKKwkJIkxEX0FCUyB3b3JkIHVuYWxpZ25lZCAoYWRkciAmIDMgPT0gMikiLAorCQkudS5pbnNucyA9IHsKKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9BQlMgfCBCUEZfVywgMHgyMiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMsCisJCXsKKwkJCVsweDFjXSA9IDB4YWEsIFsweDFkXSA9IDB4NTUsCisJCQlbMHgxZV0gPSAweGJiLCBbMHgxZl0gPSAweDY2LAorCQkJWzB4MjBdID0gMHhjYywgWzB4MjFdID0gMHg3NywKKwkJCVsweDIyXSA9IDB4ZGQsIFsweDIzXSA9IDB4ODgsCisJCQlbMHgyNF0gPSAweGVlLCBbMHgyNV0gPSAweDk5LAorCQkJWzB4MjZdID0gMHhmZiwgWzB4MjddID0gMHhhYSwKKwkJfSwKKwkJeyB7MHg0MCwgMHhkZDg4ZWU5OSB9IH0sCisJfSwKKwl7CisJCSJMRF9BQlMgd29yZCB1bmFsaWduZWQgKGFkZHIgJiAzID09IDEpIiwKKwkJLnUuaW5zbnMgPSB7CisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfQUJTIHwgQlBGX1csIDB4MjEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDLAorCQl7CisJCQlbMHgxY10gPSAweGFhLCBbMHgxZF0gPSAweDU1LAorCQkJWzB4MWVdID0gMHhiYiwgWzB4MWZdID0gMHg2NiwKKwkJCVsweDIwXSA9IDB4Y2MsIFsweDIxXSA9IDB4NzcsCisJCQlbMHgyMl0gPSAweGRkLCBbMHgyM10gPSAweDg4LAorCQkJWzB4MjRdID0gMHhlZSwgWzB4MjVdID0gMHg5OSwKKwkJCVsweDI2XSA9IDB4ZmYsIFsweDI3XSA9IDB4YWEsCisJCX0sCisJCXsgezB4NDAsIDB4NzdkZDg4ZWUgfSB9LAorCX0sCisJeworCQkiTERfQUJTIHdvcmQgdW5hbGlnbmVkIChhZGRyICYgMyA9PSAzKSIsCisJCS51Lmluc25zID0geworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0FCUyB8IEJQRl9XLCAweDIzKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQywKKwkJeworCQkJWzB4MWNdID0gMHhhYSwgWzB4MWRdID0gMHg1NSwKKwkJCVsweDFlXSA9IDB4YmIsIFsweDFmXSA9IDB4NjYsCisJCQlbMHgyMF0gPSAweGNjLCBbMHgyMV0gPSAweDc3LAorCQkJWzB4MjJdID0gMHhkZCwgWzB4MjNdID0gMHg4OCwKKwkJCVsweDI0XSA9IDB4ZWUsIFsweDI1XSA9IDB4OTksCisJCQlbMHgyNl0gPSAweGZmLCBbMHgyN10gPSAweGFhLAorCQl9LAorCQl7IHsweDQwLCAweDg4ZWU5OWZmIH0gfSwKKwl9LAorCS8qCisJICogdmVyaWZ5IHRoYXQgdGhlIGludGVycHJldGVyIG9yIEpJVCBjb3JyZWN0bHkgc2V0cyBBIGFuZCBYCisJICogdG8gMC4KKwkgKi8KKwl7CisJCSJBREQgZGVmYXVsdCBYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKgorCQkJICogQSA9IDB4NDIKKwkJCSAqIEEgPSBBICsgWAorCQkJICogcmV0IEEKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMHg0MiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJe30sCisJCXsgezB4MSwgMHg0MiB9IH0sCisJfSwKKwl7CisJCSJBREQgZGVmYXVsdCBBIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKgorCQkJICogQSA9IEEgKyAweDQyCisJCQkgKiByZXQgQQorCQkJICovCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LLCAweDQyKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJe30sCisJCXsgezB4MSwgMHg0MiB9IH0sCisJfSwKKwl7CisJCSJTVUIgZGVmYXVsdCBYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKgorCQkJICogQSA9IDB4NjYKKwkJCSAqIEEgPSBBIC0gWAorCQkJICogcmV0IEEKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0xEIHwgQlBGX0lNTSwgMHg2NiksCisJCQlCUEZfU1RNVChCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YLCAwKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJe30sCisJCXsgezB4MSwgMHg2NiB9IH0sCisJfSwKKwl7CisJCSJTVUIgZGVmYXVsdCBBIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKgorCQkJICogQSA9IEEgLSAtMHg2NgorCQkJICogcmV0IEEKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfSywgLTB4NjYpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBLAorCQl7fSwKKwkJeyB7MHgxLCAweDY2IH0gfSwKKwl9LAorCXsKKwkJIk1VTCBkZWZhdWx0IFgiLAorCQkudS5pbnNucyA9IHsKKwkJCS8qCisJCQkgKiBBID0gMHg0MgorCQkJICogQSA9IEEgKiBYCisJCQkgKiByZXQgQQorCQkJICovCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAweDQyKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9BLCAweDApLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBLAorCQl7fSwKKwkJeyB7MHgxLCAweDAgfSB9LAorCX0sCisJeworCQkiTVVMIGRlZmF1bHQgQSIsCisJCS51Lmluc25zID0geworCQkJLyoKKwkJCSAqIEEgPSBBICogMHg2NgorCQkJICogcmV0IEEKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9NVUwgfCBCUEZfSywgMHg2NiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0EsIDB4MCksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXt9LAorCQl7IHsweDEsIDB4MCB9IH0sCisJfSwKKwl7CisJCSJESVYgZGVmYXVsdCBYIiwKKwkJLnUuaW5zbnMgPSB7CisJCQkvKgorCQkJICogQSA9IDB4NDIKKwkJCSAqIEEgPSBBIC8gWCA7IHRoaXMgaGFsdCB0aGUgZmlsdGVyIGV4ZWN1dGlvbiBpZiBYIGlzIDAKKwkJCSAqIHJldCAweDQyCisJCQkgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDB4NDIpLAorCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfWCwgMCksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4NDIpLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBLAorCQl7fSwKKwkJeyB7MHgxLCAweDAgfSB9LAorCX0sCisJeworCQkiRElWIGRlZmF1bHQgQSIsCisJCS51Lmluc25zID0geworCQkJLyoKKwkJCSAqIEEgPSBBIC8gMQorCQkJICogcmV0IEEKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZfSywgMHgxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJe30sCisJCXsgezB4MSwgMHgwIH0gfSwKKwl9LAorCXsKKwkJIk1PRCBkZWZhdWx0IFgiLAorCQkudS5pbnNucyA9IHsKKwkJCS8qCisJCQkgKiBBID0gMHg0MgorCQkJICogQSA9IEEgbW9kIFggOyB0aGlzIGhhbHQgdGhlIGZpbHRlciBleGVjdXRpb24gaWYgWCBpcyAwCisJCQkgKiByZXQgMHg0MgorCQkJICovCisJCQlCUEZfU1RNVChCUEZfTEQgfCBCUEZfSU1NLCAweDQyKSwKKwkJCUJQRl9TVE1UKEJQRl9BTFUgfCBCUEZfTU9EIHwgQlBGX1gsIDApLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAweDQyKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJe30sCisJCXsgezB4MSwgMHgwIH0gfSwKKwl9LAorCXsKKwkJIk1PRCBkZWZhdWx0IEEiLAorCQkudS5pbnNucyA9IHsKKwkJCS8qCisJCQkgKiBBID0gQSBtb2QgMQorCQkJICogcmV0IEEKKwkJCSAqLworCQkJQlBGX1NUTVQoQlBGX0FMVSB8IEJQRl9NT0QgfCBCUEZfSywgMHgxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfQSwgMHgwKSwKKwkJfSwKKwkJQ0xBU1NJQyB8IEZMQUdfTk9fREFUQSwKKwkJe30sCisJCXsgezB4MSwgMHgwIH0gfSwKKwl9LAorCXsKKwkJIkpNUCBFUSBkZWZhdWx0IEEiLAorCQkudS5pbnNucyA9IHsKKwkJCS8qCisJCQkgKiBjbXAgQSwgMHgwLCAwLCAxCisJCQkgKiByZXQgMHg0MgorCQkJICogcmV0IDB4NjYKKwkJCSAqLworCQkJQlBGX0pVTVAoQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZfSywgMHgwLCAwLCAxKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMHg0MiksCisJCQlCUEZfU1RNVChCUEZfUkVUIHwgQlBGX0ssIDB4NjYpLAorCQl9LAorCQlDTEFTU0lDIHwgRkxBR19OT19EQVRBLAorCQl7fSwKKwkJeyB7MHgxLCAweDQyIH0gfSwKKwl9LAorCXsKKwkJIkpNUCBFUSBkZWZhdWx0IFgiLAorCQkudS5pbnNucyA9IHsKKwkJCS8qCisJCQkgKiBBID0gMHgwCisJCQkgKiBjbXAgQSwgWCwgMCwgMQorCQkJICogcmV0IDB4NDIKKwkJCSAqIHJldCAweDY2CisJCQkgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRCB8IEJQRl9JTU0sIDB4MCksCisJCQlCUEZfSlVNUChCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9YLCAweDAsIDAsIDEpLAorCQkJQlBGX1NUTVQoQlBGX1JFVCB8IEJQRl9LLCAweDQyKSwKKwkJCUJQRl9TVE1UKEJQRl9SRVQgfCBCUEZfSywgMHg2NiksCisJCX0sCisJCUNMQVNTSUMgfCBGTEFHX05PX0RBVEEsCisJCXt9LAorCQl7IHsweDEsIDB4NDIgfSB9LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgZGV2OworCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBvcHVsYXRlX3NrYihjaGFyICpidWYsIGludCBzaXplKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlpZiAoc2l6ZSA+PSBNQVhfREFUQSkKKwkJcmV0dXJuIE5VTEw7CisKKwlza2IgPSBhbGxvY19za2IoTUFYX0RBVEEsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCV9fc2tiX3B1dF9kYXRhKHNrYiwgYnVmLCBzaXplKTsKKworCS8qIEluaXRpYWxpemUgYSBmYWtlIHNrYiB3aXRoIHRlc3QgcGF0dGVybi4gKi8KKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJc2tiLT5wa3RfdHlwZSA9IFNLQl9UWVBFOworCXNrYi0+bWFyayA9IFNLQl9NQVJLOworCXNrYi0+aGFzaCA9IFNLQl9IQVNIOworCXNrYi0+cXVldWVfbWFwcGluZyA9IFNLQl9RVUVVRV9NQVA7CisJc2tiLT52bGFuX3RjaSA9IFNLQl9WTEFOX1RDSTsKKwlza2ItPnZsYW5fcHJvdG8gPSBodG9ucyhFVEhfUF9JUCk7CisJc2tiLT5kZXYgPSAmZGV2OworCXNrYi0+ZGV2LT5pZmluZGV4ID0gU0tCX0RFVl9JRklOREVYOworCXNrYi0+ZGV2LT50eXBlID0gU0tCX0RFVl9UWVBFOworCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCBtaW4oc2l6ZSwgRVRIX0hMRU4pKTsKKworCXJldHVybiBza2I7Cit9CisKK3N0YXRpYyB2b2lkICpnZW5lcmF0ZV90ZXN0X2RhdGEoc3RydWN0IGJwZl90ZXN0ICp0ZXN0LCBpbnQgc3ViKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAodGVzdC0+YXV4ICYgRkxBR19OT19EQVRBKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFRlc3QgY2FzZSBleHBlY3RzIGFuIHNrYiwgc28gcG9wdWxhdGUgb25lLiBWYXJpb3VzCisJICogc3VidGVzdHMgZ2VuZXJhdGUgc2ticyBvZiBkaWZmZXJlbnQgc2l6ZXMgYmFzZWQgb24KKwkgKiB0aGUgc2FtZSBkYXRhLgorCSAqLworCXNrYiA9IHBvcHVsYXRlX3NrYih0ZXN0LT5kYXRhLCB0ZXN0LT50ZXN0W3N1Yl0uZGF0YV9zaXplKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodGVzdC0+YXV4ICYgRkxBR19TS0JfRlJBRykgeworCQkvKgorCQkgKiB3aGVuIHRoZSB0ZXN0IHJlcXVpcmVzIGEgZnJhZ21lbnRlZCBza2IsIGFkZCBhCisJCSAqIHNpbmdsZSBmcmFnbWVudCB0byB0aGUgc2tiLCBmaWxsZWQgd2l0aAorCQkgKiB0ZXN0LT5mcmFnX2RhdGEuCisJCSAqLworCQl2b2lkICpwdHI7CisKKwkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwkJaWYgKCFwYWdlKQorCQkJZ290byBlcnJfa2ZyZWVfc2tiOworCisJCXB0ciA9IGttYXAocGFnZSk7CisJCWlmICghcHRyKQorCQkJZ290byBlcnJfZnJlZV9wYWdlOworCQltZW1jcHkocHRyLCB0ZXN0LT5mcmFnX2RhdGEsIE1BWF9EQVRBKTsKKwkJa3VubWFwKHBhZ2UpOworCQlza2JfYWRkX3J4X2ZyYWcoc2tiLCAwLCBwYWdlLCAwLCBNQVhfREFUQSwgTUFYX0RBVEEpOworCX0KKworCXJldHVybiBza2I7CisKK2Vycl9mcmVlX3BhZ2U6CisJX19mcmVlX3BhZ2UocGFnZSk7CitlcnJfa2ZyZWVfc2tiOgorCWtmcmVlX3NrYihza2IpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX3Rlc3RfZGF0YShjb25zdCBzdHJ1Y3QgYnBmX3Rlc3QgKnRlc3QsIHZvaWQgKmRhdGEpCit7CisJaWYgKHRlc3QtPmF1eCAmIEZMQUdfTk9fREFUQSkKKwkJcmV0dXJuOworCisJa2ZyZWVfc2tiKGRhdGEpOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9sZW5ndGgoaW50IHdoaWNoKQoreworCXN0cnVjdCBzb2NrX2ZpbHRlciAqZnA7CisJaW50IGxlbjsKKworCWlmICh0ZXN0c1t3aGljaF0uZmlsbF9oZWxwZXIpCisJCXJldHVybiB0ZXN0c1t3aGljaF0udS5wdHIubGVuOworCisJZnAgPSB0ZXN0c1t3aGljaF0udS5pbnNuczsKKwlmb3IgKGxlbiA9IE1BWF9JTlNOUyAtIDE7IGxlbiA+IDA7IC0tbGVuKQorCQlpZiAoZnBbbGVuXS5jb2RlICE9IDAgfHwgZnBbbGVuXS5rICE9IDApCisJCQlicmVhazsKKworCXJldHVybiBsZW4gKyAxOworfQorCitzdGF0aWMgdm9pZCAqZmlsdGVyX3BvaW50ZXIoaW50IHdoaWNoKQoreworCWlmICh0ZXN0c1t3aGljaF0uZmlsbF9oZWxwZXIpCisJCXJldHVybiB0ZXN0c1t3aGljaF0udS5wdHIuaW5zbnM7CisJZWxzZQorCQlyZXR1cm4gdGVzdHNbd2hpY2hdLnUuaW5zbnM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnBmX3Byb2cgKmdlbmVyYXRlX2ZpbHRlcihpbnQgd2hpY2gsIGludCAqZXJyKQoreworCV9fdTggdGVzdF90eXBlID0gdGVzdHNbd2hpY2hdLmF1eCAmIFRFU1RfVFlQRV9NQVNLOworCXVuc2lnbmVkIGludCBmbGVuID0gZmlsdGVyX2xlbmd0aCh3aGljaCk7CisJdm9pZCAqZnB0ciA9IGZpbHRlcl9wb2ludGVyKHdoaWNoKTsKKwlzdHJ1Y3Qgc29ja19mcHJvZ19rZXJuIGZwcm9nOworCXN0cnVjdCBicGZfcHJvZyAqZnA7CisKKwlzd2l0Y2ggKHRlc3RfdHlwZSkgeworCWNhc2UgQ0xBU1NJQzoKKwkJZnByb2cuZmlsdGVyID0gZnB0cjsKKwkJZnByb2cubGVuID0gZmxlbjsKKworCQkqZXJyID0gYnBmX3Byb2dfY3JlYXRlKCZmcCwgJmZwcm9nKTsKKwkJaWYgKHRlc3RzW3doaWNoXS5hdXggJiBGTEFHX0VYUEVDVEVEX0ZBSUwpIHsKKwkJCWlmICgqZXJyID09IHRlc3RzW3doaWNoXS5leHBlY3RlZF9lcnJjb2RlKSB7CisJCQkJcHJfY29udCgiUEFTU1xuIik7CisJCQkJLyogVmVyaWZpZXIgcmVqZWN0ZWQgZmlsdGVyIGFzIGV4cGVjdGVkLiAqLworCQkJCSplcnIgPSAwOworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQlwcl9jb250KCJVTkVYUEVDVEVEX1BBU1NcbiIpOworCQkJCS8qIFZlcmlmaWVyIGRpZG4ndCByZWplY3QgdGhlIHRlc3QgdGhhdCdzCisJCQkJICogYmFkIGVub3VnaCwganVzdCByZXR1cm4hCisJCQkJICovCisJCQkJKmVyciA9IC1FSU5WQUw7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJaWYgKCplcnIpIHsKKwkJCXByX2NvbnQoIkZBSUwgdG8gcHJvZ19jcmVhdGUgZXJyPSVkIGxlbj0lZFxuIiwKKwkJCQkqZXJyLCBmcHJvZy5sZW4pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIElOVEVSTkFMOgorCQlmcCA9IGJwZl9wcm9nX2FsbG9jKGJwZl9wcm9nX3NpemUoZmxlbiksIDApOworCQlpZiAoZnAgPT0gTlVMTCkgeworCQkJcHJfY29udCgiVU5FWFBFQ1RFRF9GQUlMIG5vIG1lbW9yeSBsZWZ0XG4iKTsKKwkJCSplcnIgPSAtRU5PTUVNOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQlmcC0+bGVuID0gZmxlbjsKKwkJLyogVHlwZSBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaGVyZSBhcyBsb25nIGFzIGl0J3Mgbm90IHVuc3BlYy4gKi8KKwkJZnAtPnR5cGUgPSBCUEZfUFJPR19UWVBFX1NPQ0tFVF9GSUxURVI7CisJCW1lbWNweShmcC0+aW5zbnNpLCBmcHRyLCBmcC0+bGVuICogc2l6ZW9mKHN0cnVjdCBicGZfaW5zbikpOworCQlmcC0+YXV4LT5zdGFja19kZXB0aCA9IHRlc3RzW3doaWNoXS5zdGFja19kZXB0aDsKKworCQkvKiBXZSBjYW5ub3QgZXJyb3IgaGVyZSBhcyB3ZSBkb24ndCBuZWVkIHR5cGUgY29tcGF0aWJpbGl0eQorCQkgKiBjaGVja3MuCisJCSAqLworCQlmcCA9IGJwZl9wcm9nX3NlbGVjdF9ydW50aW1lKGZwLCBlcnIpOworCQlpZiAoKmVycikgeworCQkJcHJfY29udCgiRkFJTCB0byBzZWxlY3RfcnVudGltZSBlcnI9JWRcbiIsICplcnIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJYnJlYWs7CisJfQorCisJKmVyciA9IDA7CisJcmV0dXJuIGZwOworfQorCitzdGF0aWMgdm9pZCByZWxlYXNlX2ZpbHRlcihzdHJ1Y3QgYnBmX3Byb2cgKmZwLCBpbnQgd2hpY2gpCit7CisJX191OCB0ZXN0X3R5cGUgPSB0ZXN0c1t3aGljaF0uYXV4ICYgVEVTVF9UWVBFX01BU0s7CisKKwlzd2l0Y2ggKHRlc3RfdHlwZSkgeworCWNhc2UgQ0xBU1NJQzoKKwkJYnBmX3Byb2dfZGVzdHJveShmcCk7CisJCWJyZWFrOworCWNhc2UgSU5URVJOQUw6CisJCWJwZl9wcm9nX2ZyZWUoZnApOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19ydW5fb25lKGNvbnN0IHN0cnVjdCBicGZfcHJvZyAqZnAsIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgaW50IHJ1bnMsIHU2NCAqZHVyYXRpb24pCit7CisJdTY0IHN0YXJ0LCBmaW5pc2g7CisJaW50IHJldCA9IDAsIGk7CisKKwlzdGFydCA9IGt0aW1lX2dldF9ucygpOworCisJZm9yIChpID0gMDsgaSA8IHJ1bnM7IGkrKykKKwkJcmV0ID0gQlBGX1BST0dfUlVOKGZwLCBkYXRhKTsKKworCWZpbmlzaCA9IGt0aW1lX2dldF9ucygpOworCisJKmR1cmF0aW9uID0gZmluaXNoIC0gc3RhcnQ7CisJZG9fZGl2KCpkdXJhdGlvbiwgcnVucyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJ1bl9vbmUoY29uc3Qgc3RydWN0IGJwZl9wcm9nICpmcCwgc3RydWN0IGJwZl90ZXN0ICp0ZXN0KQoreworCWludCBlcnJfY250ID0gMCwgaSwgcnVucyA9IE1BWF9URVNUUlVOUzsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfU1VCVEVTVFM7IGkrKykgeworCQl2b2lkICpkYXRhOworCQl1NjQgZHVyYXRpb247CisJCXUzMiByZXQ7CisKKwkJaWYgKHRlc3QtPnRlc3RbaV0uZGF0YV9zaXplID09IDAgJiYKKwkJICAgIHRlc3QtPnRlc3RbaV0ucmVzdWx0ID09IDApCisJCQlicmVhazsKKworCQlkYXRhID0gZ2VuZXJhdGVfdGVzdF9kYXRhKHRlc3QsIGkpOworCQlpZiAoIWRhdGEgJiYgISh0ZXN0LT5hdXggJiBGTEFHX05PX0RBVEEpKSB7CisJCQlwcl9jb250KCJkYXRhIGdlbmVyYXRpb24gZmFpbGVkICIpOworCQkJZXJyX2NudCsrOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gX19ydW5fb25lKGZwLCBkYXRhLCBydW5zLCAmZHVyYXRpb24pOworCQlyZWxlYXNlX3Rlc3RfZGF0YSh0ZXN0LCBkYXRhKTsKKworCQlpZiAocmV0ID09IHRlc3QtPnRlc3RbaV0ucmVzdWx0KSB7CisJCQlwcl9jb250KCIlbGxkICIsIGR1cmF0aW9uKTsKKwkJfSBlbHNlIHsKKwkJCXByX2NvbnQoInJldCAlZCAhPSAlZCAiLCByZXQsCisJCQkJdGVzdC0+dGVzdFtpXS5yZXN1bHQpOworCQkJZXJyX2NudCsrOworCQl9CisJfQorCisJcmV0dXJuIGVycl9jbnQ7Cit9CisKK3N0YXRpYyBjaGFyIHRlc3RfbmFtZVs2NF07Cittb2R1bGVfcGFyYW1fc3RyaW5nKHRlc3RfbmFtZSwgdGVzdF9uYW1lLCBzaXplb2YodGVzdF9uYW1lKSwgMCk7CisKK3N0YXRpYyBpbnQgdGVzdF9pZCA9IC0xOworbW9kdWxlX3BhcmFtKHRlc3RfaWQsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgdGVzdF9yYW5nZVsyXSA9IHsgMCwgQVJSQVlfU0laRSh0ZXN0cykgLSAxIH07Cittb2R1bGVfcGFyYW1fYXJyYXkodGVzdF9yYW5nZSwgaW50LCBOVUxMLCAwKTsKKworc3RhdGljIF9faW5pdCBpbnQgZmluZF90ZXN0X2luZGV4KGNvbnN0IGNoYXIgKnRlc3RfbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRlc3RzKTsgaSsrKSB7CisJCWlmICghc3RyY21wKHRlc3RzW2ldLmRlc2NyLCB0ZXN0X25hbWUpKQorCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworc3RhdGljIF9faW5pdCBpbnQgcHJlcGFyZV9icGZfdGVzdHModm9pZCkKK3sKKwlpbnQgaTsKKworCWlmICh0ZXN0X2lkID49IDApIHsKKwkJLyoKKwkJICogaWYgYSB0ZXN0X2lkIHdhcyBzcGVjaWZpZWQsIHVzZSB0ZXN0X3JhbmdlIHRvCisJCSAqIGNvdmVyIG9ubHkgdGhhdCB0ZXN0LgorCQkgKi8KKwkJaWYgKHRlc3RfaWQgPj0gQVJSQVlfU0laRSh0ZXN0cykpIHsKKwkJCXByX2VycigidGVzdF9icGY6IGludmFsaWQgdGVzdF9pZCBzcGVjaWZpZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdGVzdF9yYW5nZVswXSA9IHRlc3RfaWQ7CisJCXRlc3RfcmFuZ2VbMV0gPSB0ZXN0X2lkOworCX0gZWxzZSBpZiAoKnRlc3RfbmFtZSkgeworCQkvKgorCQkgKiBpZiBhIHRlc3RfbmFtZSB3YXMgc3BlY2lmaWVkLCBmaW5kIGl0IGFuZCBzZXR1cAorCQkgKiB0ZXN0X3JhbmdlIHRvIGNvdmVyIG9ubHkgdGhhdCB0ZXN0LgorCQkgKi8KKwkJaW50IGlkeCA9IGZpbmRfdGVzdF9pbmRleCh0ZXN0X25hbWUpOworCisJCWlmIChpZHggPCAwKSB7CisJCQlwcl9lcnIoInRlc3RfYnBmOiBubyB0ZXN0IG5hbWVkICclcycgZm91bmQuXG4iLAorCQkJICAgICAgIHRlc3RfbmFtZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQl0ZXN0X3JhbmdlWzBdID0gaWR4OworCQl0ZXN0X3JhbmdlWzFdID0gaWR4OworCX0gZWxzZSB7CisJCS8qCisJCSAqIGNoZWNrIHRoYXQgdGhlIHN1cHBsaWVkIHRlc3RfcmFuZ2UgaXMgdmFsaWQuCisJCSAqLworCQlpZiAodGVzdF9yYW5nZVswXSA+PSBBUlJBWV9TSVpFKHRlc3RzKSB8fAorCQkgICAgdGVzdF9yYW5nZVsxXSA+PSBBUlJBWV9TSVpFKHRlc3RzKSB8fAorCQkgICAgdGVzdF9yYW5nZVswXSA8IDAgfHwgdGVzdF9yYW5nZVsxXSA8IDApIHsKKwkJCXByX2VycigidGVzdF9icGY6IHRlc3RfcmFuZ2UgaXMgb3V0IG9mIGJvdW5kLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICh0ZXN0X3JhbmdlWzFdIDwgdGVzdF9yYW5nZVswXSkgeworCQkJcHJfZXJyKCJ0ZXN0X2JwZjogdGVzdF9yYW5nZSBpcyBlbmRpbmcgYmVmb3JlIGl0IHN0YXJ0cy5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZXN0cyk7IGkrKykgeworCQlpZiAodGVzdHNbaV0uZmlsbF9oZWxwZXIgJiYKKwkJICAgIHRlc3RzW2ldLmZpbGxfaGVscGVyKCZ0ZXN0c1tpXSkgPCAwKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2luaXQgdm9pZCBkZXN0cm95X2JwZl90ZXN0cyh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVzdHMpOyBpKyspIHsKKwkJaWYgKHRlc3RzW2ldLmZpbGxfaGVscGVyKQorCQkJa2ZyZWUodGVzdHNbaV0udS5wdHIuaW5zbnMpOworCX0KK30KKworc3RhdGljIGJvb2wgZXhjbHVkZV90ZXN0KGludCB0ZXN0X2lkKQoreworCXJldHVybiB0ZXN0X2lkIDwgdGVzdF9yYW5nZVswXSB8fCB0ZXN0X2lkID4gdGVzdF9yYW5nZVsxXTsKK30KKworc3RhdGljIF9faW5pdCBpbnQgdGVzdF9icGYodm9pZCkKK3sKKwlpbnQgaSwgZXJyX2NudCA9IDAsIHBhc3NfY250ID0gMDsKKwlpbnQgaml0X2NudCA9IDAsIHJ1bl9jbnQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGVzdHMpOyBpKyspIHsKKwkJc3RydWN0IGJwZl9wcm9nICpmcDsKKwkJaW50IGVycjsKKworCQlpZiAoZXhjbHVkZV90ZXN0KGkpKQorCQkJY29udGludWU7CisKKwkJcHJfaW5mbygiIyVkICVzICIsIGksIHRlc3RzW2ldLmRlc2NyKTsKKworCQlmcCA9IGdlbmVyYXRlX2ZpbHRlcihpLCAmZXJyKTsKKwkJaWYgKGZwID09IE5VTEwpIHsKKwkJCWlmIChlcnIgPT0gMCkgeworCQkJCXBhc3NfY250Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQllcnJfY250Kys7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByX2NvbnQoImppdGVkOiV1ICIsIGZwLT5qaXRlZCk7CisKKwkJcnVuX2NudCsrOworCQlpZiAoZnAtPmppdGVkKQorCQkJaml0X2NudCsrOworCisJCWVyciA9IHJ1bl9vbmUoZnAsICZ0ZXN0c1tpXSk7CisJCXJlbGVhc2VfZmlsdGVyKGZwLCBpKTsKKworCQlpZiAoZXJyKSB7CisJCQlwcl9jb250KCJGQUlMICglZCB0aW1lcylcbiIsIGVycik7CisJCQllcnJfY250Kys7CisJCX0gZWxzZSB7CisJCQlwcl9jb250KCJQQVNTXG4iKTsKKwkJCXBhc3NfY250Kys7CisJCX0KKwl9CisKKwlwcl9pbmZvKCJTdW1tYXJ5OiAlZCBQQVNTRUQsICVkIEZBSUxFRCwgWyVkLyVkIEpJVCdlZF1cbiIsCisJCXBhc3NfY250LCBlcnJfY250LCBqaXRfY250LCBydW5fY250KTsKKworCXJldHVybiBlcnJfY250ID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3RfYnBmX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gcHJlcGFyZV9icGZfdGVzdHMoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHRlc3RfYnBmKCk7CisKKwlkZXN0cm95X2JwZl90ZXN0cygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X2JwZl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHRlc3RfYnBmX2luaXQpOworbW9kdWxlX2V4aXQodGVzdF9icGZfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfZGVidWdfdmlydHVhbC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9kZWJ1Z192aXJ0dWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3YjQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfZGVidWdfdmlydHVhbC5jCkBAIC0wLDAgKzEsNTAgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2l6ZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpZmRlZiBDT05GSUdfTUlQUworI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgorI2VuZGlmCisKK3N0cnVjdCBmb28geworCXVuc2lnbmVkIGludCBiYXI7Cit9OworCitzdHJ1Y3QgZm9vICpmb287CisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3RfZGVidWdfdmlydHVhbF9pbml0KHZvaWQpCit7CisJcGh5c19hZGRyX3QgcGE7CisJdm9pZCAqdmE7CisKKwl2YSA9ICh2b2lkICopVk1BTExPQ19TVEFSVDsKKwlwYSA9IHZpcnRfdG9fcGh5cyh2YSk7CisKKwlwcl9pbmZvKCJQQTogJXBhIGZvciBWQTogMHglbHhcbiIsICZwYSwgKHVuc2lnbmVkIGxvbmcpdmEpOworCisJZm9vID0ga3phbGxvYyhzaXplb2YoKmZvbyksIEdGUF9LRVJORUwpOworCWlmICghZm9vKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBhID0gdmlydF90b19waHlzKGZvbyk7CisJdmEgPSBmb287CisJcHJfaW5mbygiUEE6ICVwYSBmb3IgVkE6IDB4JWx4XG4iLCAmcGEsICh1bnNpZ25lZCBsb25nKXZhKTsKKworCXJldHVybiAwOworfQorbW9kdWxlX2luaXQodGVzdF9kZWJ1Z192aXJ0dWFsX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVzdF9kZWJ1Z192aXJ0dWFsX2V4aXQodm9pZCkKK3sKKwlrZnJlZShmb28pOworfQorbW9kdWxlX2V4aXQodGVzdF9kZWJ1Z192aXJ0dWFsX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRlc3QgbW9kdWxlIGZvciBDT05GSUdfREVCVUdfVklSVFVBTCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9maXJtd2FyZS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9maXJtd2FyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNWUxOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2Zpcm13YXJlLmMKQEAgLTAsMCArMSw5MzMgQEAKKy8qCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdHJpZ2dlciBhbmQgdGVzdCBmaXJtd2FyZSBsb2FkaW5nLgorICoKKyAqIEl0IGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZm9yIGJhc2ljIGV2YWx1YXRpb24gb2YgdGhlIGZpcm13YXJlIGxvYWRpbmcKKyAqIHN1YnN5c3RlbSAoZm9yIGV4YW1wbGUgd2hlbiB2YWxpZGF0aW5nIGZpcm13YXJlIHZlcmlmaWNhdGlvbikuIEl0IGxhY2tzCisgKiBhbnkgZXh0cmEgZGVwZW5kZW5jaWVzLCBhbmQgd2lsbCBub3Qgbm9ybWFsbHkgYmUgbG9hZGVkIGJ5IHRoZSBzeXN0ZW0KKyAqIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSBuYW1lLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorCisjZGVmaW5lIFRFU1RfRklSTVdBUkVfTkFNRQkidGVzdC1maXJtd2FyZS5iaW4iCisjZGVmaW5lIFRFU1RfRklSTVdBUkVfTlVNX1JFUVMJNAorCitzdGF0aWMgREVGSU5FX01VVEVYKHRlc3RfZndfbXV0ZXgpOworc3RhdGljIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdGVzdF9maXJtd2FyZTsKKworc3RydWN0IHRlc3RfYmF0Y2hlZF9yZXEgeworCXU4IGlkeDsKKwlpbnQgcmM7CisJYm9vbCBzZW50OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBjb21wbGV0aW9uOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7Cit9OworCisvKioKKyAqIHRlc3RfY29uZmlnIC0gcmVwcmVzZW50cyBjb25maWd1cmF0aW9uIGZvciB0aGUgdGVzdCBmb3IgZGlmZmVyZW50IHRyaWdnZXJzCisgKgorICogQG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBmaXJtd2FyZSBmaWxlIHRvIGxvb2sgZm9yCisgKiBAc3luY19kaXJlY3Q6IHdoZW4gdGhlIHN5bmMgdHJpZ2dlciBpcyB1c2VkIGlmIHRoaXMgaXMgdHJ1ZQorICoJcmVxdWVzdF9maXJtd2FyZV9kaXJlY3QoKSB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KKyAqIEBzZW5kX3VldmVudDogd2hldGhlciBvciBub3QgdG8gc2VuZCBhIHVldmVudCBmb3IgYXN5bmMgcmVxdWVzdHMKKyAqIEBudW1fcmVxdWVzdHM6IG51bWJlciBvZiByZXF1ZXN0cyB0byB0cnkgcGVyIHRlc3QgY2FzZS4gVGhpcyBpcyB0cmlnZ2VyCisgKglzcGVjaWZpYy4KKyAqIEByZXFzOiBzdG9yZXMgYWxsIHJlcXVlc3RzIGluZm9ybWF0aW9uCisgKiBAcmVhZF9md19pZHg6IGluZGV4IG9mIHRocmVhZCBmcm9tIHdoaWNoIHdlIHdhbnQgdG8gcmVhZCBmaXJtd2FyZSByZXN1bHRzCisgKglmcm9tIHRocm91Z2ggdGhlIHJlYWRfZncgdHJpZ2dlci4KKyAqIEB0ZXN0X3Jlc3VsdDogYSB0ZXN0IG1heSB1c2UgdGhpcyB0byBjb2xsZWN0IHRoZSByZXN1bHQgZnJvbSB0aGUgY2FsbAorICoJb2YgdGhlIHJlcXVlc3RfZmlybXdhcmUqKCkgY2FsbHMgdXNlZCBpbiB0aGVpciB0ZXN0cy4gSW4gb3JkZXIgb2YKKyAqCXByaW9yaXR5IHdlIGFsd2F5cyBrZWVwIGZpcnN0IGFueSBzZXR1cCBlcnJvci4gSWYgbm8gc2V0dXAgZXJyb3JzIHdlcmUKKyAqCWZvdW5kIHRoZW4gd2UgbW92ZSBvbiB0byB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQgd2hpbGUgcnVubmluZyB0aGUKKyAqCUFQSS4gTm90ZSB0aGF0IGZvciBhc3luYyBjYWxscyB0aGlzIHR5cGljYWxseSB3aWxsIGJlIGEgc3VjY2Vzc2Z1bAorICoJcmVzdWx0ICgwKSB1bmxlc3Mgb2YgY291cnNlIHlvdSd2ZSB1c2VkIGJvZ3VzIHBhcmFtZXRlcnMsIG9yIHRoZSBzeXN0ZW0KKyAqCWlzIG91dCBvZiBtZW1vcnkuICBJbiB0aGUgYXN5bmMgY2FzZSB0aGUgY2FsbGJhY2sgaXMgZXhwZWN0ZWQgdG8gZG8gYQorICoJYml0IG1vcmUgaG9tZXdvcmsgdG8gZmlndXJlIG91dCB3aGF0IGhhcHBlbmVkLCB1bmZvcnR1bmF0ZWx5IHRoZSBvbmx5CisgKglpbmZvcm1hdGlvbiBwYXNzZWQgdG9kYXkgb24gZXJyb3IgaXMgdGhlIGZhY3QgdGhhdCBubyBmaXJtd2FyZSB3YXMKKyAqCWZvdW5kIHNvIHdlIGNhbiBvbmx5IGFzc3VtZSAtRU5PRU5UIG9uIGFzeW5jIGNhbGxzIGlmIHRoZSBmaXJtd2FyZSBpcworICoJTlVMTC4KKyAqCisgKglFcnJvcnMgeW91IGNhbiBleHBlY3Q6CisgKgorICoJQVBJIHNwZWNpZmljOgorICoKKyAqCTA6CQlzdWNjZXNzIGZvciBzeW5jLCBmb3IgYXN5bmMgaXQgbWVhbnMgcmVxdWVzdCB3YXMgc2VudAorICoJLUVJTlZBTDoJaW52YWxpZCBwYXJhbWV0ZXJzIG9yIHJlcXVlc3QKKyAqCS1FTk9FTlQ6CWZpbGVzIG5vdCBmb3VuZAorICoKKyAqCVN5c3RlbSBlbnZpcm9ubWVudDoKKyAqCisgKgktRU5PTUVNOgltZW1vcnkgcHJlc3N1cmUgb24gc3lzdGVtCisgKgktRU5PREVWOglvdXQgb2YgbnVtYmVyIG9mIGRldmljZXMgdG8gdGVzdAorICoJLUVJTlZBTDoJYW4gdW5leHBlY3RlZCBlcnJvciBoYXMgb2NjdXJyZWQKKyAqIEByZXFfZmlybXdhcmU6IGlmIEBzeW5jX2RpcmVjdCBpcyB0cnVlIHRoaXMgaXMgc2V0IHRvCisgKglyZXF1ZXN0X2Zpcm13YXJlX2RpcmVjdCgpLCBvdGhlcndpc2UgcmVxdWVzdF9maXJtd2FyZSgpCisgKi8KK3N0cnVjdCB0ZXN0X2NvbmZpZyB7CisJY2hhciAqbmFtZTsKKwlib29sIHN5bmNfZGlyZWN0OworCWJvb2wgc2VuZF91ZXZlbnQ7CisJdTggbnVtX3JlcXVlc3RzOworCXU4IHJlYWRfZndfaWR4OworCisJLyoKKwkgKiBUaGVzZSBiZWxvdyBkb24ndCBiZWxvbmcgaGVyIGJ1dCB3ZSdsbCBtb3ZlIHRoZW0gb25jZSB3ZSBjcmVhdGUKKwkgKiBhIHN0cnVjdCBmd190ZXN0X2RldmljZSBhbmQgc3R1ZmYgdGhlIG1pc2NfZGV2IHVuZGVyIHRoZXJlIGxhdGVyLgorCSAqLworCXN0cnVjdCB0ZXN0X2JhdGNoZWRfcmVxICpyZXFzOworCWludCB0ZXN0X3Jlc3VsdDsKKwlpbnQgKCpyZXFfZmlybXdhcmUpKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKmZ3LCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgIHN0cnVjdCBkZXZpY2UgKmRldmljZSk7Cit9OworCitzdHJ1Y3QgdGVzdF9jb25maWcgKnRlc3RfZndfY29uZmlnOworCitzdGF0aWMgc3NpemVfdCB0ZXN0X2Z3X21pc2NfcmVhZChzdHJ1Y3QgZmlsZSAqZiwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2Zmc2V0KQoreworCXNzaXplX3QgcmMgPSAwOworCisJbXV0ZXhfbG9jaygmdGVzdF9md19tdXRleCk7CisJaWYgKHRlc3RfZmlybXdhcmUpCisJCXJjID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBzaXplLCBvZmZzZXQsCisJCQkJCSAgICAgdGVzdF9maXJtd2FyZS0+ZGF0YSwKKwkJCQkJICAgICB0ZXN0X2Zpcm13YXJlLT5zaXplKTsKKwltdXRleF91bmxvY2soJnRlc3RfZndfbXV0ZXgpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGVzdF9md19mb3BzID0geworCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5yZWFkICAgICAgICAgICA9IHRlc3RfZndfbWlzY19yZWFkLAorfTsKKworc3RhdGljIHZvaWQgX190ZXN0X3JlbGVhc2VfYWxsX2Zpcm13YXJlKHZvaWQpCit7CisJc3RydWN0IHRlc3RfYmF0Y2hlZF9yZXEgKnJlcTsKKwl1OCBpOworCisJaWYgKCF0ZXN0X2Z3X2NvbmZpZy0+cmVxcykKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHRlc3RfZndfY29uZmlnLT5udW1fcmVxdWVzdHM7IGkrKykgeworCQlyZXEgPSAmdGVzdF9md19jb25maWctPnJlcXNbaV07CisJCWlmIChyZXEtPmZ3KQorCQkJcmVsZWFzZV9maXJtd2FyZShyZXEtPmZ3KTsKKwl9CisKKwl2ZnJlZSh0ZXN0X2Z3X2NvbmZpZy0+cmVxcyk7CisJdGVzdF9md19jb25maWctPnJlcXMgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3JlbGVhc2VfYWxsX2Zpcm13YXJlKHZvaWQpCit7CisJbXV0ZXhfbG9jaygmdGVzdF9md19tdXRleCk7CisJX190ZXN0X3JlbGVhc2VfYWxsX2Zpcm13YXJlKCk7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKK30KKworCitzdGF0aWMgdm9pZCBfX3Rlc3RfZmlybXdhcmVfY29uZmlnX2ZyZWUodm9pZCkKK3sKKwlfX3Rlc3RfcmVsZWFzZV9hbGxfZmlybXdhcmUoKTsKKwlrZnJlZV9jb25zdCh0ZXN0X2Z3X2NvbmZpZy0+bmFtZSk7CisJdGVzdF9md19jb25maWctPm5hbWUgPSBOVUxMOworfQorCisvKgorICogWFhYOiBtb3ZlIHRvIGtzdHJuY3B5KCkgb25jZSBtZXJnZWQuCisgKgorICogVXNlcnMgc2hvdWxkIHVzZSBrZnJlZV9jb25zdCgpIHdoZW4gZnJlZWluZyB0aGVzZS4KKyAqLworc3RhdGljIGludCBfX2tzdHJuY3B5KGNoYXIgKipkc3QsIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBjb3VudCwgZ2ZwX3QgZ2ZwKQoreworCSpkc3QgPSBrc3RybmR1cChuYW1lLCBjb3VudCwgZ2ZwKTsKKwlpZiAoISpkc3QpCisJCXJldHVybiAtRU5PU1BDOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBfX3Rlc3RfZmlybXdhcmVfY29uZmlnX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gX19rc3RybmNweSgmdGVzdF9md19jb25maWctPm5hbWUsIFRFU1RfRklSTVdBUkVfTkFNRSwKKwkJCSBzdHJsZW4oVEVTVF9GSVJNV0FSRV9OQU1FKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJdGVzdF9md19jb25maWctPm51bV9yZXF1ZXN0cyA9IFRFU1RfRklSTVdBUkVfTlVNX1JFUVM7CisJdGVzdF9md19jb25maWctPnNlbmRfdWV2ZW50ID0gdHJ1ZTsKKwl0ZXN0X2Z3X2NvbmZpZy0+c3luY19kaXJlY3QgPSBmYWxzZTsKKwl0ZXN0X2Z3X2NvbmZpZy0+cmVxX2Zpcm13YXJlID0gcmVxdWVzdF9maXJtd2FyZTsKKwl0ZXN0X2Z3X2NvbmZpZy0+dGVzdF9yZXN1bHQgPSAwOworCXRlc3RfZndfY29uZmlnLT5yZXFzID0gTlVMTDsKKworCXJldHVybiAwOworCitvdXQ6CisJX190ZXN0X2Zpcm13YXJlX2NvbmZpZ19mcmVlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgcmVzZXRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdGVzdF9md19tdXRleCk7CisKKwlfX3Rlc3RfZmlybXdhcmVfY29uZmlnX2ZyZWUoKTsKKworCXJldCA9IF9fdGVzdF9maXJtd2FyZV9jb25maWdfaW5pdCgpOworCWlmIChyZXQgPCAwKSB7CisJCXJldCA9IC1FTk9NRU07CisJCXByX2VycigiY291bGQgbm90IGFsbG9jIHNldHRpbmdzIGZvciBjb25maWcgdHJpZ2dlcjogJWRcbiIsCisJCSAgICAgICByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9pbmZvKCJyZXNldFxuIik7CisJcmV0ID0gY291bnQ7CisKK291dDoKKwltdXRleF91bmxvY2soJnRlc3RfZndfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhyZXNldCk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY2hhciAqYnVmKQoreworCWludCBsZW4gPSAwOworCisJbXV0ZXhfbG9jaygmdGVzdF9md19tdXRleCk7CisKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJIkN1c3RvbSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24gZm9yOiAlc1xuIiwKKwkJCWRldl9uYW1lKGRldikpOworCisJaWYgKHRlc3RfZndfY29uZmlnLT5uYW1lKQorCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwKKwkJCQkibmFtZTpcdCVzXG4iLAorCQkJCXRlc3RfZndfY29uZmlnLT5uYW1lKTsKKwllbHNlCisJCWxlbiArPSBzY25wcmludGYoYnVmK2xlbiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJCSJuYW1lOlx0RU1UUFlcbiIpOworCisJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkibnVtX3JlcXVlc3RzOlx0JXVcbiIsIHRlc3RfZndfY29uZmlnLT5udW1fcmVxdWVzdHMpOworCisJbGVuICs9IHNjbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkic2VuZF91ZXZlbnQ6XHRcdCVzXG4iLAorCQkJdGVzdF9md19jb25maWctPnNlbmRfdWV2ZW50ID8KKwkJCSJGV19BQ1RJT05fSE9UUExVRyIgOgorCQkJIkZXX0FDVElPTl9OT0hPVFBMVUciKTsKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwKKwkJCSJzeW5jX2RpcmVjdDpcdFx0JXNcbiIsCisJCQl0ZXN0X2Z3X2NvbmZpZy0+c3luY19kaXJlY3QgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKKwlsZW4gKz0gc2NucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwKKwkJCSJyZWFkX2Z3X2lkeDpcdCV1XG4iLCB0ZXN0X2Z3X2NvbmZpZy0+cmVhZF9md19pZHgpOworCisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oY29uZmlnKTsKKworc3RhdGljIHNzaXplX3QgY29uZmlnX25hbWVfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnRlc3RfZndfbXV0ZXgpOworCWtmcmVlX2NvbnN0KHRlc3RfZndfY29uZmlnLT5uYW1lKTsKKwlyZXQgPSBfX2tzdHJuY3B5KCZ0ZXN0X2Z3X2NvbmZpZy0+bmFtZSwgYnVmLCBjb3VudCwgR0ZQX0tFUk5FTCk7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBBcyBwZXIgc3lzZnNfa2Zfc2VxX3Nob3coKSB0aGUgYnVmIGlzIG1heCBQQUdFX1NJWkUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ190ZXN0X3Nob3dfc3RyKGNoYXIgKmRzdCwKKwkJCQkgICAgY2hhciAqc3JjKQoreworCWludCBsZW47CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwlsZW4gPSBzbnByaW50Zihkc3QsIFBBR0VfU0laRSwgIiVzXG4iLCBzcmMpOworCW11dGV4X3VubG9jaygmdGVzdF9md19tdXRleCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IHRlc3RfZGV2X2NvbmZpZ191cGRhdGVfYm9vbChjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplLAorCQkJCSAgICAgICBib29sICpjZmcpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnRlc3RfZndfbXV0ZXgpOworCWlmIChzdHJ0b2Jvb2woYnVmLCBjZmcpIDwgMCkKKwkJcmV0ID0gLUVJTlZBTDsKKwllbHNlCisJCXJldCA9IHNpemU7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90Cit0ZXN0X2Rldl9jb25maWdfc2hvd19ib29sKGNoYXIgKmJ1ZiwKKwkJCSAgYm9vbCBjb25maWcpCit7CisJYm9vbCB2YWw7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwl2YWwgPSBjb25maWc7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCB0ZXN0X2Rldl9jb25maWdfc2hvd19pbnQoY2hhciAqYnVmLCBpbnQgY2ZnKQoreworCWludCB2YWw7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwl2YWwgPSBjZmc7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgaW50IHRlc3RfZGV2X2NvbmZpZ191cGRhdGVfdTgoY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgdTggKmNmZykKK3sKKwlpbnQgcmV0OworCWxvbmcgbmV3OworCisJcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmbmV3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ldyA+IFU4X01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwkqKHU4ICopY2ZnID0gbmV3OworCW11dGV4X3VubG9jaygmdGVzdF9md19tdXRleCk7CisKKwkvKiBBbHdheXMgcmV0dXJuIGZ1bGwgd3JpdGUgc2l6ZSBldmVuIGlmIHdlIGRpZG4ndCBjb25zdW1lIGFsbCAqLworCXJldHVybiBzaXplOworfQorCitzdGF0aWMgc3NpemVfdCB0ZXN0X2Rldl9jb25maWdfc2hvd191OChjaGFyICpidWYsIHU4IGNmZykKK3sKKwl1OCB2YWw7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwl2YWwgPSBjZmc7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCBjb25maWdfbmFtZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIGNvbmZpZ190ZXN0X3Nob3dfc3RyKGJ1ZiwgdGVzdF9md19jb25maWctPm5hbWUpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbmZpZ19uYW1lLCAwNjQ0LCBjb25maWdfbmFtZV9zaG93LCBjb25maWdfbmFtZV9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ19udW1fcmVxdWVzdHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwlpZiAodGVzdF9md19jb25maWctPnJlcXMpIHsKKwkJcHJfZXJyKCJNdXN0IGNhbGwgcmVsZWFzZV9hbGxfZmlybXdhcmUgcHJpb3IgdG8gY2hhbmdpbmcgY29uZmlnXG4iKTsKKwkJcmMgPSAtRUlOVkFMOworCQltdXRleF91bmxvY2soJnRlc3RfZndfbXV0ZXgpOworCQlnb3RvIG91dDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJjID0gdGVzdF9kZXZfY29uZmlnX3VwZGF0ZV91OChidWYsIGNvdW50LAorCQkJCSAgICAgICAmdGVzdF9md19jb25maWctPm51bV9yZXF1ZXN0cyk7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ19udW1fcmVxdWVzdHNfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHRlc3RfZGV2X2NvbmZpZ19zaG93X3U4KGJ1ZiwgdGVzdF9md19jb25maWctPm51bV9yZXF1ZXN0cyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY29uZmlnX251bV9yZXF1ZXN0cywgMDY0NCwgY29uZmlnX251bV9yZXF1ZXN0c19zaG93LAorCQkgICBjb25maWdfbnVtX3JlcXVlc3RzX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgY29uZmlnX3N5bmNfZGlyZWN0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByYyA9IHRlc3RfZGV2X2NvbmZpZ191cGRhdGVfYm9vbChidWYsIGNvdW50LAorCQkJCQkgICAgICZ0ZXN0X2Z3X2NvbmZpZy0+c3luY19kaXJlY3QpOworCisJaWYgKHJjID09IGNvdW50KQorCQl0ZXN0X2Z3X2NvbmZpZy0+cmVxX2Zpcm13YXJlID0gdGVzdF9md19jb25maWctPnN5bmNfZGlyZWN0ID8KKwkJCQkgICAgICAgcmVxdWVzdF9maXJtd2FyZV9kaXJlY3QgOgorCQkJCSAgICAgICByZXF1ZXN0X2Zpcm13YXJlOworCXJldHVybiByYzsKK30KKworc3RhdGljIHNzaXplX3QgY29uZmlnX3N5bmNfZGlyZWN0X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiB0ZXN0X2Rldl9jb25maWdfc2hvd19ib29sKGJ1ZiwgdGVzdF9md19jb25maWctPnN5bmNfZGlyZWN0KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjb25maWdfc3luY19kaXJlY3QsIDA2NDQsIGNvbmZpZ19zeW5jX2RpcmVjdF9zaG93LAorCQkgICBjb25maWdfc3luY19kaXJlY3Rfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBjb25maWdfc2VuZF91ZXZlbnRfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHRlc3RfZGV2X2NvbmZpZ191cGRhdGVfYm9vbChidWYsIGNvdW50LAorCQkJCQkgICAmdGVzdF9md19jb25maWctPnNlbmRfdWV2ZW50KTsKK30KKworc3RhdGljIHNzaXplX3QgY29uZmlnX3NlbmRfdWV2ZW50X3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXJldHVybiB0ZXN0X2Rldl9jb25maWdfc2hvd19ib29sKGJ1ZiwgdGVzdF9md19jb25maWctPnNlbmRfdWV2ZW50KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjb25maWdfc2VuZF91ZXZlbnQsIDA2NDQsIGNvbmZpZ19zZW5kX3VldmVudF9zaG93LAorCQkgICBjb25maWdfc2VuZF91ZXZlbnRfc3RvcmUpOworCitzdGF0aWMgc3NpemVfdCBjb25maWdfcmVhZF9md19pZHhfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHRlc3RfZGV2X2NvbmZpZ191cGRhdGVfdTgoYnVmLCBjb3VudCwKKwkJCQkJICZ0ZXN0X2Z3X2NvbmZpZy0+cmVhZF9md19pZHgpOworfQorCitzdGF0aWMgc3NpemVfdCBjb25maWdfcmVhZF9md19pZHhfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgICBjaGFyICpidWYpCit7CisJcmV0dXJuIHRlc3RfZGV2X2NvbmZpZ19zaG93X3U4KGJ1ZiwgdGVzdF9md19jb25maWctPnJlYWRfZndfaWR4KTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihjb25maWdfcmVhZF9md19pZHgsIDA2NDQsIGNvbmZpZ19yZWFkX2Z3X2lkeF9zaG93LAorCQkgICBjb25maWdfcmVhZF9md19pZHhfc3RvcmUpOworCisKK3N0YXRpYyBzc2l6ZV90IHRyaWdnZXJfcmVxdWVzdF9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByYzsKKwljaGFyICpuYW1lOworCisJbmFtZSA9IGtzdHJuZHVwKGJ1ZiwgY291bnQsIEdGUF9LRVJORUwpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlwcl9pbmZvKCJsb2FkaW5nICclcydcbiIsIG5hbWUpOworCisJbXV0ZXhfbG9jaygmdGVzdF9md19tdXRleCk7CisJcmVsZWFzZV9maXJtd2FyZSh0ZXN0X2Zpcm13YXJlKTsKKwl0ZXN0X2Zpcm13YXJlID0gTlVMTDsKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJnRlc3RfZmlybXdhcmUsIG5hbWUsIGRldik7CisJaWYgKHJjKSB7CisJCXByX2luZm8oImxvYWQgb2YgJyVzJyBmYWlsZWQ6ICVkXG4iLCBuYW1lLCByYyk7CisJCWdvdG8gb3V0OworCX0KKwlwcl9pbmZvKCJsb2FkZWQ6ICV6dVxuIiwgdGVzdF9maXJtd2FyZS0+c2l6ZSk7CisJcmMgPSBjb3VudDsKKworb3V0OgorCW11dGV4X3VubG9jaygmdGVzdF9md19tdXRleCk7CisKKwlrZnJlZShuYW1lKTsKKworCXJldHVybiByYzsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyh0cmlnZ2VyX3JlcXVlc3QpOworCitzdGF0aWMgREVDTEFSRV9DT01QTEVUSU9OKGFzeW5jX2Z3X2RvbmUpOworCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2FzeW5jX3JlcXVlc3RfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwl0ZXN0X2Zpcm13YXJlID0gZnc7CisJY29tcGxldGUoJmFzeW5jX2Z3X2RvbmUpOworfQorCitzdGF0aWMgc3NpemVfdCB0cmlnZ2VyX2FzeW5jX3JlcXVlc3Rfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJjOworCWNoYXIgKm5hbWU7CisKKwluYW1lID0ga3N0cm5kdXAoYnVmLCBjb3VudCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuYW1lKQorCQlyZXR1cm4gLUVOT1NQQzsKKworCXByX2luZm8oImxvYWRpbmcgJyVzJ1xuIiwgbmFtZSk7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwlyZWxlYXNlX2Zpcm13YXJlKHRlc3RfZmlybXdhcmUpOworCXRlc3RfZmlybXdhcmUgPSBOVUxMOworCXJjID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIG5hbWUsIGRldiwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgIE5VTEwsIHRyaWdnZXJfYXN5bmNfcmVxdWVzdF9jYik7CisJaWYgKHJjKSB7CisJCXByX2luZm8oImFzeW5jIGxvYWQgb2YgJyVzJyBmYWlsZWQ6ICVkXG4iLCBuYW1lLCByYyk7CisJCWtmcmVlKG5hbWUpOworCQlnb3RvIG91dDsKKwl9CisJLyogRnJlZSAnbmFtZScgQVNBUCwgdG8gdGVzdCBmb3IgcmFjZSBjb25kaXRpb25zICovCisJa2ZyZWUobmFtZSk7CisKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZhc3luY19md19kb25lKTsKKworCWlmICh0ZXN0X2Zpcm13YXJlKSB7CisJCXByX2luZm8oImxvYWRlZDogJXp1XG4iLCB0ZXN0X2Zpcm13YXJlLT5zaXplKTsKKwkJcmMgPSBjb3VudDsKKwl9IGVsc2UgeworCQlwcl9lcnIoImZhaWxlZCB0byBhc3luYyBsb2FkIGZpcm13YXJlXG4iKTsKKwkJcmMgPSAtRU5PREVWOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmdGVzdF9md19tdXRleCk7CisKKwlyZXR1cm4gcmM7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfV08odHJpZ2dlcl9hc3luY19yZXF1ZXN0KTsKKworc3RhdGljIHNzaXplX3QgdHJpZ2dlcl9jdXN0b21fZmFsbGJhY2tfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCByYzsKKwljaGFyICpuYW1lOworCisJbmFtZSA9IGtzdHJuZHVwKGJ1ZiwgY291bnQsIEdGUF9LRVJORUwpOworCWlmICghbmFtZSkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlwcl9pbmZvKCJsb2FkaW5nICclcycgdXNpbmcgY3VzdG9tIGZhbGxiYWNrIG1lY2hhbmlzbVxuIiwgbmFtZSk7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKwlyZWxlYXNlX2Zpcm13YXJlKHRlc3RfZmlybXdhcmUpOworCXRlc3RfZmlybXdhcmUgPSBOVUxMOworCXJjID0gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIEZXX0FDVElPTl9OT0hPVFBMVUcsIG5hbWUsCisJCQkJICAgICBkZXYsIEdGUF9LRVJORUwsIE5VTEwsCisJCQkJICAgICB0cmlnZ2VyX2FzeW5jX3JlcXVlc3RfY2IpOworCWlmIChyYykgeworCQlwcl9pbmZvKCJhc3luYyBsb2FkIG9mICclcycgZmFpbGVkOiAlZFxuIiwgbmFtZSwgcmMpOworCQlrZnJlZShuYW1lKTsKKwkJZ290byBvdXQ7CisJfQorCS8qIEZyZWUgJ25hbWUnIEFTQVAsIHRvIHRlc3QgZm9yIHJhY2UgY29uZGl0aW9ucyAqLworCWtmcmVlKG5hbWUpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmYXN5bmNfZndfZG9uZSk7CisKKwlpZiAodGVzdF9maXJtd2FyZSkgeworCQlwcl9pbmZvKCJsb2FkZWQ6ICV6dVxuIiwgdGVzdF9maXJtd2FyZS0+c2l6ZSk7CisJCXJjID0gY291bnQ7CisJfSBlbHNlIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gYXN5bmMgbG9hZCBmaXJtd2FyZVxuIik7CisJCXJjID0gLUVOT0RFVjsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJnRlc3RfZndfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKHRyaWdnZXJfY3VzdG9tX2ZhbGxiYWNrKTsKKworc3RhdGljIGludCB0ZXN0X2Z3X3J1bl9iYXRjaF9yZXF1ZXN0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRlc3RfYmF0Y2hlZF9yZXEgKnJlcSA9IGRhdGE7CisKKwlpZiAoIXJlcSkgeworCQl0ZXN0X2Z3X2NvbmZpZy0+dGVzdF9yZXN1bHQgPSAtRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXEtPnJjID0gdGVzdF9md19jb25maWctPnJlcV9maXJtd2FyZSgmcmVxLT5mdywgcmVxLT5uYW1lLCByZXEtPmRldik7CisJaWYgKHJlcS0+cmMpIHsKKwkJcHJfaW5mbygiIyV1OiBiYXRjaGVkIHN5bmMgbG9hZCBmYWlsZWQ6ICVkXG4iLAorCQkJcmVxLT5pZHgsIHJlcS0+cmMpOworCQlpZiAoIXRlc3RfZndfY29uZmlnLT50ZXN0X3Jlc3VsdCkKKwkJCXRlc3RfZndfY29uZmlnLT50ZXN0X3Jlc3VsdCA9IHJlcS0+cmM7CisJfSBlbHNlIGlmIChyZXEtPmZ3KSB7CisJCXJlcS0+c2VudCA9IHRydWU7CisJCXByX2luZm8oIiMldTogYmF0Y2hlZCBzeW5jIGxvYWRlZCAlenVcbiIsCisJCQlyZXEtPmlkeCwgcmVxLT5mdy0+c2l6ZSk7CisJfQorCWNvbXBsZXRlKCZyZXEtPmNvbXBsZXRpb24pOworCisJcmVxLT50YXNrID0gTlVMTDsKKworCXJldHVybiAwOworfQorCisvKgorICogV2UgdXNlIGEga3RocmVhZCBhcyBvdGhlcndpc2UgdGhlIGtlcm5lbCBzZXJpYWxpemVzIGFsbCBvdXIgc3luYyByZXF1ZXN0cworICogYW5kIHdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIG1pbWljIGJhdGNoZWQgcmVxdWVzdHMgb24gYSBzeW5jIGNhbGwuIEJhdGNoZWQKKyAqIHJlcXVlc3RzIG9uIGEgc3luYyBjYWxsIGNhbiBmb3IgaW5zdGFuY2UgaGFwcGVuIG9uIGEgZGV2aWNlIGRyaXZlciB3aGVuCisgKiBtdWx0aXBsZSBjYXJkcyBhcmUgdXNlZCBhbmQgZmlybXdhcmUgbG9hZGluZyBoYXBwZW5zIG91dHNpZGUgb2YgcHJvYmUuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHRyaWdnZXJfYmF0Y2hlZF9yZXF1ZXN0c19zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdGVzdF9iYXRjaGVkX3JlcSAqcmVxOworCWludCByYzsKKwl1OCBpOworCisJbXV0ZXhfbG9jaygmdGVzdF9md19tdXRleCk7CisKKwl0ZXN0X2Z3X2NvbmZpZy0+cmVxcyA9IHZ6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXN0X2JhdGNoZWRfcmVxKSAqCisJCQkJICAgICAgIHRlc3RfZndfY29uZmlnLT5udW1fcmVxdWVzdHMgKiAyKTsKKwlpZiAoIXRlc3RfZndfY29uZmlnLT5yZXFzKSB7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCXByX2luZm8oImJhdGNoZWQgc3luYyBmaXJtd2FyZSBsb2FkaW5nICclcycgJXUgdGltZXNcbiIsCisJCXRlc3RfZndfY29uZmlnLT5uYW1lLCB0ZXN0X2Z3X2NvbmZpZy0+bnVtX3JlcXVlc3RzKTsKKworCWZvciAoaSA9IDA7IGkgPCB0ZXN0X2Z3X2NvbmZpZy0+bnVtX3JlcXVlc3RzOyBpKyspIHsKKwkJcmVxID0gJnRlc3RfZndfY29uZmlnLT5yZXFzW2ldOworCQlpZiAoIXJlcSkgeworCQkJV0FSTl9PTigxKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X2JhaWw7CisJCX0KKwkJcmVxLT5mdyA9IE5VTEw7CisJCXJlcS0+aWR4ID0gaTsKKwkJcmVxLT5uYW1lID0gdGVzdF9md19jb25maWctPm5hbWU7CisJCXJlcS0+ZGV2ID0gZGV2OworCQlpbml0X2NvbXBsZXRpb24oJnJlcS0+Y29tcGxldGlvbik7CisJCXJlcS0+dGFzayA9IGt0aHJlYWRfcnVuKHRlc3RfZndfcnVuX2JhdGNoX3JlcXVlc3QsIHJlcSwKKwkJCQkJICAgICAiJXMtJXUiLCBLQlVJTERfTU9ETkFNRSwgcmVxLT5pZHgpOworCQlpZiAoIXJlcS0+dGFzayB8fCBJU19FUlIocmVxLT50YXNrKSkgeworCQkJcHJfZXJyKCJTZXR0aW5nIHVwIHRocmVhZCAldSBmYWlsZWRcbiIsIHJlcS0+aWR4KTsKKwkJCXJlcS0+dGFzayA9IE5VTEw7CisJCQlyYyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9iYWlsOworCQl9CisJfQorCisJcmMgPSBjb3VudDsKKworCS8qCisJICogV2UgcmVxdWlyZSBhbiBleHBsaWNpdCByZWxlYXNlIHRvIGVuYWJsZSBtb3JlIHRpbWUgYW5kIGRlbGF5IG9mCisJICogY2FsbGluZyByZWxlYXNlX2Zpcm13YXJlKCkgdG8gaW1wcm92ZSBvdXIgY2hhbmNlcyBvZiBmb3JjaW5nIGEKKwkgKiBiYXRjaGVkIHJlcXVlc3QuIElmIHdlIGluc3RlYWQgY2FsbGVkIHJlbGVhc2VfZmlybXdhcmUoKSByaWdodCBhd2F5CisJICogdGhlbiB3ZSBtaWdodCBtaXNzIG9uIGFuIG9wcG9ydHVuaXR5IG9mIGhhdmluZyBhIHN1Y2Nlc3NmdWwgZmlybXdhcmUKKwkgKiByZXF1ZXN0IHBhc3Mgb24gdGhlIG9wcG9ydHVuaXR5IHRvIGJlIGNvbWUgYSBiYXRjaGVkIHJlcXVlc3QuCisJICovCisKK291dF9iYWlsOgorCWZvciAoaSA9IDA7IGkgPCB0ZXN0X2Z3X2NvbmZpZy0+bnVtX3JlcXVlc3RzOyBpKyspIHsKKwkJcmVxID0gJnRlc3RfZndfY29uZmlnLT5yZXFzW2ldOworCQlpZiAocmVxLT50YXNrIHx8IHJlcS0+c2VudCkKKwkJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnJlcS0+Y29tcGxldGlvbik7CisJfQorCisJLyogT3ZlcnJpZGUgYW55IHdvcmtlciBlcnJvciBpZiB3ZSBoYWQgYSBnZW5lcmFsIHNldHVwIGVycm9yICovCisJaWYgKHJjIDwgMCkKKwkJdGVzdF9md19jb25maWctPnRlc3RfcmVzdWx0ID0gcmM7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiByYzsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyh0cmlnZ2VyX2JhdGNoZWRfcmVxdWVzdHMpOworCisvKgorICogV2Ugd2FpdCBmb3IgZWFjaCBjYWxsYmFjayB0byByZXR1cm4gd2l0aCB0aGUgbG9jayBoZWxkLCBubyBuZWVkIHRvIGxvY2sgaGVyZQorICovCitzdGF0aWMgdm9pZCB0cmlnZ2VyX2JhdGNoZWRfY2IoY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdywgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgdGVzdF9iYXRjaGVkX3JlcSAqcmVxID0gY29udGV4dDsKKworCWlmICghcmVxKSB7CisJCXRlc3RfZndfY29uZmlnLT50ZXN0X3Jlc3VsdCA9IC1FSU5WQUw7CisJCXJldHVybjsKKwl9CisKKwkvKiBmb3JjZXMgKnNvbWUqIGJhdGNoZWQgcmVxdWVzdHMgdG8gcXVldWUgdXAgKi8KKwlpZiAoIXJlcS0+aWR4KQorCQlzc2xlZXAoMik7CisKKwlyZXEtPmZ3ID0gZnc7CisKKwkvKgorCSAqIFVuZm9ydHVuYXRlbHkgdGhlIGZpcm13YXJlIEFQSSBnaXZlcyB1cyBub3RoaW5nIG90aGVyIHRoYW4gYSBudWxsIEZXCisJICogaWYgdGhlIGZpcm13YXJlIHdhcyBub3QgZm91bmQgb24gYXN5bmMgcmVxdWVzdHMuICBCZXN0IHdlIGNhbiBkbyBpcworCSAqIGp1c3QgYXNzdW1lIC1FTk9FTlQuIEEgYmV0dGVyIEFQSSB3b3VsZCBwYXNzIHRoZSBhY3R1YWwgcmV0dXJuCisJICogdmFsdWUgdG8gdGhlIGNhbGxiYWNrLgorCSAqLworCWlmICghZncgJiYgIXRlc3RfZndfY29uZmlnLT50ZXN0X3Jlc3VsdCkKKwkJdGVzdF9md19jb25maWctPnRlc3RfcmVzdWx0ID0gLUVOT0VOVDsKKworCWNvbXBsZXRlKCZyZXEtPmNvbXBsZXRpb24pOworfQorCitzdGF0aWMKK3NzaXplX3QgdHJpZ2dlcl9iYXRjaGVkX3JlcXVlc3RzX2FzeW5jX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgdGVzdF9iYXRjaGVkX3JlcSAqcmVxOworCWJvb2wgc2VuZF91ZXZlbnQ7CisJaW50IHJjOworCXU4IGk7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXRlc3RfZndfY29uZmlnLT5yZXFzID0gdnphbGxvYyhzaXplb2Yoc3RydWN0IHRlc3RfYmF0Y2hlZF9yZXEpICoKKwkJCQkgICAgICAgdGVzdF9md19jb25maWctPm51bV9yZXF1ZXN0cyAqIDIpOworCWlmICghdGVzdF9md19jb25maWctPnJlcXMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwlwcl9pbmZvKCJiYXRjaGVkIGxvYWRpbmcgJyVzJyBjdXN0b20gZmFsbGJhY2sgbWVjaGFuaXNtICV1IHRpbWVzXG4iLAorCQl0ZXN0X2Z3X2NvbmZpZy0+bmFtZSwgdGVzdF9md19jb25maWctPm51bV9yZXF1ZXN0cyk7CisKKwlzZW5kX3VldmVudCA9IHRlc3RfZndfY29uZmlnLT5zZW5kX3VldmVudCA/IEZXX0FDVElPTl9IT1RQTFVHIDoKKwkJRldfQUNUSU9OX05PSE9UUExVRzsKKworCWZvciAoaSA9IDA7IGkgPCB0ZXN0X2Z3X2NvbmZpZy0+bnVtX3JlcXVlc3RzOyBpKyspIHsKKwkJcmVxID0gJnRlc3RfZndfY29uZmlnLT5yZXFzW2ldOworCQlpZiAoIXJlcSkgeworCQkJV0FSTl9PTigxKTsKKwkJCWdvdG8gb3V0X2JhaWw7CisJCX0KKwkJcmVxLT5uYW1lID0gdGVzdF9md19jb25maWctPm5hbWU7CisJCXJlcS0+ZncgPSBOVUxMOworCQlyZXEtPmlkeCA9IGk7CisJCWluaXRfY29tcGxldGlvbigmcmVxLT5jb21wbGV0aW9uKTsKKwkJcmMgPSByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgc2VuZF91ZXZlbnQsCisJCQkJCSAgICAgcmVxLT5uYW1lLAorCQkJCQkgICAgIGRldiwgR0ZQX0tFUk5FTCwgcmVxLAorCQkJCQkgICAgIHRyaWdnZXJfYmF0Y2hlZF9jYik7CisJCWlmIChyYykgeworCQkJcHJfaW5mbygiIyV1OiBiYXRjaGVkIGFzeW5jIGxvYWQgZmFpbGVkIHNldHVwOiAlZFxuIiwKKwkJCQlpLCByYyk7CisJCQlyZXEtPnJjID0gcmM7CisJCQlnb3RvIG91dF9iYWlsOworCQl9IGVsc2UKKwkJCXJlcS0+c2VudCA9IHRydWU7CisJfQorCisJcmMgPSBjb3VudDsKKworb3V0X2JhaWw6CisKKwkvKgorCSAqIFdlIHJlcXVpcmUgYW4gZXhwbGljaXQgcmVsZWFzZSB0byBlbmFibGUgbW9yZSB0aW1lIGFuZCBkZWxheSBvZgorCSAqIGNhbGxpbmcgcmVsZWFzZV9maXJtd2FyZSgpIHRvIGltcHJvdmUgb3VyIGNoYW5jZXMgb2YgZm9yY2luZyBhCisJICogYmF0Y2hlZCByZXF1ZXN0LiBJZiB3ZSBpbnN0ZWFkIGNhbGxlZCByZWxlYXNlX2Zpcm13YXJlKCkgcmlnaHQgYXdheQorCSAqIHRoZW4gd2UgbWlnaHQgbWlzcyBvbiBhbiBvcHBvcnR1bml0eSBvZiBoYXZpbmcgYSBzdWNjZXNzZnVsIGZpcm13YXJlCisJICogcmVxdWVzdCBwYXNzIG9uIHRoZSBvcHBvcnR1bml0eSB0byBiZSBjb21lIGEgYmF0Y2hlZCByZXF1ZXN0LgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IHRlc3RfZndfY29uZmlnLT5udW1fcmVxdWVzdHM7IGkrKykgeworCQlyZXEgPSAmdGVzdF9md19jb25maWctPnJlcXNbaV07CisJCWlmIChyZXEtPnNlbnQpCisJCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZyZXEtPmNvbXBsZXRpb24pOworCX0KKworCS8qIE92ZXJyaWRlIGFueSB3b3JrZXIgZXJyb3IgaWYgd2UgaGFkIGEgZ2VuZXJhbCBzZXR1cCBlcnJvciAqLworCWlmIChyYyA8IDApCisJCXRlc3RfZndfY29uZmlnLT50ZXN0X3Jlc3VsdCA9IHJjOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXJldHVybiByYzsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyh0cmlnZ2VyX2JhdGNoZWRfcmVxdWVzdHNfYXN5bmMpOworCitzdGF0aWMgc3NpemVfdCB0ZXN0X3Jlc3VsdF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHRlc3RfZGV2X2NvbmZpZ19zaG93X2ludChidWYsIHRlc3RfZndfY29uZmlnLT50ZXN0X3Jlc3VsdCk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8odGVzdF9yZXN1bHQpOworCitzdGF0aWMgc3NpemVfdCByZWxlYXNlX2FsbF9maXJtd2FyZV9zdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJdGVzdF9yZWxlYXNlX2FsbF9maXJtd2FyZSgpOworCXJldHVybiBjb3VudDsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUl9XTyhyZWxlYXNlX2FsbF9maXJtd2FyZSk7CisKK3N0YXRpYyBzc2l6ZV90IHJlYWRfZmlybXdhcmVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdGVzdF9iYXRjaGVkX3JlcSAqcmVxOworCXU4IGlkeDsKKwlzc2l6ZV90IHJjID0gMDsKKworCW11dGV4X2xvY2soJnRlc3RfZndfbXV0ZXgpOworCisJaWR4ID0gdGVzdF9md19jb25maWctPnJlYWRfZndfaWR4OworCWlmIChpZHggPj0gdGVzdF9md19jb25maWctPm51bV9yZXF1ZXN0cykgeworCQlyYyA9IC1FUkFOR0U7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghdGVzdF9md19jb25maWctPnJlcXMpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXEgPSAmdGVzdF9md19jb25maWctPnJlcXNbaWR4XTsKKwlpZiAoIXJlcS0+ZncpIHsKKwkJcHJfZXJyKCIjJXU6IGZhaWxlZCB0byBhc3luYyBsb2FkIGZpcm13YXJlXG4iLCBpZHgpOworCQlyYyA9IC1FTk9FTlQ7CisJCWdvdG8gb3V0OworCX0KKworCXByX2luZm8oIiMldTogbG9hZGVkICV6dVxuIiwgaWR4LCByZXEtPmZ3LT5zaXplKTsKKworCWlmIChyZXEtPmZ3LT5zaXplID4gUEFHRV9TSVpFKSB7CisJCXByX2VycigiVGVzdGluZyBpbnRlcmZhY2UgbXVzdCB1c2UgUEFHRV9TSVpFIGZpcm13YXJlIGZvciBub3dcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwltZW1jcHkoYnVmLCByZXEtPmZ3LT5kYXRhLCByZXEtPmZ3LT5zaXplKTsKKworCXJjID0gcmVxLT5mdy0+c2l6ZTsKK291dDoKKwltdXRleF91bmxvY2soJnRlc3RfZndfbXV0ZXgpOworCisJcmV0dXJuIHJjOworfQorc3RhdGljIERFVklDRV9BVFRSX1JPKHJlYWRfZmlybXdhcmUpOworCisjZGVmaW5lIFRFU1RfRldfREVWX0FUVFIobmFtZSkgICAgICAgICAgJmRldl9hdHRyXyMjbmFtZS5hdHRyCisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0ZXN0X2Rldl9hdHRyc1tdID0geworCVRFU1RfRldfREVWX0FUVFIocmVzZXQpLAorCisJVEVTVF9GV19ERVZfQVRUUihjb25maWcpLAorCVRFU1RfRldfREVWX0FUVFIoY29uZmlnX25hbWUpLAorCVRFU1RfRldfREVWX0FUVFIoY29uZmlnX251bV9yZXF1ZXN0cyksCisJVEVTVF9GV19ERVZfQVRUUihjb25maWdfc3luY19kaXJlY3QpLAorCVRFU1RfRldfREVWX0FUVFIoY29uZmlnX3NlbmRfdWV2ZW50KSwKKwlURVNUX0ZXX0RFVl9BVFRSKGNvbmZpZ19yZWFkX2Z3X2lkeCksCisKKwkvKiBUaGVzZSBkb24ndCB1c2UgdGhlIGNvbmZpZyBhdCBhbGwgLSB0aGV5IGNvdWxkIGJlIHBvcnRlZCEgKi8KKwlURVNUX0ZXX0RFVl9BVFRSKHRyaWdnZXJfcmVxdWVzdCksCisJVEVTVF9GV19ERVZfQVRUUih0cmlnZ2VyX2FzeW5jX3JlcXVlc3QpLAorCVRFU1RfRldfREVWX0FUVFIodHJpZ2dlcl9jdXN0b21fZmFsbGJhY2spLAorCisJLyogVGhlc2UgdXNlIHRoZSBjb25maWcgYW5kIGNhbiB1c2UgdGhlIHRlc3RfcmVzdWx0ICovCisJVEVTVF9GV19ERVZfQVRUUih0cmlnZ2VyX2JhdGNoZWRfcmVxdWVzdHMpLAorCVRFU1RfRldfREVWX0FUVFIodHJpZ2dlcl9iYXRjaGVkX3JlcXVlc3RzX2FzeW5jKSwKKworCVRFU1RfRldfREVWX0FUVFIocmVsZWFzZV9hbGxfZmlybXdhcmUpLAorCVRFU1RfRldfREVWX0FUVFIodGVzdF9yZXN1bHQpLAorCVRFU1RfRldfREVWX0FUVFIocmVhZF9maXJtd2FyZSksCisJTlVMTCwKK307CisKK0FUVFJJQlVURV9HUk9VUFModGVzdF9kZXYpOworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgdGVzdF9md19taXNjX2RldmljZSA9IHsKKwkubWlub3IgICAgICAgICAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgICAgICAgICAgID0gInRlc3RfZmlybXdhcmUiLAorCS5mb3BzICAgICAgICAgICA9ICZ0ZXN0X2Z3X2ZvcHMsCisJLmdyb3VwcyAJPSB0ZXN0X2Rldl9ncm91cHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X2Zpcm13YXJlX2luaXQodm9pZCkKK3sKKwlpbnQgcmM7CisKKwl0ZXN0X2Z3X2NvbmZpZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZXN0X2NvbmZpZyksIEdGUF9LRVJORUwpOworCWlmICghdGVzdF9md19jb25maWcpCisJCXJldHVybiAtRU5PTUVNOworCisJcmMgPSBfX3Rlc3RfZmlybXdhcmVfY29uZmlnX2luaXQoKTsKKwlpZiAocmMpIHsKKwkJa2ZyZWUodGVzdF9md19jb25maWcpOworCQlwcl9lcnIoImNvdWxkIG5vdCBpbml0IGZpcm13YXJlIHRlc3QgY29uZmlnOiAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJcmMgPSBtaXNjX3JlZ2lzdGVyKCZ0ZXN0X2Z3X21pc2NfZGV2aWNlKTsKKwlpZiAocmMpIHsKKwkJa2ZyZWUodGVzdF9md19jb25maWcpOworCQlwcl9lcnIoImNvdWxkIG5vdCByZWdpc3RlciBtaXNjIGRldmljZTogJWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXByX3dhcm4oImludGVyZmFjZSByZWFkeVxuIik7CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQodGVzdF9maXJtd2FyZV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRlc3RfZmlybXdhcmVfZXhpdCh2b2lkKQoreworCW11dGV4X2xvY2soJnRlc3RfZndfbXV0ZXgpOworCXJlbGVhc2VfZmlybXdhcmUodGVzdF9maXJtd2FyZSk7CisJbWlzY19kZXJlZ2lzdGVyKCZ0ZXN0X2Z3X21pc2NfZGV2aWNlKTsKKwlfX3Rlc3RfZmlybXdhcmVfY29uZmlnX2ZyZWUoKTsKKwlrZnJlZSh0ZXN0X2Z3X2NvbmZpZyk7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Z3X211dGV4KTsKKworCXByX3dhcm4oInJlbW92ZWQgaW50ZXJmYWNlXG4iKTsKK30KKworbW9kdWxlX2V4aXQodGVzdF9maXJtd2FyZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiS2VlcyBDb29rIDxrZWVzY29va0BjaHJvbWl1bS5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2hhc2guYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzIwYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2hhc2guYwpAQCAtMCwwICsxLDI1NiBAQAorLyoKKyAqIFRlc3QgY2FzZXMgZm9yIDxsaW51eC9oYXNoLmg+IGFuZCA8bGludXgvc3RyaW5naGFzaC5oPgorICogVGhpcyBqdXN0IHZlcmlmaWVzIHRoYXQgdmFyaW91cyB3YXlzIG9mIGNvbXB1dGluZyBhIGhhc2gKKyAqIHByb2R1Y2UgdGhlIHNhbWUgdGhpbmcgYW5kLCBmb3IgY2FzZXMgd2hlcmUgYSBrLWJpdCBoYXNoCisgKiB2YWx1ZSBpcyByZXF1ZXN0ZWQsIGlzIG9mIHRoZSByZXF1ZXN0ZWQgc2l6ZS4KKyAqCisgKiBXZSBmaWxsIGEgYnVmZmVyIHdpdGggYSAyNTUtYnl0ZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLAorICogYW5kIHVzZSBib3RoIGZ1bGxfbmFtZV9oYXNoKCkgYW5kIGhhc2hsZW5fc3RyaW5nKCkgdG8gaGFzaCB0aGUKKyAqIHN1YnN0cmluZ3MgZnJvbSBpIHRvIGosIHdoZXJlIDAgPD0gaSA8IGogPCAyNTYuCisgKgorICogVGhlIHJldHVybmVkIHZhbHVlcyBhcmUgdXNlZCB0byBjaGVjayB0aGF0IF9faGFzaF8zMigpIGFuZAorICogX19oYXNoXzMyX2dlbmVyaWMoKSBjb21wdXRlIHRoZSBzYW1lIHRoaW5nLiAgTGlrZXdpc2UgaGFzaF8zMigpCisgKiBhbmQgaGFzaF82NCgpLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQgIlxuIgorCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdoYXNoLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisKKy8qIDMyLWJpdCBYT1JTSElGVCBnZW5lcmF0b3IuICBTZWVkIG11c3Qgbm90IGJlIHplcm8uICovCitzdGF0aWMgdTMyIF9faW5pdCBfX2F0dHJpYnV0ZV9jb25zdF9fCit4b3JzaGlmdCh1MzIgc2VlZCkKK3sKKwlzZWVkIF49IHNlZWQgPDwgMTM7CisJc2VlZCBePSBzZWVkID4+IDE3OworCXNlZWQgXj0gc2VlZCA8PCA1OworCXJldHVybiBzZWVkOworfQorCisvKiBHaXZlbiBhIG5vbi16ZXJvIHgsIHJldHVybnMgYSBub24temVybyBieXRlLiAqLworc3RhdGljIHU4IF9faW5pdCBfX2F0dHJpYnV0ZV9jb25zdF9fCittb2QyNTUodTMyIHgpCit7CisJeCA9ICh4ICYgMHhmZmZmKSArICh4ID4+IDE2KTsJLyogMSA8PSB4IDw9IDB4MWZmZmUgKi8KKwl4ID0gKHggJiAweGZmKSArICh4ID4+IDgpOwkvKiAxIDw9IHggPD0gMHgyZmQgKi8KKwl4ID0gKHggJiAweGZmKSArICh4ID4+IDgpOwkvKiAxIDw9IHggPD0gMHgxMDAgKi8KKwl4ID0gKHggJiAweGZmKSArICh4ID4+IDgpOwkvKiAxIDw9IHggPD0gMHhmZiAqLworCXJldHVybiB4OworfQorCisvKiBGaWxsIHRoZSBidWZmZXIgd2l0aCBub24temVybyBieXRlcy4gKi8KK3N0YXRpYyB2b2lkIF9faW5pdAorZmlsbF9idWYoY2hhciAqYnVmLCBzaXplX3QgbGVuLCB1MzIgc2VlZCkKK3sKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlzZWVkID0geG9yc2hpZnQoc2VlZCk7CisJCWJ1ZltpXSA9IG1vZDI1NShzZWVkKTsKKwl9Cit9CisKKy8qCisgKiBUZXN0IHRoZSB2YXJpb3VzIGludGVnZXIgaGFzaCBmdW5jdGlvbnMuICBoNjQgKG9yIGl0cyBsb3ctb3JkZXIgYml0cykKKyAqIGlzIHRoZSBpbnRlZ2VyIHRvIGhhc2guICBoYXNoX29yIGFjY3VtdWxhdGVzIHRoZSBPUiBvZiB0aGUgaGFzaCB2YWx1ZXMsCisgKiB3aGljaCBhcmUgbGF0ZXIgY2hlY2tlZCB0byBzZWUgdGhhdCB0aGV5IGNvdmVyIGFsbCB0aGUgcmVxdWVzdGVkIGJpdHMuCisgKgorICogQmVjYXVzZSB0aGVzZSBmdW5jdGlvbnMgKGFzIG9wcG9zZWQgdG8gdGhlIHN0cmluZyBoYXNoZXMpIGFyZSBhbGwKKyAqIGlubGluZSwgdGhlIGNvZGUgYmVpbmcgdGVzdGVkIGlzIGFjdHVhbGx5IGluIHRoZSBtb2R1bGUsIGFuZCB5b3UgY2FuCisgKiByZWNvbXBpbGUgYW5kIHJlLXRlc3QgdGhlIG1vZHVsZSB3aXRob3V0IHJlYm9vdGluZy4KKyAqLworc3RhdGljIGJvb2wgX19pbml0Cit0ZXN0X2ludF9oYXNoKHVuc2lnbmVkIGxvbmcgbG9uZyBoNjQsIHUzMiBoYXNoX29yWzJdWzMzXSkKK3sKKwlpbnQgazsKKwl1MzIgaDAgPSAodTMyKWg2NCwgaDEsIGgyOworCisJLyogVGVzdCBfX2hhc2gzMiAqLworCWhhc2hfb3JbMF1bMF0gfD0gaDEgPSBfX2hhc2hfMzIoaDApOworI2lmZGVmIEhBVkVfQVJDSF9fSEFTSF8zMgorCWhhc2hfb3JbMV1bMF0gfD0gaDIgPSBfX2hhc2hfMzJfZ2VuZXJpYyhoMCk7CisjaWYgSEFWRV9BUkNIX19IQVNIXzMyID09IDEKKwlpZiAoaDEgIT0gaDIpIHsKKwkJcHJfZXJyKCJfX2hhc2hfMzIoJSN4KSA9ICUjeCAhPSBfX2hhc2hfMzJfZ2VuZXJpYygpID0gJSN4IiwKKwkJCWgwLCBoMSwgaDIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorI2VuZGlmCisjZW5kaWYKKworCS8qIFRlc3QgayA9IDEuLjMyIGJpdHMgKi8KKwlmb3IgKGsgPSAxOyBrIDw9IDMyOyBrKyspIHsKKwkJdTMyIGNvbnN0IG0gPSAoKHUzMikyIDw8IChrLTEpKSAtIDE7CS8qIExvdyBrIGJpdHMgc2V0ICovCisKKwkJLyogVGVzdCBoYXNoXzMyICovCisJCWhhc2hfb3JbMF1ba10gfD0gaDEgPSBoYXNoXzMyKGgwLCBrKTsKKwkJaWYgKGgxID4gbSkgeworCQkJcHJfZXJyKCJoYXNoXzMyKCUjeCwgJWQpID0gJSN4ID4gJSN4IiwgaDAsIGssIGgxLCBtKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorI2lmZGVmIEhBVkVfQVJDSF9IQVNIXzMyCisJCWgyID0gaGFzaF8zMl9nZW5lcmljKGgwLCBrKTsKKyNpZiBIQVZFX0FSQ0hfSEFTSF8zMiA9PSAxCisJCWlmIChoMSAhPSBoMikgeworCQkJcHJfZXJyKCJoYXNoXzMyKCUjeCwgJWQpID0gJSN4ICE9IGhhc2hfMzJfZ2VuZXJpYygpICIKKwkJCQkiID0gJSN4IiwgaDAsIGssIGgxLCBoMik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKyNlbHNlCisJCWlmIChoMiA+IG0pIHsKKwkJCXByX2VycigiaGFzaF8zMl9nZW5lcmljKCUjeCwgJWQpID0gJSN4ID4gJSN4IiwKKwkJCQloMCwgaywgaDEsIG0pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisjZW5kaWYKKyNlbmRpZgorCQkvKiBUZXN0IGhhc2hfNjQgKi8KKwkJaGFzaF9vclsxXVtrXSB8PSBoMSA9IGhhc2hfNjQoaDY0LCBrKTsKKwkJaWYgKGgxID4gbSkgeworCQkJcHJfZXJyKCJoYXNoXzY0KCUjbGx4LCAlZCkgPSAlI3ggPiAlI3giLCBoNjQsIGssIGgxLCBtKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorI2lmZGVmIEhBVkVfQVJDSF9IQVNIXzY0CisJCWgyID0gaGFzaF82NF9nZW5lcmljKGg2NCwgayk7CisjaWYgSEFWRV9BUkNIX0hBU0hfNjQgPT0gMQorCQlpZiAoaDEgIT0gaDIpIHsKKwkJCXByX2VycigiaGFzaF82NCglI2xseCwgJWQpID0gJSN4ICE9IGhhc2hfNjRfZ2VuZXJpYygpICIKKwkJCQkiPSAlI3giLCBoNjQsIGssIGgxLCBoMik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKyNlbHNlCisJCWlmIChoMiA+IG0pIHsKKwkJCXByX2VycigiaGFzaF82NF9nZW5lcmljKCUjbGx4LCAlZCkgPSAlI3ggPiAlI3giLAorCQkJCWg2NCwgaywgaDEsIG0pOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisjZW5kaWYKKyNlbmRpZgorCX0KKworCSh2b2lkKWgyOwkvKiBTdXBwcmVzcyB1bnVzZWQgdmFyaWFibGUgd2FybmluZyAqLworCXJldHVybiB0cnVlOworfQorCisjZGVmaW5lIFNJWkUgMjU2CS8qIFJ1biB0aW1lIGlzIGN1YmljIGluIFNJWkUgKi8KKworc3RhdGljIGludCBfX2luaXQKK3Rlc3RfaGFzaF9pbml0KHZvaWQpCit7CisJY2hhciBidWZbU0laRSsxXTsKKwl1MzIgc3RyaW5nX29yID0gMCwgaGFzaF9vclsyXVszM10gPSB7IHsgMCwgfSB9OworCXVuc2lnbmVkIHRlc3RzID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaDY0ID0gMDsKKwlpbnQgaSwgajsKKworCWZpbGxfYnVmKGJ1ZiwgU0laRSwgMSk7CisKKwkvKiBUZXN0IGV2ZXJ5IHBvc3NpYmxlIG5vbi1lbXB0eSBzdWJzdHJpbmcgaW4gdGhlIGJ1ZmZlci4gKi8KKwlmb3IgKGogPSBTSVpFOyBqID4gMDsgLS1qKSB7CisJCWJ1ZltqXSA9ICdcMCc7CisKKwkJZm9yIChpID0gMDsgaSA8PSBqOyBpKyspIHsKKwkJCXU2NCBoYXNobGVuID0gaGFzaGxlbl9zdHJpbmcoYnVmK2ksIGJ1ZitpKTsKKwkJCXUzMiBoMCA9IGZ1bGxfbmFtZV9oYXNoKGJ1ZitpLCBidWYraSwgai1pKTsKKworCQkJLyogQ2hlY2sgdGhhdCBoYXNobGVuX3N0cmluZyBnZXRzIHRoZSBsZW5ndGggcmlnaHQgKi8KKwkJCWlmIChoYXNobGVuX2xlbihoYXNobGVuKSAhPSBqLWkpIHsKKwkJCQlwcl9lcnIoImhhc2hsZW5fc3RyaW5nKCVkLi4lZCkgcmV0dXJuZWQgbGVuZ3RoIgorCQkJCQkiICV1LCBleHBlY3RlZCAlZCIsCisJCQkJCWksIGosIGhhc2hsZW5fbGVuKGhhc2hsZW4pLCBqLWkpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJLyogQ2hlY2sgdGhhdCB0aGUgaGFzaGVzIG1hdGNoICovCisJCQlpZiAoaGFzaGxlbl9oYXNoKGhhc2hsZW4pICE9IGgwKSB7CisJCQkJcHJfZXJyKCJoYXNobGVuX3N0cmluZyglZC4uJWQpID0gJTA4eCAhPSAiCisJCQkJCSJmdWxsX25hbWVfaGFzaCgpID0gJTA4eCIsCisJCQkJCWksIGosIGhhc2hsZW5faGFzaChoYXNobGVuKSwgaDApOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlzdHJpbmdfb3IgfD0gaDA7CisJCQloNjQgPSBoNjQgPDwgMzIgfCBoMDsJLyogRm9yIHVzZSB3aXRoIGhhc2hfNjQgKi8KKwkJCWlmICghdGVzdF9pbnRfaGFzaChoNjQsIGhhc2hfb3IpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdGVzdHMrKzsKKwkJfSAvKiBpICovCisJfSAvKiBqICovCisKKwkvKiBUaGUgT1Igb2YgYWxsIHRoZSBoYXNoIHZhbHVlcyBzaG91bGQgY292ZXIgYWxsIHRoZSBiaXRzICovCisJaWYgKH5zdHJpbmdfb3IpIHsKKwkJcHJfZXJyKCJPUiBvZiBhbGwgc3RyaW5nIGhhc2ggcmVzdWx0cyA9ICUjeCAhPSAlI3giLAorCQkJc3RyaW5nX29yLCAtMXUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKH5oYXNoX29yWzBdWzBdKSB7CisJCXByX2VycigiT1Igb2YgYWxsIF9faGFzaF8zMiByZXN1bHRzID0gJSN4ICE9ICUjeCIsCisJCQloYXNoX29yWzBdWzBdLCAtMXUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjaWZkZWYgSEFWRV9BUkNIX19IQVNIXzMyCisjaWYgSEFWRV9BUkNIX19IQVNIXzMyICE9IDEJLyogVGVzdCBpcyBwb2ludGxlc3MgaWYgcmVzdWx0cyBtYXRjaCAqLworCWlmICh+aGFzaF9vclsxXVswXSkgeworCQlwcl9lcnIoIk9SIG9mIGFsbCBfX2hhc2hfMzJfZ2VuZXJpYyByZXN1bHRzID0gJSN4ICE9ICUjeCIsCisJCQloYXNoX29yWzFdWzBdLCAtMXUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZW5kaWYKKyNlbmRpZgorCisJLyogTGlrZXdpc2UgZm9yIGFsbCB0aGUgaS1iaXQgaGFzaCB2YWx1ZXMgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IDMyOyBpKyspIHsKKwkJdTMyIGNvbnN0IG0gPSAoKHUzMikyIDw8IChpLTEpKSAtIDE7CS8qIExvdyBpIGJpdHMgc2V0ICovCisKKwkJaWYgKGhhc2hfb3JbMF1baV0gIT0gbSkgeworCQkJcHJfZXJyKCJPUiBvZiBhbGwgaGFzaF8zMiglZCkgcmVzdWx0cyA9ICUjeCAiCisJCQkJIiglI3ggZXhwZWN0ZWQpIiwgaSwgaGFzaF9vclswXVtpXSwgbSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoaGFzaF9vclsxXVtpXSAhPSBtKSB7CisJCQlwcl9lcnIoIk9SIG9mIGFsbCBoYXNoXzY0KCVkKSByZXN1bHRzID0gJSN4ICIKKwkJCQkiKCUjeCBleHBlY3RlZCkiLCBpLCBoYXNoX29yWzFdW2ldLCBtKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogSXNzdWUgbm90aWNlcyBhYm91dCBza2lwcGVkIHRlc3RzLiAqLworI2lmZGVmIEhBVkVfQVJDSF9fSEFTSF8zMgorI2lmIEhBVkVfQVJDSF9fSEFTSF8zMiAhPSAxCisJcHJfaW5mbygiX19oYXNoXzMyKCkgaXMgYXJjaC1zcGVjaWZpYzsgbm90IGNvbXBhcmVkIHRvIGdlbmVyaWMuIik7CisjZW5kaWYKKyNlbHNlCisJcHJfaW5mbygiX19oYXNoXzMyKCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQVJDSF9IQVNIXzMyCisjaWYgSEFWRV9BUkNIX0hBU0hfMzIgIT0gMQorCXByX2luZm8oImhhc2hfMzIoKSBpcyBhcmNoLXNwZWNpZmljOyBub3QgY29tcGFyZWQgdG8gZ2VuZXJpYy4iKTsKKyNlbmRpZgorI2Vsc2UKKwlwcl9pbmZvKCJoYXNoXzMyKCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKKyNlbmRpZgorI2lmZGVmIEhBVkVfQVJDSF9IQVNIXzY0CisjaWYgSEFWRV9BUkNIX0hBU0hfNjQgIT0gMQorCXByX2luZm8oImhhc2hfNjQoKSBpcyBhcmNoLXNwZWNpZmljOyBub3QgY29tcGFyZWQgdG8gZ2VuZXJpYy4iKTsKKyNlbmRpZgorI2Vsc2UKKwlwcl9pbmZvKCJoYXNoXzY0KCkgaGFzIG5vIGFyY2ggaW1wbGVtZW50YXRpb24gdG8gdGVzdC4iKTsKKyNlbmRpZgorCisJcHJfbm90aWNlKCIldSB0ZXN0cyBwYXNzZWQuIiwgdGVzdHMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X2hhc2hfZXhpdCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdCh0ZXN0X2hhc2hfaW5pdCk7CS8qIERvZXMgZXZlcnl0aGluZyAqLworbW9kdWxlX2V4aXQodGVzdF9oYXNoX2V4aXQpOwkvKiBEb2VzIG5vdGhpbmcgKi8KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9oZXhkdW1wLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2hleGR1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNjNTEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9oZXhkdW1wLmMKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBUZXN0IGNhc2VzIGZvciBsaWIvaGV4ZHVtcC5jIG1vZHVsZS4KKyAqLworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXRhX2JbXSA9IHsKKwknXHhiZScsICdceDMyJywgJ1x4ZGInLCAnXHg3YicsICdceDBhJywgJ1x4MTgnLCAnXHg5MycsICdceGIyJywJLyogMDAgLSAwNyAqLworCSdceDcwJywgJ1x4YmEnLCAnXHhjNCcsICdceDI0JywgJ1x4N2QnLCAnXHg4MycsICdceDM0JywgJ1x4OWInLAkvKiAwOCAtIDBmICovCisJJ1x4YTYnLCAnXHg5YycsICdceDMxJywgJ1x4YWQnLCAnXHg5YycsICdceDBmJywgJ1x4YWMnLCAnXHhlOScsCS8qIDEwIC0gMTcgKi8KKwknXHg0YycsICdceGQxJywgJ1x4MTknLCAnXHg5OScsICdceDQzJywgJ1x4YjEnLCAnXHhhZicsICdceDBjJywJLyogMTggLSAxZiAqLworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZGF0YV9hW10gPSAiLjIuey4uLi5wLi4kfS40Li4uMS4uLi4uTC4uLkMuLi4iOworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRlc3RfZGF0YV8xX2xlW10gX19pbml0Y29uc3QgPSB7CisJImJlIiwgIjMyIiwgImRiIiwgIjdiIiwgIjBhIiwgIjE4IiwgIjkzIiwgImIyIiwKKwkiNzAiLCAiYmEiLCAiYzQiLCAiMjQiLCAiN2QiLCAiODMiLCAiMzQiLCAiOWIiLAorCSJhNiIsICI5YyIsICIzMSIsICJhZCIsICI5YyIsICIwZiIsICJhYyIsICJlOSIsCisJIjRjIiwgImQxIiwgIjE5IiwgIjk5IiwgIjQzIiwgImIxIiwgImFmIiwgIjBjIiwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVzdF9kYXRhXzJfbGVbXSBfX2luaXRjb25zdCA9IHsKKwkiMzJiZSIsICI3YmRiIiwgIjE4MGEiLCAiYjI5MyIsCisJImJhNzAiLCAiMjRjNCIsICI4MzdkIiwgIjliMzQiLAorCSI5Y2E2IiwgImFkMzEiLCAiMGY5YyIsICJlOWFjIiwKKwkiZDE0YyIsICI5OTE5IiwgImIxNDMiLCAiMGNhZiIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHRlc3RfZGF0YV80X2xlW10gX19pbml0Y29uc3QgPSB7CisJIjdiZGIzMmJlIiwgImIyOTMxODBhIiwgIjI0YzRiYTcwIiwgIjliMzQ4MzdkIiwKKwkiYWQzMTljYTYiLCAiZTlhYzBmOWMiLCAiOTkxOWQxNGMiLCAiMGNhZmIxNDMiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0ZXN0X2RhdGFfOF9sZVtdIF9faW5pdGNvbnN0ID0geworCSJiMjkzMTgwYTdiZGIzMmJlIiwgIjliMzQ4MzdkMjRjNGJhNzAiLAorCSJlOWFjMGY5Y2FkMzE5Y2E2IiwgIjBjYWZiMTQzOTkxOWQxNGMiLAorfTsKKworI2RlZmluZSBGSUxMX0NIQVIJJyMnCisKK3N0YXRpYyB1bnNpZ25lZCB0b3RhbF90ZXN0cyBfX2luaXRkYXRhOworc3RhdGljIHVuc2lnbmVkIGZhaWxlZF90ZXN0cyBfX2luaXRkYXRhOworCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF9oZXhkdW1wX3ByZXBhcmVfdGVzdChzaXplX3QgbGVuLCBpbnQgcm93c2l6ZSwKKwkJCQkJICAgICBpbnQgZ3JvdXBzaXplLCBjaGFyICp0ZXN0LAorCQkJCQkgICAgIHNpemVfdCB0ZXN0bGVuLCBib29sIGFzY2lpKQoreworCWNoYXIgKnA7CisJY29uc3QgY2hhciAqIGNvbnN0ICpyZXN1bHQ7CisJc2l6ZV90IGwgPSBsZW47CisJaW50IGdzID0gZ3JvdXBzaXplLCBycyA9IHJvd3NpemU7CisJdW5zaWduZWQgaW50IGk7CisKKwlpZiAocnMgIT0gMTYgJiYgcnMgIT0gMzIpCisJCXJzID0gMTY7CisKKwlpZiAobCA+IHJzKQorCQlsID0gcnM7CisKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZ3MpIHx8IGdzID4gOCB8fCAobGVuICUgZ3MgIT0gMCkpCisJCWdzID0gMTsKKworCWlmIChncyA9PSA4KQorCQlyZXN1bHQgPSB0ZXN0X2RhdGFfOF9sZTsKKwllbHNlIGlmIChncyA9PSA0KQorCQlyZXN1bHQgPSB0ZXN0X2RhdGFfNF9sZTsKKwllbHNlIGlmIChncyA9PSAyKQorCQlyZXN1bHQgPSB0ZXN0X2RhdGFfMl9sZTsKKwllbHNlCisJCXJlc3VsdCA9IHRlc3RfZGF0YV8xX2xlOworCisJLyogaGV4IGR1bXAgKi8KKwlwID0gdGVzdDsKKwlmb3IgKGkgPSAwOyBpIDwgbCAvIGdzOyBpKyspIHsKKwkJY29uc3QgY2hhciAqcSA9ICpyZXN1bHQrKzsKKwkJc2l6ZV90IGFtb3VudCA9IHN0cmxlbihxKTsKKworCQltZW1jcHkocCwgcSwgYW1vdW50KTsKKwkJcCArPSBhbW91bnQ7CisKKwkJKnArKyA9ICcgJzsKKwl9CisJaWYgKGkpCisJCXAtLTsKKworCS8qIEFTQ0lJIHBhcnQgKi8KKwlpZiAoYXNjaWkpIHsKKwkJZG8geworCQkJKnArKyA9ICcgJzsKKwkJfSB3aGlsZSAocCA8IHRlc3QgKyBycyAqIDIgKyBycyAvIGdzICsgMSk7CisKKwkJc3RybmNweShwLCBkYXRhX2EsIGwpOworCQlwICs9IGw7CisJfQorCisJKnAgPSAnXDAnOworfQorCisjZGVmaW5lIFRFU1RfSEVYRFVNUF9CVUZfU0laRQkJKDMyICogMyArIDIgKyAzMiArIDEpCisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2hleGR1bXAoc2l6ZV90IGxlbiwgaW50IHJvd3NpemUsIGludCBncm91cHNpemUsCisJCQkJYm9vbCBhc2NpaSkKK3sKKwljaGFyIHRlc3RbVEVTVF9IRVhEVU1QX0JVRl9TSVpFXTsKKwljaGFyIHJlYWxbVEVTVF9IRVhEVU1QX0JVRl9TSVpFXTsKKworCXRvdGFsX3Rlc3RzKys7CisKKwltZW1zZXQocmVhbCwgRklMTF9DSEFSLCBzaXplb2YocmVhbCkpOworCWhleF9kdW1wX3RvX2J1ZmZlcihkYXRhX2IsIGxlbiwgcm93c2l6ZSwgZ3JvdXBzaXplLCByZWFsLCBzaXplb2YocmVhbCksCisJCQkgICBhc2NpaSk7CisKKwltZW1zZXQodGVzdCwgRklMTF9DSEFSLCBzaXplb2YodGVzdCkpOworCXRlc3RfaGV4ZHVtcF9wcmVwYXJlX3Rlc3QobGVuLCByb3dzaXplLCBncm91cHNpemUsIHRlc3QsIHNpemVvZih0ZXN0KSwKKwkJCQkgIGFzY2lpKTsKKworCWlmIChtZW1jbXAodGVzdCwgcmVhbCwgVEVTVF9IRVhEVU1QX0JVRl9TSVpFKSkgeworCQlwcl9lcnIoIkxlbjogJXp1IHJvdzogJWQgZ3JvdXA6ICVkXG4iLCBsZW4sIHJvd3NpemUsIGdyb3Vwc2l6ZSk7CisJCXByX2VycigiUmVzdWx0OiAnJXMnXG4iLCByZWFsKTsKKwkJcHJfZXJyKCJFeHBlY3Q6ICclcydcbiIsIHRlc3QpOworCQlmYWlsZWRfdGVzdHMrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB0ZXN0X2hleGR1bXBfc2V0KGludCByb3dzaXplLCBib29sIGFzY2lpKQoreworCXNpemVfdCBkID0gbWluX3Qoc2l6ZV90LCBzaXplb2YoZGF0YV9iKSwgcm93c2l6ZSk7CisJc2l6ZV90IGxlbiA9IGdldF9yYW5kb21faW50KCkgJSBkICsgMTsKKworCXRlc3RfaGV4ZHVtcChsZW4sIHJvd3NpemUsIDQsIGFzY2lpKTsKKwl0ZXN0X2hleGR1bXAobGVuLCByb3dzaXplLCAyLCBhc2NpaSk7CisJdGVzdF9oZXhkdW1wKGxlbiwgcm93c2l6ZSwgOCwgYXNjaWkpOworCXRlc3RfaGV4ZHVtcChsZW4sIHJvd3NpemUsIDEsIGFzY2lpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3RfaGV4ZHVtcF9vdmVyZmxvdyhzaXplX3QgYnVmbGVuLCBzaXplX3QgbGVuLAorCQkJCQkgaW50IHJvd3NpemUsIGludCBncm91cHNpemUsCisJCQkJCSBib29sIGFzY2lpKQoreworCWNoYXIgdGVzdFtURVNUX0hFWERVTVBfQlVGX1NJWkVdOworCWNoYXIgYnVmW1RFU1RfSEVYRFVNUF9CVUZfU0laRV07CisJaW50IHJzID0gcm93c2l6ZSwgZ3MgPSBncm91cHNpemU7CisJaW50IGFlLCBoZSwgZSwgZiwgcjsKKwlib29sIGE7CisKKwl0b3RhbF90ZXN0cysrOworCisJbWVtc2V0KGJ1ZiwgRklMTF9DSEFSLCBzaXplb2YoYnVmKSk7CisKKwlyID0gaGV4X2R1bXBfdG9fYnVmZmVyKGRhdGFfYiwgbGVuLCBycywgZ3MsIGJ1ZiwgYnVmbGVuLCBhc2NpaSk7CisKKwkvKgorCSAqIENhbGxlciBtdXN0IHByb3ZpZGUgdGhlIGRhdGEgbGVuZ3RoIG11bHRpcGxlIG9mIGdyb3Vwc2l6ZS4gVGhlCisJICogY2FsY3VsYXRpb25zIGJlbG93IGFyZSBtYWRlIHdpdGggdGhhdCBhc3N1bXB0aW9uIGluIG1pbmQuCisJICovCisJYWUgPSBycyAqIDIgLyogaGV4ICovICsgcnMgLyBncyAvKiBzcGFjZXMgKi8gKyAxIC8qIHNwYWNlICovICsgbGVuIC8qIGFzY2lpICovOworCWhlID0gKGdzICogMiAvKiBoZXggKi8gKyAxIC8qIHNwYWNlICovKSAqIGxlbiAvIGdzIC0gMSAvKiBubyB0cmFpbGluZyBzcGFjZSAqLzsKKworCWlmIChhc2NpaSkKKwkJZSA9IGFlOworCWVsc2UKKwkJZSA9IGhlOworCisJZiA9IG1pbl90KGludCwgZSArIDEsIGJ1Zmxlbik7CisJaWYgKGJ1ZmxlbikgeworCQl0ZXN0X2hleGR1bXBfcHJlcGFyZV90ZXN0KGxlbiwgcnMsIGdzLCB0ZXN0LCBzaXplb2YodGVzdCksIGFzY2lpKTsKKwkJdGVzdFtmIC0gMV0gPSAnXDAnOworCX0KKwltZW1zZXQodGVzdCArIGYsIEZJTExfQ0hBUiwgc2l6ZW9mKHRlc3QpIC0gZik7CisKKwlhID0gciA9PSBlICYmICFtZW1jbXAodGVzdCwgYnVmLCBURVNUX0hFWERVTVBfQlVGX1NJWkUpOworCisJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOworCisJaWYgKCFhKSB7CisJCXByX2VycigiTGVuOiAlenUgYnVmbGVuOiAlenUgc3RybGVuOiAlenVcbiIsCisJCQlsZW4sIGJ1Zmxlbiwgc3RybmxlbihidWYsIHNpemVvZihidWYpKSk7CisJCXByX2VycigiUmVzdWx0OiAlZCAnJXMnXG4iLCByLCBidWYpOworCQlwcl9lcnIoIkV4cGVjdDogJWQgJyVzJ1xuIiwgZSwgdGVzdCk7CisJCWZhaWxlZF90ZXN0cysrOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3RfaGV4ZHVtcF9vdmVyZmxvd19zZXQoc2l6ZV90IGJ1ZmxlbiwgYm9vbCBhc2NpaSkKK3sKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisJaW50IHJzID0gKGdldF9yYW5kb21faW50KCkgJSAyICsgMSkgKiAxNjsKKworCWRvIHsKKwkJaW50IGdzID0gMSA8PCBpOworCQlzaXplX3QgbGVuID0gZ2V0X3JhbmRvbV9pbnQoKSAlIHJzICsgZ3M7CisKKwkJdGVzdF9oZXhkdW1wX292ZXJmbG93KGJ1Zmxlbiwgcm91bmRkb3duKGxlbiwgZ3MpLCBycywgZ3MsIGFzY2lpKTsKKwl9IHdoaWxlIChpKysgPCAzKTsKK30KKworc3RhdGljIGludCBfX2luaXQgdGVzdF9oZXhkdW1wX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcm93c2l6ZTsKKworCXJvd3NpemUgPSAoZ2V0X3JhbmRvbV9pbnQoKSAlIDIgKyAxKSAqIDE2OworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl0ZXN0X2hleGR1bXBfc2V0KHJvd3NpemUsIGZhbHNlKTsKKworCXJvd3NpemUgPSAoZ2V0X3JhbmRvbV9pbnQoKSAlIDIgKyAxKSAqIDE2OworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl0ZXN0X2hleGR1bXBfc2V0KHJvd3NpemUsIHRydWUpOworCisJZm9yIChpID0gMDsgaSA8PSBURVNUX0hFWERVTVBfQlVGX1NJWkU7IGkrKykKKwkJdGVzdF9oZXhkdW1wX292ZXJmbG93X3NldChpLCBmYWxzZSk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IFRFU1RfSEVYRFVNUF9CVUZfU0laRTsgaSsrKQorCQl0ZXN0X2hleGR1bXBfb3ZlcmZsb3dfc2V0KGksIHRydWUpOworCisJaWYgKGZhaWxlZF90ZXN0cyA9PSAwKQorCQlwcl9pbmZvKCJhbGwgJXUgdGVzdHMgcGFzc2VkXG4iLCB0b3RhbF90ZXN0cyk7CisJZWxzZQorCQlwcl9lcnIoImZhaWxlZCAldSBvdXQgb2YgJXUgdGVzdHNcbiIsIGZhaWxlZF90ZXN0cywgdG90YWxfdGVzdHMpOworCisJcmV0dXJuIGZhaWxlZF90ZXN0cyA/IC1FSU5WQUwgOiAwOworfQorbW9kdWxlX2luaXQodGVzdF9oZXhkdW1wX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVzdF9oZXhkdW1wX2V4aXQodm9pZCkKK3sKKwkvKiBkbyBub3RoaW5nICovCit9Cittb2R1bGVfZXhpdCh0ZXN0X2hleGR1bXBfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkFuZHkgU2hldmNoZW5rbyA8YW5kcml5LnNoZXZjaGVua29AbGludXguaW50ZWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9rYXNhbi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9rYXNhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzOTlkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2thc2FuLmMKQEAgLTAsMCArMSw1MTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBBdXRob3I6IEFuZHJleSBSeWFiaW5pbiA8YS5yeWFiaW5pbkBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJrYXNhbiB0ZXN0OiAlcyAiIGZtdCwgX19mdW5jX18KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW1hbi5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rYXNhbi5oPgorCisvKgorICogTm90ZTogdGVzdCBmdW5jdGlvbnMgYXJlIG1hcmtlZCBub2lubGluZSBzbyB0aGF0IHRoZWlyIG5hbWVzIGFwcGVhciBpbgorICogcmVwb3J0cy4KKyAqLworCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga21hbGxvY19vb2JfcmlnaHQodm9pZCkKK3sKKwljaGFyICpwdHI7CisJc2l6ZV90IHNpemUgPSAxMjM7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIHRvIHJpZ2h0XG4iKTsKKwlwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyKSB7CisJCXByX2VycigiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyW3NpemVdID0gJ3gnOworCWtmcmVlKHB0cik7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrbWFsbG9jX29vYl9sZWZ0KHZvaWQpCit7CisJY2hhciAqcHRyOworCXNpemVfdCBzaXplID0gMTU7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIHRvIGxlZnRcbiIpOworCXB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwkqcHRyID0gKihwdHIgLSAxKTsKKwlrZnJlZShwdHIpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga21hbGxvY19ub2RlX29vYl9yaWdodCh2b2lkKQoreworCWNoYXIgKnB0cjsKKwlzaXplX3Qgc2l6ZSA9IDQwOTY7CisKKwlwcl9pbmZvKCJrbWFsbG9jX25vZGUoKTogb3V0LW9mLWJvdW5kcyB0byByaWdodFxuIik7CisJcHRyID0ga21hbGxvY19ub2RlKHNpemUsIEdGUF9LRVJORUwsIDApOworCWlmICghcHRyKSB7CisJCXByX2VycigiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyW3NpemVdID0gMDsKKwlrZnJlZShwdHIpOworfQorCisjaWZkZWYgQ09ORklHX1NMVUIKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrbWFsbG9jX3BhZ2VhbGxvY19vb2JfcmlnaHQodm9pZCkKK3sKKwljaGFyICpwdHI7CisJc2l6ZV90IHNpemUgPSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFICsgMTA7CisKKwkvKiBBbGxvY2F0ZSBhIGNodW5rIHRoYXQgZG9lcyBub3QgZml0IGludG8gYSBTTFVCIGNhY2hlIHRvIHRyaWdnZXIKKwkgKiB0aGUgcGFnZSBhbGxvY2F0b3IgZmFsbGJhY2suCisJICovCisJcHJfaW5mbygia21hbGxvYyBwYWdlYWxsb2MgYWxsb2NhdGlvbjogb3V0LW9mLWJvdW5kcyB0byByaWdodFxuIik7CisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0cltzaXplXSA9IDA7CisJa2ZyZWUocHRyKTsKK30KKyNlbmRpZgorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga21hbGxvY19sYXJnZV9vb2JfcmlnaHQodm9pZCkKK3sKKwljaGFyICpwdHI7CisJc2l6ZV90IHNpemUgPSBLTUFMTE9DX01BWF9DQUNIRV9TSVpFIC0gMjU2OworCS8qIEFsbG9jYXRlIGEgY2h1bmsgdGhhdCBpcyBsYXJnZSBlbm91Z2gsIGJ1dCBzdGlsbCBmaXRzIGludG8gYSBzbGFiCisJICogYW5kIGRvZXMgbm90IHRyaWdnZXIgdGhlIHBhZ2UgYWxsb2NhdG9yIGZhbGxiYWNrIGluIFNMVUIuCisJICovCisJcHJfaW5mbygia21hbGxvYyBsYXJnZSBhbGxvY2F0aW9uOiBvdXQtb2YtYm91bmRzIHRvIHJpZ2h0XG4iKTsKKwlwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyKSB7CisJCXByX2VycigiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJcHRyW3NpemVdID0gMDsKKwlrZnJlZShwdHIpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga21hbGxvY19vb2Jfa3JlYWxsb2NfbW9yZSh2b2lkKQoreworCWNoYXIgKnB0cjEsICpwdHIyOworCXNpemVfdCBzaXplMSA9IDE3OworCXNpemVfdCBzaXplMiA9IDE5OworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBhZnRlciBrcmVhbGxvYyBtb3JlXG4iKTsKKwlwdHIxID0ga21hbGxvYyhzaXplMSwgR0ZQX0tFUk5FTCk7CisJcHRyMiA9IGtyZWFsbG9jKHB0cjEsIHNpemUyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cjEgfHwgIXB0cjIpIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWtmcmVlKHB0cjEpOworCQlrZnJlZShwdHIyKTsKKwkJcmV0dXJuOworCX0KKworCXB0cjJbc2l6ZTJdID0gJ3gnOworCWtmcmVlKHB0cjIpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga21hbGxvY19vb2Jfa3JlYWxsb2NfbGVzcyh2b2lkKQoreworCWNoYXIgKnB0cjEsICpwdHIyOworCXNpemVfdCBzaXplMSA9IDE3OworCXNpemVfdCBzaXplMiA9IDE1OworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBhZnRlciBrcmVhbGxvYyBsZXNzXG4iKTsKKwlwdHIxID0ga21hbGxvYyhzaXplMSwgR0ZQX0tFUk5FTCk7CisJcHRyMiA9IGtyZWFsbG9jKHB0cjEsIHNpemUyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cjEgfHwgIXB0cjIpIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWtmcmVlKHB0cjEpOworCQlyZXR1cm47CisJfQorCXB0cjJbc2l6ZTJdID0gJ3gnOworCWtmcmVlKHB0cjIpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQga21hbGxvY19vb2JfMTYodm9pZCkKK3sKKwlzdHJ1Y3QgeworCQl1NjQgd29yZHNbMl07CisJfSAqcHRyMSwgKnB0cjI7CisKKwlwcl9pbmZvKCJrbWFsbG9jIG91dC1vZi1ib3VuZHMgZm9yIDE2LWJ5dGVzIGFjY2Vzc1xuIik7CisJcHRyMSA9IGttYWxsb2Moc2l6ZW9mKCpwdHIxKSAtIDMsIEdGUF9LRVJORUwpOworCXB0cjIgPSBrbWFsbG9jKHNpemVvZigqcHRyMiksIEdGUF9LRVJORUwpOworCWlmICghcHRyMSB8fCAhcHRyMikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJa2ZyZWUocHRyMSk7CisJCWtmcmVlKHB0cjIpOworCQlyZXR1cm47CisJfQorCSpwdHIxID0gKnB0cjI7CisJa2ZyZWUocHRyMSk7CisJa2ZyZWUocHRyMik7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrbWFsbG9jX29vYl9tZW1zZXRfMih2b2lkKQoreworCWNoYXIgKnB0cjsKKwlzaXplX3Qgc2l6ZSA9IDg7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIG1lbXNldDJcbiIpOworCXB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQocHRyKzcsIDAsIDIpOworCWtmcmVlKHB0cik7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrbWFsbG9jX29vYl9tZW1zZXRfNCh2b2lkKQoreworCWNoYXIgKnB0cjsKKwlzaXplX3Qgc2l6ZSA9IDg7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIG1lbXNldDRcbiIpOworCXB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQocHRyKzUsIDAsIDQpOworCWtmcmVlKHB0cik7Cit9CisKKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGttYWxsb2Nfb29iX21lbXNldF84KHZvaWQpCit7CisJY2hhciAqcHRyOworCXNpemVfdCBzaXplID0gODsKKworCXByX2luZm8oIm91dC1vZi1ib3VuZHMgaW4gbWVtc2V0OFxuIik7CisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChwdHIrMSwgMCwgOCk7CisJa2ZyZWUocHRyKTsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGttYWxsb2Nfb29iX21lbXNldF8xNih2b2lkKQoreworCWNoYXIgKnB0cjsKKwlzaXplX3Qgc2l6ZSA9IDE2OworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBpbiBtZW1zZXQxNlxuIik7CisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChwdHIrMSwgMCwgMTYpOworCWtmcmVlKHB0cik7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrbWFsbG9jX29vYl9pbl9tZW1zZXQodm9pZCkKK3sKKwljaGFyICpwdHI7CisJc2l6ZV90IHNpemUgPSA2NjY7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIG1lbXNldFxuIik7CisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCW1lbXNldChwdHIsIDAsIHNpemUrNSk7CisJa2ZyZWUocHRyKTsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGttYWxsb2NfdWFmKHZvaWQpCit7CisJY2hhciAqcHRyOworCXNpemVfdCBzaXplID0gMTA7CisKKwlwcl9pbmZvKCJ1c2UtYWZ0ZXItZnJlZVxuIik7CisJcHRyID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXB0cikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlKHB0cik7CisJKihwdHIgKyA4KSA9ICd4JzsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGttYWxsb2NfdWFmX21lbXNldCh2b2lkKQoreworCWNoYXIgKnB0cjsKKwlzaXplX3Qgc2l6ZSA9IDMzOworCisJcHJfaW5mbygidXNlLWFmdGVyLWZyZWUgaW4gbWVtc2V0XG4iKTsKKwlwdHIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyKSB7CisJCXByX2VycigiQWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm47CisJfQorCisJa2ZyZWUocHRyKTsKKwltZW1zZXQocHRyLCAwLCBzaXplKTsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGttYWxsb2NfdWFmMih2b2lkKQoreworCWNoYXIgKnB0cjEsICpwdHIyOworCXNpemVfdCBzaXplID0gNDM7CisKKwlwcl9pbmZvKCJ1c2UtYWZ0ZXItZnJlZSBhZnRlciBhbm90aGVyIGttYWxsb2NcbiIpOworCXB0cjEgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyMSkgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWtmcmVlKHB0cjEpOworCXB0cjIgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghcHRyMikgeworCQlwcl9lcnIoIkFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0cjFbNDBdID0gJ3gnOworCWlmIChwdHIxID09IHB0cjIpCisJCXByX2VycigiQ291bGQgbm90IGRldGVjdCB1c2UtYWZ0ZXItZnJlZTogcHRyMSA9PSBwdHIyXG4iKTsKKwlrZnJlZShwdHIyKTsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGttZW1fY2FjaGVfb29iKHZvaWQpCit7CisJY2hhciAqcDsKKwlzaXplX3Qgc2l6ZSA9IDIwMDsKKwlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGUgPSBrbWVtX2NhY2hlX2NyZWF0ZSgidGVzdF9jYWNoZSIsCisJCQkJCQlzaXplLCAwLAorCQkJCQkJMCwgTlVMTCk7CisJaWYgKCFjYWNoZSkgeworCQlwcl9lcnIoIkNhY2hlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIGttZW1fY2FjaGVfYWxsb2NcbiIpOworCXAgPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXApIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCWttZW1fY2FjaGVfZGVzdHJveShjYWNoZSk7CisJCXJldHVybjsKKwl9CisKKwkqcCA9IHBbc2l6ZV07CisJa21lbV9jYWNoZV9mcmVlKGNhY2hlLCBwKTsKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koY2FjaGUpOworfQorCitzdGF0aWMgbm9pbmxpbmUgdm9pZCBfX2luaXQgbWVtY2dfYWNjb3VudGVkX2ttZW1fY2FjaGUodm9pZCkKK3sKKwlpbnQgaTsKKwljaGFyICpwOworCXNpemVfdCBzaXplID0gMjAwOworCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZTsKKworCWNhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInRlc3RfY2FjaGUiLCBzaXplLCAwLCBTTEFCX0FDQ09VTlQsIE5VTEwpOworCWlmICghY2FjaGUpIHsKKwkJcHJfZXJyKCJDYWNoZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcl9pbmZvKCJhbGxvY2F0ZSBtZW1jZyBhY2NvdW50ZWQgb2JqZWN0XG4iKTsKKwkvKgorCSAqIFNldmVyYWwgYWxsb2NhdGlvbnMgd2l0aCBhIGRlbGF5IHRvIGFsbG93IGZvciBsYXp5IHBlciBtZW1jZyBrbWVtCisJICogY2FjaGUgY3JlYXRpb24uCisJICovCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlwID0ga21lbV9jYWNoZV9hbGxvYyhjYWNoZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcCkgeworCQkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQlnb3RvIGZyZWVfY2FjaGU7CisJCX0KKwkJa21lbV9jYWNoZV9mcmVlKGNhY2hlLCBwKTsKKwkJbXNsZWVwKDEwMCk7CisJfQorCitmcmVlX2NhY2hlOgorCWttZW1fY2FjaGVfZGVzdHJveShjYWNoZSk7Cit9CisKK3N0YXRpYyBjaGFyIGdsb2JhbF9hcnJheVsxMF07CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrYXNhbl9nbG9iYWxfb29iKHZvaWQpCit7CisJdm9sYXRpbGUgaW50IGkgPSAzOworCWNoYXIgKnAgPSAmZ2xvYmFsX2FycmF5W0FSUkFZX1NJWkUoZ2xvYmFsX2FycmF5KSArIGldOworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBnbG9iYWwgdmFyaWFibGVcbiIpOworCSoodm9sYXRpbGUgY2hhciAqKXA7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCBrYXNhbl9zdGFja19vb2Iodm9pZCkKK3sKKwljaGFyIHN0YWNrX2FycmF5WzEwXTsKKwl2b2xhdGlsZSBpbnQgaSA9IDA7CisJY2hhciAqcCA9ICZzdGFja19hcnJheVtBUlJBWV9TSVpFKHN0YWNrX2FycmF5KSArIGldOworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBvbiBzdGFja1xuIik7CisJKih2b2xhdGlsZSBjaGFyICopcDsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGtzaXplX3VucG9pc29uc19tZW1vcnkodm9pZCkKK3sKKwljaGFyICpwdHI7CisJc2l6ZV90IHNpemUgPSAxMjMsIHJlYWxfc2l6ZTsKKworCXByX2luZm8oImtzaXplKCkgdW5wb2lzb25zIHRoZSB3aG9sZSBhbGxvY2F0ZWQgY2h1bmtcbiIpOworCXB0ciA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHIpIHsKKwkJcHJfZXJyKCJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisJcmVhbF9zaXplID0ga3NpemUocHRyKTsKKwkvKiBUaGlzIGFjY2VzcyBkb2Vzbid0IHRyaWdnZXIgYW4gZXJyb3IuICovCisJcHRyW3NpemVdID0gJ3gnOworCS8qIFRoaXMgb25lIGRvZXMuICovCisJcHRyW3JlYWxfc2l6ZV0gPSAneSc7CisJa2ZyZWUocHRyKTsKK30KKworc3RhdGljIG5vaW5saW5lIHZvaWQgX19pbml0IGNvcHlfdXNlcl90ZXN0KHZvaWQpCit7CisJY2hhciAqa21lbTsKKwljaGFyIF9fdXNlciAqdXNlcm1lbTsKKwlzaXplX3Qgc2l6ZSA9IDEwOworCWludCB1bnVzZWQ7CisKKwlrbWVtID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWttZW0pCisJCXJldHVybjsKKworCXVzZXJtZW0gPSAoY2hhciBfX3VzZXIgKil2bV9tbWFwKE5VTEwsIDAsIFBBR0VfU0laRSwKKwkJCSAgICBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFIHwgUFJPVF9FWEVDLAorCQkJICAgIE1BUF9BTk9OWU1PVVMgfCBNQVBfUFJJVkFURSwgMCk7CisJaWYgKElTX0VSUih1c2VybWVtKSkgeworCQlwcl9lcnIoIkZhaWxlZCB0byBhbGxvY2F0ZSB1c2VyIG1lbW9yeVxuIik7CisJCWtmcmVlKGttZW0pOworCQlyZXR1cm47CisJfQorCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBpbiBjb3B5X2Zyb21fdXNlcigpXG4iKTsKKwl1bnVzZWQgPSBjb3B5X2Zyb21fdXNlcihrbWVtLCB1c2VybWVtLCBzaXplICsgMSk7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIGNvcHlfdG9fdXNlcigpXG4iKTsKKwl1bnVzZWQgPSBjb3B5X3RvX3VzZXIodXNlcm1lbSwga21lbSwgc2l6ZSArIDEpOworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBpbiBfX2NvcHlfZnJvbV91c2VyKClcbiIpOworCXVudXNlZCA9IF9fY29weV9mcm9tX3VzZXIoa21lbSwgdXNlcm1lbSwgc2l6ZSArIDEpOworCisJcHJfaW5mbygib3V0LW9mLWJvdW5kcyBpbiBfX2NvcHlfdG9fdXNlcigpXG4iKTsKKwl1bnVzZWQgPSBfX2NvcHlfdG9fdXNlcih1c2VybWVtLCBrbWVtLCBzaXplICsgMSk7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIF9fY29weV9mcm9tX3VzZXJfaW5hdG9taWMoKVxuIik7CisJdW51c2VkID0gX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhrbWVtLCB1c2VybWVtLCBzaXplICsgMSk7CisKKwlwcl9pbmZvKCJvdXQtb2YtYm91bmRzIGluIF9fY29weV90b191c2VyX2luYXRvbWljKClcbiIpOworCXVudXNlZCA9IF9fY29weV90b191c2VyX2luYXRvbWljKHVzZXJtZW0sIGttZW0sIHNpemUgKyAxKTsKKworCXByX2luZm8oIm91dC1vZi1ib3VuZHMgaW4gc3RybmNweV9mcm9tX3VzZXIoKVxuIik7CisJdW51c2VkID0gc3RybmNweV9mcm9tX3VzZXIoa21lbSwgdXNlcm1lbSwgc2l6ZSArIDEpOworCisJdm1fbXVubWFwKCh1bnNpZ25lZCBsb25nKXVzZXJtZW0sIFBBR0VfU0laRSk7CisJa2ZyZWUoa21lbSk7Cit9CisKK3N0YXRpYyBub2lubGluZSB2b2lkIF9faW5pdCB1c2VfYWZ0ZXJfc2NvcGVfdGVzdCh2b2lkKQoreworCXZvbGF0aWxlIGNoYXIgKnZvbGF0aWxlIHA7CisKKwlwcl9pbmZvKCJ1c2UtYWZ0ZXItc2NvcGUgb24gaW50XG4iKTsKKwl7CisJCWludCBsb2NhbCA9IDA7CisKKwkJcCA9IChjaGFyICopJmxvY2FsOworCX0KKwlwWzBdID0gMTsKKwlwWzNdID0gMTsKKworCXByX2luZm8oInVzZS1hZnRlci1zY29wZSBvbiBhcnJheVxuIik7CisJeworCQljaGFyIGxvY2FsWzEwMjRdID0gezB9OworCisJCXAgPSBsb2NhbDsKKwl9CisJcFswXSA9IDE7CisJcFsxMDIzXSA9IDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGttYWxsb2NfdGVzdHNfaW5pdCh2b2lkKQoreworCS8qCisJICogVGVtcG9yYXJpbHkgZW5hYmxlIG11bHRpLXNob3QgbW9kZS4gT3RoZXJ3aXNlLCB3ZSdkIG9ubHkgZ2V0IGEKKwkgKiByZXBvcnQgZm9yIHRoZSBmaXJzdCBjYXNlLgorCSAqLworCWJvb2wgbXVsdGlzaG90ID0ga2FzYW5fc2F2ZV9lbmFibGVfbXVsdGlfc2hvdCgpOworCisJa21hbGxvY19vb2JfcmlnaHQoKTsKKwlrbWFsbG9jX29vYl9sZWZ0KCk7CisJa21hbGxvY19ub2RlX29vYl9yaWdodCgpOworI2lmZGVmIENPTkZJR19TTFVCCisJa21hbGxvY19wYWdlYWxsb2Nfb29iX3JpZ2h0KCk7CisjZW5kaWYKKwlrbWFsbG9jX2xhcmdlX29vYl9yaWdodCgpOworCWttYWxsb2Nfb29iX2tyZWFsbG9jX21vcmUoKTsKKwlrbWFsbG9jX29vYl9rcmVhbGxvY19sZXNzKCk7CisJa21hbGxvY19vb2JfMTYoKTsKKwlrbWFsbG9jX29vYl9pbl9tZW1zZXQoKTsKKwlrbWFsbG9jX29vYl9tZW1zZXRfMigpOworCWttYWxsb2Nfb29iX21lbXNldF80KCk7CisJa21hbGxvY19vb2JfbWVtc2V0XzgoKTsKKwlrbWFsbG9jX29vYl9tZW1zZXRfMTYoKTsKKwlrbWFsbG9jX3VhZigpOworCWttYWxsb2NfdWFmX21lbXNldCgpOworCWttYWxsb2NfdWFmMigpOworCWttZW1fY2FjaGVfb29iKCk7CisJbWVtY2dfYWNjb3VudGVkX2ttZW1fY2FjaGUoKTsKKwlrYXNhbl9zdGFja19vb2IoKTsKKwlrYXNhbl9nbG9iYWxfb29iKCk7CisJa3NpemVfdW5wb2lzb25zX21lbW9yeSgpOworCWNvcHlfdXNlcl90ZXN0KCk7CisJdXNlX2FmdGVyX3Njb3BlX3Rlc3QoKTsKKworCWthc2FuX3Jlc3RvcmVfbXVsdGlfc2hvdChtdWx0aXNob3QpOworCisJcmV0dXJuIC1FQUdBSU47Cit9CisKK21vZHVsZV9pbml0KGttYWxsb2NfdGVzdHNfaW5pdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2ttb2QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfa21vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwY2UwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2ttb2QuYwpAQCAtMCwwICsxLDEyNDUgQEAKKy8qCisgKiBrbW9kIHN0cmVzcyB0ZXN0IGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQGtlcm5lbC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciBhdCB5b3VyIG9wdGlvbiBhbnkKKyAqIGxhdGVyIHZlcnNpb247IG9yLCB3aGVuIGRpc3RyaWJ1dGVkIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yCisgKiB3aGVuIGluY29ycG9yYXRlZCBpbnRvIG90aGVyIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKKyAqIGxpY2Vuc2U6CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiBjb3B5bGVmdC1uZXh0ICh2ZXJzaW9uIDAuMy4xIG9yIGxhdGVyKSBhcyBwdWJsaXNoZWQKKyAqIGF0IGh0dHA6Ly9jb3B5bGVmdC1uZXh0Lm9yZy8uCisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworLyoKKyAqIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0cmlnZ2VyIGFuZCB0ZXN0IHRoZSBrZXJuZWwncworICogbW9kdWxlIGxvYWRlciB0aHJvdWdoIGEgc2VyaWVzIG9mIGNvbmZpZ3VyYXRpb25zIGFuZCBhIGZldyB0cmlnZ2Vycy4KKyAqIFRvIHRlc3QgdGhpcyBkcml2ZXIgdXNlIHRoZSBmb2xsb3dpbmcgc2NyaXB0IGFzIHJvb3Q6CisgKgorICogdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMva21vZC9rbW9kLnNoIC0taGVscAorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKworI2RlZmluZSBURVNUX1NUQVJUX05VTV9USFJFQURTCTUwCisjZGVmaW5lIFRFU1RfU1RBUlRfRFJJVkVSCSJ0ZXN0X21vZHVsZSIKKyNkZWZpbmUgVEVTVF9TVEFSVF9URVNUX0ZTCSJ4ZnMiCisjZGVmaW5lIFRFU1RfU1RBUlRfVEVTVF9DQVNFCVRFU1RfS01PRF9EUklWRVIKKworCitzdGF0aWMgYm9vbCBmb3JjZV9pbml0X3Rlc3QgPSBmYWxzZTsKK21vZHVsZV9wYXJhbShmb3JjZV9pbml0X3Rlc3QsIGJvb2xfZW5hYmxlX29ubHksIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhmb3JjZV9pbml0X3Rlc3QsCisJCSAiRm9yY2Uga2lja2luZyBhIHRlc3QgaW1tZWRpYXRlbHkgYWZ0ZXIgZHJpdmVyIGxvYWRzIik7CisKKy8qCisgKiBGb3IgZGV2aWNlIGFsbG9jYXRpb24gLyByZWdpc3RyYXRpb24KKyAqLworc3RhdGljIERFRklORV9NVVRFWChyZWdfZGV2X211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQocmVnX3Rlc3RfZGV2cyk7CisKKy8qCisgKiBudW1fdGVzdF9kZXZzIGFjdHVhbGx5IHJlcHJlc2VudHMgdGhlICpuZXh0KiBJRCBvZiB0aGUgbmV4dAorICogZGV2aWNlIHdlIHdpbGwgYWxsb3cgdG8gY3JlYXRlLgorICovCitzdGF0aWMgaW50IG51bV90ZXN0X2RldnM7CisKKy8qKgorICogZW51bSBrbW9kX3Rlc3RfY2FzZSAtIGxpbmtlciB0YWJsZSB0ZXN0IGNhc2UKKyAqCisgKiBJZiB5b3UgYWRkIGEgIHRlc3QgY2FzZSwgcGxlYXNlIGJlIHN1cmUgdG8gcmV2aWV3IGlmIHlvdSBuZWVkIHRvIHNlCisgKiBAbmVlZF9tb2RfcHV0IGZvciB5b3VyIHRlc3RzIGNhc2UuCisgKgorICogQFRFU1RfS01PRF9EUklWRVI6IHN0cmVzcyB0ZXN0cyByZXF1ZXN0X21vZHVsZSgpCisgKiBAVEVTVF9LTU9EX0ZTX1RZUEU6IHN0cmVzcyB0ZXN0cyBnZXRfZnNfdHlwZSgpCisgKi8KK2VudW0ga21vZF90ZXN0X2Nhc2UgeworCV9fVEVTVF9LTU9EX0lOVkFMSUQgPSAwLAorCisJVEVTVF9LTU9EX0RSSVZFUiwKKwlURVNUX0tNT0RfRlNfVFlQRSwKKworCV9fVEVTVF9LTU9EX01BWCwKK307CisKK3N0cnVjdCB0ZXN0X2NvbmZpZyB7CisJY2hhciAqdGVzdF9kcml2ZXI7CisJY2hhciAqdGVzdF9mczsKKwl1bnNpZ25lZCBpbnQgbnVtX3RocmVhZHM7CisJZW51bSBrbW9kX3Rlc3RfY2FzZSB0ZXN0X2Nhc2U7CisJaW50IHRlc3RfcmVzdWx0OworfTsKKworc3RydWN0IGttb2RfdGVzdF9kZXZpY2U7CisKKy8qKgorICoga21vZF90ZXN0X2RldmljZV9pbmZvIC0gdGhyZWFkIGluZm8KKyAqCisgKiBAcmV0X3N5bmM6IHJldHVybiB2YWx1ZSBpZiByZXF1ZXN0X21vZHVsZSgpIGlzIHVzZWQsIHN5bmMgcmVxdWVzdCBmb3IKKyAqIAlAVEVTVF9LTU9EX0RSSVZFUgorICogQGZzX3N5bmM6IHJldHVybiB2YWx1ZSBvZiBnZXRfZnNfdHlwZSgpIGZvciBAVEVTVF9LTU9EX0ZTX1RZUEUKKyAqIEB0aHJlYWRfaWR4OiB0aHJlYWQgSUQKKyAqIEB0ZXN0X2RldjogdGVzdCBkZXZpY2UgdGVzdCBpcyBiZWluZyBwZXJmb3JtZWQgdW5kZXIKKyAqIEBuZWVkX21vZF9wdXQ6IFNvbWUgdGVzdHMgKGdldF9mc190eXBlKCkgaXMgb25lKSByZXF1aXJlcyBwdXR0aW5nIHRoZSBtb2R1bGUKKyAqCShtb2R1bGVfcHV0KGZzX3N5bmMtPm93bmVyKSkgd2hlbiBkb25lLCBvdGhlcndpc2UgeW91IHdpbGwgbm90IGJlIGFibGUKKyAqCXRvIHVubG9hZCB0aGUgcmVzcGVjdGl2ZSBtb2R1bGVzIGFuZCByZS10ZXN0LiBXZSB1c2UgdGhpcyB0byBrZWVwCisgKglhY2NvdW50aW5nIG9mIHdoZW4gd2UgbmVlZCB0aGlzIGFuZCB0byBoZWxwIG91dCBpbiBjYXNlIHdlIG5lZWQgdG8KKyAqCWVycm9yIG91dCBhbmQgZGVhbCB3aXRoIG1vZHVsZV9wdXQoKSBvbiBlcnJvci4KKyAqLworc3RydWN0IGttb2RfdGVzdF9kZXZpY2VfaW5mbyB7CisJaW50IHJldF9zeW5jOworCXN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc19zeW5jOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFza19zeW5jOworCXVuc2lnbmVkIGludCB0aHJlYWRfaWR4OworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldjsKKwlib29sIG5lZWRfbW9kX3B1dDsKK307CisKKy8qKgorICoga21vZF90ZXN0X2RldmljZSAtIHRlc3QgZGV2aWNlIHRvIGhlbHAgdGVzdCBrbW9kCisgKgorICogQGRldl9pZHg6IHVuaXF1ZSBJRCBmb3IgdGVzdCBkZXZpY2UKKyAqIEBjb25maWc6IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXN0CisgKiBAbWlzY19kZXY6IHdlIHVzZSBhIG1pc2MgZGV2aWNlIHVuZGVyIHRoZSBob29kCisgKiBAZGV2OiBwb2ludGVyIHRvIG1pc2NfZGV2J3Mgb3duIHN0cnVjdCBkZXZpY2UKKyAqIEBjb25maWdfbXV0ZXg6IHByb3RlY3RzIGNvbmZpZ3VyYXRpb24gb2YgdGVzdAorICogQHRyaWdnZXJfbXV0ZXg6IHRoZSB0ZXN0IHRyaWdnZXIgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSBhdCBhIHRpbWUKKyAqIEB0aHJlYWRfbG9jazogcHJvdGVjdHMgQGRvbmUgY291bnQsIGFuZCB0aGUgQGluZm8gcGVyIGVhY2ggdGhyZWFkCisgKiBAZG9uZTogbnVtYmVyIG9mIHRocmVhZHMgd2hpY2ggaGF2ZSBjb21wbGV0ZWQgb3IgZmFpbGVkCisgKiBAdGVzdF9pc19vb206IHdoZW4gd2UgcnVuIG91dCBvZiBtZW1vcnksIHVzZSB0aGlzIHRvIGhhbHQgbW92aW5nIGZvcndhcmQKKyAqIEBrdGhyZWFkc19kb25lOiBjb21wbGV0aW9uIHVzZWQgdG8gc2lnbmFsIHdoZW4gYWxsIHdvcmsgaXMgZG9uZQorICogQGxpc3Q6IG5lZWRlZCB0byBiZSBwYXJ0IG9mIHRoZSByZWdfdGVzdF9kZXZzCisgKiBAaW5mbzogYXJyYXkgb2YgaW5mbyBmb3IgZWFjaCB0aHJlYWQKKyAqLworc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgeworCWludCBkZXZfaWR4OworCXN0cnVjdCB0ZXN0X2NvbmZpZyBjb25maWc7CisJc3RydWN0IG1pc2NkZXZpY2UgbWlzY19kZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtdXRleCBjb25maWdfbXV0ZXg7CisJc3RydWN0IG11dGV4IHRyaWdnZXJfbXV0ZXg7CisJc3RydWN0IG11dGV4IHRocmVhZF9tdXRleDsKKworCXVuc2lnbmVkIGludCBkb25lOworCisJYm9vbCB0ZXN0X2lzX29vbTsKKwlzdHJ1Y3QgY29tcGxldGlvbiBrdGhyZWFkc19kb25lOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlX2luZm8gKmluZm87Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqdGVzdF9jYXNlX3N0cihlbnVtIGttb2RfdGVzdF9jYXNlIHRlc3RfY2FzZSkKK3sKKwlzd2l0Y2ggKHRlc3RfY2FzZSkgeworCWNhc2UgVEVTVF9LTU9EX0RSSVZFUjoKKwkJcmV0dXJuICJURVNUX0tNT0RfRFJJVkVSIjsKKwljYXNlIFRFU1RfS01PRF9GU19UWVBFOgorCQlyZXR1cm4gIlRFU1RfS01PRF9GU19UWVBFIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gImludmFsaWQiOworCX0KK30KKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlICpkZXZfdG9fbWlzY19kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICptaXNjX2Rldl90b190ZXN0X2RldihzdHJ1Y3QgbWlzY2RldmljZSAqbWlzY19kZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtaXNjX2Rldiwgc3RydWN0IGttb2RfdGVzdF9kZXZpY2UsIG1pc2NfZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICpkZXZfdG9fdGVzdF9kZXYoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtaXNjZGV2aWNlICptaXNjX2RldjsKKworCW1pc2NfZGV2ID0gZGV2X3RvX21pc2NfZGV2KGRldik7CisKKwlyZXR1cm4gbWlzY19kZXZfdG9fdGVzdF9kZXYobWlzY19kZXYpOworfQorCisvKiBNdXN0IHJ1biB3aXRoIHRocmVhZF9tdXRleCBoZWxkICovCitzdGF0aWMgdm9pZCBrbW9kX3Rlc3RfZG9uZV9jaGVjayhzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYsCisJCQkJIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKworCXRlc3RfZGV2LT5kb25lKys7CisJZGV2X2RiZyh0ZXN0X2Rldi0+ZGV2LCAiRG9uZSB0aHJlYWQgY291bnQ6ICV1XG4iLCB0ZXN0X2Rldi0+ZG9uZSk7CisKKwlpZiAodGVzdF9kZXYtPmRvbmUgPT0gY29uZmlnLT5udW1fdGhyZWFkcykgeworCQlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiRG9uZTogJXUgdGhyZWFkcyBoYXZlIGFsbCBydW4gbm93XG4iLAorCQkJIHRlc3RfZGV2LT5kb25lKTsKKwkJZGV2X2luZm8odGVzdF9kZXYtPmRldiwgIkxhc3QgdGhyZWFkIHRvIHJ1bjogJXVcbiIsIGlkeCk7CisJCWNvbXBsZXRlKCZ0ZXN0X2Rldi0+a3RocmVhZHNfZG9uZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X2ttb2RfcHV0X21vZHVsZShzdHJ1Y3Qga21vZF90ZXN0X2RldmljZV9pbmZvICppbmZvKQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGluZm8tPnRlc3RfZGV2OworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlpZiAoIWluZm8tPm5lZWRfbW9kX3B1dCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChjb25maWctPnRlc3RfY2FzZSkgeworCWNhc2UgVEVTVF9LTU9EX0RSSVZFUjoKKwkJYnJlYWs7CisJY2FzZSBURVNUX0tNT0RfRlNfVFlQRToKKwkJaWYgKGluZm8gJiYgaW5mby0+ZnNfc3luYyAmJiBpbmZvLT5mc19zeW5jLT5vd25lcikKKwkJCW1vZHVsZV9wdXQoaW5mby0+ZnNfc3luYy0+b3duZXIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlpbmZvLT5uZWVkX21vZF9wdXQgPSB0cnVlOworfQorCitzdGF0aWMgaW50IHJ1bl9yZXF1ZXN0KHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2VfaW5mbyAqaW5mbyA9IGRhdGE7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gaW5mby0+dGVzdF9kZXY7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKworCXN3aXRjaCAoY29uZmlnLT50ZXN0X2Nhc2UpIHsKKwljYXNlIFRFU1RfS01PRF9EUklWRVI6CisJCWluZm8tPnJldF9zeW5jID0gcmVxdWVzdF9tb2R1bGUoIiVzIiwgY29uZmlnLT50ZXN0X2RyaXZlcik7CisJCWJyZWFrOworCWNhc2UgVEVTVF9LTU9EX0ZTX1RZUEU6CisJCWluZm8tPmZzX3N5bmMgPSBnZXRfZnNfdHlwZShjb25maWctPnRlc3RfZnMpOworCQlpbmZvLT5uZWVkX21vZF9wdXQgPSB0cnVlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBfX3RyaWdnZXJfY29uZmlnX3J1bigpIGFscmVhZHkgY2hlY2tlZCBmb3IgdGVzdCBzYW5pdHkgKi8KKwkJQlVHKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcodGVzdF9kZXYtPmRldiwgIlJhbiB0aHJlYWQgJXVcbiIsIGluZm8tPnRocmVhZF9pZHgpOworCisJdGVzdF9rbW9kX3B1dF9tb2R1bGUoaW5mbyk7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+dGhyZWFkX211dGV4KTsKKwlpbmZvLT50YXNrX3N5bmMgPSBOVUxMOworCWttb2RfdGVzdF9kb25lX2NoZWNrKHRlc3RfZGV2LCBpbmZvLT50aHJlYWRfaWR4KTsKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT50aHJlYWRfbXV0ZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGFsbHlfd29ya190ZXN0KHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gaW5mby0+dGVzdF9kZXY7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKwlpbnQgZXJyX3JldCA9IDA7CisKKwlzd2l0Y2ggKGNvbmZpZy0+dGVzdF9jYXNlKSB7CisJY2FzZSBURVNUX0tNT0RfRFJJVkVSOgorCQkvKgorCQkgKiBPbmx5IGNhcHR1cmUgZXJyb3JzLCBpZiBvbmUgaXMgZm91bmQgdGhhdCdzCisJCSAqIGVub3VnaCwgZm9yIG5vdy4KKwkJICovCisJCWlmIChpbmZvLT5yZXRfc3luYyAhPSAwKQorCQkJZXJyX3JldCA9IGluZm8tPnJldF9zeW5jOworCQlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LAorCQkJICJTeW5jIHRocmVhZCAlZCByZXR1cm4gc3RhdHVzOiAlZFxuIiwKKwkJCSBpbmZvLT50aHJlYWRfaWR4LCBpbmZvLT5yZXRfc3luYyk7CisJCWJyZWFrOworCWNhc2UgVEVTVF9LTU9EX0ZTX1RZUEU6CisJCS8qIEZvciBub3cgd2UgbWFrZSB0aGlzIHNpbXBsZSAqLworCQlpZiAoIWluZm8tPmZzX3N5bmMpCisJCQllcnJfcmV0ID0gLUVJTlZBTDsKKwkJZGV2X2luZm8odGVzdF9kZXYtPmRldiwgIlN5bmMgdGhyZWFkICV1IGZzOiAlc1xuIiwKKwkJCSBpbmZvLT50aHJlYWRfaWR4LCBpbmZvLT5mc19zeW5jID8gY29uZmlnLT50ZXN0X2ZzIDoKKwkJCSAiTlVMTCIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwl9CisKKwlyZXR1cm4gZXJyX3JldDsKK30KKworLyoKKyAqIFhYWDogYWRkIHJlc3VsdCBvcHRpb24gdG8gZGlzcGxheSBpZiBhbGwgZXJyb3JzIGRpZCBub3QgbWF0Y2guCisgKiBGb3Igbm93IHdlIGp1c3Qga2VlcCBhbnkgZXJyb3IgY29kZSBpZiBvbmUgd2FzIGZvdW5kLgorICoKKyAqIElmIHRoaXMgcmFuIGl0IG1lYW5zICphbGwqIHRhc2tzIHdlcmUgY3JlYXRlZCBmaW5lIGFuZCB3ZQorICogYXJlIG5vdyBqdXN0IGNvbGxlY3RpbmcgcmVzdWx0cy4KKyAqCisgKiBPbmx5IHByb3BhZ2F0ZSBlcnJvcnMsIGRvIG5vdCBvdmVycmlkZSB3aXRoIGEgc3Vic2VxdWVudCBzdWNlc3MgY2FzZS4KKyAqLworc3RhdGljIHZvaWQgdGFsbHlfdXBfd29yayhzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYpCit7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKwlzdHJ1Y3Qga21vZF90ZXN0X2RldmljZV9pbmZvICppbmZvOworCXVuc2lnbmVkIGludCBpZHg7CisJaW50IGVycl9yZXQgPSAwOworCWludCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPnRocmVhZF9tdXRleCk7CisKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiUmVzdWx0czpcbiIpOworCisJZm9yIChpZHg9MDsgaWR4IDwgY29uZmlnLT5udW1fdGhyZWFkczsgaWR4KyspIHsKKwkJaW5mbyA9ICZ0ZXN0X2Rldi0+aW5mb1tpZHhdOworCQlyZXQgPSB0YWxseV93b3JrX3Rlc3QoaW5mbyk7CisJCWlmIChyZXQpCisJCQllcnJfcmV0ID0gcmV0OworCX0KKworCS8qCisJICogTm90ZTogcmVxdWVzdF9tb2R1bGUoKSByZXR1cm5zIDI1NiBmb3IgYSBtb2R1bGUgbm90IGZvdW5kIGV2ZW4KKwkgKiB0aG91Z2ggbW9kcHJvYmUgaXRzZWxmIHJldHVybnMgMS4KKwkgKi8KKwljb25maWctPnRlc3RfcmVzdWx0ID0gZXJyX3JldDsKKworCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPnRocmVhZF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgdHJ5X29uZV9yZXF1ZXN0KHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3Qga21vZF90ZXN0X2RldmljZV9pbmZvICppbmZvID0gJnRlc3RfZGV2LT5pbmZvW2lkeF07CisJaW50IGZhaWxfcmV0ID0gLUVOT01FTTsKKworCW11dGV4X2xvY2soJnRlc3RfZGV2LT50aHJlYWRfbXV0ZXgpOworCisJaW5mby0+dGhyZWFkX2lkeCA9IGlkeDsKKwlpbmZvLT50ZXN0X2RldiA9IHRlc3RfZGV2OworCWluZm8tPnRhc2tfc3luYyA9IGt0aHJlYWRfcnVuKHJ1bl9yZXF1ZXN0LCBpbmZvLCAiJXMtJXUiLAorCQkJCSAgICAgIEtCVUlMRF9NT0ROQU1FLCBpZHgpOworCisJaWYgKCFpbmZvLT50YXNrX3N5bmMgfHwgSVNfRVJSKGluZm8tPnRhc2tfc3luYykpIHsKKwkJdGVzdF9kZXYtPnRlc3RfaXNfb29tID0gdHJ1ZTsKKwkJZGV2X2Vycih0ZXN0X2Rldi0+ZGV2LCAiU2V0dGluZyB1cCB0aHJlYWQgJXUgZmFpbGVkXG4iLCBpZHgpOworCQlpbmZvLT50YXNrX3N5bmMgPSBOVUxMOworCQlnb3RvIGVycl9vdXQ7CisJfSBlbHNlCisJCWRldl9kYmcodGVzdF9kZXYtPmRldiwgIktpY2tlZCBvZmYgdGhyZWFkICV1XG4iLCBpZHgpOworCisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+dGhyZWFkX211dGV4KTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCWluZm8tPnJldF9zeW5jID0gZmFpbF9yZXQ7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+dGhyZWFkX211dGV4KTsKKworCXJldHVybiBmYWlsX3JldDsKK30KKworc3RhdGljIHZvaWQgdGVzdF9kZXZfa21vZF9zdG9wX3Rlc3RzKHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldikKK3sKKwlzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZyA9ICZ0ZXN0X2Rldi0+Y29uZmlnOworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlX2luZm8gKmluZm87CisJdW5zaWduZWQgaW50IGk7CisKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiRW5kaW5nIHJlcXVlc3RfbW9kdWxlKCkgdGVzdHNcbiIpOworCisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPnRocmVhZF9tdXRleCk7CisKKwlmb3IgKGk9MDsgaSA8IGNvbmZpZy0+bnVtX3RocmVhZHM7IGkrKykgeworCQlpbmZvID0gJnRlc3RfZGV2LT5pbmZvW2ldOworCQlpZiAoaW5mby0+dGFza19zeW5jICYmICFJU19FUlIoaW5mby0+dGFza19zeW5jKSkgeworCQkJZGV2X2luZm8odGVzdF9kZXYtPmRldiwKKwkJCQkgIlN0b3BwaW5nIHN0aWxsLXJ1bm5pbmcgdGhyZWFkICVpXG4iLCBpKTsKKwkJCWt0aHJlYWRfc3RvcChpbmZvLT50YXNrX3N5bmMpOworCQl9CisKKwkJLyoKKwkJICogaW5mby0+dGFza19zeW5jIGlzIHdlbGwgcHJvdGVjdGVkLCBpdCBjYW4gb25seSBiZQorCQkgKiBOVUxMIG9yIGEgcG9pbnRlciB0byBhIHN0cnVjdC4gSWYgaXRzIE5VTEwgd2UgZWl0aGVyCisJCSAqIG5ldmVyIHJhbiwgb3Igd2UgZGlkIGFuZCB3ZSBjb21wbGV0ZWQgdGhlIHdvcmsuIENvbXBsZXRlZAorCQkgKiB0YXNrcyAqYWx3YXlzKiBwdXQgdGhlIG1vZHVsZSBmb3IgdXMuIFRoaXMgaXMgYSBzYW5pdHkKKwkJICogY2hlY2sgLS0ganVzdCBpbiBjYXNlLgorCQkgKi8KKwkJaWYgKGluZm8tPnRhc2tfc3luYyAmJiBpbmZvLT5uZWVkX21vZF9wdXQpCisJCQl0ZXN0X2ttb2RfcHV0X21vZHVsZShpbmZvKTsKKwl9CisKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT50aHJlYWRfbXV0ZXgpOworfQorCisvKgorICogT25seSB3YWl0ICppZmYqIHdlIGRpZCBub3QgcnVuIGludG8gYW55IGVycm9ycyBkdXJpbmcgYWxsIG9mIG91ciB0aHJlYWQKKyAqIHNldCB1cC4gSWYgcnVuIGludG8gYW55IGlzc3VlcyB3ZSBzdG9wIHRocmVhZHMgYW5kIGp1c3QgYmFpbCBvdXQgd2l0aAorICogYW4gZXJyb3IgdG8gdGhlIHRyaWdnZXIuIFRoaXMgYWxzbyBtZWFucyB3ZSBkb24ndCBuZWVkIGFueSB0YWxseSB3b3JrCisgKiBmb3IgYW55IHRocmVhZHMgd2hpY2ggZmFpbC4KKyAqLworc3RhdGljIGludCB0cnlfcmVxdWVzdHMoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2KQoreworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisJdW5zaWduZWQgaW50IGlkeDsKKwlpbnQgcmV0OworCWJvb2wgYW55X2Vycm9yID0gZmFsc2U7CisKKwlmb3IgKGlkeD0wOyBpZHggPCBjb25maWctPm51bV90aHJlYWRzOyBpZHgrKykgeworCQlpZiAodGVzdF9kZXYtPnRlc3RfaXNfb29tKSB7CisJCQlhbnlfZXJyb3IgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSB0cnlfb25lX3JlcXVlc3QodGVzdF9kZXYsIGlkeCk7CisJCWlmIChyZXQpIHsKKwkJCWFueV9lcnJvciA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghYW55X2Vycm9yKSB7CisJCXRlc3RfZGV2LT50ZXN0X2lzX29vbSA9IGZhbHNlOworCQlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LAorCQkJICJObyBlcnJvcnMgd2VyZSBmb3VuZCB3aGlsZSBpbml0aWFsaXppbmcgdGhyZWFkc1xuIik7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRlc3RfZGV2LT5rdGhyZWFkc19kb25lKTsKKwkJdGFsbHlfdXBfd29yayh0ZXN0X2Rldik7CisJfSBlbHNlIHsKKwkJdGVzdF9kZXYtPnRlc3RfaXNfb29tID0gdHJ1ZTsKKwkJZGV2X2luZm8odGVzdF9kZXYtPmRldiwKKwkJCSAiQXQgbGVhc3Qgb25lIHRocmVhZCBmYWlsZWQgdG8gc3RhcnQsIHN0b3AgYWxsIHdvcmtcbiIpOworCQl0ZXN0X2Rldl9rbW9kX3N0b3BfdGVzdHModGVzdF9kZXYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydW5fdGVzdF9kcml2ZXIoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2KQoreworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiVGVzdCBjYXNlOiAlcyAoJXUpXG4iLAorCQkgdGVzdF9jYXNlX3N0cihjb25maWctPnRlc3RfY2FzZSksCisJCSBjb25maWctPnRlc3RfY2FzZSk7CisJZGV2X2luZm8odGVzdF9kZXYtPmRldiwgIlRlc3QgZHJpdmVyIHRvIGxvYWQ6ICVzXG4iLAorCQkgY29uZmlnLT50ZXN0X2RyaXZlcik7CisJZGV2X2luZm8odGVzdF9kZXYtPmRldiwgIk51bWJlciBvZiB0aHJlYWRzIHRvIHJ1bjogJXVcbiIsCisJCSBjb25maWctPm51bV90aHJlYWRzKTsKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiVGhyZWFkIElEcyB3aWxsIHJhbmdlIGZyb20gMCAtICV1XG4iLAorCQkgY29uZmlnLT5udW1fdGhyZWFkcyAtIDEpOworCisJcmV0dXJuIHRyeV9yZXF1ZXN0cyh0ZXN0X2Rldik7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3Rlc3RfZnNfdHlwZShzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYpCit7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKworCWRldl9pbmZvKHRlc3RfZGV2LT5kZXYsICJUZXN0IGNhc2U6ICVzICgldSlcbiIsCisJCSB0ZXN0X2Nhc2Vfc3RyKGNvbmZpZy0+dGVzdF9jYXNlKSwKKwkJIGNvbmZpZy0+dGVzdF9jYXNlKTsKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiVGVzdCBmaWxlc3lzdGVtIHRvIGxvYWQ6ICVzXG4iLAorCQkgY29uZmlnLT50ZXN0X2ZzKTsKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiTnVtYmVyIG9mIHRocmVhZHMgdG8gcnVuOiAldVxuIiwKKwkJIGNvbmZpZy0+bnVtX3RocmVhZHMpOworCWRldl9pbmZvKHRlc3RfZGV2LT5kZXYsICJUaHJlYWQgSURzIHdpbGwgcmFuZ2UgZnJvbSAwIC0gJXVcbiIsCisJCSBjb25maWctPm51bV90aHJlYWRzIC0gMSk7CisKKwlyZXR1cm4gdHJ5X3JlcXVlc3RzKHRlc3RfZGV2KTsKK30KKworc3RhdGljIHNzaXplX3QgY29uZmlnX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gZGV2X3RvX3Rlc3RfZGV2KGRldik7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKwlpbnQgbGVuID0gMDsKKworCW11dGV4X2xvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCisJbGVuICs9IHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLAorCQkJIkN1c3RvbSB0cmlnZ2VyIGNvbmZpZ3VyYXRpb24gZm9yOiAlc1xuIiwKKwkJCWRldl9uYW1lKGRldikpOworCisJbGVuICs9IHNucHJpbnRmKGJ1ZitsZW4sIFBBR0VfU0laRSAtIGxlbiwKKwkJCSJOdW1iZXIgb2YgdGhyZWFkczpcdCV1XG4iLAorCQkJY29uZmlnLT5udW1fdGhyZWFkcyk7CisKKwlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJIlRlc3RfY2FzZTpcdCVzICgldSlcbiIsCisJCQl0ZXN0X2Nhc2Vfc3RyKGNvbmZpZy0+dGVzdF9jYXNlKSwKKwkJCWNvbmZpZy0+dGVzdF9jYXNlKTsKKworCWlmIChjb25maWctPnRlc3RfZHJpdmVyKQorCQlsZW4gKz0gc25wcmludGYoYnVmK2xlbiwgUEFHRV9TSVpFIC0gbGVuLAorCQkJCSJkcml2ZXI6XHQlc1xuIiwKKwkJCQljb25maWctPnRlc3RfZHJpdmVyKTsKKwllbHNlCisJCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkJImRyaXZlcjpcdEVNUFRZXG4iKTsKKworCWlmIChjb25maWctPnRlc3RfZnMpCisJCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkJImZzOlx0JXNcbiIsCisJCQkJY29uZmlnLT50ZXN0X2ZzKTsKKwllbHNlCisJCWxlbiArPSBzbnByaW50ZihidWYrbGVuLCBQQUdFX1NJWkUgLSBsZW4sCisJCQkJImZzOlx0RU1QVFlcbiIpOworCisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKworCXJldHVybiBsZW47Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oY29uZmlnKTsKKworLyoKKyAqIFRoaXMgZW5zdXJlcyB3ZSBkb24ndCBhbGxvdyBraWNraW5nIHRocmVhZHMgdGhyb3VnaCBpZiBvdXIgY29uZmlndXJhdGlvbgorICogaXMgZmF1bHR5LgorICovCitzdGF0aWMgaW50IF9fdHJpZ2dlcl9jb25maWdfcnVuKHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldikKK3sKKwlzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZyA9ICZ0ZXN0X2Rldi0+Y29uZmlnOworCisJdGVzdF9kZXYtPmRvbmUgPSAwOworCisJc3dpdGNoIChjb25maWctPnRlc3RfY2FzZSkgeworCWNhc2UgVEVTVF9LTU9EX0RSSVZFUjoKKwkJcmV0dXJuIHJ1bl90ZXN0X2RyaXZlcih0ZXN0X2Rldik7CisJY2FzZSBURVNUX0tNT0RfRlNfVFlQRToKKwkJcmV0dXJuIHJ1bl90ZXN0X2ZzX3R5cGUodGVzdF9kZXYpOworCWRlZmF1bHQ6CisJCWRldl93YXJuKHRlc3RfZGV2LT5kZXYsCisJCQkgIkludmFsaWQgdGVzdCBjYXNlIHJlcXVlc3RlZDogJXVcbiIsCisJCQkgY29uZmlnLT50ZXN0X2Nhc2UpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdHJpZ2dlcl9jb25maWdfcnVuKHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldikKK3sKKwlzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZyA9ICZ0ZXN0X2Rldi0+Y29uZmlnOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+dHJpZ2dlcl9tdXRleCk7CisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisKKwlyZXQgPSBfX3RyaWdnZXJfY29uZmlnX3J1bih0ZXN0X2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCWRldl9pbmZvKHRlc3RfZGV2LT5kZXYsICJHZW5lcmFsIHRlc3QgcmVzdWx0OiAlZFxuIiwKKwkJIGNvbmZpZy0+dGVzdF9yZXN1bHQpOworCisJLyoKKwkgKiBXZSBtdXN0IHJldHVybiAwIGFmdGVyIGEgdHJpZ2dlciBldmVuIHVubGVzcyBzb21ldGhpbmcgd2VudAorCSAqIHdyb25nIHdpdGggdGhlIHNldHVwIG9mIHRoZSB0ZXN0LiBJZiB0aGUgdGVzdCBzZXR1cCB3ZW50IGZpbmUKKwkgKiB0aGVuIHVzZXJzcGFjZSBtdXN0IGp1c3QgY2hlY2sgdGhlIHJlc3VsdCBvZiBjb25maWctPnRlc3RfcmVzdWx0LgorCSAqIE9uZSBpc3N1ZSB3aXRoIHJlbHlpbmcgb24gdGhlIHJldHVybiBmcm9tIGEgY2FsbCBpbiB0aGUga2VybmVsCisJICogaXMgaWYgdGhlIGtlcm5lbCByZXR1cm5zIGEgcG9zc2l0aXZlIHZhbHVlIHVzaW5nIHRoaXMgdHJpZ2dlcgorCSAqIHdpbGwgbm90IHJldHVybiB0aGUgdmFsdWUgdG8gdXNlcnNwYWNlLCBpdCB3b3VsZCBiZSBsb3N0LgorCSAqCisJICogQnkgbm90IHJlbHlpbmcgb24gY2FwdHVyaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGVzdHMgd2UgYXJlIHVzaW5nCisJICogdGhyb3VnaCB0aGUgdHJpZ2dlciBpdCBhbHNvIHVzIHRvIHJ1biB0ZXN0cyB3aXRoIHNldCAtZSBhbmQgb25seQorCSAqIGZhaWwgd2hlbiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBkcml2ZXIgdXBvbiB0cmlnZ2VyCisJICogcmVxdWVzdHMuCisJICovCisJcmV0ID0gMDsKKworb3V0OgorCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+dHJpZ2dlcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAordHJpZ2dlcl9jb25maWdfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCWludCByZXQ7CisKKwlpZiAodGVzdF9kZXYtPnRlc3RfaXNfb29tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIEZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgd2UgZG9uJ3QgY2FyZSB3aGF0IHVzZXJzcGFjZQorCSAqIHNlbnQgdGhpcyB0cmlnZ2VyLCB3ZSBjYXJlIG9ubHkgdGhhdCB3ZSB3ZXJlIHRyaWdnZXJlZC4KKwkgKiBXZSB0cmVhdCB0aGUgcmV0dXJuIHZhbHVlIG9ubHkgZm9yIGNhcHV0dXJpbmcgaXNzdWVzIHdpdGgKKwkgKiB0aGUgdGVzdCBzZXR1cC4gQXQgdGhpcyBwb2ludCBhbGwgdGhlIHRlc3QgdmFyaWFibGVzIHNob3VsZAorCSAqIGhhdmUgYmVlbiBhbGxvY2F0ZWQgc28gdHlwaWNhbGx5IHRoaXMgc2hvdWxkIG5ldmVyIGZhaWwuCisJICovCisJcmV0ID0gdHJpZ2dlcl9jb25maWdfcnVuKHRlc3RfZGV2KTsKKwlpZiAodW5saWtlbHkocmV0IDwgMCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBOb3RlOiBhbnkgcmV0dXJuID4gMCB3aWxsIGJlIHRyZWF0ZWQgYXMgc3VjY2VzcworCSAqIGFuZCB0aGUgZXJyb3IgdmFsdWUgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHRvIHVzZXJzcGFjZS4KKwkgKiBEbyBub3QgcmVseSBvbiB0cnlpbmcgdG8gc2VuZCB0byB1c2Vyc3BhY2UgYSB0ZXN0IHZhbHVlCisJICogcmV0dXJuIHZhbHVlIGFzIHBvc3NpdGl2ZSByZXR1cm4gZXJyb3JzIHdpbGwgYmUgbG9zdC4KKwkgKi8KKwlpZiAoV0FSTl9PTihyZXQgPiAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBjb3VudDsKK291dDoKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKHRyaWdnZXJfY29uZmlnKTsKKworLyoKKyAqIFhYWDogbW92ZSB0byBrc3RybmNweSgpIG9uY2UgbWVyZ2VkLgorICoKKyAqIFVzZXJzIHNob3VsZCB1c2Uga2ZyZWVfY29uc3QoKSB3aGVuIGZyZWVpbmcgdGhlc2UuCisgKi8KK3N0YXRpYyBpbnQgX19rc3RybmNweShjaGFyICoqZHN0LCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgY291bnQsIGdmcF90IGdmcCkKK3sKKwkqZHN0ID0ga3N0cm5kdXAobmFtZSwgY291bnQsIGdmcCk7CisJaWYgKCEqZHN0KQorCQlyZXR1cm4gLUVOT1NQQzsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX2NvcHlfdGVzdF9kcml2ZXJfbmFtZShzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZywKKwkJCQkgICAgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgICAgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBfX2tzdHJuY3B5KCZjb25maWctPnRlc3RfZHJpdmVyLCBuYW1lLCBjb3VudCwgR0ZQX0tFUk5FTCk7Cit9CisKKworc3RhdGljIGludCBjb25maWdfY29weV90ZXN0X2ZzKHN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnLCBjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgIHNpemVfdCBjb3VudCkKK3sKKwlyZXR1cm4gX19rc3RybmNweSgmY29uZmlnLT50ZXN0X2ZzLCBuYW1lLCBjb3VudCwgR0ZQX0tFUk5FTCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21vZF9jb25maWdfZnJlZShzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZykKK3sKKwlpZiAoIWNvbmZpZykKKwkJcmV0dXJuOworCisJa2ZyZWVfY29uc3QoY29uZmlnLT50ZXN0X2RyaXZlcik7CisJY29uZmlnLT50ZXN0X2RyaXZlciA9IE5VTEw7CisKKwlrZnJlZV9jb25zdChjb25maWctPnRlc3RfZnMpOworCWNvbmZpZy0+dGVzdF9mcyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGttb2RfY29uZmlnX2ZyZWUoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2KQoreworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnOworCisJaWYgKCF0ZXN0X2RldikKKwkJcmV0dXJuOworCisJY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKwlfX2ttb2RfY29uZmlnX2ZyZWUoY29uZmlnKTsKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworfQorCitzdGF0aWMgc3NpemVfdCBjb25maWdfdGVzdF9kcml2ZXJfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gZGV2X3RvX3Rlc3RfZGV2KGRldik7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKwlpbnQgY29waWVkOworCisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisKKwlrZnJlZV9jb25zdChjb25maWctPnRlc3RfZHJpdmVyKTsKKwljb25maWctPnRlc3RfZHJpdmVyID0gTlVMTDsKKworCWNvcGllZCA9IGNvbmZpZ19jb3B5X3Rlc3RfZHJpdmVyX25hbWUoY29uZmlnLCBidWYsIGNvdW50KTsKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCisJcmV0dXJuIGNvcGllZDsKK30KKworLyoKKyAqIEFzIHBlciBzeXNmc19rZl9zZXFfc2hvdygpIHRoZSBidWYgaXMgbWF4IFBBR0VfU0laRS4KKyAqLworc3RhdGljIHNzaXplX3QgY29uZmlnX3Rlc3Rfc2hvd19zdHIoc3RydWN0IG11dGV4ICpjb25maWdfbXV0ZXgsCisJCQkJICAgIGNoYXIgKmRzdCwKKwkJCQkgICAgY2hhciAqc3JjKQoreworCWludCBsZW47CisKKwltdXRleF9sb2NrKGNvbmZpZ19tdXRleCk7CisJbGVuID0gc25wcmludGYoZHN0LCBQQUdFX1NJWkUsICIlc1xuIiwgc3JjKTsKKwltdXRleF91bmxvY2soY29uZmlnX211dGV4KTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ190ZXN0X2RyaXZlcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYgPSBkZXZfdG9fdGVzdF9kZXYoZGV2KTsKKwlzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZyA9ICZ0ZXN0X2Rldi0+Y29uZmlnOworCisJcmV0dXJuIGNvbmZpZ190ZXN0X3Nob3dfc3RyKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4LCBidWYsCisJCQkJICAgIGNvbmZpZy0+dGVzdF9kcml2ZXIpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbmZpZ190ZXN0X2RyaXZlciwgMDY0NCwgY29uZmlnX3Rlc3RfZHJpdmVyX3Nob3csCisJCSAgIGNvbmZpZ190ZXN0X2RyaXZlcl9zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ190ZXN0X2ZzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisJaW50IGNvcGllZDsKKworCW11dGV4X2xvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCisJa2ZyZWVfY29uc3QoY29uZmlnLT50ZXN0X2ZzKTsKKwljb25maWctPnRlc3RfZnMgPSBOVUxMOworCisJY29waWVkID0gY29uZmlnX2NvcHlfdGVzdF9mcyhjb25maWcsIGJ1ZiwgY291bnQpOworCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisKKwlyZXR1cm4gY29waWVkOworfQorCitzdGF0aWMgc3NpemVfdCBjb25maWdfdGVzdF9mc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICBjaGFyICpidWYpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gZGV2X3RvX3Rlc3RfZGV2KGRldik7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKworCXJldHVybiBjb25maWdfdGVzdF9zaG93X3N0cigmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCwgYnVmLAorCQkJCSAgICBjb25maWctPnRlc3RfZnMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbmZpZ190ZXN0X2ZzLCAwNjQ0LCBjb25maWdfdGVzdF9mc19zaG93LAorCQkgICBjb25maWdfdGVzdF9mc19zdG9yZSk7CisKK3N0YXRpYyBpbnQgdHJpZ2dlcl9jb25maWdfcnVuX3R5cGUoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2LAorCQkJCSAgIGVudW0ga21vZF90ZXN0X2Nhc2UgdGVzdF9jYXNlLAorCQkJCSAgIGNvbnN0IGNoYXIgKnRlc3Rfc3RyKQoreworCWludCBjb3BpZWQgPSAwOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKworCXN3aXRjaCAodGVzdF9jYXNlKSB7CisJY2FzZSBURVNUX0tNT0RfRFJJVkVSOgorCQlrZnJlZV9jb25zdChjb25maWctPnRlc3RfZHJpdmVyKTsKKwkJY29uZmlnLT50ZXN0X2RyaXZlciA9IE5VTEw7CisJCWNvcGllZCA9IGNvbmZpZ19jb3B5X3Rlc3RfZHJpdmVyX25hbWUoY29uZmlnLCB0ZXN0X3N0ciwKKwkJCQkJCSAgICAgIHN0cmxlbih0ZXN0X3N0cikpOworCQlicmVhazsKKwljYXNlIFRFU1RfS01PRF9GU19UWVBFOgorCQlrZnJlZV9jb25zdChjb25maWctPnRlc3RfZnMpOworCQljb25maWctPnRlc3RfZnMgPSBOVUxMOworCQljb3BpZWQgPSBjb25maWdfY29weV90ZXN0X2ZzKGNvbmZpZywgdGVzdF9zdHIsCisJCQkJCSAgICAgc3RybGVuKHRlc3Rfc3RyKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNvbmZpZy0+dGVzdF9jYXNlID0gdGVzdF9jYXNlOworCisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKworCWlmIChjb3BpZWQgPD0gMCB8fCBjb3BpZWQgIT0gc3RybGVuKHRlc3Rfc3RyKSkgeworCQl0ZXN0X2Rldi0+dGVzdF9pc19vb20gPSB0cnVlOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0ZXN0X2Rldi0+dGVzdF9pc19vb20gPSBmYWxzZTsKKworCXJldHVybiB0cmlnZ2VyX2NvbmZpZ19ydW4odGVzdF9kZXYpOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3Rlc3RfZGV2X2luZm8oc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2KQoreworCXZmcmVlKHRlc3RfZGV2LT5pbmZvKTsKKwl0ZXN0X2Rldi0+aW5mbyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQga21vZF9jb25maWdfc3luY19pbmZvKHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldikKK3sKKwlzdHJ1Y3QgdGVzdF9jb25maWcgKmNvbmZpZyA9ICZ0ZXN0X2Rldi0+Y29uZmlnOworCisJZnJlZV90ZXN0X2Rldl9pbmZvKHRlc3RfZGV2KTsKKwl0ZXN0X2Rldi0+aW5mbyA9IHZ6YWxsb2MoY29uZmlnLT5udW1fdGhyZWFkcyAqCisJCQkJIHNpemVvZihzdHJ1Y3Qga21vZF90ZXN0X2RldmljZV9pbmZvKSk7CisJaWYgKCF0ZXN0X2Rldi0+aW5mbykgeworCQlkZXZfZXJyKHRlc3RfZGV2LT5kZXYsICJDYW5ub3QgYWxsb2MgdGVzdF9kZXYgaW5mb1xuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogT2xkIGtlcm5lbHMgbWF5IG5vdCBoYXZlIHRoaXMsIGlmIHlvdSB3YW50IHRvIHBvcnQgdGhpcyBjb2RlIHRvCisgKiB0ZXN0IGl0IG9uIG9sZGVyIGtlcm5lbHMuCisgKi8KKyNpZmRlZiBnZXRfa21vZF91bWhfbGltaXQKK3N0YXRpYyB1bnNpZ25lZCBpbnQga21vZF9pbml0X3Rlc3RfdGhyZWFkX2xpbWl0KHZvaWQpCit7CisJcmV0dXJuIGdldF9rbW9kX3VtaF9saW1pdCgpOworfQorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBpbnQga21vZF9pbml0X3Rlc3RfdGhyZWFkX2xpbWl0KHZvaWQpCit7CisJcmV0dXJuIFRFU1RfU1RBUlRfTlVNX1RIUkVBRFM7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBfX2ttb2RfY29uZmlnX2luaXQoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2KQoreworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisJaW50IHJldCA9IC1FTk9NRU0sIGNvcGllZDsKKworCV9fa21vZF9jb25maWdfZnJlZShjb25maWcpOworCisJY29waWVkID0gY29uZmlnX2NvcHlfdGVzdF9kcml2ZXJfbmFtZShjb25maWcsIFRFU1RfU1RBUlRfRFJJVkVSLAorCQkJCQkgICAgICBzdHJsZW4oVEVTVF9TVEFSVF9EUklWRVIpKTsKKwlpZiAoY29waWVkICE9IHN0cmxlbihURVNUX1NUQVJUX0RSSVZFUikpCisJCWdvdG8gZXJyX291dDsKKworCWNvcGllZCA9IGNvbmZpZ19jb3B5X3Rlc3RfZnMoY29uZmlnLCBURVNUX1NUQVJUX1RFU1RfRlMsCisJCQkJICAgICBzdHJsZW4oVEVTVF9TVEFSVF9URVNUX0ZTKSk7CisJaWYgKGNvcGllZCAhPSBzdHJsZW4oVEVTVF9TVEFSVF9URVNUX0ZTKSkKKwkJZ290byBlcnJfb3V0OworCisJY29uZmlnLT5udW1fdGhyZWFkcyA9IGttb2RfaW5pdF90ZXN0X3RocmVhZF9saW1pdCgpOworCWNvbmZpZy0+dGVzdF9yZXN1bHQgPSAwOworCWNvbmZpZy0+dGVzdF9jYXNlID0gVEVTVF9TVEFSVF9URVNUX0NBU0U7CisKKwlyZXQgPSBrbW9kX2NvbmZpZ19zeW5jX2luZm8odGVzdF9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX291dDsKKworCXRlc3RfZGV2LT50ZXN0X2lzX29vbSA9IGZhbHNlOworCisJcmV0dXJuIDA7CisKK2Vycl9vdXQ6CisJdGVzdF9kZXYtPnRlc3RfaXNfb29tID0gdHJ1ZTsKKwlXQVJOX09OKHRlc3RfZGV2LT50ZXN0X2lzX29vbSk7CisKKwlfX2ttb2RfY29uZmlnX2ZyZWUoY29uZmlnKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJlc2V0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gZGV2X3RvX3Rlc3RfZGV2KGRldik7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJnRlc3RfZGV2LT50cmlnZ2VyX211dGV4KTsKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKworCXJldCA9IF9fa21vZF9jb25maWdfaW5pdCh0ZXN0X2Rldik7CisJaWYgKHJldCA8IDApIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgYWxsb2Mgc2V0dGluZ3MgZm9yIGNvbmZpZyB0cmlnZ2VyOiAlZFxuIiwKKwkJICAgICAgIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCWRldl9pbmZvKGRldiwgInJlc2V0XG4iKTsKKwlyZXQgPSBjb3VudDsKKworb3V0OgorCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+dHJpZ2dlcl9tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorc3RhdGljIERFVklDRV9BVFRSX1dPKHJlc2V0KTsKKworc3RhdGljIGludCB0ZXN0X2Rldl9jb25maWdfdXBkYXRlX3VpbnRfc3luYyhzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYsCisJCQkJCSAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplLAorCQkJCQkgICAgdW5zaWduZWQgaW50ICpjb25maWcsCisJCQkJCSAgICBpbnQgKCp0ZXN0X3N5bmMpKHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldikpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIG5ldzsKKwl1bnNpZ25lZCBpbnQgb2xkX3ZhbDsKKworCXJldCA9IGtzdHJ0b3VsKGJ1ZiwgMTAsICZuZXcpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAobmV3ID4gVUlOVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisKKwlvbGRfdmFsID0gKmNvbmZpZzsKKwkqKHVuc2lnbmVkIGludCAqKWNvbmZpZyA9IG5ldzsKKworCXJldCA9IHRlc3Rfc3luYyh0ZXN0X2Rldik7CisJaWYgKHJldCkgeworCQkqKHVuc2lnbmVkIGludCAqKWNvbmZpZyA9IG9sZF92YWw7CisKKwkJcmV0ID0gdGVzdF9zeW5jKHRlc3RfZGV2KTsKKwkJV0FSTl9PTihyZXQpOworCisJCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJLyogQWx3YXlzIHJldHVybiBmdWxsIHdyaXRlIHNpemUgZXZlbiBpZiB3ZSBkaWRuJ3QgY29uc3VtZSBhbGwgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCB0ZXN0X2Rldl9jb25maWdfdXBkYXRlX3VpbnRfcmFuZ2Uoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2LAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsCisJCQkJCSAgICAgdW5zaWduZWQgaW50ICpjb25maWcsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IG1pbiwKKwkJCQkJICAgICB1bnNpZ25lZCBpbnQgbWF4KQoreworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBuZXc7CisKKwlyZXQgPSBrc3RydG91bChidWYsIDEwLCAmbmV3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ldyA8IG1pbiB8fCBuZXcgPiBtYXgpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJKmNvbmZpZyA9IG5ldzsKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCisJLyogQWx3YXlzIHJldHVybiBmdWxsIHdyaXRlIHNpemUgZXZlbiBpZiB3ZSBkaWRuJ3QgY29uc3VtZSBhbGwgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCB0ZXN0X2Rldl9jb25maWdfdXBkYXRlX2ludChzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYsCisJCQkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwKKwkJCQkgICAgICBpbnQgKmNvbmZpZykKK3sKKwlpbnQgcmV0OworCWxvbmcgbmV3OworCisJcmV0ID0ga3N0cnRvbChidWYsIDEwLCAmbmV3KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKG5ldyA8IElOVF9NSU4gfHwgbmV3ID4gSU5UX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKwkqY29uZmlnID0gbmV3OworCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJLyogQWx3YXlzIHJldHVybiBmdWxsIHdyaXRlIHNpemUgZXZlbiBpZiB3ZSBkaWRuJ3QgY29uc3VtZSBhbGwgKi8KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHNzaXplX3QgdGVzdF9kZXZfY29uZmlnX3Nob3dfaW50KHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiwKKwkJCQkJY2hhciAqYnVmLAorCQkJCQlpbnQgY29uZmlnKQoreworCWludCB2YWw7CisKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKwl2YWwgPSBjb25maWc7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCB2YWwpOworfQorCitzdGF0aWMgc3NpemVfdCB0ZXN0X2Rldl9jb25maWdfc2hvd191aW50KHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiwKKwkJCQkJIGNoYXIgKmJ1ZiwKKwkJCQkJIHVuc2lnbmVkIGludCBjb25maWcpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKworCW11dGV4X2xvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCXZhbCA9IGNvbmZpZzsKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRlc3RfcmVzdWx0X3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlyZXR1cm4gdGVzdF9kZXZfY29uZmlnX3VwZGF0ZV9pbnQodGVzdF9kZXYsIGJ1ZiwgY291bnQsCisJCQkJCSAgJmNvbmZpZy0+dGVzdF9yZXN1bHQpOworfQorCitzdGF0aWMgc3NpemVfdCBjb25maWdfbnVtX3RocmVhZHNfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2ID0gZGV2X3RvX3Rlc3RfZGV2KGRldik7CisJc3RydWN0IHRlc3RfY29uZmlnICpjb25maWcgPSAmdGVzdF9kZXYtPmNvbmZpZzsKKworCXJldHVybiB0ZXN0X2Rldl9jb25maWdfdXBkYXRlX3VpbnRfc3luYyh0ZXN0X2RldiwgYnVmLCBjb3VudCwKKwkJCQkJCSZjb25maWctPm51bV90aHJlYWRzLAorCQkJCQkJa21vZF9jb25maWdfc3luY19pbmZvKTsKK30KKworc3RhdGljIHNzaXplX3QgY29uZmlnX251bV90aHJlYWRzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlyZXR1cm4gdGVzdF9kZXZfY29uZmlnX3Nob3dfaW50KHRlc3RfZGV2LCBidWYsIGNvbmZpZy0+bnVtX3RocmVhZHMpOworfQorc3RhdGljIERFVklDRV9BVFRSKGNvbmZpZ19udW1fdGhyZWFkcywgMDY0NCwgY29uZmlnX251bV90aHJlYWRzX3Nob3csCisJCSAgIGNvbmZpZ19udW1fdGhyZWFkc19zdG9yZSk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbmZpZ190ZXN0X2Nhc2Vfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlyZXR1cm4gdGVzdF9kZXZfY29uZmlnX3VwZGF0ZV91aW50X3JhbmdlKHRlc3RfZGV2LCBidWYsIGNvdW50LAorCQkJCQkJICZjb25maWctPnRlc3RfY2FzZSwKKwkJCQkJCSBfX1RFU1RfS01PRF9JTlZBTElEICsgMSwKKwkJCQkJCSBfX1RFU1RfS01PRF9NQVggLSAxKTsKK30KKworc3RhdGljIHNzaXplX3QgY29uZmlnX3Rlc3RfY2FzZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlyZXR1cm4gdGVzdF9kZXZfY29uZmlnX3Nob3dfdWludCh0ZXN0X2RldiwgYnVmLCBjb25maWctPnRlc3RfY2FzZSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoY29uZmlnX3Rlc3RfY2FzZSwgMDY0NCwgY29uZmlnX3Rlc3RfY2FzZV9zaG93LAorCQkgICBjb25maWdfdGVzdF9jYXNlX3N0b3JlKTsKKworc3RhdGljIHNzaXplX3QgdGVzdF9yZXN1bHRfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldiA9IGRldl90b190ZXN0X2RldihkZXYpOworCXN0cnVjdCB0ZXN0X2NvbmZpZyAqY29uZmlnID0gJnRlc3RfZGV2LT5jb25maWc7CisKKwlyZXR1cm4gdGVzdF9kZXZfY29uZmlnX3Nob3dfaW50KHRlc3RfZGV2LCBidWYsIGNvbmZpZy0+dGVzdF9yZXN1bHQpOworfQorc3RhdGljIERFVklDRV9BVFRSKHRlc3RfcmVzdWx0LCAwNjQ0LCB0ZXN0X3Jlc3VsdF9zaG93LCB0ZXN0X3Jlc3VsdF9zdG9yZSk7CisKKyNkZWZpbmUgVEVTVF9LTU9EX0RFVl9BVFRSKG5hbWUpCQkmZGV2X2F0dHJfIyNuYW1lLmF0dHIKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnRlc3RfZGV2X2F0dHJzW10gPSB7CisJVEVTVF9LTU9EX0RFVl9BVFRSKHRyaWdnZXJfY29uZmlnKSwKKwlURVNUX0tNT0RfREVWX0FUVFIoY29uZmlnKSwKKwlURVNUX0tNT0RfREVWX0FUVFIocmVzZXQpLAorCisJVEVTVF9LTU9EX0RFVl9BVFRSKGNvbmZpZ190ZXN0X2RyaXZlciksCisJVEVTVF9LTU9EX0RFVl9BVFRSKGNvbmZpZ190ZXN0X2ZzKSwKKwlURVNUX0tNT0RfREVWX0FUVFIoY29uZmlnX251bV90aHJlYWRzKSwKKwlURVNUX0tNT0RfREVWX0FUVFIoY29uZmlnX3Rlc3RfY2FzZSksCisJVEVTVF9LTU9EX0RFVl9BVFRSKHRlc3RfcmVzdWx0KSwKKworCU5VTEwsCit9OworCitBVFRSSUJVVEVfR1JPVVBTKHRlc3RfZGV2KTsKKworc3RhdGljIGludCBrbW9kX2NvbmZpZ19pbml0KHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICp0ZXN0X2RldikKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJcmV0ID0gX19rbW9kX2NvbmZpZ19pbml0KHRlc3RfZGV2KTsKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBrbW9kX3Rlc3RfZGV2aWNlICphbGxvY190ZXN0X2Rldl9rbW9kKGludCBpZHgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXY7CisJc3RydWN0IG1pc2NkZXZpY2UgKm1pc2NfZGV2OworCisJdGVzdF9kZXYgPSB2emFsbG9jKHNpemVvZihzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSkpOworCWlmICghdGVzdF9kZXYpIHsKKwkJcHJfZXJyKCJDYW5ub3QgYWxsb2MgdGVzdF9kZXZcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJbXV0ZXhfaW5pdCgmdGVzdF9kZXYtPmNvbmZpZ19tdXRleCk7CisJbXV0ZXhfaW5pdCgmdGVzdF9kZXYtPnRyaWdnZXJfbXV0ZXgpOworCW11dGV4X2luaXQoJnRlc3RfZGV2LT50aHJlYWRfbXV0ZXgpOworCisJaW5pdF9jb21wbGV0aW9uKCZ0ZXN0X2Rldi0+a3RocmVhZHNfZG9uZSk7CisKKwlyZXQgPSBrbW9kX2NvbmZpZ19pbml0KHRlc3RfZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIkNhbm5vdCBhbGxvYyBrbW9kX2NvbmZpZ19pbml0KClcbiIpOworCQlnb3RvIGVycl9vdXRfZnJlZTsKKwl9CisKKwl0ZXN0X2Rldi0+ZGV2X2lkeCA9IGlkeDsKKwltaXNjX2RldiA9ICZ0ZXN0X2Rldi0+bWlzY19kZXY7CisKKwltaXNjX2Rldi0+bWlub3IgPSBNSVNDX0RZTkFNSUNfTUlOT1I7CisJbWlzY19kZXYtPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInRlc3Rfa21vZCVkIiwgaWR4KTsKKwlpZiAoIW1pc2NfZGV2LT5uYW1lKSB7CisJCXByX2VycigiQ2Fubm90IGFsbG9jIG1pc2NfZGV2LT5uYW1lXG4iKTsKKwkJZ290byBlcnJfb3V0X2ZyZWVfY29uZmlnOworCX0KKwltaXNjX2Rldi0+Z3JvdXBzID0gdGVzdF9kZXZfZ3JvdXBzOworCisJcmV0dXJuIHRlc3RfZGV2OworCitlcnJfb3V0X2ZyZWVfY29uZmlnOgorCWZyZWVfdGVzdF9kZXZfaW5mbyh0ZXN0X2Rldik7CisJa21vZF9jb25maWdfZnJlZSh0ZXN0X2Rldik7CitlcnJfb3V0X2ZyZWU6CisJdmZyZWUodGVzdF9kZXYpOworCXRlc3RfZGV2ID0gTlVMTDsKK2Vycl9vdXQ6CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfdGVzdF9kZXZfa21vZChzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYpCit7CisJaWYgKHRlc3RfZGV2KSB7CisJCWtmcmVlX2NvbnN0KHRlc3RfZGV2LT5taXNjX2Rldi5uYW1lKTsKKwkJdGVzdF9kZXYtPm1pc2NfZGV2Lm5hbWUgPSBOVUxMOworCQlmcmVlX3Rlc3RfZGV2X2luZm8odGVzdF9kZXYpOworCQlrbW9kX2NvbmZpZ19mcmVlKHRlc3RfZGV2KTsKKwkJdmZyZWUodGVzdF9kZXYpOworCQl0ZXN0X2RldiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnJlZ2lzdGVyX3Rlc3RfZGV2X2ttb2Qodm9pZCkKK3sKKwlzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXYgPSBOVUxMOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZyZWdfZGV2X211dGV4KTsKKworCS8qIGludCBzaG91bGQgc3VmZmljZSBmb3IgbnVtYmVyIG9mIGRldmljZXMsIHRlc3QgZm9yIHdyYXAgKi8KKwlpZiAobnVtX3Rlc3RfZGV2cyArIDEgPT0gSU5UX01BWCkgeworCQlwcl9lcnIoInJlYWNoZWQgbGltaXQgb2YgbnVtYmVyIG9mIHRlc3QgZGV2aWNlc1xuIik7CisJCWdvdG8gb3V0OworCX0KKworCXRlc3RfZGV2ID0gYWxsb2NfdGVzdF9kZXZfa21vZChudW1fdGVzdF9kZXZzKTsKKwlpZiAoIXRlc3RfZGV2KQorCQlnb3RvIG91dDsKKworCXJldCA9IG1pc2NfcmVnaXN0ZXIoJnRlc3RfZGV2LT5taXNjX2Rldik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoImNvdWxkIG5vdCByZWdpc3RlciBtaXNjIGRldmljZTogJWRcbiIsIHJldCk7CisJCWZyZWVfdGVzdF9kZXZfa21vZCh0ZXN0X2Rldik7CisJCWdvdG8gb3V0OworCX0KKworCXRlc3RfZGV2LT5kZXYgPSB0ZXN0X2Rldi0+bWlzY19kZXYudGhpc19kZXZpY2U7CisJbGlzdF9hZGRfdGFpbCgmdGVzdF9kZXYtPmxpc3QsICZyZWdfdGVzdF9kZXZzKTsKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAiaW50ZXJmYWNlIHJlYWR5XG4iKTsKKworCW51bV90ZXN0X2RldnMrKzsKKworb3V0OgorCW11dGV4X3VubG9jaygmcmVnX2Rldl9tdXRleCk7CisKKwlyZXR1cm4gdGVzdF9kZXY7CisKK30KKworc3RhdGljIGludCBfX2luaXQgdGVzdF9rbW9kX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qga21vZF90ZXN0X2RldmljZSAqdGVzdF9kZXY7CisJaW50IHJldDsKKworCXRlc3RfZGV2ID0gcmVnaXN0ZXJfdGVzdF9kZXZfa21vZCgpOworCWlmICghdGVzdF9kZXYpIHsKKwkJcHJfZXJyKCJDYW5ub3QgYWRkIGZpcnN0IHRlc3Qga21vZCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKgorCSAqIFdpdGggc29tZSB3b3JrIHdlIG1pZ2h0IGJlIGFibGUgdG8gZ3JhY2VmdWxseSBlbmFibGUKKwkgKiB0ZXN0aW5nIHdpdGggdGhpcyBkcml2ZXIgYnVpbHQtaW4sIGZvciBub3cgdGhpcyBzZWVtcworCSAqIHJhdGhlciByaXNreS4gRm9yIHRob3NlIHdpbGxpbmcgdG8gdHJ5IGhhdmUgYXQgaXQsCisJICogYW5kIGVuYWJsZSB0aGUgYmVsb3cuIEdvb2QgbHVjayEgSWYgdGhhdCB3b3JrcywgdHJ5CisJICogbG93ZXJpbmcgdGhlIGluaXQgbGV2ZWwgZm9yIG1vcmUgZnVuLgorCSAqLworCWlmIChmb3JjZV9pbml0X3Rlc3QpIHsKKwkJcmV0ID0gdHJpZ2dlcl9jb25maWdfcnVuX3R5cGUodGVzdF9kZXYsCisJCQkJCSAgICAgIFRFU1RfS01PRF9EUklWRVIsICJ0dW4iKTsKKwkJaWYgKFdBUk5fT04ocmV0KSkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHRyaWdnZXJfY29uZmlnX3J1bl90eXBlKHRlc3RfZGV2LAorCQkJCQkgICAgICBURVNUX0tNT0RfRlNfVFlQRSwgImJ0cmZzIik7CisJCWlmIChXQVJOX09OKHJldCkpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbCh0ZXN0X2ttb2RfaW5pdCk7CisKK3N0YXRpYwordm9pZCB1bnJlZ2lzdGVyX3Rlc3RfZGV2X2ttb2Qoc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2KQoreworCW11dGV4X2xvY2soJnRlc3RfZGV2LT50cmlnZ2VyX211dGV4KTsKKwltdXRleF9sb2NrKCZ0ZXN0X2Rldi0+Y29uZmlnX211dGV4KTsKKworCXRlc3RfZGV2X2ttb2Rfc3RvcF90ZXN0cyh0ZXN0X2Rldik7CisKKwlkZXZfaW5mbyh0ZXN0X2Rldi0+ZGV2LCAicmVtb3ZpbmcgaW50ZXJmYWNlXG4iKTsKKwltaXNjX2RlcmVnaXN0ZXIoJnRlc3RfZGV2LT5taXNjX2Rldik7CisKKwltdXRleF91bmxvY2soJnRlc3RfZGV2LT5jb25maWdfbXV0ZXgpOworCW11dGV4X3VubG9jaygmdGVzdF9kZXYtPnRyaWdnZXJfbXV0ZXgpOworCisJZnJlZV90ZXN0X2Rldl9rbW9kKHRlc3RfZGV2KTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRlc3Rfa21vZF9leGl0KHZvaWQpCit7CisJc3RydWN0IGttb2RfdGVzdF9kZXZpY2UgKnRlc3RfZGV2LCAqdG1wOworCisJbXV0ZXhfbG9jaygmcmVnX2Rldl9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRlc3RfZGV2LCB0bXAsICZyZWdfdGVzdF9kZXZzLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZ0ZXN0X2Rldi0+bGlzdCk7CisJCXVucmVnaXN0ZXJfdGVzdF9kZXZfa21vZCh0ZXN0X2Rldik7CisJfQorCW11dGV4X3VubG9jaygmcmVnX2Rldl9tdXRleCk7Cit9Cittb2R1bGVfZXhpdCh0ZXN0X2ttb2RfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAa2VybmVsLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfbGlzdF9zb3J0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2xpc3Rfc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTgxNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X2xpc3Rfc29ydC5jCkBAIC0wLDAgKzEsMTUwIEBACisjZGVmaW5lIHByX2ZtdChmbXQpICJsaXN0X3NvcnRfdGVzdDogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3Rfc29ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisKKy8qCisgKiBUaGUgcGF0dGVybiBvZiBzZXQgYml0cyBpbiB0aGUgbGlzdCBsZW5ndGggZGV0ZXJtaW5lcyB3aGljaCBjYXNlcworICogYXJlIGhpdCBpbiBsaXN0X3NvcnQoKS4KKyAqLworI2RlZmluZSBURVNUX0xJU1RfTEVOICg1MTIrMTI4KzIpIC8qIG5vdCBpbmNsdWRpbmcgaGVhZCAqLworCisjZGVmaW5lIFRFU1RfUE9JU09OMSAweERFQURCRUVGCisjZGVmaW5lIFRFU1RfUE9JU09OMiAweEEzMjQzNTRDCisKK3N0cnVjdCBkZWJ1Z19lbCB7CisJdW5zaWduZWQgaW50IHBvaXNvbjE7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBwb2lzb24yOworCWludCB2YWx1ZTsKKwl1bnNpZ25lZCBzZXJpYWw7Cit9OworCisvKiBBcnJheSwgY29udGFpbmluZyBwb2ludGVycyB0byBhbGwgZWxlbWVudHMgaW4gdGhlIHRlc3QgbGlzdCAqLworc3RhdGljIHN0cnVjdCBkZWJ1Z19lbCAqKmVsdHMgX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX2luaXQgY2hlY2soc3RydWN0IGRlYnVnX2VsICplbGEsIHN0cnVjdCBkZWJ1Z19lbCAqZWxiKQoreworCWlmIChlbGEtPnNlcmlhbCA+PSBURVNUX0xJU1RfTEVOKSB7CisJCXByX2VycigiZXJyb3I6IGluY29ycmVjdCBzZXJpYWwgJWRcbiIsIGVsYS0+c2VyaWFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlbGItPnNlcmlhbCA+PSBURVNUX0xJU1RfTEVOKSB7CisJCXByX2VycigiZXJyb3I6IGluY29ycmVjdCBzZXJpYWwgJWRcbiIsIGVsYi0+c2VyaWFsKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlbHRzW2VsYS0+c2VyaWFsXSAhPSBlbGEgfHwgZWx0c1tlbGItPnNlcmlhbF0gIT0gZWxiKSB7CisJCXByX2VycigiZXJyb3I6IHBoYW50b20gZWxlbWVudFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZWxhLT5wb2lzb24xICE9IFRFU1RfUE9JU09OMSB8fCBlbGEtPnBvaXNvbjIgIT0gVEVTVF9QT0lTT04yKSB7CisJCXByX2VycigiZXJyb3I6IGJhZCBwb2lzb246ICUjeC8lI3hcbiIsCisJCQllbGEtPnBvaXNvbjEsIGVsYS0+cG9pc29uMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZWxiLT5wb2lzb24xICE9IFRFU1RfUE9JU09OMSB8fCBlbGItPnBvaXNvbjIgIT0gVEVTVF9QT0lTT04yKSB7CisJCXByX2VycigiZXJyb3I6IGJhZCBwb2lzb246ICUjeC8lI3hcbiIsCisJCQllbGItPnBvaXNvbjEsIGVsYi0+cG9pc29uMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgY21wKHZvaWQgKnByaXYsIHN0cnVjdCBsaXN0X2hlYWQgKmEsIHN0cnVjdCBsaXN0X2hlYWQgKmIpCit7CisJc3RydWN0IGRlYnVnX2VsICplbGEsICplbGI7CisKKwllbGEgPSBjb250YWluZXJfb2YoYSwgc3RydWN0IGRlYnVnX2VsLCBsaXN0KTsKKwllbGIgPSBjb250YWluZXJfb2YoYiwgc3RydWN0IGRlYnVnX2VsLCBsaXN0KTsKKworCWNoZWNrKGVsYSwgZWxiKTsKKwlyZXR1cm4gZWxhLT52YWx1ZSAtIGVsYi0+dmFsdWU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGxpc3Rfc29ydF90ZXN0KHZvaWQpCit7CisJaW50IGksIGNvdW50ID0gMSwgZXJyID0gLUVOT01FTTsKKwlzdHJ1Y3QgZGVidWdfZWwgKmVsOworCXN0cnVjdCBsaXN0X2hlYWQgKmN1cjsKKwlMSVNUX0hFQUQoaGVhZCk7CisKKwlwcl9kZWJ1Zygic3RhcnQgdGVzdGluZyBsaXN0X3NvcnQoKVxuIik7CisKKwllbHRzID0ga2NhbGxvYyhURVNUX0xJU1RfTEVOLCBzaXplb2YoKmVsdHMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsdHMpIHsKKwkJcHJfZXJyKCJlcnJvcjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJZm9yIChpID0gMDsgaSA8IFRFU1RfTElTVF9MRU47IGkrKykgeworCQllbCA9IGttYWxsb2Moc2l6ZW9mKCplbCksIEdGUF9LRVJORUwpOworCQlpZiAoIWVsKSB7CisJCQlwcl9lcnIoImVycm9yOiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCQkgLyogZm9yY2Ugc29tZSBlcXVpdmFsZW5jaWVzICovCisJCWVsLT52YWx1ZSA9IHByYW5kb21fdTMyKCkgJSAoVEVTVF9MSVNUX0xFTiAvIDMpOworCQllbC0+c2VyaWFsID0gaTsKKwkJZWwtPnBvaXNvbjEgPSBURVNUX1BPSVNPTjE7CisJCWVsLT5wb2lzb24yID0gVEVTVF9QT0lTT04yOworCQllbHRzW2ldID0gZWw7CisJCWxpc3RfYWRkX3RhaWwoJmVsLT5saXN0LCAmaGVhZCk7CisJfQorCisJbGlzdF9zb3J0KE5VTEwsICZoZWFkLCBjbXApOworCisJZXJyID0gLUVJTlZBTDsKKwlmb3IgKGN1ciA9IGhlYWQubmV4dDsgY3VyLT5uZXh0ICE9ICZoZWFkOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJc3RydWN0IGRlYnVnX2VsICplbDE7CisJCWludCBjbXBfcmVzdWx0OworCisJCWlmIChjdXItPm5leHQtPnByZXYgIT0gY3VyKSB7CisJCQlwcl9lcnIoImVycm9yOiBsaXN0IGlzIGNvcnJ1cHRlZFxuIik7CisJCQlnb3RvIGV4aXQ7CisJCX0KKworCQljbXBfcmVzdWx0ID0gY21wKE5VTEwsIGN1ciwgY3VyLT5uZXh0KTsKKwkJaWYgKGNtcF9yZXN1bHQgPiAwKSB7CisJCQlwcl9lcnIoImVycm9yOiBsaXN0IGlzIG5vdCBzb3J0ZWRcbiIpOworCQkJZ290byBleGl0OworCQl9CisKKwkJZWwgPSBjb250YWluZXJfb2YoY3VyLCBzdHJ1Y3QgZGVidWdfZWwsIGxpc3QpOworCQllbDEgPSBjb250YWluZXJfb2YoY3VyLT5uZXh0LCBzdHJ1Y3QgZGVidWdfZWwsIGxpc3QpOworCQlpZiAoY21wX3Jlc3VsdCA9PSAwICYmIGVsLT5zZXJpYWwgPj0gZWwxLT5zZXJpYWwpIHsKKwkJCXByX2VycigiZXJyb3I6IG9yZGVyIG9mIGVxdWl2YWxlbnQgZWxlbWVudHMgbm90ICIKKwkJCQkicHJlc2VydmVkXG4iKTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCisJCWlmIChjaGVjayhlbCwgZWwxKSkgeworCQkJcHJfZXJyKCJlcnJvcjogZWxlbWVudCBjaGVjayBmYWlsZWRcbiIpOworCQkJZ290byBleGl0OworCQl9CisJCWNvdW50Kys7CisJfQorCWlmIChoZWFkLnByZXYgIT0gY3VyKSB7CisJCXByX2VycigiZXJyb3I6IGxpc3QgaXMgY29ycnVwdGVkXG4iKTsKKwkJZ290byBleGl0OworCX0KKworCisJaWYgKGNvdW50ICE9IFRFU1RfTElTVF9MRU4pIHsKKwkJcHJfZXJyKCJlcnJvcjogYmFkIGxpc3QgbGVuZ3RoICVkIiwgY291bnQpOworCQlnb3RvIGV4aXQ7CisJfQorCisJZXJyID0gMDsKK2V4aXQ6CisJZm9yIChpID0gMDsgaSA8IFRFU1RfTElTVF9MRU47IGkrKykKKwkJa2ZyZWUoZWx0c1tpXSk7CisJa2ZyZWUoZWx0cyk7CisJcmV0dXJuIGVycjsKK30KK21vZHVsZV9pbml0KGxpc3Rfc29ydF90ZXN0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfbW9kdWxlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X21vZHVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOWI2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X21vZHVsZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBUaGlzIG1vZHVsZSBlbWl0cyAiSGVsbG8sIHdvcmxkIiBvbiBwcmludGsgd2hlbiBsb2FkZWQuCisgKgorICogSXQgaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBmb3IgYmFzaWMgZXZhbHVhdGlvbiBvZiB0aGUgbW9kdWxlIGxvYWRpbmcKKyAqIHN1YnN5c3RlbSAoZm9yIGV4YW1wbGUgd2hlbiB2YWxpZGF0aW5nIG1vZHVsZSBzaWduaW5nL3ZlcmlmaWNhdGlvbikuIEl0CisgKiBsYWNrcyBhbnkgZXh0cmEgZGVwZW5kZW5jaWVzLCBhbmQgd2lsbCBub3Qgbm9ybWFsbHkgYmUgbG9hZGVkIGJ5IHRoZQorICogc3lzdGVtIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSBuYW1lLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworc3RhdGljIGludCBfX2luaXQgdGVzdF9tb2R1bGVfaW5pdCh2b2lkKQoreworCXByX3dhcm4oIkhlbGxvLCB3b3JsZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworbW9kdWxlX2luaXQodGVzdF9tb2R1bGVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X21vZHVsZV9leGl0KHZvaWQpCit7CisJcHJfd2FybigiR29vZGJ5ZVxuIik7Cit9CisKK21vZHVsZV9leGl0KHRlc3RfbW9kdWxlX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJLZWVzIENvb2sgPGtlZXNjb29rQGNocm9taXVtLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfcGFybWFuLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3Bhcm1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZTMyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3Bhcm1hbi5jCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogbGliL3Rlc3RfcGFybWFuLmMgLSBUZXN0IG1vZHVsZSBmb3IgcGFybWFuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcgTWVsbGFub3ggVGVjaG5vbG9naWVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE3IEppcmkgUGlya28gPGppcmlAbWVsbGFub3guY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZXMgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvcGFybWFuLmg+CisKKyNkZWZpbmUgVEVTVF9QQVJNQU5fUFJJT19TSElGVCA3IC8qIGRlZmluZXMgbnVtYmVyIG9mIHByaW9zIGZvciB0ZXN0aW5nICovCisjZGVmaW5lIFRFU1RfUEFSTUFOX1BSSU9fQ09VTlQgQklUKFRFU1RfUEFSTUFOX1BSSU9fU0hJRlQpCisjZGVmaW5lIFRFU1RfUEFSTUFOX1BSSU9fTUFTSyAoVEVTVF9QQVJNQU5fUFJJT19DT1VOVCAtIDEpCisKKyNkZWZpbmUgVEVTVF9QQVJNQU5fSVRFTV9TSElGVCAxMyAvKiBkZWZpbmVzIGEgdG90YWwgbnVtYmVyCisJCQkJICAgKiBvZiBpdGVtcyBmb3IgdGVzdGluZworCQkJCSAgICovCisjZGVmaW5lIFRFU1RfUEFSTUFOX0lURU1fQ09VTlQgQklUKFRFU1RfUEFSTUFOX0lURU1fU0hJRlQpCisjZGVmaW5lIFRFU1RfUEFSTUFOX0lURU1fTUFTSyAoVEVTVF9QQVJNQU5fSVRFTV9DT1VOVCAtIDEpCisKKyNkZWZpbmUgVEVTVF9QQVJNQU5fQkFTRV9TSElGVCA4CisjZGVmaW5lIFRFU1RfUEFSTUFOX0JBU0VfQ09VTlQgQklUKFRFU1RfUEFSTUFOX0JBU0VfU0hJRlQpCisjZGVmaW5lIFRFU1RfUEFSTUFOX1JFU0laRV9TVEVQX1NISUZUIDcKKyNkZWZpbmUgVEVTVF9QQVJNQU5fUkVTSVpFX1NURVBfQ09VTlQgQklUKFRFU1RfUEFSTUFOX1JFU0laRV9TVEVQX1NISUZUKQorCisjZGVmaW5lIFRFU1RfUEFSTUFOX0JVTEtfTUFYX1NISUZUICgyICsgVEVTVF9QQVJNQU5fUkVTSVpFX1NURVBfU0hJRlQpCisjZGVmaW5lIFRFU1RfUEFSTUFOX0JVTEtfTUFYX0NPVU5UIEJJVChURVNUX1BBUk1BTl9CVUxLX01BWF9TSElGVCkKKyNkZWZpbmUgVEVTVF9QQVJNQU5fQlVMS19NQVhfTUFTSyAoVEVTVF9QQVJNQU5fQlVMS19NQVhfQ09VTlQgLSAxKQorCisjZGVmaW5lIFRFU1RfUEFSTUFOX1JVTl9CVURHRVQgKFRFU1RfUEFSTUFOX0lURU1fQ09VTlQgKiAyNTYpCisKK3N0cnVjdCB0ZXN0X3Bhcm1hbl9wcmlvIHsKKwlzdHJ1Y3QgcGFybWFuX3ByaW8gcGFybWFuX3ByaW87CisJdW5zaWduZWQgbG9uZyBwcmlvcml0eTsKK307CisKK3N0cnVjdCB0ZXN0X3Bhcm1hbl9pdGVtIHsKKwlzdHJ1Y3QgcGFybWFuX2l0ZW0gcGFybWFuX2l0ZW07CisJc3RydWN0IHRlc3RfcGFybWFuX3ByaW8gKnByaW87CisJYm9vbCB1c2VkOworfTsKKworc3RydWN0IHRlc3RfcGFybWFuIHsKKwlzdHJ1Y3QgcGFybWFuICpwYXJtYW47CisJc3RydWN0IHRlc3RfcGFybWFuX2l0ZW0gKipwcmlvX2FycmF5OworCXVuc2lnbmVkIGxvbmcgcHJpb19hcnJheV9saW1pdDsKKwlzdHJ1Y3QgdGVzdF9wYXJtYW5fcHJpbyBwcmlvc1tURVNUX1BBUk1BTl9QUklPX0NPVU5UXTsKKwlzdHJ1Y3QgdGVzdF9wYXJtYW5faXRlbSBpdGVtc1tURVNUX1BBUk1BTl9JVEVNX0NPVU5UXTsKKwlzdHJ1Y3Qgcm5kX3N0YXRlIHJuZDsKKwl1bnNpZ25lZCBsb25nIHJ1bl9idWRnZXQ7CisJdW5zaWduZWQgbG9uZyBidWxrX2J1ZGdldDsKKwlib29sIGJ1bGtfbm9vcDsKKwl1bnNpZ25lZCBpbnQgdXNlZF9pdGVtczsKK307CisKKyNkZWZpbmUgSVRFTV9QVFJTX1NJWkUoY291bnQpIChzaXplb2Yoc3RydWN0IHRlc3RfcGFybWFuX2l0ZW0gKikgKiAoY291bnQpKQorCitzdGF0aWMgaW50IHRlc3RfcGFybWFuX3Jlc2l6ZSh2b2lkICpwcml2LCB1bnNpZ25lZCBsb25nIG5ld19jb3VudCkKK3sKKwlzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuID0gcHJpdjsKKwlzdHJ1Y3QgdGVzdF9wYXJtYW5faXRlbSAqKnByaW9fYXJyYXk7CisJdW5zaWduZWQgbG9uZyBvbGRfY291bnQ7CisKKwlwcmlvX2FycmF5ID0ga3JlYWxsb2ModGVzdF9wYXJtYW4tPnByaW9fYXJyYXksCisJCQkgICAgICBJVEVNX1BUUlNfU0laRShuZXdfY291bnQpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3X2NvdW50ID09IDApCisJCXJldHVybiAwOworCWlmICghcHJpb19hcnJheSkKKwkJcmV0dXJuIC1FTk9NRU07CisJb2xkX2NvdW50ID0gdGVzdF9wYXJtYW4tPnByaW9fYXJyYXlfbGltaXQ7CisJaWYgKG5ld19jb3VudCA+IG9sZF9jb3VudCkKKwkJbWVtc2V0KCZwcmlvX2FycmF5W29sZF9jb3VudF0sIDAsCisJCSAgICAgICBJVEVNX1BUUlNfU0laRShuZXdfY291bnQgLSBvbGRfY291bnQpKTsKKwl0ZXN0X3Bhcm1hbi0+cHJpb19hcnJheSA9IHByaW9fYXJyYXk7CisJdGVzdF9wYXJtYW4tPnByaW9fYXJyYXlfbGltaXQgPSBuZXdfY291bnQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcGFybWFuX21vdmUodm9pZCAqcHJpdiwgdW5zaWduZWQgbG9uZyBmcm9tX2luZGV4LAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRvX2luZGV4LCB1bnNpZ25lZCBsb25nIGNvdW50KQoreworCXN0cnVjdCB0ZXN0X3Bhcm1hbiAqdGVzdF9wYXJtYW4gPSBwcml2OworCXN0cnVjdCB0ZXN0X3Bhcm1hbl9pdGVtICoqcHJpb19hcnJheSA9IHRlc3RfcGFybWFuLT5wcmlvX2FycmF5OworCisJbWVtbW92ZSgmcHJpb19hcnJheVt0b19pbmRleF0sICZwcmlvX2FycmF5W2Zyb21faW5kZXhdLAorCQlJVEVNX1BUUlNfU0laRShjb3VudCkpOworCW1lbXNldCgmcHJpb19hcnJheVtmcm9tX2luZGV4XSwgMCwgSVRFTV9QVFJTX1NJWkUoY291bnQpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwYXJtYW5fb3BzIHRlc3RfcGFybWFuX2xzb3J0X29wcyA9IHsKKwkuYmFzZV9jb3VudAk9IFRFU1RfUEFSTUFOX0JBU0VfQ09VTlQsCisJLnJlc2l6ZV9zdGVwCT0gVEVTVF9QQVJNQU5fUkVTSVpFX1NURVBfQ09VTlQsCisJLnJlc2l6ZQkJPSB0ZXN0X3Bhcm1hbl9yZXNpemUsCisJLm1vdmUJCT0gdGVzdF9wYXJtYW5fbW92ZSwKKwkuYWxnbwkJPSBQQVJNQU5fQUxHT19UWVBFX0xTT1JULAorfTsKKworc3RhdGljIHZvaWQgdGVzdF9wYXJtYW5fcm5kX2luaXQoc3RydWN0IHRlc3RfcGFybWFuICp0ZXN0X3Bhcm1hbikKK3sKKwlwcmFuZG9tX3NlZWRfc3RhdGUoJnRlc3RfcGFybWFuLT5ybmQsIDMxNDE1OTI2NTM1ODk3OTMyMzhVTEwpOworfQorCitzdGF0aWMgdTMyIHRlc3RfcGFybWFuX3JuZF9nZXQoc3RydWN0IHRlc3RfcGFybWFuICp0ZXN0X3Bhcm1hbikKK3sKKwlyZXR1cm4gcHJhbmRvbV91MzJfc3RhdGUoJnRlc3RfcGFybWFuLT5ybmQpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0ZXN0X3Bhcm1hbl9wcmlvcml0eV9nZW4oc3RydWN0IHRlc3RfcGFybWFuICp0ZXN0X3Bhcm1hbikKK3sKKwl1bnNpZ25lZCBsb25nIHByaW9yaXR5OworCWludCBpOworCithZ2FpbjoKKwlwcmlvcml0eSA9IHRlc3RfcGFybWFuX3JuZF9nZXQodGVzdF9wYXJtYW4pOworCWlmIChwcmlvcml0eSA9PSAwKQorCQlnb3RvIGFnYWluOworCisJZm9yIChpID0gMDsgaSA8IFRFU1RfUEFSTUFOX1BSSU9fQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgdGVzdF9wYXJtYW5fcHJpbyAqcHJpbyA9ICZ0ZXN0X3Bhcm1hbi0+cHJpb3NbaV07CisKKwkJaWYgKHByaW8tPnByaW9yaXR5ID09IDApCisJCQlicmVhazsKKwkJaWYgKHByaW8tPnByaW9yaXR5ID09IHByaW9yaXR5KQorCQkJZ290byBhZ2FpbjsKKwl9CisJcmV0dXJuIHByaW9yaXR5OworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3Bhcm1hbl9wcmlvc19pbml0KHN0cnVjdCB0ZXN0X3Bhcm1hbiAqdGVzdF9wYXJtYW4pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEVTVF9QQVJNQU5fUFJJT19DT1VOVDsgaSsrKSB7CisJCXN0cnVjdCB0ZXN0X3Bhcm1hbl9wcmlvICpwcmlvID0gJnRlc3RfcGFybWFuLT5wcmlvc1tpXTsKKworCQkvKiBBc3NpZ24gcmFuZG9tIHVuaXF1ZXVlIHByaW9yaXR5IHRvIGVhY2ggcHJpbyBzdHJ1Y3R1cmUgKi8KKwkJcHJpby0+cHJpb3JpdHkgPSB0ZXN0X3Bhcm1hbl9wcmlvcml0eV9nZW4odGVzdF9wYXJtYW4pOworCQlwYXJtYW5fcHJpb19pbml0KHRlc3RfcGFybWFuLT5wYXJtYW4sICZwcmlvLT5wYXJtYW5fcHJpbywKKwkJCQkgcHJpby0+cHJpb3JpdHkpOworCX0KK30KKworc3RhdGljIHZvaWQgdGVzdF9wYXJtYW5fcHJpb3NfZmluaShzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRFU1RfUEFSTUFOX1BSSU9fQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgdGVzdF9wYXJtYW5fcHJpbyAqcHJpbyA9ICZ0ZXN0X3Bhcm1hbi0+cHJpb3NbaV07CisKKwkJcGFybWFuX3ByaW9fZmluaSgmcHJpby0+cGFybWFuX3ByaW8pOworCX0KK30KKworc3RhdGljIHZvaWQgdGVzdF9wYXJtYW5faXRlbXNfaW5pdChzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFRFU1RfUEFSTUFOX0lURU1fQ09VTlQ7IGkrKykgeworCQlzdHJ1Y3QgdGVzdF9wYXJtYW5faXRlbSAqaXRlbSA9ICZ0ZXN0X3Bhcm1hbi0+aXRlbXNbaV07CisJCXVuc2lnbmVkIGludCBwcmlvX2luZGV4ID0gdGVzdF9wYXJtYW5fcm5kX2dldCh0ZXN0X3Bhcm1hbikgJgorCQkJCQkgIFRFU1RfUEFSTUFOX1BSSU9fTUFTSzsKKworCQkvKiBBc3NpZ24gcmFuZG9tIHByaW8gdG8gZWFjaCBpdGVtIHN0cnVjdHVyZSAqLworCQlpdGVtLT5wcmlvID0gJnRlc3RfcGFybWFuLT5wcmlvc1twcmlvX2luZGV4XTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfcGFybWFuX2l0ZW1zX2Zpbmkoc3RydWN0IHRlc3RfcGFybWFuICp0ZXN0X3Bhcm1hbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBURVNUX1BBUk1BTl9JVEVNX0NPVU5UOyBpKyspIHsKKwkJc3RydWN0IHRlc3RfcGFybWFuX2l0ZW0gKml0ZW0gPSAmdGVzdF9wYXJtYW4tPml0ZW1zW2ldOworCisJCWlmICghaXRlbS0+dXNlZCkKKwkJCWNvbnRpbnVlOworCQlwYXJtYW5faXRlbV9yZW1vdmUodGVzdF9wYXJtYW4tPnBhcm1hbiwKKwkJCQkgICAmaXRlbS0+cHJpby0+cGFybWFuX3ByaW8sCisJCQkJICAgJml0ZW0tPnBhcm1hbl9pdGVtKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuX2NyZWF0ZShjb25zdCBzdHJ1Y3QgcGFybWFuX29wcyAqb3BzKQoreworCXN0cnVjdCB0ZXN0X3Bhcm1hbiAqdGVzdF9wYXJtYW47CisJaW50IGVycjsKKworCXRlc3RfcGFybWFuID0ga3phbGxvYyhzaXplb2YoKnRlc3RfcGFybWFuKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0ZXN0X3Bhcm1hbikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJZXJyID0gdGVzdF9wYXJtYW5fcmVzaXplKHRlc3RfcGFybWFuLCBURVNUX1BBUk1BTl9CQVNFX0NPVU5UKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZXNpemU7CisJdGVzdF9wYXJtYW4tPnBhcm1hbiA9IHBhcm1hbl9jcmVhdGUob3BzLCB0ZXN0X3Bhcm1hbik7CisJaWYgKCF0ZXN0X3Bhcm1hbi0+cGFybWFuKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Bhcm1hbl9jcmVhdGU7CisJfQorCXRlc3RfcGFybWFuX3JuZF9pbml0KHRlc3RfcGFybWFuKTsKKwl0ZXN0X3Bhcm1hbl9wcmlvc19pbml0KHRlc3RfcGFybWFuKTsKKwl0ZXN0X3Bhcm1hbl9pdGVtc19pbml0KHRlc3RfcGFybWFuKTsKKwl0ZXN0X3Bhcm1hbi0+cnVuX2J1ZGdldCA9IFRFU1RfUEFSTUFOX1JVTl9CVURHRVQ7CisJcmV0dXJuIHRlc3RfcGFybWFuOworCitlcnJfcGFybWFuX2NyZWF0ZToKKwl0ZXN0X3Bhcm1hbl9yZXNpemUodGVzdF9wYXJtYW4sIDApOworZXJyX3Jlc2l6ZToKKwlrZnJlZSh0ZXN0X3Bhcm1hbik7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9wYXJtYW5fZGVzdHJveShzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuKQoreworCXRlc3RfcGFybWFuX2l0ZW1zX2ZpbmkodGVzdF9wYXJtYW4pOworCXRlc3RfcGFybWFuX3ByaW9zX2ZpbmkodGVzdF9wYXJtYW4pOworCXBhcm1hbl9kZXN0cm95KHRlc3RfcGFybWFuLT5wYXJtYW4pOworCXRlc3RfcGFybWFuX3Jlc2l6ZSh0ZXN0X3Bhcm1hbiwgMCk7CisJa2ZyZWUodGVzdF9wYXJtYW4pOworfQorCitzdGF0aWMgYm9vbCB0ZXN0X3Bhcm1hbl9ydW5fY2hlY2tfYnVkZ2V0cyhzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuKQoreworCWlmICh0ZXN0X3Bhcm1hbi0+cnVuX2J1ZGdldC0tID09IDApCisJCXJldHVybiBmYWxzZTsKKwlpZiAodGVzdF9wYXJtYW4tPmJ1bGtfYnVkZ2V0LS0gIT0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwl0ZXN0X3Bhcm1hbi0+YnVsa19idWRnZXQgPSB0ZXN0X3Bhcm1hbl9ybmRfZ2V0KHRlc3RfcGFybWFuKSAmCisJCQkJICAgVEVTVF9QQVJNQU5fQlVMS19NQVhfTUFTSzsKKwl0ZXN0X3Bhcm1hbi0+YnVsa19ub29wID0gdGVzdF9wYXJtYW5fcm5kX2dldCh0ZXN0X3Bhcm1hbikgJiAxOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IHRlc3RfcGFybWFuX3J1bihzdHJ1Y3QgdGVzdF9wYXJtYW4gKnRlc3RfcGFybWFuKQoreworCXVuc2lnbmVkIGludCBpID0gdGVzdF9wYXJtYW5fcm5kX2dldCh0ZXN0X3Bhcm1hbik7CisJaW50IGVycjsKKworCXdoaWxlICh0ZXN0X3Bhcm1hbl9ydW5fY2hlY2tfYnVkZ2V0cyh0ZXN0X3Bhcm1hbikpIHsKKwkJdW5zaWduZWQgaW50IGl0ZW1faW5kZXggPSBpKysgJiBURVNUX1BBUk1BTl9JVEVNX01BU0s7CisJCXN0cnVjdCB0ZXN0X3Bhcm1hbl9pdGVtICppdGVtID0gJnRlc3RfcGFybWFuLT5pdGVtc1tpdGVtX2luZGV4XTsKKworCQlpZiAodGVzdF9wYXJtYW4tPmJ1bGtfbm9vcCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghaXRlbS0+dXNlZCkgeworCQkJZXJyID0gcGFybWFuX2l0ZW1fYWRkKHRlc3RfcGFybWFuLT5wYXJtYW4sCisJCQkJCSAgICAgICZpdGVtLT5wcmlvLT5wYXJtYW5fcHJpbywKKwkJCQkJICAgICAgJml0ZW0tPnBhcm1hbl9pdGVtKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJCXRlc3RfcGFybWFuLT5wcmlvX2FycmF5W2l0ZW0tPnBhcm1hbl9pdGVtLmluZGV4XSA9IGl0ZW07CisJCQl0ZXN0X3Bhcm1hbi0+dXNlZF9pdGVtcysrOworCQl9IGVsc2UgeworCQkJdGVzdF9wYXJtYW4tPnByaW9fYXJyYXlbaXRlbS0+cGFybWFuX2l0ZW0uaW5kZXhdID0gTlVMTDsKKwkJCXBhcm1hbl9pdGVtX3JlbW92ZSh0ZXN0X3Bhcm1hbi0+cGFybWFuLAorCQkJCQkgICAmaXRlbS0+cHJpby0+cGFybWFuX3ByaW8sCisJCQkJCSAgICZpdGVtLT5wYXJtYW5faXRlbSk7CisJCQl0ZXN0X3Bhcm1hbi0+dXNlZF9pdGVtcy0tOworCQl9CisJCWl0ZW0tPnVzZWQgPSAhaXRlbS0+dXNlZDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9wYXJtYW5fY2hlY2tfYXJyYXkoc3RydWN0IHRlc3RfcGFybWFuICp0ZXN0X3Bhcm1hbiwKKwkJCQkgICBib29sIGdhcHNfYWxsb3dlZCkKK3sKKwl1bnNpZ25lZCBpbnQgbGFzdF91bnVzZWRfaXRlbXMgPSAwOworCXVuc2lnbmVkIGxvbmcgbGFzdF9wcmlvcml0eSA9IDA7CisJdW5zaWduZWQgaW50IHVzZWRfaXRlbXMgPSAwOworCWludCBpOworCisJaWYgKHRlc3RfcGFybWFuLT5wcmlvX2FycmF5X2xpbWl0IDwgVEVTVF9QQVJNQU5fQkFTRV9DT1VOVCkgeworCQlwcl9lcnIoIkFycmF5IGxpbWl0IGlzIGxvd2VyIHRoYW4gdGhlIGJhc2UgY291bnQgKCVsdSA8ICVsdSlcbiIsCisJCSAgICAgICB0ZXN0X3Bhcm1hbi0+cHJpb19hcnJheV9saW1pdCwgVEVTVF9QQVJNQU5fQkFTRV9DT1VOVCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB0ZXN0X3Bhcm1hbi0+cHJpb19hcnJheV9saW1pdDsgaSsrKSB7CisJCXN0cnVjdCB0ZXN0X3Bhcm1hbl9pdGVtICppdGVtID0gdGVzdF9wYXJtYW4tPnByaW9fYXJyYXlbaV07CisKKwkJaWYgKCFpdGVtKSB7CisJCQlsYXN0X3VudXNlZF9pdGVtcysrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGxhc3RfdW51c2VkX2l0ZW1zICYmICFnYXBzX2FsbG93ZWQpIHsKKwkJCXByX2VycigiR2FwIGZvdW5kIGluIGFycmF5IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGZvcmJpZGRlblxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWxhc3RfdW51c2VkX2l0ZW1zID0gMDsKKwkJdXNlZF9pdGVtcysrOworCisJCWlmIChpdGVtLT5wcmlvLT5wcmlvcml0eSA8IGxhc3RfcHJpb3JpdHkpIHsKKwkJCXByX2VycigiSXRlbSBiZWxvbmdzIHVuZGVyIGhpZ2hlciBwcmlvcml0eSB0aGVuIHRoZSBsYXN0IG9uZSAoY3VycmVudDogJWx1LCBwcmV2aW91czogJWx1KVxuIiwKKwkJCSAgICAgICBpdGVtLT5wcmlvLT5wcmlvcml0eSwgbGFzdF9wcmlvcml0eSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlsYXN0X3ByaW9yaXR5ID0gaXRlbS0+cHJpby0+cHJpb3JpdHk7CisKKwkJaWYgKGl0ZW0tPnBhcm1hbl9pdGVtLmluZGV4ICE9IGkpIHsKKwkJCXByX2VycigiSXRlbSBoYXMgZGlmZmVyZW50IGluZGV4IGluIGNvbXBhcmUgdG8gd2hlcmUgaXQgYWN0dWFsbHkgaXMgKCVsdSAhPSAlZClcbiIsCisJCQkgICAgICAgaXRlbS0+cGFybWFuX2l0ZW0uaW5kZXgsIGkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAodXNlZF9pdGVtcyAhPSB0ZXN0X3Bhcm1hbi0+dXNlZF9pdGVtcykgeworCQlwcl9lcnIoIk51bWJlciBvZiB1c2VkIGl0ZW1zIGluIGFycmF5IGRvZXMgbm90IG1hdGNoICgldSAhPSAldSlcbiIsCisJCSAgICAgICB1c2VkX2l0ZW1zLCB0ZXN0X3Bhcm1hbi0+dXNlZF9pdGVtcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChsYXN0X3VudXNlZF9pdGVtcyA+PSBURVNUX1BBUk1BTl9SRVNJWkVfU1RFUF9DT1VOVCkgeworCQlwcl9lcnIoIk51bWJlciBvZiB1bnVzZWQgaXRlbSBhdCB0aGUgZW5kIG9mIGFycmF5IGlzIGJpZ2dlciB0aGFuIHJlc2l6ZSBzdGVwICgldSA+PSAlbHUpXG4iLAorCQkgICAgICAgbGFzdF91bnVzZWRfaXRlbXMsIFRFU1RfUEFSTUFOX1JFU0laRV9TVEVQX0NPVU5UKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfaW5mbygiUHJpb3JpdHkgYXJyYXkgY2hlY2sgc3VjY2Vzc2Z1bFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZXN0X3Bhcm1hbl9sc29ydCh2b2lkKQoreworCXN0cnVjdCB0ZXN0X3Bhcm1hbiAqdGVzdF9wYXJtYW47CisJaW50IGVycjsKKworCXRlc3RfcGFybWFuID0gdGVzdF9wYXJtYW5fY3JlYXRlKCZ0ZXN0X3Bhcm1hbl9sc29ydF9vcHMpOworCWlmIChJU19FUlIodGVzdF9wYXJtYW4pKQorCQlyZXR1cm4gUFRSX0VSUih0ZXN0X3Bhcm1hbik7CisKKwllcnIgPSB0ZXN0X3Bhcm1hbl9ydW4odGVzdF9wYXJtYW4pOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gdGVzdF9wYXJtYW5fY2hlY2tfYXJyYXkodGVzdF9wYXJtYW4sIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKK291dDoKKwl0ZXN0X3Bhcm1hbl9kZXN0cm95KHRlc3RfcGFybWFuKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X3Bhcm1hbl9pbml0KHZvaWQpCit7CisJcmV0dXJuIHRlc3RfcGFybWFuX2xzb3J0KCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X3Bhcm1hbl9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHRlc3RfcGFybWFuX2luaXQpOworbW9kdWxlX2V4aXQodGVzdF9wYXJtYW5fZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9BVVRIT1IoIkppcmkgUGlya28gPGppcmlAbWVsbGFub3guY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUZXN0IG1vZHVsZSBmb3IgcGFybWFuIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3ByaW50Zi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjNmMTBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9wcmludGYuYwpAQCAtMCwwICsxLDUxMiBAQAorLyoKKyAqIFRlc3QgY2FzZXMgZm9yIHByaW50ZiBmYWNpbGl0eS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcHJpbnRrLmg+CisjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorCisjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvZGNhY2hlLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKworI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisKKyNkZWZpbmUgQlVGX1NJWkUgMjU2CisjZGVmaW5lIFBBRF9TSVpFIDE2CisjZGVmaW5lIEZJTExfQ0hBUiAnJCcKKworI2RlZmluZSBQVFIxICgodm9pZCopMHgwMTIzNDU2NykKKyNkZWZpbmUgUFRSMiAoKHZvaWQqKShsb25nKShpbnQpMHhmZWRjYmE5OCkKKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQKKyNkZWZpbmUgUFRSMV9aRVJPRVMgIjAwMDAwMDAwMCIKKyNkZWZpbmUgUFRSMV9TUEFDRVMgIiAgICAgICAgICIKKyNkZWZpbmUgUFRSMV9TVFIgIjEyMzQ1NjciCisjZGVmaW5lIFBUUjJfU1RSICJmZmZmZmZmZmZlZGNiYTk4IgorI2RlZmluZSBQVFJfV0lEVEggMTYKKyNlbHNlCisjZGVmaW5lIFBUUjFfWkVST0VTICIwIgorI2RlZmluZSBQVFIxX1NQQUNFUyAiICIKKyNkZWZpbmUgUFRSMV9TVFIgIjEyMzQ1NjciCisjZGVmaW5lIFBUUjJfU1RSICJmZWRjYmE5OCIKKyNkZWZpbmUgUFRSX1dJRFRIIDgKKyNlbmRpZgorI2RlZmluZSBQVFJfV0lEVEhfU1RSIHN0cmluZ2lmeShQVFJfV0lEVEgpCisKK3N0YXRpYyB1bnNpZ25lZCB0b3RhbF90ZXN0cyBfX2luaXRkYXRhOworc3RhdGljIHVuc2lnbmVkIGZhaWxlZF90ZXN0cyBfX2luaXRkYXRhOworc3RhdGljIGNoYXIgKnRlc3RfYnVmZmVyIF9faW5pdGRhdGE7CitzdGF0aWMgY2hhciAqYWxsb2NlZF9idWZmZXIgX19pbml0ZGF0YTsKKworc3RhdGljIGludCBfX3ByaW50Zig0LCAwKSBfX2luaXQKK2RvX3Rlc3QoaW50IGJ1ZnNpemUsIGNvbnN0IGNoYXIgKmV4cGVjdCwgaW50IGVsZW4sCisJY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQoreworCXZhX2xpc3QgYXE7CisJaW50IHJldCwgd3JpdHRlbjsKKworCXRvdGFsX3Rlc3RzKys7CisKKwltZW1zZXQoYWxsb2NlZF9idWZmZXIsIEZJTExfQ0hBUiwgQlVGX1NJWkUgKyAyKlBBRF9TSVpFKTsKKwl2YV9jb3B5KGFxLCBhcCk7CisJcmV0ID0gdnNucHJpbnRmKHRlc3RfYnVmZmVyLCBidWZzaXplLCBmbXQsIGFxKTsKKwl2YV9lbmQoYXEpOworCisJaWYgKHJldCAhPSBlbGVuKSB7CisJCXByX3dhcm4oInZzbnByaW50ZihidWYsICVkLCBcIiVzXCIsIC4uLikgcmV0dXJuZWQgJWQsIGV4cGVjdGVkICVkXG4iLAorCQkJYnVmc2l6ZSwgZm10LCByZXQsIGVsZW4pOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAobWVtY2hyX2ludihhbGxvY2VkX2J1ZmZlciwgRklMTF9DSEFSLCBQQURfU0laRSkpIHsKKwkJcHJfd2FybigidnNucHJpbnRmKGJ1ZiwgJWQsIFwiJXNcIiwgLi4uKSB3cm90ZSBiZWZvcmUgYnVmZmVyXG4iLCBidWZzaXplLCBmbXQpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoIWJ1ZnNpemUpIHsKKwkJaWYgKG1lbWNocl9pbnYodGVzdF9idWZmZXIsIEZJTExfQ0hBUiwgQlVGX1NJWkUgKyBQQURfU0laRSkpIHsKKwkJCXByX3dhcm4oInZzbnByaW50ZihidWYsIDAsIFwiJXNcIiwgLi4uKSB3cm90ZSB0byBidWZmZXJcbiIsCisJCQkJZm10KTsKKwkJCXJldHVybiAxOworCQl9CisJCXJldHVybiAwOworCX0KKworCXdyaXR0ZW4gPSBtaW4oYnVmc2l6ZS0xLCBlbGVuKTsKKwlpZiAodGVzdF9idWZmZXJbd3JpdHRlbl0pIHsKKwkJcHJfd2FybigidnNucHJpbnRmKGJ1ZiwgJWQsIFwiJXNcIiwgLi4uKSBkaWQgbm90IG51bC10ZXJtaW5hdGUgYnVmZmVyXG4iLAorCQkJYnVmc2l6ZSwgZm10KTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1lbWNocl9pbnYodGVzdF9idWZmZXIgKyB3cml0dGVuICsgMSwgRklMTF9DSEFSLCBCVUZfU0laRSArIFBBRF9TSVpFIC0gKHdyaXR0ZW4gKyAxKSkpIHsKKwkJcHJfd2FybigidnNucHJpbnRmKGJ1ZiwgJWQsIFwiJXNcIiwgLi4uKSB3cm90ZSBiZXlvbmQgdGhlIG51bC10ZXJtaW5hdG9yXG4iLAorCQkJYnVmc2l6ZSwgZm10KTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1lbWNtcCh0ZXN0X2J1ZmZlciwgZXhwZWN0LCB3cml0dGVuKSkgeworCQlwcl93YXJuKCJ2c25wcmludGYoYnVmLCAlZCwgXCIlc1wiLCAuLi4pIHdyb3RlICclcycsIGV4cGVjdGVkICclLipzJ1xuIiwKKwkJCWJ1ZnNpemUsIGZtdCwgdGVzdF9idWZmZXIsIHdyaXR0ZW4sIGV4cGVjdCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19wcmludGYoMywgNCkgX19pbml0CitfX3Rlc3QoY29uc3QgY2hhciAqZXhwZWN0LCBpbnQgZWxlbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmFuZDsKKwljaGFyICpwOworCisJaWYgKGVsZW4gPj0gQlVGX1NJWkUpIHsKKwkJcHJfZXJyKCJlcnJvciBpbiB0ZXN0IHN1aXRlOiBleHBlY3RlZCBvdXRwdXQgbGVuZ3RoICVkIHRvbyBsb25nLiBGb3JtYXQgd2FzICclcycuXG4iLAorCQkgICAgICAgZWxlbiwgZm10KTsKKwkJZmFpbGVkX3Rlc3RzKys7CisJCXJldHVybjsKKwl9CisKKwl2YV9zdGFydChhcCwgZm10KTsKKworCS8qCisJICogRXZlcnkgZm10K2FyZ3MgaXMgc3ViamVjdGVkIHRvIGZvdXIgdGVzdHM6IFRocmVlIHdoZXJlIHdlCisJICogdGVsbCB2c25wcmludGYgdmFyeWluZyBidWZmZXIgc2l6ZXMgKHBsZW50eSwgbm90IHF1aXRlCisJICogZW5vdWdoIGFuZCAwKSwgYW5kIHRoZW4gd2UgYWxzbyB0ZXN0IHRoYXQga3Zhc3ByaW50ZiB3b3VsZAorCSAqIGJlIGFibGUgdG8gcHJpbnQgaXQgYXMgZXhwZWN0ZWQuCisJICovCisJZmFpbGVkX3Rlc3RzICs9IGRvX3Rlc3QoQlVGX1NJWkUsIGV4cGVjdCwgZWxlbiwgZm10LCBhcCk7CisJcmFuZCA9IDEgKyBwcmFuZG9tX3UzMl9tYXgoZWxlbisxKTsKKwkvKiBTaW5jZSBlbGVuIDwgQlVGX1NJWkUsIHdlIGhhdmUgMSA8PSByYW5kIDw9IEJVRl9TSVpFLiAqLworCWZhaWxlZF90ZXN0cyArPSBkb190ZXN0KHJhbmQsIGV4cGVjdCwgZWxlbiwgZm10LCBhcCk7CisJZmFpbGVkX3Rlc3RzICs9IGRvX3Rlc3QoMCwgZXhwZWN0LCBlbGVuLCBmbXQsIGFwKTsKKworCXAgPSBrdmFzcHJpbnRmKEdGUF9LRVJORUwsIGZtdCwgYXApOworCWlmIChwKSB7CisJCXRvdGFsX3Rlc3RzKys7CisJCWlmIChtZW1jbXAocCwgZXhwZWN0LCBlbGVuKzEpKSB7CisJCQlwcl93YXJuKCJrdmFzcHJpbnRmKC4uLiwgXCIlc1wiLCAuLi4pIHJldHVybmVkICclcycsIGV4cGVjdGVkICclcydcbiIsCisJCQkJZm10LCBwLCBleHBlY3QpOworCQkJZmFpbGVkX3Rlc3RzKys7CisJCX0KKwkJa2ZyZWUocCk7CisJfQorCXZhX2VuZChhcCk7Cit9CisKKyNkZWZpbmUgdGVzdChleHBlY3QsIGZtdCwgLi4uKQkJCQkJXAorCV9fdGVzdChleHBlY3QsIHN0cmxlbihleHBlY3QpLCBmbXQsICMjX19WQV9BUkdTX18pCisKK3N0YXRpYyB2b2lkIF9faW5pdAordGVzdF9iYXNpYyh2b2lkKQoreworCS8qIFdvcmsgYXJvdW5kIGFubm95aW5nICJ3YXJuaW5nOiB6ZXJvLWxlbmd0aCBnbnVfcHJpbnRmIGZvcm1hdCBzdHJpbmciLiAqLworCWNoYXIgbnVsID0gJ1wwJzsKKworCXRlc3QoIiIsICZudWwpOworCXRlc3QoIjEwMCUiLCAiMTAwJSUiKTsKKwl0ZXN0KCJ4eHgleXl5IiwgInh4eCVjeXl5IiwgJyUnKTsKKwlfX3Rlc3QoInh4eFwweXl5IiwgNywgInh4eCVjeXl5IiwgJ1wwJyk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAordGVzdF9udW1iZXIodm9pZCkKK3sKKwl0ZXN0KCIweDEyMzRhYmNkICAiLCAiJSMtMTJ4IiwgMHgxMjM0YWJjZCk7CisJdGVzdCgiICAweDEyMzRhYmNkIiwgIiUjMTJ4IiwgMHgxMjM0YWJjZCk7CisJdGVzdCgiMHwwMDF8IDEyfCsxMjN8IDEyMzR8LTEyM3wtMTIzNCIsICIlZHwlMDNkfCUzZHwlK2R8JSBkfCUrZHwlIGQiLCAwLCAxLCAxMiwgMTIzLCAxMjM0LCAtMTIzLCAtMTIzNCk7CisJdGVzdCgiMHwxfDF8MTI4fDI1NSIsICIlaGh1fCVoaHV8JWhodXwlaGh1fCVoaHUiLCAwLCAxLCAyNTcsIDEyOCwgLTEpOworCXRlc3QoIjB8MXwxfC0xMjh8LTEiLCAiJWhoZHwlaGhkfCVoaGR8JWhoZHwlaGhkIiwgMCwgMSwgMjU3LCAxMjgsIC0xKTsKKwl0ZXN0KCIyMDE1MTIyNDIwMTUxMjI1IiwgIiVobyVobyUjaG8iLCAxMDM3LCA1MjgyLCAtMTE2MjcpOworCS8qCisJICogUE9TSVgvQzk5OiDCu1RoZSByZXN1bHQgb2YgY29udmVydGluZyB6ZXJvIHdpdGggYW4gZXhwbGljaXQKKwkgKiBwcmVjaXNpb24gb2YgemVybyBzaGFsbCBiZSBubyBjaGFyYWN0ZXJzLsKrIEhlbmNlIHRoZSBvdXRwdXQKKwkgKiBmcm9tIHRoZSBiZWxvdyB0ZXN0IHNob3VsZCByZWFsbHkgYmUgIjAwfDB8fHwgIi4gSG93ZXZlciwKKwkgKiB0aGUga2VybmVsJ3MgcHJpbnRmIGFsc28gcHJvZHVjZXMgYSBzaW5nbGUgMCBpbiB0aGF0CisJICogY2FzZS4gVGhpcyB0ZXN0IGNhc2Ugc2ltcGx5IGRvY3VtZW50cyB0aGUgY3VycmVudAorCSAqIGJlaGF2aW91ci4KKwkgKi8KKwl0ZXN0KCIwMHwwfDB8MHwwIiwgIiUuMmR8JS4xZHwlLjBkfCUuKmR8JTEuMGQiLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyNpZm5kZWYgX19DSEFSX1VOU0lHTkVEX18KKwl7CisJCS8qCisJCSAqIFBhc3NpbmcgYSAnY2hhcicgdG8gYSAlMDJ4IHNwZWNpZmllciBkb2Vzbid0IGRvCisJCSAqIHdoYXQgd2FzIHByZXN1bWFibHkgdGhlIGludGVudGlvbiB3aGVuIGNoYXIgaXMKKwkJICogc2lnbmVkIGFuZCB0aGUgdmFsdWUgaXMgbmVnYXRpdmUuIE9uZSBtdXN0IGVpdGhlciAmCisJCSAqIHdpdGggMHhmZiBvciBjYXN0IHRvIHU4LgorCQkgKi8KKwkJY2hhciB2YWwgPSAtMTY7CisJCXRlc3QoIjB4ZmZmZmZmZjB8MHhmMHwweGYwIiwgIiUjMDJ4fCUjMDJ4fCUjMDJ4IiwgdmFsLCB2YWwgJiAweGZmLCAodTgpdmFsKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0Cit0ZXN0X3N0cmluZyh2b2lkKQoreworCXRlc3QoIiIsICIlcyUuMHMiLCAiIiwgIjEyMyIpOworCXRlc3QoIkFCQ0R8YWJjfDEyMyIsICIlc3wlLjNzfCUuKnMiLCAiQUJDRCIsICJhYmNkZWYiLCAzLCAiMTIzNDU2Iik7CisJdGVzdCgiMSAgfCAgMnwzICB8ICA0fDUgICIsICIlLTNzfCUzc3wlLSpzfCUqc3wlKnMiLCAiMSIsICIyIiwgMywgIjMiLCAzLCAiNCIsIC0zLCAiNSIpOworCXRlc3QoIjEyMzQgICAgICAiLCAiJS0xMC40cyIsICIxMjM0NTYiKTsKKwl0ZXN0KCIgICAgICAxMjM0IiwgIiUxMC40cyIsICIxMjM0NTYiKTsKKwkvKgorCSAqIFBPU0lYIGFuZCBDOTkgc2F5IHRoYXQgYSBuZWdhdGl2ZSBwcmVjaXNpb24gKHdoaWNoIGlzIG9ubHkKKwkgKiBwb3NzaWJsZSB0byBwYXNzIHZpYSBhICogYXJndW1lbnQpIHNob3VsZCBiZSB0cmVhdGVkIGFzIGlmCisJICogdGhlIHByZWNpc2lvbiB3YXNuJ3QgcHJlc2VudCwgYW5kIHRoYXQgaWYgdGhlIHByZWNpc2lvbiBpcworCSAqIG9taXR0ZWQgKGFzIGluICUucyksIHRoZSBwcmVjaXNpb24gc2hvdWxkIGJlIHRha2VuIHRvIGJlCisJICogMC4gSG93ZXZlciwgdGhlIGtlcm5lbCdzIHByaW50ZiBiZWhhdmUgZXhhY3RseSBvcHBvc2l0ZSwKKwkgKiB0cmVhdGluZyBhIG5lZ2F0aXZlIHByZWNpc2lvbiBhcyAwIGFuZCB0cmVhdGluZyBhbiBvbWl0dGVkCisJICogcHJlY2lzaW9uIHNwZWNpZmllciBhcyBpZiBubyBwcmVjaXNpb24gd2FzIGdpdmVuLgorCSAqCisJICogVGhlc2UgdGVzdCBjYXNlcyBkb2N1bWVudCB0aGUgY3VycmVudCBiZWhhdmlvdXI7IHNob3VsZAorCSAqIGFueW9uZSBldmVyIGZlZWwgdGhlIG5lZWQgdG8gZm9sbG93IHRoZSBzdGFuZGFyZHMgbW9yZQorCSAqIGNsb3NlbHksIHRoaXMgY2FuIGJlIHJldmlzaXRlZC4KKwkgKi8KKwl0ZXN0KCIgICAgIiwgIiU0LipzIiwgLTUsICIxMjM0NTYiKTsKKwl0ZXN0KCIxMjM0NTYiLCAiJS5zIiwgIjEyMzQ1NiIpOworCXRlc3QoImF8fCIsICIlLnN8JS4wc3wlLipzIiwgImEiLCAiYiIsIDAsICJjIik7CisJdGVzdCgiYSAgfCAgIHwgICAiLCAiJS0zLnN8JS0zLjBzfCUtMy4qcyIsICJhIiwgImIiLCAwLCAiYyIpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK3BsYWluKHZvaWQpCit7CisJdGVzdChQVFIxX1pFUk9FUyBQVFIxX1NUUiAiICIgUFRSMl9TVFIsICIlcCAlcCIsIFBUUjEsIFBUUjIpOworCS8qCisJICogVGhlIGZpZWxkIHdpZHRoIGlzIG92ZXJsb2FkZWQgZm9yIHNvbWUgJXAgZXh0ZW5zaW9ucyB0bworCSAqIHBhc3MgYW5vdGhlciBwaWVjZSBvZiBpbmZvcm1hdGlvbi4gRm9yIHBsYWluIHBvaW50ZXJzLCB0aGUKKwkgKiBiZWhhdmlvdXIgaXMgc2xpZ2h0bHkgb2RkOiBPbmUgY2Fubm90IHBhc3MgZWl0aGVyIHRoZSAwCisJICogZmxhZyBub3IgYSBwcmVjaXNpb24gdG8gJXAgd2l0aG91dCBnY2MgY29tcGxhaW5pbmcsIGFuZCBpZgorCSAqIG9uZSBleHBsaWNpdGx5IGdpdmVzIGEgZmllbGQgd2lkdGgsIHRoZSBudW1iZXIgaXMgbm8gbG9uZ2VyCisJICogemVyby1wYWRkZWQuCisJICovCisJdGVzdCgifCIgUFRSMV9TVFIgUFRSMV9TUEFDRVMgIiAgfCAgIiBQVFIxX1NQQUNFUyBQVFIxX1NUUiAifCIsCisJICAgICAifCUtKnB8JSpwfCIsIFBUUl9XSURUSCsyLCBQVFIxLCBQVFJfV0lEVEgrMiwgUFRSMSk7CisJdGVzdCgifCIgUFRSMl9TVFIgIiAgfCAgIiBQVFIyX1NUUiAifCIsCisJICAgICAifCUtKnB8JSpwfCIsIFBUUl9XSURUSCsyLCBQVFIyLCBQVFJfV0lEVEgrMiwgUFRSMik7CisKKwkvKgorCSAqIFVucmVjb2duaXplZCAlcCBleHRlbnNpb25zIGFyZSB0cmVhdGVkIGFzIHBsYWluICVwLCBidXQgdGhlCisJICogYWxwaGFudW1lcmljIHN1ZmZpeCBpcyBpZ25vcmVkICh0aGF0IGlzLCBkb2VzIG5vdCBvY2N1ciBpbgorCSAqIHRoZSBvdXRwdXQuKQorCSAqLworCXRlc3QoInwiUFRSMV9aRVJPRVMgUFRSMV9TVFIifCIsICJ8JXAweXwiLCBQVFIxKTsKKwl0ZXN0KCJ8IlBUUjJfU1RSInwiLCAifCVwMHl8IiwgUFRSMik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorc3ltYm9sX3B0cih2b2lkKQoreworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2tlcm5lbF9wdHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0CitzdHJ1Y3RfcmVzb3VyY2Uodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0CithZGRyKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorZXNjYXBlZF9zdHIodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0CitoZXhfc3RyaW5nKHZvaWQpCit7CisJY29uc3QgY2hhciBidWZbM10gPSB7MHhjMCwgMHhmZiwgMHhlZX07CisKKwl0ZXN0KCJjMCBmZiBlZXxjMDpmZjplZXxjMC1mZi1lZXxjMGZmZWUiLAorCSAgICAgIiUzcGh8JTNwaEN8JTNwaER8JTNwaE4iLCBidWYsIGJ1ZiwgYnVmLCBidWYpOworCXRlc3QoImMwIGZmIGVlfGMwOmZmOmVlfGMwLWZmLWVlfGMwZmZlZSIsCisJICAgICAiJSpwaHwlKnBoQ3wlKnBoRHwlKnBoTiIsIDMsIGJ1ZiwgMywgYnVmLCAzLCBidWYsIDMsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorbWFjKHZvaWQpCit7CisJY29uc3QgdTggYWRkcls2XSA9IHsweDJkLCAweDQ4LCAweGQ2LCAweGZjLCAweDdhLCAweDA1fTsKKworCXRlc3QoIjJkOjQ4OmQ2OmZjOjdhOjA1IiwgIiVwTSIsIGFkZHIpOworCXRlc3QoIjA1OjdhOmZjOmQ2OjQ4OjJkIiwgIiVwTVIiLCBhZGRyKTsKKwl0ZXN0KCIyZC00OC1kNi1mYy03YS0wNSIsICIlcE1GIiwgYWRkcik7CisJdGVzdCgiMmQ0OGQ2ZmM3YTA1IiwgIiVwbSIsIGFkZHIpOworCXRlc3QoIjA1N2FmY2Q2NDgyZCIsICIlcG1SIiwgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAoraXA0KHZvaWQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBjcHVfdG9fYmUxNigxMjM0NSk7CisJc2Euc2luX2FkZHIuc19hZGRyID0gY3B1X3RvX2JlMzIoMHg3ZjAwMDAwMSk7CisKKwl0ZXN0KCIxMjcuMDAwLjAwMC4wMDF8MTI3LjAuMC4xIiwgIiVwaTR8JXBJNCIsICZzYS5zaW5fYWRkciwgJnNhLnNpbl9hZGRyKTsKKwl0ZXN0KCIxMjcuMDAwLjAwMC4wMDF8MTI3LjAuMC4xIiwgIiVwaVN8JXBJUyIsICZzYSwgJnNhKTsKKwlzYS5zaW5fYWRkci5zX2FkZHIgPSBjcHVfdG9fYmUzMigweDAxMDIwMzA0KTsKKwl0ZXN0KCIwMDEuMDAyLjAwMy4wMDQ6MTIzNDV8MS4yLjMuNDoxMjM0NSIsICIlcGlTcHwlcElTcCIsICZzYSwgJnNhKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0CitpcDYodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0CitpcCh2b2lkKQoreworCWlwNCgpOworCWlwNigpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK3V1aWQodm9pZCkKK3sKKwljb25zdCBjaGFyIHV1aWRbMTZdID0gezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAorCQkJICAgICAgIDB4OCwgMHg5LCAweGEsIDB4YiwgMHhjLCAweGQsIDB4ZSwgMHhmfTsKKworCXRlc3QoIjAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZiIsICIlcFViIiwgdXVpZCk7CisJdGVzdCgiMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMEEwQjBDMEQwRTBGIiwgIiVwVUIiLCB1dWlkKTsKKwl0ZXN0KCIwMzAyMDEwMC0wNTA0LTA3MDYtMDgwOS0wYTBiMGMwZDBlMGYiLCAiJXBVbCIsIHV1aWQpOworCXRlc3QoIjAzMDIwMTAwLTA1MDQtMDcwNi0wODA5LTBBMEIwQzBEMEUwRiIsICIlcFVMIiwgdXVpZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5IHRlc3RfZGVudHJ5WzRdIF9faW5pdGRhdGEgPSB7CisJeyAuZF9wYXJlbnQgPSAmdGVzdF9kZW50cnlbMF0sCisJICAuZF9uYW1lID0gUVNUUl9JTklUKHRlc3RfZGVudHJ5WzBdLmRfaW5hbWUsIDMpLAorCSAgLmRfaW5hbWUgPSAiZm9vIiB9LAorCXsgLmRfcGFyZW50ID0gJnRlc3RfZGVudHJ5WzBdLAorCSAgLmRfbmFtZSA9IFFTVFJfSU5JVCh0ZXN0X2RlbnRyeVsxXS5kX2luYW1lLCA1KSwKKwkgIC5kX2luYW1lID0gImJyYXZvIiB9LAorCXsgLmRfcGFyZW50ID0gJnRlc3RfZGVudHJ5WzFdLAorCSAgLmRfbmFtZSA9IFFTVFJfSU5JVCh0ZXN0X2RlbnRyeVsyXS5kX2luYW1lLCA0KSwKKwkgIC5kX2luYW1lID0gImFsZmEiIH0sCisJeyAuZF9wYXJlbnQgPSAmdGVzdF9kZW50cnlbMl0sCisJICAuZF9uYW1lID0gUVNUUl9JTklUKHRlc3RfZGVudHJ5WzNdLmRfaW5hbWUsIDUpLAorCSAgLmRfaW5hbWUgPSAicm9tZW8iIH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQKK2RlbnRyeSh2b2lkKQoreworCXRlc3QoImZvbyIsICIlcGQiLCAmdGVzdF9kZW50cnlbMF0pOworCXRlc3QoImZvbyIsICIlcGQyIiwgJnRlc3RfZGVudHJ5WzBdKTsKKworCXRlc3QoInJvbWVvIiwgIiVwZCIsICZ0ZXN0X2RlbnRyeVszXSk7CisJdGVzdCgiYWxmYS9yb21lbyIsICIlcGQyIiwgJnRlc3RfZGVudHJ5WzNdKTsKKwl0ZXN0KCJicmF2by9hbGZhL3JvbWVvIiwgIiVwZDMiLCAmdGVzdF9kZW50cnlbM10pOworCXRlc3QoIi9icmF2by9hbGZhL3JvbWVvIiwgIiVwZDQiLCAmdGVzdF9kZW50cnlbM10pOworCXRlc3QoIi9icmF2by9hbGZhIiwgIiVwZDQiLCAmdGVzdF9kZW50cnlbMl0pOworCisJdGVzdCgiYnJhdm8vYWxmYSAgfGJyYXZvL2FsZmEgICIsICIlLTEycGQyfCUqcGQyIiwgJnRlc3RfZGVudHJ5WzJdLCAtMTIsICZ0ZXN0X2RlbnRyeVsyXSk7CisJdGVzdCgiICBicmF2by9hbGZhfCAgYnJhdm8vYWxmYSIsICIlMTJwZDJ8JSpwZDIiLCAmdGVzdF9kZW50cnlbMl0sIDEyLCAmdGVzdF9kZW50cnlbMl0pOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK3N0cnVjdF92YV9mb3JtYXQodm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0CitzdHJ1Y3RfY2xrKHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorbGFyZ2VfYml0bWFwKHZvaWQpCit7CisJY29uc3QgaW50IG5iaXRzID0gMSA8PCAxNjsKKwl1bnNpZ25lZCBsb25nICpiaXRzID0ga2NhbGxvYyhCSVRTX1RPX0xPTkdTKG5iaXRzKSwgc2l6ZW9mKGxvbmcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJpdHMpCisJCXJldHVybjsKKworCWJpdG1hcF9zZXQoYml0cywgMSwgMjApOworCWJpdG1hcF9zZXQoYml0cywgNjAwMDAsIDE1KTsKKwl0ZXN0KCIxLTIwLDYwMDAwLTYwMDE0IiwgIiUqcGJsIiwgbmJpdHMsIGJpdHMpOworCWtmcmVlKGJpdHMpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2JpdG1hcCh2b2lkKQoreworCURFQ0xBUkVfQklUTUFQKGJpdHMsIDIwKTsKKwljb25zdCBpbnQgcHJpbWVzW10gPSB7MiwzLDUsNywxMSwxMywxNywxOX07CisJaW50IGk7CisKKwliaXRtYXBfemVybyhiaXRzLCAyMCk7CisJdGVzdCgiMDAwMDB8MDAwMDAiLCAiJTIwcGJ8JSpwYiIsIGJpdHMsIDIwLCBiaXRzKTsKKwl0ZXN0KCJ8IiwgIiUyMHBibHwlKnBibCIsIGJpdHMsIDIwLCBiaXRzKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHByaW1lcyk7ICsraSkKKwkJc2V0X2JpdChwcmltZXNbaV0sIGJpdHMpOworCXRlc3QoImEyOGFjfGEyOGFjIiwgIiUyMHBifCUqcGIiLCBiaXRzLCAyMCwgYml0cyk7CisJdGVzdCgiMi0zLDUsNywxMSwxMywxNywxOXwyLTMsNSw3LDExLDEzLDE3LDE5IiwgIiUyMHBibHwlKnBibCIsIGJpdHMsIDIwLCBiaXRzKTsKKworCWJpdG1hcF9maWxsKGJpdHMsIDIwKTsKKwl0ZXN0KCJmZmZmZnxmZmZmZiIsICIlMjBwYnwlKnBiIiwgYml0cywgMjAsIGJpdHMpOworCXRlc3QoIjAtMTl8MC0xOSIsICIlMjBwYmx8JSpwYmwiLCBiaXRzLCAyMCwgYml0cyk7CisKKwlsYXJnZV9iaXRtYXAoKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0CituZXRkZXZfZmVhdHVyZXModm9pZCkKK3sKK30KKworc3RhdGljIHZvaWQgX19pbml0CitmbGFncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZ2ZwX3QgZ2ZwOworCWNoYXIgKmNtcF9idWZmZXI7CisKKwlmbGFncyA9IDA7CisJdGVzdCgiIiwgIiVwR3AiLCAmZmxhZ3MpOworCisJLyogUGFnZSBmbGFncyBzaG91bGQgZmlsdGVyIHRoZSB6b25lIGlkICovCisJZmxhZ3MgPSAxVUwgPDwgTlJfUEFHRUZMQUdTOworCXRlc3QoIiIsICIlcEdwIiwgJmZsYWdzKTsKKworCWZsYWdzIHw9IDFVTCA8PCBQR191cHRvZGF0ZSB8IDFVTCA8PCBQR19kaXJ0eSB8IDFVTCA8PCBQR19scnUKKwkJfCAxVUwgPDwgUEdfYWN0aXZlIHwgMVVMIDw8IFBHX3N3YXBiYWNrZWQ7CisJdGVzdCgidXB0b2RhdGV8ZGlydHl8bHJ1fGFjdGl2ZXxzd2FwYmFja2VkIiwgIiVwR3AiLCAmZmxhZ3MpOworCisKKwlmbGFncyA9IFZNX1JFQUQgfCBWTV9FWEVDIHwgVk1fTUFZUkVBRCB8IFZNX01BWVdSSVRFIHwgVk1fTUFZRVhFQworCQkJfCBWTV9ERU5ZV1JJVEU7CisJdGVzdCgicmVhZHxleGVjfG1heXJlYWR8bWF5d3JpdGV8bWF5ZXhlY3xkZW55d3JpdGUiLCAiJXBHdiIsICZmbGFncyk7CisKKwlnZnAgPSBHRlBfVFJBTlNIVUdFOworCXRlc3QoIkdGUF9UUkFOU0hVR0UiLCAiJXBHZyIsICZnZnApOworCisJZ2ZwID0gR0ZQX0FUT01JQ3xfX0dGUF9ETUE7CisJdGVzdCgiR0ZQX0FUT01JQ3xHRlBfRE1BIiwgIiVwR2ciLCAmZ2ZwKTsKKworCWdmcCA9IF9fR0ZQX0FUT01JQzsKKwl0ZXN0KCJfX0dGUF9BVE9NSUMiLCAiJXBHZyIsICZnZnApOworCisJY21wX2J1ZmZlciA9IGttYWxsb2MoQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghY21wX2J1ZmZlcikKKwkJcmV0dXJuOworCisJLyogQW55IGZsYWdzIG5vdCB0cmFuc2xhdGVkIGJ5IHRoZSB0YWJsZSBzaG91bGQgcmVtYWluIG51bWVyaWMgKi8KKwlnZnAgPSB+X19HRlBfQklUU19NQVNLOworCXNucHJpbnRmKGNtcF9idWZmZXIsIEJVRl9TSVpFLCAiJSNseCIsICh1bnNpZ25lZCBsb25nKSBnZnApOworCXRlc3QoY21wX2J1ZmZlciwgIiVwR2ciLCAmZ2ZwKTsKKworCXNucHJpbnRmKGNtcF9idWZmZXIsIEJVRl9TSVpFLCAiX19HRlBfQVRPTUlDfCUjbHgiLAorCQkJCQkJCSh1bnNpZ25lZCBsb25nKSBnZnApOworCWdmcCB8PSBfX0dGUF9BVE9NSUM7CisJdGVzdChjbXBfYnVmZmVyLCAiJXBHZyIsICZnZnApOworCisJa2ZyZWUoY21wX2J1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAordGVzdF9wb2ludGVyKHZvaWQpCit7CisJcGxhaW4oKTsKKwlzeW1ib2xfcHRyKCk7CisJa2VybmVsX3B0cigpOworCXN0cnVjdF9yZXNvdXJjZSgpOworCWFkZHIoKTsKKwllc2NhcGVkX3N0cigpOworCWhleF9zdHJpbmcoKTsKKwltYWMoKTsKKwlpcCgpOworCXV1aWQoKTsKKwlkZW50cnkoKTsKKwlzdHJ1Y3RfdmFfZm9ybWF0KCk7CisJc3RydWN0X2NsaygpOworCWJpdG1hcCgpOworCW5ldGRldl9mZWF0dXJlcygpOworCWZsYWdzKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0Cit0ZXN0X3ByaW50Zl9pbml0KHZvaWQpCit7CisJYWxsb2NlZF9idWZmZXIgPSBrbWFsbG9jKEJVRl9TSVpFICsgMipQQURfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhbGxvY2VkX2J1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJdGVzdF9idWZmZXIgPSBhbGxvY2VkX2J1ZmZlciArIFBBRF9TSVpFOworCisJdGVzdF9iYXNpYygpOworCXRlc3RfbnVtYmVyKCk7CisJdGVzdF9zdHJpbmcoKTsKKwl0ZXN0X3BvaW50ZXIoKTsKKworCWtmcmVlKGFsbG9jZWRfYnVmZmVyKTsKKworCWlmIChmYWlsZWRfdGVzdHMgPT0gMCkKKwkJcHJfaW5mbygiYWxsICV1IHRlc3RzIHBhc3NlZFxuIiwgdG90YWxfdGVzdHMpOworCWVsc2UKKwkJcHJfd2FybigiZmFpbGVkICV1IG91dCBvZiAldSB0ZXN0c1xuIiwgZmFpbGVkX3Rlc3RzLCB0b3RhbF90ZXN0cyk7CisKKwlyZXR1cm4gZmFpbGVkX3Rlc3RzID8gLUVJTlZBTCA6IDA7Cit9CisKK21vZHVsZV9pbml0KHRlc3RfcHJpbnRmX2luaXQpOworCitNT0RVTEVfQVVUSE9SKCJSYXNtdXMgVmlsbGVtb2VzIDxsaW51eEByYXNtdXN2aWxsZW1vZXMuZGs+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3JoYXNodGFibGUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfcmhhc2h0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmNhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3JoYXNodGFibGUuYwpAQCAtMCwwICsxLDQ0MyBAQAorLyoKKyAqIFJlc2l6YWJsZSwgU2NhbGFibGUsIENvbmN1cnJlbnQgSGFzaCBUYWJsZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNC0yMDE1IFRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTQgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFNlbGYgVGVzdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvcmhhc2h0YWJsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworI2RlZmluZSBNQVhfRU5UUklFUwkxMDAwMDAwCisjZGVmaW5lIFRFU1RfSU5TRVJUX0ZBSUwgSU5UX01BWAorCitzdGF0aWMgaW50IGVudHJpZXMgPSA1MDAwMDsKK21vZHVsZV9wYXJhbShlbnRyaWVzLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhlbnRyaWVzLCAiTnVtYmVyIG9mIGVudHJpZXMgdG8gYWRkIChkZWZhdWx0OiA1MDAwMCkiKTsKKworc3RhdGljIGludCBydW5zID0gNDsKK21vZHVsZV9wYXJhbShydW5zLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhydW5zLCAiTnVtYmVyIG9mIHRlc3QgcnVucyBwZXIgdmFyaWFudCAoZGVmYXVsdDogNCkiKTsKKworc3RhdGljIGludCBtYXhfc2l6ZSA9IDA7Cittb2R1bGVfcGFyYW0obWF4X3NpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1heF9zaXplLCAiTWF4aW11bSB0YWJsZSBzaXplIChkZWZhdWx0OiBjYWxjdWxhdGVkKSIpOworCitzdGF0aWMgYm9vbCBzaHJpbmtpbmcgPSBmYWxzZTsKK21vZHVsZV9wYXJhbShzaHJpbmtpbmcsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhzaHJpbmtpbmcsICJFbmFibGUgYXV0b21hdGljIHNocmlua2luZyAoZGVmYXVsdDogb2ZmKSIpOworCitzdGF0aWMgaW50IHNpemUgPSA4OworbW9kdWxlX3BhcmFtKHNpemUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNpemUsICJJbml0aWFsIHNpemUgaGludCBvZiB0YWJsZSAoZGVmYXVsdDogOCkiKTsKKworc3RhdGljIGludCB0Y291bnQgPSAxMDsKK21vZHVsZV9wYXJhbSh0Y291bnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHRjb3VudCwgIk51bWJlciBvZiB0aHJlYWRzIHRvIHNwYXduIChkZWZhdWx0OiAxMCkiKTsKKworc3RhdGljIGJvb2wgZW5vbWVtX3JldHJ5ID0gZmFsc2U7Cittb2R1bGVfcGFyYW0oZW5vbWVtX3JldHJ5LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZW5vbWVtX3JldHJ5LCAiUmV0cnkgaW5zZXJ0IGV2ZW4gaWYgLUVOT01FTSB3YXMgcmV0dXJuZWQgKGRlZmF1bHQ6IG9mZikiKTsKKworc3RydWN0IHRlc3Rfb2JqX3ZhbCB7CisJaW50CWlkOworCWludAl0aWQ7Cit9OworCitzdHJ1Y3QgdGVzdF9vYmogeworCXN0cnVjdCB0ZXN0X29ial92YWwJdmFsdWU7CisJc3RydWN0IHJoYXNoX2hlYWQJbm9kZTsKK307CisKK3N0cnVjdCB0aHJlYWRfZGF0YSB7CisJaW50IGlkOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlzdHJ1Y3QgdGVzdF9vYmogKm9ianM7Cit9OworCitzdGF0aWMgc3RydWN0IHRlc3Rfb2JqIGFycmF5W01BWF9FTlRSSUVTXTsKKworc3RhdGljIHN0cnVjdCByaGFzaHRhYmxlX3BhcmFtcyB0ZXN0X3JodF9wYXJhbXMgPSB7CisJLmhlYWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRlc3Rfb2JqLCBub2RlKSwKKwkua2V5X29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCB0ZXN0X29iaiwgdmFsdWUpLAorCS5rZXlfbGVuID0gc2l6ZW9mKHN0cnVjdCB0ZXN0X29ial92YWwpLAorCS5oYXNoZm4gPSBqaGFzaCwKKwkubnVsbHNfYmFzZSA9ICgzVSA8PCBSSFRfQkFTRV9TSElGVCksCit9OworCitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBwcmVzdGFydF9zZW07CitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBzdGFydHVwX3NlbSA9IF9fU0VNQVBIT1JFX0lOSVRJQUxJWkVSKHN0YXJ0dXBfc2VtLCAwKTsKKworc3RhdGljIGludCBpbnNlcnRfcmV0cnkoc3RydWN0IHJoYXNodGFibGUgKmh0LCBzdHJ1Y3Qgcmhhc2hfaGVhZCAqb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHJoYXNodGFibGVfcGFyYW1zIHBhcmFtcykKK3sKKwlpbnQgZXJyLCByZXRyaWVzID0gLTEsIGVub21lbV9yZXRyaWVzID0gMDsKKworCWRvIHsKKwkJcmV0cmllcysrOworCQljb25kX3Jlc2NoZWQoKTsKKwkJZXJyID0gcmhhc2h0YWJsZV9pbnNlcnRfZmFzdChodCwgb2JqLCBwYXJhbXMpOworCQlpZiAoZXJyID09IC1FTk9NRU0gJiYgZW5vbWVtX3JldHJ5KSB7CisJCQllbm9tZW1fcmV0cmllcysrOworCQkJZXJyID0gLUVCVVNZOworCQl9CisJfSB3aGlsZSAoZXJyID09IC1FQlVTWSk7CisKKwlpZiAoZW5vbWVtX3JldHJpZXMpCisJCXByX2luZm8oIiAldSBpbnNlcnRpb25zIHJldHJpZWQgYWZ0ZXIgLUVOT01FTVxuIiwKKwkJCWVub21lbV9yZXRyaWVzKTsKKworCXJldHVybiBlcnIgPyA6IHJldHJpZXM7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3Rfcmh0X2xvb2t1cChzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllcyAqIDI7IGkrKykgeworCQlzdHJ1Y3QgdGVzdF9vYmogKm9iajsKKwkJYm9vbCBleHBlY3RlZCA9ICEoaSAlIDIpOworCQlzdHJ1Y3QgdGVzdF9vYmpfdmFsIGtleSA9IHsKKwkJCS5pZCA9IGksCisJCX07CisKKwkJaWYgKGFycmF5W2kgLyAyXS52YWx1ZS5pZCA9PSBURVNUX0lOU0VSVF9GQUlMKQorCQkJZXhwZWN0ZWQgPSBmYWxzZTsKKworCQlvYmogPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KGh0LCAma2V5LCB0ZXN0X3JodF9wYXJhbXMpOworCisJCWlmIChleHBlY3RlZCAmJiAhb2JqKSB7CisJCQlwcl93YXJuKCJUZXN0IGZhaWxlZDogQ291bGQgbm90IGZpbmQga2V5ICV1XG4iLCBrZXkuaWQpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0gZWxzZSBpZiAoIWV4cGVjdGVkICYmIG9iaikgeworCQkJcHJfd2FybigiVGVzdCBmYWlsZWQ6IFVuZXhwZWN0ZWQgZW50cnkgZm91bmQgZm9yIGtleSAldVxuIiwKKwkJCQlrZXkuaWQpOworCQkJcmV0dXJuIC1FRVhJU1Q7CisJCX0gZWxzZSBpZiAoZXhwZWN0ZWQgJiYgb2JqKSB7CisJCQlpZiAob2JqLT52YWx1ZS5pZCAhPSBpKSB7CisJCQkJcHJfd2FybigiVGVzdCBmYWlsZWQ6IExvb2t1cCB2YWx1ZSBtaXNtYXRjaCAldSE9JXVcbiIsCisJCQkJCW9iai0+dmFsdWUuaWQsIGkpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisKKwkJY29uZF9yZXNjaGVkX3JjdSgpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X2J1Y2tldF9zdGF0cyhzdHJ1Y3Qgcmhhc2h0YWJsZSAqaHQpCit7CisJdW5zaWduZWQgaW50IGVyciwgdG90YWwgPSAwLCBjaGFpbl9sZW4gPSAwOworCXN0cnVjdCByaGFzaHRhYmxlX2l0ZXIgaHRpOworCXN0cnVjdCByaGFzaF9oZWFkICpwb3M7CisKKwllcnIgPSByaGFzaHRhYmxlX3dhbGtfaW5pdChodCwgJmh0aSwgR0ZQX0tFUk5FTCk7CisJaWYgKGVycikgeworCQlwcl93YXJuKCJUZXN0IGZhaWxlZDogYWxsb2NhdGlvbiBlcnJvciIpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gcmhhc2h0YWJsZV93YWxrX3N0YXJ0KCZodGkpOworCWlmIChlcnIgJiYgZXJyICE9IC1FQUdBSU4pIHsKKwkJcHJfd2FybigiVGVzdCBmYWlsZWQ6IGl0ZXJhdG9yIGZhaWxlZDogJWRcbiIsIGVycik7CisJCXJldHVybjsKKwl9CisKKwl3aGlsZSAoKHBvcyA9IHJoYXNodGFibGVfd2Fsa19uZXh0KCZodGkpKSkgeworCQlpZiAoUFRSX0VSUihwb3MpID09IC1FQUdBSU4pIHsKKwkJCXByX2luZm8oIkluZm86IGVuY291bnRlcmVkIHJlc2l6ZVxuIik7CisJCQljaGFpbl9sZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKElTX0VSUihwb3MpKSB7CisJCQlwcl93YXJuKCJUZXN0IGZhaWxlZDogcmhhc2h0YWJsZV93YWxrX25leHQoKSBlcnJvcjogJWxkXG4iLAorCQkJCVBUUl9FUlIocG9zKSk7CisJCQlicmVhazsKKwkJfQorCisJCXRvdGFsKys7CisJfQorCisJcmhhc2h0YWJsZV93YWxrX3N0b3AoJmh0aSk7CisJcmhhc2h0YWJsZV93YWxrX2V4aXQoJmh0aSk7CisKKwlwcl9pbmZvKCIgIFRyYXZlcnNhbCBjb21wbGV0ZTogY291bnRlZD0ldSwgbmVsZW1zPSV1LCBlbnRyaWVzPSVkLCB0YWJsZS1qdW1wcz0ldVxuIiwKKwkJdG90YWwsIGF0b21pY19yZWFkKCZodC0+bmVsZW1zKSwgZW50cmllcywgY2hhaW5fbGVuKTsKKworCWlmICh0b3RhbCAhPSBhdG9taWNfcmVhZCgmaHQtPm5lbGVtcykgfHwgdG90YWwgIT0gZW50cmllcykKKwkJcHJfd2FybigiVGVzdCBmYWlsZWQ6IFRvdGFsIGNvdW50IG1pc21hdGNoIF5eXiIpOworfQorCitzdGF0aWMgczY0IF9faW5pdCB0ZXN0X3JoYXNodGFibGUoc3RydWN0IHJoYXNodGFibGUgKmh0KQoreworCXN0cnVjdCB0ZXN0X29iaiAqb2JqOworCWludCBlcnI7CisJdW5zaWduZWQgaW50IGksIGluc2VydF9yZXRyaWVzID0gMDsKKwlzNjQgc3RhcnQsIGVuZDsKKworCS8qCisJICogSW5zZXJ0aW9uIFRlc3Q6CisJICogSW5zZXJ0IGVudHJpZXMgaW50byB0YWJsZSB3aXRoIGFsbCBrZXlzIGV2ZW4gbnVtYmVycworCSAqLworCXByX2luZm8oIiAgQWRkaW5nICVkIGtleXNcbiIsIGVudHJpZXMpOworCXN0YXJ0ID0ga3RpbWVfZ2V0X25zKCk7CisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgdGVzdF9vYmogKm9iaiA9ICZhcnJheVtpXTsKKworCQlvYmotPnZhbHVlLmlkID0gaSAqIDI7CisJCWVyciA9IGluc2VydF9yZXRyeShodCwgJm9iai0+bm9kZSwgdGVzdF9yaHRfcGFyYW1zKTsKKwkJaWYgKGVyciA+IDApCisJCQlpbnNlcnRfcmV0cmllcyArPSBlcnI7CisJCWVsc2UgaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGluc2VydF9yZXRyaWVzKQorCQlwcl9pbmZvKCIgICV1IGluc2VydGlvbnMgcmV0cmllZCBkdWUgdG8gbWVtb3J5IHByZXNzdXJlXG4iLAorCQkJaW5zZXJ0X3JldHJpZXMpOworCisJdGVzdF9idWNrZXRfc3RhdHMoaHQpOworCXJjdV9yZWFkX2xvY2soKTsKKwl0ZXN0X3JodF9sb29rdXAoaHQpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJdGVzdF9idWNrZXRfc3RhdHMoaHQpOworCisJcHJfaW5mbygiICBEZWxldGluZyAlZCBrZXlzXG4iLCBlbnRyaWVzKTsKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXN0cnVjdCB0ZXN0X29ial92YWwga2V5ID0geworCQkJLmlkID0gaSAqIDIsCisJCX07CisKKwkJaWYgKGFycmF5W2ldLnZhbHVlLmlkICE9IFRFU1RfSU5TRVJUX0ZBSUwpIHsKKwkJCW9iaiA9IHJoYXNodGFibGVfbG9va3VwX2Zhc3QoaHQsICZrZXksIHRlc3Rfcmh0X3BhcmFtcyk7CisJCQlCVUdfT04oIW9iaik7CisKKwkJCXJoYXNodGFibGVfcmVtb3ZlX2Zhc3QoaHQsICZvYmotPm5vZGUsIHRlc3Rfcmh0X3BhcmFtcyk7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisKKwllbmQgPSBrdGltZV9nZXRfbnMoKTsKKwlwcl9pbmZvKCIgIER1cmF0aW9uIG9mIHRlc3Q6ICVsbGQgbnNcbiIsIGVuZCAtIHN0YXJ0KTsKKworCXJldHVybiBlbmQgLSBzdGFydDsKK30KKworc3RhdGljIHN0cnVjdCByaGFzaHRhYmxlIGh0OworCitzdGF0aWMgaW50IHRocmVhZF9sb29rdXBfdGVzdChzdHJ1Y3QgdGhyZWFkX2RhdGEgKnRkYXRhKQoreworCWludCBpLCBlcnIgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkrKykgeworCQlzdHJ1Y3QgdGVzdF9vYmogKm9iajsKKwkJc3RydWN0IHRlc3Rfb2JqX3ZhbCBrZXkgPSB7CisJCQkuaWQgPSBpLAorCQkJLnRpZCA9IHRkYXRhLT5pZCwKKwkJfTsKKworCQlvYmogPSByaGFzaHRhYmxlX2xvb2t1cF9mYXN0KCZodCwgJmtleSwgdGVzdF9yaHRfcGFyYW1zKTsKKwkJaWYgKG9iaiAmJiAodGRhdGEtPm9ianNbaV0udmFsdWUuaWQgPT0gVEVTVF9JTlNFUlRfRkFJTCkpIHsKKwkJCXByX2VycigiICBmb3VuZCB1bmV4cGVjdGVkIG9iamVjdCAlZC0lZFxuIiwga2V5LnRpZCwga2V5LmlkKTsKKwkJCWVycisrOworCQl9IGVsc2UgaWYgKCFvYmogJiYgKHRkYXRhLT5vYmpzW2ldLnZhbHVlLmlkICE9IFRFU1RfSU5TRVJUX0ZBSUwpKSB7CisJCQlwcl9lcnIoIiAgb2JqZWN0ICVkLSVkIG5vdCBmb3VuZCFcbiIsIGtleS50aWQsIGtleS5pZCk7CisJCQllcnIrKzsKKwkJfSBlbHNlIGlmIChvYmogJiYgbWVtY21wKCZvYmotPnZhbHVlLCAma2V5LCBzaXplb2Yoa2V5KSkpIHsKKwkJCXByX2VycigiICB3cm9uZyBvYmplY3QgcmV0dXJuZWQgKGdvdCAlZC0lZCwgZXhwZWN0ZWQgJWQtJWQpXG4iLAorCQkJICAgICAgIG9iai0+dmFsdWUudGlkLCBvYmotPnZhbHVlLmlkLCBrZXkudGlkLCBrZXkuaWQpOworCQkJZXJyKys7CisJCX0KKworCQljb25kX3Jlc2NoZWQoKTsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0aHJlYWRmdW5jKHZvaWQgKmRhdGEpCit7CisJaW50IGksIHN0ZXAsIGVyciA9IDAsIGluc2VydF9yZXRyaWVzID0gMDsKKwlzdHJ1Y3QgdGhyZWFkX2RhdGEgKnRkYXRhID0gZGF0YTsKKworCXVwKCZwcmVzdGFydF9zZW0pOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJnN0YXJ0dXBfc2VtKSkKKwkJcHJfZXJyKCIgIHRocmVhZFslZF06IGRvd25faW50ZXJydXB0aWJsZSBmYWlsZWRcbiIsIHRkYXRhLT5pZCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSsrKSB7CisJCXRkYXRhLT5vYmpzW2ldLnZhbHVlLmlkID0gaTsKKwkJdGRhdGEtPm9ianNbaV0udmFsdWUudGlkID0gdGRhdGEtPmlkOworCQllcnIgPSBpbnNlcnRfcmV0cnkoJmh0LCAmdGRhdGEtPm9ianNbaV0ubm9kZSwgdGVzdF9yaHRfcGFyYW1zKTsKKwkJaWYgKGVyciA+IDApIHsKKwkJCWluc2VydF9yZXRyaWVzICs9IGVycjsKKwkJfSBlbHNlIGlmIChlcnIpIHsKKwkJCXByX2VycigiICB0aHJlYWRbJWRdOiByaGFzaHRhYmxlX2luc2VydF9mYXN0IGZhaWxlZFxuIiwKKwkJCSAgICAgICB0ZGF0YS0+aWQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKGluc2VydF9yZXRyaWVzKQorCQlwcl9pbmZvKCIgIHRocmVhZFslZF06ICV1IGluc2VydGlvbnMgcmV0cmllZCBkdWUgdG8gbWVtb3J5IHByZXNzdXJlXG4iLAorCQkJdGRhdGEtPmlkLCBpbnNlcnRfcmV0cmllcyk7CisKKwllcnIgPSB0aHJlYWRfbG9va3VwX3Rlc3QodGRhdGEpOworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCIgIHRocmVhZFslZF06IHJoYXNodGFibGVfbG9va3VwX3Rlc3QgZmFpbGVkXG4iLAorCQkgICAgICAgdGRhdGEtPmlkKTsKKwkJZ290byBvdXQ7CisJfQorCisJZm9yIChzdGVwID0gMTA7IHN0ZXAgPiAwOyBzdGVwLS0pIHsKKwkJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkgKz0gc3RlcCkgeworCQkJaWYgKHRkYXRhLT5vYmpzW2ldLnZhbHVlLmlkID09IFRFU1RfSU5TRVJUX0ZBSUwpCisJCQkJY29udGludWU7CisJCQllcnIgPSByaGFzaHRhYmxlX3JlbW92ZV9mYXN0KCZodCwgJnRkYXRhLT5vYmpzW2ldLm5vZGUsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfcmh0X3BhcmFtcyk7CisJCQlpZiAoZXJyKSB7CisJCQkJcHJfZXJyKCIgIHRocmVhZFslZF06IHJoYXNodGFibGVfcmVtb3ZlX2Zhc3QgZmFpbGVkXG4iLAorCQkJCSAgICAgICB0ZGF0YS0+aWQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdGRhdGEtPm9ianNbaV0udmFsdWUuaWQgPSBURVNUX0lOU0VSVF9GQUlMOworCisJCQljb25kX3Jlc2NoZWQoKTsKKwkJfQorCQllcnIgPSB0aHJlYWRfbG9va3VwX3Rlc3QodGRhdGEpOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoIiAgdGhyZWFkWyVkXTogcmhhc2h0YWJsZV9sb29rdXBfdGVzdCAoMikgZmFpbGVkXG4iLAorCQkJICAgICAgIHRkYXRhLT5pZCk7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KK291dDoKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X3JodF9pbml0KHZvaWQpCit7CisJaW50IGksIGVyciwgc3RhcnRlZF90aHJlYWRzID0gMCwgZmFpbGVkX3RocmVhZHMgPSAwOworCXU2NCB0b3RhbF90aW1lID0gMDsKKwlzdHJ1Y3QgdGhyZWFkX2RhdGEgKnRkYXRhOworCXN0cnVjdCB0ZXN0X29iaiAqb2JqczsKKworCWVudHJpZXMgPSBtaW4oZW50cmllcywgTUFYX0VOVFJJRVMpOworCisJdGVzdF9yaHRfcGFyYW1zLmF1dG9tYXRpY19zaHJpbmtpbmcgPSBzaHJpbmtpbmc7CisJdGVzdF9yaHRfcGFyYW1zLm1heF9zaXplID0gbWF4X3NpemUgPyA6IHJvdW5kdXBfcG93X29mX3R3byhlbnRyaWVzKTsKKwl0ZXN0X3JodF9wYXJhbXMubmVsZW1faGludCA9IHNpemU7CisKKwlwcl9pbmZvKCJSdW5uaW5nIHJoYXNodGFibGUgdGVzdCBuZWxlbT0lZCwgbWF4X3NpemU9JWQsIHNocmlua2luZz0lZFxuIiwKKwkJc2l6ZSwgbWF4X3NpemUsIHNocmlua2luZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnVuczsgaSsrKSB7CisJCXM2NCB0aW1lOworCisJCXByX2luZm8oIlRlc3QgJTAyZDpcbiIsIGkpOworCQltZW1zZXQoJmFycmF5LCAwLCBzaXplb2YoYXJyYXkpKTsKKwkJZXJyID0gcmhhc2h0YWJsZV9pbml0KCZodCwgJnRlc3Rfcmh0X3BhcmFtcyk7CisJCWlmIChlcnIgPCAwKSB7CisJCQlwcl93YXJuKCJUZXN0IGZhaWxlZDogVW5hYmxlIHRvIGluaXRpYWxpemUgaGFzaHRhYmxlOiAlZFxuIiwKKwkJCQllcnIpOworCQkJY29udGludWU7CisJCX0KKworCQl0aW1lID0gdGVzdF9yaGFzaHRhYmxlKCZodCk7CisJCXJoYXNodGFibGVfZGVzdHJveSgmaHQpOworCQlpZiAodGltZSA8IDApIHsKKwkJCXByX3dhcm4oIlRlc3QgZmFpbGVkOiByZXR1cm4gY29kZSAlbGxkXG4iLCB0aW1lKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJdG90YWxfdGltZSArPSB0aW1lOworCX0KKworCWRvX2Rpdih0b3RhbF90aW1lLCBydW5zKTsKKwlwcl9pbmZvKCJBdmVyYWdlIHRlc3QgdGltZTogJWxsdVxuIiwgdG90YWxfdGltZSk7CisKKwlpZiAoIXRjb3VudCkKKwkJcmV0dXJuIDA7CisKKwlwcl9pbmZvKCJUZXN0aW5nIGNvbmN1cnJlbnQgcmhhc2h0YWJsZSBhY2Nlc3MgZnJvbSAlZCB0aHJlYWRzXG4iLAorCSAgICAgICAgdGNvdW50KTsKKwlzZW1hX2luaXQoJnByZXN0YXJ0X3NlbSwgMSAtIHRjb3VudCk7CisJdGRhdGEgPSB2emFsbG9jKHRjb3VudCAqIHNpemVvZihzdHJ1Y3QgdGhyZWFkX2RhdGEpKTsKKwlpZiAoIXRkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwlvYmpzICA9IHZ6YWxsb2ModGNvdW50ICogZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdGVzdF9vYmopKTsKKwlpZiAoIW9ianMpIHsKKwkJdmZyZWUodGRhdGEpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl0ZXN0X3JodF9wYXJhbXMubWF4X3NpemUgPSBtYXhfc2l6ZSA/IDoKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZHVwX3Bvd19vZl90d28odGNvdW50ICogZW50cmllcyk7CisJZXJyID0gcmhhc2h0YWJsZV9pbml0KCZodCwgJnRlc3Rfcmh0X3BhcmFtcyk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJfd2FybigiVGVzdCBmYWlsZWQ6IFVuYWJsZSB0byBpbml0aWFsaXplIGhhc2h0YWJsZTogJWRcbiIsCisJCQllcnIpOworCQl2ZnJlZSh0ZGF0YSk7CisJCXZmcmVlKG9ianMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm9yIChpID0gMDsgaSA8IHRjb3VudDsgaSsrKSB7CisJCXRkYXRhW2ldLmlkID0gaTsKKwkJdGRhdGFbaV0ub2JqcyA9IG9ianMgKyBpICogZW50cmllczsKKwkJdGRhdGFbaV0udGFzayA9IGt0aHJlYWRfcnVuKHRocmVhZGZ1bmMsICZ0ZGF0YVtpXSwKKwkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyaGFzaHRhYmxlX3RocmFkWyVkXSIsIGkpOworCQlpZiAoSVNfRVJSKHRkYXRhW2ldLnRhc2spKQorCQkJcHJfZXJyKCIga3RocmVhZF9ydW4gZmFpbGVkIGZvciB0aHJlYWQgJWRcbiIsIGkpOworCQllbHNlCisJCQlzdGFydGVkX3RocmVhZHMrKzsKKwl9CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmcHJlc3RhcnRfc2VtKSkKKwkJcHJfZXJyKCIgIGRvd24gaW50ZXJydXB0aWJsZSBmYWlsZWRcbiIpOworCWZvciAoaSA9IDA7IGkgPCB0Y291bnQ7IGkrKykKKwkJdXAoJnN0YXJ0dXBfc2VtKTsKKwlmb3IgKGkgPSAwOyBpIDwgdGNvdW50OyBpKyspIHsKKwkJaWYgKElTX0VSUih0ZGF0YVtpXS50YXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGVyciA9IGt0aHJlYWRfc3RvcCh0ZGF0YVtpXS50YXNrKSkpIHsKKwkJCXByX3dhcm4oIlRlc3QgZmFpbGVkOiB0aHJlYWQgJWQgcmV0dXJuZWQ6ICVkXG4iLAorCQkJICAgICAgICBpLCBlcnIpOworCQkJZmFpbGVkX3RocmVhZHMrKzsKKwkJfQorCX0KKwlwcl9pbmZvKCJTdGFydGVkICVkIHRocmVhZHMsICVkIGZhaWxlZFxuIiwKKwkgICAgICAgIHN0YXJ0ZWRfdGhyZWFkcywgZmFpbGVkX3RocmVhZHMpOworCXJoYXNodGFibGVfZGVzdHJveSgmaHQpOworCXZmcmVlKHRkYXRhKTsKKwl2ZnJlZShvYmpzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRlc3Rfcmh0X2V4aXQodm9pZCkKK3sKK30KKworbW9kdWxlX2luaXQodGVzdF9yaHRfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZXN0X3JodF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9zaXBoYXNoLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3NpcGhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQ4NTRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9zaXBoYXNoLmMKQEAgLTAsMCArMSwyMjMgQEAKKy8qIFRlc3QgY2FzZXMgZm9yIHNpcGhhc2guYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBKYXNvbiBBLiBEb25lbmZlbGQgPEphc29uQHp4MmM0LmNvbT4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4KKyAqCisgKiBTaXBIYXNoOiBhIGZhc3Qgc2hvcnQtaW5wdXQgUFJGCisgKiBodHRwczovLzEzMTAwMi5uZXQvc2lwaGFzaC8KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHNwZWNpZmljYWxseSBmb3IgU2lwSGFzaDItNCBmb3IgYSBzZWN1cmUgUFJGCisgKiBhbmQgSGFsZlNpcEhhc2gxLTMvU2lwSGFzaDEtMyBmb3IgYW4gaW5zZWN1cmUgUFJGIG9ubHkgc3VpdGFibGUgZm9yCisgKiBoYXNodGFibGVzLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L3NpcGhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKiBUZXN0IHZlY3RvcnMgdGFrZW4gZnJvbSByZWZlcmVuY2Ugc291cmNlIGF2YWlsYWJsZSBhdDoKKyAqICAgICBodHRwczovL2dpdGh1Yi5jb20vdmVvcnEvU2lwSGFzaAorICovCisKK3N0YXRpYyBjb25zdCBzaXBoYXNoX2tleV90IHRlc3Rfa2V5X3NpcGhhc2ggPQorCXt7IDB4MDcwNjA1MDQwMzAyMDEwMFVMTCwgMHgwZjBlMGQwYzBiMGEwOTA4VUxMIH19OworCitzdGF0aWMgY29uc3QgdTY0IHRlc3RfdmVjdG9yc19zaXBoYXNoWzY0XSA9IHsKKwkweDcyNmZkYjQ3ZGQwZTBlMzFVTEwsIDB4NzRmODM5YzU5M2RjNjdmZFVMTCwgMHgwZDZjODAwOWQ5YTk0ZjVhVUxMLAorCTB4ODU2NzY2OTZkN2ZiN2UyZFVMTCwgMHhjZjI3OTRlMDI3NzE4N2I3VUxMLCAweDE4NzY1NTY0Y2Q5OWE2OGRVTEwsCisJMHhjYmM5NDY2ZTU4ZmVlM2NlVUxMLCAweGFiMDIwMGY1OGIwMWQxMzdVTEwsIDB4OTNmNWY1Nzk5YTkzMjQ2MlVMTCwKKwkweDllMDA4MmRmMGJhOWU0YjBVTEwsIDB4N2E1ZGJiYzU5NGRkYjlmM1VMTCwgMHhmNGIzMmY0NjIyNmJhZGE3VUxMLAorCTB4NzUxZThmYmM4NjBlZTVmYlVMTCwgMHgxNGVhNTYyN2MwODQzZDkwVUxMLCAweGY3MjNjYTkwOGU3YWYyZWVVTEwsCisJMHhhMTI5Y2E2MTQ5YmU0NWU1VUxMLCAweDNmMmFjYzdmNTdjMjliZGJVTEwsIDB4Njk5YWU5ZjUyY2JlNDc5NFVMTCwKKwkweDRiYzFiM2YwOTY4ZGQzOWNVTEwsIDB4YmI2ZGM5MWRhNzc5NjFiZFVMTCwgMHhiZWQ2NWNmMjFhYTJlZTk4VUxMLAorCTB4ZDBmMmNiYjAyZTNiNjdjN1VMTCwgMHg5MzUzNjc5NWUzYTMzZTg4VUxMLCAweGE4MGMwMzhjY2Q1Y2NlYzhVTEwsCisJMHhiOGFkNTBjNmY2NDlhZjk0VUxMLCAweGJjZTE5MmRlOGE4NWI4ZWFVTEwsIDB4MTdkODM1Yjg1YmJiMTVmM1VMTCwKKwkweDJmMmU2MTYzMDc2YmNmYWRVTEwsIDB4ZGU0ZGFhYWNhNzFkYzlhNVVMTCwgMHhhNmEyNTA2Njg3OTU2NTcxVUxMLAorCTB4YWQ4N2EzNTM1YzQ5ZWYyOFVMTCwgMHgzMmQ4OTJmYWQ4NDFjMzQyVUxMLCAweDcxMjc1MTJmNzJmMjdjY2VVTEwsCisJMHhhN2YzMjM0NmY5NTk3OGUzVUxMLCAweDEyZTBiMDFhYmIwNTEyMzhVTEwsIDB4MTVlMDM0ZDQwZmExOTdhZVVMTCwKKwkweDMxNGRmZmJlMDgxNWEzYjRVTEwsIDB4MDI3OTkwZjAyOTYyMzk4MVVMTCwgMHhjYWRjZDRlNTllZjQwYzRkVUxMLAorCTB4OWFiZmQ4NzY2YTMzNzM1Y1VMTCwgMHgwZTNlYTk2YjUzMDRhN2QwVUxMLCAweGFkMGM0MmQ2ZmM1ODU5OTJVTEwsCisJMHgxODczMDZjODliYzIxNWE5VUxMLCAweGQ0YTYwYWJjZjM3OTJiOTVVTEwsIDB4ZjkzNTQ1MWRlNGYyMWRmMlVMTCwKKwkweGE5NTM4ZjA0MTk3NTU3ODdVTEwsIDB4ZGI5YWNkZGZmNTZjYTUxMFVMTCwgMHhkMDZjOThjZDVjMDk3NWViVUxMLAorCTB4ZTYxMmEzY2I5ZWNiYTk1MVVMTCwgMHhjNzY2ZTYyY2ZjYWRhZjk2VUxMLCAweGVlNjQ0MzVhOTc1MmZlNzJVTEwsCisJMHhhMTkyZDU3NmIyNDUxNjVhVUxMLCAweDBhODc4N2JmOGVjYjc0YjJVTEwsIDB4ODFiM2U3M2QyMGI0OWI2ZlVMTCwKKwkweDdmYTgyMjBiYTNiMmVjZWFVTEwsIDB4MjQ1NzMxYzEzY2E0MjQ5OVVMTCwgMHhiNzhkYmZhZjNhOGQ4M2JkVUxMLAorCTB4ZWExYWQ1NjUzMjJhMWEwYlVMTCwgMHg2MGU2MWMyM2EzNzk1MDEzVUxMLCAweDY2MDZkN2U0NDYyODJiOTNVTEwsCisJMHg2Y2E0ZWNiMTVjNWY5MWUxVUxMLCAweDlmNjI2ZGExNWM5NjI1ZjNVTEwsIDB4ZTUxYjM4NjA4ZWYyNWY1N1VMTCwKKwkweDk1OGEzMjRjZWIwNjQ1NzJVTEwKK307CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CitzdGF0aWMgY29uc3QgaHNpcGhhc2hfa2V5X3QgdGVzdF9rZXlfaHNpcGhhc2ggPQorCXt7IDB4MDcwNjA1MDQwMzAyMDEwMFVMTCwgMHgwZjBlMGQwYzBiMGEwOTA4VUxMIH19OworCitzdGF0aWMgY29uc3QgdTMyIHRlc3RfdmVjdG9yc19oc2lwaGFzaFs2NF0gPSB7CisJMHgwNTBmYzRkY1UsIDB4N2Q1N2NhOTNVLCAweDRkYzdkNDRkVSwKKwkweGU3ZGRmN2ZiVSwgMHg4OGQzODMyOFUsIDB4NDk1MzNiNjdVLAorCTB4YzU5ZjIyYTdVLCAweDliYjExMTQwVSwgMHg4ZDI5OWE4ZVUsCisJMHg2YzA2M2RlNFUsIDB4OTJmZjA5N2ZVLCAweGY5NGRjMzUyVSwKKwkweDU3YjRkOWEyVSwgMHgxMjI5ZmZhN1UsIDB4YzBmOTVkMzRVLAorCTB4MmE1MTk5NTZVLCAweDdkOTA4YjY2VSwgMHg2M2RiZDgwY1UsCisJMHhiNDczZTYzZVUsIDB4OGQyOTdkMWNVLCAweGE2Y2NlMDQwVSwKKwkweDJiNDVmODQ0VSwgMHhhMzIwODcyZVUsIDB4ZGFlNmMxMjNVLAorCTB4NjczNDljOGNVLCAweDcwNWIwOTc5VSwgMHhjYTk5MTNhNVUsCisJMHg0YWRlM2IzNVUsIDB4ZWY2Y2QwMGRVLCAweDRhYjFlMWY0VSwKKwkweDQzYzVlNjYzVSwgMHg4YzIxZDFiY1UsIDB4MTZhN2I2MGRVLAorCTB4N2E4ZmY5YmZVLCAweDFmMmE3NTNlVSwgMHhiZjE4NmI5MVUsCisJMHhhZGEyNjIwNlUsIDB4YTNjMzMwNTdVLCAweGFlM2EzNmExVSwKKwkweDdiMTA4MzkyVSwgMHg5OWU0MTUzMVUsIDB4M2YxYWQ5NDRVLAorCTB4YzgxMzg4MjVVLCAweGMyODk0OWE2VSwgMHhmYWY4ODc2YlUsCisJMHg5ZjA0MjE5NlUsIDB4NjhiMWQ2MjNVLCAweDhiNTExNGZkVSwKKwkweGRmMDc0YzQ2VSwgMHgxMmNjODZiM1UsIDB4MGE1MjA5OGZVLAorCTB4OWQyOTJmOWFVLCAweGEyZjQxZjEyVSwgMHg0M2E3MWVkMFUsCisJMHg3M2YwYmNlNlUsIDB4NzBhN2U5ODBVLCAweDI0M2M2ZDc1VSwKKwkweGZkYjcxNTEzVSwgMHhhNjdkOGEwOFUsIDB4YjdlOGYxNDhVLAorCTB4ZjdhNjQ0ZWVVLCAweDBmMTgzN2YyVSwgMHg0YjY2OTRlMFUsCisJMHhiN2JiYjNhOFUKK307CisjZWxzZQorc3RhdGljIGNvbnN0IGhzaXBoYXNoX2tleV90IHRlc3Rfa2V5X2hzaXBoYXNoID0KKwl7eyAweDAzMDIwMTAwVSwgMHgwNzA2MDUwNFUgfX07CisKK3N0YXRpYyBjb25zdCB1MzIgdGVzdF92ZWN0b3JzX2hzaXBoYXNoWzY0XSA9IHsKKwkweDU4MTRjODk2VSwgMHhlN2U4NjRjYVUsIDB4YmM0YjBlMzBVLAorCTB4MDE1Mzk5MzlVLCAweDdlMDU5ZWE2VSwgMHg4OGUzZDg5YlUsCisJMHhhMDA4MGI2NVUsIDB4OWQzOGQ5ZDZVLCAweDU3Nzk5OWIxVSwKKwkweGM4MzljYWVkVSwgMHhlNGZhMzJjZlUsIDB4OTU5MjQ2ZWVVLAorCTB4NmIyODA5NmNVLCAweDY2ZGQ5Y2Q2VSwgMHgxNjY1OGE3Y1UsCisJMHhkMDI1N2IwNFUsIDB4OGIzMWQ1MDFVLCAweDJiMWNkMDRiVSwKKwkweDA2NzEyMzM5VSwgMHg1MjJhY2E2N1UsIDB4OTExYmI2MDVVLAorCTB4OTBhNjVmMGVVLCAweGY4MjZlZjdiVSwgMHg2MjUxMmRlYlUsCisJMHg1NzE1MGFkN1UsIDB4NWQ0NzM1MDdVLCAweDFlYzQ3NDQyVSwKKwkweGFiNjRhZmQzVSwgMHgwYTQxMDBkMFUsIDB4NmQyY2U2NTJVLAorCTB4MjMzMWI2YTNVLCAweDA4ZDg3OTFhVSwgMHhiYzZkZGE4ZFUsCisJMHhlMGY2YzkzNFUsIDB4YjA2NTIwMzNVLCAweDliOTg1MWNjVSwKKwkweDdjNDZmYjdmVSwgMHg3MzJiYThjYlUsIDB4ZjE0Mjk5N2FVLAorCTB4ZmNjOWFhMWJVLCAweDA1MzI3ZWIyVSwgMHhlMTEwMTMxY1UsCisJMHhmOWU1ZTdjMFUsIDB4YTdkNzA4YTZVLCAweDExNzk1YWIxVSwKKwkweDY1NjcxNjE5VSwgMHg5ZjVmZmY5MVUsIDB4ZDg5YzUyNjdVLAorCTB4MDA3NzgzZWJVLCAweDk1NzY2MjQzVSwgMHhhYjYzOTI2MlUsCisJMHg5YzdlMTM5MFUsIDB4YzM2OGRkYTZVLCAweDM4ZGRjNDU1VSwKKwkweGZhMTNkMzc5VSwgMHg5NzllYTRlOFUsIDB4NTNlY2Q3N2VVLAorCTB4MmVlODA2NTdVLCAweDMzZGJiNjZhVSwgMHhhZTNmMDU3N1UsCisJMHg4OGI0YzRjY1UsIDB4M2U3ZjQ4MGJVLCAweDc0YzFlYmY4VSwKKwkweDg3MTc4MzA0VQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBzaXBoYXNoX3Rlc3RfaW5pdCh2b2lkKQoreworCXU4IGluWzY0XSBfX2FsaWduZWQoU0lQSEFTSF9BTElHTk1FTlQpOworCXU4IGluX3VuYWxpZ25lZFs2NV0gX19hbGlnbmVkKFNJUEhBU0hfQUxJR05NRU5UKTsKKwl1OCBpOworCWludCByZXQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDY0OyArK2kpIHsKKwkJaW5baV0gPSBpOworCQlpbl91bmFsaWduZWRbaSArIDFdID0gaTsKKwkJaWYgKHNpcGhhc2goaW4sIGksICZ0ZXN0X2tleV9zaXBoYXNoKSAhPQorCQkJCQkJdGVzdF92ZWN0b3JzX3NpcGhhc2hbaV0pIHsKKwkJCXByX2luZm8oInNpcGhhc2ggc2VsZi10ZXN0IGFsaWduZWQgJXU6IEZBSUxcbiIsIGkgKyAxKTsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0KKwkJaWYgKHNpcGhhc2goaW5fdW5hbGlnbmVkICsgMSwgaSwgJnRlc3Rfa2V5X3NpcGhhc2gpICE9CisJCQkJCQl0ZXN0X3ZlY3RvcnNfc2lwaGFzaFtpXSkgeworCQkJcHJfaW5mbygic2lwaGFzaCBzZWxmLXRlc3QgdW5hbGlnbmVkICV1OiBGQUlMXG4iLCBpICsgMSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJCWlmIChoc2lwaGFzaChpbiwgaSwgJnRlc3Rfa2V5X2hzaXBoYXNoKSAhPQorCQkJCQkJdGVzdF92ZWN0b3JzX2hzaXBoYXNoW2ldKSB7CisJCQlwcl9pbmZvKCJoc2lwaGFzaCBzZWxmLXRlc3QgYWxpZ25lZCAldTogRkFJTFxuIiwgaSArIDEpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlpZiAoaHNpcGhhc2goaW5fdW5hbGlnbmVkICsgMSwgaSwgJnRlc3Rfa2V5X2hzaXBoYXNoKSAhPQorCQkJCQkJdGVzdF92ZWN0b3JzX2hzaXBoYXNoW2ldKSB7CisJCQlwcl9pbmZvKCJoc2lwaGFzaCBzZWxmLXRlc3QgdW5hbGlnbmVkICV1OiBGQUlMXG4iLCBpICsgMSk7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9CisJfQorCWlmIChzaXBoYXNoXzF1NjQoMHgwNzA2MDUwNDAzMDIwMTAwVUxMLCAmdGVzdF9rZXlfc2lwaGFzaCkgIT0KKwkJCQkJCXRlc3RfdmVjdG9yc19zaXBoYXNoWzhdKSB7CisJCXByX2luZm8oInNpcGhhc2ggc2VsZi10ZXN0IDF1NjQ6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoc2lwaGFzaF8ydTY0KDB4MDcwNjA1MDQwMzAyMDEwMFVMTCwgMHgwZjBlMGQwYzBiMGEwOTA4VUxMLAorCQkJICZ0ZXN0X2tleV9zaXBoYXNoKSAhPSB0ZXN0X3ZlY3RvcnNfc2lwaGFzaFsxNl0pIHsKKwkJcHJfaW5mbygic2lwaGFzaCBzZWxmLXRlc3QgMnU2NDogRkFJTFxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCWlmIChzaXBoYXNoXzN1NjQoMHgwNzA2MDUwNDAzMDIwMTAwVUxMLCAweDBmMGUwZDBjMGIwYTA5MDhVTEwsCisJCQkgMHgxNzE2MTUxNDEzMTIxMTEwVUxMLCAmdGVzdF9rZXlfc2lwaGFzaCkgIT0KKwkJCQkJCXRlc3RfdmVjdG9yc19zaXBoYXNoWzI0XSkgeworCQlwcl9pbmZvKCJzaXBoYXNoIHNlbGYtdGVzdCAzdTY0OiBGQUlMXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJaWYgKHNpcGhhc2hfNHU2NCgweDA3MDYwNTA0MDMwMjAxMDBVTEwsIDB4MGYwZTBkMGMwYjBhMDkwOFVMTCwKKwkJCSAweDE3MTYxNTE0MTMxMjExMTBVTEwsIDB4MWYxZTFkMWMxYjFhMTkxOFVMTCwKKwkJCSAmdGVzdF9rZXlfc2lwaGFzaCkgIT0gdGVzdF92ZWN0b3JzX3NpcGhhc2hbMzJdKSB7CisJCXByX2luZm8oInNpcGhhc2ggc2VsZi10ZXN0IDR1NjQ6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoc2lwaGFzaF8xdTMyKDB4MDMwMjAxMDBVLCAmdGVzdF9rZXlfc2lwaGFzaCkgIT0KKwkJCQkJCXRlc3RfdmVjdG9yc19zaXBoYXNoWzRdKSB7CisJCXByX2luZm8oInNpcGhhc2ggc2VsZi10ZXN0IDF1MzI6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoc2lwaGFzaF8ydTMyKDB4MDMwMjAxMDBVLCAweDA3MDYwNTA0VSwgJnRlc3Rfa2V5X3NpcGhhc2gpICE9CisJCQkJCQl0ZXN0X3ZlY3RvcnNfc2lwaGFzaFs4XSkgeworCQlwcl9pbmZvKCJzaXBoYXNoIHNlbGYtdGVzdCAydTMyOiBGQUlMXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJaWYgKHNpcGhhc2hfM3UzMigweDAzMDIwMTAwVSwgMHgwNzA2MDUwNFUsCisJCQkgMHgwYjBhMDkwOFUsICZ0ZXN0X2tleV9zaXBoYXNoKSAhPQorCQkJCQkJdGVzdF92ZWN0b3JzX3NpcGhhc2hbMTJdKSB7CisJCXByX2luZm8oInNpcGhhc2ggc2VsZi10ZXN0IDN1MzI6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoc2lwaGFzaF80dTMyKDB4MDMwMjAxMDBVLCAweDA3MDYwNTA0VSwKKwkJCSAweDBiMGEwOTA4VSwgMHgwZjBlMGQwY1UsICZ0ZXN0X2tleV9zaXBoYXNoKSAhPQorCQkJCQkJdGVzdF92ZWN0b3JzX3NpcGhhc2hbMTZdKSB7CisJCXByX2luZm8oInNpcGhhc2ggc2VsZi10ZXN0IDR1MzI6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoaHNpcGhhc2hfMXUzMigweDAzMDIwMTAwVSwgJnRlc3Rfa2V5X2hzaXBoYXNoKSAhPQorCQkJCQkJdGVzdF92ZWN0b3JzX2hzaXBoYXNoWzRdKSB7CisJCXByX2luZm8oImhzaXBoYXNoIHNlbGYtdGVzdCAxdTMyOiBGQUlMXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJaWYgKGhzaXBoYXNoXzJ1MzIoMHgwMzAyMDEwMFUsIDB4MDcwNjA1MDRVLCAmdGVzdF9rZXlfaHNpcGhhc2gpICE9CisJCQkJCQl0ZXN0X3ZlY3RvcnNfaHNpcGhhc2hbOF0pIHsKKwkJcHJfaW5mbygiaHNpcGhhc2ggc2VsZi10ZXN0IDJ1MzI6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoaHNpcGhhc2hfM3UzMigweDAzMDIwMTAwVSwgMHgwNzA2MDUwNFUsCisJCQkgIDB4MGIwYTA5MDhVLCAmdGVzdF9rZXlfaHNpcGhhc2gpICE9CisJCQkJCQl0ZXN0X3ZlY3RvcnNfaHNpcGhhc2hbMTJdKSB7CisJCXByX2luZm8oImhzaXBoYXNoIHNlbGYtdGVzdCAzdTMyOiBGQUlMXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisJaWYgKGhzaXBoYXNoXzR1MzIoMHgwMzAyMDEwMFUsIDB4MDcwNjA1MDRVLAorCQkJICAweDBiMGEwOTA4VSwgMHgwZjBlMGQwY1UsICZ0ZXN0X2tleV9oc2lwaGFzaCkgIT0KKwkJCQkJCXRlc3RfdmVjdG9yc19oc2lwaGFzaFsxNl0pIHsKKwkJcHJfaW5mbygiaHNpcGhhc2ggc2VsZi10ZXN0IDR1MzI6IEZBSUxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlpZiAoIXJldCkKKwkJcHJfaW5mbygic2VsZi10ZXN0czogcGFzc1xuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHNpcGhhc2hfdGVzdF9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHNpcGhhc2hfdGVzdF9pbml0KTsKK21vZHVsZV9leGl0KHNpcGhhc2hfdGVzdF9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSmFzb24gQS4gRG9uZW5mZWxkIDxKYXNvbkB6eDJjNC5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3NvcnQuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODljMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3NvcnQuYwpAQCAtMCwwICsxLDQzIEBACisjaW5jbHVkZSA8bGludXgvc29ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogYSBzaW1wbGUgYm9vdC10aW1lIHJlZ3Jlc3Npb24gdGVzdCAqLworCisjZGVmaW5lIFRFU1RfTEVOIDEwMDAKKworc3RhdGljIGludCBfX2luaXQgY21waW50KGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuICooaW50ICopYSAtICooaW50ICopYjsKK30KKworc3RhdGljIGludCBfX2luaXQgdGVzdF9zb3J0X2luaXQodm9pZCkKK3sKKwlpbnQgKmEsIGksIHIgPSAxLCBlcnIgPSAtRU5PTUVNOworCisJYSA9IGttYWxsb2NfYXJyYXkoVEVTVF9MRU4sIHNpemVvZigqYSksIEdGUF9LRVJORUwpOworCWlmICghYSkKKwkJcmV0dXJuIGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBURVNUX0xFTjsgaSsrKSB7CisJCXIgPSAociAqIDcyNTg2MSkgJSA2NTk5OworCQlhW2ldID0gcjsKKwl9CisKKwlzb3J0KGEsIFRFU1RfTEVOLCBzaXplb2YoKmEpLCBjbXBpbnQsIE5VTEwpOworCisJZXJyID0gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgVEVTVF9MRU4tMTsgaSsrKQorCQlpZiAoYVtpXSA+IGFbaSsxXSkgeworCQkJcHJfZXJyKCJ0ZXN0IGhhcyBmYWlsZWRcbiIpOworCQkJZ290byBleGl0OworCQl9CisJZXJyID0gMDsKKwlwcl9pbmZvKCJ0ZXN0IHBhc3NlZFxuIik7CitleGl0OgorCWtmcmVlKGEpOworCXJldHVybiBlcnI7Cit9CisKK21vZHVsZV9pbml0KHRlc3Rfc29ydF9pbml0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfc3RhdGljX2tleV9iYXNlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3N0YXRpY19rZXlfYmFzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTQ0N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3N0YXRpY19rZXlfYmFzZS5jCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBLZXJuZWwgbW9kdWxlIGZvciB0ZXN0aW5nIHN0YXRpYyBrZXlzLgorICoKKyAqIENvcHlyaWdodCAyMDE1IEFrYW1haSBUZWNobm9sb2dpZXMgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogQXV0aG9yczoKKyAqICAgICAgSmFzb24gQmFyb24gICAgICAgPGpiYXJvbkBha2FtYWkuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KKworLyogb2xkIGtleXMgKi8KK3N0cnVjdCBzdGF0aWNfa2V5IGJhc2Vfb2xkX3RydWVfa2V5ID0gU1RBVElDX0tFWV9JTklUX1RSVUU7CitFWFBPUlRfU1lNQk9MX0dQTChiYXNlX29sZF90cnVlX2tleSk7CitzdHJ1Y3Qgc3RhdGljX2tleSBiYXNlX2ludl9vbGRfdHJ1ZV9rZXkgPSBTVEFUSUNfS0VZX0lOSVRfVFJVRTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJhc2VfaW52X29sZF90cnVlX2tleSk7CitzdHJ1Y3Qgc3RhdGljX2tleSBiYXNlX29sZF9mYWxzZV9rZXkgPSBTVEFUSUNfS0VZX0lOSVRfRkFMU0U7CitFWFBPUlRfU1lNQk9MX0dQTChiYXNlX29sZF9mYWxzZV9rZXkpOworc3RydWN0IHN0YXRpY19rZXkgYmFzZV9pbnZfb2xkX2ZhbHNlX2tleSA9IFNUQVRJQ19LRVlfSU5JVF9GQUxTRTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJhc2VfaW52X29sZF9mYWxzZV9rZXkpOworCisvKiBuZXcga2V5cyAqLworREVGSU5FX1NUQVRJQ19LRVlfVFJVRShiYXNlX3RydWVfa2V5KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGJhc2VfdHJ1ZV9rZXkpOworREVGSU5FX1NUQVRJQ19LRVlfVFJVRShiYXNlX2ludl90cnVlX2tleSk7CitFWFBPUlRfU1lNQk9MX0dQTChiYXNlX2ludl90cnVlX2tleSk7CitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShiYXNlX2ZhbHNlX2tleSk7CitFWFBPUlRfU1lNQk9MX0dQTChiYXNlX2ZhbHNlX2tleSk7CitERUZJTkVfU1RBVElDX0tFWV9GQUxTRShiYXNlX2ludl9mYWxzZV9rZXkpOworRVhQT1JUX1NZTUJPTF9HUEwoYmFzZV9pbnZfZmFsc2Vfa2V5KTsKKworc3RhdGljIHZvaWQgaW52ZXJ0X2tleShzdHJ1Y3Qgc3RhdGljX2tleSAqa2V5KQoreworCWlmIChzdGF0aWNfa2V5X2VuYWJsZWQoa2V5KSkKKwkJc3RhdGljX2tleV9kaXNhYmxlKGtleSk7CisJZWxzZQorCQlzdGF0aWNfa2V5X2VuYWJsZShrZXkpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X3N0YXRpY19rZXlfYmFzZV9pbml0KHZvaWQpCit7CisJaW52ZXJ0X2tleSgmYmFzZV9pbnZfb2xkX3RydWVfa2V5KTsKKwlpbnZlcnRfa2V5KCZiYXNlX2ludl9vbGRfZmFsc2Vfa2V5KTsKKwlpbnZlcnRfa2V5KCZiYXNlX2ludl90cnVlX2tleS5rZXkpOworCWludmVydF9rZXkoJmJhc2VfaW52X2ZhbHNlX2tleS5rZXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X3N0YXRpY19rZXlfYmFzZV9leGl0KHZvaWQpCit7Cit9CisKK21vZHVsZV9pbml0KHRlc3Rfc3RhdGljX2tleV9iYXNlX2luaXQpOworbW9kdWxlX2V4aXQodGVzdF9zdGF0aWNfa2V5X2Jhc2VfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkphc29uIEJhcm9uIDxqYmFyb25AYWthbWFpLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfc3RhdGljX2tleXMuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfc3RhdGljX2tleXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTVkNzVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF9zdGF0aWNfa2V5cy5jCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogS2VybmVsIG1vZHVsZSBmb3IgdGVzdGluZyBzdGF0aWMga2V5cy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxNSBBa2FtYWkgVGVjaG5vbG9naWVzIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIEF1dGhvcnM6CisgKiAgICAgIEphc29uIEJhcm9uICAgICAgIDxqYmFyb25AYWthbWFpLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CisKKy8qIG9sZCBrZXlzICovCitzdHJ1Y3Qgc3RhdGljX2tleSBvbGRfdHJ1ZV9rZXkJPSBTVEFUSUNfS0VZX0lOSVRfVFJVRTsKK3N0cnVjdCBzdGF0aWNfa2V5IG9sZF9mYWxzZV9rZXkJPSBTVEFUSUNfS0VZX0lOSVRfRkFMU0U7CisKKy8qIG5ldyBhcGkgKi8KK0RFRklORV9TVEFUSUNfS0VZX1RSVUUodHJ1ZV9rZXkpOworREVGSU5FX1NUQVRJQ19LRVlfRkFMU0UoZmFsc2Vfa2V5KTsKKworLyogZXh0ZXJuYWwgKi8KK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleSBiYXNlX29sZF90cnVlX2tleTsKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleSBiYXNlX2ludl9vbGRfdHJ1ZV9rZXk7CitleHRlcm4gc3RydWN0IHN0YXRpY19rZXkgYmFzZV9vbGRfZmFsc2Vfa2V5OworZXh0ZXJuIHN0cnVjdCBzdGF0aWNfa2V5IGJhc2VfaW52X29sZF9mYWxzZV9rZXk7CisKKy8qIG5ldyBhcGkgKi8KK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV90cnVlIGJhc2VfdHJ1ZV9rZXk7CitleHRlcm4gc3RydWN0IHN0YXRpY19rZXlfdHJ1ZSBiYXNlX2ludl90cnVlX2tleTsKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBiYXNlX2ZhbHNlX2tleTsKK2V4dGVybiBzdHJ1Y3Qgc3RhdGljX2tleV9mYWxzZSBiYXNlX2ludl9mYWxzZV9rZXk7CisKKworc3RydWN0IHRlc3Rfa2V5IHsKKwlib29sCQkJaW5pdF9zdGF0ZTsKKwlzdHJ1Y3Qgc3RhdGljX2tleQkqa2V5OworCWJvb2wJCQkoKnRlc3Rfa2V5KSh2b2lkKTsKK307CisKKyNkZWZpbmUgdGVzdF9rZXlfZnVuYyhrZXksIGJyYW5jaCkJXAorc3RhdGljIGJvb2wga2V5ICMjIF8gIyMgYnJhbmNoKHZvaWQpCVwKK3sJCQkJCVwKKwlyZXR1cm4gYnJhbmNoKCZrZXkpOwkJXAorfQorCitzdGF0aWMgdm9pZCBpbnZlcnRfa2V5KHN0cnVjdCBzdGF0aWNfa2V5ICprZXkpCit7CisJaWYgKHN0YXRpY19rZXlfZW5hYmxlZChrZXkpKQorCQlzdGF0aWNfa2V5X2Rpc2FibGUoa2V5KTsKKwllbHNlCisJCXN0YXRpY19rZXlfZW5hYmxlKGtleSk7Cit9CisKK3N0YXRpYyB2b2lkIGludmVydF9rZXlzKHN0cnVjdCB0ZXN0X2tleSAqa2V5cywgaW50IHNpemUpCit7CisJc3RydWN0IHN0YXRpY19rZXkgKnByZXZpb3VzID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKwkJaWYgKHByZXZpb3VzICE9IGtleXNbaV0ua2V5KSB7CisJCQlpbnZlcnRfa2V5KGtleXNbaV0ua2V5KTsKKwkJCXByZXZpb3VzID0ga2V5c1tpXS5rZXk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2tleXMoc3RydWN0IHRlc3Rfa2V5ICprZXlzLCBpbnQgc2l6ZSwgYm9vbCBpbnZlcnQpCit7CisJaW50IGk7CisJYm9vbCByZXQsIGluaXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCXJldCA9IHN0YXRpY19rZXlfZW5hYmxlZChrZXlzW2ldLmtleSk7CisJCWluaXQgPSBrZXlzW2ldLmluaXRfc3RhdGU7CisJCWlmIChyZXQgIT0gKGludmVydCA/ICFpbml0IDogaW5pdCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0ID0ga2V5c1tpXS50ZXN0X2tleSgpOworCQlpZiAoc3RhdGljX2tleV9lbmFibGVkKGtleXNbaV0ua2V5KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCXJldHVybiAwOworfQorCit0ZXN0X2tleV9mdW5jKG9sZF90cnVlX2tleSwgc3RhdGljX2tleV90cnVlKQordGVzdF9rZXlfZnVuYyhvbGRfZmFsc2Vfa2V5LCBzdGF0aWNfa2V5X2ZhbHNlKQordGVzdF9rZXlfZnVuYyh0cnVlX2tleSwgc3RhdGljX2JyYW5jaF9saWtlbHkpCit0ZXN0X2tleV9mdW5jKHRydWVfa2V5LCBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KQordGVzdF9rZXlfZnVuYyhmYWxzZV9rZXksIHN0YXRpY19icmFuY2hfbGlrZWx5KQordGVzdF9rZXlfZnVuYyhmYWxzZV9rZXksIHN0YXRpY19icmFuY2hfdW5saWtlbHkpCit0ZXN0X2tleV9mdW5jKGJhc2Vfb2xkX3RydWVfa2V5LCBzdGF0aWNfa2V5X3RydWUpCit0ZXN0X2tleV9mdW5jKGJhc2VfaW52X29sZF90cnVlX2tleSwgc3RhdGljX2tleV90cnVlKQordGVzdF9rZXlfZnVuYyhiYXNlX29sZF9mYWxzZV9rZXksIHN0YXRpY19rZXlfZmFsc2UpCit0ZXN0X2tleV9mdW5jKGJhc2VfaW52X29sZF9mYWxzZV9rZXksIHN0YXRpY19rZXlfZmFsc2UpCit0ZXN0X2tleV9mdW5jKGJhc2VfdHJ1ZV9rZXksIHN0YXRpY19icmFuY2hfbGlrZWx5KQordGVzdF9rZXlfZnVuYyhiYXNlX3RydWVfa2V5LCBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KQordGVzdF9rZXlfZnVuYyhiYXNlX2ludl90cnVlX2tleSwgc3RhdGljX2JyYW5jaF9saWtlbHkpCit0ZXN0X2tleV9mdW5jKGJhc2VfaW52X3RydWVfa2V5LCBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KQordGVzdF9rZXlfZnVuYyhiYXNlX2ZhbHNlX2tleSwgc3RhdGljX2JyYW5jaF9saWtlbHkpCit0ZXN0X2tleV9mdW5jKGJhc2VfZmFsc2Vfa2V5LCBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KQordGVzdF9rZXlfZnVuYyhiYXNlX2ludl9mYWxzZV9rZXksIHN0YXRpY19icmFuY2hfbGlrZWx5KQordGVzdF9rZXlfZnVuYyhiYXNlX2ludl9mYWxzZV9rZXksIHN0YXRpY19icmFuY2hfdW5saWtlbHkpCisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3Rfc3RhdGljX2tleV9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlpbnQgc2l6ZTsKKworCXN0cnVjdCB0ZXN0X2tleSBzdGF0aWNfa2V5X3Rlc3RzW10gPSB7CisJCS8qIGludGVybmFsIGtleXMgLSBvbGQga2V5cyAqLworCQl7CisJCQkuaW5pdF9zdGF0ZQk9IHRydWUsCisJCQkua2V5CQk9ICZvbGRfdHJ1ZV9rZXksCisJCQkudGVzdF9rZXkJPSAmb2xkX3RydWVfa2V5X3N0YXRpY19rZXlfdHJ1ZSwKKwkJfSwKKwkJeworCQkJLmluaXRfc3RhdGUJPSBmYWxzZSwKKwkJCS5rZXkJCT0gJm9sZF9mYWxzZV9rZXksCisJCQkudGVzdF9rZXkJPSAmb2xkX2ZhbHNlX2tleV9zdGF0aWNfa2V5X2ZhbHNlLAorCQl9LAorCQkvKiBpbnRlcm5hbCBrZXlzIC0gbmV3IGtleXMgKi8KKwkJeworCQkJLmluaXRfc3RhdGUJPSB0cnVlLAorCQkJLmtleQkJPSAmdHJ1ZV9rZXkua2V5LAorCQkJLnRlc3Rfa2V5CT0gJnRydWVfa2V5X3N0YXRpY19icmFuY2hfbGlrZWx5LAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IHRydWUsCisJCQkua2V5CQk9ICZ0cnVlX2tleS5rZXksCisJCQkudGVzdF9rZXkJPSAmdHJ1ZV9rZXlfc3RhdGljX2JyYW5jaF91bmxpa2VseSwKKwkJfSwKKwkJeworCQkJLmluaXRfc3RhdGUJPSBmYWxzZSwKKwkJCS5rZXkJCT0gJmZhbHNlX2tleS5rZXksCisJCQkudGVzdF9rZXkJPSAmZmFsc2Vfa2V5X3N0YXRpY19icmFuY2hfbGlrZWx5LAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IGZhbHNlLAorCQkJLmtleQkJPSAmZmFsc2Vfa2V5LmtleSwKKwkJCS50ZXN0X2tleQk9ICZmYWxzZV9rZXlfc3RhdGljX2JyYW5jaF91bmxpa2VseSwKKwkJfSwKKwkJLyogZXh0ZXJuYWwga2V5cyAtIG9sZCBrZXlzICovCisJCXsKKwkJCS5pbml0X3N0YXRlCT0gdHJ1ZSwKKwkJCS5rZXkJCT0gJmJhc2Vfb2xkX3RydWVfa2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2Vfb2xkX3RydWVfa2V5X3N0YXRpY19rZXlfdHJ1ZSwKKwkJfSwKKwkJeworCQkJLmluaXRfc3RhdGUJPSBmYWxzZSwKKwkJCS5rZXkJCT0gJmJhc2VfaW52X29sZF90cnVlX2tleSwKKwkJCS50ZXN0X2tleQk9ICZiYXNlX2ludl9vbGRfdHJ1ZV9rZXlfc3RhdGljX2tleV90cnVlLAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IGZhbHNlLAorCQkJLmtleQkJPSAmYmFzZV9vbGRfZmFsc2Vfa2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2Vfb2xkX2ZhbHNlX2tleV9zdGF0aWNfa2V5X2ZhbHNlLAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IHRydWUsCisJCQkua2V5CQk9ICZiYXNlX2ludl9vbGRfZmFsc2Vfa2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2VfaW52X29sZF9mYWxzZV9rZXlfc3RhdGljX2tleV9mYWxzZSwKKwkJfSwKKwkJLyogZXh0ZXJuYWwga2V5cyAtIG5ldyBrZXlzICovCisJCXsKKwkJCS5pbml0X3N0YXRlCT0gdHJ1ZSwKKwkJCS5rZXkJCT0gJmJhc2VfdHJ1ZV9rZXkua2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2VfdHJ1ZV9rZXlfc3RhdGljX2JyYW5jaF9saWtlbHksCisJCX0sCisJCXsKKwkJCS5pbml0X3N0YXRlCT0gdHJ1ZSwKKwkJCS5rZXkJCT0gJmJhc2VfdHJ1ZV9rZXkua2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2VfdHJ1ZV9rZXlfc3RhdGljX2JyYW5jaF91bmxpa2VseSwKKwkJfSwKKwkJeworCQkJLmluaXRfc3RhdGUJPSBmYWxzZSwKKwkJCS5rZXkJCT0gJmJhc2VfaW52X3RydWVfa2V5LmtleSwKKwkJCS50ZXN0X2tleQk9ICZiYXNlX2ludl90cnVlX2tleV9zdGF0aWNfYnJhbmNoX2xpa2VseSwKKwkJfSwKKwkJeworCQkJLmluaXRfc3RhdGUJPSBmYWxzZSwKKwkJCS5rZXkJCT0gJmJhc2VfaW52X3RydWVfa2V5LmtleSwKKwkJCS50ZXN0X2tleQk9ICZiYXNlX2ludl90cnVlX2tleV9zdGF0aWNfYnJhbmNoX3VubGlrZWx5LAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IGZhbHNlLAorCQkJLmtleQkJPSAmYmFzZV9mYWxzZV9rZXkua2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2VfZmFsc2Vfa2V5X3N0YXRpY19icmFuY2hfbGlrZWx5LAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IGZhbHNlLAorCQkJLmtleQkJPSAmYmFzZV9mYWxzZV9rZXkua2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2VfZmFsc2Vfa2V5X3N0YXRpY19icmFuY2hfdW5saWtlbHksCisJCX0sCisJCXsKKwkJCS5pbml0X3N0YXRlCT0gdHJ1ZSwKKwkJCS5rZXkJCT0gJmJhc2VfaW52X2ZhbHNlX2tleS5rZXksCisJCQkudGVzdF9rZXkJPSAmYmFzZV9pbnZfZmFsc2Vfa2V5X3N0YXRpY19icmFuY2hfbGlrZWx5LAorCQl9LAorCQl7CisJCQkuaW5pdF9zdGF0ZQk9IHRydWUsCisJCQkua2V5CQk9ICZiYXNlX2ludl9mYWxzZV9rZXkua2V5LAorCQkJLnRlc3Rfa2V5CT0gJmJhc2VfaW52X2ZhbHNlX2tleV9zdGF0aWNfYnJhbmNoX3VubGlrZWx5LAorCQl9LAorCX07CisKKwlzaXplID0gQVJSQVlfU0laRShzdGF0aWNfa2V5X3Rlc3RzKTsKKworCXJldCA9IHZlcmlmeV9rZXlzKHN0YXRpY19rZXlfdGVzdHMsIHNpemUsIGZhbHNlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWludmVydF9rZXlzKHN0YXRpY19rZXlfdGVzdHMsIHNpemUpOworCXJldCA9IHZlcmlmeV9rZXlzKHN0YXRpY19rZXlfdGVzdHMsIHNpemUsIHRydWUpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJaW52ZXJ0X2tleXMoc3RhdGljX2tleV90ZXN0cywgc2l6ZSk7CisJcmV0ID0gdmVyaWZ5X2tleXMoc3RhdGljX2tleV90ZXN0cywgc2l6ZSwgZmFsc2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldHVybiAwOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X3N0YXRpY19rZXlfZXhpdCh2b2lkKQoreworfQorCittb2R1bGVfaW5pdCh0ZXN0X3N0YXRpY19rZXlfaW5pdCk7Cittb2R1bGVfZXhpdCh0ZXN0X3N0YXRpY19rZXlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkphc29uIEJhcm9uIDxqYmFyb25AYWthbWFpLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3Rfc3lzY3RsLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3N5c2N0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDgwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3N5c2N0bC5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogcHJvYyBzeXNjdGwgdGVzdCBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgTHVpcyBSLiBSb2RyaWd1ZXogPG1jZ3JvZkBrZXJuZWwub3JnPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgYXQgeW91ciBvcHRpb24gYW55CisgKiBsYXRlciB2ZXJzaW9uOyBvciwgd2hlbiBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIExpbnV4IGtlcm5lbCBvcgorICogd2hlbiBpbmNvcnBvcmF0ZWQgaW50byBvdGhlciBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCisgKiBsaWNlbnNlOgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgY29weWxlZnQtbmV4dCAodmVyc2lvbiAwLjMuMSBvciBsYXRlcikgYXMgcHVibGlzaGVkCisgKiBhdCBodHRwOi8vY29weWxlZnQtbmV4dC5vcmcvLgorICovCisKKy8qCisgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIHRoZSBwcm9jIHN5c2N0bCBpbnRlcmZhY2VzLiAgVGhpcworICogZHJpdmVyIHJlcXVpcmVzIENPTkZJR19QUk9DX1NZU0NUTC4gSXQgd2lsbCBub3Qgbm9ybWFsbHkgYmUgbG9hZGVkIGJ5IHRoZQorICogc3lzdGVtIHVubGVzcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSBuYW1lLiBZb3UgY2FuIGFsc28gYnVpbGQgdGhpcyBkcml2ZXIKKyAqIGludG8geW91ciBrZXJuZWwuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisKK3N0YXRpYyBpbnQgaV96ZXJvOworc3RhdGljIGludCBpX29uZV9odW5kcmVkID0gMTAwOworCitzdHJ1Y3QgdGVzdF9zeXNjdGxfZGF0YSB7CisJaW50IGludF8wMDAxOworCWludCBpbnRfMDAwMjsKKwlpbnQgaW50XzAwMDNbNF07CisKKwl1bnNpZ25lZCBpbnQgdWludF8wMDAxOworCisJY2hhciBzdHJpbmdfMDAwMVs2NV07Cit9OworCitzdGF0aWMgc3RydWN0IHRlc3Rfc3lzY3RsX2RhdGEgdGVzdF9kYXRhID0geworCS5pbnRfMDAwMSA9IDYwLAorCS5pbnRfMDAwMiA9IDEsCisKKwkuaW50XzAwMDNbMF0gPSAwLAorCS5pbnRfMDAwM1sxXSA9IDEsCisJLmludF8wMDAzWzJdID0gMiwKKwkuaW50XzAwMDNbM10gPSAzLAorCisJLnVpbnRfMDAwMSA9IDMxNCwKKworCS5zdHJpbmdfMDAwMSA9ICIobm9uZSkiLAorfTsKKworLyogVGhlc2UgYXJlIGFsbCB1bmRlciAvcHJvYy9zeXMvZGVidWcvdGVzdF9zeXNjdGwvICovCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0ZXN0X3RhYmxlW10gPSB7CisJeworCQkucHJvY25hbWUJPSAiaW50XzAwMDEiLAorCQkuZGF0YQkJPSAmdGVzdF9kYXRhLmludF8wMDAxLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19taW5tYXgsCisJCS5leHRyYTEJCT0gJmlfemVybywKKwkJLmV4dHJhMiAgICAgICAgID0gJmlfb25lX2h1bmRyZWQsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJpbnRfMDAwMiIsCisJCS5kYXRhCQk9ICZ0ZXN0X2RhdGEuaW50XzAwMDIsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAorCX0sCisJeworCQkucHJvY25hbWUJPSAiaW50XzAwMDMiLAorCQkuZGF0YQkJPSAmdGVzdF9kYXRhLmludF8wMDAzLAorCQkubWF4bGVuCQk9IHNpemVvZih0ZXN0X2RhdGEuaW50XzAwMDMpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLnByb2NuYW1lCT0gInVpbnRfMDAwMSIsCisJCS5kYXRhCQk9ICZ0ZXN0X2RhdGEudWludF8wMDAxLAorCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb3VpbnR2ZWMsCisJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJzdHJpbmdfMDAwMSIsCisJCS5kYXRhCQk9ICZ0ZXN0X2RhdGEuc3RyaW5nXzAwMDEsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHRlc3RfZGF0YS5zdHJpbmdfMDAwMSksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2Rvc3RyaW5nLAorCX0sCisJeyB9Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSB0ZXN0X3N5c2N0bF90YWJsZVtdID0geworCXsKKwkJLnByb2NuYW1lCT0gInRlc3Rfc3lzY3RsIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gdGVzdF90YWJsZSwKKwl9LAorCXsgfQorfTsKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgdGVzdF9zeXNjdGxfcm9vdF90YWJsZVtdID0geworCXsKKwkJLnByb2NuYW1lCT0gImRlYnVnIiwKKwkJLm1heGxlbgkJPSAwLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gdGVzdF9zeXNjdGxfdGFibGUsCisJfSwKKwl7IH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqdGVzdF9zeXNjdGxfaGVhZGVyOworCitzdGF0aWMgaW50IF9faW5pdCB0ZXN0X3N5c2N0bF9pbml0KHZvaWQpCit7CisJdGVzdF9zeXNjdGxfaGVhZGVyID0gcmVnaXN0ZXJfc3lzY3RsX3RhYmxlKHRlc3Rfc3lzY3RsX3Jvb3RfdGFibGUpOworCWlmICghdGVzdF9zeXNjdGxfaGVhZGVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwodGVzdF9zeXNjdGxfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X3N5c2N0bF9leGl0KHZvaWQpCit7CisJaWYgKHRlc3Rfc3lzY3RsX2hlYWRlcikKKwkJdW5yZWdpc3Rlcl9zeXNjdGxfdGFibGUodGVzdF9zeXNjdGxfaGVhZGVyKTsKK30KKworbW9kdWxlX2V4aXQodGVzdF9zeXNjdGxfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkx1aXMgUi4gUm9kcmlndWV6IDxtY2dyb2ZAa2VybmVsLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Rlc3RfdXNlcl9jb3B5LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3VzZXJfY29weS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjFkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3VzZXJfY29weS5jCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogS2VybmVsIG1vZHVsZSBmb3IgdGVzdGluZyBjb3B5X3RvL2Zyb21fdXNlciBpbmZyYXN0cnVjdHVyZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogQXV0aG9yczoKKyAqICAgICAgS2VlcyBDb29rICAgICAgIDxrZWVzY29va0BjaHJvbWl1bS5vcmc+CisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tbWFuLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKworLyoKKyAqIFNldmVyYWwgMzItYml0IGFyY2hpdGVjdHVyZXMgc3VwcG9ydCA2NC1iaXQge2dldCxwdXR9X3VzZXIoKSBjYWxscy4KKyAqIEFzIHRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueXRoaW5nIHRoYXQgY2FuIHNhZmVseSBkZXRlcm1pbmUKKyAqIHRoZWlyIGNhcGFiaWxpdHkgYXQgY29tcGlsZS10aW1lLCB3ZSBqdXN0IGhhdmUgdG8gb3B0LW91dCBjZXJ0YWluIGFyY2hzLgorICovCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NCB8fCAoIShkZWZpbmVkKENPTkZJR19BUk0pICYmICFkZWZpbmVkKE1NVSkpICYmIFwKKwkJCSAgICAhZGVmaW5lZChDT05GSUdfQkxBQ0tGSU4pICYmCVwKKwkJCSAgICAhZGVmaW5lZChDT05GSUdfTTMyUikgJiYJCVwKKwkJCSAgICAhZGVmaW5lZChDT05GSUdfTTY4SykgJiYJCVwKKwkJCSAgICAhZGVmaW5lZChDT05GSUdfTUlDUk9CTEFaRSkgJiYJXAorCQkJICAgICFkZWZpbmVkKENPTkZJR19NTjEwMzAwKSAmJgkJXAorCQkJICAgICFkZWZpbmVkKENPTkZJR19OSU9TMikgJiYJCVwKKwkJCSAgICAhZGVmaW5lZChDT05GSUdfUFBDMzIpICYmCQlcCisJCQkgICAgIWRlZmluZWQoQ09ORklHX1NVUEVSSCkpCisjIGRlZmluZSBURVNUX1U2NAorI2VuZGlmCisKKyNkZWZpbmUgdGVzdChjb25kaXRpb24sIG1zZykJCVwKKyh7CQkJCQlcCisJaW50IGNvbmQgPSAoY29uZGl0aW9uKTsJCVwKKwlpZiAoY29uZCkJCQlcCisJCXByX3dhcm4oIiVzXG4iLCBtc2cpOwlcCisJY29uZDsJCQkJXAorfSkKKworc3RhdGljIGludCBfX2luaXQgdGVzdF91c2VyX2NvcHlfaW5pdCh2b2lkKQoreworCWludCByZXQgPSAwOworCWNoYXIgKmttZW07CisJY2hhciBfX3VzZXIgKnVzZXJtZW07CisJY2hhciAqYmFkX3VzZXJtZW07CisJdW5zaWduZWQgbG9uZyB1c2VyX2FkZHI7CisJdTggdmFsX3U4OworCXUxNiB2YWxfdTE2OworCXUzMiB2YWxfdTMyOworI2lmZGVmIFRFU1RfVTY0CisJdTY0IHZhbF91NjQ7CisjZW5kaWYKKworCWttZW0gPSBrbWFsbG9jKFBBR0VfU0laRSAqIDIsIEdGUF9LRVJORUwpOworCWlmICgha21lbSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1c2VyX2FkZHIgPSB2bV9tbWFwKE5VTEwsIDAsIFBBR0VfU0laRSAqIDIsCisJCQkgICAgUFJPVF9SRUFEIHwgUFJPVF9XUklURSB8IFBST1RfRVhFQywKKwkJCSAgICBNQVBfQU5PTllNT1VTIHwgTUFQX1BSSVZBVEUsIDApOworCWlmICh1c2VyX2FkZHIgPj0gKHVuc2lnbmVkIGxvbmcpKFRBU0tfU0laRSkpIHsKKwkJcHJfd2FybigiRmFpbGVkIHRvIGFsbG9jYXRlIHVzZXIgbWVtb3J5XG4iKTsKKwkJa2ZyZWUoa21lbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXVzZXJtZW0gPSAoY2hhciBfX3VzZXIgKil1c2VyX2FkZHI7CisJYmFkX3VzZXJtZW0gPSAoY2hhciAqKXVzZXJfYWRkcjsKKworCS8qCisJICogTGVnaXRpbWF0ZSB1c2FnZTogbm9uZSBvZiB0aGVzZSBjb3BpZXMgc2hvdWxkIGZhaWwuCisJICovCisJbWVtc2V0KGttZW0sIDB4M2EsIFBBR0VfU0laRSAqIDIpOworCXJldCB8PSB0ZXN0KGNvcHlfdG9fdXNlcih1c2VybWVtLCBrbWVtLCBQQUdFX1NJWkUpLAorCQkgICAgImxlZ2l0aW1hdGUgY29weV90b191c2VyIGZhaWxlZCIpOworCW1lbXNldChrbWVtLCAweDAsIFBBR0VfU0laRSk7CisJcmV0IHw9IHRlc3QoY29weV9mcm9tX3VzZXIoa21lbSwgdXNlcm1lbSwgUEFHRV9TSVpFKSwKKwkJICAgICJsZWdpdGltYXRlIGNvcHlfZnJvbV91c2VyIGZhaWxlZCIpOworCXJldCB8PSB0ZXN0KG1lbWNtcChrbWVtLCBrbWVtICsgUEFHRV9TSVpFLCBQQUdFX1NJWkUpLAorCQkgICAgImxlZ2l0aW1hdGUgdXNlcmNvcHkgZmFpbGVkIHRvIGNvcHkgZGF0YSIpOworCisjZGVmaW5lIHRlc3RfbGVnaXQoc2l6ZSwgY2hlY2spCQkJCQkJICBcCisJZG8gewkJCQkJCQkJICBcCisJCXZhbF8jI3NpemUgPSBjaGVjazsJCQkJCSAgXAorCQlyZXQgfD0gdGVzdChwdXRfdXNlcih2YWxfIyNzaXplLCAoc2l6ZSBfX3VzZXIgKil1c2VybWVtKSwgXAorCQkgICAgImxlZ2l0aW1hdGUgcHV0X3VzZXIgKCIgI3NpemUgIikgZmFpbGVkIik7CQkgIFwKKwkJdmFsXyMjc2l6ZSA9IDA7CQkJCQkJICBcCisJCXJldCB8PSB0ZXN0KGdldF91c2VyKHZhbF8jI3NpemUsIChzaXplIF9fdXNlciAqKXVzZXJtZW0pLCBcCisJCSAgICAibGVnaXRpbWF0ZSBnZXRfdXNlciAoIiAjc2l6ZSAiKSBmYWlsZWQiKTsJCSAgXAorCQlyZXQgfD0gdGVzdCh2YWxfIyNzaXplICE9IGNoZWNrLAkJCSAgXAorCQkgICAgImxlZ2l0aW1hdGUgZ2V0X3VzZXIgKCIgI3NpemUgIikgZmFpbGVkIHRvIGRvIGNvcHkiKTsgXAorCQlpZiAodmFsXyMjc2l6ZSAhPSBjaGVjaykgewkJCQkgIFwKKwkJCXByX2luZm8oIjB4JWxseCAhPSAweCVsbHhcbiIsCQkJICBcCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyl2YWxfIyNzaXplLAkJICBcCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZyljaGVjayk7CQkgIFwKKwkJfQkJCQkJCQkgIFwKKwl9IHdoaWxlICgwKQorCisJdGVzdF9sZWdpdCh1OCwgIDB4NWEpOworCXRlc3RfbGVnaXQodTE2LCAweDVhNWIpOworCXRlc3RfbGVnaXQodTMyLCAweDVhNWI1YzVkKTsKKyNpZmRlZiBURVNUX1U2NAorCXRlc3RfbGVnaXQodTY0LCAweDVhNWI1YzVkNmE2YjZjNmQpOworI2VuZGlmCisjdW5kZWYgdGVzdF9sZWdpdAorCisJLyoKKwkgKiBJbnZhbGlkIHVzYWdlOiBub25lIG9mIHRoZXNlIGNvcGllcyBzaG91bGQgc3VjY2VlZC4KKwkgKi8KKworCS8qIFByZXBhcmUga2VybmVsIG1lbW9yeSB3aXRoIGNoZWNrIHZhbHVlcy4gKi8KKwltZW1zZXQoa21lbSwgMHg1YSwgUEFHRV9TSVpFKTsKKwltZW1zZXQoa21lbSArIFBBR0VfU0laRSwgMCwgUEFHRV9TSVpFKTsKKworCS8qIFJlamVjdCBrZXJuZWwtdG8ta2VybmVsIGNvcGllcyB0aHJvdWdoIGNvcHlfZnJvbV91c2VyKCkuICovCisJcmV0IHw9IHRlc3QoIWNvcHlfZnJvbV91c2VyKGttZW0sIChjaGFyIF9fdXNlciAqKShrbWVtICsgUEFHRV9TSVpFKSwKKwkJCQkgICAgUEFHRV9TSVpFKSwKKwkJICAgICJpbGxlZ2FsIGFsbC1rZXJuZWwgY29weV9mcm9tX3VzZXIgcGFzc2VkIik7CisKKwkvKiBEZXN0aW5hdGlvbiBoYWxmIG9mIGJ1ZmZlciBzaG91bGQgaGF2ZSBiZWVuIHplcm9lZC4gKi8KKwlyZXQgfD0gdGVzdChtZW1jbXAoa21lbSArIFBBR0VfU0laRSwga21lbSwgUEFHRV9TSVpFKSwKKwkJICAgICJ6ZXJvaW5nIGZhaWx1cmUgZm9yIGlsbGVnYWwgYWxsLWtlcm5lbCBjb3B5X2Zyb21fdXNlciIpOworCisjaWYgMAorCS8qCisJICogV2hlbiBydW5uaW5nIHdpdGggU01BUC9QQU4vZXRjLCB0aGlzIHdpbGwgT29wcyB0aGUga2VybmVsCisJICogZHVlIHRvIHRoZSB6ZXJvaW5nIG9mIHVzZXJzcGFjZSBtZW1vcnkgb24gZmFpbHVyZS4gVGhpcyBuZWVkcworCSAqIHRvIGJlIHRlc3RlZCBpbiBMS0RUTSBpbnN0ZWFkLCBzaW5jZSB0aGlzIHRlc3QgbW9kdWxlIGRvZXMgbm90CisJICogZXhwZWN0IHRvIGV4cGxvZGUuCisJICovCisJcmV0IHw9IHRlc3QoIWNvcHlfZnJvbV91c2VyKGJhZF91c2VybWVtLCAoY2hhciBfX3VzZXIgKilrbWVtLAorCQkJCSAgICBQQUdFX1NJWkUpLAorCQkgICAgImlsbGVnYWwgcmV2ZXJzZWQgY29weV9mcm9tX3VzZXIgcGFzc2VkIik7CisjZW5kaWYKKwlyZXQgfD0gdGVzdCghY29weV90b191c2VyKChjaGFyIF9fdXNlciAqKWttZW0sIGttZW0gKyBQQUdFX1NJWkUsCisJCQkJICBQQUdFX1NJWkUpLAorCQkgICAgImlsbGVnYWwgYWxsLWtlcm5lbCBjb3B5X3RvX3VzZXIgcGFzc2VkIik7CisJcmV0IHw9IHRlc3QoIWNvcHlfdG9fdXNlcigoY2hhciBfX3VzZXIgKilrbWVtLCBiYWRfdXNlcm1lbSwKKwkJCQkgIFBBR0VfU0laRSksCisJCSAgICAiaWxsZWdhbCByZXZlcnNlZCBjb3B5X3RvX3VzZXIgcGFzc2VkIik7CisKKyNkZWZpbmUgdGVzdF9pbGxlZ2FsKHNpemUsIGNoZWNrKQkJCQkJICAgIFwKKwlkbyB7CQkJCQkJCQkgICAgXAorCQl2YWxfIyNzaXplID0gKGNoZWNrKTsJCQkJCSAgICBcCisJCXJldCB8PSB0ZXN0KCFnZXRfdXNlcih2YWxfIyNzaXplLCAoc2l6ZSBfX3VzZXIgKilrbWVtKSwJICAgIFwKKwkJICAgICJpbGxlZ2FsIGdldF91c2VyICgiICNzaXplICIpIHBhc3NlZCIpOwkJICAgIFwKKwkJcmV0IHw9IHRlc3QodmFsXyMjc2l6ZSAhPSAoc2l6ZSkwLAkJCSAgICBcCisJCSAgICAiemVyb2luZyBmYWlsdXJlIGZvciBpbGxlZ2FsIGdldF91c2VyICgiICNzaXplICIpIik7ICAgIFwKKwkJaWYgKHZhbF8jI3NpemUgIT0gKHNpemUpMCkgewkJCQkgICAgXAorCQkJcHJfaW5mbygiMHglbGx4ICE9IDBcbiIsCQkJICAgIFwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZhbF8jI3NpemUpOwkgICAgXAorCQl9CQkJCQkJCSAgICBcCisJCXJldCB8PSB0ZXN0KCFwdXRfdXNlcih2YWxfIyNzaXplLCAoc2l6ZSBfX3VzZXIgKilrbWVtKSwJICAgIFwKKwkJICAgICJpbGxlZ2FsIHB1dF91c2VyICgiICNzaXplICIpIHBhc3NlZCIpOwkJICAgIFwKKwl9IHdoaWxlICgwKQorCisJdGVzdF9pbGxlZ2FsKHU4LCAgMHg1YSk7CisJdGVzdF9pbGxlZ2FsKHUxNiwgMHg1YTViKTsKKwl0ZXN0X2lsbGVnYWwodTMyLCAweDVhNWI1YzVkKTsKKyNpZmRlZiBURVNUX1U2NAorCXRlc3RfaWxsZWdhbCh1NjQsIDB4NWE1YjVjNWQ2YTZiNmM2ZCk7CisjZW5kaWYKKyN1bmRlZiB0ZXN0X2lsbGVnYWwKKworCXZtX211bm1hcCh1c2VyX2FkZHIsIFBBR0VfU0laRSAqIDIpOworCWtmcmVlKGttZW0pOworCisJaWYgKHJldCA9PSAwKSB7CisJCXByX2luZm8oInRlc3RzIHBhc3NlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworbW9kdWxlX2luaXQodGVzdF91c2VyX2NvcHlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB0ZXN0X3VzZXJfY29weV9leGl0KHZvaWQpCit7CisJcHJfaW5mbygidW5sb2FkZWQuXG4iKTsKK30KKworbW9kdWxlX2V4aXQodGVzdF91c2VyX2NvcHlfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIktlZXMgQ29vayA8a2Vlc2Nvb2tAY2hyb21pdW0ub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF91dWlkLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90ZXN0X3V1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDgxOWMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGVzdF91dWlkLmMKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBUZXN0IGNhc2VzIGZvciBsaWIvdXVpZC5jIG1vZHVsZS4KKyAqLworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKworc3RydWN0IHRlc3RfdXVpZF9kYXRhIHsKKwljb25zdCBjaGFyICp1dWlkOworCWd1aWRfdCBsZTsKKwl1dWlkX3QgYmU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3RfdXVpZF9kYXRhIHRlc3RfdXVpZF90ZXN0X2RhdGFbXSA9IHsKKwl7CisJCS51dWlkID0gImMzM2Y0OTk1LTM3MDEtNDUwZS05ZmJmLTIwNmEyZTk4ZTU3NiIsCisJCS5sZSA9IEdVSURfSU5JVCgweGMzM2Y0OTk1LCAweDM3MDEsIDB4NDUwZSwgMHg5ZiwgMHhiZiwgMHgyMCwgMHg2YSwgMHgyZSwgMHg5OCwgMHhlNSwgMHg3NiksCisJCS5iZSA9IFVVSURfSU5JVCgweGMzM2Y0OTk1LCAweDM3MDEsIDB4NDUwZSwgMHg5ZiwgMHhiZiwgMHgyMCwgMHg2YSwgMHgyZSwgMHg5OCwgMHhlNSwgMHg3NiksCisJfSwKKwl7CisJCS51dWlkID0gIjY0YjQzNzFjLTc3YzEtNDhmOS04MjIxLTI5ZjA1NGZjMDIzYiIsCisJCS5sZSA9IEdVSURfSU5JVCgweDY0YjQzNzFjLCAweDc3YzEsIDB4NDhmOSwgMHg4MiwgMHgyMSwgMHgyOSwgMHhmMCwgMHg1NCwgMHhmYywgMHgwMiwgMHgzYiksCisJCS5iZSA9IFVVSURfSU5JVCgweDY0YjQzNzFjLCAweDc3YzEsIDB4NDhmOSwgMHg4MiwgMHgyMSwgMHgyOSwgMHhmMCwgMHg1NCwgMHhmYywgMHgwMiwgMHgzYiksCisJfSwKKwl7CisJCS51dWlkID0gIjBjYjRkZGZmLWE1NDUtNDQwMS05ZDA2LTY4OGFmNTNlN2Y4NCIsCisJCS5sZSA9IEdVSURfSU5JVCgweDBjYjRkZGZmLCAweGE1NDUsIDB4NDQwMSwgMHg5ZCwgMHgwNiwgMHg2OCwgMHg4YSwgMHhmNSwgMHgzZSwgMHg3ZiwgMHg4NCksCisJCS5iZSA9IFVVSURfSU5JVCgweDBjYjRkZGZmLCAweGE1NDUsIDB4NDQwMSwgMHg5ZCwgMHgwNiwgMHg2OCwgMHg4YSwgMHhmNSwgMHgzZSwgMHg3ZiwgMHg4NCksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVzdF91dWlkX3dyb25nX2RhdGFbXSA9IHsKKwkiYzMzZjQ5OTUtMzcwMS00NTBlLTlmYmYyMDZhMmU5OGU1NzYgIiwJLyogbm8gaHlwaGVuKHMpICovCisJIjY0YjQzNzFjLTc3YzEtNDhmOS04MjIxLTI5ZjA1NFhYMDIzYiIsCS8qIGludmFsaWQgY2hhcmFjdGVyKHMpICovCisJIjBjYjRkZGZmLWE1NDUtNDQwMS05ZDA2LTY4OGFmNTNlIiwJLyogbm90IGVub3VnaCBkYXRhICovCit9OworCitzdGF0aWMgdW5zaWduZWQgdG90YWxfdGVzdHMgX19pbml0ZGF0YTsKK3N0YXRpYyB1bnNpZ25lZCBmYWlsZWRfdGVzdHMgX19pbml0ZGF0YTsKKworc3RhdGljIHZvaWQgX19pbml0IHRlc3RfdXVpZF9mYWlsZWQoY29uc3QgY2hhciAqcHJlZml4LCBib29sIHdyb25nLCBib29sIGJlLAorCQkJCSAgICBjb25zdCBjaGFyICpkYXRhLCBjb25zdCBjaGFyICphY3R1YWwpCit7CisJcHJfZXJyKCIlcyB0ZXN0ICMldSAlcyAlcyBkYXRhOiAnJXMnXG4iLAorCSAgICAgICBwcmVmaXgsCisJICAgICAgIHRvdGFsX3Rlc3RzLAorCSAgICAgICB3cm9uZyA/ICJwYXNzZWQgb24gd3JvbmciIDogImZhaWxlZCBvbiIsCisJICAgICAgIGJlID8gIkJFIiA6ICJMRSIsCisJICAgICAgIGRhdGEpOworCWlmIChhY3R1YWwgJiYgKmFjdHVhbCkKKwkJcHJfZXJyKCIlcyB0ZXN0ICMldSBhY3R1YWwgZGF0YTogJyVzJ1xuIiwKKwkJICAgICAgIHByZWZpeCwKKwkJICAgICAgIHRvdGFsX3Rlc3RzLAorCQkgICAgICAgYWN0dWFsKTsKKwlmYWlsZWRfdGVzdHMrKzsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHRlc3RfdXVpZF90ZXN0KGNvbnN0IHN0cnVjdCB0ZXN0X3V1aWRfZGF0YSAqZGF0YSkKK3sKKwlndWlkX3QgbGU7CisJdXVpZF90IGJlOworCWNoYXIgYnVmWzQ4XTsKKworCS8qIExFICovCisJdG90YWxfdGVzdHMrKzsKKwlpZiAoZ3VpZF9wYXJzZShkYXRhLT51dWlkLCAmbGUpKQorCQl0ZXN0X3V1aWRfZmFpbGVkKCJjb252ZXJzaW9uIiwgZmFsc2UsIGZhbHNlLCBkYXRhLT51dWlkLCBOVUxMKTsKKworCXRvdGFsX3Rlc3RzKys7CisJaWYgKCFndWlkX2VxdWFsKCZkYXRhLT5sZSwgJmxlKSkgeworCQlzcHJpbnRmKGJ1ZiwgIiVwVWwiLCAmbGUpOworCQl0ZXN0X3V1aWRfZmFpbGVkKCJjbXAiLCBmYWxzZSwgZmFsc2UsIGRhdGEtPnV1aWQsIGJ1Zik7CisJfQorCisJLyogQkUgKi8KKwl0b3RhbF90ZXN0cysrOworCWlmICh1dWlkX3BhcnNlKGRhdGEtPnV1aWQsICZiZSkpCisJCXRlc3RfdXVpZF9mYWlsZWQoImNvbnZlcnNpb24iLCBmYWxzZSwgdHJ1ZSwgZGF0YS0+dXVpZCwgTlVMTCk7CisKKwl0b3RhbF90ZXN0cysrOworCWlmICghdXVpZF9lcXVhbCgmZGF0YS0+YmUsICZiZSkpIHsKKwkJc3ByaW50ZihidWYsICIlcFViIiwgJmJlKTsKKwkJdGVzdF91dWlkX2ZhaWxlZCgiY21wIiwgZmFsc2UsIHRydWUsIGRhdGEtPnV1aWQsIGJ1Zik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgdGVzdF91dWlkX3dyb25nKGNvbnN0IGNoYXIgKmRhdGEpCit7CisJZ3VpZF90IGxlOworCXV1aWRfdCBiZTsKKworCS8qIExFICovCisJdG90YWxfdGVzdHMrKzsKKwlpZiAoIWd1aWRfcGFyc2UoZGF0YSwgJmxlKSkKKwkJdGVzdF91dWlkX2ZhaWxlZCgibmVnYXRpdmUiLCB0cnVlLCBmYWxzZSwgZGF0YSwgTlVMTCk7CisKKwkvKiBCRSAqLworCXRvdGFsX3Rlc3RzKys7CisJaWYgKCF1dWlkX3BhcnNlKGRhdGEsICZiZSkpCisJCXRlc3RfdXVpZF9mYWlsZWQoIm5lZ2F0aXZlIiwgdHJ1ZSwgdHJ1ZSwgZGF0YSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHRlc3RfdXVpZF9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZXN0X3V1aWRfdGVzdF9kYXRhKTsgaSsrKQorCQl0ZXN0X3V1aWRfdGVzdCgmdGVzdF91dWlkX3Rlc3RfZGF0YVtpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0ZXN0X3V1aWRfd3JvbmdfZGF0YSk7IGkrKykKKwkJdGVzdF91dWlkX3dyb25nKHRlc3RfdXVpZF93cm9uZ19kYXRhW2ldKTsKKworCWlmIChmYWlsZWRfdGVzdHMgPT0gMCkKKwkJcHJfaW5mbygiYWxsICV1IHRlc3RzIHBhc3NlZFxuIiwgdG90YWxfdGVzdHMpOworCWVsc2UKKwkJcHJfZXJyKCJmYWlsZWQgJXUgb3V0IG9mICV1IHRlc3RzXG4iLCBmYWlsZWRfdGVzdHMsIHRvdGFsX3Rlc3RzKTsKKworCXJldHVybiBmYWlsZWRfdGVzdHMgPyAtRUlOVkFMIDogMDsKK30KK21vZHVsZV9pbml0KHRlc3RfdXVpZF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRlc3RfdXVpZF9leGl0KHZvaWQpCit7CisJLyogZG8gbm90aGluZyAqLworfQorbW9kdWxlX2V4aXQodGVzdF91dWlkX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RleHRzZWFyY2guYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RleHRzZWFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjc5OTA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGV4dHNlYXJjaC5jCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogbGliL3RleHRzZWFyY2guYwlHZW5lcmljIHRleHQgc2VhcmNoIGludGVyZmFjZQorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVRob21hcyBHcmFmIDx0Z3JhZkBzdXVnLmNoPgorICogCQlQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AbmV0ZmlsdGVyLm9yZz4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIElOVFJPRFVDVElPTgorICoKKyAqICAgVGhlIHRleHRzZWFyY2ggaW5mcmFzdHJ1Y3R1cmUgcHJvdmlkZXMgdGV4dCBzZWFyY2hpbmcgZmFjaWxpdGllcyBmb3IKKyAqICAgYm90aCBsaW5lYXIgYW5kIG5vbi1saW5lYXIgZGF0YS4gSW5kaXZpZHVhbCBzZWFyY2ggYWxnb3JpdGhtcyBhcmUKKyAqICAgaW1wbGVtZW50ZWQgaW4gbW9kdWxlcyBhbmQgY2hvc2VuIGJ5IHRoZSB1c2VyLgorICoKKyAqIEFSQ0hJVEVDVFVSRQorICoKKyAqICAgICAgVXNlcgorICogICAgICstLS0tLS0tLS0tLS0tLS0tKworICogICAgIHwgICAgICAgIGZpbmlzaCgpfDwtLS0tLS0tLS0tLS0tLSg2KS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgIHxnZXRfbmV4dF9ibG9jaygpfDwtLS0tLS0tLS0tLS0tLSg1KS0tLS0tLS0tLS0tLS0tLSsgfAorICogICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobSAgIHwgfAorICogICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgIGluaXQoKSAgIGZpbmQoKSAgIGRlc3Ryb3koKSB8CisgKiAgICAgfCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgIHwgICAgICAgICAgICAgICAgfCAgICAgICBDb3JlIEFQSSAgICAgICAgICAgXiAgICAgICBeICAgICAgICAgIF4KKyAqICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgKDIpICAgICAoNCkgICAgICAgICg4KQorICogICAgIHwgICAgICAgICAgICAgKDEpfC0tLS0tPnwgcHJlcGFyZSgpICAgICB8LS0tKyAgICAgICB8ICAgICAgICAgIHwKKyAqICAgICB8ICAgICAgICAgICAgICgzKXwtLS0tLT58IGZpbmQoKS9uZXh0KCkgfC0tLS0tLS0tLS0tKyAgICAgICAgICB8CisgKiAgICAgfCAgICAgICAgICAgICAoNyl8LS0tLS0+fCBkZXN0cm95KCkgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICogICAgICstLS0tLS0tLS0tLS0tLS0tKyAgICAgICstLS0tLS0tLS0tLS0tLS0rCisgKiAgCisgKiAgICgxKSBVc2VyIGNvbmZpZ3VyZXMgYSBzZWFyY2ggYnkgY2FsbGluZyBfcHJlcGFyZSgpIHNwZWNpZnlpbmcgdGhlCisgKiAgICAgICBzZWFyY2ggcGFyYW1ldGVycyBzdWNoIGFzIHRoZSBwYXR0ZXJuIGFuZCBhbGdvcml0aG0gbmFtZS4KKyAqICAgKDIpIENvcmUgcmVxdWVzdHMgdGhlIGFsZ29yaXRobSB0byBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHNlYXJjaAorICogICAgICAgY29uZmlndXJhdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLgorICogICAoMykgVXNlciBzdGFydHMgdGhlIHNlYXJjaChlcykgYnkgY2FsbGluZyBfZmluZCgpIG9yIF9uZXh0KCkgdG8KKyAqICAgICAgIGZldGNoIHN1YnNlcXVlbnQgb2NjdXJyZW5jZXMuIEEgc3RhdGUgdmFyaWFibGUgaXMgcHJvdmlkZWQKKyAqICAgICAgIHRvIHRoZSBhbGdvcml0aG0gdG8gc3RvcmUgcGVyc2lzdGVudCB2YXJpYWJsZXMuCisgKiAgICg0KSBDb3JlIGV2ZW50dWFsbHkgcmVzZXRzIHRoZSBzZWFyY2ggb2Zmc2V0IGFuZCBmb3J3YXJkcyB0aGUgZmluZCgpCisgKiAgICAgICByZXF1ZXN0IHRvIHRoZSBhbGdvcml0aG0uCisgKiAgICg1KSBBbGdvcml0aG0gY2FsbHMgZ2V0X25leHRfYmxvY2soKSBwcm92aWRlZCBieSB0aGUgdXNlciBjb250aW51b3VzbHkKKyAqICAgICAgIHRvIGZldGNoIHRoZSBkYXRhIHRvIGJlIHNlYXJjaGVkIGluIGJsb2NrIGJ5IGJsb2NrLgorICogICAoNikgQWxnb3JpdGhtIGludm9rZXMgZmluaXNoKCkgYWZ0ZXIgdGhlIGxhc3QgY2FsbCB0byBnZXRfbmV4dF9ibG9jaworICogICAgICAgdG8gY2xlYW4gdXAgYW55IGxlZnRvdmVycyBmcm9tIGdldF9uZXh0X2Jsb2NrLiAoT3B0aW9uYWwpCisgKiAgICg3KSBVc2VyIGRlc3Ryb3lzIHRoZSBjb25maWd1cmF0aW9uIGJ5IGNhbGxpbmcgX2Rlc3Ryb3koKS4KKyAqICAgKDgpIENvcmUgbm90aWZpZXMgdGhlIGFsZ29yaXRobSB0byBkZXN0cm95IGFsZ29yaXRobSBzcGVjaWZpYworICogICAgICAgYWxsb2NhdGlvbnMuIChPcHRpb25hbCkKKyAqCisgKiBVU0FHRQorICoKKyAqICAgQmVmb3JlIGEgc2VhcmNoIGNhbiBiZSBwZXJmb3JtZWQsIGEgY29uZmlndXJhdGlvbiBtdXN0IGJlIGNyZWF0ZWQKKyAqICAgYnkgY2FsbGluZyB0ZXh0c2VhcmNoX3ByZXBhcmUoKSBzcGVjaWZ5aW5nIHRoZSBzZWFyY2hpbmcgYWxnb3JpdGhtLAorICogICB0aGUgcGF0dGVybiB0byBsb29rIGZvciBhbmQgZmxhZ3MuIEFzIGEgZmxhZywgeW91IGNhbiBzZXQgVFNfSUdOT1JFQ0FTRQorICogICB0byBwZXJmb3JtIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2hpbmcuIEJ1dCBpdCBtaWdodCBzbG93IGRvd24KKyAqICAgcGVyZm9ybWFuY2Ugb2YgYWxnb3JpdGhtLCBzbyB5b3Ugc2hvdWxkIHVzZSBpdCBhdCBvd24geW91ciByaXNrLgorICogICBUaGUgcmV0dXJuZWQgY29uZmlndXJhdGlvbiBtYXkgdGhlbiBiZSB1c2VkIGZvciBhbiBhcmJpdHJhcnkKKyAqICAgYW1vdW50IG9mIHRpbWVzIGFuZCBldmVuIGluIHBhcmFsbGVsIGFzIGxvbmcgYXMgYSBzZXBhcmF0ZSBzdHJ1Y3QKKyAqICAgdHNfc3RhdGUgdmFyaWFibGUgaXMgcHJvdmlkZWQgdG8gZXZlcnkgaW5zdGFuY2UuCisgKgorICogICBUaGUgYWN0dWFsIHNlYXJjaCBpcyBwZXJmb3JtZWQgYnkgZWl0aGVyIGNhbGxpbmcgdGV4dHNlYXJjaF9maW5kXy0KKyAqICAgY29udGludW91cygpIGZvciBsaW5lYXIgZGF0YSBvciBieSBwcm92aWRpbmcgYW4gb3duIGdldF9uZXh0X2Jsb2NrKCkKKyAqICAgaW1wbGVtZW50YXRpb24gYW5kIGNhbGxpbmcgdGV4dHNlYXJjaF9maW5kKCkuIEJvdGggZnVuY3Rpb25zIHJldHVybgorICogICB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4gb3IgVUlOVF9NQVggaWYKKyAqICAgbm8gbWF0Y2ggd2FzIGZvdW5kLiBTdWJzZXF1ZW50IG9jY3VycmVuY2VzIGNhbiBiZSBmb3VuZCBieSBjYWxsaW5nCisgKiAgIHRleHRzZWFyY2hfbmV4dCgpIHJlZ2FyZGxlc3Mgb2YgdGhlIGxpbmVhcml0eSBvZiB0aGUgZGF0YS4KKyAqCisgKiAgIE9uY2UgeW91J3JlIGRvbmUgdXNpbmcgYSBjb25maWd1cmF0aW9uIGl0IG11c3QgYmUgZ2l2ZW4gYmFjayB2aWEKKyAqICAgdGV4dHNlYXJjaF9kZXN0cm95LgorICoKKyAqIEVYQU1QTEUKKyAqCisgKiAgIGludCBwb3M7CisgKiAgIHN0cnVjdCB0c19jb25maWcgKmNvbmY7CisgKiAgIHN0cnVjdCB0c19zdGF0ZSBzdGF0ZTsKKyAqICAgY29uc3QgY2hhciAqcGF0dGVybiA9ICJjaGlja2VuIjsKKyAqICAgY29uc3QgY2hhciAqZXhhbXBsZSA9ICJXZSBkYW5jZSB0aGUgZnVua3kgY2hpY2tlbiI7CisgKgorICogICBjb25mID0gdGV4dHNlYXJjaF9wcmVwYXJlKCJrbXAiLCBwYXR0ZXJuLCBzdHJsZW4ocGF0dGVybiksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0ZQX0tFUk5FTCwgVFNfQVVUT0xPQUQpOworICogICBpZiAoSVNfRVJSKGNvbmYpKSB7CisgKiAgICAgICBlcnIgPSBQVFJfRVJSKGNvbmYpOworICogICAgICAgZ290byBlcnJvdXQ7CisgKiAgIH0KKyAqCisgKiAgIHBvcyA9IHRleHRzZWFyY2hfZmluZF9jb250aW51b3VzKGNvbmYsICZzdGF0ZSwgZXhhbXBsZSwgc3RybGVuKGV4YW1wbGUpKTsKKyAqICAgaWYgKHBvcyAhPSBVSU5UX01BWCkKKyAqICAgICAgIHBhbmljKCJPaCBteSBnb2QsIGRhbmNpbmcgY2hpY2tlbnMgYXQgJWRcbiIsIHBvcyk7CisgKgorICogICB0ZXh0c2VhcmNoX2Rlc3Ryb3koY29uZik7CisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCitzdGF0aWMgTElTVF9IRUFEKHRzX29wcyk7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHRzX21vZF9sb2NrKTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdHNfb3BzICpsb29rdXBfdHNfYWxnbyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCB0c19vcHMgKm87CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UobywgJnRzX29wcywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChuYW1lLCBvLT5uYW1lKSkgeworCQkJaWYgKCF0cnlfbW9kdWxlX2dldChvLT5vd25lcikpCisJCQkJbyA9IE5VTEw7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJCXJldHVybiBvOworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qKgorICogdGV4dHNlYXJjaF9yZWdpc3RlciAtIHJlZ2lzdGVyIGEgdGV4dHNlYXJjaCBtb2R1bGUKKyAqIEBvcHM6IG9wZXJhdGlvbnMgbG9va3VwIHRhYmxlCisgKgorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBieSB0ZXh0c2VhcmNoIG1vZHVsZXMgdG8gYW5ub3VuY2UKKyAqIHRoZWlyIHByZXNlbmNlLiBUaGUgc3BlY2lmaWVkICZAb3BzIG11c3QgaGF2ZSAlbmFtZSBzZXQgdG8gYQorICogdW5pcXVlIGlkZW50aWZpZXIgYW5kIHRoZSBjYWxsYmFja3MgZmluZCgpLCBpbml0KCksIGdldF9wYXR0ZXJuKCksCisgKiBhbmQgZ2V0X3BhdHRlcm5fbGVuKCkgbXVzdCBiZSBpbXBsZW1lbnRlZC4KKyAqCisgKiBSZXR1cm5zIDAgb3IgLUVFWElTVFMgaWYgYW5vdGhlciBtb2R1bGUgaGFzIGFscmVhZHkgcmVnaXN0ZXJlZAorICogd2l0aCBzYW1lIG5hbWUuCisgKi8KK2ludCB0ZXh0c2VhcmNoX3JlZ2lzdGVyKHN0cnVjdCB0c19vcHMgKm9wcykKK3sKKwlpbnQgZXJyID0gLUVFWElTVDsKKwlzdHJ1Y3QgdHNfb3BzICpvOworCisJaWYgKG9wcy0+bmFtZSA9PSBOVUxMIHx8IG9wcy0+ZmluZCA9PSBOVUxMIHx8IG9wcy0+aW5pdCA9PSBOVUxMIHx8CisJICAgIG9wcy0+Z2V0X3BhdHRlcm4gPT0gTlVMTCB8fCBvcHMtPmdldF9wYXR0ZXJuX2xlbiA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmdHNfbW9kX2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkobywgJnRzX29wcywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChvcHMtPm5hbWUsIG8tPm5hbWUpKQorCQkJZ290byBlcnJvdXQ7CisJfQorCisJbGlzdF9hZGRfdGFpbF9yY3UoJm9wcy0+bGlzdCwgJnRzX29wcyk7CisJZXJyID0gMDsKK2Vycm91dDoKKwlzcGluX3VubG9jaygmdHNfbW9kX2xvY2spOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHRleHRzZWFyY2hfcmVnaXN0ZXIpOworCisvKioKKyAqIHRleHRzZWFyY2hfdW5yZWdpc3RlciAtIHVucmVnaXN0ZXIgYSB0ZXh0c2VhcmNoIG1vZHVsZQorICogQG9wczogb3BlcmF0aW9ucyBsb29rdXAgdGFibGUKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJ5IHRleHRzZWFyY2ggbW9kdWxlcyB0byBhbm5vdW5jZQorICogdGhlaXIgZGlzYXBwZWFyYW5jZSBmb3IgZXhhbXBsZXMgd2hlbiB0aGUgbW9kdWxlIGdldHMgdW5sb2FkZWQuCisgKiBUaGUgJm9wcyBwYXJhbWV0ZXIgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgb25lIGR1cmluZyB0aGUKKyAqIHJlZ2lzdHJhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRU5PRU5UIGlmIG5vIG1hdGNoaW5nIHRleHRzZWFyY2gKKyAqIHJlZ2lzdHJhdGlvbiB3YXMgZm91bmQuCisgKi8KK2ludCB0ZXh0c2VhcmNoX3VucmVnaXN0ZXIoc3RydWN0IHRzX29wcyAqb3BzKQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCB0c19vcHMgKm87CisKKwlzcGluX2xvY2soJnRzX21vZF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG8sICZ0c19vcHMsIGxpc3QpIHsKKwkJaWYgKG8gPT0gb3BzKSB7CisJCQlsaXN0X2RlbF9yY3UoJm8tPmxpc3QpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwllcnIgPSAtRU5PRU5UOworb3V0OgorCXNwaW5fdW5sb2NrKCZ0c19tb2RfbG9jayk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodGV4dHNlYXJjaF91bnJlZ2lzdGVyKTsKKworc3RydWN0IHRzX2xpbmVhcl9zdGF0ZQoreworCXVuc2lnbmVkIGludAlsZW47CisJY29uc3Qgdm9pZAkqZGF0YTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2xpbmVhcl9kYXRhKHVuc2lnbmVkIGludCBjb25zdW1lZCwgY29uc3QgdTggKipkc3QsCisJCQkJICAgIHN0cnVjdCB0c19jb25maWcgKmNvbmYsCisJCQkJICAgIHN0cnVjdCB0c19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHRzX2xpbmVhcl9zdGF0ZSAqc3QgPSAoc3RydWN0IHRzX2xpbmVhcl9zdGF0ZSAqKSBzdGF0ZS0+Y2I7CisKKwlpZiAobGlrZWx5KGNvbnN1bWVkIDwgc3QtPmxlbikpIHsKKwkJKmRzdCA9IHN0LT5kYXRhICsgY29uc3VtZWQ7CisJCXJldHVybiBzdC0+bGVuIC0gY29uc3VtZWQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdGV4dHNlYXJjaF9maW5kX2NvbnRpbnVvdXMgLSBzZWFyY2ggYSBwYXR0ZXJuIGluIGNvbnRpbnVvdXMvbGluZWFyIGRhdGEKKyAqIEBjb25mOiBzZWFyY2ggY29uZmlndXJhdGlvbgorICogQHN0YXRlOiBzZWFyY2ggc3RhdGUKKyAqIEBkYXRhOiBkYXRhIHRvIHNlYXJjaCBpbgorICogQGxlbjogbGVuZ3RoIG9mIGRhdGEKKyAqCisgKiBBIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0ZXh0c2VhcmNoX2ZpbmQoKSBmb3IgY29udGludW91cy9saW5lYXIgZGF0YS4KKyAqIENhbGwgdGV4dHNlYXJjaF9uZXh0KCkgdG8gcmV0cmlldmUgc3Vic2VxdWVudCBtYXRjaGVzLgorICoKKyAqIFJldHVybnMgdGhlIHBvc2l0aW9uIG9mIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHBhdHRlcm4gb3IKKyAqICVVSU5UX01BWCBpZiBubyBvY2N1cnJlbmNlIHdhcyBmb3VuZC4KKyAqLyAKK3Vuc2lnbmVkIGludCB0ZXh0c2VhcmNoX2ZpbmRfY29udGludW91cyhzdHJ1Y3QgdHNfY29uZmlnICpjb25mLAorCQkJCQlzdHJ1Y3QgdHNfc3RhdGUgKnN0YXRlLAorCQkJCQljb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXN0cnVjdCB0c19saW5lYXJfc3RhdGUgKnN0ID0gKHN0cnVjdCB0c19saW5lYXJfc3RhdGUgKikgc3RhdGUtPmNiOworCisJY29uZi0+Z2V0X25leHRfYmxvY2sgPSBnZXRfbGluZWFyX2RhdGE7CisJc3QtPmRhdGEgPSBkYXRhOworCXN0LT5sZW4gPSBsZW47CisKKwlyZXR1cm4gdGV4dHNlYXJjaF9maW5kKGNvbmYsIHN0YXRlKTsKK30KK0VYUE9SVF9TWU1CT0wodGV4dHNlYXJjaF9maW5kX2NvbnRpbnVvdXMpOworCisvKioKKyAqIHRleHRzZWFyY2hfcHJlcGFyZSAtIFByZXBhcmUgYSBzZWFyY2gKKyAqIEBhbGdvOiBuYW1lIG9mIHNlYXJjaCBhbGdvcml0aG0KKyAqIEBwYXR0ZXJuOiBwYXR0ZXJuIGRhdGEKKyAqIEBsZW46IGxlbmd0aCBvZiBwYXR0ZXJuCisgKiBAZ2ZwX21hc2s6IGFsbG9jYXRpb24gbWFzaworICogQGZsYWdzOiBzZWFyY2ggZmxhZ3MKKyAqCisgKiBMb29rcyB1cCB0aGUgc2VhcmNoIGFsZ29yaXRobSBtb2R1bGUgYW5kIGNyZWF0ZXMgYSBuZXcgdGV4dHNlYXJjaAorICogY29uZmlndXJhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwYXR0ZXJuLgorICoKKyAqIE5vdGU6IFRoZSBmb3JtYXQgb2YgdGhlIHBhdHRlcm4gbWF5IG5vdCBiZSBjb21wYXRpYmxlIGJldHdlZW4KKyAqICAgICAgIHRoZSB2YXJpb3VzIHNlYXJjaCBhbGdvcml0aG1zLgorICoKKyAqIFJldHVybnMgYSBuZXcgdGV4dHNlYXJjaCBjb25maWd1cmF0aW9uIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkCisgKiBwYXJhbWV0ZXJzIG9yIGEgRVJSX1BUUigpLiBJZiBhIHplcm8gbGVuZ3RoIHBhdHRlcm4gaXMgcGFzc2VkLCB0aGlzCisgKiBmdW5jdGlvbiByZXR1cm5zIEVJTlZBTC4KKyAqLworc3RydWN0IHRzX2NvbmZpZyAqdGV4dHNlYXJjaF9wcmVwYXJlKGNvbnN0IGNoYXIgKmFsZ28sIGNvbnN0IHZvaWQgKnBhdHRlcm4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgbGVuLCBnZnBfdCBnZnBfbWFzaywgaW50IGZsYWdzKQoreworCWludCBlcnIgPSAtRU5PRU5UOworCXN0cnVjdCB0c19jb25maWcgKmNvbmY7CisJc3RydWN0IHRzX29wcyAqb3BzOworCQorCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlvcHMgPSBsb29rdXBfdHNfYWxnbyhhbGdvKTsKKyNpZmRlZiBDT05GSUdfTU9EVUxFUworCS8qCisJICogV2h5IG5vdCBhbHdheXMgYXV0b2xvYWQgeW91IG1heSBhc2suIFNvbWUgdXNlcnMgYXJlCisJICogaW4gYSBzaXR1YXRpb24gd2hlcmUgcmVxdWVzdGluZyBhIG1vZHVsZSBtYXkgZGVhZGxvY2ssCisJICogZXNwZWNpYWxseSB3aGVuIHRoZSBtb2R1bGUgaXMgbG9jYXRlZCBvbiBhIE5GUyBtb3VudC4KKwkgKi8KKwlpZiAob3BzID09IE5VTEwgJiYgZmxhZ3MgJiBUU19BVVRPTE9BRCkgeworCQlyZXF1ZXN0X21vZHVsZSgidHNfJXMiLCBhbGdvKTsKKwkJb3BzID0gbG9va3VwX3RzX2FsZ28oYWxnbyk7CisJfQorI2VuZGlmCisKKwlpZiAob3BzID09IE5VTEwpCisJCWdvdG8gZXJyb3V0OworCisJY29uZiA9IG9wcy0+aW5pdChwYXR0ZXJuLCBsZW4sIGdmcF9tYXNrLCBmbGFncyk7CisJaWYgKElTX0VSUihjb25mKSkgeworCQllcnIgPSBQVFJfRVJSKGNvbmYpOworCQlnb3RvIGVycm91dDsKKwl9CisKKwljb25mLT5vcHMgPSBvcHM7CisJcmV0dXJuIGNvbmY7CisKK2Vycm91dDoKKwlpZiAob3BzKQorCQltb2R1bGVfcHV0KG9wcy0+b3duZXIpOworCQkKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorRVhQT1JUX1NZTUJPTCh0ZXh0c2VhcmNoX3ByZXBhcmUpOworCisvKioKKyAqIHRleHRzZWFyY2hfZGVzdHJveSAtIGRlc3Ryb3kgYSBzZWFyY2ggY29uZmlndXJhdGlvbgorICogQGNvbmY6IHNlYXJjaCBjb25maWd1cmF0aW9uCisgKgorICogUmVsZWFzZXMgYWxsIHJlZmVyZW5jZXMgb2YgdGhlIGNvbmZpZ3VyYXRpb24gYW5kIGZyZWVzCisgKiB1cCB0aGUgbWVtb3J5LgorICovCit2b2lkIHRleHRzZWFyY2hfZGVzdHJveShzdHJ1Y3QgdHNfY29uZmlnICpjb25mKQoreworCWlmIChjb25mLT5vcHMpIHsKKwkJaWYgKGNvbmYtPm9wcy0+ZGVzdHJveSkKKwkJCWNvbmYtPm9wcy0+ZGVzdHJveShjb25mKTsKKwkJbW9kdWxlX3B1dChjb25mLT5vcHMtPm93bmVyKTsKKwl9CisKKwlrZnJlZShjb25mKTsKK30KK0VYUE9SVF9TWU1CT0wodGV4dHNlYXJjaF9kZXN0cm95KTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RpbWVycXVldWUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RpbWVycXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTcyMGVkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdGltZXJxdWV1ZS5jCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogIEdlbmVyaWMgVGltZXItcXVldWUKKyAqCisgKiAgTWFuYWdlcyBhIHNpbXBsZSBxdWV1ZSBvZiB0aW1lcnMsIG9yZGVyZWQgYnkgZXhwaXJhdGlvbiB0aW1lLgorICogIFVzZXMgcmJ0cmVlcyBmb3IgcXVpY2sgbGlzdCBhZGRzIGFuZCBleHBpcmF0aW9uLgorICoKKyAqICBOT1RFOiBBbGwgb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbmVlZCB0byBiZSBzZXJpYWxpemVkCisgKiAgdG8gYXZvaWQgcmFjZXMuIE5vIGxvY2tpbmcgaXMgZG9uZSBieSB0aGlzIGxpYnJhcnkgY29kZS4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXJxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisvKioKKyAqIHRpbWVycXVldWVfYWRkIC0gQWRkcyB0aW1lciB0byB0aW1lcnF1ZXVlLgorICoKKyAqIEBoZWFkOiBoZWFkIG9mIHRpbWVycXVldWUKKyAqIEBub2RlOiB0aW1lciBub2RlIHRvIGJlIGFkZGVkCisgKgorICogQWRkcyB0aGUgdGltZXIgbm9kZSB0byB0aGUgdGltZXJxdWV1ZSwgc29ydGVkIGJ5IHRoZQorICogbm9kZSdzIGV4cGlyZXMgdmFsdWUuCisgKi8KK2Jvb2wgdGltZXJxdWV1ZV9hZGQoc3RydWN0IHRpbWVycXVldWVfaGVhZCAqaGVhZCwgc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbm9kZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmaGVhZC0+aGVhZC5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCB0aW1lcnF1ZXVlX25vZGUgICpwdHI7CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgYWRkIG5vZGVzIHRoYXQgYXJlIGFscmVhZHkgYWRkZWQgKi8KKwlXQVJOX09OX09OQ0UoIVJCX0VNUFRZX05PREUoJm5vZGUtPm5vZGUpKTsKKworCXdoaWxlICgqcCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcHRyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgdGltZXJxdWV1ZV9ub2RlLCBub2RlKTsKKwkJaWYgKG5vZGUtPmV4cGlyZXMgPCBwdHItPmV4cGlyZXMpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCXJiX2xpbmtfbm9kZSgmbm9kZS0+bm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJm5vZGUtPm5vZGUsICZoZWFkLT5oZWFkKTsKKworCWlmICghaGVhZC0+bmV4dCB8fCBub2RlLT5leHBpcmVzIDwgaGVhZC0+bmV4dC0+ZXhwaXJlcykgeworCQloZWFkLT5uZXh0ID0gbm9kZTsKKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRpbWVycXVldWVfYWRkKTsKKworLyoqCisgKiB0aW1lcnF1ZXVlX2RlbCAtIFJlbW92ZXMgYSB0aW1lciBmcm9tIHRoZSB0aW1lcnF1ZXVlLgorICoKKyAqIEBoZWFkOiBoZWFkIG9mIHRpbWVycXVldWUKKyAqIEBub2RlOiB0aW1lciBub2RlIHRvIGJlIHJlbW92ZWQKKyAqCisgKiBSZW1vdmVzIHRoZSB0aW1lciBub2RlIGZyb20gdGhlIHRpbWVycXVldWUuCisgKi8KK2Jvb2wgdGltZXJxdWV1ZV9kZWwoc3RydWN0IHRpbWVycXVldWVfaGVhZCAqaGVhZCwgc3RydWN0IHRpbWVycXVldWVfbm9kZSAqbm9kZSkKK3sKKwlXQVJOX09OX09OQ0UoUkJfRU1QVFlfTk9ERSgmbm9kZS0+bm9kZSkpOworCisJLyogdXBkYXRlIG5leHQgcG9pbnRlciAqLworCWlmIChoZWFkLT5uZXh0ID09IG5vZGUpIHsKKwkJc3RydWN0IHJiX25vZGUgKnJibiA9IHJiX25leHQoJm5vZGUtPm5vZGUpOworCisJCWhlYWQtPm5leHQgPSByYl9lbnRyeV9zYWZlKHJibiwgc3RydWN0IHRpbWVycXVldWVfbm9kZSwgbm9kZSk7CisJfQorCXJiX2VyYXNlKCZub2RlLT5ub2RlLCAmaGVhZC0+aGVhZCk7CisJUkJfQ0xFQVJfTk9ERSgmbm9kZS0+bm9kZSk7CisJcmV0dXJuIGhlYWQtPm5leHQgIT0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRpbWVycXVldWVfZGVsKTsKKworLyoqCisgKiB0aW1lcnF1ZXVlX2l0ZXJhdGVfbmV4dCAtIFJldHVybnMgdGhlIHRpbWVyIGFmdGVyIHRoZSBwcm92aWRlZCB0aW1lcgorICoKKyAqIEBub2RlOiBQb2ludGVyIHRvIGEgdGltZXIuCisgKgorICogUHJvdmlkZXMgdGhlIHRpbWVyIHRoYXQgaXMgYWZ0ZXIgdGhlIGdpdmVuIG5vZGUuIFRoaXMgaXMgdXNlZCwgd2hlbgorICogbmVjZXNzYXJ5LCB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGxpc3Qgb2YgdGltZXJzIGluIGEgdGltZXIgbGlzdAorICogd2l0aG91dCBtb2RpZnlpbmcgdGhlIGxpc3QuCisgKi8KK3N0cnVjdCB0aW1lcnF1ZXVlX25vZGUgKnRpbWVycXVldWVfaXRlcmF0ZV9uZXh0KHN0cnVjdCB0aW1lcnF1ZXVlX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKm5leHQ7CisKKwlpZiAoIW5vZGUpCisJCXJldHVybiBOVUxMOworCW5leHQgPSByYl9uZXh0KCZub2RlLT5ub2RlKTsKKwlpZiAoIW5leHQpCisJCXJldHVybiBOVUxMOworCXJldHVybiBjb250YWluZXJfb2YobmV4dCwgc3RydWN0IHRpbWVycXVldWVfbm9kZSwgbm9kZSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0aW1lcnF1ZXVlX2l0ZXJhdGVfbmV4dCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90c19ibS5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdHNfYm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTY2ZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdHNfYm0uYwpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIGxpYi90c19ibS5jCQlCb3llci1Nb29yZSB0ZXh0IHNlYXJjaCBpbXBsZW1lbnRhdGlvbgorICoKKyAqCQlUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgkJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCQlhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCQkyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6CVBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BldXJvZGV2Lm5ldD4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCisgKiAgIEltcGxlbWVudHMgQm95ZXItTW9vcmUgc3RyaW5nIG1hdGNoaW5nIGFsZ29yaXRobToKKyAqCisgKiAgIFsxXSBBIEZhc3QgU3RyaW5nIFNlYXJjaGluZyBBbGdvcml0aG0sIFIuUy4gQm95ZXIgYW5kIE1vb3JlLgorICogICAgICAgQ29tbXVuaWNhdGlvbnMgb2YgdGhlIEFzc29jaWF0aW9uIGZvciBDb21wdXRpbmcgTWFjaGluZXJ5LCAKKyAqICAgICAgIDIwKDEwKSwgMTk3NywgcHAuIDc2Mi03NzIuCisgKiAgICAgICBodHRwOi8vd3d3LmNzLnV0ZXhhcy5lZHUvdXNlcnMvbW9vcmUvcHVibGljYXRpb25zL2ZzdHJwb3MucGRmCisgKgorICogICBbMl0gSGFuZGJvb2sgb2YgRXhhY3QgU3RyaW5nIE1hdGNoaW5nIEFsZ29yaXRobXMsIFRoaWVycnkgTGVjcm9xLCAyMDA0CisgKiAgICAgICBodHRwOi8vd3d3LWlnbS51bml2LW1sdi5mci9+bGVjcm9xL3N0cmluZy9zdHJpbmcucGRmCisgKgorICogICBOb3RlOiBTaW5jZSBCb3llci1Nb29yZSAoQk0pIHBlcmZvcm1zIHNlYXJjaGVzIGZvciBtYXRjaGluZ3MgZnJvbSByaWdodCAKKyAqICAgdG8gbGVmdCwgaXQncyBzdGlsbCBwb3NzaWJsZSB0aGF0IGEgbWF0Y2hpbmcgY291bGQgYmUgc3ByZWFkIG92ZXIgCisgKiAgIG11bHRpcGxlIGJsb2NrcywgaW4gdGhhdCBjYXNlIHRoaXMgYWxnb3JpdGhtIHdvbid0IGZpbmQgYW55IGNvaW5jaWRlbmNlLgorICogICAKKyAqICAgSWYgeW91J3JlIHdpbGxpbmcgdG8gZW5zdXJlIHRoYXQgc3VjaCB0aGluZyB3b24ndCBldmVyIGhhcHBlbiwgdXNlIHRoZQorICogICBLbnV0aC1QcmF0dC1Nb3JyaXMgKEtNUCkgaW1wbGVtZW50YXRpb24gaW5zdGVhZC4gSW4gY29uY2x1c2lvbiwgY2hvb3NlIAorICogICB0aGUgcHJvcGVyIHN0cmluZyBzZWFyY2ggYWxnb3JpdGhtIGRlcGVuZGluZyBvbiB5b3VyIHNldHRpbmcuIAorICoKKyAqICAgU2F5IHlvdSdyZSB1c2luZyB0aGUgdGV4dHNlYXJjaCBpbmZyYXN0cnVjdHVyZSBmb3IgZmlsdGVyaW5nLCBOSURTIG9yIAorICogICBhbnkgc2ltaWxhciBzZWN1cml0eSBmb2N1c2VkIHB1cnBvc2UsIHRoZW4gZ28gS01QLiBPdGhlcndpc2UsIGlmIHlvdSAKKyAqICAgcmVhbGx5IGNhcmUgYWJvdXQgcGVyZm9ybWFuY2UsIHNheSB5b3UncmUgY2xhc3NpZnlpbmcgcGFja2V0cyB0byBhcHBseQorICogICBRdWFsaXR5IG9mIFNlcnZpY2UgKFFvUykgcG9saWNpZXMsIGFuZCB5b3UgZG9uJ3QgbWluZCBhYm91dCBwb3NzaWJsZQorICogICBtYXRjaGluZ3Mgc3ByZWFkIG92ZXIgbXVsdGlwbGUgZnJhZ21lbnRzLCB0aGVuIGdvIEJNLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvdGV4dHNlYXJjaC5oPgorCisvKiBBbHBoYWJldCBzaXplLCB1c2UgQVNDSUkgKi8KKyNkZWZpbmUgQVNJWkUgMjU2CisKKyNpZiAwCisjZGVmaW5lIERFQlVHUCBwcmludGsKKyNlbHNlCisjZGVmaW5lIERFQlVHUChhcmdzLCBmb3JtYXQuLi4pCisjZW5kaWYKKworc3RydWN0IHRzX2JtCit7CisJdTggKgkJcGF0dGVybjsKKwl1bnNpZ25lZCBpbnQJcGF0bGVuOworCXVuc2lnbmVkIGludCAJYmFkX3NoaWZ0W0FTSVpFXTsKKwl1bnNpZ25lZCBpbnQJZ29vZF9zaGlmdFswXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYm1fZmluZChzdHJ1Y3QgdHNfY29uZmlnICpjb25mLCBzdHJ1Y3QgdHNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB0c19ibSAqYm0gPSB0c19jb25maWdfcHJpdihjb25mKTsKKwl1bnNpZ25lZCBpbnQgaSwgdGV4dF9sZW4sIGNvbnN1bWVkID0gc3RhdGUtPm9mZnNldDsKKwljb25zdCB1OCAqdGV4dDsKKwlpbnQgc2hpZnQgPSBibS0+cGF0bGVuIC0gMSwgYnM7CisJY29uc3QgdTggaWNhc2UgPSBjb25mLT5mbGFncyAmIFRTX0lHTk9SRUNBU0U7CisKKwlmb3IgKDs7KSB7CisJCXRleHRfbGVuID0gY29uZi0+Z2V0X25leHRfYmxvY2soY29uc3VtZWQsICZ0ZXh0LCBjb25mLCBzdGF0ZSk7CisKKwkJaWYgKHVubGlrZWx5KHRleHRfbGVuID09IDApKQorCQkJYnJlYWs7CisKKwkJd2hpbGUgKHNoaWZ0IDwgdGV4dF9sZW4pIHsKKwkJCURFQlVHUCgiU2VhcmNoaW5nIGluIHBvc2l0aW9uICVkICglYylcbiIsIAorCQkJCXNoaWZ0LCB0ZXh0W3NoaWZ0XSk7CisJCQlmb3IgKGkgPSAwOyBpIDwgYm0tPnBhdGxlbjsgaSsrKSAKKwkJCQlpZiAoKGljYXNlID8gdG91cHBlcih0ZXh0W3NoaWZ0LWldKQorCQkJCSAgICA6IHRleHRbc2hpZnQtaV0pCisJCQkJCSE9IGJtLT5wYXR0ZXJuW2JtLT5wYXRsZW4tMS1pXSkKKwkJCQkgICAgIGdvdG8gbmV4dDsKKworCQkJLyogTG9uZG9uIGNhbGxpbmcuLi4gKi8KKwkJCURFQlVHUCgiZm91bmQhXG4iKTsKKwkJCXJldHVybiBjb25zdW1lZCArPSAoc2hpZnQtKGJtLT5wYXRsZW4tMSkpOworCituZXh0OgkJCWJzID0gYm0tPmJhZF9zaGlmdFt0ZXh0W3NoaWZ0LWldXTsKKworCQkJLyogTm93IGp1bXBpbmcgdG8uLi4gKi8KKwkJCXNoaWZ0ID0gbWF4X3QoaW50LCBzaGlmdC1pK2JzLCBzaGlmdCtibS0+Z29vZF9zaGlmdFtpXSk7CisJCX0KKwkJY29uc3VtZWQgKz0gdGV4dF9sZW47CisJfQorCisJcmV0dXJuIFVJTlRfTUFYOworfQorCitzdGF0aWMgaW50IHN1YnBhdHRlcm4odTggKnBhdHRlcm4sIGludCBpLCBpbnQgaiwgaW50IGcpCit7CisJaW50IHggPSBpK2ctMSwgeSA9IGorZy0xLCByZXQgPSAwOworCisJd2hpbGUocGF0dGVyblt4LS1dID09IHBhdHRlcm5beS0tXSkgeworCQlpZiAoeSA8IDApIHsKKwkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoLS1nID09IDApIHsKKwkJCXJldCA9IHBhdHRlcm5baS0xXSAhPSBwYXR0ZXJuW2otMV07CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGNvbXB1dGVfcHJlZml4X3RibChzdHJ1Y3QgdHNfYm0gKmJtLCBpbnQgZmxhZ3MpCit7CisJaW50IGksIGosIGc7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVNJWkU7IGkrKykKKwkJYm0tPmJhZF9zaGlmdFtpXSA9IGJtLT5wYXRsZW47CisJZm9yIChpID0gMDsgaSA8IGJtLT5wYXRsZW4gLSAxOyBpKyspIHsKKwkJYm0tPmJhZF9zaGlmdFtibS0+cGF0dGVybltpXV0gPSBibS0+cGF0bGVuIC0gMSAtIGk7CisJCWlmIChmbGFncyAmIFRTX0lHTk9SRUNBU0UpCisJCQlibS0+YmFkX3NoaWZ0W3RvbG93ZXIoYm0tPnBhdHRlcm5baV0pXQorCQkJICAgID0gYm0tPnBhdGxlbiAtIDEgLSBpOworCX0KKworCS8qIENvbXB1dGUgdGhlIGdvb2Qgc2hpZnQgYXJyYXksIHVzZWQgdG8gbWF0Y2ggcmVvY3VycmVuY2VzIAorCSAqIG9mIGEgc3VicGF0dGVybiAqLworCWJtLT5nb29kX3NoaWZ0WzBdID0gMTsKKwlmb3IgKGkgPSAxOyBpIDwgYm0tPnBhdGxlbjsgaSsrKQorCQlibS0+Z29vZF9zaGlmdFtpXSA9IGJtLT5wYXRsZW47CisgICAgICAgIGZvciAoaSA9IGJtLT5wYXRsZW4tMSwgZyA9IDE7IGkgPiAwOyBnKyssIGktLSkgeworCQlmb3IgKGogPSBpLTE7IGogPj0gMS1nIDsgai0tKQorCQkJaWYgKHN1YnBhdHRlcm4oYm0tPnBhdHRlcm4sIGksIGosIGcpKSB7CisJCQkJYm0tPmdvb2Rfc2hpZnRbZ10gPSBibS0+cGF0bGVuLWotZzsKKwkJCQlicmVhazsKKwkJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHNfY29uZmlnICpibV9pbml0KGNvbnN0IHZvaWQgKnBhdHRlcm4sIHVuc2lnbmVkIGludCBsZW4sCisJCQkJIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHRzX2NvbmZpZyAqY29uZjsKKwlzdHJ1Y3QgdHNfYm0gKmJtOworCWludCBpOworCXVuc2lnbmVkIGludCBwcmVmaXhfdGJsX2xlbiA9IGxlbiAqIHNpemVvZih1bnNpZ25lZCBpbnQpOworCXNpemVfdCBwcml2X3NpemUgPSBzaXplb2YoKmJtKSArIGxlbiArIHByZWZpeF90YmxfbGVuOworCisJY29uZiA9IGFsbG9jX3RzX2NvbmZpZyhwcml2X3NpemUsIGdmcF9tYXNrKTsKKwlpZiAoSVNfRVJSKGNvbmYpKQorCQlyZXR1cm4gY29uZjsKKworCWNvbmYtPmZsYWdzID0gZmxhZ3M7CisJYm0gPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlibS0+cGF0bGVuID0gbGVuOworCWJtLT5wYXR0ZXJuID0gKHU4ICopIGJtLT5nb29kX3NoaWZ0ICsgcHJlZml4X3RibF9sZW47CisJaWYgKGZsYWdzICYgVFNfSUdOT1JFQ0FTRSkKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQkJYm0tPnBhdHRlcm5baV0gPSB0b3VwcGVyKCgodTggKilwYXR0ZXJuKVtpXSk7CisJZWxzZQorCQltZW1jcHkoYm0tPnBhdHRlcm4sIHBhdHRlcm4sIGxlbik7CisJY29tcHV0ZV9wcmVmaXhfdGJsKGJtLCBmbGFncyk7CisKKwlyZXR1cm4gY29uZjsKK30KKworc3RhdGljIHZvaWQgKmJtX2dldF9wYXR0ZXJuKHN0cnVjdCB0c19jb25maWcgKmNvbmYpCit7CisJc3RydWN0IHRzX2JtICpibSA9IHRzX2NvbmZpZ19wcml2KGNvbmYpOworCXJldHVybiBibS0+cGF0dGVybjsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBibV9nZXRfcGF0dGVybl9sZW4oc3RydWN0IHRzX2NvbmZpZyAqY29uZikKK3sKKwlzdHJ1Y3QgdHNfYm0gKmJtID0gdHNfY29uZmlnX3ByaXYoY29uZik7CisJcmV0dXJuIGJtLT5wYXRsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHNfb3BzIGJtX29wcyA9IHsKKwkubmFtZQkJICA9ICJibSIsCisJLmZpbmQJCSAgPSBibV9maW5kLAorCS5pbml0CQkgID0gYm1faW5pdCwKKwkuZ2V0X3BhdHRlcm4JICA9IGJtX2dldF9wYXR0ZXJuLAorCS5nZXRfcGF0dGVybl9sZW4gID0gYm1fZ2V0X3BhdHRlcm5fbGVuLAorCS5vd25lcgkJICA9IFRISVNfTU9EVUxFLAorCS5saXN0CQkgID0gTElTVF9IRUFEX0lOSVQoYm1fb3BzLmxpc3QpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2JtKHZvaWQpCit7CisJcmV0dXJuIHRleHRzZWFyY2hfcmVnaXN0ZXIoJmJtX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBleGl0X2JtKHZvaWQpCit7CisJdGV4dHNlYXJjaF91bnJlZ2lzdGVyKCZibV9vcHMpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfYm0pOworbW9kdWxlX2V4aXQoZXhpdF9ibSk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90c19mc20uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RzX2ZzbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NTU3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi90c19mc20uYwpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIGxpYi90c19mc20uYwkgICBBIG5haXZlIGZpbml0ZSBzdGF0ZSBtYWNoaW5lIHRleHQgc2VhcmNoIGFwcHJvYWNoCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJVGhvbWFzIEdyYWYgPHRncmFmQHN1dWcuY2g+CisgKgorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiAgIEEgZmluaXRlIHN0YXRlIG1hY2hpbmUgY29uc2lzdHMgb2YgbiBzdGF0ZXMgKHN0cnVjdCB0c19mc21fdG9rZW4pCisgKiAgIHJlcHJlc2VudGluZyB0aGUgcGF0dGVybiBhcyBhIGZpbml0ZSBhdXRvbWF0b24uIFRoZSBkYXRhIGlzIHJlYWQKKyAqICAgc2VxdWVudGlhbGx5IG9uIGFuIG9jdGV0IGJhc2lzLiBFdmVyeSBzdGF0ZSB0b2tlbiBzcGVjaWZpZXMgdGhlIG51bWJlcgorICogICBvZiByZWN1cnJlbmNlcyBhbmQgdGhlIHR5cGUgb2YgdmFsdWUgYWNjZXB0ZWQgd2hpY2ggY2FuIGJlIGVpdGhlciBhCisgKiAgIHNwZWNpZmljIGNoYXJhY3RlciBvciBjdHlwZSBiYXNlZCBzZXQgb2YgY2hhcmFjdGVycy4gVGhlIGF2YWlsYWJsZQorICogICB0eXBlIG9mIHJlY3VycmVuY2VzIGluY2x1ZGUgMSwgKDB8MSksIFswIG5dLCBhbmQgWzEgbl0uCisgKgorICogICBUaGUgYWxnb3JpdGhtIGRpZmZlcnMgYmV0d2VlbiBzdHJpY3Qvbm9uLXN0cmljdCBtb2RlIHNwZWNpZnlpbmcKKyAqICAgd2hldGhlciB0aGUgcGF0dGVybiBoYXMgdG8gc3RhcnQgYXQgdGhlIGZpcnN0IG9jdGV0LiBTdHJpY3QgbW9kZQorICogICBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBpbnNlcnRpbmcKKyAqICAgVFNfRlNNX0hFQURfSUdOT1JFIGFzIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGUgY2hhaW4uCisgKgorICogICBUaGUgcnVudGltZSBwZXJmb3JtYW5jZSBvZiB0aGUgYWxnb3JpdGhtIHNob3VsZCBiZSBhcm91bmQgTyhuKSwKKyAqICAgaG93ZXZlciB3aGlsZSBpbiBzdHJpY3QgbW9kZSB0aGUgYXZlcmFnZSBydW50aW1lIGNhbiBiZSBiZXR0ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC90ZXh0c2VhcmNoLmg+CisjaW5jbHVkZSA8bGludXgvdGV4dHNlYXJjaF9mc20uaD4KKworc3RydWN0IHRzX2ZzbQoreworCXVuc2lnbmVkIGludAkJbnRva2VuczsKKwlzdHJ1Y3QgdHNfZnNtX3Rva2VuCXRva2Vuc1swXTsKK307CisKKy8qIG90aGVyIHZhbHVlcyBkZXJpdmVkIGZyb20gY3R5cGUuaCAqLworI2RlZmluZSBfQQkJMHgxMDAgLyogYXNjaWkgKi8KKyNkZWZpbmUgX1cJCTB4MjAwIC8qIHdpbGRjYXJkICovCisKKy8qIE1hcCB0byBfY3R5cGUgZmxhZ3MgYW5kIHNvbWUgbWFnaWMgbnVtYmVycyAqLworc3RhdGljIGNvbnN0IHUxNiB0b2tlbl9tYXBbVFNfRlNNX1RZUEVfTUFYKzFdID0geworCVtUU19GU01fU1BFQ0lGSUNdID0gMCwKKwlbVFNfRlNNX1dJTERDQVJEXSA9IF9XLAorCVtUU19GU01fQ05UUkxdCSAgPSBfQywKKwlbVFNfRlNNX0xPV0VSXQkgID0gX0wsCisJW1RTX0ZTTV9VUFBFUl0JICA9IF9VLAorCVtUU19GU01fUFVOQ1RdCSAgPSBfUCwKKwlbVFNfRlNNX1NQQUNFXQkgID0gX1MsCisJW1RTX0ZTTV9ESUdJVF0JICA9IF9ELAorCVtUU19GU01fWERJR0lUXQkgID0gX0QgfCBfWCwKKwlbVFNfRlNNX0FMUEhBXQkgID0gX1UgfCBfTCwKKwlbVFNfRlNNX0FMTlVNXQkgID0gX1UgfCBfTCB8IF9ELAorCVtUU19GU01fUFJJTlRdCSAgPSBfUCB8IF9VIHwgX0wgfCBfRCB8IF9TUCwKKwlbVFNfRlNNX0dSQVBIXQkgID0gX1AgfCBfVSB8IF9MIHwgX0QsCisJW1RTX0ZTTV9BU0NJSV0JICA9IF9BLAorfTsKKworc3RhdGljIGNvbnN0IHUxNiB0b2tlbl9sb29rdXBfdGJsWzI1Nl0gPSB7CitfV3xfQXxfQywgICAgICBfV3xfQXxfQywgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgIDAtICAzICovCitfV3xfQXxfQywgICAgICBfV3xfQXxfQywgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgIDQtICA3ICovCitfV3xfQXxfQywgICAgICBfV3xfQXxfQ3xfUywgIF9XfF9BfF9DfF9TLCAgX1d8X0F8X0N8X1MsCQkvKiAgIDgtIDExICovCitfV3xfQXxfQ3xfUywgICBfV3xfQXxfQ3xfUywgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgMTItIDE1ICovCitfV3xfQXxfQywgICAgICBfV3xfQXxfQywgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgMTYtIDE5ICovCitfV3xfQXxfQywgICAgICBfV3xfQXxfQywgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgMjAtIDIzICovCitfV3xfQXxfQywgICAgICBfV3xfQXxfQywgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgMjQtIDI3ICovCitfV3xfQXxfQywgICAgICBfV3xfQXxfQywgICAgIF9XfF9BfF9DLCAgICAgX1d8X0F8X0MsCQkvKiAgMjgtIDMxICovCitfV3xfQXxfU3xfU1AsICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgMzItIDM1ICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgMzYtIDM5ICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgNDAtIDQzICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgNDQtIDQ3ICovCitfV3xfQXxfRCwgICAgICBfV3xfQXxfRCwgICAgIF9XfF9BfF9ELCAgICAgX1d8X0F8X0QsCQkvKiAgNDgtIDUxICovCitfV3xfQXxfRCwgICAgICBfV3xfQXxfRCwgICAgIF9XfF9BfF9ELCAgICAgX1d8X0F8X0QsCQkvKiAgNTItIDU1ICovCitfV3xfQXxfRCwgICAgICBfV3xfQXxfRCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgNTYtIDU5ICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgNjAtIDYzICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfVXxfWCwgIF9XfF9BfF9VfF9YLCAgX1d8X0F8X1V8X1gsCQkvKiAgNjQtIDY3ICovCitfV3xfQXxfVXxfWCwgICBfV3xfQXxfVXxfWCwgIF9XfF9BfF9VfF9YLCAgX1d8X0F8X1UsCQkvKiAgNjgtIDcxICovCitfV3xfQXxfVSwgICAgICBfV3xfQXxfVSwgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsCQkvKiAgNzItIDc1ICovCitfV3xfQXxfVSwgICAgICBfV3xfQXxfVSwgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsCQkvKiAgNzYtIDc5ICovCitfV3xfQXxfVSwgICAgICBfV3xfQXxfVSwgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsCQkvKiAgODAtIDgzICovCitfV3xfQXxfVSwgICAgICBfV3xfQXxfVSwgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1UsCQkvKiAgODQtIDg3ICovCitfV3xfQXxfVSwgICAgICBfV3xfQXxfVSwgICAgIF9XfF9BfF9VLCAgICAgX1d8X0F8X1AsCQkvKiAgODgtIDkxICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X1AsCQkvKiAgOTItIDk1ICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfTHxfWCwgIF9XfF9BfF9MfF9YLCAgX1d8X0F8X0x8X1gsCQkvKiAgOTYtIDk5ICovCitfV3xfQXxfTHxfWCwgICBfV3xfQXxfTHxfWCwgIF9XfF9BfF9MfF9YLCAgX1d8X0F8X0wsCQkvKiAxMDAtMTAzICovCitfV3xfQXxfTCwgICAgICBfV3xfQXxfTCwgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsCQkvKiAxMDQtMTA3ICovCitfV3xfQXxfTCwgICAgICBfV3xfQXxfTCwgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsCQkvKiAxMDgtMTExICovCitfV3xfQXxfTCwgICAgICBfV3xfQXxfTCwgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsCQkvKiAxMTItMTE1ICovCitfV3xfQXxfTCwgICAgICBfV3xfQXxfTCwgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X0wsCQkvKiAxMTYtMTE5ICovCitfV3xfQXxfTCwgICAgICBfV3xfQXxfTCwgICAgIF9XfF9BfF9MLCAgICAgX1d8X0F8X1AsCQkvKiAxMjAtMTIzICovCitfV3xfQXxfUCwgICAgICBfV3xfQXxfUCwgICAgIF9XfF9BfF9QLCAgICAgX1d8X0F8X0MsCQkvKiAxMjQtMTI3ICovCitfVywgICAgICAgICAgICBfVywgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csCQkJLyogMTI4LTEzMSAqLworX1csICAgICAgICAgICAgX1csICAgICAgICAgICBfVywgICAgICAgICAgIF9XLAkJCS8qIDEzMi0xMzUgKi8KK19XLCAgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csICAgICAgICAgICBfVywJCQkvKiAxMzYtMTM5ICovCitfVywgICAgICAgICAgICBfVywgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csCQkJLyogMTQwLTE0MyAqLworX1csICAgICAgICAgICAgX1csICAgICAgICAgICBfVywgICAgICAgICAgIF9XLAkJCS8qIDE0NC0xNDcgKi8KK19XLCAgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csICAgICAgICAgICBfVywJCQkvKiAxNDgtMTUxICovCitfVywgICAgICAgICAgICBfVywgICAgICAgICAgIF9XLCAgICAgICAgICAgX1csCQkJLyogMTUyLTE1NSAqLworX1csICAgICAgICAgICAgX1csICAgICAgICAgICBfVywgICAgICAgICAgIF9XLAkJCS8qIDE1Ni0xNTkgKi8KK19XfF9TfF9TUCwgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE2MC0xNjMgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE2NC0xNjcgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE2OC0xNzEgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE3Mi0xNzUgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE3Ni0xNzkgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE4MC0xODMgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE4NC0xODcgKi8KK19XfF9QLCAgICAgICAgIF9XfF9QLCAgICAgICAgX1d8X1AsICAgICAgICBfV3xfUCwJCS8qIDE4OC0xOTEgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwJCS8qIDE5Mi0xOTUgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwJCS8qIDE5Ni0xOTkgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwJCS8qIDIwMC0yMDMgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwJCS8qIDIwNC0yMDcgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwJCS8qIDIwOC0yMTEgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfUCwJCS8qIDIxMi0yMTUgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfVSwJCS8qIDIxNi0yMTkgKi8KK19XfF9VLCAgICAgICAgIF9XfF9VLCAgICAgICAgX1d8X1UsICAgICAgICBfV3xfTCwJCS8qIDIyMC0yMjMgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwJCS8qIDIyNC0yMjcgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwJCS8qIDIyOC0yMzEgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwJCS8qIDIzMi0yMzUgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwJCS8qIDIzNi0yMzkgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwJCS8qIDI0MC0yNDMgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfUCwJCS8qIDI0NC0yNDcgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTCwJCS8qIDI0OC0yNTEgKi8KK19XfF9MLCAgICAgICAgIF9XfF9MLCAgICAgICAgX1d8X0wsICAgICAgICBfV3xfTH07CQkvKiAyNTItMjU1ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IG1hdGNoX3Rva2VuKHN0cnVjdCB0c19mc21fdG9rZW4gKnQsIHU4IGQpCit7CisJaWYgKHQtPnR5cGUpCisJCXJldHVybiAodG9rZW5fbG9va3VwX3RibFtkXSAmIHQtPnR5cGUpICE9IDA7CisJZWxzZQorCQlyZXR1cm4gdC0+dmFsdWUgPT0gZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBmc21fZmluZChzdHJ1Y3QgdHNfY29uZmlnICpjb25mLCBzdHJ1Y3QgdHNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB0c19mc20gKmZzbSA9IHRzX2NvbmZpZ19wcml2KGNvbmYpOworCXN0cnVjdCB0c19mc21fdG9rZW4gKmN1ciA9IE5VTEwsICpuZXh0OworCXVuc2lnbmVkIGludCBtYXRjaF9zdGFydCwgYmxvY2tfaWR4ID0gMCwgdG9rX2lkeDsKKwl1bnNpZ25lZCBibG9ja19sZW4gPSAwLCBzdHJpY3QsIGNvbnN1bWVkID0gc3RhdGUtPm9mZnNldDsKKwljb25zdCB1OCAqZGF0YTsKKworI2RlZmluZSBHRVRfTkVYVF9CTE9DSygpCQlcCisoewljb25zdW1lZCArPSBibG9ja19pZHg7CQlcCisJYmxvY2tfaWR4ID0gMDsJCQlcCisJYmxvY2tfbGVuID0gY29uZi0+Z2V0X25leHRfYmxvY2soY29uc3VtZWQsICZkYXRhLCBjb25mLCBzdGF0ZSk7IH0pCisKKyNkZWZpbmUgVE9LRU5fTUlTTUFUQ0goKQkJXAorCWRvIHsJCQkJXAorCQlpZiAoc3RyaWN0KQkJXAorCQkJZ290byBub19tYXRjaDsJXAorCQlibG9ja19pZHgrKzsJCVwKKwkJZ290byBzdGFydG92ZXI7CQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIGVuZF9vZl9kYXRhKCkgdW5saWtlbHkoYmxvY2tfaWR4ID49IGJsb2NrX2xlbiAmJiAhR0VUX05FWFRfQkxPQ0soKSkKKworCWlmIChlbmRfb2ZfZGF0YSgpKQorCQlnb3RvIG5vX21hdGNoOworCisJc3RyaWN0ID0gZnNtLT50b2tlbnNbMF0ucmVjdXIgIT0gVFNfRlNNX0hFQURfSUdOT1JFOworCitzdGFydG92ZXI6CisJbWF0Y2hfc3RhcnQgPSBjb25zdW1lZCArIGJsb2NrX2lkeDsKKworCWZvciAodG9rX2lkeCA9IDA7IHRva19pZHggPCBmc20tPm50b2tlbnM7IHRva19pZHgrKykgeworCQljdXIgPSAmZnNtLT50b2tlbnNbdG9rX2lkeF07CisKKwkJaWYgKGxpa2VseSh0b2tfaWR4IDwgKGZzbS0+bnRva2VucyAtIDEpKSkKKwkJCW5leHQgPSAmZnNtLT50b2tlbnNbdG9rX2lkeCArIDFdOworCQllbHNlCisJCQluZXh0ID0gTlVMTDsKKworCQlzd2l0Y2ggKGN1ci0+cmVjdXIpIHsKKwkJY2FzZSBUU19GU01fU0lOR0xFOgorCQkJaWYgKGVuZF9vZl9kYXRhKCkpCisJCQkJZ290byBub19tYXRjaDsKKworCQkJaWYgKCFtYXRjaF90b2tlbihjdXIsIGRhdGFbYmxvY2tfaWR4XSkpCisJCQkJVE9LRU5fTUlTTUFUQ0goKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVFNfRlNNX1BFUkhBUFM6CisJCQlpZiAoZW5kX29mX2RhdGEoKSB8fAorCQkJICAgICFtYXRjaF90b2tlbihjdXIsIGRhdGFbYmxvY2tfaWR4XSkpCisJCQkJY29udGludWU7CisJCQlicmVhazsKKworCQljYXNlIFRTX0ZTTV9NVUxUSToKKwkJCWlmIChlbmRfb2ZfZGF0YSgpKQorCQkJCWdvdG8gbm9fbWF0Y2g7CisKKwkJCWlmICghbWF0Y2hfdG9rZW4oY3VyLCBkYXRhW2Jsb2NrX2lkeF0pKQorCQkJCVRPS0VOX01JU01BVENIKCk7CisKKwkJCWJsb2NrX2lkeCsrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJY2FzZSBUU19GU01fQU5ZOgorCQkJaWYgKG5leHQgPT0gTlVMTCkKKwkJCQlnb3RvIGZvdW5kX21hdGNoOworCisJCQlpZiAoZW5kX29mX2RhdGEoKSkKKwkJCQljb250aW51ZTsKKworCQkJd2hpbGUgKCFtYXRjaF90b2tlbihuZXh0LCBkYXRhW2Jsb2NrX2lkeF0pKSB7CisJCQkJaWYgKCFtYXRjaF90b2tlbihjdXIsIGRhdGFbYmxvY2tfaWR4XSkpCisJCQkJCVRPS0VOX01JU01BVENIKCk7CisJCQkJYmxvY2tfaWR4Kys7CisJCQkJaWYgKGVuZF9vZl9kYXRhKCkpCisJCQkJCWdvdG8gbm9fbWF0Y2g7CisJCQl9CisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBPcHRpbWl6YXRpb246IFByZWZlciBzbWFsbCBsb2NhbCBsb29wIG92ZXIganVtcGluZworCQkgKiBiYWNrIGFuZCBmb3J0aCB1bnRpbCBnYXJiYWdlIGF0IGhlYWQgaXMgbXVuY2hlZC4KKwkJICovCisJCWNhc2UgVFNfRlNNX0hFQURfSUdOT1JFOgorCQkJaWYgKGVuZF9vZl9kYXRhKCkpCisJCQkJY29udGludWU7CisKKwkJCXdoaWxlICghbWF0Y2hfdG9rZW4obmV4dCwgZGF0YVtibG9ja19pZHhdKSkgeworCQkJCS8qCisJCQkJICogU3BlY2lhbCBjYXNlLCBkb24ndCBzdGFydCBvdmVyIHVwb24KKwkJCQkgKiBhIG1pc21hdGNoLCBnaXZlIHRoZSB1c2VyIHRoZQorCQkJCSAqIGNoYW5jZSB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIGRhdGEKKwkJCQkgKiBhbGxvd2VkIHRvIGJlIGlnbm9yZWQuCisJCQkJICovCisJCQkJaWYgKCFtYXRjaF90b2tlbihjdXIsIGRhdGFbYmxvY2tfaWR4XSkpCisJCQkJCWdvdG8gbm9fbWF0Y2g7CisKKwkJCQlibG9ja19pZHgrKzsKKwkJCQlpZiAoZW5kX29mX2RhdGEoKSkKKwkJCQkJZ290byBub19tYXRjaDsKKwkJCX0KKworCQkJbWF0Y2hfc3RhcnQgPSBjb25zdW1lZCArIGJsb2NrX2lkeDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYmxvY2tfaWR4Kys7CisJfQorCisJaWYgKGVuZF9vZl9kYXRhKCkpCisJCWdvdG8gZm91bmRfbWF0Y2g7CisKK25vX21hdGNoOgorCXJldHVybiBVSU5UX01BWDsKKworZm91bmRfbWF0Y2g6CisJc3RhdGUtPm9mZnNldCA9IGNvbnN1bWVkICsgYmxvY2tfaWR4OworCXJldHVybiBtYXRjaF9zdGFydDsKK30KKworc3RhdGljIHN0cnVjdCB0c19jb25maWcgKmZzbV9pbml0KGNvbnN0IHZvaWQgKnBhdHRlcm4sIHVuc2lnbmVkIGludCBsZW4sCisJCQkJICAgIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MpCit7CisJaW50IGksIGVyciA9IC1FSU5WQUw7CisJc3RydWN0IHRzX2NvbmZpZyAqY29uZjsKKwlzdHJ1Y3QgdHNfZnNtICpmc207CisJc3RydWN0IHRzX2ZzbV90b2tlbiAqdG9rZW5zID0gKHN0cnVjdCB0c19mc21fdG9rZW4gKikgcGF0dGVybjsKKwl1bnNpZ25lZCBpbnQgbnRva2VucyA9IGxlbiAvIHNpemVvZigqdG9rZW5zKTsKKwlzaXplX3QgcHJpdl9zaXplID0gc2l6ZW9mKCpmc20pICsgbGVuOworCisJaWYgKGxlbiAgJSBzaXplb2Yoc3RydWN0IHRzX2ZzbV90b2tlbikgfHwgbnRva2VucyA8IDEpCisJCWdvdG8gZXJyb3V0OworCisJaWYgKGZsYWdzICYgVFNfSUdOT1JFQ0FTRSkKKwkJZ290byBlcnJvdXQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnRva2VuczsgaSsrKSB7CisJCXN0cnVjdCB0c19mc21fdG9rZW4gKnQgPSAmdG9rZW5zW2ldOworCisJCWlmICh0LT50eXBlID4gVFNfRlNNX1RZUEVfTUFYIHx8IHQtPnJlY3VyID4gVFNfRlNNX1JFQ1VSX01BWCkKKwkJCWdvdG8gZXJyb3V0OworCisJCWlmICh0LT5yZWN1ciA9PSBUU19GU01fSEVBRF9JR05PUkUgJiYKKwkJICAgIChpICE9IDAgfHwgaSA9PSAobnRva2VucyAtIDEpKSkKKwkJCWdvdG8gZXJyb3V0OworCX0KKworCWNvbmYgPSBhbGxvY190c19jb25maWcocHJpdl9zaXplLCBnZnBfbWFzayk7CisJaWYgKElTX0VSUihjb25mKSkKKwkJcmV0dXJuIGNvbmY7CisKKwljb25mLT5mbGFncyA9IGZsYWdzOworCWZzbSA9IHRzX2NvbmZpZ19wcml2KGNvbmYpOworCWZzbS0+bnRva2VucyA9IG50b2tlbnM7CisJbWVtY3B5KGZzbS0+dG9rZW5zLCBwYXR0ZXJuLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGZzbS0+bnRva2VuczsgaSsrKSB7CisJCXN0cnVjdCB0c19mc21fdG9rZW4gKnQgPSAmZnNtLT50b2tlbnNbaV07CisJCXQtPnR5cGUgPSB0b2tlbl9tYXBbdC0+dHlwZV07CisJfQorCisJcmV0dXJuIGNvbmY7CisKK2Vycm91dDoKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgdm9pZCAqZnNtX2dldF9wYXR0ZXJuKHN0cnVjdCB0c19jb25maWcgKmNvbmYpCit7CisJc3RydWN0IHRzX2ZzbSAqZnNtID0gdHNfY29uZmlnX3ByaXYoY29uZik7CisJcmV0dXJuIGZzbS0+dG9rZW5zOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGZzbV9nZXRfcGF0dGVybl9sZW4oc3RydWN0IHRzX2NvbmZpZyAqY29uZikKK3sKKwlzdHJ1Y3QgdHNfZnNtICpmc20gPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlyZXR1cm4gZnNtLT5udG9rZW5zICogc2l6ZW9mKHN0cnVjdCB0c19mc21fdG9rZW4pOworfQorCitzdGF0aWMgc3RydWN0IHRzX29wcyBmc21fb3BzID0geworCS5uYW1lCQkgID0gImZzbSIsCisJLmZpbmQJCSAgPSBmc21fZmluZCwKKwkuaW5pdAkJICA9IGZzbV9pbml0LAorCS5nZXRfcGF0dGVybgkgID0gZnNtX2dldF9wYXR0ZXJuLAorCS5nZXRfcGF0dGVybl9sZW4gID0gZnNtX2dldF9wYXR0ZXJuX2xlbiwKKwkub3duZXIJCSAgPSBUSElTX01PRFVMRSwKKwkubGlzdAkJICA9IExJU1RfSEVBRF9JTklUKGZzbV9vcHMubGlzdCkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZnNtKHZvaWQpCit7CisJcmV0dXJuIHRleHRzZWFyY2hfcmVnaXN0ZXIoJmZzbV9vcHMpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9mc20odm9pZCkKK3sKKwl0ZXh0c2VhcmNoX3VucmVnaXN0ZXIoJmZzbV9vcHMpOworfQorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9pbml0KGluaXRfZnNtKTsKK21vZHVsZV9leGl0KGV4aXRfZnNtKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RzX2ttcC5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdHNfa21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiZTY2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3RzX2ttcC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogbGliL3RzX2ttcC5jCQlLbnV0aC1Nb3JyaXMtUHJhdHQgdGV4dCBzZWFyY2ggaW1wbGVtZW50YXRpb24KKyAqCisgKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglUaG9tYXMgR3JhZiA8dGdyYWZAc3V1Zy5jaD4KKyAqCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogCisgKiAgIEltcGxlbWVudHMgYSBsaW5lYXItdGltZSBzdHJpbmctbWF0Y2hpbmcgYWxnb3JpdGhtIGR1ZSB0byBLbnV0aCwKKyAqICAgTW9ycmlzLCBhbmQgUHJhdHQgWzFdLiBUaGVpciBhbGdvcml0aG0gYXZvaWRzIHRoZSBleHBsaWNpdAorICogICBjb21wdXRhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbiBmdW5jdGlvbiBERUxUQSBhbHRvZ2V0aGVyLiBJdHMKKyAqICAgbWF0Y2hpbmcgdGltZSBpcyBPKG4pLCBmb3IgbiBiZWluZyBsZW5ndGgodGV4dCksIHVzaW5nIGp1c3QgYW4KKyAqICAgYXV4aWxpYXJ5IGZ1bmN0aW9uIFBJWzEuLm1dLCBmb3IgbSBiZWluZyBsZW5ndGgocGF0dGVybiksCisgKiAgIHByZWNvbXB1dGVkIGZyb20gdGhlIHBhdHRlcm4gaW4gdGltZSBPKG0pLiBUaGUgYXJyYXkgUEkgYWxsb3dzCisgKiAgIHRoZSB0cmFuc2l0aW9uIGZ1bmN0aW9uIERFTFRBIHRvIGJlIGNvbXB1dGVkIGVmZmljaWVudGx5CisgKiAgICJvbiB0aGUgZmx5IiBhcyBuZWVkZWQuIFJvdWdobHkgc3BlYWtpbmcsIGZvciBhbnkgc3RhdGUKKyAqICAgInEiID0gMCwxLC4uLixtIGFuZCBhbnkgY2hhcmFjdGVyICJhIiBpbiBTSUdNQSwgdGhlIHZhbHVlCisgKiAgIFBJWyJxIl0gY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMgaW5kZXBlbmRlbnQgb2YgImEiIGFuZAorICogICBpcyBuZWVkZWQgdG8gY29tcHV0ZSBERUxUQSgicSIsICJhIikgWzJdLiBTaW5jZSB0aGUgYXJyYXkgUEkKKyAqICAgaGFzIG9ubHkgbSBlbnRyaWVzLCB3aGVyZWFzIERFTFRBIGhhcyBPKG18U0lHTUF8KSBlbnRyaWVzLCB3ZQorICogICBzYXZlIGEgZmFjdG9yIG9mIHxTSUdNQXwgaW4gdGhlIHByZXByb2Nlc3NpbmcgdGltZSBieSBjb21wdXRpbmcKKyAqICAgUEkgcmF0aGVyIHRoYW4gREVMVEEuCisgKgorICogICBbMV0gQ29ybWVuLCBMZWlzZXJzb24sIFJpdmVzdCwgU3RlaW4KKyAqICAgICAgIEludHJvZGN1dGlvbiB0byBBbGdvcml0aG1zLCAybmQgRWRpdGlvbiwgTUlUIFByZXNzCisgKiAgIFsyXSBTZWUgZmluaXRlIGF1dG9tYXRvbiB0aGVvcnkKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RleHRzZWFyY2guaD4KKworc3RydWN0IHRzX2ttcAoreworCXU4ICoJCXBhdHRlcm47CisJdW5zaWduZWQgaW50CXBhdHRlcm5fbGVuOworCXVuc2lnbmVkIGludCAJcHJlZml4X3RibFswXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQga21wX2ZpbmQoc3RydWN0IHRzX2NvbmZpZyAqY29uZiwgc3RydWN0IHRzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgdHNfa21wICprbXAgPSB0c19jb25maWdfcHJpdihjb25mKTsKKwl1bnNpZ25lZCBpbnQgaSwgcSA9IDAsIHRleHRfbGVuLCBjb25zdW1lZCA9IHN0YXRlLT5vZmZzZXQ7CisJY29uc3QgdTggKnRleHQ7CisJY29uc3QgaW50IGljYXNlID0gY29uZi0+ZmxhZ3MgJiBUU19JR05PUkVDQVNFOworCisJZm9yICg7OykgeworCQl0ZXh0X2xlbiA9IGNvbmYtPmdldF9uZXh0X2Jsb2NrKGNvbnN1bWVkLCAmdGV4dCwgY29uZiwgc3RhdGUpOworCisJCWlmICh1bmxpa2VseSh0ZXh0X2xlbiA9PSAwKSkKKwkJCWJyZWFrOworCisJCWZvciAoaSA9IDA7IGkgPCB0ZXh0X2xlbjsgaSsrKSB7CisJCQl3aGlsZSAocSA+IDAgJiYga21wLT5wYXR0ZXJuW3FdCisJCQkgICAgIT0gKGljYXNlID8gdG91cHBlcih0ZXh0W2ldKSA6IHRleHRbaV0pKQorCQkJCXEgPSBrbXAtPnByZWZpeF90YmxbcSAtIDFdOworCQkJaWYgKGttcC0+cGF0dGVybltxXQorCQkJICAgID09IChpY2FzZSA/IHRvdXBwZXIodGV4dFtpXSkgOiB0ZXh0W2ldKSkKKwkJCQlxKys7CisJCQlpZiAodW5saWtlbHkocSA9PSBrbXAtPnBhdHRlcm5fbGVuKSkgeworCQkJCXN0YXRlLT5vZmZzZXQgPSBjb25zdW1lZCArIGkgKyAxOworCQkJCXJldHVybiBzdGF0ZS0+b2Zmc2V0IC0ga21wLT5wYXR0ZXJuX2xlbjsKKwkJCX0KKwkJfQorCisJCWNvbnN1bWVkICs9IHRleHRfbGVuOworCX0KKworCXJldHVybiBVSU5UX01BWDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNvbXB1dGVfcHJlZml4X3RibChjb25zdCB1OCAqcGF0dGVybiwgdW5zaWduZWQgaW50IGxlbiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgKnByZWZpeF90YmwsIGludCBmbGFncykKK3sKKwl1bnNpZ25lZCBpbnQgaywgcTsKKwljb25zdCB1OCBpY2FzZSA9IGZsYWdzICYgVFNfSUdOT1JFQ0FTRTsKKworCWZvciAoayA9IDAsIHEgPSAxOyBxIDwgbGVuOyBxKyspIHsKKwkJd2hpbGUgKGsgPiAwICYmIChpY2FzZSA/IHRvdXBwZXIocGF0dGVybltrXSkgOiBwYXR0ZXJuW2tdKQorCQkgICAgIT0gKGljYXNlID8gdG91cHBlcihwYXR0ZXJuW3FdKSA6IHBhdHRlcm5bcV0pKQorCQkJayA9IHByZWZpeF90Ymxbay0xXTsKKwkJaWYgKChpY2FzZSA/IHRvdXBwZXIocGF0dGVybltrXSkgOiBwYXR0ZXJuW2tdKQorCQkgICAgPT0gKGljYXNlID8gdG91cHBlcihwYXR0ZXJuW3FdKSA6IHBhdHRlcm5bcV0pKQorCQkJaysrOworCQlwcmVmaXhfdGJsW3FdID0gazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHNfY29uZmlnICprbXBfaW5pdChjb25zdCB2b2lkICpwYXR0ZXJuLCB1bnNpZ25lZCBpbnQgbGVuLAorCQkJCSAgZ2ZwX3QgZ2ZwX21hc2ssIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgdHNfY29uZmlnICpjb25mOworCXN0cnVjdCB0c19rbXAgKmttcDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcHJlZml4X3RibF9sZW4gPSBsZW4gKiBzaXplb2YodW5zaWduZWQgaW50KTsKKwlzaXplX3QgcHJpdl9zaXplID0gc2l6ZW9mKCprbXApICsgbGVuICsgcHJlZml4X3RibF9sZW47CisKKwljb25mID0gYWxsb2NfdHNfY29uZmlnKHByaXZfc2l6ZSwgZ2ZwX21hc2spOworCWlmIChJU19FUlIoY29uZikpCisJCXJldHVybiBjb25mOworCisJY29uZi0+ZmxhZ3MgPSBmbGFnczsKKwlrbXAgPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlrbXAtPnBhdHRlcm5fbGVuID0gbGVuOworCWNvbXB1dGVfcHJlZml4X3RibChwYXR0ZXJuLCBsZW4sIGttcC0+cHJlZml4X3RibCwgZmxhZ3MpOworCWttcC0+cGF0dGVybiA9ICh1OCAqKSBrbXAtPnByZWZpeF90YmwgKyBwcmVmaXhfdGJsX2xlbjsKKwlpZiAoZmxhZ3MgJiBUU19JR05PUkVDQVNFKQorCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlrbXAtPnBhdHRlcm5baV0gPSB0b3VwcGVyKCgodTggKilwYXR0ZXJuKVtpXSk7CisJZWxzZQorCQltZW1jcHkoa21wLT5wYXR0ZXJuLCBwYXR0ZXJuLCBsZW4pOworCisJcmV0dXJuIGNvbmY7Cit9CisKK3N0YXRpYyB2b2lkICprbXBfZ2V0X3BhdHRlcm4oc3RydWN0IHRzX2NvbmZpZyAqY29uZikKK3sKKwlzdHJ1Y3QgdHNfa21wICprbXAgPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlyZXR1cm4ga21wLT5wYXR0ZXJuOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGttcF9nZXRfcGF0dGVybl9sZW4oc3RydWN0IHRzX2NvbmZpZyAqY29uZikKK3sKKwlzdHJ1Y3QgdHNfa21wICprbXAgPSB0c19jb25maWdfcHJpdihjb25mKTsKKwlyZXR1cm4ga21wLT5wYXR0ZXJuX2xlbjsKK30KKworc3RhdGljIHN0cnVjdCB0c19vcHMga21wX29wcyA9IHsKKwkubmFtZQkJICA9ICJrbXAiLAorCS5maW5kCQkgID0ga21wX2ZpbmQsCisJLmluaXQJCSAgPSBrbXBfaW5pdCwKKwkuZ2V0X3BhdHRlcm4JICA9IGttcF9nZXRfcGF0dGVybiwKKwkuZ2V0X3BhdHRlcm5fbGVuICA9IGttcF9nZXRfcGF0dGVybl9sZW4sCisJLm93bmVyCQkgID0gVEhJU19NT0RVTEUsCisJLmxpc3QJCSAgPSBMSVNUX0hFQURfSU5JVChrbXBfb3BzLmxpc3QpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2ttcCh2b2lkKQoreworCXJldHVybiB0ZXh0c2VhcmNoX3JlZ2lzdGVyKCZrbXBfb3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfa21wKHZvaWQpCit7CisJdGV4dHNlYXJjaF91bnJlZ2lzdGVyKCZrbXBfb3BzKTsKK30KKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChpbml0X2ttcCk7Cittb2R1bGVfZXhpdChleGl0X2ttcCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi91YnNhbi5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdWJzYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjUyYjRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdWJzYW4uYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIFVCU0FOIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqIEF1dGhvcjogQW5kcmV5IFJ5YWJpbmluIDxyeWFiaW5pbi5hLmFAZ21haWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNpbmNsdWRlICJ1YnNhbi5oIgorCitjb25zdCBjaGFyICp0eXBlX2NoZWNrX2tpbmRzW10gPSB7CisJImxvYWQgb2YiLAorCSJzdG9yZSB0byIsCisJInJlZmVyZW5jZSBiaW5kaW5nIHRvIiwKKwkibWVtYmVyIGFjY2VzcyB3aXRoaW4iLAorCSJtZW1iZXIgY2FsbCBvbiIsCisJImNvbnN0cnVjdG9yIGNhbGwgb24iLAorCSJkb3duY2FzdCBvZiIsCisJImRvd25jYXN0IG9mIgorfTsKKworI2RlZmluZSBSRVBPUlRFRF9CSVQgMzEKKworI2lmIChCSVRTX1BFUl9MT05HID09IDY0KSAmJiBkZWZpbmVkKF9fQklHX0VORElBTikKKyNkZWZpbmUgQ09MVU1OX01BU0sgKH4oMVUgPDwgUkVQT1JURURfQklUKSkKKyNkZWZpbmUgTElORV9NQVNLICAgKH4wVSkKKyNlbHNlCisjZGVmaW5lIENPTFVNTl9NQVNLICAgKH4wVSkKKyNkZWZpbmUgTElORV9NQVNLICh+KDFVIDw8IFJFUE9SVEVEX0JJVCkpCisjZW5kaWYKKworI2RlZmluZSBWQUxVRV9MRU5HVEggNDAKKworc3RhdGljIGJvb2wgd2FzX3JlcG9ydGVkKHN0cnVjdCBzb3VyY2VfbG9jYXRpb24gKmxvY2F0aW9uKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KFJFUE9SVEVEX0JJVCwgJmxvY2F0aW9uLT5yZXBvcnRlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3NvdXJjZV9sb2NhdGlvbihjb25zdCBjaGFyICpwcmVmaXgsCisJCQkJc3RydWN0IHNvdXJjZV9sb2NhdGlvbiAqbG9jKQoreworCXByX2VycigiJXMgJXM6JWQ6JWRcbiIsIHByZWZpeCwgbG9jLT5maWxlX25hbWUsCisJCWxvYy0+bGluZSAmIExJTkVfTUFTSywgbG9jLT5jb2x1bW4gJiBDT0xVTU5fTUFTSyk7Cit9CisKK3N0YXRpYyBib29sIHN1cHByZXNzX3JlcG9ydChzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uICpsb2MpCit7CisJcmV0dXJuIGN1cnJlbnQtPmluX3Vic2FuIHx8IHdhc19yZXBvcnRlZChsb2MpOworfQorCitzdGF0aWMgYm9vbCB0eXBlX2lzX2ludChzdHJ1Y3QgdHlwZV9kZXNjcmlwdG9yICp0eXBlKQoreworCXJldHVybiB0eXBlLT50eXBlX2tpbmQgPT0gdHlwZV9raW5kX2ludDsKK30KKworc3RhdGljIGJvb2wgdHlwZV9pc19zaWduZWQoc3RydWN0IHR5cGVfZGVzY3JpcHRvciAqdHlwZSkKK3sKKwlXQVJOX09OKCF0eXBlX2lzX2ludCh0eXBlKSk7CisJcmV0dXJuICB0eXBlLT50eXBlX2luZm8gJiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgdHlwZV9iaXRfd2lkdGgoc3RydWN0IHR5cGVfZGVzY3JpcHRvciAqdHlwZSkKK3sKKwlyZXR1cm4gMSA8PCAodHlwZS0+dHlwZV9pbmZvID4+IDEpOworfQorCitzdGF0aWMgYm9vbCBpc19pbmxpbmVfaW50KHN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGUpCit7CisJdW5zaWduZWQgaW5saW5lX2JpdHMgPSBzaXplb2YodW5zaWduZWQgbG9uZykqODsKKwl1bnNpZ25lZCBiaXRzID0gdHlwZV9iaXRfd2lkdGgodHlwZSk7CisKKwlXQVJOX09OKCF0eXBlX2lzX2ludCh0eXBlKSk7CisKKwlyZXR1cm4gYml0cyA8PSBpbmxpbmVfYml0czsKK30KKworc3RhdGljIHNfbWF4IGdldF9zaWduZWRfdmFsKHN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGUsIHZvaWQgKnZhbCkKK3sKKwlpZiAoaXNfaW5saW5lX2ludCh0eXBlKSkgeworCQl1bnNpZ25lZCBleHRyYV9iaXRzID0gc2l6ZW9mKHNfbWF4KSo4IC0gdHlwZV9iaXRfd2lkdGgodHlwZSk7CisJCXVuc2lnbmVkIGxvbmcgdWxvbmdfdmFsID0gKHVuc2lnbmVkIGxvbmcpdmFsOworCisJCXJldHVybiAoKHNfbWF4KXVsb25nX3ZhbCkgPDwgZXh0cmFfYml0cyA+PiBleHRyYV9iaXRzOworCX0KKworCWlmICh0eXBlX2JpdF93aWR0aCh0eXBlKSA9PSA2NCkKKwkJcmV0dXJuICooczY0ICopdmFsOworCisJcmV0dXJuICooc19tYXggKil2YWw7Cit9CisKK3N0YXRpYyBib29sIHZhbF9pc19uZWdhdGl2ZShzdHJ1Y3QgdHlwZV9kZXNjcmlwdG9yICp0eXBlLCB2b2lkICp2YWwpCit7CisJcmV0dXJuIHR5cGVfaXNfc2lnbmVkKHR5cGUpICYmIGdldF9zaWduZWRfdmFsKHR5cGUsIHZhbCkgPCAwOworfQorCitzdGF0aWMgdV9tYXggZ2V0X3Vuc2lnbmVkX3ZhbChzdHJ1Y3QgdHlwZV9kZXNjcmlwdG9yICp0eXBlLCB2b2lkICp2YWwpCit7CisJaWYgKGlzX2lubGluZV9pbnQodHlwZSkpCisJCXJldHVybiAodW5zaWduZWQgbG9uZyl2YWw7CisKKwlpZiAodHlwZV9iaXRfd2lkdGgodHlwZSkgPT0gNjQpCisJCXJldHVybiAqKHU2NCAqKXZhbDsKKworCXJldHVybiAqKHVfbWF4ICopdmFsOworfQorCitzdGF0aWMgdm9pZCB2YWxfdG9fc3RyaW5nKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIHN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGUsCisJCQl2b2lkICp2YWx1ZSkKK3sKKwlpZiAodHlwZV9pc19pbnQodHlwZSkpIHsKKwkJaWYgKHR5cGVfYml0X3dpZHRoKHR5cGUpID09IDEyOCkgeworI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfU1VQUE9SVFNfSU5UMTI4KSAmJiBkZWZpbmVkKF9fU0laRU9GX0lOVDEyOF9fKQorCQkJdV9tYXggdmFsID0gZ2V0X3Vuc2lnbmVkX3ZhbCh0eXBlLCB2YWx1ZSk7CisKKwkJCXNjbnByaW50ZihzdHIsIHNpemUsICIweCUwOHglMDh4JTA4eCUwOHgiLAorCQkJCSh1MzIpKHZhbCA+PiA5NiksCisJCQkJKHUzMikodmFsID4+IDY0KSwKKwkJCQkodTMyKSh2YWwgPj4gMzIpLAorCQkJCSh1MzIpKHZhbCkpOworI2Vsc2UKKwkJCVdBUk5fT04oMSk7CisjZW5kaWYKKwkJfSBlbHNlIGlmICh0eXBlX2lzX3NpZ25lZCh0eXBlKSkgeworCQkJc2NucHJpbnRmKHN0ciwgc2l6ZSwgIiVsbGQiLAorCQkJCShzNjQpZ2V0X3NpZ25lZF92YWwodHlwZSwgdmFsdWUpKTsKKwkJfSBlbHNlIHsKKwkJCXNjbnByaW50ZihzdHIsIHNpemUsICIlbGx1IiwKKwkJCQkodTY0KWdldF91bnNpZ25lZF92YWwodHlwZSwgdmFsdWUpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGJvb2wgbG9jYXRpb25faXNfdmFsaWQoc3RydWN0IHNvdXJjZV9sb2NhdGlvbiAqbG9jKQoreworCXJldHVybiBsb2MtPmZpbGVfbmFtZSAhPSBOVUxMOworfQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJlcG9ydF9sb2NrKTsKKworc3RhdGljIHZvaWQgdWJzYW5fcHJvbG9ndWUoc3RydWN0IHNvdXJjZV9sb2NhdGlvbiAqbG9jYXRpb24sCisJCQl1bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwljdXJyZW50LT5pbl91YnNhbisrOworCXNwaW5fbG9ja19pcnFzYXZlKCZyZXBvcnRfbG9jaywgKmZsYWdzKTsKKworCXByX2VycigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKwkJIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworCXByaW50X3NvdXJjZV9sb2NhdGlvbigiVUJTQU46IFVuZGVmaW5lZCBiZWhhdmlvdXIgaW4iLCBsb2NhdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkIHVic2FuX2VwaWxvZ3VlKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCWR1bXBfc3RhY2soKTsKKwlwcl9lcnIoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisJCSI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyZXBvcnRfbG9jaywgKmZsYWdzKTsKKwljdXJyZW50LT5pbl91YnNhbi0tOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3ZlcmZsb3coc3RydWN0IG92ZXJmbG93X2RhdGEgKmRhdGEsIHZvaWQgKmxocywKKwkJCXZvaWQgKnJocywgY2hhciBvcCkKK3sKKworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGUgPSBkYXRhLT50eXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBsaHNfdmFsX3N0cltWQUxVRV9MRU5HVEhdOworCWNoYXIgcmhzX3ZhbF9zdHJbVkFMVUVfTEVOR1RIXTsKKworCWlmIChzdXBwcmVzc19yZXBvcnQoJmRhdGEtPmxvY2F0aW9uKSkKKwkJcmV0dXJuOworCisJdWJzYW5fcHJvbG9ndWUoJmRhdGEtPmxvY2F0aW9uLCAmZmxhZ3MpOworCisJdmFsX3RvX3N0cmluZyhsaHNfdmFsX3N0ciwgc2l6ZW9mKGxoc192YWxfc3RyKSwgdHlwZSwgbGhzKTsKKwl2YWxfdG9fc3RyaW5nKHJoc192YWxfc3RyLCBzaXplb2YocmhzX3ZhbF9zdHIpLCB0eXBlLCByaHMpOworCXByX2VycigiJXMgaW50ZWdlciBvdmVyZmxvdzpcbiIsCisJCXR5cGVfaXNfc2lnbmVkKHR5cGUpID8gInNpZ25lZCIgOiAidW5zaWduZWQiKTsKKwlwcl9lcnIoIiVzICVjICVzIGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0eXBlICVzXG4iLAorCQlsaHNfdmFsX3N0ciwKKwkJb3AsCisJCXJoc192YWxfc3RyLAorCQl0eXBlLT50eXBlX25hbWUpOworCisJdWJzYW5fZXBpbG9ndWUoJmZsYWdzKTsKK30KKwordm9pZCBfX3Vic2FuX2hhbmRsZV9hZGRfb3ZlcmZsb3coc3RydWN0IG92ZXJmbG93X2RhdGEgKmRhdGEsCisJCQkJdm9pZCAqbGhzLCB2b2lkICpyaHMpCit7CisKKwloYW5kbGVfb3ZlcmZsb3coZGF0YSwgbGhzLCByaHMsICcrJyk7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWJzYW5faGFuZGxlX2FkZF9vdmVyZmxvdyk7CisKK3ZvaWQgX191YnNhbl9oYW5kbGVfc3ViX292ZXJmbG93KHN0cnVjdCBvdmVyZmxvd19kYXRhICpkYXRhLAorCQkJCXZvaWQgKmxocywgdm9pZCAqcmhzKQoreworCWhhbmRsZV9vdmVyZmxvdyhkYXRhLCBsaHMsIHJocywgJy0nKTsKK30KK0VYUE9SVF9TWU1CT0woX191YnNhbl9oYW5kbGVfc3ViX292ZXJmbG93KTsKKwordm9pZCBfX3Vic2FuX2hhbmRsZV9tdWxfb3ZlcmZsb3coc3RydWN0IG92ZXJmbG93X2RhdGEgKmRhdGEsCisJCQkJdm9pZCAqbGhzLCB2b2lkICpyaHMpCit7CisJaGFuZGxlX292ZXJmbG93KGRhdGEsIGxocywgcmhzLCAnKicpOworfQorRVhQT1JUX1NZTUJPTChfX3Vic2FuX2hhbmRsZV9tdWxfb3ZlcmZsb3cpOworCit2b2lkIF9fdWJzYW5faGFuZGxlX25lZ2F0ZV9vdmVyZmxvdyhzdHJ1Y3Qgb3ZlcmZsb3dfZGF0YSAqZGF0YSwKKwkJCQl2b2lkICpvbGRfdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBvbGRfdmFsX3N0cltWQUxVRV9MRU5HVEhdOworCisJaWYgKHN1cHByZXNzX3JlcG9ydCgmZGF0YS0+bG9jYXRpb24pKQorCQlyZXR1cm47CisKKwl1YnNhbl9wcm9sb2d1ZSgmZGF0YS0+bG9jYXRpb24sICZmbGFncyk7CisKKwl2YWxfdG9fc3RyaW5nKG9sZF92YWxfc3RyLCBzaXplb2Yob2xkX3ZhbF9zdHIpLCBkYXRhLT50eXBlLCBvbGRfdmFsKTsKKworCXByX2VycigibmVnYXRpb24gb2YgJXMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGluIHR5cGUgJXM6XG4iLAorCQlvbGRfdmFsX3N0ciwgZGF0YS0+dHlwZS0+dHlwZV9uYW1lKTsKKworCXVic2FuX2VwaWxvZ3VlKCZmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWJzYW5faGFuZGxlX25lZ2F0ZV9vdmVyZmxvdyk7CisKKwordm9pZCBfX3Vic2FuX2hhbmRsZV9kaXZyZW1fb3ZlcmZsb3coc3RydWN0IG92ZXJmbG93X2RhdGEgKmRhdGEsCisJCQkJdm9pZCAqbGhzLCB2b2lkICpyaHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIHJoc192YWxfc3RyW1ZBTFVFX0xFTkdUSF07CisKKwlpZiAoc3VwcHJlc3NfcmVwb3J0KCZkYXRhLT5sb2NhdGlvbikpCisJCXJldHVybjsKKworCXVic2FuX3Byb2xvZ3VlKCZkYXRhLT5sb2NhdGlvbiwgJmZsYWdzKTsKKworCXZhbF90b19zdHJpbmcocmhzX3ZhbF9zdHIsIHNpemVvZihyaHNfdmFsX3N0ciksIGRhdGEtPnR5cGUsIHJocyk7CisKKwlpZiAodHlwZV9pc19zaWduZWQoZGF0YS0+dHlwZSkgJiYgZ2V0X3NpZ25lZF92YWwoZGF0YS0+dHlwZSwgcmhzKSA9PSAtMSkKKwkJcHJfZXJyKCJkaXZpc2lvbiBvZiAlcyBieSAtMSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgaW4gdHlwZSAlc1xuIiwKKwkJCXJoc192YWxfc3RyLCBkYXRhLT50eXBlLT50eXBlX25hbWUpOworCWVsc2UKKwkJcHJfZXJyKCJkaXZpc2lvbiBieSB6ZXJvXG4iKTsKKworCXVic2FuX2VwaWxvZ3VlKCZmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWJzYW5faGFuZGxlX2RpdnJlbV9vdmVyZmxvdyk7CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9udWxsX3B0cl9kZXJlZihzdHJ1Y3QgdHlwZV9taXNtYXRjaF9kYXRhX2NvbW1vbiAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHN1cHByZXNzX3JlcG9ydChkYXRhLT5sb2NhdGlvbikpCisJCXJldHVybjsKKworCXVic2FuX3Byb2xvZ3VlKGRhdGEtPmxvY2F0aW9uLCAmZmxhZ3MpOworCisJcHJfZXJyKCIlcyBudWxsIHBvaW50ZXIgb2YgdHlwZSAlc1xuIiwKKwkJdHlwZV9jaGVja19raW5kc1tkYXRhLT50eXBlX2NoZWNrX2tpbmRdLAorCQlkYXRhLT50eXBlLT50eXBlX25hbWUpOworCisJdWJzYW5fZXBpbG9ndWUoJmZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX21pc2FsaWduZWRfYWNjZXNzKHN0cnVjdCB0eXBlX21pc21hdGNoX2RhdGFfY29tbW9uICpkYXRhLAorCQkJCXVuc2lnbmVkIGxvbmcgcHRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3VwcHJlc3NfcmVwb3J0KGRhdGEtPmxvY2F0aW9uKSkKKwkJcmV0dXJuOworCisJdWJzYW5fcHJvbG9ndWUoZGF0YS0+bG9jYXRpb24sICZmbGFncyk7CisKKwlwcl9lcnIoIiVzIG1pc2FsaWduZWQgYWRkcmVzcyAlcCBmb3IgdHlwZSAlc1xuIiwKKwkJdHlwZV9jaGVja19raW5kc1tkYXRhLT50eXBlX2NoZWNrX2tpbmRdLAorCQkodm9pZCAqKXB0ciwgZGF0YS0+dHlwZS0+dHlwZV9uYW1lKTsKKwlwcl9lcnIoIndoaWNoIHJlcXVpcmVzICVsZCBieXRlIGFsaWdubWVudFxuIiwgZGF0YS0+YWxpZ25tZW50KTsKKworCXVic2FuX2VwaWxvZ3VlKCZmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV9vYmplY3Rfc2l6ZV9taXNtYXRjaChzdHJ1Y3QgdHlwZV9taXNtYXRjaF9kYXRhX2NvbW1vbiAqZGF0YSwKKwkJCQkJdW5zaWduZWQgbG9uZyBwdHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChzdXBwcmVzc19yZXBvcnQoZGF0YS0+bG9jYXRpb24pKQorCQlyZXR1cm47CisKKwl1YnNhbl9wcm9sb2d1ZShkYXRhLT5sb2NhdGlvbiwgJmZsYWdzKTsKKwlwcl9lcnIoIiVzIGFkZHJlc3MgJXAgd2l0aCBpbnN1ZmZpY2llbnQgc3BhY2VcbiIsCisJCXR5cGVfY2hlY2tfa2luZHNbZGF0YS0+dHlwZV9jaGVja19raW5kXSwKKwkJKHZvaWQgKikgcHRyKTsKKwlwcl9lcnIoImZvciBhbiBvYmplY3Qgb2YgdHlwZSAlc1xuIiwgZGF0YS0+dHlwZS0+dHlwZV9uYW1lKTsKKwl1YnNhbl9lcGlsb2d1ZSgmZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB1YnNhbl90eXBlX21pc21hdGNoX2NvbW1vbihzdHJ1Y3QgdHlwZV9taXNtYXRjaF9kYXRhX2NvbW1vbiAqZGF0YSwKKwkJCQl1bnNpZ25lZCBsb25nIHB0cikKK3sKKworCWlmICghcHRyKQorCQloYW5kbGVfbnVsbF9wdHJfZGVyZWYoZGF0YSk7CisJZWxzZSBpZiAoZGF0YS0+YWxpZ25tZW50ICYmICFJU19BTElHTkVEKHB0ciwgZGF0YS0+YWxpZ25tZW50KSkKKwkJaGFuZGxlX21pc2FsaWduZWRfYWNjZXNzKGRhdGEsIHB0cik7CisJZWxzZQorCQloYW5kbGVfb2JqZWN0X3NpemVfbWlzbWF0Y2goZGF0YSwgcHRyKTsKK30KKwordm9pZCBfX3Vic2FuX2hhbmRsZV90eXBlX21pc21hdGNoKHN0cnVjdCB0eXBlX21pc21hdGNoX2RhdGEgKmRhdGEsCisJCQkJdm9pZCAqcHRyKQoreworCXN0cnVjdCB0eXBlX21pc21hdGNoX2RhdGFfY29tbW9uIGNvbW1vbl9kYXRhID0geworCQkubG9jYXRpb24gPSAmZGF0YS0+bG9jYXRpb24sCisJCS50eXBlID0gZGF0YS0+dHlwZSwKKwkJLmFsaWdubWVudCA9IGRhdGEtPmFsaWdubWVudCwKKwkJLnR5cGVfY2hlY2tfa2luZCA9IGRhdGEtPnR5cGVfY2hlY2tfa2luZAorCX07CisKKwl1YnNhbl90eXBlX21pc21hdGNoX2NvbW1vbigmY29tbW9uX2RhdGEsICh1bnNpZ25lZCBsb25nKXB0cik7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWJzYW5faGFuZGxlX3R5cGVfbWlzbWF0Y2gpOworCit2b2lkIF9fdWJzYW5faGFuZGxlX3R5cGVfbWlzbWF0Y2hfdjEoc3RydWN0IHR5cGVfbWlzbWF0Y2hfZGF0YV92MSAqZGF0YSwKKwkJCQl2b2lkICpwdHIpCit7CisKKwlzdHJ1Y3QgdHlwZV9taXNtYXRjaF9kYXRhX2NvbW1vbiBjb21tb25fZGF0YSA9IHsKKwkJLmxvY2F0aW9uID0gJmRhdGEtPmxvY2F0aW9uLAorCQkudHlwZSA9IGRhdGEtPnR5cGUsCisJCS5hbGlnbm1lbnQgPSAxVUwgPDwgZGF0YS0+bG9nX2FsaWdubWVudCwKKwkJLnR5cGVfY2hlY2tfa2luZCA9IGRhdGEtPnR5cGVfY2hlY2tfa2luZAorCX07CisKKwl1YnNhbl90eXBlX21pc21hdGNoX2NvbW1vbigmY29tbW9uX2RhdGEsICh1bnNpZ25lZCBsb25nKXB0cik7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWJzYW5faGFuZGxlX3R5cGVfbWlzbWF0Y2hfdjEpOworCit2b2lkIF9fdWJzYW5faGFuZGxlX25vbm51bGxfcmV0dXJuKHN0cnVjdCBub25udWxsX3JldHVybl9kYXRhICpkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3VwcHJlc3NfcmVwb3J0KCZkYXRhLT5sb2NhdGlvbikpCisJCXJldHVybjsKKworCXVic2FuX3Byb2xvZ3VlKCZkYXRhLT5sb2NhdGlvbiwgJmZsYWdzKTsKKworCXByX2VycigibnVsbCBwb2ludGVyIHJldHVybmVkIGZyb20gZnVuY3Rpb24gZGVjbGFyZWQgdG8gbmV2ZXIgcmV0dXJuIG51bGxcbiIpOworCisJaWYgKGxvY2F0aW9uX2lzX3ZhbGlkKCZkYXRhLT5hdHRyX2xvY2F0aW9uKSkKKwkJcHJpbnRfc291cmNlX2xvY2F0aW9uKCJyZXR1cm5zX25vbm51bGwgYXR0cmlidXRlIHNwZWNpZmllZCBpbiIsCisJCQkJJmRhdGEtPmF0dHJfbG9jYXRpb24pOworCisJdWJzYW5fZXBpbG9ndWUoJmZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woX191YnNhbl9oYW5kbGVfbm9ubnVsbF9yZXR1cm4pOworCit2b2lkIF9fdWJzYW5faGFuZGxlX3ZsYV9ib3VuZF9ub3RfcG9zaXRpdmUoc3RydWN0IHZsYV9ib3VuZF9kYXRhICpkYXRhLAorCQkJCQl2b2lkICpib3VuZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoYXIgYm91bmRfc3RyW1ZBTFVFX0xFTkdUSF07CisKKwlpZiAoc3VwcHJlc3NfcmVwb3J0KCZkYXRhLT5sb2NhdGlvbikpCisJCXJldHVybjsKKworCXVic2FuX3Byb2xvZ3VlKCZkYXRhLT5sb2NhdGlvbiwgJmZsYWdzKTsKKworCXZhbF90b19zdHJpbmcoYm91bmRfc3RyLCBzaXplb2YoYm91bmRfc3RyKSwgZGF0YS0+dHlwZSwgYm91bmQpOworCXByX2VycigidmFyaWFibGUgbGVuZ3RoIGFycmF5IGJvdW5kIHZhbHVlICVzIDw9IDBcbiIsIGJvdW5kX3N0cik7CisKKwl1YnNhbl9lcGlsb2d1ZSgmZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChfX3Vic2FuX2hhbmRsZV92bGFfYm91bmRfbm90X3Bvc2l0aXZlKTsKKwordm9pZCBfX3Vic2FuX2hhbmRsZV9vdXRfb2ZfYm91bmRzKHN0cnVjdCBvdXRfb2ZfYm91bmRzX2RhdGEgKmRhdGEsIHZvaWQgKmluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciBpbmRleF9zdHJbVkFMVUVfTEVOR1RIXTsKKworCWlmIChzdXBwcmVzc19yZXBvcnQoJmRhdGEtPmxvY2F0aW9uKSkKKwkJcmV0dXJuOworCisJdWJzYW5fcHJvbG9ndWUoJmRhdGEtPmxvY2F0aW9uLCAmZmxhZ3MpOworCisJdmFsX3RvX3N0cmluZyhpbmRleF9zdHIsIHNpemVvZihpbmRleF9zdHIpLCBkYXRhLT5pbmRleF90eXBlLCBpbmRleCk7CisJcHJfZXJyKCJpbmRleCAlcyBpcyBvdXQgb2YgcmFuZ2UgZm9yIHR5cGUgJXNcbiIsIGluZGV4X3N0ciwKKwkJZGF0YS0+YXJyYXlfdHlwZS0+dHlwZV9uYW1lKTsKKwl1YnNhbl9lcGlsb2d1ZSgmZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChfX3Vic2FuX2hhbmRsZV9vdXRfb2ZfYm91bmRzKTsKKwordm9pZCBfX3Vic2FuX2hhbmRsZV9zaGlmdF9vdXRfb2ZfYm91bmRzKHN0cnVjdCBzaGlmdF9vdXRfb2ZfYm91bmRzX2RhdGEgKmRhdGEsCisJCQkJCXZvaWQgKmxocywgdm9pZCAqcmhzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHR5cGVfZGVzY3JpcHRvciAqcmhzX3R5cGUgPSBkYXRhLT5yaHNfdHlwZTsKKwlzdHJ1Y3QgdHlwZV9kZXNjcmlwdG9yICpsaHNfdHlwZSA9IGRhdGEtPmxoc190eXBlOworCWNoYXIgcmhzX3N0cltWQUxVRV9MRU5HVEhdOworCWNoYXIgbGhzX3N0cltWQUxVRV9MRU5HVEhdOworCisJaWYgKHN1cHByZXNzX3JlcG9ydCgmZGF0YS0+bG9jYXRpb24pKQorCQlyZXR1cm47CisKKwl1YnNhbl9wcm9sb2d1ZSgmZGF0YS0+bG9jYXRpb24sICZmbGFncyk7CisKKwl2YWxfdG9fc3RyaW5nKHJoc19zdHIsIHNpemVvZihyaHNfc3RyKSwgcmhzX3R5cGUsIHJocyk7CisJdmFsX3RvX3N0cmluZyhsaHNfc3RyLCBzaXplb2YobGhzX3N0ciksIGxoc190eXBlLCBsaHMpOworCisJaWYgKHZhbF9pc19uZWdhdGl2ZShyaHNfdHlwZSwgcmhzKSkKKwkJcHJfZXJyKCJzaGlmdCBleHBvbmVudCAlcyBpcyBuZWdhdGl2ZVxuIiwgcmhzX3N0cik7CisKKwllbHNlIGlmIChnZXRfdW5zaWduZWRfdmFsKHJoc190eXBlLCByaHMpID49CisJCXR5cGVfYml0X3dpZHRoKGxoc190eXBlKSkKKwkJcHJfZXJyKCJzaGlmdCBleHBvbmVudCAlcyBpcyB0b28gbGFyZ2UgZm9yICV1LWJpdCB0eXBlICVzXG4iLAorCQkJcmhzX3N0ciwKKwkJCXR5cGVfYml0X3dpZHRoKGxoc190eXBlKSwKKwkJCWxoc190eXBlLT50eXBlX25hbWUpOworCWVsc2UgaWYgKHZhbF9pc19uZWdhdGl2ZShsaHNfdHlwZSwgbGhzKSkKKwkJcHJfZXJyKCJsZWZ0IHNoaWZ0IG9mIG5lZ2F0aXZlIHZhbHVlICVzXG4iLAorCQkJbGhzX3N0cik7CisJZWxzZQorCQlwcl9lcnIoImxlZnQgc2hpZnQgb2YgJXMgYnkgJXMgcGxhY2VzIGNhbm5vdCBiZSIKKwkJCSIgcmVwcmVzZW50ZWQgaW4gdHlwZSAlc1xuIiwKKwkJCWxoc19zdHIsIHJoc19zdHIsCisJCQlsaHNfdHlwZS0+dHlwZV9uYW1lKTsKKworCXVic2FuX2VwaWxvZ3VlKCZmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKF9fdWJzYW5faGFuZGxlX3NoaWZ0X291dF9vZl9ib3VuZHMpOworCisKK3ZvaWQgX191YnNhbl9oYW5kbGVfYnVpbHRpbl91bnJlYWNoYWJsZShzdHJ1Y3QgdW5yZWFjaGFibGVfZGF0YSAqZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdWJzYW5fcHJvbG9ndWUoJmRhdGEtPmxvY2F0aW9uLCAmZmxhZ3MpOworCXByX2VycigiY2FsbGluZyBfX2J1aWx0aW5fdW5yZWFjaGFibGUoKVxuIik7CisJdWJzYW5fZXBpbG9ndWUoJmZsYWdzKTsKKwlwYW5pYygiY2FuJ3QgcmV0dXJuIGZyb20gX19idWlsdGluX3VucmVhY2hhYmxlKCkiKTsKK30KK0VYUE9SVF9TWU1CT0woX191YnNhbl9oYW5kbGVfYnVpbHRpbl91bnJlYWNoYWJsZSk7CisKK3ZvaWQgX191YnNhbl9oYW5kbGVfbG9hZF9pbnZhbGlkX3ZhbHVlKHN0cnVjdCBpbnZhbGlkX3ZhbHVlX2RhdGEgKmRhdGEsCisJCQkJdm9pZCAqdmFsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciB2YWxfc3RyW1ZBTFVFX0xFTkdUSF07CisKKwlpZiAoc3VwcHJlc3NfcmVwb3J0KCZkYXRhLT5sb2NhdGlvbikpCisJCXJldHVybjsKKworCXVic2FuX3Byb2xvZ3VlKCZkYXRhLT5sb2NhdGlvbiwgJmZsYWdzKTsKKworCXZhbF90b19zdHJpbmcodmFsX3N0ciwgc2l6ZW9mKHZhbF9zdHIpLCBkYXRhLT50eXBlLCB2YWwpOworCisJcHJfZXJyKCJsb2FkIG9mIHZhbHVlICVzIGlzIG5vdCBhIHZhbGlkIHZhbHVlIGZvciB0eXBlICVzXG4iLAorCQl2YWxfc3RyLCBkYXRhLT50eXBlLT50eXBlX25hbWUpOworCisJdWJzYW5fZXBpbG9ndWUoJmZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woX191YnNhbl9oYW5kbGVfbG9hZF9pbnZhbGlkX3ZhbHVlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3Vic2FuLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi91YnNhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzBiMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi91YnNhbi5oCkBAIC0wLDAgKzEsOTkgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisjaWZuZGVmIF9MSUJfVUJTQU5fSAorI2RlZmluZSBfTElCX1VCU0FOX0gKKworZW51bSB7CisJdHlwZV9raW5kX2ludCA9IDAsCisJdHlwZV9raW5kX2Zsb2F0ID0gMSwKKwl0eXBlX3Vua25vd24gPSAweGZmZmYKK307CisKK3N0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgeworCXUxNiB0eXBlX2tpbmQ7CisJdTE2IHR5cGVfaW5mbzsKKwljaGFyIHR5cGVfbmFtZVsxXTsKK307CisKK3N0cnVjdCBzb3VyY2VfbG9jYXRpb24geworCWNvbnN0IGNoYXIgKmZpbGVfbmFtZTsKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGxvbmcgcmVwb3J0ZWQ7CisJCXN0cnVjdCB7CisJCQl1MzIgbGluZTsKKwkJCXUzMiBjb2x1bW47CisJCX07CisJfTsKK307CisKK3N0cnVjdCBvdmVyZmxvd19kYXRhIHsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGU7Cit9OworCitzdHJ1Y3QgdHlwZV9taXNtYXRjaF9kYXRhIHsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGU7CisJdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQ7CisJdW5zaWduZWQgY2hhciB0eXBlX2NoZWNrX2tpbmQ7Cit9OworCitzdHJ1Y3QgdHlwZV9taXNtYXRjaF9kYXRhX3YxIHsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGU7CisJdW5zaWduZWQgY2hhciBsb2dfYWxpZ25tZW50OworCXVuc2lnbmVkIGNoYXIgdHlwZV9jaGVja19raW5kOworfTsKKworc3RydWN0IHR5cGVfbWlzbWF0Y2hfZGF0YV9jb21tb24geworCXN0cnVjdCBzb3VyY2VfbG9jYXRpb24gKmxvY2F0aW9uOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGU7CisJdW5zaWduZWQgbG9uZyBhbGlnbm1lbnQ7CisJdW5zaWduZWQgY2hhciB0eXBlX2NoZWNrX2tpbmQ7Cit9OworCitzdHJ1Y3Qgbm9ubnVsbF9hcmdfZGF0YSB7CisJc3RydWN0IHNvdXJjZV9sb2NhdGlvbiBsb2NhdGlvbjsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGF0dHJfbG9jYXRpb247CisJaW50IGFyZ19pbmRleDsKK307CisKK3N0cnVjdCBub25udWxsX3JldHVybl9kYXRhIHsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCBzb3VyY2VfbG9jYXRpb24gYXR0cl9sb2NhdGlvbjsKK307CisKK3N0cnVjdCB2bGFfYm91bmRfZGF0YSB7CisJc3RydWN0IHNvdXJjZV9sb2NhdGlvbiBsb2NhdGlvbjsKKwlzdHJ1Y3QgdHlwZV9kZXNjcmlwdG9yICp0eXBlOworfTsKKworc3RydWN0IG91dF9vZl9ib3VuZHNfZGF0YSB7CisJc3RydWN0IHNvdXJjZV9sb2NhdGlvbiBsb2NhdGlvbjsKKwlzdHJ1Y3QgdHlwZV9kZXNjcmlwdG9yICphcnJheV90eXBlOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKmluZGV4X3R5cGU7Cit9OworCitzdHJ1Y3Qgc2hpZnRfb3V0X29mX2JvdW5kc19kYXRhIHsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKmxoc190eXBlOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnJoc190eXBlOworfTsKKworc3RydWN0IHVucmVhY2hhYmxlX2RhdGEgeworCXN0cnVjdCBzb3VyY2VfbG9jYXRpb24gbG9jYXRpb247Cit9OworCitzdHJ1Y3QgaW52YWxpZF92YWx1ZV9kYXRhIHsKKwlzdHJ1Y3Qgc291cmNlX2xvY2F0aW9uIGxvY2F0aW9uOworCXN0cnVjdCB0eXBlX2Rlc2NyaXB0b3IgKnR5cGU7Cit9OworCisjaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TVVBQT1JUU19JTlQxMjgpICYmIGRlZmluZWQoX19TSVpFT0ZfSU5UMTI4X18pCit0eXBlZGVmIF9faW50MTI4IHNfbWF4OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDEyOCB1X21heDsKKyNlbHNlCit0eXBlZGVmIHM2NCBzX21heDsKK3R5cGVkZWYgdTY0IHVfbWF4OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdWNzMl9zdHJpbmcuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3VjczJfc3RyaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlMDZiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3VjczJfc3RyaW5nLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisjaW5jbHVkZSA8bGludXgvdWNzMl9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGRhdGEgKi8KK3Vuc2lnbmVkIGxvbmcKK3VjczJfc3Rybmxlbihjb25zdCB1Y3MyX2NoYXJfdCAqcywgc2l6ZV90IG1heGxlbmd0aCkKK3sKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOworCisgICAgICAgIHdoaWxlICgqcysrICE9IDAgJiYgbGVuZ3RoIDwgbWF4bGVuZ3RoKQorICAgICAgICAgICAgICAgIGxlbmd0aCsrOworICAgICAgICByZXR1cm4gbGVuZ3RoOworfQorRVhQT1JUX1NZTUJPTCh1Y3MyX3N0cm5sZW4pOworCit1bnNpZ25lZCBsb25nCit1Y3MyX3N0cmxlbihjb25zdCB1Y3MyX2NoYXJfdCAqcykKK3sKKyAgICAgICAgcmV0dXJuIHVjczJfc3RybmxlbihzLCB+MFVMKTsKK30KK0VYUE9SVF9TWU1CT0wodWNzMl9zdHJsZW4pOworCisvKgorICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgdGhlIGxlbmd0aCBvZiB0aGlzIHN0cmluZworICogTm90ZTogdGhpcyBpcyBOT1QgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiB1bmljb2RlIGNoYXJhY3RlcnMKKyAqLwordW5zaWduZWQgbG9uZwordWNzMl9zdHJzaXplKGNvbnN0IHVjczJfY2hhcl90ICpkYXRhLCB1bnNpZ25lZCBsb25nIG1heGxlbmd0aCkKK3sKKyAgICAgICAgcmV0dXJuIHVjczJfc3RybmxlbihkYXRhLCBtYXhsZW5ndGgvc2l6ZW9mKHVjczJfY2hhcl90KSkgKiBzaXplb2YodWNzMl9jaGFyX3QpOworfQorRVhQT1JUX1NZTUJPTCh1Y3MyX3N0cnNpemUpOworCitpbnQKK3VjczJfc3RybmNtcChjb25zdCB1Y3MyX2NoYXJfdCAqYSwgY29uc3QgdWNzMl9jaGFyX3QgKmIsIHNpemVfdCBsZW4pCit7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICAgICAgaWYgKGxlbiA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgaWYgKCphIDwgKmIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgaWYgKCphID4gKmIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBpZiAoKmEgPT0gMCkgLyogaW1wbGllcyAqYiA9PSAwICovCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBhKys7CisgICAgICAgICAgICAgICAgYisrOworICAgICAgICAgICAgICAgIGxlbi0tOworICAgICAgICB9Cit9CitFWFBPUlRfU1lNQk9MKHVjczJfc3RybmNtcCk7CisKK3Vuc2lnbmVkIGxvbmcKK3VjczJfdXRmOHNpemUoY29uc3QgdWNzMl9jaGFyX3QgKnNyYykKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisJdW5zaWduZWQgbG9uZyBqID0gMDsKKworCWZvciAoaSA9IDA7IHNyY1tpXTsgaSsrKSB7CisJCXUxNiBjID0gc3JjW2ldOworCisJCWlmIChjID49IDB4ODAwKQorCQkJaiArPSAzOworCQllbHNlIGlmIChjID49IDB4ODApCisJCQlqICs9IDI7CisJCWVsc2UKKwkJCWogKz0gMTsKKwl9CisKKwlyZXR1cm4gajsKK30KK0VYUE9SVF9TWU1CT0wodWNzMl91dGY4c2l6ZSk7CisKKy8qCisgKiBjb3B5IGF0IG1vc3QgbWF4bGVuZ3RoIGJ5dGVzIG9mIHdob2xlIHV0ZjggY2hhcmFjdGVycyB0byBkZXN0IGZyb20gdGhlCisgKiB1Y3MyIHN0cmluZyBzcmMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgY29waWVkLCBub3QgaW5jbHVkaW5nIHRoZQorICogZmluYWwgTlVMIGNoYXJhY3Rlci4KKyAqLwordW5zaWduZWQgbG9uZwordWNzMl9hc191dGY4KHU4ICpkZXN0LCBjb25zdCB1Y3MyX2NoYXJfdCAqc3JjLCB1bnNpZ25lZCBsb25nIG1heGxlbmd0aCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGogPSAwOworCXVuc2lnbmVkIGxvbmcgbGltaXQgPSB1Y3MyX3N0cm5sZW4oc3JjLCBtYXhsZW5ndGgpOworCisJZm9yIChpID0gMDsgbWF4bGVuZ3RoICYmIGkgPCBsaW1pdDsgaSsrKSB7CisJCXUxNiBjID0gc3JjW2ldOworCisJCWlmIChjID49IDB4ODAwKSB7CisJCQlpZiAobWF4bGVuZ3RoIDwgMykKKwkJCQlicmVhazsKKwkJCW1heGxlbmd0aCAtPSAzOworCQkJZGVzdFtqKytdID0gMHhlMCB8IChjICYgMHhmMDAwKSA+PiAxMjsKKwkJCWRlc3RbaisrXSA9IDB4ODAgfCAoYyAmIDB4MGZjMCkgPj4gNjsKKwkJCWRlc3RbaisrXSA9IDB4ODAgfCAoYyAmIDB4MDAzZik7CisJCX0gZWxzZSBpZiAoYyA+PSAweDgwKSB7CisJCQlpZiAobWF4bGVuZ3RoIDwgMikKKwkJCQlicmVhazsKKwkJCW1heGxlbmd0aCAtPSAyOworCQkJZGVzdFtqKytdID0gMHhjMCB8IChjICYgMHg3YzApID4+IDY7CisJCQlkZXN0W2orK10gPSAweDgwIHwgKGMgJiAweDAzZik7CisJCX0gZWxzZSB7CisJCQltYXhsZW5ndGggLT0gMTsKKwkJCWRlc3RbaisrXSA9IGMgJiAweDdmOworCQl9CisJfQorCWlmIChtYXhsZW5ndGgpCisJCWRlc3Rbal0gPSAnXDAnOworCXJldHVybiBqOworfQorRVhQT1JUX1NZTUJPTCh1Y3MyX2FzX3V0ZjgpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvdXNlcmNvcHkuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3VzZXJjb3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0NGIyYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3VzZXJjb3B5LmMKQEAgLTAsMCArMSwzMyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisKKy8qIG91dC1vZi1saW5lIHBhcnRzICovCisKKyNpZm5kZWYgSU5MSU5FX0NPUFlfRlJPTV9VU0VSCit1bnNpZ25lZCBsb25nIF9jb3B5X2Zyb21fdXNlcih2b2lkICp0bywgY29uc3Qgdm9pZCBfX3VzZXIgKmZyb20sIHVuc2lnbmVkIGxvbmcgbikKK3sKKwl1bnNpZ25lZCBsb25nIHJlcyA9IG47CisJbWlnaHRfZmF1bHQoKTsKKwlpZiAobGlrZWx5KGFjY2Vzc19vayhWRVJJRllfUkVBRCwgZnJvbSwgbikpKSB7CisJCWthc2FuX2NoZWNrX3dyaXRlKHRvLCBuKTsKKwkJcmVzID0gcmF3X2NvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKKwl9CisJaWYgKHVubGlrZWx5KHJlcykpCisJCW1lbXNldCh0byArIChuIC0gcmVzKSwgMCwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorRVhQT1JUX1NZTUJPTChfY29weV9mcm9tX3VzZXIpOworI2VuZGlmCisKKyNpZm5kZWYgSU5MSU5FX0NPUFlfVE9fVVNFUgordW5zaWduZWQgbG9uZyBfY29weV90b191c2VyKHZvaWQgX191c2VyICp0bywgY29uc3Qgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBuKQoreworCW1pZ2h0X2ZhdWx0KCk7CisJaWYgKGxpa2VseShhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB0bywgbikpKSB7CisJCWthc2FuX2NoZWNrX3JlYWQoZnJvbSwgbik7CisJCW4gPSByYXdfY29weV90b191c2VyKHRvLCBmcm9tLCBuKTsKKwl9CisJcmV0dXJuIG47Cit9CitFWFBPUlRfU1lNQk9MKF9jb3B5X3RvX3VzZXIpOworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi91dWlkLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi91dWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwYjlmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3V1aWQuYwpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIFVuaWZpZWQgVVVJRC9HVUlEIGRlZmluaXRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTYgSW50ZWwgQ29ycC4KKyAqCUh1YW5nIFlpbmcgPHlpbmcuaHVhbmdAaW50ZWwuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3V1aWQuaD4KKyNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKworY29uc3QgZ3VpZF90IGd1aWRfbnVsbDsKK0VYUE9SVF9TWU1CT0woZ3VpZF9udWxsKTsKK2NvbnN0IHV1aWRfdCB1dWlkX251bGw7CitFWFBPUlRfU1lNQk9MKHV1aWRfbnVsbCk7CisKK2NvbnN0IHU4IGd1aWRfaW5kZXhbMTZdID0gezMsMiwxLDAsNSw0LDcsNiw4LDksMTAsMTEsMTIsMTMsMTQsMTV9OworY29uc3QgdTggdXVpZF9pbmRleFsxNl0gPSB7MCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNX07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhbmRvbSBVVUlEIGludGVyZmFjZQorICoKKyAqIFVzZWQgaGVyZSBmb3IgYSBCb290IElELCBidXQgY2FuIGJlIHVzZWZ1bCBmb3Igb3RoZXIga2VybmVsCisgKiBkcml2ZXJzLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIEdlbmVyYXRlIHJhbmRvbSBVVUlECisgKi8KK3ZvaWQgZ2VuZXJhdGVfcmFuZG9tX3V1aWQodW5zaWduZWQgY2hhciB1dWlkWzE2XSkKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKHV1aWQsIDE2KTsKKwkvKiBTZXQgVVVJRCB2ZXJzaW9uIHRvIDQgLS0tIHRydWx5IHJhbmRvbSBnZW5lcmF0aW9uICovCisJdXVpZFs2XSA9ICh1dWlkWzZdICYgMHgwRikgfCAweDQwOworCS8qIFNldCB0aGUgVVVJRCB2YXJpYW50IHRvIERDRSAqLworCXV1aWRbOF0gPSAodXVpZFs4XSAmIDB4M0YpIHwgMHg4MDsKK30KK0VYUE9SVF9TWU1CT0woZ2VuZXJhdGVfcmFuZG9tX3V1aWQpOworCitzdGF0aWMgdm9pZCBfX3V1aWRfZ2VuX2NvbW1vbihfX3U4IGJbMTZdKQoreworCXByYW5kb21fYnl0ZXMoYiwgMTYpOworCS8qIHJldmVyc2lvbiAwYjEwICovCisJYls4XSA9IChiWzhdICYgMHgzRikgfCAweDgwOworfQorCit2b2lkIGd1aWRfZ2VuKGd1aWRfdCAqbHUpCit7CisJX191dWlkX2dlbl9jb21tb24obHUtPmIpOworCS8qIHZlcnNpb24gNCA6IHJhbmRvbSBnZW5lcmF0aW9uICovCisJbHUtPmJbN10gPSAobHUtPmJbN10gJiAweDBGKSB8IDB4NDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChndWlkX2dlbik7CisKK3ZvaWQgdXVpZF9nZW4odXVpZF90ICpidSkKK3sKKwlfX3V1aWRfZ2VuX2NvbW1vbihidS0+Yik7CisJLyogdmVyc2lvbiA0IDogcmFuZG9tIGdlbmVyYXRpb24gKi8KKwlidS0+Yls2XSA9IChidS0+Yls2XSAmIDB4MEYpIHwgMHg0MDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHV1aWRfZ2VuKTsKKworLyoqCisgICogdXVpZF9pc192YWxpZCAtIGNoZWNrcyBpZiBVVUlEIHN0cmluZyB2YWxpZAorICAqIEB1dWlkOglVVUlEIHN0cmluZyB0byBjaGVjaworICAqCisgICogRGVzY3JpcHRpb246CisgICogSXQgY2hlY2tzIGlmIHRoZSBVVUlEIHN0cmluZyBpcyBmb2xsb3dpbmcgdGhlIGZvcm1hdDoKKyAgKgl4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgKKyAgKiB3aGVyZSB4IGlzIGEgaGV4IGRpZ2l0LgorICAqCisgICogUmV0dXJuOiB0cnVlIGlmIGlucHV0IGlzIHZhbGlkIFVVSUQgc3RyaW5nLgorICAqLworYm9vbCB1dWlkX2lzX3ZhbGlkKGNvbnN0IGNoYXIgKnV1aWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVVVJRF9TVFJJTkdfTEVOOyBpKyspIHsKKwkJaWYgKGkgPT0gOCB8fCBpID09IDEzIHx8IGkgPT0gMTggfHwgaSA9PSAyMykgeworCQkJaWYgKHV1aWRbaV0gIT0gJy0nKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIGlmICghaXN4ZGlnaXQodXVpZFtpXSkpIHsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTCh1dWlkX2lzX3ZhbGlkKTsKKworc3RhdGljIGludCBfX3V1aWRfcGFyc2UoY29uc3QgY2hhciAqdXVpZCwgX191OCBiWzE2XSwgY29uc3QgdTggZWlbMTZdKQoreworCXN0YXRpYyBjb25zdCB1OCBzaVsxNl0gPSB7MCwyLDQsNiw5LDExLDE0LDE2LDE5LDIxLDI0LDI2LDI4LDMwLDMyLDM0fTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICghdXVpZF9pc192YWxpZCh1dWlkKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpbnQgaGkgPSBoZXhfdG9fYmluKHV1aWRbc2lbaV0gKyAwXSk7CisJCWludCBsbyA9IGhleF90b19iaW4odXVpZFtzaVtpXSArIDFdKTsKKworCQliW2VpW2ldXSA9IChoaSA8PCA0KSB8IGxvOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZ3VpZF9wYXJzZShjb25zdCBjaGFyICp1dWlkLCBndWlkX3QgKnUpCit7CisJcmV0dXJuIF9fdXVpZF9wYXJzZSh1dWlkLCB1LT5iLCBndWlkX2luZGV4KTsKK30KK0VYUE9SVF9TWU1CT0woZ3VpZF9wYXJzZSk7CisKK2ludCB1dWlkX3BhcnNlKGNvbnN0IGNoYXIgKnV1aWQsIHV1aWRfdCAqdSkKK3sKKwlyZXR1cm4gX191dWlkX3BhcnNlKHV1aWQsIHUtPmIsIHV1aWRfaW5kZXgpOworfQorRVhQT1JUX1NZTUJPTCh1dWlkX3BhcnNlKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3ZzcHJpbnRmLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi92c3ByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOTkwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi92c3ByaW50Zi5jCkBAIC0wLDAgKzEsMzAyOSBAQAorLyoKKyAqICBsaW51eC9saWIvdnNwcmludGYuYworICoKKyAqICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgIExpbnVzIFRvcnZhbGRzCisgKi8KKworLyogdnNwcmludGYuYyAtLSBMYXJzIFdpcnplbml1cyAmIExpbnVzIFRvcnZhbGRzLiAqLworLyoKKyAqIFdpcnplbml1cyB3cm90ZSB0aGlzIHBvcnRhYmx5LCBUb3J2YWxkcyBmdWNrZWQgaXQgdXAgOi0pCisgKi8KKworLyoKKyAqIEZyaSBKdWwgMTMgMjAwMSBDcnV0Y2hlciBEdW5uYXZhbnQgPGNydXRjaGVyK2tlcm5lbEBkYXRhc3RhY2tzLmNvbT4KKyAqIC0gY2hhbmdlZCB0byBwcm92aWRlIHNucHJpbnRmIGFuZCB2c25wcmludGYgZnVuY3Rpb25zCisgKiBTbyBGZWIgIDEgMTY6NTE6MzIgQ0VUIDIwMDQgSnVlcmdlbiBRdWFkZSA8cXVhZGVAaHNuci5kZT4KKyAqIC0gc2NucHJpbnRmIGFuZCB2c2NucHJpbnRmCisgKi8KKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay1wcm92aWRlci5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBmb3IgS1NZTV9TWU1CT0xfTEVOICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NyZWQuaD4KKyNpbmNsdWRlIDxsaW51eC91dWlkLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KKyNpZmRlZiBDT05GSUdfQkxPQ0sKKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vbW0vaW50ZXJuYWwuaCIJLyogRm9yIHRoZSB0cmFjZV9wcmludF9mbGFncyBhcnJheXMgKi8KKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CQkvKiBmb3IgUEFHRV9TSVpFICovCisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CS8qIGZvciBkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKCkgKi8KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CS8qIGNwdV90b19sZTE2ICovCisKKyNpbmNsdWRlIDxsaW51eC9zdHJpbmdfaGVscGVycy5oPgorI2luY2x1ZGUgImtzdHJ0b3guaCIKKworLyoqCisgKiBzaW1wbGVfc3RydG91bGwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZworICogQGNwOiBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZworICogQGVuZHA6IEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGhlcmUKKyAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBvYnNvbGV0ZS4gUGxlYXNlIHVzZSBrc3RydG91bGwgaW5zdGVhZC4KKyAqLwordW5zaWduZWQgbG9uZyBsb25nIHNpbXBsZV9zdHJ0b3VsbChjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXN1bHQ7CisJdW5zaWduZWQgaW50IHJ2OworCisJY3AgPSBfcGFyc2VfaW50ZWdlcl9maXh1cF9yYWRpeChjcCwgJmJhc2UpOworCXJ2ID0gX3BhcnNlX2ludGVnZXIoY3AsIGJhc2UsICZyZXN1bHQpOworCS8qIEZJWE1FICovCisJY3AgKz0gKHJ2ICYgfktTVFJUT1hfT1ZFUkZMT1cpOworCisJaWYgKGVuZHApCisJCSplbmRwID0gKGNoYXIgKiljcDsKKworCXJldHVybiByZXN1bHQ7Cit9CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9zdHJ0b3VsbCk7CisKKy8qKgorICogc2ltcGxlX3N0cnRvdWwgLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIHVuc2lnbmVkIGxvbmcKKyAqIEBjcDogVGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcKKyAqIEBlbmRwOiBBIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgcGFyc2VkIHN0cmluZyB3aWxsIGJlIHBsYWNlZCBoZXJlCisgKiBAYmFzZTogVGhlIG51bWJlciBiYXNlIHRvIHVzZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgb2Jzb2xldGUuIFBsZWFzZSB1c2Uga3N0cnRvdWwgaW5zdGVhZC4KKyAqLwordW5zaWduZWQgbG9uZyBzaW1wbGVfc3RydG91bChjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQoreworCXJldHVybiBzaW1wbGVfc3RydG91bGwoY3AsIGVuZHAsIGJhc2UpOworfQorRVhQT1JUX1NZTUJPTChzaW1wbGVfc3RydG91bCk7CisKKy8qKgorICogc2ltcGxlX3N0cnRvbCAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBzaWduZWQgbG9uZworICogQGNwOiBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZworICogQGVuZHA6IEEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBwYXJzZWQgc3RyaW5nIHdpbGwgYmUgcGxhY2VkIGhlcmUKKyAqIEBiYXNlOiBUaGUgbnVtYmVyIGJhc2UgdG8gdXNlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBvYnNvbGV0ZS4gUGxlYXNlIHVzZSBrc3RydG9sIGluc3RlYWQuCisgKi8KK2xvbmcgc2ltcGxlX3N0cnRvbChjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQoreworCWlmICgqY3AgPT0gJy0nKQorCQlyZXR1cm4gLXNpbXBsZV9zdHJ0b3VsKGNwICsgMSwgZW5kcCwgYmFzZSk7CisKKwlyZXR1cm4gc2ltcGxlX3N0cnRvdWwoY3AsIGVuZHAsIGJhc2UpOworfQorRVhQT1JUX1NZTUJPTChzaW1wbGVfc3RydG9sKTsKKworLyoqCisgKiBzaW1wbGVfc3RydG9sbCAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSBzaWduZWQgbG9uZyBsb25nCisgKiBAY3A6IFRoZSBzdGFydCBvZiB0aGUgc3RyaW5nCisgKiBAZW5kcDogQSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHBhcnNlZCBzdHJpbmcgd2lsbCBiZSBwbGFjZWQgaGVyZQorICogQGJhc2U6IFRoZSBudW1iZXIgYmFzZSB0byB1c2UKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ic29sZXRlLiBQbGVhc2UgdXNlIGtzdHJ0b2xsIGluc3RlYWQuCisgKi8KK2xvbmcgbG9uZyBzaW1wbGVfc3RydG9sbChjb25zdCBjaGFyICpjcCwgY2hhciAqKmVuZHAsIHVuc2lnbmVkIGludCBiYXNlKQoreworCWlmICgqY3AgPT0gJy0nKQorCQlyZXR1cm4gLXNpbXBsZV9zdHJ0b3VsbChjcCArIDEsIGVuZHAsIGJhc2UpOworCisJcmV0dXJuIHNpbXBsZV9zdHJ0b3VsbChjcCwgZW5kcCwgYmFzZSk7Cit9CitFWFBPUlRfU1lNQk9MKHNpbXBsZV9zdHJ0b2xsKTsKKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworaW50IHNraXBfYXRvaShjb25zdCBjaGFyICoqcykKK3sKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWkgPSBpKjEwICsgKigoKnMpKyspIC0gJzAnOworCX0gd2hpbGUgKGlzZGlnaXQoKipzKSk7CisKKwlyZXR1cm4gaTsKK30KKworLyoKKyAqIERlY2ltYWwgY29udmVyc2lvbiBpcyBieSBmYXIgdGhlIG1vc3QgdHlwaWNhbCwgYW5kIGlzIHVzZWQgZm9yCisgKiAvcHJvYyBhbmQgL3N5cyBkYXRhLiBUaGlzIGRpcmVjdGx5IGltcGFjdHMgZS5nLiB0b3AgcGVyZm9ybWFuY2UKKyAqIHdpdGggbWFueSBwcm9jZXNzZXMgcnVubmluZy4gV2Ugb3B0aW1pemUgaXQgZm9yIHNwZWVkIGJ5IGVtaXR0aW5nCisgKiB0d28gY2hhcmFjdGVycyBhdCBhIHRpbWUsIHVzaW5nIGEgMjAwIGJ5dGUgbG9va3VwIHRhYmxlLiBUaGlzCisgKiByb3VnaGx5IGhhbHZlcyB0aGUgbnVtYmVyIG9mIG11bHRpcGxpY2F0aW9ucyBjb21wYXJlZCB0byBjb21wdXRpbmcKKyAqIHRoZSBkaWdpdHMgb25lIGF0IGEgdGltZS4gSW1wbGVtZW50YXRpb24gc3Ryb25nbHkgaW5zcGlyZWQgYnkgdGhlCisgKiBwcmV2aW91cyB2ZXJzaW9uLCB3aGljaCBpbiB0dXJuIHVzZWQgaWRlYXMgZGVzY3JpYmVkIGF0CisgKiA8aHR0cDovL3d3dy5jcy51aW93YS5lZHUvfmpvbmVzL2JjZC9kaXZpZGUuaHRtbD4gKHdpdGggcGVybWlzc2lvbgorICogZnJvbSB0aGUgYXV0aG9yLCBEb3VnbGFzIFcuIEpvbmVzKS4KKyAqCisgKiBJdCB0dXJucyBvdXQgdGhlcmUgaXMgcHJlY2lzZWx5IG9uZSAyNiBiaXQgZml4ZWQtcG9pbnQKKyAqIGFwcHJveGltYXRpb24gYSBvZiA2NC8xMDAgZm9yIHdoaWNoIHgvMTAwID09ICh4ICogKHU2NClhKSA+PiAzMgorICogaG9sZHMgZm9yIGFsbCB4IGluIFswLCAxMF44LTFdLCBuYW1lbHkgYSA9IDB4MjhmNWMyOS4gVGhlIGFjdHVhbAorICogcmFuZ2UgaGFwcGVucyB0byBiZSBzb21ld2hhdCBsYXJnZXIgKHggPD0gMTA3Mzc0MTg5OCksIGJ1dCB0aGF0J3MKKyAqIGlycmVsZXZhbnQgZm9yIG91ciBwdXJwb3NlLgorICoKKyAqIEZvciBkaXZpZGluZyBhIG51bWJlciBpbiB0aGUgcmFuZ2UgWzEwXjQsIDEwXjYtMV0gYnkgMTAwLCB3ZSBzdGlsbAorICogbmVlZCBhIDMyeDMyLT42NCBiaXQgbXVsdGlwbHksIHNvIHdlIHNpbXBseSB1c2UgdGhlIHNhbWUgY29uc3RhbnQuCisgKgorICogRm9yIGRpdmlkaW5nIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMTAwLCAxMF40LTFdIGJ5IDEwMCwgdGhlcmUgYXJlCisgKiBzZXZlcmFsIG9wdGlvbnMuIFRoZSBzaW1wbGVzdCBpcyAoeCAqIDB4MTQ3YikgPj4gMTksIHdoaWNoIGlzIHZhbGlkCisgKiBmb3IgYWxsIHggPD0gNDM2OTguCisgKi8KKworc3RhdGljIGNvbnN0IHUxNiBkZWNwYWlyWzEwMF0gPSB7CisjZGVmaW5lIF8oeCkgKF9fZm9yY2UgdTE2KSBjcHVfdG9fbGUxNigoKHggJSAxMCkgfCAoKHggLyAxMCkgPDwgOCkpICsgMHgzMDMwKQorCV8oIDApLCBfKCAxKSwgXyggMiksIF8oIDMpLCBfKCA0KSwgXyggNSksIF8oIDYpLCBfKCA3KSwgXyggOCksIF8oIDkpLAorCV8oMTApLCBfKDExKSwgXygxMiksIF8oMTMpLCBfKDE0KSwgXygxNSksIF8oMTYpLCBfKDE3KSwgXygxOCksIF8oMTkpLAorCV8oMjApLCBfKDIxKSwgXygyMiksIF8oMjMpLCBfKDI0KSwgXygyNSksIF8oMjYpLCBfKDI3KSwgXygyOCksIF8oMjkpLAorCV8oMzApLCBfKDMxKSwgXygzMiksIF8oMzMpLCBfKDM0KSwgXygzNSksIF8oMzYpLCBfKDM3KSwgXygzOCksIF8oMzkpLAorCV8oNDApLCBfKDQxKSwgXyg0MiksIF8oNDMpLCBfKDQ0KSwgXyg0NSksIF8oNDYpLCBfKDQ3KSwgXyg0OCksIF8oNDkpLAorCV8oNTApLCBfKDUxKSwgXyg1MiksIF8oNTMpLCBfKDU0KSwgXyg1NSksIF8oNTYpLCBfKDU3KSwgXyg1OCksIF8oNTkpLAorCV8oNjApLCBfKDYxKSwgXyg2MiksIF8oNjMpLCBfKDY0KSwgXyg2NSksIF8oNjYpLCBfKDY3KSwgXyg2OCksIF8oNjkpLAorCV8oNzApLCBfKDcxKSwgXyg3MiksIF8oNzMpLCBfKDc0KSwgXyg3NSksIF8oNzYpLCBfKDc3KSwgXyg3OCksIF8oNzkpLAorCV8oODApLCBfKDgxKSwgXyg4MiksIF8oODMpLCBfKDg0KSwgXyg4NSksIF8oODYpLCBfKDg3KSwgXyg4OCksIF8oODkpLAorCV8oOTApLCBfKDkxKSwgXyg5MiksIF8oOTMpLCBfKDk0KSwgXyg5NSksIF8oOTYpLCBfKDk3KSwgXyg5OCksIF8oOTkpLAorI3VuZGVmIF8KK307CisKKy8qCisgKiBUaGlzIHdpbGwgcHJpbnQgYSBzaW5nbGUgJzAnIGV2ZW4gaWYgciA9PSAwLCBzaW5jZSB3ZSB3b3VsZAorICogaW1tZWRpYXRlbHkganVtcCB0byBvdXRfciB3aGVyZSB0d28gMHMgd291bGQgYmUgd3JpdHRlbiBidXQgb25seQorICogb25lIG9mIHRoZW0gYWNjb3VudGVkIGZvciBpbiBidWYuIFRoaXMgaXMgbmVlZGVkIGJ5IGlwNF9zdHJpbmcKKyAqIGJlbG93LiBBbGwgb3RoZXIgY2FsbGVycyBwYXNzIGEgbm9uLXplcm8gdmFsdWUgb2Ygci4KKyovCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpwdXRfZGVjX3RydW5jOChjaGFyICpidWYsIHVuc2lnbmVkIHIpCit7CisJdW5zaWduZWQgcTsKKworCS8qIDEgPD0gciA8IDEwXjggKi8KKwlpZiAociA8IDEwMCkKKwkJZ290byBvdXRfcjsKKworCS8qIDEwMCA8PSByIDwgMTBeOCAqLworCXEgPSAociAqICh1NjQpMHgyOGY1YzI5KSA+PiAzMjsKKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltyIC0gMTAwKnFdOworCWJ1ZiArPSAyOworCisJLyogMSA8PSBxIDwgMTBeNiAqLworCWlmIChxIDwgMTAwKQorCQlnb3RvIG91dF9xOworCisJLyogIDEwMCA8PSBxIDwgMTBeNiAqLworCXIgPSAocSAqICh1NjQpMHgyOGY1YzI5KSA+PiAzMjsKKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltxIC0gMTAwKnJdOworCWJ1ZiArPSAyOworCisJLyogMSA8PSByIDwgMTBeNCAqLworCWlmIChyIDwgMTAwKQorCQlnb3RvIG91dF9yOworCisJLyogMTAwIDw9IHIgPCAxMF40ICovCisJcSA9IChyICogMHgxNDdiKSA+PiAxOTsKKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltyIC0gMTAwKnFdOworCWJ1ZiArPSAyOworb3V0X3E6CisJLyogMSA8PSBxIDwgMTAwICovCisJciA9IHE7CitvdXRfcjoKKwkvKiAxIDw9IHIgPCAxMDAgKi8KKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltyXTsKKwlidWYgKz0gciA8IDEwID8gMSA6IDI7CisJcmV0dXJuIGJ1ZjsKK30KKworI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjQgJiYgQklUU19QRVJfTE9OR19MT05HID09IDY0CitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpwdXRfZGVjX2Z1bGw4KGNoYXIgKmJ1ZiwgdW5zaWduZWQgcikKK3sKKwl1bnNpZ25lZCBxOworCisJLyogMCA8PSByIDwgMTBeOCAqLworCXEgPSAociAqICh1NjQpMHgyOGY1YzI5KSA+PiAzMjsKKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltyIC0gMTAwKnFdOworCWJ1ZiArPSAyOworCisJLyogMCA8PSBxIDwgMTBeNiAqLworCXIgPSAocSAqICh1NjQpMHgyOGY1YzI5KSA+PiAzMjsKKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltxIC0gMTAwKnJdOworCWJ1ZiArPSAyOworCisJLyogMCA8PSByIDwgMTBeNCAqLworCXEgPSAociAqIDB4MTQ3YikgPj4gMTk7CisJKigodTE2ICopYnVmKSA9IGRlY3BhaXJbciAtIDEwMCpxXTsKKwlidWYgKz0gMjsKKworCS8qIDAgPD0gcSA8IDEwMCAqLworCSooKHUxNiAqKWJ1ZikgPSBkZWNwYWlyW3FdOworCWJ1ZiArPSAyOworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKnB1dF9kZWMoY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgbikKK3sKKwlpZiAobiA+PSAxMDAqMTAwMCoxMDAwKQorCQlidWYgPSBwdXRfZGVjX2Z1bGw4KGJ1ZiwgZG9fZGl2KG4sIDEwMCoxMDAwKjEwMDApKTsKKwkvKiAxIDw9IG4gPD0gMS42ZTExICovCisJaWYgKG4gPj0gMTAwKjEwMDAqMTAwMCkKKwkJYnVmID0gcHV0X2RlY19mdWxsOChidWYsIGRvX2RpdihuLCAxMDAqMTAwMCoxMDAwKSk7CisJLyogMSA8PSBuIDwgMWU4ICovCisJcmV0dXJuIHB1dF9kZWNfdHJ1bmM4KGJ1Ziwgbik7Cit9CisKKyNlbGlmIEJJVFNfUEVSX0xPTkcgPT0gMzIgJiYgQklUU19QRVJfTE9OR19MT05HID09IDY0CisKK3N0YXRpYyB2b2lkCitwdXRfZGVjX2Z1bGw0KGNoYXIgKmJ1ZiwgdW5zaWduZWQgcikKK3sKKwl1bnNpZ25lZCBxOworCisJLyogMCA8PSByIDwgMTBeNCAqLworCXEgPSAociAqIDB4MTQ3YikgPj4gMTk7CisJKigodTE2ICopYnVmKSA9IGRlY3BhaXJbciAtIDEwMCpxXTsKKwlidWYgKz0gMjsKKwkvKiAwIDw9IHEgPCAxMDAgKi8KKwkqKCh1MTYgKilidWYpID0gZGVjcGFpcltxXTsKK30KKworLyoKKyAqIENhbGwgcHV0X2RlY19mdWxsNCBvbiB4ICUgMTAwMDAsIHJldHVybiB4IC8gMTAwMDAuCisgKiBUaGUgYXBwcm94aW1hdGlvbiB4LzEwMDAwID09ICh4ICogMHgzNDZEQzVENykgPj4gNDMKKyAqIGhvbGRzIGZvciBhbGwgeCA8IDEsMTI4LDg2OSw5OTkuICBUaGUgbGFyZ2VzdCB2YWx1ZSB0aGlzCisgKiBoZWxwZXIgd2lsbCBldmVyIGJlIGFza2VkIHRvIGNvbnZlcnQgaXMgMSwxMjUsNTIwLDk1NS4KKyAqIChzZWNvbmQgY2FsbCBpbiB0aGUgcHV0X2RlYyBjb2RlLCBhc3N1bWluZyBuIGlzIGFsbC1vbmVzKS4KKyAqLworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjawordW5zaWduZWQgcHV0X2RlY19oZWxwZXI0KGNoYXIgKmJ1ZiwgdW5zaWduZWQgeCkKK3sKKyAgICAgICAgdWludDMyX3QgcSA9ICh4ICogKHVpbnQ2NF90KTB4MzQ2REM1RDcpID4+IDQzOworCisgICAgICAgIHB1dF9kZWNfZnVsbDQoYnVmLCB4IC0gcSAqIDEwMDAwKTsKKyAgICAgICAgcmV0dXJuIHE7Cit9CisKKy8qIEJhc2VkIG9uIGNvZGUgYnkgRG91Z2xhcyBXLiBKb25lcyBmb3VuZCBhdAorICogPGh0dHA6Ly93d3cuY3MudWlvd2EuZWR1L35qb25lcy9iY2QvZGVjaW1hbC5odG1sI3NpeHR5Zm91cj4KKyAqICh3aXRoIHBlcm1pc3Npb24gZnJvbSB0aGUgYXV0aG9yKS4KKyAqIFBlcmZvcm1zIG5vIDY0LWJpdCBkaXZpc2lvbiBhbmQgaGVuY2Ugc2hvdWxkIGJlIGZhc3Qgb24gMzItYml0IG1hY2hpbmVzLgorICovCitzdGF0aWMKK2NoYXIgKnB1dF9kZWMoY2hhciAqYnVmLCB1bnNpZ25lZCBsb25nIGxvbmcgbikKK3sKKwl1aW50MzJfdCBkMywgZDIsIGQxLCBxLCBoOworCisJaWYgKG4gPCAxMDAqMTAwMCoxMDAwKQorCQlyZXR1cm4gcHV0X2RlY190cnVuYzgoYnVmLCBuKTsKKworCWQxICA9ICgodWludDMyX3QpbiA+PiAxNik7IC8qIGltcGxpY2l0ICImIDB4ZmZmZiIgKi8KKwloICAgPSAobiA+PiAzMik7CisJZDIgID0gKGggICAgICApICYgMHhmZmZmOworCWQzICA9IChoID4+IDE2KTsgLyogaW1wbGljaXQgIiYgMHhmZmZmIiAqLworCisJLyogbiA9IDJeNDggZDMgKyAyXjMyIGQyICsgMl4xNiBkMSArIGQwCisJICAgICA9IDI4MV80NzQ5Xzc2NzFfMDY1NiBkMyArIDQyXzk0OTZfNzI5NiBkMiArIDZfNTUzNiBkMSArIGQwICovCisJcSAgID0gNjU2ICogZDMgKyA3Mjk2ICogZDIgKyA1NTM2ICogZDEgKyAoKHVpbnQzMl90KW4gJiAweGZmZmYpOworCXEgPSBwdXRfZGVjX2hlbHBlcjQoYnVmLCBxKTsKKworCXEgKz0gNzY3MSAqIGQzICsgOTQ5NiAqIGQyICsgNiAqIGQxOworCXEgPSBwdXRfZGVjX2hlbHBlcjQoYnVmKzQsIHEpOworCisJcSArPSA0NzQ5ICogZDMgKyA0MiAqIGQyOworCXEgPSBwdXRfZGVjX2hlbHBlcjQoYnVmKzgsIHEpOworCisJcSArPSAyODEgKiBkMzsKKwlidWYgKz0gMTI7CisJaWYgKHEpCisJCWJ1ZiA9IHB1dF9kZWNfdHJ1bmM4KGJ1ZiwgcSk7CisJZWxzZSB3aGlsZSAoYnVmWy0xXSA9PSAnMCcpCisJCS0tYnVmOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2VuZGlmCisKKy8qCisgKiBDb252ZXJ0IHBhc3NlZCBudW1iZXIgdG8gZGVjaW1hbCBzdHJpbmcuCisgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2Ygc3RyaW5nLiAgT24gYnVmZmVyIG92ZXJmbG93LCByZXR1cm5zIDAuCisgKgorICogSWYgc3BlZWQgaXMgbm90IGltcG9ydGFudCwgdXNlIHNucHJpbnRmKCkuIEl0J3MgZWFzeSB0byByZWFkIHRoZSBjb2RlLgorICovCitpbnQgbnVtX3RvX3N0cihjaGFyICpidWYsIGludCBzaXplLCB1bnNpZ25lZCBsb25nIGxvbmcgbnVtKQoreworCS8qIHB1dF9kZWMgcmVxdWlyZXMgMi1ieXRlIGFsaWdubWVudCBvZiB0aGUgYnVmZmVyLiAqLworCWNoYXIgdG1wW3NpemVvZihudW0pICogM10gX19hbGlnbmVkKDIpOworCWludCBpZHgsIGxlbjsKKworCS8qIHB1dF9kZWMoKSBtYXkgd29yayBpbmNvcnJlY3RseSBmb3IgbnVtID0gMCAoZ2VuZXJhdGUgIiIsIG5vdCAiMCIpICovCisJaWYgKG51bSA8PSA5KSB7CisJCXRtcFswXSA9ICcwJyArIG51bTsKKwkJbGVuID0gMTsKKwl9IGVsc2UgeworCQlsZW4gPSBwdXRfZGVjKHRtcCwgbnVtKSAtIHRtcDsKKwl9CisKKwlpZiAobGVuID4gc2l6ZSkKKwkJcmV0dXJuIDA7CisJZm9yIChpZHggPSAwOyBpZHggPCBsZW47ICsraWR4KQorCQlidWZbaWR4XSA9IHRtcFtsZW4gLSBpZHggLSAxXTsKKwlyZXR1cm4gbGVuOworfQorCisjZGVmaW5lIFNJR04JMQkJLyogdW5zaWduZWQvc2lnbmVkLCBtdXN0IGJlIDEgKi8KKyNkZWZpbmUgTEVGVAkyCQkvKiBsZWZ0IGp1c3RpZmllZCAqLworI2RlZmluZSBQTFVTCTQJCS8qIHNob3cgcGx1cyAqLworI2RlZmluZSBTUEFDRQk4CQkvKiBzcGFjZSBpZiBwbHVzICovCisjZGVmaW5lIFpFUk9QQUQJMTYJCS8qIHBhZCB3aXRoIHplcm8sIG11c3QgYmUgMTYgPT0gJzAnIC0gJyAnICovCisjZGVmaW5lIFNNQUxMCTMyCQkvKiB1c2UgbG93ZXJjYXNlIGluIGhleCAobXVzdCBiZSAzMiA9PSAweDIwKSAqLworI2RlZmluZSBTUEVDSUFMCTY0CQkvKiBwcmVmaXggaGV4IHdpdGggIjB4Iiwgb2N0YWwgd2l0aCAiMCIgKi8KKworZW51bSBmb3JtYXRfdHlwZSB7CisJRk9STUFUX1RZUEVfTk9ORSwgLyogSnVzdCBhIHN0cmluZyBwYXJ0ICovCisJRk9STUFUX1RZUEVfV0lEVEgsCisJRk9STUFUX1RZUEVfUFJFQ0lTSU9OLAorCUZPUk1BVF9UWVBFX0NIQVIsCisJRk9STUFUX1RZUEVfU1RSLAorCUZPUk1BVF9UWVBFX1BUUiwKKwlGT1JNQVRfVFlQRV9QRVJDRU5UX0NIQVIsCisJRk9STUFUX1RZUEVfSU5WQUxJRCwKKwlGT1JNQVRfVFlQRV9MT05HX0xPTkcsCisJRk9STUFUX1RZUEVfVUxPTkcsCisJRk9STUFUX1RZUEVfTE9ORywKKwlGT1JNQVRfVFlQRV9VQllURSwKKwlGT1JNQVRfVFlQRV9CWVRFLAorCUZPUk1BVF9UWVBFX1VTSE9SVCwKKwlGT1JNQVRfVFlQRV9TSE9SVCwKKwlGT1JNQVRfVFlQRV9VSU5ULAorCUZPUk1BVF9UWVBFX0lOVCwKKwlGT1JNQVRfVFlQRV9TSVpFX1QsCisJRk9STUFUX1RZUEVfUFRSRElGRgorfTsKKworc3RydWN0IHByaW50Zl9zcGVjIHsKKwl1bnNpZ25lZCBpbnQJdHlwZTo4OwkJLyogZm9ybWF0X3R5cGUgZW51bSAqLworCXNpZ25lZCBpbnQJZmllbGRfd2lkdGg6MjQ7CS8qIHdpZHRoIG9mIG91dHB1dCBmaWVsZCAqLworCXVuc2lnbmVkIGludAlmbGFnczo4OwkvKiBmbGFncyB0byBudW1iZXIoKSAqLworCXVuc2lnbmVkIGludAliYXNlOjg7CQkvKiBudW1iZXIgYmFzZSwgOCwgMTAgb3IgMTYgb25seSAqLworCXNpZ25lZCBpbnQJcHJlY2lzaW9uOjE2OwkvKiAjIG9mIGRpZ2l0cy9jaGFycyAqLworfSBfX3BhY2tlZDsKKyNkZWZpbmUgRklFTERfV0lEVEhfTUFYICgoMSA8PCAyMykgLSAxKQorI2RlZmluZSBQUkVDSVNJT05fTUFYICgoMSA8PCAxNSkgLSAxKQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpudW1iZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sCisJICAgICBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYykKK3sKKwkvKiBwdXRfZGVjIHJlcXVpcmVzIDItYnl0ZSBhbGlnbm1lbnQgb2YgdGhlIGJ1ZmZlci4gKi8KKwljaGFyIHRtcFszICogc2l6ZW9mKG51bSldIF9fYWxpZ25lZCgyKTsKKwljaGFyIHNpZ247CisJY2hhciBsb2Nhc2U7CisJaW50IG5lZWRfcGZ4ID0gKChzcGVjLmZsYWdzICYgU1BFQ0lBTCkgJiYgc3BlYy5iYXNlICE9IDEwKTsKKwlpbnQgaTsKKwlib29sIGlzX3plcm8gPSBudW0gPT0gMExMOworCWludCBmaWVsZF93aWR0aCA9IHNwZWMuZmllbGRfd2lkdGg7CisJaW50IHByZWNpc2lvbiA9IHNwZWMucHJlY2lzaW9uOworCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3QgcHJpbnRmX3NwZWMpICE9IDgpOworCisJLyogbG9jYXNlID0gMCBvciAweDIwLiBPUmluZyBkaWdpdHMgb3IgbGV0dGVycyB3aXRoICdsb2Nhc2UnCisJICogcHJvZHVjZXMgc2FtZSBkaWdpdHMgb3IgKG1heWJlIGxvd2VyY2FzZWQpIGxldHRlcnMgKi8KKwlsb2Nhc2UgPSAoc3BlYy5mbGFncyAmIFNNQUxMKTsKKwlpZiAoc3BlYy5mbGFncyAmIExFRlQpCisJCXNwZWMuZmxhZ3MgJj0gflpFUk9QQUQ7CisJc2lnbiA9IDA7CisJaWYgKHNwZWMuZmxhZ3MgJiBTSUdOKSB7CisJCWlmICgoc2lnbmVkIGxvbmcgbG9uZyludW0gPCAwKSB7CisJCQlzaWduID0gJy0nOworCQkJbnVtID0gLShzaWduZWQgbG9uZyBsb25nKW51bTsKKwkJCWZpZWxkX3dpZHRoLS07CisJCX0gZWxzZSBpZiAoc3BlYy5mbGFncyAmIFBMVVMpIHsKKwkJCXNpZ24gPSAnKyc7CisJCQlmaWVsZF93aWR0aC0tOworCQl9IGVsc2UgaWYgKHNwZWMuZmxhZ3MgJiBTUEFDRSkgeworCQkJc2lnbiA9ICcgJzsKKwkJCWZpZWxkX3dpZHRoLS07CisJCX0KKwl9CisJaWYgKG5lZWRfcGZ4KSB7CisJCWlmIChzcGVjLmJhc2UgPT0gMTYpCisJCQlmaWVsZF93aWR0aCAtPSAyOworCQllbHNlIGlmICghaXNfemVybykKKwkJCWZpZWxkX3dpZHRoLS07CisJfQorCisJLyogZ2VuZXJhdGUgZnVsbCBzdHJpbmcgaW4gdG1wW10sIGluIHJldmVyc2Ugb3JkZXIgKi8KKwlpID0gMDsKKwlpZiAobnVtIDwgc3BlYy5iYXNlKQorCQl0bXBbaSsrXSA9IGhleF9hc2NfdXBwZXJbbnVtXSB8IGxvY2FzZTsKKwllbHNlIGlmIChzcGVjLmJhc2UgIT0gMTApIHsgLyogOCBvciAxNiAqLworCQlpbnQgbWFzayA9IHNwZWMuYmFzZSAtIDE7CisJCWludCBzaGlmdCA9IDM7CisKKwkJaWYgKHNwZWMuYmFzZSA9PSAxNikKKwkJCXNoaWZ0ID0gNDsKKwkJZG8geworCQkJdG1wW2krK10gPSAoaGV4X2FzY191cHBlclsoKHVuc2lnbmVkIGNoYXIpbnVtKSAmIG1hc2tdIHwgbG9jYXNlKTsKKwkJCW51bSA+Pj0gc2hpZnQ7CisJCX0gd2hpbGUgKG51bSk7CisJfSBlbHNlIHsgLyogYmFzZSAxMCAqLworCQlpID0gcHV0X2RlYyh0bXAsIG51bSkgLSB0bXA7CisJfQorCisJLyogcHJpbnRpbmcgMTAwIHVzaW5nICUyZCBnaXZlcyAiMTAwIiwgbm90ICIwMCIgKi8KKwlpZiAoaSA+IHByZWNpc2lvbikKKwkJcHJlY2lzaW9uID0gaTsKKwkvKiBsZWFkaW5nIHNwYWNlIHBhZGRpbmcgKi8KKwlmaWVsZF93aWR0aCAtPSBwcmVjaXNpb247CisJaWYgKCEoc3BlYy5mbGFncyAmIChaRVJPUEFEIHwgTEVGVCkpKSB7CisJCXdoaWxlICgtLWZpZWxkX3dpZHRoID49IDApIHsKKwkJCWlmIChidWYgPCBlbmQpCisJCQkJKmJ1ZiA9ICcgJzsKKwkJCSsrYnVmOworCQl9CisJfQorCS8qIHNpZ24gKi8KKwlpZiAoc2lnbikgeworCQlpZiAoYnVmIDwgZW5kKQorCQkJKmJ1ZiA9IHNpZ247CisJCSsrYnVmOworCX0KKwkvKiAiMHgiIC8gIjAiIHByZWZpeCAqLworCWlmIChuZWVkX3BmeCkgeworCQlpZiAoc3BlYy5iYXNlID09IDE2IHx8ICFpc196ZXJvKSB7CisJCQlpZiAoYnVmIDwgZW5kKQorCQkJCSpidWYgPSAnMCc7CisJCQkrK2J1ZjsKKwkJfQorCQlpZiAoc3BlYy5iYXNlID09IDE2KSB7CisJCQlpZiAoYnVmIDwgZW5kKQorCQkJCSpidWYgPSAoJ1gnIHwgbG9jYXNlKTsKKwkJCSsrYnVmOworCQl9CisJfQorCS8qIHplcm8gb3Igc3BhY2UgcGFkZGluZyAqLworCWlmICghKHNwZWMuZmxhZ3MgJiBMRUZUKSkgeworCQljaGFyIGMgPSAnICcgKyAoc3BlYy5mbGFncyAmIFpFUk9QQUQpOworCQlCVUlMRF9CVUdfT04oJyAnICsgWkVST1BBRCAhPSAnMCcpOworCQl3aGlsZSAoLS1maWVsZF93aWR0aCA+PSAwKSB7CisJCQlpZiAoYnVmIDwgZW5kKQorCQkJCSpidWYgPSBjOworCQkJKytidWY7CisJCX0KKwl9CisJLyogaG1tIGV2ZW4gbW9yZSB6ZXJvIHBhZGRpbmc/ICovCisJd2hpbGUgKGkgPD0gLS1wcmVjaXNpb24pIHsKKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSAnMCc7CisJCSsrYnVmOworCX0KKwkvKiBhY3R1YWwgZGlnaXRzIG9mIHJlc3VsdCAqLworCXdoaWxlICgtLWkgPj0gMCkgeworCQlpZiAoYnVmIDwgZW5kKQorCQkJKmJ1ZiA9IHRtcFtpXTsKKwkJKytidWY7CisJfQorCS8qIHRyYWlsaW5nIHNwYWNlIHBhZGRpbmcgKi8KKwl3aGlsZSAoLS1maWVsZF93aWR0aCA+PSAwKSB7CisJCWlmIChidWYgPCBlbmQpCisJCQkqYnVmID0gJyAnOworCQkrK2J1ZjsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpzcGVjaWFsX2hleF9udW1iZXIoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgbG9uZyBudW0sIGludCBzaXplKQoreworCXN0cnVjdCBwcmludGZfc3BlYyBzcGVjOworCisJc3BlYy50eXBlID0gRk9STUFUX1RZUEVfUFRSOworCXNwZWMuZmllbGRfd2lkdGggPSAyICsgMiAqIHNpemU7CS8qIDB4ICsgaGV4ICovCisJc3BlYy5mbGFncyA9IFNQRUNJQUwgfCBTTUFMTCB8IFpFUk9QQUQ7CisJc3BlYy5iYXNlID0gMTY7CisJc3BlYy5wcmVjaXNpb24gPSAtMTsKKworCXJldHVybiBudW1iZXIoYnVmLCBlbmQsIG51bSwgc3BlYyk7Cit9CisKK3N0YXRpYyB2b2lkIG1vdmVfcmlnaHQoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgc3BhY2VzKQoreworCXNpemVfdCBzaXplOworCWlmIChidWYgPj0gZW5kKQkvKiBub3doZXJlIHRvIHB1dCBhbnl0aGluZyAqLworCQlyZXR1cm47CisJc2l6ZSA9IGVuZCAtIGJ1ZjsKKwlpZiAoc2l6ZSA8PSBzcGFjZXMpIHsKKwkJbWVtc2V0KGJ1ZiwgJyAnLCBzaXplKTsKKwkJcmV0dXJuOworCX0KKwlpZiAobGVuKSB7CisJCWlmIChsZW4gPiBzaXplIC0gc3BhY2VzKQorCQkJbGVuID0gc2l6ZSAtIHNwYWNlczsKKwkJbWVtbW92ZShidWYgKyBzcGFjZXMsIGJ1ZiwgbGVuKTsKKwl9CisJbWVtc2V0KGJ1ZiwgJyAnLCBzcGFjZXMpOworfQorCisvKgorICogSGFuZGxlIGZpZWxkIHdpZHRoIHBhZGRpbmcgZm9yIGEgc3RyaW5nLgorICogQGJ1ZjogY3VycmVudCBidWZmZXIgcG9zaXRpb24KKyAqIEBuOiBsZW5ndGggb2Ygc3RyaW5nCisgKiBAZW5kOiBlbmQgb2Ygb3V0cHV0IGJ1ZmZlcgorICogQHNwZWM6IGZvciBmaWVsZCB3aWR0aCBhbmQgZmxhZ3MKKyAqIFJldHVybnM6IG5ldyBidWZmZXIgcG9zaXRpb24gYWZ0ZXIgcGFkZGluZy4KKyAqLworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqd2lkZW5fc3RyaW5nKGNoYXIgKmJ1ZiwgaW50IG4sIGNoYXIgKmVuZCwgc3RydWN0IHByaW50Zl9zcGVjIHNwZWMpCit7CisJdW5zaWduZWQgc3BhY2VzOworCisJaWYgKGxpa2VseShuID49IHNwZWMuZmllbGRfd2lkdGgpKQorCQlyZXR1cm4gYnVmOworCS8qIHdlIHdhbnQgdG8gcGFkIHRoZSBzdWNrZXIgKi8KKwlzcGFjZXMgPSBzcGVjLmZpZWxkX3dpZHRoIC0gbjsKKwlpZiAoIShzcGVjLmZsYWdzICYgTEVGVCkpIHsKKwkJbW92ZV9yaWdodChidWYgLSBuLCBlbmQsIG4sIHNwYWNlcyk7CisJCXJldHVybiBidWYgKyBzcGFjZXM7CisJfQorCXdoaWxlIChzcGFjZXMtLSkgeworCQlpZiAoYnVmIDwgZW5kKQorCQkJKmJ1ZiA9ICcgJzsKKwkJKytidWY7CisJfQorCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKnN0cmluZyhjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3QgY2hhciAqcywgc3RydWN0IHByaW50Zl9zcGVjIHNwZWMpCit7CisJaW50IGxlbiA9IDA7CisJc2l6ZV90IGxpbSA9IHNwZWMucHJlY2lzaW9uOworCisJaWYgKCh1bnNpZ25lZCBsb25nKXMgPCBQQUdFX1NJWkUpCisJCXMgPSAiKG51bGwpIjsKKworCXdoaWxlIChsaW0tLSkgeworCQljaGFyIGMgPSAqcysrOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSBjOworCQkrK2J1ZjsKKwkJKytsZW47CisJfQorCXJldHVybiB3aWRlbl9zdHJpbmcoYnVmLCBsZW4sIGVuZCwgc3BlYyk7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKmRlbnRyeV9uYW1lKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBzdHJ1Y3QgZGVudHJ5ICpkLCBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywKKwkJICBjb25zdCBjaGFyICpmbXQpCit7CisJY29uc3QgY2hhciAqYXJyYXlbNF0sICpzOworCWNvbnN0IHN0cnVjdCBkZW50cnkgKnA7CisJaW50IGRlcHRoOworCWludCBpLCBuOworCisJc3dpdGNoIChmbXRbMV0pIHsKKwkJY2FzZSAnMic6IGNhc2UgJzMnOiBjYXNlICc0JzoKKwkJCWRlcHRoID0gZm10WzFdIC0gJzAnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlkZXB0aCA9IDE7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCWZvciAoaSA9IDA7IGkgPCBkZXB0aDsgaSsrLCBkID0gcCkgeworCQlwID0gQUNDRVNTX09OQ0UoZC0+ZF9wYXJlbnQpOworCQlhcnJheVtpXSA9IEFDQ0VTU19PTkNFKGQtPmRfbmFtZS5uYW1lKTsKKwkJaWYgKHAgPT0gZCkgeworCQkJaWYgKGkpCisJCQkJYXJyYXlbaV0gPSAiIjsKKwkJCWkrKzsKKwkJCWJyZWFrOworCQl9CisJfQorCXMgPSBhcnJheVstLWldOworCWZvciAobiA9IDA7IG4gIT0gc3BlYy5wcmVjaXNpb247IG4rKywgYnVmKyspIHsKKwkJY2hhciBjID0gKnMrKzsKKwkJaWYgKCFjKSB7CisJCQlpZiAoIWkpCisJCQkJYnJlYWs7CisJCQljID0gJy8nOworCQkJcyA9IGFycmF5Wy0taV07CisJCX0KKwkJaWYgKGJ1ZiA8IGVuZCkKKwkJCSpidWYgPSBjOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gd2lkZW5fc3RyaW5nKGJ1ZiwgbiwgZW5kLCBzcGVjKTsKK30KKworI2lmZGVmIENPTkZJR19CTE9DSworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqYmRldl9uYW1lKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQlzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywgY29uc3QgY2hhciAqZm10KQoreworCXN0cnVjdCBnZW5kaXNrICpoZCA9IGJkZXYtPmJkX2Rpc2s7CisJCisJYnVmID0gc3RyaW5nKGJ1ZiwgZW5kLCBoZC0+ZGlza19uYW1lLCBzcGVjKTsKKwlpZiAoYmRldi0+YmRfcGFydC0+cGFydG5vKSB7CisJCWlmIChpc2RpZ2l0KGhkLT5kaXNrX25hbWVbc3RybGVuKGhkLT5kaXNrX25hbWUpLTFdKSkgeworCQkJaWYgKGJ1ZiA8IGVuZCkKKwkJCQkqYnVmID0gJ3AnOworCQkJYnVmKys7CisJCX0KKwkJYnVmID0gbnVtYmVyKGJ1ZiwgZW5kLCBiZGV2LT5iZF9wYXJ0LT5wYXJ0bm8sIHNwZWMpOworCX0KKwlyZXR1cm4gYnVmOworfQorI2VuZGlmCisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKnN5bWJvbF9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHZvaWQgKnB0ciwKKwkJICAgIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLCBjb25zdCBjaGFyICpmbXQpCit7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKyNpZmRlZiBDT05GSUdfS0FMTFNZTVMKKwljaGFyIHN5bVtLU1lNX1NZTUJPTF9MRU5dOworI2VuZGlmCisKKwlpZiAoZm10WzFdID09ICdSJykKKwkJcHRyID0gX19idWlsdGluX2V4dHJhY3RfcmV0dXJuX2FkZHIocHRyKTsKKwl2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKXB0cjsKKworI2lmZGVmIENPTkZJR19LQUxMU1lNUworCWlmICgqZm10ID09ICdCJykKKwkJc3ByaW50X2JhY2t0cmFjZShzeW0sIHZhbHVlKTsKKwllbHNlIGlmICgqZm10ICE9ICdmJyAmJiAqZm10ICE9ICdzJykKKwkJc3ByaW50X3N5bWJvbChzeW0sIHZhbHVlKTsKKwllbHNlCisJCXNwcmludF9zeW1ib2xfbm9fb2Zmc2V0KHN5bSwgdmFsdWUpOworCisJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgc3ltLCBzcGVjKTsKKyNlbHNlCisJcmV0dXJuIHNwZWNpYWxfaGV4X251bWJlcihidWYsIGVuZCwgdmFsdWUsIHNpemVvZih2b2lkICopKTsKKyNlbmRpZgorfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpyZXNvdXJjZV9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCByZXNvdXJjZSAqcmVzLAorCQkgICAgICBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywgY29uc3QgY2hhciAqZm10KQoreworI2lmbmRlZiBJT19SU1JDX1BSSU5US19TSVpFCisjZGVmaW5lIElPX1JTUkNfUFJJTlRLX1NJWkUJNgorI2VuZGlmCisKKyNpZm5kZWYgTUVNX1JTUkNfUFJJTlRLX1NJWkUKKyNkZWZpbmUgTUVNX1JTUkNfUFJJTlRLX1NJWkUJMTAKKyNlbmRpZgorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJpbnRmX3NwZWMgaW9fc3BlYyA9IHsKKwkJLmJhc2UgPSAxNiwKKwkJLmZpZWxkX3dpZHRoID0gSU9fUlNSQ19QUklOVEtfU0laRSwKKwkJLnByZWNpc2lvbiA9IC0xLAorCQkuZmxhZ3MgPSBTUEVDSUFMIHwgU01BTEwgfCBaRVJPUEFELAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwcmludGZfc3BlYyBtZW1fc3BlYyA9IHsKKwkJLmJhc2UgPSAxNiwKKwkJLmZpZWxkX3dpZHRoID0gTUVNX1JTUkNfUFJJTlRLX1NJWkUsCisJCS5wcmVjaXNpb24gPSAtMSwKKwkJLmZsYWdzID0gU1BFQ0lBTCB8IFNNQUxMIHwgWkVST1BBRCwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJpbnRmX3NwZWMgYnVzX3NwZWMgPSB7CisJCS5iYXNlID0gMTYsCisJCS5maWVsZF93aWR0aCA9IDIsCisJCS5wcmVjaXNpb24gPSAtMSwKKwkJLmZsYWdzID0gU01BTEwgfCBaRVJPUEFELAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwcmludGZfc3BlYyBkZWNfc3BlYyA9IHsKKwkJLmJhc2UgPSAxMCwKKwkJLnByZWNpc2lvbiA9IC0xLAorCQkuZmxhZ3MgPSAwLAorCX07CisJc3RhdGljIGNvbnN0IHN0cnVjdCBwcmludGZfc3BlYyBzdHJfc3BlYyA9IHsKKwkJLmZpZWxkX3dpZHRoID0gLTEsCisJCS5wcmVjaXNpb24gPSAxMCwKKwkJLmZsYWdzID0gTEVGVCwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJpbnRmX3NwZWMgZmxhZ19zcGVjID0geworCQkuYmFzZSA9IDE2LAorCQkucHJlY2lzaW9uID0gLTEsCisJCS5mbGFncyA9IFNQRUNJQUwgfCBTTUFMTCwKKwl9OworCisJLyogMzItYml0IHJlcyAoc2l6ZW9mPT00KTogMTAgY2hhcnMgaW4gZGVjLCAxMCBpbiBoZXggKCIweCIgKyA4KQorCSAqIDY0LWJpdCByZXMgKHNpemVvZj09OCk6IDIwIGNoYXJzIGluIGRlYywgMTggaW4gaGV4ICgiMHgiICsgMTYpICovCisjZGVmaW5lIFJTUkNfQlVGX1NJWkUJCSgoMiAqIHNpemVvZihyZXNvdXJjZV9zaXplX3QpKSArIDQpCisjZGVmaW5lIEZMQUdfQlVGX1NJWkUJCSgyICogc2l6ZW9mKHJlcy0+ZmxhZ3MpKQorI2RlZmluZSBERUNPREVEX0JVRl9TSVpFCXNpemVvZigiW21lbSAtIDY0Yml0IHByZWYgd2luZG93IGRpc2FibGVkXSIpCisjZGVmaW5lIFJBV19CVUZfU0laRQkJc2l6ZW9mKCJbbWVtIC0gZmxhZ3MgMHhdIikKKwljaGFyIHN5bVttYXgoMipSU1JDX0JVRl9TSVpFICsgREVDT0RFRF9CVUZfU0laRSwKKwkJICAgICAyKlJTUkNfQlVGX1NJWkUgKyBGTEFHX0JVRl9TSVpFICsgUkFXX0JVRl9TSVpFKV07CisKKwljaGFyICpwID0gc3ltLCAqcGVuZCA9IHN5bSArIHNpemVvZihzeW0pOworCWludCBkZWNvZGUgPSAoZm10WzBdID09ICdSJykgPyAxIDogMDsKKwljb25zdCBzdHJ1Y3QgcHJpbnRmX3NwZWMgKnNwZWNwOworCisJKnArKyA9ICdbJzsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJcCA9IHN0cmluZyhwLCBwZW5kLCAiaW8gICIsIHN0cl9zcGVjKTsKKwkJc3BlY3AgPSAmaW9fc3BlYzsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICJtZW0gIiwgc3RyX3NwZWMpOworCQlzcGVjcCA9ICZtZW1fc3BlYzsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lSUSkgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICJpcnEgIiwgc3RyX3NwZWMpOworCQlzcGVjcCA9ICZkZWNfc3BlYzsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0RNQSkgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICJkbWEgIiwgc3RyX3NwZWMpOworCQlzcGVjcCA9ICZkZWNfc3BlYzsKKwl9IGVsc2UgaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JVUykgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICJidXMgIiwgc3RyX3NwZWMpOworCQlzcGVjcCA9ICZidXNfc3BlYzsKKwl9IGVsc2UgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICI/Pz8gIiwgc3RyX3NwZWMpOworCQlzcGVjcCA9ICZtZW1fc3BlYzsKKwkJZGVjb2RlID0gMDsKKwl9CisJaWYgKGRlY29kZSAmJiByZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9VTlNFVCkgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICJzaXplICIsIHN0cl9zcGVjKTsKKwkJcCA9IG51bWJlcihwLCBwZW5kLCByZXNvdXJjZV9zaXplKHJlcyksICpzcGVjcCk7CisJfSBlbHNlIHsKKwkJcCA9IG51bWJlcihwLCBwZW5kLCByZXMtPnN0YXJ0LCAqc3BlY3ApOworCQlpZiAocmVzLT5zdGFydCAhPSByZXMtPmVuZCkgeworCQkJKnArKyA9ICctJzsKKwkJCXAgPSBudW1iZXIocCwgcGVuZCwgcmVzLT5lbmQsICpzcGVjcCk7CisJCX0KKwl9CisJaWYgKGRlY29kZSkgeworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KQorCQkJcCA9IHN0cmluZyhwLCBwZW5kLCAiIDY0Yml0Iiwgc3RyX3NwZWMpOworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfUFJFRkVUQ0gpCisJCQlwID0gc3RyaW5nKHAsIHBlbmQsICIgcHJlZiIsIHN0cl9zcGVjKTsKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX1dJTkRPVykKKwkJCXAgPSBzdHJpbmcocCwgcGVuZCwgIiB3aW5kb3ciLCBzdHJfc3BlYyk7CisJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9ESVNBQkxFRCkKKwkJCXAgPSBzdHJpbmcocCwgcGVuZCwgIiBkaXNhYmxlZCIsIHN0cl9zcGVjKTsKKwl9IGVsc2UgeworCQlwID0gc3RyaW5nKHAsIHBlbmQsICIgZmxhZ3MgIiwgc3RyX3NwZWMpOworCQlwID0gbnVtYmVyKHAsIHBlbmQsIHJlcy0+ZmxhZ3MsIGZsYWdfc3BlYyk7CisJfQorCSpwKysgPSAnXSc7CisJKnAgPSAnXDAnOworCisJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgc3ltLCBzcGVjKTsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqaGV4X3N0cmluZyhjaGFyICpidWYsIGNoYXIgKmVuZCwgdTggKmFkZHIsIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLAorCQkgY29uc3QgY2hhciAqZm10KQoreworCWludCBpLCBsZW4gPSAxOwkJLyogaWYgd2UgcGFzcyAnJXBoW0NETl0nLCBmaWVsZCB3aWR0aCByZW1haW5zCisJCQkJICAgbmVnYXRpdmUgdmFsdWUsIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0ICovCisJY2hhciBzZXBhcmF0b3I7CisKKwlpZiAoc3BlYy5maWVsZF93aWR0aCA9PSAwKQorCQkvKiBub3RoaW5nIHRvIHByaW50ICovCisJCXJldHVybiBidWY7CisKKwlpZiAoWkVST19PUl9OVUxMX1BUUihhZGRyKSkKKwkJLyogTlVMTCBwb2ludGVyICovCisJCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIE5VTEwsIHNwZWMpOworCisJc3dpdGNoIChmbXRbMV0pIHsKKwljYXNlICdDJzoKKwkJc2VwYXJhdG9yID0gJzonOworCQlicmVhazsKKwljYXNlICdEJzoKKwkJc2VwYXJhdG9yID0gJy0nOworCQlicmVhazsKKwljYXNlICdOJzoKKwkJc2VwYXJhdG9yID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2VwYXJhdG9yID0gJyAnOworCQlicmVhazsKKwl9CisKKwlpZiAoc3BlYy5maWVsZF93aWR0aCA+IDApCisJCWxlbiA9IG1pbl90KGludCwgc3BlYy5maWVsZF93aWR0aCwgNjQpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCWlmIChidWYgPCBlbmQpCisJCQkqYnVmID0gaGV4X2FzY19oaShhZGRyW2ldKTsKKwkJKytidWY7CisJCWlmIChidWYgPCBlbmQpCisJCQkqYnVmID0gaGV4X2FzY19sbyhhZGRyW2ldKTsKKwkJKytidWY7CisKKwkJaWYgKHNlcGFyYXRvciAmJiBpICE9IGxlbiAtIDEpIHsKKwkJCWlmIChidWYgPCBlbmQpCisJCQkJKmJ1ZiA9IHNlcGFyYXRvcjsKKwkJCSsrYnVmOworCQl9CisJfQorCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqYml0bWFwX3N0cmluZyhjaGFyICpidWYsIGNoYXIgKmVuZCwgdW5zaWduZWQgbG9uZyAqYml0bWFwLAorCQkgICAgc3RydWN0IHByaW50Zl9zcGVjIHNwZWMsIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwljb25zdCBpbnQgQ0hVTktTWiA9IDMyOworCWludCBucl9iaXRzID0gbWF4X3QoaW50LCBzcGVjLmZpZWxkX3dpZHRoLCAwKTsKKwlpbnQgaSwgY2h1bmtzejsKKwlib29sIGZpcnN0ID0gdHJ1ZTsKKworCS8qIHJldXNlZCB0byBwcmludCBudW1iZXJzICovCisJc3BlYyA9IChzdHJ1Y3QgcHJpbnRmX3NwZWMpeyAuZmxhZ3MgPSBTTUFMTCB8IFpFUk9QQUQsIC5iYXNlID0gMTYgfTsKKworCWNodW5rc3ogPSBucl9iaXRzICYgKENIVU5LU1ogLSAxKTsKKwlpZiAoY2h1bmtzeiA9PSAwKQorCQljaHVua3N6ID0gQ0hVTktTWjsKKworCWkgPSBBTElHTihucl9iaXRzLCBDSFVOS1NaKSAtIENIVU5LU1o7CisJZm9yICg7IGkgPj0gMDsgaSAtPSBDSFVOS1NaKSB7CisJCXUzMiBjaHVua21hc2ssIHZhbDsKKwkJaW50IHdvcmQsIGJpdDsKKworCQljaHVua21hc2sgPSAoKDFVTEwgPDwgY2h1bmtzeikgLSAxKTsKKwkJd29yZCA9IGkgLyBCSVRTX1BFUl9MT05HOworCQliaXQgPSBpICUgQklUU19QRVJfTE9ORzsKKwkJdmFsID0gKGJpdG1hcFt3b3JkXSA+PiBiaXQpICYgY2h1bmttYXNrOworCisJCWlmICghZmlyc3QpIHsKKwkJCWlmIChidWYgPCBlbmQpCisJCQkJKmJ1ZiA9ICcsJzsKKwkJCWJ1ZisrOworCQl9CisJCWZpcnN0ID0gZmFsc2U7CisKKwkJc3BlYy5maWVsZF93aWR0aCA9IERJVl9ST1VORF9VUChjaHVua3N6LCA0KTsKKwkJYnVmID0gbnVtYmVyKGJ1ZiwgZW5kLCB2YWwsIHNwZWMpOworCisJCWNodW5rc3ogPSBDSFVOS1NaOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpiaXRtYXBfbGlzdF9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgKmJpdG1hcCwKKwkJCSBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywgY29uc3QgY2hhciAqZm10KQoreworCWludCBucl9iaXRzID0gbWF4X3QoaW50LCBzcGVjLmZpZWxkX3dpZHRoLCAwKTsKKwkvKiBjdXJyZW50IGJpdCBpcyAnY3VyJywgbW9zdCByZWNlbnRseSBzZWVuIHJhbmdlIGlzIFtyYm90LCBydG9wXSAqLworCWludCBjdXIsIHJib3QsIHJ0b3A7CisJYm9vbCBmaXJzdCA9IHRydWU7CisKKwkvKiByZXVzZWQgdG8gcHJpbnQgbnVtYmVycyAqLworCXNwZWMgPSAoc3RydWN0IHByaW50Zl9zcGVjKXsgLmJhc2UgPSAxMCB9OworCisJcmJvdCA9IGN1ciA9IGZpbmRfZmlyc3RfYml0KGJpdG1hcCwgbnJfYml0cyk7CisJd2hpbGUgKGN1ciA8IG5yX2JpdHMpIHsKKwkJcnRvcCA9IGN1cjsKKwkJY3VyID0gZmluZF9uZXh0X2JpdChiaXRtYXAsIG5yX2JpdHMsIGN1ciArIDEpOworCQlpZiAoY3VyIDwgbnJfYml0cyAmJiBjdXIgPD0gcnRvcCArIDEpCisJCQljb250aW51ZTsKKworCQlpZiAoIWZpcnN0KSB7CisJCQlpZiAoYnVmIDwgZW5kKQorCQkJCSpidWYgPSAnLCc7CisJCQlidWYrKzsKKwkJfQorCQlmaXJzdCA9IGZhbHNlOworCisJCWJ1ZiA9IG51bWJlcihidWYsIGVuZCwgcmJvdCwgc3BlYyk7CisJCWlmIChyYm90IDwgcnRvcCkgeworCQkJaWYgKGJ1ZiA8IGVuZCkKKwkJCQkqYnVmID0gJy0nOworCQkJYnVmKys7CisKKwkJCWJ1ZiA9IG51bWJlcihidWYsIGVuZCwgcnRvcCwgc3BlYyk7CisJCX0KKworCQlyYm90ID0gY3VyOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICptYWNfYWRkcmVzc19zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHU4ICphZGRyLAorCQkJIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLCBjb25zdCBjaGFyICpmbXQpCit7CisJY2hhciBtYWNfYWRkcltzaXplb2YoInh4Onh4Onh4Onh4Onh4Onh4IildOworCWNoYXIgKnAgPSBtYWNfYWRkcjsKKwlpbnQgaTsKKwljaGFyIHNlcGFyYXRvcjsKKwlib29sIHJldmVyc2VkID0gZmFsc2U7CisKKwlzd2l0Y2ggKGZtdFsxXSkgeworCWNhc2UgJ0YnOgorCQlzZXBhcmF0b3IgPSAnLSc7CisJCWJyZWFrOworCisJY2FzZSAnUic6CisJCXJldmVyc2VkID0gdHJ1ZTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwlkZWZhdWx0OgorCQlzZXBhcmF0b3IgPSAnOic7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJcCA9IGhleF9ieXRlX3BhY2socCwgYWRkcls1IC0gaV0pOworCQllbHNlCisJCQlwID0gaGV4X2J5dGVfcGFjayhwLCBhZGRyW2ldKTsKKworCQlpZiAoZm10WzBdID09ICdNJyAmJiBpICE9IDUpCisJCQkqcCsrID0gc2VwYXJhdG9yOworCX0KKwkqcCA9ICdcMCc7CisKKwlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCBtYWNfYWRkciwgc3BlYyk7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKmlwNF9zdHJpbmcoY2hhciAqcCwgY29uc3QgdTggKmFkZHIsIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwlpbnQgaTsKKwlib29sIGxlYWRpbmdfemVyb3MgPSAoZm10WzBdID09ICdpJyk7CisJaW50IGluZGV4OworCWludCBzdGVwOworCisJc3dpdGNoIChmbXRbMl0pIHsKKwljYXNlICdoJzoKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJaW5kZXggPSAwOworCQlzdGVwID0gMTsKKyNlbHNlCisJCWluZGV4ID0gMzsKKwkJc3RlcCA9IC0xOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgJ2wnOgorCQlpbmRleCA9IDM7CisJCXN0ZXAgPSAtMTsKKwkJYnJlYWs7CisJY2FzZSAnbic6CisJY2FzZSAnYic6CisJZGVmYXVsdDoKKwkJaW5kZXggPSAwOworCQlzdGVwID0gMTsKKwkJYnJlYWs7CisJfQorCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJY2hhciB0ZW1wWzRdIF9fYWxpZ25lZCgyKTsJLyogaG9sZCBlYWNoIElQIHF1YWQgaW4gcmV2ZXJzZSBvcmRlciAqLworCQlpbnQgZGlnaXRzID0gcHV0X2RlY190cnVuYzgodGVtcCwgYWRkcltpbmRleF0pIC0gdGVtcDsKKwkJaWYgKGxlYWRpbmdfemVyb3MpIHsKKwkJCWlmIChkaWdpdHMgPCAzKQorCQkJCSpwKysgPSAnMCc7CisJCQlpZiAoZGlnaXRzIDwgMikKKwkJCQkqcCsrID0gJzAnOworCQl9CisJCS8qIHJldmVyc2UgdGhlIGRpZ2l0cyBpbiB0aGUgcXVhZCAqLworCQl3aGlsZSAoZGlnaXRzLS0pCisJCQkqcCsrID0gdGVtcFtkaWdpdHNdOworCQlpZiAoaSA8IDMpCisJCQkqcCsrID0gJy4nOworCQlpbmRleCArPSBzdGVwOworCX0KKwkqcCA9ICdcMCc7CisKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqaXA2X2NvbXByZXNzZWRfc3RyaW5nKGNoYXIgKnAsIGNvbnN0IGNoYXIgKmFkZHIpCit7CisJaW50IGksIGosIHJhbmdlOworCXVuc2lnbmVkIGNoYXIgemVyb2xlbmd0aFs4XTsKKwlpbnQgbG9uZ2VzdCA9IDE7CisJaW50IGNvbG9ucG9zID0gLTE7CisJdTE2IHdvcmQ7CisJdTggaGksIGxvOworCWJvb2wgbmVlZGNvbG9uID0gZmFsc2U7CisJYm9vbCB1c2VJUHY0OworCXN0cnVjdCBpbjZfYWRkciBpbjY7CisKKwltZW1jcHkoJmluNiwgYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCisJdXNlSVB2NCA9IGlwdjZfYWRkcl92NG1hcHBlZCgmaW42KSB8fCBpcHY2X2FkZHJfaXNfaXNhdGFwKCZpbjYpOworCisJbWVtc2V0KHplcm9sZW5ndGgsIDAsIHNpemVvZih6ZXJvbGVuZ3RoKSk7CisKKwlpZiAodXNlSVB2NCkKKwkJcmFuZ2UgPSA2OworCWVsc2UKKwkJcmFuZ2UgPSA4OworCisJLyogZmluZCBwb3NpdGlvbiBvZiBsb25nZXN0IDAgcnVuICovCisJZm9yIChpID0gMDsgaSA8IHJhbmdlOyBpKyspIHsKKwkJZm9yIChqID0gaTsgaiA8IHJhbmdlOyBqKyspIHsKKwkJCWlmIChpbjYuczZfYWRkcjE2W2pdICE9IDApCisJCQkJYnJlYWs7CisJCQl6ZXJvbGVuZ3RoW2ldKys7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IHJhbmdlOyBpKyspIHsKKwkJaWYgKHplcm9sZW5ndGhbaV0gPiBsb25nZXN0KSB7CisJCQlsb25nZXN0ID0gemVyb2xlbmd0aFtpXTsKKwkJCWNvbG9ucG9zID0gaTsKKwkJfQorCX0KKwlpZiAobG9uZ2VzdCA9PSAxKQkJLyogZG9uJ3QgY29tcHJlc3MgYSBzaW5nbGUgMCAqLworCQljb2xvbnBvcyA9IC0xOworCisJLyogZW1pdCBhZGRyZXNzICovCisJZm9yIChpID0gMDsgaSA8IHJhbmdlOyBpKyspIHsKKwkJaWYgKGkgPT0gY29sb25wb3MpIHsKKwkJCWlmIChuZWVkY29sb24gfHwgaSA9PSAwKQorCQkJCSpwKysgPSAnOic7CisJCQkqcCsrID0gJzonOworCQkJbmVlZGNvbG9uID0gZmFsc2U7CisJCQlpICs9IGxvbmdlc3QgLSAxOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKG5lZWRjb2xvbikgeworCQkJKnArKyA9ICc6JzsKKwkJCW5lZWRjb2xvbiA9IGZhbHNlOworCQl9CisJCS8qIGhleCB1MTYgd2l0aG91dCBsZWFkaW5nIDBzICovCisJCXdvcmQgPSBudG9ocyhpbjYuczZfYWRkcjE2W2ldKTsKKwkJaGkgPSB3b3JkID4+IDg7CisJCWxvID0gd29yZCAmIDB4ZmY7CisJCWlmIChoaSkgeworCQkJaWYgKGhpID4gMHgwZikKKwkJCQlwID0gaGV4X2J5dGVfcGFjayhwLCBoaSk7CisJCQllbHNlCisJCQkJKnArKyA9IGhleF9hc2NfbG8oaGkpOworCQkJcCA9IGhleF9ieXRlX3BhY2socCwgbG8pOworCQl9CisJCWVsc2UgaWYgKGxvID4gMHgwZikKKwkJCXAgPSBoZXhfYnl0ZV9wYWNrKHAsIGxvKTsKKwkJZWxzZQorCQkJKnArKyA9IGhleF9hc2NfbG8obG8pOworCQluZWVkY29sb24gPSB0cnVlOworCX0KKworCWlmICh1c2VJUHY0KSB7CisJCWlmIChuZWVkY29sb24pCisJCQkqcCsrID0gJzonOworCQlwID0gaXA0X3N0cmluZyhwLCAmaW42LnM2X2FkZHJbMTJdLCAiSTQiKTsKKwl9CisJKnAgPSAnXDAnOworCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKmlwNl9zdHJpbmcoY2hhciAqcCwgY29uc3QgY2hhciAqYWRkciwgY29uc3QgY2hhciAqZm10KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQlwID0gaGV4X2J5dGVfcGFjayhwLCAqYWRkcisrKTsKKwkJcCA9IGhleF9ieXRlX3BhY2socCwgKmFkZHIrKyk7CisJCWlmIChmbXRbMF0gPT0gJ0knICYmIGkgIT0gNykKKwkJCSpwKysgPSAnOic7CisJfQorCSpwID0gJ1wwJzsKKworCXJldHVybiBwOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICppcDZfYWRkcl9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IHU4ICphZGRyLAorCQkgICAgICBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywgY29uc3QgY2hhciAqZm10KQoreworCWNoYXIgaXA2X2FkZHJbc2l6ZW9mKCJ4eHh4Onh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDoyNTUuMjU1LjI1NS4yNTUiKV07CisKKwlpZiAoZm10WzBdID09ICdJJyAmJiBmbXRbMl0gPT0gJ2MnKQorCQlpcDZfY29tcHJlc3NlZF9zdHJpbmcoaXA2X2FkZHIsIGFkZHIpOworCWVsc2UKKwkJaXA2X3N0cmluZyhpcDZfYWRkciwgYWRkciwgZm10KTsKKworCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIGlwNl9hZGRyLCBzcGVjKTsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqaXA0X2FkZHJfc3RyaW5nKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCB1OCAqYWRkciwKKwkJICAgICAgc3RydWN0IHByaW50Zl9zcGVjIHNwZWMsIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwljaGFyIGlwNF9hZGRyW3NpemVvZigiMjU1LjI1NS4yNTUuMjU1IildOworCisJaXA0X3N0cmluZyhpcDRfYWRkciwgYWRkciwgZm10KTsKKworCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIGlwNF9hZGRyLCBzcGVjKTsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqaXA2X2FkZHJfc3RyaW5nX3NhKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzYSwKKwkJCSBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywgY29uc3QgY2hhciAqZm10KQoreworCWJvb2wgaGF2ZV9wID0gZmFsc2UsIGhhdmVfcyA9IGZhbHNlLCBoYXZlX2YgPSBmYWxzZSwgaGF2ZV9jID0gZmFsc2U7CisJY2hhciBpcDZfYWRkcltzaXplb2YoIlt4eHh4Onh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDoyNTUuMjU1LjI1NS4yNTVdIikgKworCQkgICAgICBzaXplb2YoIjoxMjM0NSIpICsgc2l6ZW9mKCIvMTIzNDU2Nzg5IikgKworCQkgICAgICBzaXplb2YoIiUxMjM0NTY3ODkwIildOworCWNoYXIgKnAgPSBpcDZfYWRkciwgKnBlbmQgPSBpcDZfYWRkciArIHNpemVvZihpcDZfYWRkcik7CisJY29uc3QgdTggKmFkZHIgPSAoY29uc3QgdTggKikgJnNhLT5zaW42X2FkZHI7CisJY2hhciBmbXQ2WzJdID0geyBmbXRbMF0sICc2JyB9OworCXU4IG9mZiA9IDA7CisKKwlmbXQrKzsKKwl3aGlsZSAoaXNhbHBoYSgqKytmbXQpKSB7CisJCXN3aXRjaCAoKmZtdCkgeworCQljYXNlICdwJzoKKwkJCWhhdmVfcCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnZic6CisJCQloYXZlX2YgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaGF2ZV9zID0gdHJ1ZTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWhhdmVfYyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChoYXZlX3AgfHwgaGF2ZV9zIHx8IGhhdmVfZikgeworCQkqcCA9ICdbJzsKKwkJb2ZmID0gMTsKKwl9CisKKwlpZiAoZm10NlswXSA9PSAnSScgJiYgaGF2ZV9jKQorCQlwID0gaXA2X2NvbXByZXNzZWRfc3RyaW5nKGlwNl9hZGRyICsgb2ZmLCBhZGRyKTsKKwllbHNlCisJCXAgPSBpcDZfc3RyaW5nKGlwNl9hZGRyICsgb2ZmLCBhZGRyLCBmbXQ2KTsKKworCWlmIChoYXZlX3AgfHwgaGF2ZV9zIHx8IGhhdmVfZikKKwkJKnArKyA9ICddJzsKKworCWlmIChoYXZlX3ApIHsKKwkJKnArKyA9ICc6JzsKKwkJcCA9IG51bWJlcihwLCBwZW5kLCBudG9ocyhzYS0+c2luNl9wb3J0KSwgc3BlYyk7CisJfQorCWlmIChoYXZlX2YpIHsKKwkJKnArKyA9ICcvJzsKKwkJcCA9IG51bWJlcihwLCBwZW5kLCBudG9obChzYS0+c2luNl9mbG93aW5mbyAmCisJCQkJCSAgSVBWNl9GTE9XSU5GT19NQVNLKSwgc3BlYyk7CisJfQorCWlmIChoYXZlX3MpIHsKKwkJKnArKyA9ICclJzsKKwkJcCA9IG51bWJlcihwLCBwZW5kLCBzYS0+c2luNl9zY29wZV9pZCwgc3BlYyk7CisJfQorCSpwID0gJ1wwJzsKKworCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIGlwNl9hZGRyLCBzcGVjKTsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqaXA0X2FkZHJfc3RyaW5nX3NhKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhLAorCQkJIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLCBjb25zdCBjaGFyICpmbXQpCit7CisJYm9vbCBoYXZlX3AgPSBmYWxzZTsKKwljaGFyICpwLCBpcDRfYWRkcltzaXplb2YoIjI1NS4yNTUuMjU1LjI1NSIpICsgc2l6ZW9mKCI6MTIzNDUiKV07CisJY2hhciAqcGVuZCA9IGlwNF9hZGRyICsgc2l6ZW9mKGlwNF9hZGRyKTsKKwljb25zdCB1OCAqYWRkciA9IChjb25zdCB1OCAqKSAmc2EtPnNpbl9hZGRyLnNfYWRkcjsKKwljaGFyIGZtdDRbM10gPSB7IGZtdFswXSwgJzQnLCAwIH07CisKKwlmbXQrKzsKKwl3aGlsZSAoaXNhbHBoYSgqKytmbXQpKSB7CisJCXN3aXRjaCAoKmZtdCkgeworCQljYXNlICdwJzoKKwkJCWhhdmVfcCA9IHRydWU7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJ2wnOgorCQljYXNlICduJzoKKwkJY2FzZSAnYic6CisJCQlmbXQ0WzJdID0gKmZtdDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcCA9IGlwNF9zdHJpbmcoaXA0X2FkZHIsIGFkZHIsIGZtdDQpOworCWlmIChoYXZlX3ApIHsKKwkJKnArKyA9ICc6JzsKKwkJcCA9IG51bWJlcihwLCBwZW5kLCBudG9ocyhzYS0+c2luX3BvcnQpLCBzcGVjKTsKKwl9CisJKnAgPSAnXDAnOworCisJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgaXA0X2FkZHIsIHNwZWMpOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICplc2NhcGVkX3N0cmluZyhjaGFyICpidWYsIGNoYXIgKmVuZCwgdTggKmFkZHIsIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLAorCQkgICAgIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwlib29sIGZvdW5kID0gdHJ1ZTsKKwlpbnQgY291bnQgPSAxOworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CisJaW50IGxlbjsKKworCWlmIChzcGVjLmZpZWxkX3dpZHRoID09IDApCisJCXJldHVybiBidWY7CQkJCS8qIG5vdGhpbmcgdG8gcHJpbnQgKi8KKworCWlmIChaRVJPX09SX05VTExfUFRSKGFkZHIpKQorCQlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCBOVUxMLCBzcGVjKTsJLyogTlVMTCBwb2ludGVyICovCisKKworCWRvIHsKKwkJc3dpdGNoIChmbXRbY291bnQrK10pIHsKKwkJY2FzZSAnYSc6CisJCQlmbGFncyB8PSBFU0NBUEVfQU5ZOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJZmxhZ3MgfD0gRVNDQVBFX1NQRUNJQUw7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlmbGFncyB8PSBFU0NBUEVfSEVYOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJZmxhZ3MgfD0gRVNDQVBFX05VTEw7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlmbGFncyB8PSBFU0NBUEVfT0NUQUw7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlmbGFncyB8PSBFU0NBUEVfTlA7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlmbGFncyB8PSBFU0NBUEVfU1BBQ0U7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZvdW5kID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGZvdW5kKTsKKworCWlmICghZmxhZ3MpCisJCWZsYWdzID0gRVNDQVBFX0FOWV9OUDsKKworCWxlbiA9IHNwZWMuZmllbGRfd2lkdGggPCAwID8gMSA6IHNwZWMuZmllbGRfd2lkdGg7CisKKwkvKgorCSAqIHN0cmluZ19lc2NhcGVfbWVtKCkgd3JpdGVzIGFzIG1hbnkgY2hhcmFjdGVycyBhcyBpdCBjYW4gdG8KKwkgKiB0aGUgZ2l2ZW4gYnVmZmVyLCBhbmQgcmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgb3V0cHV0CisJICogaGFkIHRoZSBidWZmZXIgYmVlbiBiaWcgZW5vdWdoLgorCSAqLworCWJ1ZiArPSBzdHJpbmdfZXNjYXBlX21lbShhZGRyLCBsZW4sIGJ1ZiwgYnVmIDwgZW5kID8gZW5kIC0gYnVmIDogMCwgZmxhZ3MsIE5VTEwpOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqdXVpZF9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IHU4ICphZGRyLAorCQkgIHN0cnVjdCBwcmludGZfc3BlYyBzcGVjLCBjb25zdCBjaGFyICpmbXQpCit7CisJY2hhciB1dWlkW1VVSURfU1RSSU5HX0xFTiArIDFdOworCWNoYXIgKnAgPSB1dWlkOworCWludCBpOworCWNvbnN0IHU4ICppbmRleCA9IHV1aWRfaW5kZXg7CisJYm9vbCB1YyA9IGZhbHNlOworCisJc3dpdGNoICgqKCsrZm10KSkgeworCWNhc2UgJ0wnOgorCQl1YyA9IHRydWU7CQkvKiBmYWxsLXRocm91Z2ggKi8KKwljYXNlICdsJzoKKwkJaW5kZXggPSBndWlkX2luZGV4OworCQlicmVhazsKKwljYXNlICdCJzoKKwkJdWMgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlpZiAodWMpCisJCQlwID0gaGV4X2J5dGVfcGFja191cHBlcihwLCBhZGRyW2luZGV4W2ldXSk7CisJCWVsc2UKKwkJCXAgPSBoZXhfYnl0ZV9wYWNrKHAsIGFkZHJbaW5kZXhbaV1dKTsKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMzoKKwkJY2FzZSA1OgorCQljYXNlIDc6CisJCWNhc2UgOToKKwkJCSpwKysgPSAnLSc7CisJCQlicmVhazsKKwkJfQorCX0KKworCSpwID0gMDsKKworCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIHV1aWQsIHNwZWMpOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpuZXRkZXZfYml0cyhjaGFyICpidWYsIGNoYXIgKmVuZCwgY29uc3Qgdm9pZCAqYWRkciwgY29uc3QgY2hhciAqZm10KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBudW07CisJaW50IHNpemU7CisKKwlzd2l0Y2ggKGZtdFsxXSkgeworCWNhc2UgJ0YnOgorCQludW0gPSAqKGNvbnN0IG5ldGRldl9mZWF0dXJlc190ICopYWRkcjsKKwkJc2l6ZSA9IHNpemVvZihuZXRkZXZfZmVhdHVyZXNfdCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW51bSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJCXNpemUgPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiBzcGVjaWFsX2hleF9udW1iZXIoYnVmLCBlbmQsIG51bSwgc2l6ZSk7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKmFkZHJlc3NfdmFsKGNoYXIgKmJ1ZiwgY2hhciAqZW5kLCBjb25zdCB2b2lkICphZGRyLCBjb25zdCBjaGFyICpmbXQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG51bTsKKwlpbnQgc2l6ZTsKKworCXN3aXRjaCAoZm10WzFdKSB7CisJY2FzZSAnZCc6CisJCW51bSA9ICooY29uc3QgZG1hX2FkZHJfdCAqKWFkZHI7CisJCXNpemUgPSBzaXplb2YoZG1hX2FkZHJfdCk7CisJCWJyZWFrOworCWNhc2UgJ3AnOgorCWRlZmF1bHQ6CisJCW51bSA9ICooY29uc3QgcGh5c19hZGRyX3QgKilhZGRyOworCQlzaXplID0gc2l6ZW9mKHBoeXNfYWRkcl90KTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHNwZWNpYWxfaGV4X251bWJlcihidWYsIGVuZCwgbnVtLCBzaXplKTsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqY2xvY2soY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBjbGsgKmNsaywgc3RydWN0IHByaW50Zl9zcGVjIHNwZWMsCisJICAgIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX0hBVkVfQ0xLKSB8fCAhY2xrKQorCQlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCBOVUxMLCBzcGVjKTsKKworCXN3aXRjaCAoZm10WzFdKSB7CisJY2FzZSAnbic6CisJZGVmYXVsdDoKKyNpZmRlZiBDT05GSUdfQ09NTU9OX0NMSworCQlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCBfX2Nsa19nZXRfbmFtZShjbGspLCBzcGVjKTsKKyNlbHNlCisJCXJldHVybiBzcGVjaWFsX2hleF9udW1iZXIoYnVmLCBlbmQsICh1bnNpZ25lZCBsb25nKWNsaywgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljCitjaGFyICpmb3JtYXRfZmxhZ3MoY2hhciAqYnVmLCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCisJCQkJCWNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyAqbmFtZXMpCit7CisJdW5zaWduZWQgbG9uZyBtYXNrOworCWNvbnN0IHN0cnVjdCBwcmludGZfc3BlYyBzdHJzcGVjID0geworCQkuZmllbGRfd2lkdGggPSAtMSwKKwkJLnByZWNpc2lvbiA9IC0xLAorCX07CisJY29uc3Qgc3RydWN0IHByaW50Zl9zcGVjIG51bXNwZWMgPSB7CisJCS5mbGFncyA9IFNQRUNJQUx8U01BTEwsCisJCS5maWVsZF93aWR0aCA9IC0xLAorCQkucHJlY2lzaW9uID0gLTEsCisJCS5iYXNlID0gMTYsCisJfTsKKworCWZvciAoIDsgZmxhZ3MgJiYgbmFtZXMtPm5hbWU7IG5hbWVzKyspIHsKKwkJbWFzayA9IG5hbWVzLT5tYXNrOworCQlpZiAoKGZsYWdzICYgbWFzaykgIT0gbWFzaykKKwkJCWNvbnRpbnVlOworCisJCWJ1ZiA9IHN0cmluZyhidWYsIGVuZCwgbmFtZXMtPm5hbWUsIHN0cnNwZWMpOworCisJCWZsYWdzICY9IH5tYXNrOworCQlpZiAoZmxhZ3MpIHsKKwkJCWlmIChidWYgPCBlbmQpCisJCQkJKmJ1ZiA9ICd8JzsKKwkJCWJ1ZisrOworCQl9CisJfQorCisJaWYgKGZsYWdzKQorCQlidWYgPSBudW1iZXIoYnVmLCBlbmQsIGZsYWdzLCBudW1zcGVjKTsKKworCXJldHVybiBidWY7Cit9CisKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2NoYXIgKmZsYWdzX3N0cmluZyhjaGFyICpidWYsIGNoYXIgKmVuZCwgdm9pZCAqZmxhZ3NfcHRyLCBjb25zdCBjaGFyICpmbXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljb25zdCBzdHJ1Y3QgdHJhY2VfcHJpbnRfZmxhZ3MgKm5hbWVzOworCisJc3dpdGNoIChmbXRbMV0pIHsKKwljYXNlICdwJzoKKwkJZmxhZ3MgPSAqKHVuc2lnbmVkIGxvbmcgKilmbGFnc19wdHI7CisJCS8qIFJlbW92ZSB6b25lIGlkICovCisJCWZsYWdzICY9ICgxVUwgPDwgTlJfUEFHRUZMQUdTKSAtIDE7CisJCW5hbWVzID0gcGFnZWZsYWdfbmFtZXM7CisJCWJyZWFrOworCWNhc2UgJ3YnOgorCQlmbGFncyA9ICoodW5zaWduZWQgbG9uZyAqKWZsYWdzX3B0cjsKKwkJbmFtZXMgPSB2bWFmbGFnX25hbWVzOworCQlicmVhazsKKwljYXNlICdnJzoKKwkJZmxhZ3MgPSAqKGdmcF90ICopZmxhZ3NfcHRyOworCQluYW1lcyA9IGdmcGZsYWdfbmFtZXM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT05DRSgxLCAiVW5zdXBwb3J0ZWQgZmxhZ3MgbW9kaWZpZXI6ICVjXG4iLCBmbXRbMV0pOworCQlyZXR1cm4gYnVmOworCX0KKworCXJldHVybiBmb3JtYXRfZmxhZ3MoYnVmLCBlbmQsIGZsYWdzLCBuYW1lcyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpkZXZpY2Vfbm9kZV9uYW1lX2Zvcl9kZXB0aChjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBpbnQgZGVwdGgpCit7CisJZm9yICggOyBucCAmJiBkZXB0aDsgZGVwdGgtLSkKKwkJbnAgPSBucC0+cGFyZW50OworCisJcmV0dXJuIGtiYXNlbmFtZShucC0+ZnVsbF9uYW1lKTsKK30KKworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjaworY2hhciAqZGV2aWNlX25vZGVfZ2VuX2Z1bGxfbmFtZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjaGFyICpidWYsIGNoYXIgKmVuZCkKK3sKKwlpbnQgZGVwdGg7CisJY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnQgPSBucC0+cGFyZW50OworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3Ryc3BlYyA9IHsKKwkJLmZpZWxkX3dpZHRoID0gLTEsCisJCS5wcmVjaXNpb24gPSAtMSwKKwl9OworCisJLyogc3BlY2lhbCBjYXNlIGZvciByb290IG5vZGUgKi8KKwlpZiAoIXBhcmVudCkKKwkJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgIi8iLCBzdHJzcGVjKTsKKworCWZvciAoZGVwdGggPSAwOyBwYXJlbnQtPnBhcmVudDsgZGVwdGgrKykKKwkJcGFyZW50ID0gcGFyZW50LT5wYXJlbnQ7CisKKwlmb3IgKCA7IGRlcHRoID49IDA7IGRlcHRoLS0pIHsKKwkJYnVmID0gc3RyaW5nKGJ1ZiwgZW5kLCAiLyIsIHN0cnNwZWMpOworCQlidWYgPSBzdHJpbmcoYnVmLCBlbmQsIGRldmljZV9ub2RlX25hbWVfZm9yX2RlcHRoKG5wLCBkZXB0aCksCisJCQkgICAgIHN0cnNwZWMpOworCX0KKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpkZXZpY2Vfbm9kZV9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqZG4sCisJCQkgc3RydWN0IHByaW50Zl9zcGVjIHNwZWMsIGNvbnN0IGNoYXIgKmZtdCkKK3sKKwljaGFyIHRidWZbc2l6ZW9mKCJ4eHh4IikgKyAxXTsKKwljb25zdCBjaGFyICpwOworCWludCByZXQ7CisJY2hhciAqYnVmX3N0YXJ0ID0gYnVmOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlib29sIGhhc19tdWx0LCBwYXNzOworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHJpbnRmX3NwZWMgbnVtX3NwZWMgPSB7CisJCS5mbGFncyA9IFNNQUxMLAorCQkuZmllbGRfd2lkdGggPSAtMSwKKwkJLnByZWNpc2lvbiA9IC0xLAorCQkuYmFzZSA9IDEwLAorCX07CisKKwlzdHJ1Y3QgcHJpbnRmX3NwZWMgc3RyX3NwZWMgPSBzcGVjOworCXN0cl9zcGVjLmZpZWxkX3dpZHRoID0gLTE7CisKKwlpZiAoIUlTX0VOQUJMRUQoQ09ORklHX09GKSkKKwkJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgIighT0YpIiwgc3BlYyk7CisKKwlpZiAoKHVuc2lnbmVkIGxvbmcpZG4gPCBQQUdFX1NJWkUpCisJCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsICIobnVsbCkiLCBzcGVjKTsKKworCS8qIHNpbXBsZSBjYXNlIHdpdGhvdXQgYW55dGhpbmcgYW55IG1vcmUgZm9ybWF0IHNwZWNpZmllcnMgKi8KKwlmbXQrKzsKKwlpZiAoZm10WzBdID09ICdcMCcgfHwgc3RyY3NwbihmbXQsImZucFBGY0MiKSA+IDApCisJCWZtdCA9ICJmIjsKKworCWZvciAocGFzcyA9IGZhbHNlOyBzdHJzcG4oZm10LCJmbnBQRmNDIik7IGZtdCsrLCBwYXNzID0gdHJ1ZSkgeworCQlpZiAocGFzcykgeworCQkJaWYgKGJ1ZiA8IGVuZCkKKwkJCQkqYnVmID0gJzonOworCQkJYnVmKys7CisJCX0KKworCQlzd2l0Y2ggKCpmbXQpIHsKKwkJY2FzZSAnZic6CS8qIGZ1bGxfbmFtZSAqLworCQkJYnVmID0gZGV2aWNlX25vZGVfZ2VuX2Z1bGxfbmFtZShkbiwgYnVmLCBlbmQpOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgkvKiBuYW1lICovCisJCQlidWYgPSBzdHJpbmcoYnVmLCBlbmQsIGRuLT5uYW1lLCBzdHJfc3BlYyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CS8qIHBoYW5kbGUgKi8KKwkJCWJ1ZiA9IG51bWJlcihidWYsIGVuZCwgKHVuc2lnbmVkIGludClkbi0+cGhhbmRsZSwgbnVtX3NwZWMpOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgkvKiBwYXRoLXNwZWMgKi8KKwkJCXAgPSBrYmFzZW5hbWUob2Zfbm9kZV9mdWxsX25hbWUoZG4pKTsKKwkJCWlmICghcFsxXSkKKwkJCQlwID0gIi8iOworCQkJYnVmID0gc3RyaW5nKGJ1ZiwgZW5kLCBwLCBzdHJfc3BlYyk7CisJCQlicmVhazsKKwkJY2FzZSAnRic6CS8qIGZsYWdzICovCisJCQl0YnVmWzBdID0gb2Zfbm9kZV9jaGVja19mbGFnKGRuLCBPRl9EWU5BTUlDKSA/ICdEJyA6ICctJzsKKwkJCXRidWZbMV0gPSBvZl9ub2RlX2NoZWNrX2ZsYWcoZG4sIE9GX0RFVEFDSEVEKSA/ICdkJyA6ICctJzsKKwkJCXRidWZbMl0gPSBvZl9ub2RlX2NoZWNrX2ZsYWcoZG4sIE9GX1BPUFVMQVRFRCkgPyAnUCcgOiAnLSc7CisJCQl0YnVmWzNdID0gb2Zfbm9kZV9jaGVja19mbGFnKGRuLCBPRl9QT1BVTEFURURfQlVTKSA/ICdCJyA6ICctJzsKKwkJCXRidWZbNF0gPSAwOworCQkJYnVmID0gc3RyaW5nKGJ1ZiwgZW5kLCB0YnVmLCBzdHJfc3BlYyk7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CS8qIG1ham9yIGNvbXBhdGlibGUgc3RyaW5nICovCisJCQlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhkbiwgImNvbXBhdGlibGUiLCAmcCk7CisJCQlpZiAoIXJldCkKKwkJCQlidWYgPSBzdHJpbmcoYnVmLCBlbmQsIHAsIHN0cl9zcGVjKTsKKwkJCWJyZWFrOworCQljYXNlICdDJzoJLyogZnVsbCBjb21wYXRpYmxlIHN0cmluZyAqLworCQkJaGFzX211bHQgPSBmYWxzZTsKKwkJCW9mX3Byb3BlcnR5X2Zvcl9lYWNoX3N0cmluZyhkbiwgImNvbXBhdGlibGUiLCBwcm9wLCBwKSB7CisJCQkJaWYgKGhhc19tdWx0KQorCQkJCQlidWYgPSBzdHJpbmcoYnVmLCBlbmQsICIsIiwgc3RyX3NwZWMpOworCQkJCWJ1ZiA9IHN0cmluZyhidWYsIGVuZCwgIlwiIiwgc3RyX3NwZWMpOworCQkJCWJ1ZiA9IHN0cmluZyhidWYsIGVuZCwgcCwgc3RyX3NwZWMpOworCQkJCWJ1ZiA9IHN0cmluZyhidWYsIGVuZCwgIlwiIiwgc3RyX3NwZWMpOworCisJCQkJaGFzX211bHQgPSB0cnVlOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiB3aWRlbl9zdHJpbmcoYnVmLCBidWYgLSBidWZfc3RhcnQsIGVuZCwgc3BlYyk7Cit9CisKK2ludCBrcHRyX3Jlc3RyaWN0IF9fcmVhZF9tb3N0bHk7CisKKy8qCisgKiBTaG93IGEgJyVwJyB0aGluZy4gIEEga2VybmVsIGV4dGVuc2lvbiBpcyB0aGF0IHRoZSAnJXAnIGlzIGZvbGxvd2VkCisgKiBieSBhbiBleHRyYSBzZXQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgdGhhdCBhcmUgZXh0ZW5kZWQgZm9ybWF0CisgKiBzcGVjaWZpZXJzLgorICoKKyAqIFBsZWFzZSB1cGRhdGUgc2NyaXB0cy9jaGVja3BhdGNoLnBsIHdoZW4gYWRkaW5nL3JlbW92aW5nIGNvbnZlcnNpb24KKyAqIGNoYXJhY3RlcnMuICAoU2VhcmNoIGZvciAiY2hlY2sgZm9yIHZzcHJpbnRmIGV4dGVuc2lvbiIpLgorICoKKyAqIFJpZ2h0IG5vdyB3ZSBoYW5kbGU6CisgKgorICogLSAnRicgRm9yIHN5bWJvbGljIGZ1bmN0aW9uIGRlc2NyaXB0b3IgcG9pbnRlcnMgd2l0aCBvZmZzZXQKKyAqIC0gJ2YnIEZvciBzaW1wbGUgc3ltYm9saWMgZnVuY3Rpb24gbmFtZXMgd2l0aG91dCBvZmZzZXQKKyAqIC0gJ1MnIEZvciBzeW1ib2xpYyBkaXJlY3QgcG9pbnRlcnMgd2l0aCBvZmZzZXQKKyAqIC0gJ3MnIEZvciBzeW1ib2xpYyBkaXJlY3QgcG9pbnRlcnMgd2l0aG91dCBvZmZzZXQKKyAqIC0gJ1tGZlNzXVInIGFzIGFib3ZlIHdpdGggX19idWlsdGluX2V4dHJhY3RfcmV0dXJuX2FkZHIoKSB0cmFuc2xhdGlvbgorICogLSAnQicgRm9yIGJhY2t0cmFjZWQgc3ltYm9saWMgZGlyZWN0IHBvaW50ZXJzIHdpdGggb2Zmc2V0CisgKiAtICdSJyBGb3IgZGVjb2RlZCBzdHJ1Y3QgcmVzb3VyY2UsIGUuZy4sIFttZW0gMHgwLTB4MWYgNjRiaXQgcHJlZl0KKyAqIC0gJ3InIEZvciByYXcgc3RydWN0IHJlc291cmNlLCBlLmcuLCBbbWVtIDB4MC0weDFmIGZsYWdzIDB4MjAxXQorICogLSAnYltsXScgRm9yIGEgYml0bWFwLCB0aGUgbnVtYmVyIG9mIGJpdHMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZmllbGQKKyAqICAgICAgIHdpZHRoIHdoaWNoIG11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgZWl0aGVyIGFzIHBhcnQgb2YgdGhlCisgKiAgICAgICBmb3JtYXQgc3RyaW5nICclMzJiW2xdJyBvciB0aHJvdWdoICclKmJbbF0nLCBbbF0gc2VsZWN0cworICogICAgICAgcmFuZ2UtbGlzdCBmb3JtYXQgaW5zdGVhZCBvZiBoZXggZm9ybWF0CisgKiAtICdNJyBGb3IgYSA2LWJ5dGUgTUFDIGFkZHJlc3MsIGl0IHByaW50cyB0aGUgYWRkcmVzcyBpbiB0aGUKKyAqICAgICAgIHVzdWFsIGNvbG9uLXNlcGFyYXRlZCBoZXggbm90YXRpb24KKyAqIC0gJ20nIEZvciBhIDYtYnl0ZSBNQUMgYWRkcmVzcywgaXQgcHJpbnRzIHRoZSBoZXggYWRkcmVzcyB3aXRob3V0IGNvbG9ucworICogLSAnTUYnIEZvciBhIDYtYnl0ZSBNQUMgRkRESSBhZGRyZXNzLCBpdCBwcmludHMgdGhlIGFkZHJlc3MKKyAqICAgICAgIHdpdGggYSBkYXNoLXNlcGFyYXRlZCBoZXggbm90YXRpb24KKyAqIC0gJ1ttTV1SJyBGb3IgYSA2LWJ5dGUgTUFDIGFkZHJlc3MsIFJldmVyc2Ugb3JkZXIgKEJsdWV0b290aCkKKyAqIC0gJ0knIFs0Nl0gZm9yIElQdjQvSVB2NiBhZGRyZXNzZXMgcHJpbnRlZCBpbiB0aGUgdXN1YWwgd2F5CisgKiAgICAgICBJUHY0IHVzZXMgZG90LXNlcGFyYXRlZCBkZWNpbWFsIHdpdGhvdXQgbGVhZGluZyAwJ3MgKDEuMi4zLjQpCisgKiAgICAgICBJUHY2IHVzZXMgY29sb24gc2VwYXJhdGVkIG5ldHdvcmstb3JkZXIgMTYgYml0IGhleCB3aXRoIGxlYWRpbmcgMCdzCisgKiAgICAgICBbU11bcGZzXQorICogICAgICAgR2VuZXJpYyBJUHY0L0lQdjYgYWRkcmVzcyAoc3RydWN0IHNvY2thZGRyICopIHRoYXQgZmFsbHMgYmFjayB0bworICogICAgICAgWzRdIG9yIFs2XSBhbmQgaXMgYWJsZSB0byBwcmludCBwb3J0IFtwXSwgZmxvd2luZm8gW2ZdLCBzY29wZSBbc10KKyAqIC0gJ2knIFs0Nl0gZm9yICdyYXcnIElQdjQvSVB2NiBhZGRyZXNzZXMKKyAqICAgICAgIElQdjYgb21pdHMgdGhlIGNvbG9ucyAoMDEwMjAzMDQuLi4wZikKKyAqICAgICAgIElQdjQgdXNlcyBkb3Qtc2VwYXJhdGVkIGRlY2ltYWwgd2l0aCBsZWFkaW5nIDAncyAoMDEwLjEyMy4wNDUuMDA2KQorICogICAgICAgW1NdW3Bmc10KKyAqICAgICAgIEdlbmVyaWMgSVB2NC9JUHY2IGFkZHJlc3MgKHN0cnVjdCBzb2NrYWRkciAqKSB0aGF0IGZhbGxzIGJhY2sgdG8KKyAqICAgICAgIFs0XSBvciBbNl0gYW5kIGlzIGFibGUgdG8gcHJpbnQgcG9ydCBbcF0sIGZsb3dpbmZvIFtmXSwgc2NvcGUgW3NdCisgKiAtICdbSWldWzRTXVtobmJsXScgSVB2NCBhZGRyZXNzZXMgaW4gaG9zdCwgbmV0d29yaywgYmlnIG9yIGxpdHRsZSBlbmRpYW4gb3JkZXIKKyAqIC0gJ0lbNlNdYycgZm9yIElQdjYgYWRkcmVzc2VzIHByaW50ZWQgYXMgc3BlY2lmaWVkIGJ5CisgKiAgICAgICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1OTUyCisgKiAtICdFW2FjaG5vcHNdJyBGb3IgYW4gZXNjYXBlZCBidWZmZXIsIHdoZXJlIHJ1bGVzIGFyZSBkZWZpbmVkIGJ5IGNvbWJpbmF0aW9uCisgKiAgICAgICAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIGZsYWdzIChzZWUgc3RyaW5nX2VzY2FwZV9tZW0oKSBmb3IgdGhlCisgKiAgICAgICAgICAgICAgICBkZXRhaWxzKToKKyAqICAgICAgICAgICAgICAgICAgYSAtIEVTQ0FQRV9BTlkKKyAqICAgICAgICAgICAgICAgICAgYyAtIEVTQ0FQRV9TUEVDSUFMCisgKiAgICAgICAgICAgICAgICAgIGggLSBFU0NBUEVfSEVYCisgKiAgICAgICAgICAgICAgICAgIG4gLSBFU0NBUEVfTlVMTAorICogICAgICAgICAgICAgICAgICBvIC0gRVNDQVBFX09DVEFMCisgKiAgICAgICAgICAgICAgICAgIHAgLSBFU0NBUEVfTlAKKyAqICAgICAgICAgICAgICAgICAgcyAtIEVTQ0FQRV9TUEFDRQorICogICAgICAgICAgICAgICAgQnkgZGVmYXVsdCBFU0NBUEVfQU5ZX05QIGlzIHVzZWQuCisgKiAtICdVJyBGb3IgYSAxNiBieXRlIFVVSUQvR1VJRCwgaXQgcHJpbnRzIHRoZSBVVUlEL0dVSUQgaW4gdGhlIGZvcm0KKyAqICAgICAgICJ4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgiCisgKiAgICAgICBPcHRpb25zIGZvciAlcFUgYXJlOgorICogICAgICAgICBiIGJpZyBlbmRpYW4gbG93ZXIgY2FzZSBoZXggKGRlZmF1bHQpCisgKiAgICAgICAgIEIgYmlnIGVuZGlhbiBVUFBFUiBjYXNlIGhleAorICogICAgICAgICBsIGxpdHRsZSBlbmRpYW4gbG93ZXIgY2FzZSBoZXgKKyAqICAgICAgICAgTCBsaXR0bGUgZW5kaWFuIFVQUEVSIGNhc2UgaGV4CisgKiAgICAgICAgICAgYmlnIGVuZGlhbiBvdXRwdXQgYnl0ZSBvcmRlciBpczoKKyAqICAgICAgICAgICAgIFswXVsxXVsyXVszXS1bNF1bNV0tWzZdWzddLVs4XVs5XS1bMTBdWzExXVsxMl1bMTNdWzE0XVsxNV0KKyAqICAgICAgICAgICBsaXR0bGUgZW5kaWFuIG91dHB1dCBieXRlIG9yZGVyIGlzOgorICogICAgICAgICAgICAgWzNdWzJdWzFdWzBdLVs1XVs0XS1bN11bNl0tWzhdWzldLVsxMF1bMTFdWzEyXVsxM11bMTRdWzE1XQorICogLSAnVicgRm9yIGEgc3RydWN0IHZhX2Zvcm1hdCB3aGljaCBjb250YWlucyBhIGZvcm1hdCBzdHJpbmcgKiBhbmQgdmFfbGlzdCAqLAorICogICAgICAgY2FsbCB2c25wcmludGYoLT5mb3JtYXQsICotPnZhX2xpc3QpLgorICogICAgICAgSW1wbGVtZW50cyBhICJyZWN1cnNpdmUgdnNucHJpbnRmIi4KKyAqICAgICAgIERvIG5vdCB1c2UgdGhpcyBmZWF0dXJlIHdpdGhvdXQgc29tZSBtZWNoYW5pc20gdG8gdmVyaWZ5IHRoZQorICogICAgICAgY29ycmVjdG5lc3Mgb2YgdGhlIGZvcm1hdCBzdHJpbmcgYW5kIHZhX2xpc3QgYXJndW1lbnRzLgorICogLSAnSycgRm9yIGEga2VybmVsIHBvaW50ZXIgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdW5wcml2aWxlZ2VkIHVzZXJzCisgKiAtICdORicgRm9yIGEgbmV0ZGV2X2ZlYXR1cmVzX3QKKyAqIC0gJ2hbQ0ROXScgRm9yIGEgdmFyaWFibGUtbGVuZ3RoIGJ1ZmZlciwgaXQgcHJpbnRzIGl0IGFzIGEgaGV4IHN0cmluZyB3aXRoCisgKiAgICAgICAgICAgIGEgY2VydGFpbiBzZXBhcmF0b3IgKCcgJyBieSBkZWZhdWx0KToKKyAqICAgICAgICAgICAgICBDIGNvbG9uCisgKiAgICAgICAgICAgICAgRCBkYXNoCisgKiAgICAgICAgICAgICAgTiBubyBzZXBhcmF0b3IKKyAqICAgICAgICAgICAgVGhlIG1heGltdW0gc3VwcG9ydGVkIGxlbmd0aCBpcyA2NCBieXRlcyBvZiB0aGUgaW5wdXQuIENvbnNpZGVyCisgKiAgICAgICAgICAgIHRvIHVzZSBwcmludF9oZXhfZHVtcCgpIGZvciB0aGUgbGFyZ2VyIGlucHV0LgorICogLSAnYVtwZF0nIEZvciBhZGRyZXNzIHR5cGVzIFtwXSBwaHlzX2FkZHJfdCwgW2RdIGRtYV9hZGRyX3QgYW5kIGRlcml2YXRpdmVzCisgKiAgICAgICAgICAgKGRlZmF1bHQgYXNzdW1lZCB0byBiZSBwaHlzX2FkZHJfdCwgcGFzc2VkIGJ5IHJlZmVyZW5jZSkKKyAqIC0gJ2RbMjM0XScgRm9yIGEgZGVudHJ5IG5hbWUgKG9wdGlvbmFsbHkgMi00IGxhc3QgY29tcG9uZW50cykKKyAqIC0gJ0RbMjM0XScgU2FtZSBhcyAnZCcgYnV0IGZvciBhIHN0cnVjdCBmaWxlCisgKiAtICdnJyBGb3IgYmxvY2tfZGV2aWNlIG5hbWUgKGdlbmRpc2sgKyBwYXJ0aXRpb24gbnVtYmVyKQorICogLSAnQycgRm9yIGEgY2xvY2ssIGl0IHByaW50cyB0aGUgbmFtZSAoQ29tbW9uIENsb2NrIEZyYW1ld29yaykgb3IgYWRkcmVzcworICogICAgICAgKGxlZ2FjeSBjbG9jayBmcmFtZXdvcmspIG9mIHRoZSBjbG9jaworICogLSAnQ24nIEZvciBhIGNsb2NrLCBpdCBwcmludHMgdGhlIG5hbWUgKENvbW1vbiBDbG9jayBGcmFtZXdvcmspIG9yIGFkZHJlc3MKKyAqICAgICAgICAobGVnYWN5IGNsb2NrIGZyYW1ld29yaykgb2YgdGhlIGNsb2NrCisgKiAtICdDcicgRm9yIGEgY2xvY2ssIGl0IHByaW50cyB0aGUgY3VycmVudCByYXRlIG9mIHRoZSBjbG9jaworICogLSAnRycgRm9yIGZsYWdzIHRvIGJlIHByaW50ZWQgYXMgYSBjb2xsZWN0aW9uIG9mIHN5bWJvbGljIHN0cmluZ3MgdGhhdCB3b3VsZAorICogICAgICAgY29uc3RydWN0IHRoZSBzcGVjaWZpYyB2YWx1ZS4gU3VwcG9ydGVkIGZsYWdzIGdpdmVuIGJ5IG9wdGlvbjoKKyAqICAgICAgIHAgcGFnZSBmbGFncyAoc2VlIHN0cnVjdCBwYWdlKSBnaXZlbiBhcyBwb2ludGVyIHRvIHVuc2lnbmVkIGxvbmcKKyAqICAgICAgIGcgZ2ZwIGZsYWdzIChHRlBfKiBhbmQgX19HRlBfKikgZ2l2ZW4gYXMgcG9pbnRlciB0byBnZnBfdAorICogICAgICAgdiB2bWEgZmxhZ3MgKFZNXyopIGdpdmVuIGFzIHBvaW50ZXIgdG8gdW5zaWduZWQgbG9uZworICogLSAnTycgRm9yIGEga29iamVjdCBiYXNlZCBzdHJ1Y3QuIE11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgICAtICdPRltmbnBQY0NGXScgIEZvciBhIGRldmljZSB0cmVlIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICBXaXRob3V0IGFueSBvcHRpb25hbCBhcmd1bWVudHMgcHJpbnRzIHRoZSBmdWxsX25hbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgZiBkZXZpY2Ugbm9kZSBmdWxsX25hbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgbiBkZXZpY2Ugbm9kZSBuYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHAgZGV2aWNlIG5vZGUgcGhhbmRsZQorICogICAgICAgICAgICAgICAgICAgICAgICBQIGRldmljZSBub2RlIHBhdGggc3BlYyAobmFtZSArIEB1bml0KQorICogICAgICAgICAgICAgICAgICAgICAgICBGIGRldmljZSBub2RlIGZsYWdzCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGMgbWFqb3IgY29tcGF0aWJsZSBzdHJpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICAgQyBmdWxsIGNvbXBhdGlibGUgc3RyaW5nCisgKgorICogKiogUGxlYXNlIHVwZGF0ZSBhbHNvIERvY3VtZW50YXRpb24vcHJpbnRrLWZvcm1hdHMudHh0IHdoZW4gbWFraW5nIGNoYW5nZXMgKioKKyAqCisgKiBOb3RlOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICdTJyBhbmQgJ0YnIGlzIHRoYXQgb24gaWE2NCBhbmQgcHBjNjQKKyAqIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSByZWFsbHkgZnVuY3Rpb24gZGVzY3JpcHRvcnMsIHdoaWNoIGNvbnRhaW4gYQorICogcG9pbnRlciB0byB0aGUgcmVhbCBhZGRyZXNzLgorICovCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrCitjaGFyICpwb2ludGVyKGNvbnN0IGNoYXIgKmZtdCwgY2hhciAqYnVmLCBjaGFyICplbmQsIHZvaWQgKnB0ciwKKwkgICAgICBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYykKK3sKKwljb25zdCBpbnQgZGVmYXVsdF93aWR0aCA9IDIgKiBzaXplb2Yodm9pZCAqKTsKKworCWlmICghcHRyICYmICpmbXQgIT0gJ0snKSB7CisJCS8qCisJCSAqIFByaW50IChudWxsKSB3aXRoIHRoZSBzYW1lIHdpZHRoIGFzIGEgcG9pbnRlciBzbyBpdCBtYWtlcworCQkgKiB0YWJ1bGFyIG91dHB1dCBsb29rIG5pY2UuCisJCSAqLworCQlpZiAoc3BlYy5maWVsZF93aWR0aCA9PSAtMSkKKwkJCXNwZWMuZmllbGRfd2lkdGggPSBkZWZhdWx0X3dpZHRoOworCQlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCAiKG51bGwpIiwgc3BlYyk7CisJfQorCisJc3dpdGNoICgqZm10KSB7CisJY2FzZSAnRic6CisJY2FzZSAnZic6CisJCXB0ciA9IGRlcmVmZXJlbmNlX2Z1bmN0aW9uX2Rlc2NyaXB0b3IocHRyKTsKKwkJLyogRmFsbHRocm91Z2ggKi8KKwljYXNlICdTJzoKKwljYXNlICdzJzoKKwljYXNlICdCJzoKKwkJcmV0dXJuIHN5bWJvbF9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKKwljYXNlICdSJzoKKwljYXNlICdyJzoKKwkJcmV0dXJuIHJlc291cmNlX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQpOworCWNhc2UgJ2gnOgorCQlyZXR1cm4gaGV4X3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQpOworCWNhc2UgJ2InOgorCQlzd2l0Y2ggKGZtdFsxXSkgeworCQljYXNlICdsJzoKKwkJCXJldHVybiBiaXRtYXBfbGlzdF9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBiaXRtYXBfc3RyaW5nKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CisJCX0KKwljYXNlICdNJzoJCQkvKiBDb2xvbiBzZXBhcmF0ZWQ6IDAwOjAxOjAyOjAzOjA0OjA1ICovCisJY2FzZSAnbSc6CQkJLyogQ29udGlndW91czogMDAwMTAyMDMwNDA1ICovCisJCQkJCS8qIFttTV1GIChGRERJKSAqLworCQkJCQkvKiBbbU1dUiAoUmV2ZXJzZSBvcmRlcjsgQmx1ZXRvb3RoKSAqLworCQlyZXR1cm4gbWFjX2FkZHJlc3Nfc3RyaW5nKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CisJY2FzZSAnSSc6CQkJLyogRm9ybWF0dGVkIElQIHN1cHBvcnRlZAorCQkJCQkgKiA0OgkxLjIuMy40CisJCQkJCSAqIDY6CTAwMDE6MDIwMzouLi46MDcwOAorCQkJCQkgKiA2YzoJMTo6NzA4IG9yIDE6OjEuMi4zLjQKKwkJCQkJICovCisJY2FzZSAnaSc6CQkJLyogQ29udGlndW91czoKKwkJCQkJICogNDoJMDAxLjAwMi4wMDMuMDA0CisJCQkJCSAqIDY6ICAgMDAwMTAyLi4uMGYKKwkJCQkJICovCisJCXN3aXRjaCAoZm10WzFdKSB7CisJCWNhc2UgJzYnOgorCQkJcmV0dXJuIGlwNl9hZGRyX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQpOworCQljYXNlICc0JzoKKwkJCXJldHVybiBpcDRfYWRkcl9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKKwkJY2FzZSAnUyc6IHsKKwkJCWNvbnN0IHVuaW9uIHsKKwkJCQlzdHJ1Y3Qgc29ja2FkZHIJCXJhdzsKKwkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4JdjQ7CisJCQkJc3RydWN0IHNvY2thZGRyX2luNgl2NjsKKwkJCX0gKnNhID0gcHRyOworCisJCQlzd2l0Y2ggKHNhLT5yYXcuc2FfZmFtaWx5KSB7CisJCQljYXNlIEFGX0lORVQ6CisJCQkJcmV0dXJuIGlwNF9hZGRyX3N0cmluZ19zYShidWYsIGVuZCwgJnNhLT52NCwgc3BlYywgZm10KTsKKwkJCWNhc2UgQUZfSU5FVDY6CisJCQkJcmV0dXJuIGlwNl9hZGRyX3N0cmluZ19zYShidWYsIGVuZCwgJnNhLT52Niwgc3BlYywgZm10KTsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIHN0cmluZyhidWYsIGVuZCwgIihpbnZhbGlkIGFkZHJlc3MpIiwgc3BlYyk7CisJCQl9fQorCQl9CisJCWJyZWFrOworCWNhc2UgJ0UnOgorCQlyZXR1cm4gZXNjYXBlZF9zdHJpbmcoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKKwljYXNlICdVJzoKKwkJcmV0dXJuIHV1aWRfc3RyaW5nKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CisJY2FzZSAnVic6CisJCXsKKwkJCXZhX2xpc3QgdmE7CisKKwkJCXZhX2NvcHkodmEsICooKHN0cnVjdCB2YV9mb3JtYXQgKilwdHIpLT52YSk7CisJCQlidWYgKz0gdnNucHJpbnRmKGJ1ZiwgZW5kID4gYnVmID8gZW5kIC0gYnVmIDogMCwKKwkJCQkJICgoc3RydWN0IHZhX2Zvcm1hdCAqKXB0ciktPmZtdCwgdmEpOworCQkJdmFfZW5kKHZhKTsKKwkJCXJldHVybiBidWY7CisJCX0KKwljYXNlICdLJzoKKwkJc3dpdGNoIChrcHRyX3Jlc3RyaWN0KSB7CisJCWNhc2UgMDoKKwkJCS8qIEFsd2F5cyBwcmludCAlcEsgdmFsdWVzICovCisJCQlicmVhazsKKwkJY2FzZSAxOiB7CisJCQljb25zdCBzdHJ1Y3QgY3JlZCAqY3JlZDsKKworCQkJLyoKKwkJCSAqIGtwdHJfcmVzdHJpY3Q9PTEgY2Fubm90IGJlIHVzZWQgaW4gSVJRIGNvbnRleHQKKwkJCSAqIGJlY2F1c2UgaXRzIHRlc3QgZm9yIENBUF9TWVNMT0cgd291bGQgYmUgbWVhbmluZ2xlc3MuCisJCQkgKi8KKwkJCWlmIChpbl9pcnEoKSB8fCBpbl9zZXJ2aW5nX3NvZnRpcnEoKSB8fCBpbl9ubWkoKSkgeworCQkJCWlmIChzcGVjLmZpZWxkX3dpZHRoID09IC0xKQorCQkJCQlzcGVjLmZpZWxkX3dpZHRoID0gZGVmYXVsdF93aWR0aDsKKwkJCQlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCAicEstZXJyb3IiLCBzcGVjKTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIE9ubHkgcHJpbnQgdGhlIHJlYWwgcG9pbnRlciB2YWx1ZSBpZiB0aGUgY3VycmVudAorCQkJICogcHJvY2VzcyBoYXMgQ0FQX1NZU0xPRyBhbmQgaXMgcnVubmluZyB3aXRoIHRoZQorCQkJICogc2FtZSBjcmVkZW50aWFscyBpdCBzdGFydGVkIHdpdGguIFRoaXMgaXMgYmVjYXVzZQorCQkJICogYWNjZXNzIHRvIGZpbGVzIGlzIGNoZWNrZWQgYXQgb3BlbigpIHRpbWUsIGJ1dCAlcEsKKwkJCSAqIGNoZWNrcyBwZXJtaXNzaW9uIGF0IHJlYWQoKSB0aW1lLiBXZSBkb24ndCB3YW50IHRvCisJCQkgKiBsZWFrIHBvaW50ZXIgdmFsdWVzIGlmIGEgYmluYXJ5IG9wZW5zIGEgZmlsZSB1c2luZworCQkJICogJXBLIGFuZCB0aGVuIGVsZXZhdGVzIHByaXZpbGVnZXMgYmVmb3JlIHJlYWRpbmcgaXQuCisJCQkgKi8KKwkJCWNyZWQgPSBjdXJyZW50X2NyZWQoKTsKKwkJCWlmICghaGFzX2NhcGFiaWxpdHlfbm9hdWRpdChjdXJyZW50LCBDQVBfU1lTTE9HKSB8fAorCQkJICAgICF1aWRfZXEoY3JlZC0+ZXVpZCwgY3JlZC0+dWlkKSB8fAorCQkJICAgICFnaWRfZXEoY3JlZC0+ZWdpZCwgY3JlZC0+Z2lkKSkKKwkJCQlwdHIgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAyOgorCQlkZWZhdWx0OgorCQkJLyogQWx3YXlzIHByaW50IDAncyBmb3IgJXBLICovCisJCQlwdHIgPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlICdOJzoKKwkJcmV0dXJuIG5ldGRldl9iaXRzKGJ1ZiwgZW5kLCBwdHIsIGZtdCk7CisJY2FzZSAnYSc6CisJCXJldHVybiBhZGRyZXNzX3ZhbChidWYsIGVuZCwgcHRyLCBmbXQpOworCWNhc2UgJ2QnOgorCQlyZXR1cm4gZGVudHJ5X25hbWUoYnVmLCBlbmQsIHB0ciwgc3BlYywgZm10KTsKKwljYXNlICdDJzoKKwkJcmV0dXJuIGNsb2NrKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CisJY2FzZSAnRCc6CisJCXJldHVybiBkZW50cnlfbmFtZShidWYsIGVuZCwKKwkJCQkgICAoKGNvbnN0IHN0cnVjdCBmaWxlICopcHRyKS0+Zl9wYXRoLmRlbnRyeSwKKwkJCQkgICBzcGVjLCBmbXQpOworI2lmZGVmIENPTkZJR19CTE9DSworCWNhc2UgJ2cnOgorCQlyZXR1cm4gYmRldl9uYW1lKGJ1ZiwgZW5kLCBwdHIsIHNwZWMsIGZtdCk7CisjZW5kaWYKKworCWNhc2UgJ0cnOgorCQlyZXR1cm4gZmxhZ3Nfc3RyaW5nKGJ1ZiwgZW5kLCBwdHIsIGZtdCk7CisJY2FzZSAnTyc6CisJCXN3aXRjaCAoZm10WzFdKSB7CisJCWNhc2UgJ0YnOgorCQkJcmV0dXJuIGRldmljZV9ub2RlX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCBmbXQgKyAxKTsKKwkJfQorCX0KKwlzcGVjLmZsYWdzIHw9IFNNQUxMOworCWlmIChzcGVjLmZpZWxkX3dpZHRoID09IC0xKSB7CisJCXNwZWMuZmllbGRfd2lkdGggPSBkZWZhdWx0X3dpZHRoOworCQlzcGVjLmZsYWdzIHw9IFpFUk9QQUQ7CisJfQorCXNwZWMuYmFzZSA9IDE2OworCisJcmV0dXJuIG51bWJlcihidWYsIGVuZCwgKHVuc2lnbmVkIGxvbmcpIHB0ciwgc3BlYyk7Cit9CisKKy8qCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gZGVjb2RlIHByaW50ZiBzdHlsZSBmb3JtYXQuCisgKiBFYWNoIGNhbGwgZGVjb2RlIGEgdG9rZW4gZnJvbSB0aGUgZm9ybWF0IGFuZCByZXR1cm4gdGhlCisgKiBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIChvciBsaWtlbHkgdGhlIGRlbHRhIHdoZXJlIGl0IHdhbnRzCisgKiB0byBnbyBvbiB0aGUgbmV4dCBjYWxsKS4KKyAqIFRoZSBkZWNvZGVkIHRva2VuIGlzIHJldHVybmVkIHRocm91Z2ggdGhlIHBhcmFtZXRlcnMKKyAqCisgKiAnaCcsICdsJywgb3IgJ0wnIGZvciBpbnRlZ2VyIGZpZWxkcworICogJ3onIHN1cHBvcnQgYWRkZWQgMjMvNy8xOTk5IFMuSC4KKyAqICd6JyBjaGFuZ2VkIHRvICdaJyAtLWRhdmlkbSAxLzI1Lzk5CisgKiAnWicgY2hhbmdlZCB0byAneicgLS1hZG9icml5YW4gMjAxNy0wMS0yNQorICogJ3QnIGFkZGVkIGZvciBwdHJkaWZmX3QKKyAqCisgKiBAZm10OiB0aGUgZm9ybWF0IHN0cmluZworICogQHR5cGUgb2YgdGhlIHRva2VuIHJldHVybmVkCisgKiBAZmxhZ3M6IHZhcmlvdXMgZmxhZ3Mgc3VjaCBhcyArLCAtLCAjIHRva2Vucy4uCisgKiBAZmllbGRfd2lkdGg6IG92ZXJ3cml0dGVuIHdpZHRoCisgKiBAYmFzZTogYmFzZSBvZiB0aGUgbnVtYmVyIChvY3RhbCwgaGV4LCAuLi4pCisgKiBAcHJlY2lzaW9uOiBwcmVjaXNpb24gb2YgYSBudW1iZXIKKyAqIEBxdWFsaWZpZXI6IHF1YWxpZmllciBvZiBhIG51bWJlciAobG9uZywgc2l6ZV90LCAuLi4pCisgKi8KK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sKK2ludCBmb3JtYXRfZGVjb2RlKGNvbnN0IGNoYXIgKmZtdCwgc3RydWN0IHByaW50Zl9zcGVjICpzcGVjKQoreworCWNvbnN0IGNoYXIgKnN0YXJ0ID0gZm10OworCWNoYXIgcXVhbGlmaWVyOworCisJLyogd2UgZmluaXNoZWQgZWFybHkgYnkgcmVhZGluZyB0aGUgZmllbGQgd2lkdGggKi8KKwlpZiAoc3BlYy0+dHlwZSA9PSBGT1JNQVRfVFlQRV9XSURUSCkgeworCQlpZiAoc3BlYy0+ZmllbGRfd2lkdGggPCAwKSB7CisJCQlzcGVjLT5maWVsZF93aWR0aCA9IC1zcGVjLT5maWVsZF93aWR0aDsKKwkJCXNwZWMtPmZsYWdzIHw9IExFRlQ7CisJCX0KKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX05PTkU7CisJCWdvdG8gcHJlY2lzaW9uOworCX0KKworCS8qIHdlIGZpbmlzaGVkIGVhcmx5IGJ5IHJlYWRpbmcgdGhlIHByZWNpc2lvbiAqLworCWlmIChzcGVjLT50eXBlID09IEZPUk1BVF9UWVBFX1BSRUNJU0lPTikgeworCQlpZiAoc3BlYy0+cHJlY2lzaW9uIDwgMCkKKwkJCXNwZWMtPnByZWNpc2lvbiA9IDA7CisKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX05PTkU7CisJCWdvdG8gcXVhbGlmaWVyOworCX0KKworCS8qIEJ5IGRlZmF1bHQgKi8KKwlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfTk9ORTsKKworCWZvciAoOyAqZm10IDsgKytmbXQpIHsKKwkJaWYgKCpmbXQgPT0gJyUnKQorCQkJYnJlYWs7CisJfQorCisJLyogUmV0dXJuIHRoZSBjdXJyZW50IG5vbi1mb3JtYXQgc3RyaW5nICovCisJaWYgKGZtdCAhPSBzdGFydCB8fCAhKmZtdCkKKwkJcmV0dXJuIGZtdCAtIHN0YXJ0OworCisJLyogUHJvY2VzcyBmbGFncyAqLworCXNwZWMtPmZsYWdzID0gMDsKKworCXdoaWxlICgxKSB7IC8qIHRoaXMgYWxzbyBza2lwcyBmaXJzdCAnJScgKi8KKwkJYm9vbCBmb3VuZCA9IHRydWU7CisKKwkJKytmbXQ7CisKKwkJc3dpdGNoICgqZm10KSB7CisJCWNhc2UgJy0nOiBzcGVjLT5mbGFncyB8PSBMRUZUOyAgICBicmVhazsKKwkJY2FzZSAnKyc6IHNwZWMtPmZsYWdzIHw9IFBMVVM7ICAgIGJyZWFrOworCQljYXNlICcgJzogc3BlYy0+ZmxhZ3MgfD0gU1BBQ0U7ICAgYnJlYWs7CisJCWNhc2UgJyMnOiBzcGVjLT5mbGFncyB8PSBTUEVDSUFMOyBicmVhazsKKwkJY2FzZSAnMCc6IHNwZWMtPmZsYWdzIHw9IFpFUk9QQUQ7IGJyZWFrOworCQlkZWZhdWx0OiAgZm91bmQgPSBmYWxzZTsKKwkJfQorCisJCWlmICghZm91bmQpCisJCQlicmVhazsKKwl9CisKKwkvKiBnZXQgZmllbGQgd2lkdGggKi8KKwlzcGVjLT5maWVsZF93aWR0aCA9IC0xOworCisJaWYgKGlzZGlnaXQoKmZtdCkpCisJCXNwZWMtPmZpZWxkX3dpZHRoID0gc2tpcF9hdG9pKCZmbXQpOworCWVsc2UgaWYgKCpmbXQgPT0gJyonKSB7CisJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1dJRFRIOworCQlyZXR1cm4gKytmbXQgLSBzdGFydDsKKwl9CisKK3ByZWNpc2lvbjoKKwkvKiBnZXQgdGhlIHByZWNpc2lvbiAqLworCXNwZWMtPnByZWNpc2lvbiA9IC0xOworCWlmICgqZm10ID09ICcuJykgeworCQkrK2ZtdDsKKwkJaWYgKGlzZGlnaXQoKmZtdCkpIHsKKwkJCXNwZWMtPnByZWNpc2lvbiA9IHNraXBfYXRvaSgmZm10KTsKKwkJCWlmIChzcGVjLT5wcmVjaXNpb24gPCAwKQorCQkJCXNwZWMtPnByZWNpc2lvbiA9IDA7CisJCX0gZWxzZSBpZiAoKmZtdCA9PSAnKicpIHsKKwkJCS8qIGl0J3MgdGhlIG5leHQgYXJndW1lbnQgKi8KKwkJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9QUkVDSVNJT047CisJCQlyZXR1cm4gKytmbXQgLSBzdGFydDsKKwkJfQorCX0KKworcXVhbGlmaWVyOgorCS8qIGdldCB0aGUgY29udmVyc2lvbiBxdWFsaWZpZXIgKi8KKwlxdWFsaWZpZXIgPSAwOworCWlmICgqZm10ID09ICdoJyB8fCBfdG9sb3dlcigqZm10KSA9PSAnbCcgfHwKKwkgICAgKmZtdCA9PSAneicgfHwgKmZtdCA9PSAndCcpIHsKKwkJcXVhbGlmaWVyID0gKmZtdCsrOworCQlpZiAodW5saWtlbHkocXVhbGlmaWVyID09ICpmbXQpKSB7CisJCQlpZiAocXVhbGlmaWVyID09ICdsJykgeworCQkJCXF1YWxpZmllciA9ICdMJzsKKwkJCQkrK2ZtdDsKKwkJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdoJykgeworCQkJCXF1YWxpZmllciA9ICdIJzsKKwkJCQkrK2ZtdDsKKwkJCX0KKwkJfQorCX0KKworCS8qIGRlZmF1bHQgYmFzZSAqLworCXNwZWMtPmJhc2UgPSAxMDsKKwlzd2l0Y2ggKCpmbXQpIHsKKwljYXNlICdjJzoKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX0NIQVI7CisJCXJldHVybiArK2ZtdCAtIHN0YXJ0OworCisJY2FzZSAncyc6CisJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9TVFI7CisJCXJldHVybiArK2ZtdCAtIHN0YXJ0OworCisJY2FzZSAncCc6CisJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9QVFI7CisJCXJldHVybiArK2ZtdCAtIHN0YXJ0OworCisJY2FzZSAnJSc6CisJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9QRVJDRU5UX0NIQVI7CisJCXJldHVybiArK2ZtdCAtIHN0YXJ0OworCisJLyogaW50ZWdlciBudW1iZXIgZm9ybWF0cyAtIHNldCB1cCB0aGUgZmxhZ3MgYW5kICJicmVhayIgKi8KKwljYXNlICdvJzoKKwkJc3BlYy0+YmFzZSA9IDg7CisJCWJyZWFrOworCisJY2FzZSAneCc6CisJCXNwZWMtPmZsYWdzIHw9IFNNQUxMOworCisJY2FzZSAnWCc6CisJCXNwZWMtPmJhc2UgPSAxNjsKKwkJYnJlYWs7CisKKwljYXNlICdkJzoKKwljYXNlICdpJzoKKwkJc3BlYy0+ZmxhZ3MgfD0gU0lHTjsKKwljYXNlICd1JzoKKwkJYnJlYWs7CisKKwljYXNlICduJzoKKwkJLyoKKwkJICogU2luY2UgJW4gcG9zZXMgYSBncmVhdGVyIHNlY3VyaXR5IHJpc2sgdGhhbgorCQkgKiB1dGlsaXR5LCB0cmVhdCBpdCBhcyBhbnkgb3RoZXIgaW52YWxpZCBvcgorCQkgKiB1bnN1cHBvcnRlZCBmb3JtYXQgc3BlY2lmaWVyLgorCQkgKi8KKwkJLyogRmFsbC10aHJvdWdoICovCisKKwlkZWZhdWx0OgorCQlXQVJOX09OQ0UoMSwgIlBsZWFzZSByZW1vdmUgdW5zdXBwb3J0ZWQgJSUlYyBpbiBmb3JtYXQgc3RyaW5nXG4iLCAqZm10KTsKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX0lOVkFMSUQ7CisJCXJldHVybiBmbXQgLSBzdGFydDsKKwl9CisKKwlpZiAocXVhbGlmaWVyID09ICdMJykKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX0xPTkdfTE9ORzsKKwllbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2wnKSB7CisJCUJVSUxEX0JVR19PTihGT1JNQVRfVFlQRV9VTE9ORyArIFNJR04gIT0gRk9STUFUX1RZUEVfTE9ORyk7CisJCXNwZWMtPnR5cGUgPSBGT1JNQVRfVFlQRV9VTE9ORyArIChzcGVjLT5mbGFncyAmIFNJR04pOworCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICd6JykgeworCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfU0laRV9UOworCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICd0JykgeworCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfUFRSRElGRjsKKwl9IGVsc2UgaWYgKHF1YWxpZmllciA9PSAnSCcpIHsKKwkJQlVJTERfQlVHX09OKEZPUk1BVF9UWVBFX1VCWVRFICsgU0lHTiAhPSBGT1JNQVRfVFlQRV9CWVRFKTsKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VCWVRFICsgKHNwZWMtPmZsYWdzICYgU0lHTik7CisJfSBlbHNlIGlmIChxdWFsaWZpZXIgPT0gJ2gnKSB7CisJCUJVSUxEX0JVR19PTihGT1JNQVRfVFlQRV9VU0hPUlQgKyBTSUdOICE9IEZPUk1BVF9UWVBFX1NIT1JUKTsKKwkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VTSE9SVCArIChzcGVjLT5mbGFncyAmIFNJR04pOworCX0gZWxzZSB7CisJCUJVSUxEX0JVR19PTihGT1JNQVRfVFlQRV9VSU5UICsgU0lHTiAhPSBGT1JNQVRfVFlQRV9JTlQpOworCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfVUlOVCArIChzcGVjLT5mbGFncyAmIFNJR04pOworCX0KKworCXJldHVybiArK2ZtdCAtIHN0YXJ0OworfQorCitzdGF0aWMgdm9pZAorc2V0X2ZpZWxkX3dpZHRoKHN0cnVjdCBwcmludGZfc3BlYyAqc3BlYywgaW50IHdpZHRoKQoreworCXNwZWMtPmZpZWxkX3dpZHRoID0gd2lkdGg7CisJaWYgKFdBUk5fT05DRShzcGVjLT5maWVsZF93aWR0aCAhPSB3aWR0aCwgImZpZWxkIHdpZHRoICVkIHRvbyBsYXJnZSIsIHdpZHRoKSkgeworCQlzcGVjLT5maWVsZF93aWR0aCA9IGNsYW1wKHdpZHRoLCAtRklFTERfV0lEVEhfTUFYLCBGSUVMRF9XSURUSF9NQVgpOworCX0KK30KKworc3RhdGljIHZvaWQKK3NldF9wcmVjaXNpb24oc3RydWN0IHByaW50Zl9zcGVjICpzcGVjLCBpbnQgcHJlYykKK3sKKwlzcGVjLT5wcmVjaXNpb24gPSBwcmVjOworCWlmIChXQVJOX09OQ0Uoc3BlYy0+cHJlY2lzaW9uICE9IHByZWMsICJwcmVjaXNpb24gJWQgdG9vIGxhcmdlIiwgcHJlYykpIHsKKwkJc3BlYy0+cHJlY2lzaW9uID0gY2xhbXAocHJlYywgMCwgUFJFQ0lTSU9OX01BWCk7CisJfQorfQorCisvKioKKyAqIHZzbnByaW50ZiAtIEZvcm1hdCBhIHN0cmluZyBhbmQgcGxhY2UgaXQgaW4gYSBidWZmZXIKKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gcGxhY2UgdGhlIHJlc3VsdCBpbnRvCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsIHNwYWNlCisgKiBAZm10OiBUaGUgZm9ybWF0IHN0cmluZyB0byB1c2UKKyAqIEBhcmdzOiBBcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKgorICogVGhpcyBmdW5jdGlvbiBnZW5lcmFsbHkgZm9sbG93cyBDOTkgdnNucHJpbnRmLCBidXQgaGFzIHNvbWUKKyAqIGV4dGVuc2lvbnMgYW5kIGEgZmV3IGxpbWl0YXRpb25zOgorICoKKyAqICAtIGBgJW5gYCBpcyB1bnN1cHBvcnRlZAorICogIC0gYGAlcCpgYCBpcyBoYW5kbGVkIGJ5IHBvaW50ZXIoKQorICoKKyAqIFNlZSBwb2ludGVyKCkgb3IgRG9jdW1lbnRhdGlvbi9wcmludGstZm9ybWF0cy50eHQgZm9yIG1vcmUKKyAqIGV4dGVuc2l2ZSBkZXNjcmlwdGlvbi4KKyAqCisgKiAqKlBsZWFzZSB1cGRhdGUgdGhlIGRvY3VtZW50YXRpb24gaW4gYm90aCBwbGFjZXMgd2hlbiBtYWtpbmcgY2hhbmdlcyoqCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQKKyAqIGJlIGdlbmVyYXRlZCBmb3IgdGhlIGdpdmVuIGlucHV0LCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiAnXDAnLCBhcyBwZXIgSVNPIEM5OS4gSWYgeW91IHdhbnQgdG8gaGF2ZSB0aGUgZXhhY3QKKyAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gaW50byBAYnVmIGFzIHJldHVybiB2YWx1ZQorICogKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcpLCB1c2UgdnNjbnByaW50ZigpLiBJZiB0aGUKKyAqIHJldHVybiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQHNpemUsIHRoZSByZXN1bHRpbmcKKyAqIHN0cmluZyBpcyB0cnVuY2F0ZWQuCisgKgorICogSWYgeW91J3JlIG5vdCBhbHJlYWR5IGRlYWxpbmcgd2l0aCBhIHZhX2xpc3QgY29uc2lkZXIgdXNpbmcgc25wcmludGYoKS4KKyAqLworaW50IHZzbnByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgbnVtOworCWNoYXIgKnN0ciwgKmVuZDsKKwlzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYyA9IHswfTsKKworCS8qIFJlamVjdCBvdXQtb2YtcmFuZ2UgdmFsdWVzIGVhcmx5LiAgTGFyZ2UgcG9zaXRpdmUgc2l6ZXMgYXJlCisJICAgdXNlZCBmb3IgdW5rbm93biBidWZmZXIgc2l6ZXMuICovCisJaWYgKFdBUk5fT05fT05DRShzaXplID4gSU5UX01BWCkpCisJCXJldHVybiAwOworCisJc3RyID0gYnVmOworCWVuZCA9IGJ1ZiArIHNpemU7CisKKwkvKiBNYWtlIHN1cmUgZW5kIGlzIGFsd2F5cyA+PSBidWYgKi8KKwlpZiAoZW5kIDwgYnVmKSB7CisJCWVuZCA9ICgodm9pZCAqKS0xKTsKKwkJc2l6ZSA9IGVuZCAtIGJ1ZjsKKwl9CisKKwl3aGlsZSAoKmZtdCkgeworCQljb25zdCBjaGFyICpvbGRfZm10ID0gZm10OworCQlpbnQgcmVhZCA9IGZvcm1hdF9kZWNvZGUoZm10LCAmc3BlYyk7CisKKwkJZm10ICs9IHJlYWQ7CisKKwkJc3dpdGNoIChzcGVjLnR5cGUpIHsKKwkJY2FzZSBGT1JNQVRfVFlQRV9OT05FOiB7CisJCQlpbnQgY29weSA9IHJlYWQ7CisJCQlpZiAoc3RyIDwgZW5kKSB7CisJCQkJaWYgKGNvcHkgPiBlbmQgLSBzdHIpCisJCQkJCWNvcHkgPSBlbmQgLSBzdHI7CisJCQkJbWVtY3B5KHN0ciwgb2xkX2ZtdCwgY29weSk7CisJCQl9CisJCQlzdHIgKz0gcmVhZDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9XSURUSDoKKwkJCXNldF9maWVsZF93aWR0aCgmc3BlYywgdmFfYXJnKGFyZ3MsIGludCkpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9QUkVDSVNJT046CisJCQlzZXRfcHJlY2lzaW9uKCZzcGVjLCB2YV9hcmcoYXJncywgaW50KSk7CisJCQlicmVhazsKKworCQljYXNlIEZPUk1BVF9UWVBFX0NIQVI6IHsKKwkJCWNoYXIgYzsKKworCQkJaWYgKCEoc3BlYy5mbGFncyAmIExFRlQpKSB7CisJCQkJd2hpbGUgKC0tc3BlYy5maWVsZF93aWR0aCA+IDApIHsKKwkJCQkJaWYgKHN0ciA8IGVuZCkKKwkJCQkJCSpzdHIgPSAnICc7CisJCQkJCSsrc3RyOworCisJCQkJfQorCQkJfQorCQkJYyA9ICh1bnNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50KTsKKwkJCWlmIChzdHIgPCBlbmQpCisJCQkJKnN0ciA9IGM7CisJCQkrK3N0cjsKKwkJCXdoaWxlICgtLXNwZWMuZmllbGRfd2lkdGggPiAwKSB7CisJCQkJaWYgKHN0ciA8IGVuZCkKKwkJCQkJKnN0ciA9ICcgJzsKKwkJCQkrK3N0cjsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9TVFI6CisJCQlzdHIgPSBzdHJpbmcoc3RyLCBlbmQsIHZhX2FyZyhhcmdzLCBjaGFyICopLCBzcGVjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRk9STUFUX1RZUEVfUFRSOgorCQkJc3RyID0gcG9pbnRlcihmbXQsIHN0ciwgZW5kLCB2YV9hcmcoYXJncywgdm9pZCAqKSwKKwkJCQkgICAgICBzcGVjKTsKKwkJCXdoaWxlIChpc2FsbnVtKCpmbXQpKQorCQkJCWZtdCsrOworCQkJYnJlYWs7CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9QRVJDRU5UX0NIQVI6CisJCQlpZiAoc3RyIDwgZW5kKQorCQkJCSpzdHIgPSAnJSc7CisJCQkrK3N0cjsKKwkJCWJyZWFrOworCisJCWNhc2UgRk9STUFUX1RZUEVfSU5WQUxJRDoKKwkJCS8qCisJCQkgKiBQcmVzdW1hYmx5IHRoZSBhcmd1bWVudHMgcGFzc2VkIGdjYydzIHR5cGUKKwkJCSAqIGNoZWNraW5nLCBidXQgdGhlcmUgaXMgbm8gc2FmZSBvciBzYW5lIHdheQorCQkJICogZm9yIHVzIHRvIGNvbnRpbnVlIHBhcnNpbmcgdGhlIGZvcm1hdCBhbmQKKwkJCSAqIGZldGNoaW5nIGZyb20gdGhlIHZhX2xpc3Q7IHRoZSByZW1haW5pbmcKKwkJCSAqIHNwZWNpZmllcnMgYW5kIGFyZ3VtZW50cyB3b3VsZCBiZSBvdXQgb2YKKwkJCSAqIHN5bmMuCisJCQkgKi8KKwkJCWdvdG8gb3V0OworCisJCWRlZmF1bHQ6CisJCQlzd2l0Y2ggKHNwZWMudHlwZSkgeworCQkJY2FzZSBGT1JNQVRfVFlQRV9MT05HX0xPTkc6CisJCQkJbnVtID0gdmFfYXJnKGFyZ3MsIGxvbmcgbG9uZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1VMT05HOgorCQkJCW51bSA9IHZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfTE9ORzoKKwkJCQludW0gPSB2YV9hcmcoYXJncywgbG9uZyk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1NJWkVfVDoKKwkJCQlpZiAoc3BlYy5mbGFncyAmIFNJR04pCisJCQkJCW51bSA9IHZhX2FyZyhhcmdzLCBzc2l6ZV90KTsKKwkJCQllbHNlCisJCQkJCW51bSA9IHZhX2FyZyhhcmdzLCBzaXplX3QpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9QVFJESUZGOgorCQkJCW51bSA9IHZhX2FyZyhhcmdzLCBwdHJkaWZmX3QpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9VQllURToKKwkJCQludW0gPSAodW5zaWduZWQgY2hhcikgdmFfYXJnKGFyZ3MsIGludCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX0JZVEU6CisJCQkJbnVtID0gKHNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfVVNIT1JUOgorCQkJCW51bSA9ICh1bnNpZ25lZCBzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1NIT1JUOgorCQkJCW51bSA9IChzaG9ydCkgdmFfYXJnKGFyZ3MsIGludCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX0lOVDoKKwkJCQludW0gPSAoaW50KSB2YV9hcmcoYXJncywgaW50KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGludCk7CisJCQl9CisKKwkJCXN0ciA9IG51bWJlcihzdHIsIGVuZCwgbnVtLCBzcGVjKTsKKwkJfQorCX0KKworb3V0OgorCWlmIChzaXplID4gMCkgeworCQlpZiAoc3RyIDwgZW5kKQorCQkJKnN0ciA9ICdcMCc7CisJCWVsc2UKKwkJCWVuZFstMV0gPSAnXDAnOworCX0KKworCS8qIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUgZG9lc24ndCBjb3VudCB0b3dhcmRzIHRoZSB0b3RhbCAqLworCXJldHVybiBzdHItYnVmOworCit9CitFWFBPUlRfU1lNQk9MKHZzbnByaW50Zik7CisKKy8qKgorICogdnNjbnByaW50ZiAtIEZvcm1hdCBhIHN0cmluZyBhbmQgcGxhY2UgaXQgaW4gYSBidWZmZXIKKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gcGxhY2UgdGhlIHJlc3VsdCBpbnRvCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsIHNwYWNlCisgKiBAZm10OiBUaGUgZm9ybWF0IHN0cmluZyB0byB1c2UKKyAqIEBhcmdzOiBBcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggaGF2ZSBiZWVuIHdyaXR0ZW4gaW50bworICogdGhlIEBidWYgbm90IGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJy4gSWYgQHNpemUgaXMgPT0gMCB0aGUgZnVuY3Rpb24KKyAqIHJldHVybnMgMC4KKyAqCisgKiBJZiB5b3UncmUgbm90IGFscmVhZHkgZGVhbGluZyB3aXRoIGEgdmFfbGlzdCBjb25zaWRlciB1c2luZyBzY25wcmludGYoKS4KKyAqCisgKiBTZWUgdGhlIHZzbnByaW50ZigpIGRvY3VtZW50YXRpb24gZm9yIGZvcm1hdCBzdHJpbmcgZXh0ZW5zaW9ucyBvdmVyIEM5OS4KKyAqLworaW50IHZzY25wcmludGYoY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJaW50IGk7CisKKwlpID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZSwgZm10LCBhcmdzKTsKKworCWlmIChsaWtlbHkoaSA8IHNpemUpKQorCQlyZXR1cm4gaTsKKwlpZiAoc2l6ZSAhPSAwKQorCQlyZXR1cm4gc2l6ZSAtIDE7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHZzY25wcmludGYpOworCisvKioKKyAqIHNucHJpbnRmIC0gRm9ybWF0IGEgc3RyaW5nIGFuZCBwbGFjZSBpdCBpbiBhIGJ1ZmZlcgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBwbGFjZSB0aGUgcmVzdWx0IGludG8KKyAqIEBzaXplOiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIG51bGwgc3BhY2UKKyAqIEBmbXQ6IFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZQorICogQC4uLjogQXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZworICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdvdWxkIGJlCisgKiBnZW5lcmF0ZWQgZm9yIHRoZSBnaXZlbiBpbnB1dCwgZXhjbHVkaW5nIHRoZSB0cmFpbGluZyBudWxsLAorICogYXMgcGVyIElTTyBDOTkuICBJZiB0aGUgcmV0dXJuIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICogQHNpemUsIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIHRydW5jYXRlZC4KKyAqCisgKiBTZWUgdGhlIHZzbnByaW50ZigpIGRvY3VtZW50YXRpb24gZm9yIGZvcm1hdCBzdHJpbmcgZXh0ZW5zaW9ucyBvdmVyIEM5OS4KKyAqLworaW50IHNucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgaTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJaSA9IHZzbnByaW50ZihidWYsIHNpemUsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MKHNucHJpbnRmKTsKKworLyoqCisgKiBzY25wcmludGYgLSBGb3JtYXQgYSBzdHJpbmcgYW5kIHBsYWNlIGl0IGluIGEgYnVmZmVyCisgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIHBsYWNlIHRoZSByZXN1bHQgaW50bworICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCBzcGFjZQorICogQGZtdDogVGhlIGZvcm1hdCBzdHJpbmcgdG8gdXNlCisgKiBALi4uOiBBcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBpbnRvIEBidWYgbm90IGluY2x1ZGluZworICogdGhlIHRyYWlsaW5nICdcMCcuIElmIEBzaXplIGlzID09IDAgdGhlIGZ1bmN0aW9uIHJldHVybnMgMC4KKyAqLworCitpbnQgc2NucHJpbnRmKGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgaTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJaSA9IHZzY25wcmludGYoYnVmLCBzaXplLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKworCXJldHVybiBpOworfQorRVhQT1JUX1NZTUJPTChzY25wcmludGYpOworCisvKioKKyAqIHZzcHJpbnRmIC0gRm9ybWF0IGEgc3RyaW5nIGFuZCBwbGFjZSBpdCBpbiBhIGJ1ZmZlcgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBwbGFjZSB0aGUgcmVzdWx0IGludG8KKyAqIEBmbXQ6IFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZQorICogQGFyZ3M6IEFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbgorICogaW50byBAYnVmLiBVc2UgdnNucHJpbnRmKCkgb3IgdnNjbnByaW50ZigpIGluIG9yZGVyIHRvIGF2b2lkCisgKiBidWZmZXIgb3ZlcmZsb3dzLgorICoKKyAqIElmIHlvdSdyZSBub3QgYWxyZWFkeSBkZWFsaW5nIHdpdGggYSB2YV9saXN0IGNvbnNpZGVyIHVzaW5nIHNwcmludGYoKS4KKyAqCisgKiBTZWUgdGhlIHZzbnByaW50ZigpIGRvY3VtZW50YXRpb24gZm9yIGZvcm1hdCBzdHJpbmcgZXh0ZW5zaW9ucyBvdmVyIEM5OS4KKyAqLworaW50IHZzcHJpbnRmKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJcmV0dXJuIHZzbnByaW50ZihidWYsIElOVF9NQVgsIGZtdCwgYXJncyk7Cit9CitFWFBPUlRfU1lNQk9MKHZzcHJpbnRmKTsKKworLyoqCisgKiBzcHJpbnRmIC0gRm9ybWF0IGEgc3RyaW5nIGFuZCBwbGFjZSBpdCBpbiBhIGJ1ZmZlcgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBwbGFjZSB0aGUgcmVzdWx0IGludG8KKyAqIEBmbXQ6IFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZQorICogQC4uLjogQXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZworICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuCisgKiBpbnRvIEBidWYuIFVzZSBzbnByaW50ZigpIG9yIHNjbnByaW50ZigpIGluIG9yZGVyIHRvIGF2b2lkCisgKiBidWZmZXIgb3ZlcmZsb3dzLgorICoKKyAqIFNlZSB0aGUgdnNucHJpbnRmKCkgZG9jdW1lbnRhdGlvbiBmb3IgZm9ybWF0IHN0cmluZyBleHRlbnNpb25zIG92ZXIgQzk5LgorICovCitpbnQgc3ByaW50ZihjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgaTsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJaSA9IHZzbnByaW50ZihidWYsIElOVF9NQVgsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MKHNwcmludGYpOworCisjaWZkZWYgQ09ORklHX0JJTkFSWV9QUklOVEYKKy8qCisgKiBicHJpbnRmIHNlcnZpY2U6CisgKiB2YmluX3ByaW50ZigpIC0gVkEgYXJndW1lbnRzIHRvIGJpbmFyeSBkYXRhCisgKiBic3RyX3ByaW50ZigpIC0gQmluYXJ5IGRhdGEgdG8gdGV4dCBzdHJpbmcKKyAqLworCisvKioKKyAqIHZiaW5fcHJpbnRmIC0gUGFyc2UgYSBmb3JtYXQgc3RyaW5nIGFuZCBwbGFjZSBhcmdzJyBiaW5hcnkgdmFsdWUgaW4gYSBidWZmZXIKKyAqIEBiaW5fYnVmOiBUaGUgYnVmZmVyIHRvIHBsYWNlIGFyZ3MnIGJpbmFyeSB2YWx1ZQorICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIoYnkgd29yZHMoMzJiaXRzKSwgbm90IGNoYXJhY3RlcnMpCisgKiBAZm10OiBUaGUgZm9ybWF0IHN0cmluZyB0byB1c2UKKyAqIEBhcmdzOiBBcmd1bWVudHMgZm9yIHRoZSBmb3JtYXQgc3RyaW5nCisgKgorICogVGhlIGZvcm1hdCBmb2xsb3dzIEM5OSB2c25wcmludGYsIGV4Y2VwdCAlbiBpcyBpZ25vcmVkLCBhbmQgaXRzIGFyZ3VtZW50CisgKiBpcyBza2lwcGVkLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiB3b3JkcygzMmJpdHMpIHdoaWNoIHdvdWxkIGJlIGdlbmVyYXRlZCBmb3IKKyAqIHRoZSBnaXZlbiBpbnB1dC4KKyAqCisgKiBOT1RFOgorICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gQHNpemUsIHRoZSByZXN1bHRpbmcgYmluX2J1ZiBpcyBOT1QKKyAqIHZhbGlkIGZvciBic3RyX3ByaW50ZigpLgorICovCitpbnQgdmJpbl9wcmludGYodTMyICpiaW5fYnVmLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCit7CisJc3RydWN0IHByaW50Zl9zcGVjIHNwZWMgPSB7MH07CisJY2hhciAqc3RyLCAqZW5kOworCisJc3RyID0gKGNoYXIgKiliaW5fYnVmOworCWVuZCA9IChjaGFyICopKGJpbl9idWYgKyBzaXplKTsKKworI2RlZmluZSBzYXZlX2FyZyh0eXBlKQkJCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmIChzaXplb2YodHlwZSkgPT0gOCkgewkJCQkJXAorCQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWU7CQkJCVwKKwkJc3RyID0gUFRSX0FMSUdOKHN0ciwgc2l6ZW9mKHUzMikpOwkJCVwKKwkJdmFsdWUgPSB2YV9hcmcoYXJncywgdW5zaWduZWQgbG9uZyBsb25nKTsJCVwKKwkJaWYgKHN0ciArIHNpemVvZih0eXBlKSA8PSBlbmQpIHsJCQlcCisJCQkqKHUzMiAqKXN0ciA9ICoodTMyICopJnZhbHVlOwkJCVwKKwkJCSoodTMyICopKHN0ciArIDQpID0gKigodTMyICopJnZhbHVlICsgMSk7CVwKKwkJfQkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQkJXAorCQl1bnNpZ25lZCBsb25nIHZhbHVlOwkJCQkJXAorCQlzdHIgPSBQVFJfQUxJR04oc3RyLCBzaXplb2YodHlwZSkpOwkJCVwKKwkJdmFsdWUgPSB2YV9hcmcoYXJncywgaW50KTsJCQkJXAorCQlpZiAoc3RyICsgc2l6ZW9mKHR5cGUpIDw9IGVuZCkJCQkJXAorCQkJKih0eXBlb2YodHlwZSkgKilzdHIgPSAodHlwZSl2YWx1ZTsJCVwKKwl9CQkJCQkJCQlcCisJc3RyICs9IHNpemVvZih0eXBlKTsJCQkJCQlcCit9IHdoaWxlICgwKQorCisJd2hpbGUgKCpmbXQpIHsKKwkJaW50IHJlYWQgPSBmb3JtYXRfZGVjb2RlKGZtdCwgJnNwZWMpOworCisJCWZtdCArPSByZWFkOworCisJCXN3aXRjaCAoc3BlYy50eXBlKSB7CisJCWNhc2UgRk9STUFUX1RZUEVfTk9ORToKKwkJY2FzZSBGT1JNQVRfVFlQRV9QRVJDRU5UX0NIQVI6CisJCQlicmVhazsKKwkJY2FzZSBGT1JNQVRfVFlQRV9JTlZBTElEOgorCQkJZ290byBvdXQ7CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9XSURUSDoKKwkJY2FzZSBGT1JNQVRfVFlQRV9QUkVDSVNJT046CisJCQlzYXZlX2FyZyhpbnQpOworCQkJYnJlYWs7CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9DSEFSOgorCQkJc2F2ZV9hcmcoY2hhcik7CisJCQlicmVhazsKKworCQljYXNlIEZPUk1BVF9UWVBFX1NUUjogeworCQkJY29uc3QgY2hhciAqc2F2ZV9zdHIgPSB2YV9hcmcoYXJncywgY2hhciAqKTsKKwkJCXNpemVfdCBsZW47CisKKwkJCWlmICgodW5zaWduZWQgbG9uZylzYXZlX3N0ciA+ICh1bnNpZ25lZCBsb25nKS1QQUdFX1NJWkUKKwkJCQkJfHwgKHVuc2lnbmVkIGxvbmcpc2F2ZV9zdHIgPCBQQUdFX1NJWkUpCisJCQkJc2F2ZV9zdHIgPSAiKG51bGwpIjsKKwkJCWxlbiA9IHN0cmxlbihzYXZlX3N0cikgKyAxOworCQkJaWYgKHN0ciArIGxlbiA8IGVuZCkKKwkJCQltZW1jcHkoc3RyLCBzYXZlX3N0ciwgbGVuKTsKKwkJCXN0ciArPSBsZW47CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STUFUX1RZUEVfUFRSOgorCQkJc2F2ZV9hcmcodm9pZCAqKTsKKwkJCS8qIHNraXAgYWxsIGFscGhhbnVtZXJpYyBwb2ludGVyIHN1ZmZpeGVzICovCisJCQl3aGlsZSAoaXNhbG51bSgqZm10KSkKKwkJCQlmbXQrKzsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlzd2l0Y2ggKHNwZWMudHlwZSkgeworCisJCQljYXNlIEZPUk1BVF9UWVBFX0xPTkdfTE9ORzoKKwkJCQlzYXZlX2FyZyhsb25nIGxvbmcpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9VTE9ORzoKKwkJCWNhc2UgRk9STUFUX1RZUEVfTE9ORzoKKwkJCQlzYXZlX2FyZyh1bnNpZ25lZCBsb25nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfU0laRV9UOgorCQkJCXNhdmVfYXJnKHNpemVfdCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1BUUkRJRkY6CisJCQkJc2F2ZV9hcmcocHRyZGlmZl90KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfVUJZVEU6CisJCQljYXNlIEZPUk1BVF9UWVBFX0JZVEU6CisJCQkJc2F2ZV9hcmcoY2hhcik7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1VTSE9SVDoKKwkJCWNhc2UgRk9STUFUX1RZUEVfU0hPUlQ6CisJCQkJc2F2ZV9hcmcoc2hvcnQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlzYXZlX2FyZyhpbnQpOworCQkJfQorCQl9CisJfQorCitvdXQ6CisJcmV0dXJuICh1MzIgKikoUFRSX0FMSUdOKHN0ciwgc2l6ZW9mKHUzMikpKSAtIGJpbl9idWY7CisjdW5kZWYgc2F2ZV9hcmcKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHZiaW5fcHJpbnRmKTsKKworLyoqCisgKiBic3RyX3ByaW50ZiAtIEZvcm1hdCBhIHN0cmluZyBmcm9tIGJpbmFyeSBhcmd1bWVudHMgYW5kIHBsYWNlIGl0IGluIGEgYnVmZmVyCisgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIHBsYWNlIHRoZSByZXN1bHQgaW50bworICogQHNpemU6IFRoZSBzaXplIG9mIHRoZSBidWZmZXIsIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCBzcGFjZQorICogQGZtdDogVGhlIGZvcm1hdCBzdHJpbmcgdG8gdXNlCisgKiBAYmluX2J1ZjogQmluYXJ5IGFyZ3VtZW50cyBmb3IgdGhlIGZvcm1hdCBzdHJpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGxpa2UgQzk5IHZzbnByaW50ZiwgYnV0IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdnNucHJpbnRmIGdldHMKKyAqIGFyZ3VtZW50cyBmcm9tIHN0YWNrLCBhbmQgYnN0cl9wcmludGYgZ2V0cyBhcmd1bWVudHMgZnJvbSBAYmluX2J1ZiB3aGljaCBpcworICogYSBiaW5hcnkgYnVmZmVyIHRoYXQgZ2VuZXJhdGVkIGJ5IHZiaW5fcHJpbnRmLgorICoKKyAqIFRoZSBmb3JtYXQgZm9sbG93cyBDOTkgdnNucHJpbnRmLCBidXQgaGFzIHNvbWUgZXh0ZW5zaW9uczoKKyAqICBzZWUgdnNucHJpbnRmIGNvbW1lbnQgZm9yIGRldGFpbHMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd2hpY2ggd291bGQKKyAqIGJlIGdlbmVyYXRlZCBmb3IgdGhlIGdpdmVuIGlucHV0LCBleGNsdWRpbmcgdGhlIHRyYWlsaW5nCisgKiAnXDAnLCBhcyBwZXIgSVNPIEM5OS4gSWYgeW91IHdhbnQgdG8gaGF2ZSB0aGUgZXhhY3QKKyAqIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gaW50byBAYnVmIGFzIHJldHVybiB2YWx1ZQorICogKG5vdCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nICdcMCcpLCB1c2UgdnNjbnByaW50ZigpLiBJZiB0aGUKKyAqIHJldHVybiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQHNpemUsIHRoZSByZXN1bHRpbmcKKyAqIHN0cmluZyBpcyB0cnVuY2F0ZWQuCisgKi8KK2ludCBic3RyX3ByaW50ZihjaGFyICpidWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluX2J1ZikKK3sKKwlzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYyA9IHswfTsKKwljaGFyICpzdHIsICplbmQ7CisJY29uc3QgY2hhciAqYXJncyA9IChjb25zdCBjaGFyICopYmluX2J1ZjsKKworCWlmIChXQVJOX09OX09OQ0Uoc2l6ZSA+IElOVF9NQVgpKQorCQlyZXR1cm4gMDsKKworCXN0ciA9IGJ1ZjsKKwllbmQgPSBidWYgKyBzaXplOworCisjZGVmaW5lIGdldF9hcmcodHlwZSkJCQkJCQkJXAorKHsJCQkJCQkJCQlcCisJdHlwZW9mKHR5cGUpIHZhbHVlOwkJCQkJCVwKKwlpZiAoc2l6ZW9mKHR5cGUpID09IDgpIHsJCQkJCVwKKwkJYXJncyA9IFBUUl9BTElHTihhcmdzLCBzaXplb2YodTMyKSk7CQkJXAorCQkqKHUzMiAqKSZ2YWx1ZSA9ICoodTMyICopYXJnczsJCQkJXAorCQkqKCh1MzIgKikmdmFsdWUgKyAxKSA9ICoodTMyICopKGFyZ3MgKyA0KTsJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCWFyZ3MgPSBQVFJfQUxJR04oYXJncywgc2l6ZW9mKHR5cGUpKTsJCQlcCisJCXZhbHVlID0gKih0eXBlb2YodHlwZSkgKilhcmdzOwkJCQlcCisJfQkJCQkJCQkJXAorCWFyZ3MgKz0gc2l6ZW9mKHR5cGUpOwkJCQkJCVwKKwl2YWx1ZTsJCQkJCQkJCVwKK30pCisKKwkvKiBNYWtlIHN1cmUgZW5kIGlzIGFsd2F5cyA+PSBidWYgKi8KKwlpZiAoZW5kIDwgYnVmKSB7CisJCWVuZCA9ICgodm9pZCAqKS0xKTsKKwkJc2l6ZSA9IGVuZCAtIGJ1ZjsKKwl9CisKKwl3aGlsZSAoKmZtdCkgeworCQljb25zdCBjaGFyICpvbGRfZm10ID0gZm10OworCQlpbnQgcmVhZCA9IGZvcm1hdF9kZWNvZGUoZm10LCAmc3BlYyk7CisKKwkJZm10ICs9IHJlYWQ7CisKKwkJc3dpdGNoIChzcGVjLnR5cGUpIHsKKwkJY2FzZSBGT1JNQVRfVFlQRV9OT05FOiB7CisJCQlpbnQgY29weSA9IHJlYWQ7CisJCQlpZiAoc3RyIDwgZW5kKSB7CisJCQkJaWYgKGNvcHkgPiBlbmQgLSBzdHIpCisJCQkJCWNvcHkgPSBlbmQgLSBzdHI7CisJCQkJbWVtY3B5KHN0ciwgb2xkX2ZtdCwgY29weSk7CisJCQl9CisJCQlzdHIgKz0gcmVhZDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9XSURUSDoKKwkJCXNldF9maWVsZF93aWR0aCgmc3BlYywgZ2V0X2FyZyhpbnQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRk9STUFUX1RZUEVfUFJFQ0lTSU9OOgorCQkJc2V0X3ByZWNpc2lvbigmc3BlYywgZ2V0X2FyZyhpbnQpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRk9STUFUX1RZUEVfQ0hBUjogeworCQkJY2hhciBjOworCisJCQlpZiAoIShzcGVjLmZsYWdzICYgTEVGVCkpIHsKKwkJCQl3aGlsZSAoLS1zcGVjLmZpZWxkX3dpZHRoID4gMCkgeworCQkJCQlpZiAoc3RyIDwgZW5kKQorCQkJCQkJKnN0ciA9ICcgJzsKKwkJCQkJKytzdHI7CisJCQkJfQorCQkJfQorCQkJYyA9ICh1bnNpZ25lZCBjaGFyKSBnZXRfYXJnKGNoYXIpOworCQkJaWYgKHN0ciA8IGVuZCkKKwkJCQkqc3RyID0gYzsKKwkJCSsrc3RyOworCQkJd2hpbGUgKC0tc3BlYy5maWVsZF93aWR0aCA+IDApIHsKKwkJCQlpZiAoc3RyIDwgZW5kKQorCQkJCQkqc3RyID0gJyAnOworCQkJCSsrc3RyOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQljYXNlIEZPUk1BVF9UWVBFX1NUUjogeworCQkJY29uc3QgY2hhciAqc3RyX2FyZyA9IGFyZ3M7CisJCQlhcmdzICs9IHN0cmxlbihzdHJfYXJnKSArIDE7CisJCQlzdHIgPSBzdHJpbmcoc3RyLCBlbmQsIChjaGFyICopc3RyX2FyZywgc3BlYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgRk9STUFUX1RZUEVfUFRSOgorCQkJc3RyID0gcG9pbnRlcihmbXQsIHN0ciwgZW5kLCBnZXRfYXJnKHZvaWQgKiksIHNwZWMpOworCQkJd2hpbGUgKGlzYWxudW0oKmZtdCkpCisJCQkJZm10Kys7CisJCQlicmVhazsKKworCQljYXNlIEZPUk1BVF9UWVBFX1BFUkNFTlRfQ0hBUjoKKwkJCWlmIChzdHIgPCBlbmQpCisJCQkJKnN0ciA9ICclJzsKKwkJCSsrc3RyOworCQkJYnJlYWs7CisKKwkJY2FzZSBGT1JNQVRfVFlQRV9JTlZBTElEOgorCQkJZ290byBvdXQ7CisKKwkJZGVmYXVsdDogeworCQkJdW5zaWduZWQgbG9uZyBsb25nIG51bTsKKworCQkJc3dpdGNoIChzcGVjLnR5cGUpIHsKKworCQkJY2FzZSBGT1JNQVRfVFlQRV9MT05HX0xPTkc6CisJCQkJbnVtID0gZ2V0X2FyZyhsb25nIGxvbmcpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9VTE9ORzoKKwkJCWNhc2UgRk9STUFUX1RZUEVfTE9ORzoKKwkJCQludW0gPSBnZXRfYXJnKHVuc2lnbmVkIGxvbmcpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9TSVpFX1Q6CisJCQkJbnVtID0gZ2V0X2FyZyhzaXplX3QpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9QVFJESUZGOgorCQkJCW51bSA9IGdldF9hcmcocHRyZGlmZl90KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfVUJZVEU6CisJCQkJbnVtID0gZ2V0X2FyZyh1bnNpZ25lZCBjaGFyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfQllURToKKwkJCQludW0gPSBnZXRfYXJnKHNpZ25lZCBjaGFyKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfVVNIT1JUOgorCQkJCW51bSA9IGdldF9hcmcodW5zaWduZWQgc2hvcnQpOworCQkJCWJyZWFrOworCQkJY2FzZSBGT1JNQVRfVFlQRV9TSE9SVDoKKwkJCQludW0gPSBnZXRfYXJnKHNob3J0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfVUlOVDoKKwkJCQludW0gPSBnZXRfYXJnKHVuc2lnbmVkIGludCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW51bSA9IGdldF9hcmcoaW50KTsKKwkJCX0KKworCQkJc3RyID0gbnVtYmVyKHN0ciwgZW5kLCBudW0sIHNwZWMpOworCQl9IC8qIGRlZmF1bHQ6ICovCisJCX0gLyogc3dpdGNoKHNwZWMudHlwZSkgKi8KKwl9IC8qIHdoaWxlKCpmbXQpICovCisKK291dDoKKwlpZiAoc2l6ZSA+IDApIHsKKwkJaWYgKHN0ciA8IGVuZCkKKwkJCSpzdHIgPSAnXDAnOworCQllbHNlCisJCQllbmRbLTFdID0gJ1wwJzsKKwl9CisKKyN1bmRlZiBnZXRfYXJnCisKKwkvKiB0aGUgdHJhaWxpbmcgbnVsbCBieXRlIGRvZXNuJ3QgY291bnQgdG93YXJkcyB0aGUgdG90YWwgKi8KKwlyZXR1cm4gc3RyIC0gYnVmOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnN0cl9wcmludGYpOworCisvKioKKyAqIGJwcmludGYgLSBQYXJzZSBhIGZvcm1hdCBzdHJpbmcgYW5kIHBsYWNlIGFyZ3MnIGJpbmFyeSB2YWx1ZSBpbiBhIGJ1ZmZlcgorICogQGJpbl9idWY6IFRoZSBidWZmZXIgdG8gcGxhY2UgYXJncycgYmluYXJ5IHZhbHVlCisgKiBAc2l6ZTogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlcihieSB3b3JkcygzMmJpdHMpLCBub3QgY2hhcmFjdGVycykKKyAqIEBmbXQ6IFRoZSBmb3JtYXQgc3RyaW5nIHRvIHVzZQorICogQC4uLjogQXJndW1lbnRzIGZvciB0aGUgZm9ybWF0IHN0cmluZworICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygd29yZHModTMyKSB3cml0dGVuCisgKiBpbnRvIEBiaW5fYnVmLgorICovCitpbnQgYnByaW50Zih1MzIgKmJpbl9idWYsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldDsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJcmV0ID0gdmJpbl9wcmludGYoYmluX2J1Ziwgc2l6ZSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwoYnByaW50Zik7CisKKyNlbmRpZiAvKiBDT05GSUdfQklOQVJZX1BSSU5URiAqLworCisvKioKKyAqIHZzc2NhbmYgLSBVbmZvcm1hdCBhIGJ1ZmZlciBpbnRvIGEgbGlzdCBvZiBhcmd1bWVudHMKKyAqIEBidWY6CWlucHV0IGJ1ZmZlcgorICogQGZtdDoJZm9ybWF0IG9mIGJ1ZmZlcgorICogQGFyZ3M6CWFyZ3VtZW50cworICovCitpbnQgdnNzY2FuZihjb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKQoreworCWNvbnN0IGNoYXIgKnN0ciA9IGJ1ZjsKKwljaGFyICpuZXh0OworCWNoYXIgZGlnaXQ7CisJaW50IG51bSA9IDA7CisJdTggcXVhbGlmaWVyOworCXVuc2lnbmVkIGludCBiYXNlOworCXVuaW9uIHsKKwkJbG9uZyBsb25nIHM7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB1OworCX0gdmFsOworCXMxNiBmaWVsZF93aWR0aDsKKwlib29sIGlzX3NpZ247CisKKwl3aGlsZSAoKmZtdCkgeworCQkvKiBza2lwIGFueSB3aGl0ZSBzcGFjZSBpbiBmb3JtYXQgKi8KKwkJLyogd2hpdGUgc3BhY2UgaW4gZm9ybWF0IG1hdGNocyBhbnkgYW1vdW50IG9mCisJCSAqIHdoaXRlIHNwYWNlLCBpbmNsdWRpbmcgbm9uZSwgaW4gdGhlIGlucHV0LgorCQkgKi8KKwkJaWYgKGlzc3BhY2UoKmZtdCkpIHsKKwkJCWZtdCA9IHNraXBfc3BhY2VzKCsrZm10KTsKKwkJCXN0ciA9IHNraXBfc3BhY2VzKHN0cik7CisJCX0KKworCQkvKiBhbnl0aGluZyB0aGF0IGlzIG5vdCBhIGNvbnZlcnNpb24gbXVzdCBtYXRjaCBleGFjdGx5ICovCisJCWlmICgqZm10ICE9ICclJyAmJiAqZm10KSB7CisJCQlpZiAoKmZtdCsrICE9ICpzdHIrKykKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCEqZm10KQorCQkJYnJlYWs7CisJCSsrZm10OworCisJCS8qIHNraXAgdGhpcyBjb252ZXJzaW9uLgorCQkgKiBhZHZhbmNlIGJvdGggc3RyaW5ncyB0byBuZXh0IHdoaXRlIHNwYWNlCisJCSAqLworCQlpZiAoKmZtdCA9PSAnKicpIHsKKwkJCWlmICghKnN0cikKKwkJCQlicmVhazsKKwkJCXdoaWxlICghaXNzcGFjZSgqZm10KSAmJiAqZm10ICE9ICclJyAmJiAqZm10KSB7CisJCQkJLyogJyUqWycgbm90IHlldCBzdXBwb3J0ZWQsIGludmFsaWQgZm9ybWF0ICovCisJCQkJaWYgKCpmbXQgPT0gJ1snKQorCQkJCQlyZXR1cm4gbnVtOworCQkJCWZtdCsrOworCQkJfQorCQkJd2hpbGUgKCFpc3NwYWNlKCpzdHIpICYmICpzdHIpCisJCQkJc3RyKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGdldCBmaWVsZCB3aWR0aCAqLworCQlmaWVsZF93aWR0aCA9IC0xOworCQlpZiAoaXNkaWdpdCgqZm10KSkgeworCQkJZmllbGRfd2lkdGggPSBza2lwX2F0b2koJmZtdCk7CisJCQlpZiAoZmllbGRfd2lkdGggPD0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIGdldCBjb252ZXJzaW9uIHF1YWxpZmllciAqLworCQlxdWFsaWZpZXIgPSAtMTsKKwkJaWYgKCpmbXQgPT0gJ2gnIHx8IF90b2xvd2VyKCpmbXQpID09ICdsJyB8fAorCQkgICAgKmZtdCA9PSAneicpIHsKKwkJCXF1YWxpZmllciA9ICpmbXQrKzsKKwkJCWlmICh1bmxpa2VseShxdWFsaWZpZXIgPT0gKmZtdCkpIHsKKwkJCQlpZiAocXVhbGlmaWVyID09ICdoJykgeworCQkJCQlxdWFsaWZpZXIgPSAnSCc7CisJCQkJCWZtdCsrOworCQkJCX0gZWxzZSBpZiAocXVhbGlmaWVyID09ICdsJykgeworCQkJCQlxdWFsaWZpZXIgPSAnTCc7CisJCQkJCWZtdCsrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICghKmZtdCkKKwkJCWJyZWFrOworCisJCWlmICgqZm10ID09ICduJykgeworCQkJLyogcmV0dXJuIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgc28gZmFyICovCisJCQkqdmFfYXJnKGFyZ3MsIGludCAqKSA9IHN0ciAtIGJ1ZjsKKwkJCSsrZm10OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoISpzdHIpCisJCQlicmVhazsKKworCQliYXNlID0gMTA7CisJCWlzX3NpZ24gPSBmYWxzZTsKKworCQlzd2l0Y2ggKCpmbXQrKykgeworCQljYXNlICdjJzoKKwkJeworCQkJY2hhciAqcyA9IChjaGFyICopdmFfYXJnKGFyZ3MsIGNoYXIqKTsKKwkJCWlmIChmaWVsZF93aWR0aCA9PSAtMSkKKwkJCQlmaWVsZF93aWR0aCA9IDE7CisJCQlkbyB7CisJCQkJKnMrKyA9ICpzdHIrKzsKKwkJCX0gd2hpbGUgKC0tZmllbGRfd2lkdGggPiAwICYmICpzdHIpOworCQkJbnVtKys7CisJCX0KKwkJY29udGludWU7CisJCWNhc2UgJ3MnOgorCQl7CisJCQljaGFyICpzID0gKGNoYXIgKil2YV9hcmcoYXJncywgY2hhciAqKTsKKwkJCWlmIChmaWVsZF93aWR0aCA9PSAtMSkKKwkJCQlmaWVsZF93aWR0aCA9IFNIUlRfTUFYOworCQkJLyogZmlyc3QsIHNraXAgbGVhZGluZyB3aGl0ZSBzcGFjZSBpbiBidWZmZXIgKi8KKwkJCXN0ciA9IHNraXBfc3BhY2VzKHN0cik7CisKKwkJCS8qIG5vdyBjb3B5IHVudGlsIG5leHQgd2hpdGUgc3BhY2UgKi8KKwkJCXdoaWxlICgqc3RyICYmICFpc3NwYWNlKCpzdHIpICYmIGZpZWxkX3dpZHRoLS0pCisJCQkJKnMrKyA9ICpzdHIrKzsKKwkJCSpzID0gJ1wwJzsKKwkJCW51bSsrOworCQl9CisJCWNvbnRpbnVlOworCQkvKgorCQkgKiBXYXJuaW5nOiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSAnWycgY29udmVyc2lvbiBzcGVjaWZpZXIKKwkJICogZGV2aWF0ZXMgZnJvbSBpdHMgZ2xpYmMgY291bnRlcnBhcnQgaW4gdGhlIGZvbGxvd2luZyB3YXlzOgorCQkgKiAoMSkgSXQgZG9lcyBOT1Qgc3VwcG9ydCByYW5nZXMgaS5lLiAnLScgaXMgTk9UIGEgc3BlY2lhbAorCQkgKiAgICAgY2hhcmFjdGVyCisJCSAqICgyKSBJdCBjYW5ub3QgbWF0Y2ggdGhlIGNsb3NpbmcgYnJhY2tldCAnXScgaXRzZWxmCisJCSAqICgzKSBBIGZpZWxkIHdpZHRoIGlzIHJlcXVpcmVkCisJCSAqICg0KSAnJSpbJyAoZGlzY2FyZCBtYXRjaGluZyBpbnB1dCkgaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQKKwkJICoKKwkJICogRXhhbXBsZSB1c2FnZToKKwkJICogcmV0ID0gc3NjYW5mKCIwMDowYTo5NSIsIiUyW146XTolMlteOl06JTJbXjpdIiwKKwkJICoJCWJ1ZjEsIGJ1ZjIsIGJ1ZjMpOworCQkgKiBpZiAocmV0IDwgMykKKwkJICogICAgLy8gZXRjLi4KKwkJICovCisJCWNhc2UgJ1snOgorCQl7CisJCQljaGFyICpzID0gKGNoYXIgKil2YV9hcmcoYXJncywgY2hhciAqKTsKKwkJCURFQ0xBUkVfQklUTUFQKHNldCwgMjU2KSA9IHswfTsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSAwOworCQkJYm9vbCBuZWdhdGUgPSAoKmZtdCA9PSAnXicpOworCisJCQkvKiBmaWVsZCB3aWR0aCBpcyByZXF1aXJlZCAqLworCQkJaWYgKGZpZWxkX3dpZHRoID09IC0xKQorCQkJCXJldHVybiBudW07CisKKwkJCWlmIChuZWdhdGUpCisJCQkJKytmbXQ7CisKKwkJCWZvciAoIDsgKmZtdCAmJiAqZm10ICE9ICddJzsgKytmbXQsICsrbGVuKQorCQkJCXNldF9iaXQoKHU4KSpmbXQsIHNldCk7CisKKwkJCS8qIG5vICddJyBvciBubyBjaGFyYWN0ZXIgc2V0IGZvdW5kICovCisJCQlpZiAoISpmbXQgfHwgIWxlbikKKwkJCQlyZXR1cm4gbnVtOworCQkJKytmbXQ7CisKKwkJCWlmIChuZWdhdGUpIHsKKwkJCQliaXRtYXBfY29tcGxlbWVudChzZXQsIHNldCwgMjU2KTsKKwkJCQkvKiBleGNsdWRlIG51bGwgJ1wwJyBieXRlICovCisJCQkJY2xlYXJfYml0KDAsIHNldCk7CisJCQl9CisKKwkJCS8qIG1hdGNoIG11c3QgYmUgbm9uLWVtcHR5ICovCisJCQlpZiAoIXRlc3RfYml0KCh1OCkqc3RyLCBzZXQpKQorCQkJCXJldHVybiBudW07CisKKwkJCXdoaWxlICh0ZXN0X2JpdCgodTgpKnN0ciwgc2V0KSAmJiBmaWVsZF93aWR0aC0tKQorCQkJCSpzKysgPSAqc3RyKys7CisJCQkqcyA9ICdcMCc7CisJCQkrK251bTsKKwkJfQorCQljb250aW51ZTsKKwkJY2FzZSAnbyc6CisJCQliYXNlID0gODsKKwkJCWJyZWFrOworCQljYXNlICd4JzoKKwkJY2FzZSAnWCc6CisJCQliYXNlID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQliYXNlID0gMDsKKwkJY2FzZSAnZCc6CisJCQlpc19zaWduID0gdHJ1ZTsKKwkJY2FzZSAndSc6CisJCQlicmVhazsKKwkJY2FzZSAnJSc6CisJCQkvKiBsb29raW5nIGZvciAnJScgaW4gc3RyICovCisJCQlpZiAoKnN0cisrICE9ICclJykKKwkJCQlyZXR1cm4gbnVtOworCQkJY29udGludWU7CisJCWRlZmF1bHQ6CisJCQkvKiBpbnZhbGlkIGZvcm1hdDsgc3RvcCBoZXJlICovCisJCQlyZXR1cm4gbnVtOworCQl9CisKKwkJLyogaGF2ZSBzb21lIHNvcnQgb2YgaW50ZWdlciBjb252ZXJzaW9uLgorCQkgKiBmaXJzdCwgc2tpcCB3aGl0ZSBzcGFjZSBpbiBidWZmZXIuCisJCSAqLworCQlzdHIgPSBza2lwX3NwYWNlcyhzdHIpOworCisJCWRpZ2l0ID0gKnN0cjsKKwkJaWYgKGlzX3NpZ24gJiYgZGlnaXQgPT0gJy0nKQorCQkJZGlnaXQgPSAqKHN0ciArIDEpOworCisJCWlmICghZGlnaXQKKwkJICAgIHx8IChiYXNlID09IDE2ICYmICFpc3hkaWdpdChkaWdpdCkpCisJCSAgICB8fCAoYmFzZSA9PSAxMCAmJiAhaXNkaWdpdChkaWdpdCkpCisJCSAgICB8fCAoYmFzZSA9PSA4ICYmICghaXNkaWdpdChkaWdpdCkgfHwgZGlnaXQgPiAnNycpKQorCQkgICAgfHwgKGJhc2UgPT0gMCAmJiAhaXNkaWdpdChkaWdpdCkpKQorCQkJYnJlYWs7CisKKwkJaWYgKGlzX3NpZ24pCisJCQl2YWwucyA9IHF1YWxpZmllciAhPSAnTCcgPworCQkJCXNpbXBsZV9zdHJ0b2woc3RyLCAmbmV4dCwgYmFzZSkgOgorCQkJCXNpbXBsZV9zdHJ0b2xsKHN0ciwgJm5leHQsIGJhc2UpOworCQllbHNlCisJCQl2YWwudSA9IHF1YWxpZmllciAhPSAnTCcgPworCQkJCXNpbXBsZV9zdHJ0b3VsKHN0ciwgJm5leHQsIGJhc2UpIDoKKwkJCQlzaW1wbGVfc3RydG91bGwoc3RyLCAmbmV4dCwgYmFzZSk7CisKKwkJaWYgKGZpZWxkX3dpZHRoID4gMCAmJiBuZXh0IC0gc3RyID4gZmllbGRfd2lkdGgpIHsKKwkJCWlmIChiYXNlID09IDApCisJCQkJX3BhcnNlX2ludGVnZXJfZml4dXBfcmFkaXgoc3RyLCAmYmFzZSk7CisJCQl3aGlsZSAobmV4dCAtIHN0ciA+IGZpZWxkX3dpZHRoKSB7CisJCQkJaWYgKGlzX3NpZ24pCisJCQkJCXZhbC5zID0gZGl2X3M2NCh2YWwucywgYmFzZSk7CisJCQkJZWxzZQorCQkJCQl2YWwudSA9IGRpdl91NjQodmFsLnUsIGJhc2UpOworCQkJCS0tbmV4dDsKKwkJCX0KKwkJfQorCisJCXN3aXRjaCAocXVhbGlmaWVyKSB7CisJCWNhc2UgJ0gnOgkvKiB0aGF0J3MgJ2hoJyBpbiBmb3JtYXQgKi8KKwkJCWlmIChpc19zaWduKQorCQkJCSp2YV9hcmcoYXJncywgc2lnbmVkIGNoYXIgKikgPSB2YWwuczsKKwkJCWVsc2UKKwkJCQkqdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGNoYXIgKikgPSB2YWwudTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCWlmIChpc19zaWduKQorCQkJCSp2YV9hcmcoYXJncywgc2hvcnQgKikgPSB2YWwuczsKKwkJCWVsc2UKKwkJCQkqdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIHNob3J0ICopID0gdmFsLnU7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlpZiAoaXNfc2lnbikKKwkJCQkqdmFfYXJnKGFyZ3MsIGxvbmcgKikgPSB2YWwuczsKKwkJCWVsc2UKKwkJCQkqdmFfYXJnKGFyZ3MsIHVuc2lnbmVkIGxvbmcgKikgPSB2YWwudTsKKwkJCWJyZWFrOworCQljYXNlICdMJzoKKwkJCWlmIChpc19zaWduKQorCQkJCSp2YV9hcmcoYXJncywgbG9uZyBsb25nICopID0gdmFsLnM7CisJCQllbHNlCisJCQkJKnZhX2FyZyhhcmdzLCB1bnNpZ25lZCBsb25nIGxvbmcgKikgPSB2YWwudTsKKwkJCWJyZWFrOworCQljYXNlICd6JzoKKwkJCSp2YV9hcmcoYXJncywgc2l6ZV90ICopID0gdmFsLnU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmIChpc19zaWduKQorCQkJCSp2YV9hcmcoYXJncywgaW50ICopID0gdmFsLnM7CisJCQllbHNlCisJCQkJKnZhX2FyZyhhcmdzLCB1bnNpZ25lZCBpbnQgKikgPSB2YWwudTsKKwkJCWJyZWFrOworCQl9CisJCW51bSsrOworCisJCWlmICghbmV4dCkKKwkJCWJyZWFrOworCQlzdHIgPSBuZXh0OworCX0KKworCXJldHVybiBudW07Cit9CitFWFBPUlRfU1lNQk9MKHZzc2NhbmYpOworCisvKioKKyAqIHNzY2FuZiAtIFVuZm9ybWF0IGEgYnVmZmVyIGludG8gYSBsaXN0IG9mIGFyZ3VtZW50cworICogQGJ1ZjoJaW5wdXQgYnVmZmVyCisgKiBAZm10Oglmb3JtYXR0aW5nIG9mIGJ1ZmZlcgorICogQC4uLjoJcmVzdWx0aW5nIGFyZ3VtZW50cworICovCitpbnQgc3NjYW5mKGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCWludCBpOworCisJdmFfc3RhcnQoYXJncywgZm10KTsKKwlpID0gdnNzY2FuZihidWYsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCisJcmV0dXJuIGk7Cit9CitFWFBPUlRfU1lNQk9MKHNzY2FuZik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi93aW5fbWlubWF4LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi93aW5fbWlubWF4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkYzFjZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3dpbl9taW5tYXguYwpAQCAtMCwwICsxLDk5IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyoqCisgKiBsaWIvbWlubWF4LmM6IHdpbmRvd2VkIG1pbi9tYXggdHJhY2tlcgorICoKKyAqIEthdGhsZWVuIE5pY2hvbHMnIGFsZ29yaXRobSBmb3IgdHJhY2tpbmcgdGhlIG1pbmltdW0gKG9yIG1heGltdW0pCisgKiB2YWx1ZSBvZiBhIGRhdGEgc3RyZWFtIG92ZXIgc29tZSBmaXhlZCB0aW1lIGludGVydmFsLiAgKEUuZy4sCisgKiB0aGUgbWluaW11bSBSVFQgb3ZlciB0aGUgcGFzdCBmaXZlIG1pbnV0ZXMuKSBJdCB1c2VzIGNvbnN0YW50CisgKiBzcGFjZSBhbmQgY29uc3RhbnQgdGltZSBwZXIgdXBkYXRlIHlldCBhbG1vc3QgYWx3YXlzIGRlbGl2ZXJzCisgKiB0aGUgc2FtZSBtaW5pbXVtIGFzIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaGFzIHRvIGtlZXAgYWxsIHRoZQorICogZGF0YSBpbiB0aGUgd2luZG93LgorICoKKyAqIFRoZSBhbGdvcml0aG0ga2VlcHMgdHJhY2sgb2YgdGhlIGJlc3QsIDJuZCBiZXN0ICYgM3JkIGJlc3QgbWluCisgKiB2YWx1ZXMsIG1haW50YWluaW5nIGFuIGludmFyaWFudCB0aGF0IHRoZSBtZWFzdXJlbWVudCB0aW1lIG9mCisgKiB0aGUgbid0aCBiZXN0ID49IG4tMSd0aCBiZXN0LiBJdCBhbHNvIG1ha2VzIHN1cmUgdGhhdCB0aGUgdGhyZWUKKyAqIHZhbHVlcyBhcmUgd2lkZWx5IHNlcGFyYXRlZCBpbiB0aGUgdGltZSB3aW5kb3cgc2luY2UgdGhhdCBib3VuZHMKKyAqIHRoZSB3b3JzZSBjYXNlIGVycm9yIHdoZW4gdGhhdCBkYXRhIGlzIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICogb3ZlciB0aGUgd2luZG93LgorICoKKyAqIFVwb24gZ2V0dGluZyBhIG5ldyBtaW4sIHdlIGNhbiBmb3JnZXQgZXZlcnl0aGluZyBlYXJsaWVyIGJlY2F1c2UKKyAqIGl0IGhhcyBubyB2YWx1ZSAtIHRoZSBuZXcgbWluIGlzIDw9IGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgd2luZG93CisgKiBieSBkZWZpbml0aW9uIGFuZCBpdCdzIHRoZSBtb3N0IHJlY2VudC4gU28gd2UgcmVzdGFydCBmcmVzaCBvbgorICogZXZlcnkgbmV3IG1pbiBhbmQgb3ZlcndyaXRlcyAybmQgJiAzcmQgY2hvaWNlcy4gVGhlIHNhbWUgcHJvcGVydHkKKyAqIGhvbGRzIGZvciAybmQgJiAzcmQgYmVzdC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dpbl9taW5tYXguaD4KKworLyogQXMgdGltZSBhZHZhbmNlcywgdXBkYXRlIHRoZSAxc3QsIDJuZCwgYW5kIDNyZCBjaG9pY2VzLiAqLworc3RhdGljIHUzMiBtaW5tYXhfc3Vid2luX3VwZGF0ZShzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLAorCQkJCWNvbnN0IHN0cnVjdCBtaW5tYXhfc2FtcGxlICp2YWwpCit7CisJdTMyIGR0ID0gdmFsLT50IC0gbS0+c1swXS50OworCisJaWYgKHVubGlrZWx5KGR0ID4gd2luKSkgeworCQkvKgorCQkgKiBQYXNzZWQgZW50aXJlIHdpbmRvdyB3aXRob3V0IGEgbmV3IHZhbCBzbyBtYWtlIDJuZAorCQkgKiBjaG9pY2UgdGhlIG5ldyB2YWwgJiAzcmQgY2hvaWNlIHRoZSBuZXcgMm5kIGNob2ljZS4KKwkJICogd2UgbWF5IGhhdmUgdG8gaXRlcmF0ZSB0aGlzIHNpbmNlIG91ciAybmQgY2hvaWNlCisJCSAqIG1heSBhbHNvIGJlIG91dHNpZGUgdGhlIHdpbmRvdyAod2UgY2hlY2tlZCBvbiBlbnRyeQorCQkgKiB0aGF0IHRoZSB0aGlyZCBjaG9pY2Ugd2FzIGluIHRoZSB3aW5kb3cpLgorCQkgKi8KKwkJbS0+c1swXSA9IG0tPnNbMV07CisJCW0tPnNbMV0gPSBtLT5zWzJdOworCQltLT5zWzJdID0gKnZhbDsKKwkJaWYgKHVubGlrZWx5KHZhbC0+dCAtIG0tPnNbMF0udCA+IHdpbikpIHsKKwkJCW0tPnNbMF0gPSBtLT5zWzFdOworCQkJbS0+c1sxXSA9IG0tPnNbMl07CisJCQltLT5zWzJdID0gKnZhbDsKKwkJfQorCX0gZWxzZSBpZiAodW5saWtlbHkobS0+c1sxXS50ID09IG0tPnNbMF0udCkgJiYgZHQgPiB3aW4vNCkgeworCQkvKgorCQkgKiBXZSd2ZSBwYXNzZWQgYSBxdWFydGVyIG9mIHRoZSB3aW5kb3cgd2l0aG91dCBhIG5ldyB2YWwKKwkJICogc28gdGFrZSBhIDJuZCBjaG9pY2UgZnJvbSB0aGUgMm5kIHF1YXJ0ZXIgb2YgdGhlIHdpbmRvdy4KKwkJICovCisJCW0tPnNbMl0gPSBtLT5zWzFdID0gKnZhbDsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KG0tPnNbMl0udCA9PSBtLT5zWzFdLnQpICYmIGR0ID4gd2luLzIpIHsKKwkJLyoKKwkJICogV2UndmUgcGFzc2VkIGhhbGYgdGhlIHdpbmRvdyB3aXRob3V0IGZpbmRpbmcgYSBuZXcgdmFsCisJCSAqIHNvIHRha2UgYSAzcmQgY2hvaWNlIGZyb20gdGhlIGxhc3QgaGFsZiBvZiB0aGUgd2luZG93CisJCSAqLworCQltLT5zWzJdID0gKnZhbDsKKwl9CisJcmV0dXJuIG0tPnNbMF0udjsKK30KKworLyogQ2hlY2sgaWYgbmV3IG1lYXN1cmVtZW50IHVwZGF0ZXMgdGhlIDFzdCwgMm5kIG9yIDNyZCBjaG9pY2UgbWF4LiAqLwordTMyIG1pbm1heF9ydW5uaW5nX21heChzdHJ1Y3QgbWlubWF4ICptLCB1MzIgd2luLCB1MzIgdCwgdTMyIG1lYXMpCit7CisJc3RydWN0IG1pbm1heF9zYW1wbGUgdmFsID0geyAudCA9IHQsIC52ID0gbWVhcyB9OworCisJaWYgKHVubGlrZWx5KHZhbC52ID49IG0tPnNbMF0udikgfHwJICAvKiBmb3VuZCBuZXcgbWF4PyAqLworCSAgICB1bmxpa2VseSh2YWwudCAtIG0tPnNbMl0udCA+IHdpbikpCSAgLyogbm90aGluZyBsZWZ0IGluIHdpbmRvdz8gKi8KKwkJcmV0dXJuIG1pbm1heF9yZXNldChtLCB0LCBtZWFzKTsgIC8qIGZvcmdldCBlYXJsaWVyIHNhbXBsZXMgKi8KKworCWlmICh1bmxpa2VseSh2YWwudiA+PSBtLT5zWzFdLnYpKQorCQltLT5zWzJdID0gbS0+c1sxXSA9IHZhbDsKKwllbHNlIGlmICh1bmxpa2VseSh2YWwudiA+PSBtLT5zWzJdLnYpKQorCQltLT5zWzJdID0gdmFsOworCisJcmV0dXJuIG1pbm1heF9zdWJ3aW5fdXBkYXRlKG0sIHdpbiwgJnZhbCk7Cit9CitFWFBPUlRfU1lNQk9MKG1pbm1heF9ydW5uaW5nX21heCk7CisKKy8qIENoZWNrIGlmIG5ldyBtZWFzdXJlbWVudCB1cGRhdGVzIHRoZSAxc3QsIDJuZCBvciAzcmQgY2hvaWNlIG1pbi4gKi8KK3UzMiBtaW5tYXhfcnVubmluZ19taW4oc3RydWN0IG1pbm1heCAqbSwgdTMyIHdpbiwgdTMyIHQsIHUzMiBtZWFzKQoreworCXN0cnVjdCBtaW5tYXhfc2FtcGxlIHZhbCA9IHsgLnQgPSB0LCAudiA9IG1lYXMgfTsKKworCWlmICh1bmxpa2VseSh2YWwudiA8PSBtLT5zWzBdLnYpIHx8CSAgLyogZm91bmQgbmV3IG1pbj8gKi8KKwkgICAgdW5saWtlbHkodmFsLnQgLSBtLT5zWzJdLnQgPiB3aW4pKQkgIC8qIG5vdGhpbmcgbGVmdCBpbiB3aW5kb3c/ICovCisJCXJldHVybiBtaW5tYXhfcmVzZXQobSwgdCwgbWVhcyk7ICAvKiBmb3JnZXQgZWFybGllciBzYW1wbGVzICovCisKKwlpZiAodW5saWtlbHkodmFsLnYgPD0gbS0+c1sxXS52KSkKKwkJbS0+c1syXSA9IG0tPnNbMV0gPSB2YWw7CisJZWxzZSBpZiAodW5saWtlbHkodmFsLnYgPD0gbS0+c1syXS52KSkKKwkJbS0+c1syXSA9IHZhbDsKKworCXJldHVybiBtaW5tYXhfc3Vid2luX3VwZGF0ZShtLCB3aW4sICZ2YWwpOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHhoYXNoLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94eGhhc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTYxZTJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHhoYXNoLmMKQEAgLTAsMCArMSw1MDAgQEAKKy8qCisgKiB4eEhhc2ggLSBFeHRyZW1lbHkgRmFzdCBIYXNoIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChDKSAyMDEyLTIwMTYsIFlhbm4gQ29sbGV0LgorICoKKyAqIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqICAgICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICAgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBwcm9ncmFtIGlzIGR1YWwtbGljZW5zZWQ7IHlvdSBtYXkgc2VsZWN0CisgKiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIG9yIEJTRCBsaWNlbnNlCisgKiAoIkJTRCIpLgorICoKKyAqIFlvdSBjYW4gY29udGFjdCB0aGUgYXV0aG9yIGF0OgorICogLSB4eEhhc2ggaG9tZXBhZ2U6IGh0dHA6Ly9jeWFuNDk3My5naXRodWIuaW8veHhIYXNoLworICogLSB4eEhhc2ggc291cmNlIHJlcG9zaXRvcnk6IGh0dHBzOi8vZ2l0aHViLmNvbS9DeWFuNDk3My94eEhhc2gKKyAqLworCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC94eGhhc2guaD4KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTWFjcm9zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIHh4aF9yb3RsMzIoeCwgcikgKCh4IDw8IHIpIHwgKHggPj4gKDMyIC0gcikpKQorI2RlZmluZSB4eGhfcm90bDY0KHgsIHIpICgoeCA8PCByKSB8ICh4ID4+ICg2NCAtIHIpKSkKKworI2lmZGVmIF9fTElUVExFX0VORElBTgorIyBkZWZpbmUgWFhIX0NQVV9MSVRUTEVfRU5ESUFOIDEKKyNlbHNlCisjIGRlZmluZSBYWEhfQ1BVX0xJVFRMRV9FTkRJQU4gMAorI2VuZGlmCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvbnN0YW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IFBSSU1FMzJfMSA9IDI2NTQ0MzU3NjFVOworc3RhdGljIGNvbnN0IHVpbnQzMl90IFBSSU1FMzJfMiA9IDIyNDY4MjI1MTlVOworc3RhdGljIGNvbnN0IHVpbnQzMl90IFBSSU1FMzJfMyA9IDMyNjY0ODk5MTdVOworc3RhdGljIGNvbnN0IHVpbnQzMl90IFBSSU1FMzJfNCA9ICA2NjgyNjUyNjNVOworc3RhdGljIGNvbnN0IHVpbnQzMl90IFBSSU1FMzJfNSA9ICAzNzQ3NjEzOTNVOworCitzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF8xID0gMTE0MDA3MTQ3ODUwNzQ2OTQ3OTFVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF8yID0gMTQwMjk0NjczNjY4OTcwMTk3MjdVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF8zID0gIDE2MDk1ODc5MjkzOTI4MzkxNjFVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF80ID0gIDk2NTAwMjkyNDIyODc4Mjg1NzlVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgUFJJTUU2NF81ID0gIDI4NzAxNzc0NTAwMTI2MDAyNjFVTEw7CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgVXRpbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHh4aDMyX2NvcHlfc3RhdGUoc3RydWN0IHh4aDMyX3N0YXRlICpkc3QsIGNvbnN0IHN0cnVjdCB4eGgzMl9zdGF0ZSAqc3JjKQoreworCW1lbWNweShkc3QsIHNyYywgc2l6ZW9mKCpkc3QpKTsKK30KK0VYUE9SVF9TWU1CT0woeHhoMzJfY29weV9zdGF0ZSk7CisKK3ZvaWQgeHhoNjRfY29weV9zdGF0ZShzdHJ1Y3QgeHhoNjRfc3RhdGUgKmRzdCwgY29uc3Qgc3RydWN0IHh4aDY0X3N0YXRlICpzcmMpCit7CisJbWVtY3B5KGRzdCwgc3JjLCBzaXplb2YoKmRzdCkpOworfQorRVhQT1JUX1NZTUJPTCh4eGg2NF9jb3B5X3N0YXRlKTsKKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTaW1wbGUgSGFzaCBGdW5jdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQzMl90IHh4aDMyX3JvdW5kKHVpbnQzMl90IHNlZWQsIGNvbnN0IHVpbnQzMl90IGlucHV0KQoreworCXNlZWQgKz0gaW5wdXQgKiBQUklNRTMyXzI7CisJc2VlZCA9IHh4aF9yb3RsMzIoc2VlZCwgMTMpOworCXNlZWQgKj0gUFJJTUUzMl8xOworCXJldHVybiBzZWVkOworfQorCit1aW50MzJfdCB4eGgzMihjb25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6ZV90IGxlbiwgY29uc3QgdWludDMyX3Qgc2VlZCkKK3sKKwljb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilpbnB1dDsKKwljb25zdCB1aW50OF90ICpiX2VuZCA9IHAgKyBsZW47CisJdWludDMyX3QgaDMyOworCisJaWYgKGxlbiA+PSAxNikgeworCQljb25zdCB1aW50OF90ICpjb25zdCBsaW1pdCA9IGJfZW5kIC0gMTY7CisJCXVpbnQzMl90IHYxID0gc2VlZCArIFBSSU1FMzJfMSArIFBSSU1FMzJfMjsKKwkJdWludDMyX3QgdjIgPSBzZWVkICsgUFJJTUUzMl8yOworCQl1aW50MzJfdCB2MyA9IHNlZWQgKyAwOworCQl1aW50MzJfdCB2NCA9IHNlZWQgLSBQUklNRTMyXzE7CisKKwkJZG8geworCQkJdjEgPSB4eGgzMl9yb3VuZCh2MSwgZ2V0X3VuYWxpZ25lZF9sZTMyKHApKTsKKwkJCXAgKz0gNDsKKwkJCXYyID0geHhoMzJfcm91bmQodjIsIGdldF91bmFsaWduZWRfbGUzMihwKSk7CisJCQlwICs9IDQ7CisJCQl2MyA9IHh4aDMyX3JvdW5kKHYzLCBnZXRfdW5hbGlnbmVkX2xlMzIocCkpOworCQkJcCArPSA0OworCQkJdjQgPSB4eGgzMl9yb3VuZCh2NCwgZ2V0X3VuYWxpZ25lZF9sZTMyKHApKTsKKwkJCXAgKz0gNDsKKwkJfSB3aGlsZSAocCA8PSBsaW1pdCk7CisKKwkJaDMyID0geHhoX3JvdGwzMih2MSwgMSkgKyB4eGhfcm90bDMyKHYyLCA3KSArCisJCQl4eGhfcm90bDMyKHYzLCAxMikgKyB4eGhfcm90bDMyKHY0LCAxOCk7CisJfSBlbHNlIHsKKwkJaDMyID0gc2VlZCArIFBSSU1FMzJfNTsKKwl9CisKKwloMzIgKz0gKHVpbnQzMl90KWxlbjsKKworCXdoaWxlIChwICsgNCA8PSBiX2VuZCkgeworCQloMzIgKz0gZ2V0X3VuYWxpZ25lZF9sZTMyKHApICogUFJJTUUzMl8zOworCQloMzIgPSB4eGhfcm90bDMyKGgzMiwgMTcpICogUFJJTUUzMl80OworCQlwICs9IDQ7CisJfQorCisJd2hpbGUgKHAgPCBiX2VuZCkgeworCQloMzIgKz0gKCpwKSAqIFBSSU1FMzJfNTsKKwkJaDMyID0geHhoX3JvdGwzMihoMzIsIDExKSAqIFBSSU1FMzJfMTsKKwkJcCsrOworCX0KKworCWgzMiBePSBoMzIgPj4gMTU7CisJaDMyICo9IFBSSU1FMzJfMjsKKwloMzIgXj0gaDMyID4+IDEzOworCWgzMiAqPSBQUklNRTMyXzM7CisJaDMyIF49IGgzMiA+PiAxNjsKKworCXJldHVybiBoMzI7Cit9CitFWFBPUlRfU1lNQk9MKHh4aDMyKTsKKworc3RhdGljIHVpbnQ2NF90IHh4aDY0X3JvdW5kKHVpbnQ2NF90IGFjYywgY29uc3QgdWludDY0X3QgaW5wdXQpCit7CisJYWNjICs9IGlucHV0ICogUFJJTUU2NF8yOworCWFjYyA9IHh4aF9yb3RsNjQoYWNjLCAzMSk7CisJYWNjICo9IFBSSU1FNjRfMTsKKwlyZXR1cm4gYWNjOworfQorCitzdGF0aWMgdWludDY0X3QgeHhoNjRfbWVyZ2Vfcm91bmQodWludDY0X3QgYWNjLCB1aW50NjRfdCB2YWwpCit7CisJdmFsID0geHhoNjRfcm91bmQoMCwgdmFsKTsKKwlhY2MgXj0gdmFsOworCWFjYyA9IGFjYyAqIFBSSU1FNjRfMSArIFBSSU1FNjRfNDsKKwlyZXR1cm4gYWNjOworfQorCit1aW50NjRfdCB4eGg2NChjb25zdCB2b2lkICppbnB1dCwgY29uc3Qgc2l6ZV90IGxlbiwgY29uc3QgdWludDY0X3Qgc2VlZCkKK3sKKwljb25zdCB1aW50OF90ICpwID0gKGNvbnN0IHVpbnQ4X3QgKilpbnB1dDsKKwljb25zdCB1aW50OF90ICpjb25zdCBiX2VuZCA9IHAgKyBsZW47CisJdWludDY0X3QgaDY0OworCisJaWYgKGxlbiA+PSAzMikgeworCQljb25zdCB1aW50OF90ICpjb25zdCBsaW1pdCA9IGJfZW5kIC0gMzI7CisJCXVpbnQ2NF90IHYxID0gc2VlZCArIFBSSU1FNjRfMSArIFBSSU1FNjRfMjsKKwkJdWludDY0X3QgdjIgPSBzZWVkICsgUFJJTUU2NF8yOworCQl1aW50NjRfdCB2MyA9IHNlZWQgKyAwOworCQl1aW50NjRfdCB2NCA9IHNlZWQgLSBQUklNRTY0XzE7CisKKwkJZG8geworCQkJdjEgPSB4eGg2NF9yb3VuZCh2MSwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsKKwkJCXAgKz0gODsKKwkJCXYyID0geHhoNjRfcm91bmQodjIsIGdldF91bmFsaWduZWRfbGU2NChwKSk7CisJCQlwICs9IDg7CisJCQl2MyA9IHh4aDY0X3JvdW5kKHYzLCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOworCQkJcCArPSA4OworCQkJdjQgPSB4eGg2NF9yb3VuZCh2NCwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsKKwkJCXAgKz0gODsKKwkJfSB3aGlsZSAocCA8PSBsaW1pdCk7CisKKwkJaDY0ID0geHhoX3JvdGw2NCh2MSwgMSkgKyB4eGhfcm90bDY0KHYyLCA3KSArCisJCQl4eGhfcm90bDY0KHYzLCAxMikgKyB4eGhfcm90bDY0KHY0LCAxOCk7CisJCWg2NCA9IHh4aDY0X21lcmdlX3JvdW5kKGg2NCwgdjEpOworCQloNjQgPSB4eGg2NF9tZXJnZV9yb3VuZChoNjQsIHYyKTsKKwkJaDY0ID0geHhoNjRfbWVyZ2Vfcm91bmQoaDY0LCB2Myk7CisJCWg2NCA9IHh4aDY0X21lcmdlX3JvdW5kKGg2NCwgdjQpOworCisJfSBlbHNlIHsKKwkJaDY0ICA9IHNlZWQgKyBQUklNRTY0XzU7CisJfQorCisJaDY0ICs9ICh1aW50NjRfdClsZW47CisKKwl3aGlsZSAocCArIDggPD0gYl9lbmQpIHsKKwkJY29uc3QgdWludDY0X3QgazEgPSB4eGg2NF9yb3VuZCgwLCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOworCisJCWg2NCBePSBrMTsKKwkJaDY0ID0geHhoX3JvdGw2NChoNjQsIDI3KSAqIFBSSU1FNjRfMSArIFBSSU1FNjRfNDsKKwkJcCArPSA4OworCX0KKworCWlmIChwICsgNCA8PSBiX2VuZCkgeworCQloNjQgXj0gKHVpbnQ2NF90KShnZXRfdW5hbGlnbmVkX2xlMzIocCkpICogUFJJTUU2NF8xOworCQloNjQgPSB4eGhfcm90bDY0KGg2NCwgMjMpICogUFJJTUU2NF8yICsgUFJJTUU2NF8zOworCQlwICs9IDQ7CisJfQorCisJd2hpbGUgKHAgPCBiX2VuZCkgeworCQloNjQgXj0gKCpwKSAqIFBSSU1FNjRfNTsKKwkJaDY0ID0geHhoX3JvdGw2NChoNjQsIDExKSAqIFBSSU1FNjRfMTsKKwkJcCsrOworCX0KKworCWg2NCBePSBoNjQgPj4gMzM7CisJaDY0ICo9IFBSSU1FNjRfMjsKKwloNjQgXj0gaDY0ID4+IDI5OworCWg2NCAqPSBQUklNRTY0XzM7CisJaDY0IF49IGg2NCA+PiAzMjsKKworCXJldHVybiBoNjQ7Cit9CitFWFBPUlRfU1lNQk9MKHh4aDY0KTsKKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEFkdmFuY2VkIEhhc2ggRnVuY3Rpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCB4eGgzMl9yZXNldChzdHJ1Y3QgeHhoMzJfc3RhdGUgKnN0YXRlUHRyLCBjb25zdCB1aW50MzJfdCBzZWVkKQoreworCS8qIHVzZSBhIGxvY2FsIHN0YXRlIGZvciBtZW1jcHkoKSB0byBhdm9pZCBzdHJpY3QtYWxpYXNpbmcgd2FybmluZ3MgKi8KKwlzdHJ1Y3QgeHhoMzJfc3RhdGUgc3RhdGU7CisKKwltZW1zZXQoJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKwlzdGF0ZS52MSA9IHNlZWQgKyBQUklNRTMyXzEgKyBQUklNRTMyXzI7CisJc3RhdGUudjIgPSBzZWVkICsgUFJJTUUzMl8yOworCXN0YXRlLnYzID0gc2VlZCArIDA7CisJc3RhdGUudjQgPSBzZWVkIC0gUFJJTUUzMl8xOworCW1lbWNweShzdGF0ZVB0ciwgJnN0YXRlLCBzaXplb2Yoc3RhdGUpKTsKK30KK0VYUE9SVF9TWU1CT0woeHhoMzJfcmVzZXQpOworCit2b2lkIHh4aDY0X3Jlc2V0KHN0cnVjdCB4eGg2NF9zdGF0ZSAqc3RhdGVQdHIsIGNvbnN0IHVpbnQ2NF90IHNlZWQpCit7CisJLyogdXNlIGEgbG9jYWwgc3RhdGUgZm9yIG1lbWNweSgpIHRvIGF2b2lkIHN0cmljdC1hbGlhc2luZyB3YXJuaW5ncyAqLworCXN0cnVjdCB4eGg2NF9zdGF0ZSBzdGF0ZTsKKworCW1lbXNldCgmc3RhdGUsIDAsIHNpemVvZihzdGF0ZSkpOworCXN0YXRlLnYxID0gc2VlZCArIFBSSU1FNjRfMSArIFBSSU1FNjRfMjsKKwlzdGF0ZS52MiA9IHNlZWQgKyBQUklNRTY0XzI7CisJc3RhdGUudjMgPSBzZWVkICsgMDsKKwlzdGF0ZS52NCA9IHNlZWQgLSBQUklNRTY0XzE7CisJbWVtY3B5KHN0YXRlUHRyLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworfQorRVhQT1JUX1NZTUJPTCh4eGg2NF9yZXNldCk7CisKK2ludCB4eGgzMl91cGRhdGUoc3RydWN0IHh4aDMyX3N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqaW5wdXQsIGNvbnN0IHNpemVfdCBsZW4pCit7CisJY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopaW5wdXQ7CisJY29uc3QgdWludDhfdCAqY29uc3QgYl9lbmQgPSBwICsgbGVuOworCisJaWYgKGlucHV0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdGUtPnRvdGFsX2xlbl8zMiArPSAodWludDMyX3QpbGVuOworCXN0YXRlLT5sYXJnZV9sZW4gfD0gKGxlbiA+PSAxNikgfCAoc3RhdGUtPnRvdGFsX2xlbl8zMiA+PSAxNik7CisKKwlpZiAoc3RhdGUtPm1lbXNpemUgKyBsZW4gPCAxNikgeyAvKiBmaWxsIGluIHRtcCBidWZmZXIgKi8KKwkJbWVtY3B5KCh1aW50OF90ICopKHN0YXRlLT5tZW0zMikgKyBzdGF0ZS0+bWVtc2l6ZSwgaW5wdXQsIGxlbik7CisJCXN0YXRlLT5tZW1zaXplICs9ICh1aW50MzJfdClsZW47CisJCXJldHVybiAwOworCX0KKworCWlmIChzdGF0ZS0+bWVtc2l6ZSkgeyAvKiBzb21lIGRhdGEgbGVmdCBmcm9tIHByZXZpb3VzIHVwZGF0ZSAqLworCQljb25zdCB1aW50MzJfdCAqcDMyID0gc3RhdGUtPm1lbTMyOworCisJCW1lbWNweSgodWludDhfdCAqKShzdGF0ZS0+bWVtMzIpICsgc3RhdGUtPm1lbXNpemUsIGlucHV0LAorCQkJMTYgLSBzdGF0ZS0+bWVtc2l6ZSk7CisKKwkJc3RhdGUtPnYxID0geHhoMzJfcm91bmQoc3RhdGUtPnYxLCBnZXRfdW5hbGlnbmVkX2xlMzIocDMyKSk7CisJCXAzMisrOworCQlzdGF0ZS0+djIgPSB4eGgzMl9yb3VuZChzdGF0ZS0+djIsIGdldF91bmFsaWduZWRfbGUzMihwMzIpKTsKKwkJcDMyKys7CisJCXN0YXRlLT52MyA9IHh4aDMyX3JvdW5kKHN0YXRlLT52MywgZ2V0X3VuYWxpZ25lZF9sZTMyKHAzMikpOworCQlwMzIrKzsKKwkJc3RhdGUtPnY0ID0geHhoMzJfcm91bmQoc3RhdGUtPnY0LCBnZXRfdW5hbGlnbmVkX2xlMzIocDMyKSk7CisJCXAzMisrOworCisJCXAgKz0gMTYtc3RhdGUtPm1lbXNpemU7CisJCXN0YXRlLT5tZW1zaXplID0gMDsKKwl9CisKKwlpZiAocCA8PSBiX2VuZCAtIDE2KSB7CisJCWNvbnN0IHVpbnQ4X3QgKmNvbnN0IGxpbWl0ID0gYl9lbmQgLSAxNjsKKwkJdWludDMyX3QgdjEgPSBzdGF0ZS0+djE7CisJCXVpbnQzMl90IHYyID0gc3RhdGUtPnYyOworCQl1aW50MzJfdCB2MyA9IHN0YXRlLT52MzsKKwkJdWludDMyX3QgdjQgPSBzdGF0ZS0+djQ7CisKKwkJZG8geworCQkJdjEgPSB4eGgzMl9yb3VuZCh2MSwgZ2V0X3VuYWxpZ25lZF9sZTMyKHApKTsKKwkJCXAgKz0gNDsKKwkJCXYyID0geHhoMzJfcm91bmQodjIsIGdldF91bmFsaWduZWRfbGUzMihwKSk7CisJCQlwICs9IDQ7CisJCQl2MyA9IHh4aDMyX3JvdW5kKHYzLCBnZXRfdW5hbGlnbmVkX2xlMzIocCkpOworCQkJcCArPSA0OworCQkJdjQgPSB4eGgzMl9yb3VuZCh2NCwgZ2V0X3VuYWxpZ25lZF9sZTMyKHApKTsKKwkJCXAgKz0gNDsKKwkJfSB3aGlsZSAocCA8PSBsaW1pdCk7CisKKwkJc3RhdGUtPnYxID0gdjE7CisJCXN0YXRlLT52MiA9IHYyOworCQlzdGF0ZS0+djMgPSB2MzsKKwkJc3RhdGUtPnY0ID0gdjQ7CisJfQorCisJaWYgKHAgPCBiX2VuZCkgeworCQltZW1jcHkoc3RhdGUtPm1lbTMyLCBwLCAoc2l6ZV90KShiX2VuZC1wKSk7CisJCXN0YXRlLT5tZW1zaXplID0gKHVpbnQzMl90KShiX2VuZC1wKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woeHhoMzJfdXBkYXRlKTsKKwordWludDMyX3QgeHhoMzJfZGlnZXN0KGNvbnN0IHN0cnVjdCB4eGgzMl9zdGF0ZSAqc3RhdGUpCit7CisJY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopc3RhdGUtPm1lbTMyOworCWNvbnN0IHVpbnQ4X3QgKmNvbnN0IGJfZW5kID0gKGNvbnN0IHVpbnQ4X3QgKikoc3RhdGUtPm1lbTMyKSArCisJCXN0YXRlLT5tZW1zaXplOworCXVpbnQzMl90IGgzMjsKKworCWlmIChzdGF0ZS0+bGFyZ2VfbGVuKSB7CisJCWgzMiA9IHh4aF9yb3RsMzIoc3RhdGUtPnYxLCAxKSArIHh4aF9yb3RsMzIoc3RhdGUtPnYyLCA3KSArCisJCQl4eGhfcm90bDMyKHN0YXRlLT52MywgMTIpICsgeHhoX3JvdGwzMihzdGF0ZS0+djQsIDE4KTsKKwl9IGVsc2UgeworCQloMzIgPSBzdGF0ZS0+djMgLyogPT0gc2VlZCAqLyArIFBSSU1FMzJfNTsKKwl9CisKKwloMzIgKz0gc3RhdGUtPnRvdGFsX2xlbl8zMjsKKworCXdoaWxlIChwICsgNCA8PSBiX2VuZCkgeworCQloMzIgKz0gZ2V0X3VuYWxpZ25lZF9sZTMyKHApICogUFJJTUUzMl8zOworCQloMzIgPSB4eGhfcm90bDMyKGgzMiwgMTcpICogUFJJTUUzMl80OworCQlwICs9IDQ7CisJfQorCisJd2hpbGUgKHAgPCBiX2VuZCkgeworCQloMzIgKz0gKCpwKSAqIFBSSU1FMzJfNTsKKwkJaDMyID0geHhoX3JvdGwzMihoMzIsIDExKSAqIFBSSU1FMzJfMTsKKwkJcCsrOworCX0KKworCWgzMiBePSBoMzIgPj4gMTU7CisJaDMyICo9IFBSSU1FMzJfMjsKKwloMzIgXj0gaDMyID4+IDEzOworCWgzMiAqPSBQUklNRTMyXzM7CisJaDMyIF49IGgzMiA+PiAxNjsKKworCXJldHVybiBoMzI7Cit9CitFWFBPUlRfU1lNQk9MKHh4aDMyX2RpZ2VzdCk7CisKK2ludCB4eGg2NF91cGRhdGUoc3RydWN0IHh4aDY0X3N0YXRlICpzdGF0ZSwgY29uc3Qgdm9pZCAqaW5wdXQsIGNvbnN0IHNpemVfdCBsZW4pCit7CisJY29uc3QgdWludDhfdCAqcCA9IChjb25zdCB1aW50OF90ICopaW5wdXQ7CisJY29uc3QgdWludDhfdCAqY29uc3QgYl9lbmQgPSBwICsgbGVuOworCisJaWYgKGlucHV0ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RhdGUtPnRvdGFsX2xlbiArPSBsZW47CisKKwlpZiAoc3RhdGUtPm1lbXNpemUgKyBsZW4gPCAzMikgeyAvKiBmaWxsIGluIHRtcCBidWZmZXIgKi8KKwkJbWVtY3B5KCgodWludDhfdCAqKXN0YXRlLT5tZW02NCkgKyBzdGF0ZS0+bWVtc2l6ZSwgaW5wdXQsIGxlbik7CisJCXN0YXRlLT5tZW1zaXplICs9ICh1aW50MzJfdClsZW47CisJCXJldHVybiAwOworCX0KKworCWlmIChzdGF0ZS0+bWVtc2l6ZSkgeyAvKiB0bXAgYnVmZmVyIGlzIGZ1bGwgKi8KKwkJdWludDY0X3QgKnA2NCA9IHN0YXRlLT5tZW02NDsKKworCQltZW1jcHkoKCh1aW50OF90ICopcDY0KSArIHN0YXRlLT5tZW1zaXplLCBpbnB1dCwKKwkJCTMyIC0gc3RhdGUtPm1lbXNpemUpOworCisJCXN0YXRlLT52MSA9IHh4aDY0X3JvdW5kKHN0YXRlLT52MSwgZ2V0X3VuYWxpZ25lZF9sZTY0KHA2NCkpOworCQlwNjQrKzsKKwkJc3RhdGUtPnYyID0geHhoNjRfcm91bmQoc3RhdGUtPnYyLCBnZXRfdW5hbGlnbmVkX2xlNjQocDY0KSk7CisJCXA2NCsrOworCQlzdGF0ZS0+djMgPSB4eGg2NF9yb3VuZChzdGF0ZS0+djMsIGdldF91bmFsaWduZWRfbGU2NChwNjQpKTsKKwkJcDY0Kys7CisJCXN0YXRlLT52NCA9IHh4aDY0X3JvdW5kKHN0YXRlLT52NCwgZ2V0X3VuYWxpZ25lZF9sZTY0KHA2NCkpOworCisJCXAgKz0gMzIgLSBzdGF0ZS0+bWVtc2l6ZTsKKwkJc3RhdGUtPm1lbXNpemUgPSAwOworCX0KKworCWlmIChwICsgMzIgPD0gYl9lbmQpIHsKKwkJY29uc3QgdWludDhfdCAqY29uc3QgbGltaXQgPSBiX2VuZCAtIDMyOworCQl1aW50NjRfdCB2MSA9IHN0YXRlLT52MTsKKwkJdWludDY0X3QgdjIgPSBzdGF0ZS0+djI7CisJCXVpbnQ2NF90IHYzID0gc3RhdGUtPnYzOworCQl1aW50NjRfdCB2NCA9IHN0YXRlLT52NDsKKworCQlkbyB7CisJCQl2MSA9IHh4aDY0X3JvdW5kKHYxLCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOworCQkJcCArPSA4OworCQkJdjIgPSB4eGg2NF9yb3VuZCh2MiwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsKKwkJCXAgKz0gODsKKwkJCXYzID0geHhoNjRfcm91bmQodjMsIGdldF91bmFsaWduZWRfbGU2NChwKSk7CisJCQlwICs9IDg7CisJCQl2NCA9IHh4aDY0X3JvdW5kKHY0LCBnZXRfdW5hbGlnbmVkX2xlNjQocCkpOworCQkJcCArPSA4OworCQl9IHdoaWxlIChwIDw9IGxpbWl0KTsKKworCQlzdGF0ZS0+djEgPSB2MTsKKwkJc3RhdGUtPnYyID0gdjI7CisJCXN0YXRlLT52MyA9IHYzOworCQlzdGF0ZS0+djQgPSB2NDsKKwl9CisKKwlpZiAocCA8IGJfZW5kKSB7CisJCW1lbWNweShzdGF0ZS0+bWVtNjQsIHAsIChzaXplX3QpKGJfZW5kLXApKTsKKwkJc3RhdGUtPm1lbXNpemUgPSAodWludDMyX3QpKGJfZW5kIC0gcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHh4aDY0X3VwZGF0ZSk7CisKK3VpbnQ2NF90IHh4aDY0X2RpZ2VzdChjb25zdCBzdHJ1Y3QgeHhoNjRfc3RhdGUgKnN0YXRlKQoreworCWNvbnN0IHVpbnQ4X3QgKnAgPSAoY29uc3QgdWludDhfdCAqKXN0YXRlLT5tZW02NDsKKwljb25zdCB1aW50OF90ICpjb25zdCBiX2VuZCA9IChjb25zdCB1aW50OF90ICopc3RhdGUtPm1lbTY0ICsKKwkJc3RhdGUtPm1lbXNpemU7CisJdWludDY0X3QgaDY0OworCisJaWYgKHN0YXRlLT50b3RhbF9sZW4gPj0gMzIpIHsKKwkJY29uc3QgdWludDY0X3QgdjEgPSBzdGF0ZS0+djE7CisJCWNvbnN0IHVpbnQ2NF90IHYyID0gc3RhdGUtPnYyOworCQljb25zdCB1aW50NjRfdCB2MyA9IHN0YXRlLT52MzsKKwkJY29uc3QgdWludDY0X3QgdjQgPSBzdGF0ZS0+djQ7CisKKwkJaDY0ID0geHhoX3JvdGw2NCh2MSwgMSkgKyB4eGhfcm90bDY0KHYyLCA3KSArCisJCQl4eGhfcm90bDY0KHYzLCAxMikgKyB4eGhfcm90bDY0KHY0LCAxOCk7CisJCWg2NCA9IHh4aDY0X21lcmdlX3JvdW5kKGg2NCwgdjEpOworCQloNjQgPSB4eGg2NF9tZXJnZV9yb3VuZChoNjQsIHYyKTsKKwkJaDY0ID0geHhoNjRfbWVyZ2Vfcm91bmQoaDY0LCB2Myk7CisJCWg2NCA9IHh4aDY0X21lcmdlX3JvdW5kKGg2NCwgdjQpOworCX0gZWxzZSB7CisJCWg2NCAgPSBzdGF0ZS0+djMgKyBQUklNRTY0XzU7CisJfQorCisJaDY0ICs9ICh1aW50NjRfdClzdGF0ZS0+dG90YWxfbGVuOworCisJd2hpbGUgKHAgKyA4IDw9IGJfZW5kKSB7CisJCWNvbnN0IHVpbnQ2NF90IGsxID0geHhoNjRfcm91bmQoMCwgZ2V0X3VuYWxpZ25lZF9sZTY0KHApKTsKKworCQloNjQgXj0gazE7CisJCWg2NCA9IHh4aF9yb3RsNjQoaDY0LCAyNykgKiBQUklNRTY0XzEgKyBQUklNRTY0XzQ7CisJCXAgKz0gODsKKwl9CisKKwlpZiAocCArIDQgPD0gYl9lbmQpIHsKKwkJaDY0IF49ICh1aW50NjRfdCkoZ2V0X3VuYWxpZ25lZF9sZTMyKHApKSAqIFBSSU1FNjRfMTsKKwkJaDY0ID0geHhoX3JvdGw2NChoNjQsIDIzKSAqIFBSSU1FNjRfMiArIFBSSU1FNjRfMzsKKwkJcCArPSA0OworCX0KKworCXdoaWxlIChwIDwgYl9lbmQpIHsKKwkJaDY0IF49ICgqcCkgKiBQUklNRTY0XzU7CisJCWg2NCA9IHh4aF9yb3RsNjQoaDY0LCAxMSkgKiBQUklNRTY0XzE7CisJCXArKzsKKwl9CisKKwloNjQgXj0gaDY0ID4+IDMzOworCWg2NCAqPSBQUklNRTY0XzI7CisJaDY0IF49IGg2NCA+PiAyOTsKKwloNjQgKj0gUFJJTUU2NF8zOworCWg2NCBePSBoNjQgPj4gMzI7CisKKwlyZXR1cm4gaDY0OworfQorRVhQT1JUX1NZTUJPTCh4eGg2NF9kaWdlc3QpOworCitNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CitNT0RVTEVfREVTQ1JJUFRJT04oInh4SGFzaCIpOwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHovS2NvbmZpZyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkMmQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L0tjb25maWcKQEAgLTAsMCArMSw1NyBAQAorY29uZmlnIFhaX0RFQworCXRyaXN0YXRlICJYWiBkZWNvbXByZXNzaW9uIHN1cHBvcnQiCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgTFpNQTIgY29tcHJlc3Npb24gYWxnb3JpdGhtIGFuZCBCQ0ogZmlsdGVycyBhcmUgc3VwcG9ydGVkIHVzaW5nCisJICB0aGUgLnh6IGZpbGUgZm9ybWF0IGFzIHRoZSBjb250YWluZXIuIEZvciBpbnRlZ3JpdHkgY2hlY2tpbmcsCisJICBDUkMzMiBpcyBzdXBwb3J0ZWQuIFNlZSBEb2N1bWVudGF0aW9uL3h6LnR4dCBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworaWYgWFpfREVDCisKK2NvbmZpZyBYWl9ERUNfWDg2CisJYm9vbCAieDg2IEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRVhQRVJUCisJZGVmYXVsdCB5CisJc2VsZWN0IFhaX0RFQ19CQ0oKKworY29uZmlnIFhaX0RFQ19QT1dFUlBDCisJYm9vbCAiUG93ZXJQQyBCQ0ogZmlsdGVyIGRlY29kZXIiIGlmIEVYUEVSVAorCWRlZmF1bHQgeQorCXNlbGVjdCBYWl9ERUNfQkNKCisKK2NvbmZpZyBYWl9ERUNfSUE2NAorCWJvb2wgIklBLTY0IEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRVhQRVJUCisJZGVmYXVsdCB5CisJc2VsZWN0IFhaX0RFQ19CQ0oKKworY29uZmlnIFhaX0RFQ19BUk0KKwlib29sICJBUk0gQkNKIGZpbHRlciBkZWNvZGVyIiBpZiBFWFBFUlQKKwlkZWZhdWx0IHkKKwlzZWxlY3QgWFpfREVDX0JDSgorCitjb25maWcgWFpfREVDX0FSTVRIVU1CCisJYm9vbCAiQVJNLVRodW1iIEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRVhQRVJUCisJZGVmYXVsdCB5CisJc2VsZWN0IFhaX0RFQ19CQ0oKKworY29uZmlnIFhaX0RFQ19TUEFSQworCWJvb2wgIlNQQVJDIEJDSiBmaWx0ZXIgZGVjb2RlciIgaWYgRVhQRVJUCisJZGVmYXVsdCB5CisJc2VsZWN0IFhaX0RFQ19CQ0oKKworZW5kaWYKKworY29uZmlnIFhaX0RFQ19CQ0oKKwlib29sCisJZGVmYXVsdCBuCisKK2NvbmZpZyBYWl9ERUNfVEVTVAorCXRyaXN0YXRlICJYWiBkZWNvbXByZXNzb3IgdGVzdGVyIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gWFpfREVDCisJaGVscAorCSAgVGhpcyBhbGxvd3MgcGFzc2luZyAueHogZmlsZXMgdG8gdGhlIGluLWtlcm5lbCBYWiBkZWNvZGVyIHZpYQorCSAgYSBjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlLiBJdCBjYWxjdWxhdGVzIENSQzMyIG9mIHRoZSBkZWNvbXByZXNzZWQKKwkgIGRhdGEgYW5kIHdyaXRlcyBkaWFnbm9zdGljcyB0byB0aGUgc3lzdGVtIGxvZy4KKworCSAgVW5sZXNzIHlvdSBhcmUgZGV2ZWxvcGluZyB0aGUgWFogZGVjb2RlciwgeW91IGRvbid0IG5lZWQgdGhpcworCSAgYW5kIHNob3VsZCBzYXkgTi4KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L01ha2VmaWxlIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHovTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdmYTc2OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorb2JqLSQoQ09ORklHX1haX0RFQykgKz0geHpfZGVjLm8KK3h6X2RlYy15IDo9IHh6X2RlY19zeW1zLm8geHpfZGVjX3N0cmVhbS5vIHh6X2RlY19sem1hMi5vCit4el9kZWMtJChDT05GSUdfWFpfREVDX0JDSikgKz0geHpfZGVjX2Jjai5vCisKK29iai0kKENPTkZJR19YWl9ERUNfVEVTVCkgKz0geHpfZGVjX3Rlc3QubwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfY3JjMzIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MzJkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2NyYzMyLmMKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENSQzMyIHVzaW5nIHRoZSBwb2x5bm9taWFsIGZyb20gSUVFRS04MDIuMworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgbm90IHRoZSBmYXN0ZXN0IGltcGxlbWVudGF0aW9uLCBidXQgaXQgaXMgcHJldHR5IGNvbXBhY3QuCisgKiBUaGUgZmFzdGVzdCB2ZXJzaW9ucyBvZiB4el9jcmMzMigpIG9uIG1vZGVybiBDUFVzIHdpdGhvdXQgaGFyZHdhcmUKKyAqIGFjY2VsZXJhdGVkIENSQyBpbnN0cnVjdGlvbiBhcmUgMy01IHRpbWVzIGFzIGZhc3QgYXMgdGhpcyB2ZXJzaW9uLAorICogYnV0IHRoZXkgYXJlIGJpZ2dlciBhbmQgdXNlIG1vcmUgbWVtb3J5IGZvciB0aGUgbG9va3VwIHRhYmxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisKKy8qCisgKiBTVEFUSUNfUldfREFUQSBpcyB1c2VkIGluIHRoZSBwcmUtYm9vdCBlbnZpcm9ubWVudCBvbiBzb21lIGFyY2hpdGVjdHVyZXMuCisgKiBTZWUgPGxpbnV4L2RlY29tcHJlc3MvbW0uaD4gZm9yIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgU1RBVElDX1JXX0RBVEEKKyMJZGVmaW5lIFNUQVRJQ19SV19EQVRBIHN0YXRpYworI2VuZGlmCisKK1NUQVRJQ19SV19EQVRBIHVpbnQzMl90IHh6X2NyYzMyX3RhYmxlWzI1Nl07CisKK1haX0VYVEVSTiB2b2lkIHh6X2NyYzMyX2luaXQodm9pZCkKK3sKKwljb25zdCB1aW50MzJfdCBwb2x5ID0gMHhFREI4ODMyMDsKKworCXVpbnQzMl90IGk7CisJdWludDMyX3QgajsKKwl1aW50MzJfdCByOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisJCXIgPSBpOworCQlmb3IgKGogPSAwOyBqIDwgODsgKytqKQorCQkJciA9IChyID4+IDEpIF4gKHBvbHkgJiB+KChyICYgMSkgLSAxKSk7CisKKwkJeHpfY3JjMzJfdGFibGVbaV0gPSByOworCX0KKworCXJldHVybjsKK30KKworWFpfRVhURVJOIHVpbnQzMl90IHh6X2NyYzMyKGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGNyYykKK3sKKwljcmMgPSB+Y3JjOworCisJd2hpbGUgKHNpemUgIT0gMCkgeworCQljcmMgPSB4el9jcmMzMl90YWJsZVsqYnVmKysgXiAoY3JjICYgMHhGRildIF4gKGNyYyA+PiA4KTsKKwkJLS1zaXplOworCX0KKworCXJldHVybiB+Y3JjOworfQpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfZGVjX2Jjai5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfZGVjX2Jjai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjhlNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfYmNqLmMKQEAgLTAsMCArMSw1NzQgQEAKKy8qCisgKiBCcmFuY2gvQ2FsbC9KdW1wIChCQ0opIGZpbHRlciBkZWNvZGVycworICoKKyAqIEF1dGhvcnM6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogICAgICAgICAgSWdvciBQYXZsb3YgPGh0dHA6Ly83LXppcC5vcmcvPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgInh6X3ByaXZhdGUuaCIKKworLyoKKyAqIFRoZSByZXN0IG9mIHRoZSBmaWxlIGlzIGluc2lkZSB0aGlzIGlmZGVmLiBJdCBtYWtlcyB0aGluZ3MgYSBsaXR0bGUgbW9yZQorICogY29udmVuaWVudCB3aGVuIGJ1aWxkaW5nIHdpdGhvdXQgc3VwcG9ydCBmb3IgYW55IEJDSiBmaWx0ZXJzLgorICovCisjaWZkZWYgWFpfREVDX0JDSgorCitzdHJ1Y3QgeHpfZGVjX2JjaiB7CisJLyogVHlwZSBvZiB0aGUgQkNKIGZpbHRlciBiZWluZyB1c2VkICovCisJZW51bSB7CisJCUJDSl9YODYgPSA0LCAgICAgICAgLyogeDg2IG9yIHg4Ni02NCAqLworCQlCQ0pfUE9XRVJQQyA9IDUsICAgIC8qIEJpZyBlbmRpYW4gb25seSAqLworCQlCQ0pfSUE2NCA9IDYsICAgICAgIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuICovCisJCUJDSl9BUk0gPSA3LCAgICAgICAgLyogTGl0dGxlIGVuZGlhbiBvbmx5ICovCisJCUJDSl9BUk1USFVNQiA9IDgsICAgLyogTGl0dGxlIGVuZGlhbiBvbmx5ICovCisJCUJDSl9TUEFSQyA9IDkgICAgICAgLyogQmlnIG9yIGxpdHRsZSBlbmRpYW4gKi8KKwl9IHR5cGU7CisKKwkvKgorCSAqIFJldHVybiB2YWx1ZSBvZiB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLiBXZSBuZWVkIHRvIHByZXNlcnZlCisJICogdGhpcyBpbmZvcm1hdGlvbiBhY3Jvc3MgY2FsbHMsIGJlY2F1c2Ugd2UgbXVzdCBub3QgY2FsbCB0aGUgbmV4dAorCSAqIGZpbHRlciBhbnltb3JlIG9uY2UgaXQgaGFzIHJldHVybmVkIFhaX1NUUkVBTV9FTkQuCisJICovCisJZW51bSB4el9yZXQgcmV0OworCisJLyogVHJ1ZSBpZiB3ZSBhcmUgb3BlcmF0aW5nIGluIHNpbmdsZS1jYWxsIG1vZGUuICovCisJYm9vbCBzaW5nbGVfY2FsbDsKKworCS8qCisJICogQWJzb2x1dGUgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkCisJICogZGF0YSAoaW4gYSBzaW5nbGUgLnh6IEJsb2NrKS4gV2UgY2FyZSBvbmx5IGFib3V0IHRoZSBsb3dlc3QgMzIKKwkgKiBiaXRzIHNvIHRoaXMgZG9lc24ndCBuZWVkIHRvIGJlIHVpbnQ2NF90IGV2ZW4gd2l0aCBiaWcgZmlsZXMuCisJICovCisJdWludDMyX3QgcG9zOworCisJLyogeDg2IGZpbHRlciBzdGF0ZSAqLworCXVpbnQzMl90IHg4Nl9wcmV2X21hc2s7CisKKwkvKiBUZW1wb3Jhcnkgc3BhY2UgdG8gaG9sZCB0aGUgdmFyaWFibGVzIGZyb20gc3RydWN0IHh6X2J1ZiAqLworCXVpbnQ4X3QgKm91dDsKKwlzaXplX3Qgb3V0X3BvczsKKwlzaXplX3Qgb3V0X3NpemU7CisKKwlzdHJ1Y3QgeworCQkvKiBBbW91bnQgb2YgYWxyZWFkeSBmaWx0ZXJlZCBkYXRhIGluIHRoZSBiZWdpbm5pbmcgb2YgYnVmICovCisJCXNpemVfdCBmaWx0ZXJlZDsKKworCQkvKiBUb3RhbCBhbW91bnQgb2YgZGF0YSBjdXJyZW50bHkgc3RvcmVkIGluIGJ1ZiAgKi8KKwkJc2l6ZV90IHNpemU7CisKKwkJLyoKKwkJICogQnVmZmVyIHRvIGhvbGQgYSBtaXggb2YgZmlsdGVyZWQgYW5kIHVuZmlsdGVyZWQgZGF0YS4gVGhpcworCQkgKiBuZWVkcyB0byBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgQWxpZ25tZW50ICsgMiAqIExvb2stYWhlYWQ6CisJCSAqCisJCSAqIFR5cGUgICAgICAgICBBbGlnbm1lbnQgICBMb29rLWFoZWFkCisJCSAqIHg4NiAgICAgICAgICAgICAgMSAgICAgICAgICAgNAorCQkgKiBQb3dlclBDICAgICAgICAgIDQgICAgICAgICAgIDAKKwkJICogSUEtNjQgICAgICAgICAgIDE2ICAgICAgICAgICAwCisJCSAqIEFSTSAgICAgICAgICAgICAgNCAgICAgICAgICAgMAorCQkgKiBBUk0tVGh1bWIgICAgICAgIDIgICAgICAgICAgIDIKKwkJICogU1BBUkMgICAgICAgICAgICA0ICAgICAgICAgICAwCisJCSAqLworCQl1aW50OF90IGJ1ZlsxNl07CisJfSB0ZW1wOworfTsKKworI2lmZGVmIFhaX0RFQ19YODYKKy8qCisgKiBUaGlzIGlzIHVzZWQgdG8gdGVzdCB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlIG9mIGEgbWVtb3J5IGFkZHJlc3MKKyAqIGluIGFuIHg4NiBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYmNqX3g4Nl90ZXN0X21zYnl0ZSh1aW50OF90IGIpCit7CisJcmV0dXJuIGIgPT0gMHgwMCB8fCBiID09IDB4RkY7Cit9CisKK3N0YXRpYyBzaXplX3QgYmNqX3g4NihzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdGF0aWMgY29uc3QgYm9vbCBtYXNrX3RvX2FsbG93ZWRfc3RhdHVzWzhdCisJCT0geyB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSB9OworCisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgbWFza190b19iaXRfbnVtWzhdID0geyAwLCAxLCAyLCAyLCAzLCAzLCAzLCAzIH07CisKKwlzaXplX3QgaTsKKwlzaXplX3QgcHJldl9wb3MgPSAoc2l6ZV90KS0xOworCXVpbnQzMl90IHByZXZfbWFzayA9IHMtPng4Nl9wcmV2X21hc2s7CisJdWludDMyX3Qgc3JjOworCXVpbnQzMl90IGRlc3Q7CisJdWludDMyX3QgajsKKwl1aW50OF90IGI7CisKKwlpZiAoc2l6ZSA8PSA0KQorCQlyZXR1cm4gMDsKKworCXNpemUgLT0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisJCWlmICgoYnVmW2ldICYgMHhGRSkgIT0gMHhFOCkKKwkJCWNvbnRpbnVlOworCisJCXByZXZfcG9zID0gaSAtIHByZXZfcG9zOworCQlpZiAocHJldl9wb3MgPiAzKSB7CisJCQlwcmV2X21hc2sgPSAwOworCQl9IGVsc2UgeworCQkJcHJldl9tYXNrID0gKHByZXZfbWFzayA8PCAocHJldl9wb3MgLSAxKSkgJiA3OworCQkJaWYgKHByZXZfbWFzayAhPSAwKSB7CisJCQkJYiA9IGJ1ZltpICsgNCAtIG1hc2tfdG9fYml0X251bVtwcmV2X21hc2tdXTsKKwkJCQlpZiAoIW1hc2tfdG9fYWxsb3dlZF9zdGF0dXNbcHJldl9tYXNrXQorCQkJCQkJfHwgYmNqX3g4Nl90ZXN0X21zYnl0ZShiKSkgeworCQkJCQlwcmV2X3BvcyA9IGk7CisJCQkJCXByZXZfbWFzayA9IChwcmV2X21hc2sgPDwgMSkgfCAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlwcmV2X3BvcyA9IGk7CisKKwkJaWYgKGJjal94ODZfdGVzdF9tc2J5dGUoYnVmW2kgKyA0XSkpIHsKKwkJCXNyYyA9IGdldF91bmFsaWduZWRfbGUzMihidWYgKyBpICsgMSk7CisJCQl3aGlsZSAodHJ1ZSkgeworCQkJCWRlc3QgPSBzcmMgLSAocy0+cG9zICsgKHVpbnQzMl90KWkgKyA1KTsKKwkJCQlpZiAocHJldl9tYXNrID09IDApCisJCQkJCWJyZWFrOworCisJCQkJaiA9IG1hc2tfdG9fYml0X251bVtwcmV2X21hc2tdICogODsKKwkJCQliID0gKHVpbnQ4X3QpKGRlc3QgPj4gKDI0IC0gaikpOworCQkJCWlmICghYmNqX3g4Nl90ZXN0X21zYnl0ZShiKSkKKwkJCQkJYnJlYWs7CisKKwkJCQlzcmMgPSBkZXN0IF4gKCgodWludDMyX3QpMSA8PCAoMzIgLSBqKSkgLSAxKTsKKwkJCX0KKworCQkJZGVzdCAmPSAweDAxRkZGRkZGOworCQkJZGVzdCB8PSAodWludDMyX3QpMCAtIChkZXN0ICYgMHgwMTAwMDAwMCk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMzIoZGVzdCwgYnVmICsgaSArIDEpOworCQkJaSArPSA0OworCQl9IGVsc2UgeworCQkJcHJldl9tYXNrID0gKHByZXZfbWFzayA8PCAxKSB8IDE7CisJCX0KKwl9CisKKwlwcmV2X3BvcyA9IGkgLSBwcmV2X3BvczsKKwlzLT54ODZfcHJldl9tYXNrID0gcHJldl9wb3MgPiAzID8gMCA6IHByZXZfbWFzayA8PCAocHJldl9wb3MgLSAxKTsKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKK3N0YXRpYyBzaXplX3QgYmNqX3Bvd2VycGMoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgaW5zdHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKwkJaW5zdHIgPSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmICsgaSk7CisJCWlmICgoaW5zdHIgJiAweEZDMDAwMDAzKSA9PSAweDQ4MDAwMDAxKSB7CisJCQlpbnN0ciAmPSAweDAzRkZGRkZDOworCQkJaW5zdHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQlpbnN0ciAmPSAweDAzRkZGRkZDOworCQkJaW5zdHIgfD0gMHg0ODAwMDAwMTsKKwkJCXB1dF91bmFsaWduZWRfYmUzMihpbnN0ciwgYnVmICsgaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0lBNjQKK3N0YXRpYyBzaXplX3QgYmNqX2lhNjQoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnJhbmNoX3RhYmxlWzMyXSA9IHsKKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKwkJNCwgNCwgNiwgNiwgMCwgMCwgNywgNywKKwkJNCwgNCwgMCwgMCwgNCwgNCwgMCwgMAorCX07CisKKwkvKgorCSAqIFRoZSBsb2NhbCB2YXJpYWJsZXMgdGFrZSBhIGxpdHRsZSBiaXQgc3RhY2sgc3BhY2UsIGJ1dCBpdCdzIGxlc3MKKwkgKiB0aGFuIHdoYXQgTFpNQTIgZGVjb2RlciB0YWtlcywgc28gaXQgZG9lc24ndCBtYWtlIHNlbnNlIHRvIHJlZHVjZQorCSAqIHN0YWNrIHVzYWdlIGhlcmUgd2l0aG91dCBkb2luZyB0aGF0IGZvciB0aGUgTFpNQTIgZGVjb2RlciB0b28uCisJICovCisKKwkvKiBMb29wIGNvdW50ZXJzICovCisJc2l6ZV90IGk7CisJc2l6ZV90IGo7CisKKwkvKiBJbnN0cnVjdGlvbiBzbG90ICgwLCAxLCBvciAyKSBpbiB0aGUgMTI4LWJpdCBpbnN0cnVjdGlvbiB3b3JkICovCisJdWludDMyX3Qgc2xvdDsKKworCS8qIEJpdHdpc2Ugb2Zmc2V0IG9mIHRoZSBpbnN0cnVjdGlvbiBpbmRpY2F0ZWQgYnkgc2xvdCAqLworCXVpbnQzMl90IGJpdF9wb3M7CisKKwkvKiBiaXRfcG9zIHNwbGl0IGludG8gYnl0ZSBhbmQgYml0IHBhcnRzICovCisJdWludDMyX3QgYnl0ZV9wb3M7CisJdWludDMyX3QgYml0X3JlczsKKworCS8qIEFkZHJlc3MgcGFydCBvZiBhbiBpbnN0cnVjdGlvbiAqLworCXVpbnQzMl90IGFkZHI7CisKKwkvKiBNYXNrIHVzZWQgdG8gZGV0ZWN0IHdoaWNoIGluc3RydWN0aW9ucyB0byBjb252ZXJ0ICovCisJdWludDMyX3QgbWFzazsKKworCS8qIDQxLWJpdCBpbnN0cnVjdGlvbiBzdG9yZWQgc29tZXdoZXJlIGluIHRoZSBsb3dlc3QgNDggYml0cyAqLworCXVpbnQ2NF90IGluc3RyOworCisJLyogSW5zdHJ1Y3Rpb24gbm9ybWFsaXplZCB3aXRoIGJpdF9yZXMgZm9yIGVhc2llciBtYW5pcHVsYXRpb24gKi8KKwl1aW50NjRfdCBub3JtOworCisJZm9yIChpID0gMDsgaSArIDE2IDw9IHNpemU7IGkgKz0gMTYpIHsKKwkJbWFzayA9IGJyYW5jaF90YWJsZVtidWZbaV0gJiAweDFGXTsKKwkJZm9yIChzbG90ID0gMCwgYml0X3BvcyA9IDU7IHNsb3QgPCAzOyArK3Nsb3QsIGJpdF9wb3MgKz0gNDEpIHsKKwkJCWlmICgoKG1hc2sgPj4gc2xvdCkgJiAxKSA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlieXRlX3BvcyA9IGJpdF9wb3MgPj4gMzsKKwkJCWJpdF9yZXMgPSBiaXRfcG9zICYgNzsKKwkJCWluc3RyID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCA2OyArK2opCisJCQkJaW5zdHIgfD0gKHVpbnQ2NF90KShidWZbaSArIGogKyBieXRlX3Bvc10pCisJCQkJCQk8PCAoOCAqIGopOworCisJCQlub3JtID0gaW5zdHIgPj4gYml0X3JlczsKKworCQkJaWYgKCgobm9ybSA+PiAzNykgJiAweDBGKSA9PSAweDA1CisJCQkJCSYmICgobm9ybSA+PiA5KSAmIDB4MDcpID09IDApIHsKKwkJCQlhZGRyID0gKG5vcm0gPj4gMTMpICYgMHgwRkZGRkY7CisJCQkJYWRkciB8PSAoKHVpbnQzMl90KShub3JtID4+IDM2KSAmIDEpIDw8IDIwOworCQkJCWFkZHIgPDw9IDQ7CisJCQkJYWRkciAtPSBzLT5wb3MgKyAodWludDMyX3QpaTsKKwkJCQlhZGRyID4+PSA0OworCisJCQkJbm9ybSAmPSB+KCh1aW50NjRfdCkweDhGRkZGRiA8PCAxMyk7CisJCQkJbm9ybSB8PSAodWludDY0X3QpKGFkZHIgJiAweDBGRkZGRikgPDwgMTM7CisJCQkJbm9ybSB8PSAodWludDY0X3QpKGFkZHIgJiAweDEwMDAwMCkKKwkJCQkJCTw8ICgzNiAtIDIwKTsKKworCQkJCWluc3RyICY9ICgxIDw8IGJpdF9yZXMpIC0gMTsKKwkJCQlpbnN0ciB8PSBub3JtIDw8IGJpdF9yZXM7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgNjsgaisrKQorCQkJCQlidWZbaSArIGogKyBieXRlX3Bvc10KKwkJCQkJCT0gKHVpbnQ4X3QpKGluc3RyID4+ICg4ICogaikpOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19BUk0KK3N0YXRpYyBzaXplX3QgYmNqX2FybShzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBhZGRyOworCisJZm9yIChpID0gMDsgaSArIDQgPD0gc2l6ZTsgaSArPSA0KSB7CisJCWlmIChidWZbaSArIDNdID09IDB4RUIpIHsKKwkJCWFkZHIgPSAodWludDMyX3QpYnVmW2ldIHwgKCh1aW50MzJfdClidWZbaSArIDFdIDw8IDgpCisJCQkJCXwgKCh1aW50MzJfdClidWZbaSArIDJdIDw8IDE2KTsKKwkJCWFkZHIgPDw9IDI7CisJCQlhZGRyIC09IHMtPnBvcyArICh1aW50MzJfdClpICsgODsKKwkJCWFkZHIgPj49IDI7CisJCQlidWZbaV0gPSAodWludDhfdClhZGRyOworCQkJYnVmW2kgKyAxXSA9ICh1aW50OF90KShhZGRyID4+IDgpOworCQkJYnVmW2kgKyAyXSA9ICh1aW50OF90KShhZGRyID4+IDE2KTsKKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNVEhVTUIKK3N0YXRpYyBzaXplX3QgYmNqX2FybXRodW1iKHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGFkZHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDIpIHsKKwkJaWYgKChidWZbaSArIDFdICYgMHhGOCkgPT0gMHhGMAorCQkJCSYmIChidWZbaSArIDNdICYgMHhGOCkgPT0gMHhGOCkgeworCQkJYWRkciA9ICgoKHVpbnQzMl90KWJ1ZltpICsgMV0gJiAweDA3KSA8PCAxOSkKKwkJCQkJfCAoKHVpbnQzMl90KWJ1ZltpXSA8PCAxMSkKKwkJCQkJfCAoKCh1aW50MzJfdClidWZbaSArIDNdICYgMHgwNykgPDwgOCkKKwkJCQkJfCAodWludDMyX3QpYnVmW2kgKyAyXTsKKwkJCWFkZHIgPDw9IDE7CisJCQlhZGRyIC09IHMtPnBvcyArICh1aW50MzJfdClpICsgNDsKKwkJCWFkZHIgPj49IDE7CisJCQlidWZbaSArIDFdID0gKHVpbnQ4X3QpKDB4RjAgfCAoKGFkZHIgPj4gMTkpICYgMHgwNykpOworCQkJYnVmW2ldID0gKHVpbnQ4X3QpKGFkZHIgPj4gMTEpOworCQkJYnVmW2kgKyAzXSA9ICh1aW50OF90KSgweEY4IHwgKChhZGRyID4+IDgpICYgMHgwNykpOworCQkJYnVmW2kgKyAyXSA9ICh1aW50OF90KWFkZHI7CisJCQlpICs9IDI7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX1NQQVJDCitzdGF0aWMgc2l6ZV90IGJjal9zcGFyYyhzdHJ1Y3QgeHpfZGVjX2JjaiAqcywgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgaTsKKwl1aW50MzJfdCBpbnN0cjsKKworCWZvciAoaSA9IDA7IGkgKyA0IDw9IHNpemU7IGkgKz0gNCkgeworCQlpbnN0ciA9IGdldF91bmFsaWduZWRfYmUzMihidWYgKyBpKTsKKwkJaWYgKChpbnN0ciA+PiAyMikgPT0gMHgxMDAgfHwgKGluc3RyID4+IDIyKSA9PSAweDFGRikgeworCQkJaW5zdHIgPDw9IDI7CisJCQlpbnN0ciAtPSBzLT5wb3MgKyAodWludDMyX3QpaTsKKwkJCWluc3RyID4+PSAyOworCQkJaW5zdHIgPSAoKHVpbnQzMl90KTB4NDAwMDAwMDAgLSAoaW5zdHIgJiAweDQwMDAwMCkpCisJCQkJCXwgMHg0MDAwMDAwMCB8IChpbnN0ciAmIDB4M0ZGRkZGKTsKKwkJCXB1dF91bmFsaWduZWRfYmUzMihpbnN0ciwgYnVmICsgaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisvKgorICogQXBwbHkgdGhlIHNlbGVjdGVkIEJDSiBmaWx0ZXIuIFVwZGF0ZSAqcG9zIGFuZCBzLT5wb3MgdG8gbWF0Y2ggdGhlIGFtb3VudAorICogb2YgZGF0YSB0aGF0IGdvdCBmaWx0ZXJlZC4KKyAqCisgKiBOT1RFOiBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgc3dpdGNoIHN0YXRlbWVudCB0byBhdm9pZCB1c2luZyBmdW5jdGlvbgorICogcG9pbnRlcnMsIHdoaWNoIGNvdWxkIGJlIHByb2JsZW1hdGljIGluIHRoZSBrZXJuZWwgYm9vdCBjb2RlLCB3aGljaCBtdXN0CisgKiBhdm9pZCBwb2ludGVycyB0byBzdGF0aWMgZGF0YSAoYXQgbGVhc3Qgb24geDg2KS4KKyAqLworc3RhdGljIHZvaWQgYmNqX2FwcGx5KHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQkgICAgICB1aW50OF90ICpidWYsIHNpemVfdCAqcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgZmlsdGVyZWQ7CisKKwlidWYgKz0gKnBvczsKKwlzaXplIC09ICpwb3M7CisKKwlzd2l0Y2ggKHMtPnR5cGUpIHsKKyNpZmRlZiBYWl9ERUNfWDg2CisJY2FzZSBCQ0pfWDg2OgorCQlmaWx0ZXJlZCA9IGJjal94ODYocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfUE9XRVJQQworCWNhc2UgQkNKX1BPV0VSUEM6CisJCWZpbHRlcmVkID0gYmNqX3Bvd2VycGMocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfSUE2NAorCWNhc2UgQkNKX0lBNjQ6CisJCWZpbHRlcmVkID0gYmNqX2lhNjQocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNCisJY2FzZSBCQ0pfQVJNOgorCQlmaWx0ZXJlZCA9IGJjal9hcm0ocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNVEhVTUIKKwljYXNlIEJDSl9BUk1USFVNQjoKKwkJZmlsdGVyZWQgPSBiY2pfYXJtdGh1bWIocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfU1BBUkMKKwljYXNlIEJDSl9TUEFSQzoKKwkJZmlsdGVyZWQgPSBiY2pfc3BhcmMocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKiBOZXZlciByZWFjaGVkIGJ1dCBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCQlmaWx0ZXJlZCA9IDA7CisJCWJyZWFrOworCX0KKworCSpwb3MgKz0gZmlsdGVyZWQ7CisJcy0+cG9zICs9IGZpbHRlcmVkOworfQorCisvKgorICogRmx1c2ggcGVuZGluZyBmaWx0ZXJlZCBkYXRhIGZyb20gdGVtcCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqIE1vdmUgdGhlIHJlbWFpbmluZyBtaXh0dXJlIG9mIHBvc3NpYmx5IGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkCisgKiBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGVtcC4KKyAqLworc3RhdGljIHZvaWQgYmNqX2ZsdXNoKHN0cnVjdCB4el9kZWNfYmNqICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBjb3B5X3NpemU7CisKKwljb3B5X3NpemUgPSBtaW5fdChzaXplX3QsIHMtPnRlbXAuZmlsdGVyZWQsIGItPm91dF9zaXplIC0gYi0+b3V0X3Bvcyk7CisJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuYnVmLCBjb3B5X3NpemUpOworCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCisJcy0+dGVtcC5maWx0ZXJlZCAtPSBjb3B5X3NpemU7CisJcy0+dGVtcC5zaXplIC09IGNvcHlfc2l6ZTsKKwltZW1tb3ZlKHMtPnRlbXAuYnVmLCBzLT50ZW1wLmJ1ZiArIGNvcHlfc2l6ZSwgcy0+dGVtcC5zaXplKTsKK30KKworLyoKKyAqIFRoZSBCQ0ogZmlsdGVyIGZ1bmN0aW9ucyBhcmUgcHJpbWl0aXZlIGluIHNlbnNlIHRoYXQgdGhleSBwcm9jZXNzIHRoZQorICogZGF0YSBpbiBjaHVua3Mgb2YgMS0xNiBieXRlcy4gVG8gaGlkZSB0aGlzIGlzc3VlLCB0aGlzIGZ1bmN0aW9uIGRvZXMKKyAqIHNvbWUgYnVmZmVyaW5nLgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2Jjal9ydW4oc3RydWN0IHh6X2RlY19iY2ogKnMsCisJCQkJICAgICBzdHJ1Y3QgeHpfZGVjX2x6bWEyICpsem1hMiwKKwkJCQkgICAgIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IG91dF9zdGFydDsKKworCS8qCisJICogRmx1c2ggcGVuZGluZyBhbHJlYWR5IGZpbHRlcmVkIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIuIFJldHVybgorCSAqIGltbWVkaWF0ZWxseSBpZiB3ZSBjb3VsZG4ndCBmbHVzaCBldmVyeXRoaW5nLCBvciBpZiB0aGUgbmV4dAorCSAqIGZpbHRlciBpbiB0aGUgY2hhaW4gaGFkIGFscmVhZHkgcmV0dXJuZWQgWFpfU1RSRUFNX0VORC4KKwkgKi8KKwlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApIHsKKwkJYmNqX2ZsdXNoKHMsIGIpOworCQlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApCisJCQlyZXR1cm4gWFpfT0s7CisKKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisJfQorCisJLyoKKwkgKiBJZiB3ZSBoYXZlIG1vcmUgb3V0cHV0IHNwYWNlIHRoYW4gd2hhdCBpcyBjdXJyZW50bHkgcGVuZGluZyBpbgorCSAqIHRlbXAsIGNvcHkgdGhlIHVuZmlsdGVyZWQgZGF0YSBmcm9tIHRlbXAgdG8gdGhlIG91dHB1dCBidWZmZXIKKwkgKiBhbmQgdHJ5IHRvIGZpbGwgdGhlIG91dHB1dCBidWZmZXIgYnkgZGVjb2RpbmcgbW9yZSBkYXRhIGZyb20gdGhlCisJICogbmV4dCBmaWx0ZXIgaW4gdGhlIGNoYWluLiBBcHBseSB0aGUgQkNKIGZpbHRlciBvbiB0aGUgbmV3IGRhdGEKKwkgKiBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gSWYgZXZlcnl0aGluZyBjYW5ub3QgYmUgZmlsdGVyZWQsIGNvcHkgaXQKKwkgKiB0byB0ZW1wIGFuZCByZXdpbmQgdGhlIG91dHB1dCBidWZmZXIgcG9zaXRpb24gYWNjb3JkaW5nbHkuCisJICoKKwkgKiBUaGlzIG5lZWRzIHRvIGJlIGFsd2F5cyBydW4gd2hlbiB0ZW1wLnNpemUgPT0gMCB0byBoYW5kbGUgYSBzcGVjaWFsCisJICogY2FzZSB3aGVyZSB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIGFuZCB0aGUgbmV4dCBmaWx0ZXIgaGFzIG5vCisJICogbW9yZSBvdXRwdXQgY29taW5nIGJ1dCBoYXNuJ3QgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCB5ZXQuCisJICovCisJaWYgKHMtPnRlbXAuc2l6ZSA8IGItPm91dF9zaXplIC0gYi0+b3V0X3BvcyB8fCBzLT50ZW1wLnNpemUgPT0gMCkgeworCQlvdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworCQltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5idWYsIHMtPnRlbXAuc2l6ZSk7CisJCWItPm91dF9wb3MgKz0gcy0+dGVtcC5zaXplOworCisJCXMtPnJldCA9IHh6X2RlY19sem1hMl9ydW4obHptYTIsIGIpOworCQlpZiAocy0+cmV0ICE9IFhaX1NUUkVBTV9FTkQKKwkJCQkmJiAocy0+cmV0ICE9IFhaX09LIHx8IHMtPnNpbmdsZV9jYWxsKSkKKwkJCXJldHVybiBzLT5yZXQ7CisKKwkJYmNqX2FwcGx5KHMsIGItPm91dCwgJm91dF9zdGFydCwgYi0+b3V0X3Bvcyk7CisKKwkJLyoKKwkJICogQXMgYW4gZXhjZXB0aW9uLCBpZiB0aGUgbmV4dCBmaWx0ZXIgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwKKwkJICogd2UgY2FuIGRvIHRoYXQgdG9vLCBzaW5jZSB0aGUgbGFzdCBmZXcgYnl0ZXMgdGhhdCByZW1haW4KKwkJICogdW5maWx0ZXJlZCBhcmUgbWVhbnQgdG8gcmVtYWluIHVuZmlsdGVyZWQuCisJCSAqLworCQlpZiAocy0+cmV0ID09IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKworCQlzLT50ZW1wLnNpemUgPSBiLT5vdXRfcG9zIC0gb3V0X3N0YXJ0OworCQliLT5vdXRfcG9zIC09IHMtPnRlbXAuc2l6ZTsKKwkJbWVtY3B5KHMtPnRlbXAuYnVmLCBiLT5vdXQgKyBiLT5vdXRfcG9zLCBzLT50ZW1wLnNpemUpOworCisJCS8qCisJCSAqIElmIHRoZXJlIHdhc24ndCBlbm91Z2ggaW5wdXQgdG8gdGhlIG5leHQgZmlsdGVyIHRvIGZpbGwKKwkJICogdGhlIG91dHB1dCBidWZmZXIgd2l0aCB1bmZpbHRlcmVkIGRhdGEsIHRoZXJlJ3Mgbm8gcG9pbnQKKwkJICogdG8gdHJ5IGRlY29kaW5nIG1vcmUgZGF0YSB0byB0ZW1wLgorCQkgKi8KKwkJaWYgKGItPm91dF9wb3MgKyBzLT50ZW1wLnNpemUgPCBiLT5vdXRfc2l6ZSkKKwkJCXJldHVybiBYWl9PSzsKKwl9CisKKwkvKgorCSAqIFdlIGhhdmUgdW5maWx0ZXJlZCBkYXRhIGluIHRlbXAuIElmIHRoZSBvdXRwdXQgYnVmZmVyIGlzbid0IGZ1bGwKKwkgKiB5ZXQsIHRyeSB0byBmaWxsIHRoZSB0ZW1wIGJ1ZmZlciBieSBkZWNvZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUKKwkgKiBuZXh0IGZpbHRlci4gQXBwbHkgdGhlIEJDSiBmaWx0ZXIgb24gdGVtcC4gVGhlbiB3ZSBob3BlZnVsbHkgY2FuCisJICogZmlsbCB0aGUgYWN0dWFsIG91dHB1dCBidWZmZXIgYnkgY29weWluZyBmaWx0ZXJlZCBkYXRhIGZyb20gdGVtcC4KKwkgKiBBIG1peCBvZiBmaWx0ZXJlZCBhbmQgdW5maWx0ZXJlZCBkYXRhIG1heSBiZSBsZWZ0IGluIHRlbXA7IGl0IHdpbGwKKwkgKiBiZSB0YWtlbiBjYXJlIG9uIHRoZSBuZXh0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKwkgKi8KKwlpZiAoYi0+b3V0X3BvcyA8IGItPm91dF9zaXplKSB7CisJCS8qIE1ha2UgYi0+b3V0eyxfcG9zLF9zaXplfSB0ZW1wb3JhcmlseSBwb2ludCB0byBzLT50ZW1wLiAqLworCQlzLT5vdXQgPSBiLT5vdXQ7CisJCXMtPm91dF9wb3MgPSBiLT5vdXRfcG9zOworCQlzLT5vdXRfc2l6ZSA9IGItPm91dF9zaXplOworCQliLT5vdXQgPSBzLT50ZW1wLmJ1ZjsKKwkJYi0+b3V0X3BvcyA9IHMtPnRlbXAuc2l6ZTsKKwkJYi0+b3V0X3NpemUgPSBzaXplb2Yocy0+dGVtcC5idWYpOworCisJCXMtPnJldCA9IHh6X2RlY19sem1hMl9ydW4obHptYTIsIGIpOworCisJCXMtPnRlbXAuc2l6ZSA9IGItPm91dF9wb3M7CisJCWItPm91dCA9IHMtPm91dDsKKwkJYi0+b3V0X3BvcyA9IHMtPm91dF9wb3M7CisJCWItPm91dF9zaXplID0gcy0+b3V0X3NpemU7CisKKwkJaWYgKHMtPnJldCAhPSBYWl9PSyAmJiBzLT5yZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBzLT5yZXQ7CisKKwkJYmNqX2FwcGx5KHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5maWx0ZXJlZCwgcy0+dGVtcC5zaXplKTsKKworCQkvKgorCQkgKiBJZiB0aGUgbmV4dCBmaWx0ZXIgcmV0dXJuZWQgWFpfU1RSRUFNX0VORCwgd2UgbWFyayB0aGF0CisJCSAqIGV2ZXJ5dGhpbmcgaXMgZmlsdGVyZWQsIHNpbmNlIHRoZSBsYXN0IHVuZmlsdGVyZWQgYnl0ZXMKKwkJICogb2YgdGhlIHN0cmVhbSBhcmUgbWVhbnQgdG8gYmUgbGVmdCBhcyBpcy4KKwkJICovCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXMtPnRlbXAuZmlsdGVyZWQgPSBzLT50ZW1wLnNpemU7CisKKwkJYmNqX2ZsdXNoKHMsIGIpOworCQlpZiAocy0+dGVtcC5maWx0ZXJlZCA+IDApCisJCQlyZXR1cm4gWFpfT0s7CisJfQorCisJcmV0dXJuIHMtPnJldDsKK30KKworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfYmNqICp4el9kZWNfYmNqX2NyZWF0ZShib29sIHNpbmdsZV9jYWxsKQoreworCXN0cnVjdCB4el9kZWNfYmNqICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyAhPSBOVUxMKQorCQlzLT5zaW5nbGVfY2FsbCA9IHNpbmdsZV9jYWxsOworCisJcmV0dXJuIHM7Cit9CisKK1haX0VYVEVSTiBlbnVtIHh6X3JldCB4el9kZWNfYmNqX3Jlc2V0KHN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKyNpZmRlZiBYWl9ERUNfWDg2CisJY2FzZSBCQ0pfWDg2OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1BPV0VSUEMKKwljYXNlIEJDSl9QT1dFUlBDOgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0lBNjQKKwljYXNlIEJDSl9JQTY0OgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTQorCWNhc2UgQkNKX0FSTToKKyNlbmRpZgorI2lmZGVmIFhaX0RFQ19BUk1USFVNQgorCWNhc2UgQkNKX0FSTVRIVU1COgorI2VuZGlmCisjaWZkZWYgWFpfREVDX1NQQVJDCisJY2FzZSBCQ0pfU1BBUkM6CisjZW5kaWYKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQkvKiBVbnN1cHBvcnRlZCBGaWx0ZXIgSUQgKi8KKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisJfQorCisJcy0+dHlwZSA9IGlkOworCXMtPnJldCA9IFhaX09LOworCXMtPnBvcyA9IDA7CisJcy0+eDg2X3ByZXZfbWFzayA9IDA7CisJcy0+dGVtcC5maWx0ZXJlZCA9IDA7CisJcy0+dGVtcC5zaXplID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfbHptYTIuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2RlY19sem1hMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzNjODAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfbHptYTIuYwpAQCAtMCwwICsxLDExNzUgQEAKKy8qCisgKiBMWk1BMiBkZWNvZGVyCisgKgorICogQXV0aG9yczogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKiAgICAgICAgICBJZ29yIFBhdmxvdiA8aHR0cDovLzctemlwLm9yZy8+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAieHpfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInh6X2x6bWEyLmgiCisKKy8qCisgKiBSYW5nZSBkZWNvZGVyIGluaXRpYWxpemF0aW9uIGVhdHMgdGhlIGZpcnN0IGZpdmUgYnl0ZXMgb2YgZWFjaCBMWk1BIGNodW5rLgorICovCisjZGVmaW5lIFJDX0lOSVRfQllURVMgNQorCisvKgorICogTWluaW11bSBudW1iZXIgb2YgdXNhYmxlIGlucHV0IGJ1ZmZlciB0byBzYWZlbHkgZGVjb2RlIG9uZSBMWk1BIHN5bWJvbC4KKyAqIFRoZSB3b3JzdCBjYXNlIGlzIHRoYXQgd2UgZGVjb2RlIDIyIGJpdHMgdXNpbmcgcHJvYmFiaWxpdGllcyBhbmQgMjYKKyAqIGRpcmVjdCBiaXRzLiBUaGlzIG1heSBkZWNvZGUgYXQgbWF4aW11bSBvZiAyMCBieXRlcyBvZiBpbnB1dC4gSG93ZXZlciwKKyAqIGx6bWFfbWFpbigpIGRvZXMgYW4gZXh0cmEgbm9ybWFsaXphdGlvbiBiZWZvcmUgcmV0dXJuaW5nLCB0aHVzIHdlCisgKiBuZWVkIHRvIHB1dCAyMSBoZXJlLgorICovCisjZGVmaW5lIExaTUFfSU5fUkVRVUlSRUQgMjEKKworLyoKKyAqIERpY3Rpb25hcnkgKGhpc3RvcnkgYnVmZmVyKQorICoKKyAqIFRoZXNlIGFyZSBhbHdheXMgdHJ1ZToKKyAqICAgIHN0YXJ0IDw9IHBvcyA8PSBmdWxsIDw9IGVuZAorICogICAgcG9zIDw9IGxpbWl0IDw9IGVuZAorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgYWxzbyB0aGVzZSBhcmUgdHJ1ZToKKyAqICAgIGVuZCA9PSBzaXplCisgKiAgICBzaXplIDw9IHNpemVfbWF4CisgKiAgICBhbGxvY2F0ZWQgPD0gc2l6ZQorICoKKyAqIE1vc3Qgb2YgdGhlc2UgdmFyaWFibGVzIGFyZSBzaXplX3QgdG8gc3VwcG9ydCBzaW5nbGUtY2FsbCBtb2RlLAorICogaW4gd2hpY2ggdGhlIGRpY3Rpb25hcnkgdmFyaWFibGVzIGFkZHJlc3MgdGhlIGFjdHVhbCBvdXRwdXQKKyAqIGJ1ZmZlciBkaXJlY3RseS4KKyAqLworc3RydWN0IGRpY3Rpb25hcnkgeworCS8qIEJlZ2lubmluZyBvZiB0aGUgaGlzdG9yeSBidWZmZXIgKi8KKwl1aW50OF90ICpidWY7CisKKwkvKiBPbGQgcG9zaXRpb24gaW4gYnVmIChiZWZvcmUgZGVjb2RpbmcgbW9yZSBkYXRhKSAqLworCXNpemVfdCBzdGFydDsKKworCS8qIFBvc2l0aW9uIGluIGJ1ZiAqLworCXNpemVfdCBwb3M7CisKKwkvKgorCSAqIEhvdyBmdWxsIGRpY3Rpb25hcnkgaXMuIFRoaXMgaXMgdXNlZCB0byBkZXRlY3QgY29ycnVwdCBpbnB1dCB0aGF0CisJICogd291bGQgcmVhZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4KKwkgKi8KKwlzaXplX3QgZnVsbDsKKworCS8qIFdyaXRlIGxpbWl0OyB3ZSBkb24ndCB3cml0ZSB0byBidWZbbGltaXRdIG9yIGxhdGVyIGJ5dGVzLiAqLworCXNpemVfdCBsaW1pdDsKKworCS8qCisJICogRW5kIG9mIHRoZSBkaWN0aW9uYXJ5IGJ1ZmZlci4gSW4gbXVsdGktY2FsbCBtb2RlLCB0aGlzIGlzCisJICogdGhlIHNhbWUgYXMgdGhlIGRpY3Rpb25hcnkgc2l6ZS4gSW4gc2luZ2xlLWNhbGwgbW9kZSwgdGhpcworCSAqIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKwkgKi8KKwlzaXplX3QgZW5kOworCisJLyoKKwkgKiBTaXplIG9mIHRoZSBkaWN0aW9uYXJ5IGFzIHNwZWNpZmllZCBpbiBCbG9jayBIZWFkZXIuIFRoaXMgaXMgdXNlZAorCSAqIHRvZ2V0aGVyIHdpdGggImZ1bGwiIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQgd291bGQgbWFrZSB1cworCSAqIHJlYWQgYmV5b25kIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0uCisJICovCisJdWludDMyX3Qgc2l6ZTsKKworCS8qCisJICogTWF4aW11bSBhbGxvd2VkIGRpY3Rpb25hcnkgc2l6ZSBpbiBtdWx0aS1jYWxsIG1vZGUuCisJICogVGhpcyBpcyBpZ25vcmVkIGluIHNpbmdsZS1jYWxsIG1vZGUuCisJICovCisJdWludDMyX3Qgc2l6ZV9tYXg7CisKKwkvKgorCSAqIEFtb3VudCBvZiBtZW1vcnkgY3VycmVudGx5IGFsbG9jYXRlZCBmb3IgdGhlIGRpY3Rpb25hcnkuCisJICogVGhpcyBpcyB1c2VkIG9ubHkgd2l0aCBYWl9EWU5BTExPQy4gKFdpdGggWFpfUFJFQUxMT0MsCisJICogc2l6ZV9tYXggaXMgYWx3YXlzIHRoZSBzYW1lIGFzIHRoZSBhbGxvY2F0ZWQgc2l6ZS4pCisJICovCisJdWludDMyX3QgYWxsb2NhdGVkOworCisJLyogT3BlcmF0aW9uIG1vZGUgKi8KKwllbnVtIHh6X21vZGUgbW9kZTsKK307CisKKy8qIFJhbmdlIGRlY29kZXIgKi8KK3N0cnVjdCByY19kZWMgeworCXVpbnQzMl90IHJhbmdlOworCXVpbnQzMl90IGNvZGU7CisKKwkvKgorCSAqIE51bWJlciBvZiBpbml0aWFsaXppbmcgYnl0ZXMgcmVtYWluaW5nIHRvIGJlIHJlYWQKKwkgKiBieSByY19yZWFkX2luaXQoKS4KKwkgKi8KKwl1aW50MzJfdCBpbml0X2J5dGVzX2xlZnQ7CisKKwkvKgorCSAqIEJ1ZmZlciBmcm9tIHdoaWNoIHdlIHJlYWQgb3VyIGlucHV0LiBJdCBjYW4gYmUgZWl0aGVyCisJICogdGVtcC5idWYgb3IgdGhlIGNhbGxlci1wcm92aWRlZCBpbnB1dCBidWZmZXIuCisJICovCisJY29uc3QgdWludDhfdCAqaW47CisJc2l6ZV90IGluX3BvczsKKwlzaXplX3QgaW5fbGltaXQ7Cit9OworCisvKiBQcm9iYWJpbGl0aWVzIGZvciBhIGxlbmd0aCBkZWNvZGVyLiAqLworc3RydWN0IGx6bWFfbGVuX2RlYyB7CisJLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDEwICovCisJdWludDE2X3QgY2hvaWNlOworCisJLyogUHJvYmFiaWxpdHkgb2YgbWF0Y2ggbGVuZ3RoIGJlaW5nIGF0IGxlYXN0IDE4ICovCisJdWludDE2X3QgY2hvaWNlMjsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMi05ICovCisJdWludDE2X3QgbG93W1BPU19TVEFURVNfTUFYXVtMRU5fTE9XX1NZTUJPTFNdOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxMC0xNyAqLworCXVpbnQxNl90IG1pZFtQT1NfU1RBVEVTX01BWF1bTEVOX01JRF9TWU1CT0xTXTsKKworCS8qIFByb2JhYmlsaXRpZXMgZm9yIG1hdGNoIGxlbmd0aHMgMTgtMjczICovCisJdWludDE2X3QgaGlnaFtMRU5fSElHSF9TWU1CT0xTXTsKK307CisKK3N0cnVjdCBsem1hX2RlYyB7CisJLyogRGlzdGFuY2VzIG9mIGxhdGVzdCBmb3VyIG1hdGNoZXMgKi8KKwl1aW50MzJfdCByZXAwOworCXVpbnQzMl90IHJlcDE7CisJdWludDMyX3QgcmVwMjsKKwl1aW50MzJfdCByZXAzOworCisJLyogVHlwZXMgb2YgdGhlIG1vc3QgcmVjZW50bHkgc2VlbiBMWk1BIHN5bWJvbHMgKi8KKwllbnVtIGx6bWFfc3RhdGUgc3RhdGU7CisKKwkvKgorCSAqIExlbmd0aCBvZiBhIG1hdGNoLiBUaGlzIGlzIHVwZGF0ZWQgc28gdGhhdCBkaWN0X3JlcGVhdCBjYW4KKwkgKiBiZSBjYWxsZWQgYWdhaW4gdG8gZmluaXNoIHJlcGVhdGluZyB0aGUgd2hvbGUgbWF0Y2guCisJICovCisJdWludDMyX3QgbGVuOworCisJLyoKKwkgKiBMWk1BIHByb3BlcnRpZXMgb3IgcmVsYXRlZCBiaXQgbWFza3MgKG51bWJlciBvZiBsaXRlcmFsCisJICogY29udGV4dCBiaXRzLCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIgb2YgbGl0ZXJhbAorCSAqIHBvc2l0aW9uIGJpdHMsIGFuZCBhIG1hc2sgZGVydmllZCBmcm9tIHRoZSBudW1iZXIKKwkgKiBwb3NpdGlvbiBiaXRzKQorCSAqLworCXVpbnQzMl90IGxjOworCXVpbnQzMl90IGxpdGVyYWxfcG9zX21hc2s7IC8qICgxIDw8IGxwKSAtIDEgKi8KKwl1aW50MzJfdCBwb3NfbWFzazsgICAgICAgICAvKiAoMSA8PCBwYikgLSAxICovCisKKwkvKiBJZiAxLCBpdCdzIGEgbWF0Y2guIE90aGVyd2lzZSBpdCdzIGEgc2luZ2xlIDgtYml0IGxpdGVyYWwuICovCisJdWludDE2X3QgaXNfbWF0Y2hbU1RBVEVTXVtQT1NfU1RBVEVTX01BWF07CisKKwkvKiBJZiAxLCBpdCdzIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgcmVwMCAuLiByZXAzLiAqLworCXVpbnQxNl90IGlzX3JlcFtTVEFURVNdOworCisJLyoKKwkgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDAuCisJICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDEuCisJICovCisJdWludDE2X3QgaXNfcmVwMFtTVEFURVNdOworCisJLyoKKwkgKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDEuCisJICogT3RoZXJ3aXNlIGNoZWNrIGlzX3JlcDIuCisJICovCisJdWludDE2X3QgaXNfcmVwMVtTVEFURVNdOworCisJLyogSWYgMCwgZGlzdGFuY2Ugb2YgYSByZXBlYXRlZCBtYXRjaCBpcyByZXAyLiBPdGhlcndpc2UgaXQgaXMgcmVwMy4gKi8KKwl1aW50MTZfdCBpc19yZXAyW1NUQVRFU107CisKKwkvKgorCSAqIElmIDEsIHRoZSByZXBlYXRlZCBtYXRjaCBoYXMgbGVuZ3RoIG9mIG9uZSBieXRlLiBPdGhlcndpc2UKKwkgKiB0aGUgbGVuZ3RoIGlzIGRlY29kZWQgZnJvbSByZXBfbGVuX2RlY29kZXIuCisJICovCisJdWludDE2X3QgaXNfcmVwMF9sb25nW1NUQVRFU11bUE9TX1NUQVRFU19NQVhdOworCisJLyoKKwkgKiBQcm9iYWJpbGl0eSB0cmVlIGZvciB0aGUgaGlnaGVzdCB0d28gYml0cyBvZiB0aGUgbWF0Y2gKKwkgKiBkaXN0YW5jZS4gVGhlcmUgaXMgYSBzZXBhcmF0ZSBwcm9iYWJpbGl0eSB0cmVlIGZvciBtYXRjaAorCSAqIGxlbmd0aHMgb2YgMiAoaS5lLiBNQVRDSF9MRU5fTUlOKSwgMywgNCwgYW5kIFs1LCAyNzNdLgorCSAqLworCXVpbnQxNl90IGRpc3Rfc2xvdFtESVNUX1NUQVRFU11bRElTVF9TTE9UU107CisKKwkvKgorCSAqIFByb2JpbGl0eSB0cmVlcyBmb3IgYWRkaXRpb25hbCBiaXRzIGZvciBtYXRjaCBkaXN0YW5jZQorCSAqIHdoZW4gdGhlIGRpc3RhbmNlIGlzIGluIHRoZSByYW5nZSBbNCwgMTI3XS4KKwkgKi8KKwl1aW50MTZfdCBkaXN0X3NwZWNpYWxbRlVMTF9ESVNUQU5DRVMgLSBESVNUX01PREVMX0VORF07CisKKwkvKgorCSAqIFByb2JhYmlsaXR5IHRyZWUgZm9yIHRoZSBsb3dlc3QgZm91ciBiaXRzIG9mIGEgbWF0Y2gKKwkgKiBkaXN0YW5jZSB0aGF0IGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiAxMjguCisJICovCisJdWludDE2X3QgZGlzdF9hbGlnbltBTElHTl9TSVpFXTsKKworCS8qIExlbmd0aCBvZiBhIG5vcm1hbCBtYXRjaCAqLworCXN0cnVjdCBsem1hX2xlbl9kZWMgbWF0Y2hfbGVuX2RlYzsKKworCS8qIExlbmd0aCBvZiBhIHJlcGVhdGVkIG1hdGNoICovCisJc3RydWN0IGx6bWFfbGVuX2RlYyByZXBfbGVuX2RlYzsKKworCS8qIFByb2JhYmlsaXRpZXMgb2YgbGl0ZXJhbHMgKi8KKwl1aW50MTZfdCBsaXRlcmFsW0xJVEVSQUxfQ09ERVJTX01BWF1bTElURVJBTF9DT0RFUl9TSVpFXTsKK307CisKK3N0cnVjdCBsem1hMl9kZWMgeworCS8qIFBvc2l0aW9uIGluIHh6X2RlY19sem1hMl9ydW4oKS4gKi8KKwllbnVtIGx6bWEyX3NlcSB7CisJCVNFUV9DT05UUk9MLAorCQlTRVFfVU5DT01QUkVTU0VEXzEsCisJCVNFUV9VTkNPTVBSRVNTRURfMiwKKwkJU0VRX0NPTVBSRVNTRURfMCwKKwkJU0VRX0NPTVBSRVNTRURfMSwKKwkJU0VRX1BST1BFUlRJRVMsCisJCVNFUV9MWk1BX1BSRVBBUkUsCisJCVNFUV9MWk1BX1JVTiwKKwkJU0VRX0NPUFkKKwl9IHNlcXVlbmNlOworCisJLyogTmV4dCBwb3NpdGlvbiBhZnRlciBkZWNvZGluZyB0aGUgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjaHVuay4gKi8KKwllbnVtIGx6bWEyX3NlcSBuZXh0X3NlcXVlbmNlOworCisJLyogVW5jb21wcmVzc2VkIHNpemUgb2YgTFpNQSBjaHVuayAoMiBNaUIgYXQgbWF4aW11bSkgKi8KKwl1aW50MzJfdCB1bmNvbXByZXNzZWQ7CisKKwkvKgorCSAqIENvbXByZXNzZWQgc2l6ZSBvZiBMWk1BIGNodW5rIG9yIGNvbXByZXNzZWQvdW5jb21wcmVzc2VkCisJICogc2l6ZSBvZiB1bmNvbXByZXNzZWQgY2h1bmsgKDY0IEtpQiBhdCBtYXhpbXVtKQorCSAqLworCXVpbnQzMl90IGNvbXByZXNzZWQ7CisKKwkvKgorCSAqIFRydWUgaWYgZGljdGlvbmFyeSByZXNldCBpcyBuZWVkZWQuIFRoaXMgaXMgZmFsc2UgYmVmb3JlCisJICogdGhlIGZpcnN0IGNodW5rIChMWk1BIG9yIHVuY29tcHJlc3NlZCkuCisJICovCisJYm9vbCBuZWVkX2RpY3RfcmVzZXQ7CisKKwkvKgorCSAqIFRydWUgaWYgbmV3IExaTUEgcHJvcGVydGllcyBhcmUgbmVlZGVkLiBUaGlzIGlzIGZhbHNlCisJICogYmVmb3JlIHRoZSBmaXJzdCBMWk1BIGNodW5rLgorCSAqLworCWJvb2wgbmVlZF9wcm9wczsKK307CisKK3N0cnVjdCB4el9kZWNfbHptYTIgeworCS8qCisJICogVGhlIG9yZGVyIGJlbG93IGlzIGltcG9ydGFudCBvbiB4ODYgdG8gcmVkdWNlIGNvZGUgc2l6ZSBhbmQKKwkgKiBpdCBzaG91bGRuJ3QgaHVydCBvbiBvdGhlciBwbGF0Zm9ybXMuIEV2ZXJ5dGhpbmcgdXAgdG8gYW5kCisJICogaW5jbHVkaW5nIGx6bWEucG9zX21hc2sgYXJlIGluIHRoZSBmaXJzdCAxMjggYnl0ZXMgb24geDg2LTMyLAorCSAqIHdoaWNoIGFsbG93cyB1c2luZyBzbWFsbGVyIGluc3RydWN0aW9ucyB0byBhY2Nlc3MgdGhvc2UKKwkgKiB2YXJpYWJsZXMuIE9uIHg4Ni02NCwgZmV3ZXIgdmFyaWFibGVzIGZpdCBpbnRvIHRoZSBmaXJzdCAxMjgKKwkgKiBieXRlcywgYnV0IHRoaXMgaXMgc3RpbGwgdGhlIGJlc3Qgb3JkZXIgd2l0aG91dCBzYWNyaWZpY2luZworCSAqIHRoZSByZWFkYWJpbGl0eSBieSBzcGxpdHRpbmcgdGhlIHN0cnVjdHVyZXMuCisJICovCisJc3RydWN0IHJjX2RlYyByYzsKKwlzdHJ1Y3QgZGljdGlvbmFyeSBkaWN0OworCXN0cnVjdCBsem1hMl9kZWMgbHptYTI7CisJc3RydWN0IGx6bWFfZGVjIGx6bWE7CisKKwkvKgorCSAqIFRlbXBvcmFyeSBidWZmZXIgd2hpY2ggaG9sZHMgc21hbGwgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGJldHdlZW4KKwkgKiBkZWNvZGVyIGNhbGxzLiBTZWUgbHptYTJfbHptYSgpIGZvciBkZXRhaWxzLgorCSAqLworCXN0cnVjdCB7CisJCXVpbnQzMl90IHNpemU7CisJCXVpbnQ4X3QgYnVmWzMgKiBMWk1BX0lOX1JFUVVJUkVEXTsKKwl9IHRlbXA7Cit9OworCisvKioqKioqKioqKioqKioKKyAqIERpY3Rpb25hcnkgKgorICoqKioqKioqKioqKioqLworCisvKgorICogUmVzZXQgdGhlIGRpY3Rpb25hcnkgc3RhdGUuIFdoZW4gaW4gc2luZ2xlLWNhbGwgbW9kZSwgc2V0IHVwIHRoZSBiZWdpbm5pbmcKKyAqIG9mIHRoZSBkaWN0aW9uYXJ5IHRvIHBvaW50IHRvIHRoZSBhY3R1YWwgb3V0cHV0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQgZGljdF9yZXNldChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlpZiAoREVDX0lTX1NJTkdMRShkaWN0LT5tb2RlKSkgeworCQlkaWN0LT5idWYgPSBiLT5vdXQgKyBiLT5vdXRfcG9zOworCQlkaWN0LT5lbmQgPSBiLT5vdXRfc2l6ZSAtIGItPm91dF9wb3M7CisJfQorCisJZGljdC0+c3RhcnQgPSAwOworCWRpY3QtPnBvcyA9IDA7CisJZGljdC0+bGltaXQgPSAwOworCWRpY3QtPmZ1bGwgPSAwOworfQorCisvKiBTZXQgZGljdGlvbmFyeSB3cml0ZSBsaW1pdCAqLworc3RhdGljIHZvaWQgZGljdF9saW1pdChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc2l6ZV90IG91dF9tYXgpCit7CisJaWYgKGRpY3QtPmVuZCAtIGRpY3QtPnBvcyA8PSBvdXRfbWF4KQorCQlkaWN0LT5saW1pdCA9IGRpY3QtPmVuZDsKKwllbHNlCisJCWRpY3QtPmxpbWl0ID0gZGljdC0+cG9zICsgb3V0X21heDsKK30KKworLyogUmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGJ5dGUgY2FuIGJlIHdyaXR0ZW4gaW50byB0aGUgZGljdGlvbmFyeS4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkaWN0X2hhc19zcGFjZShjb25zdCBzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCkKK3sKKwlyZXR1cm4gZGljdC0+cG9zIDwgZGljdC0+bGltaXQ7Cit9CisKKy8qCisgKiBHZXQgYSBieXRlIGZyb20gdGhlIGRpY3Rpb25hcnkgYXQgdGhlIGdpdmVuIGRpc3RhbmNlLiBUaGUgZGlzdGFuY2UgaXMKKyAqIGFzc3VtZWQgdG8gdmFsaWQsIG9yIGFzIGEgc3BlY2lhbCBjYXNlLCB6ZXJvIHdoZW4gdGhlIGRpY3Rpb25hcnkgaXMKKyAqIHN0aWxsIGVtcHR5LiBUaGlzIHNwZWNpYWwgY2FzZSBpcyBuZWVkZWQgZm9yIHNpbmdsZS1jYWxsIGRlY29kaW5nIHRvCisgKiBhdm9pZCB3cml0aW5nIGEgJ1wwJyB0byB0aGUgZW5kIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgZGljdF9nZXQoY29uc3Qgc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQzMl90IGRpc3QpCit7CisJc2l6ZV90IG9mZnNldCA9IGRpY3QtPnBvcyAtIGRpc3QgLSAxOworCisJaWYgKGRpc3QgPj0gZGljdC0+cG9zKQorCQlvZmZzZXQgKz0gZGljdC0+ZW5kOworCisJcmV0dXJuIGRpY3QtPmZ1bGwgPiAwID8gZGljdC0+YnVmW29mZnNldF0gOiAwOworfQorCisvKgorICogUHV0IG9uZSBieXRlIGludG8gdGhlIGRpY3Rpb25hcnkuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSBpcyBzcGFjZSBmb3IgaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkaWN0X3B1dChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgdWludDhfdCBieXRlKQoreworCWRpY3QtPmJ1ZltkaWN0LT5wb3MrK10gPSBieXRlOworCisJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCWRpY3QtPmZ1bGwgPSBkaWN0LT5wb3M7Cit9CisKKy8qCisgKiBSZXBlYXQgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRpc3RhbmNlLiBJZiB0aGUgZGlzdGFuY2UgaXMKKyAqIGludmFsaWQsIGZhbHNlIGlzIHJldHVybmVkLiBPbiBzdWNjZXNzLCB0cnVlIGlzIHJldHVybmVkIGFuZCAqbGVuIGlzCisgKiB1cGRhdGVkIHRvIGluZGljYXRlIGhvdyBtYW55IGJ5dGVzIHdlcmUgbGVmdCB0byBiZSByZXBlYXRlZC4KKyAqLworc3RhdGljIGJvb2wgZGljdF9yZXBlYXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHVpbnQzMl90ICpsZW4sIHVpbnQzMl90IGRpc3QpCit7CisJc2l6ZV90IGJhY2s7CisJdWludDMyX3QgbGVmdDsKKworCWlmIChkaXN0ID49IGRpY3QtPmZ1bGwgfHwgZGlzdCA+PSBkaWN0LT5zaXplKQorCQlyZXR1cm4gZmFsc2U7CisKKwlsZWZ0ID0gbWluX3Qoc2l6ZV90LCBkaWN0LT5saW1pdCAtIGRpY3QtPnBvcywgKmxlbik7CisJKmxlbiAtPSBsZWZ0OworCisJYmFjayA9IGRpY3QtPnBvcyAtIGRpc3QgLSAxOworCWlmIChkaXN0ID49IGRpY3QtPnBvcykKKwkJYmFjayArPSBkaWN0LT5lbmQ7CisKKwlkbyB7CisJCWRpY3QtPmJ1ZltkaWN0LT5wb3MrK10gPSBkaWN0LT5idWZbYmFjaysrXTsKKwkJaWYgKGJhY2sgPT0gZGljdC0+ZW5kKQorCQkJYmFjayA9IDA7CisJfSB3aGlsZSAoLS1sZWZ0ID4gMCk7CisKKwlpZiAoZGljdC0+ZnVsbCA8IGRpY3QtPnBvcykKKwkJZGljdC0+ZnVsbCA9IGRpY3QtPnBvczsKKworCXJldHVybiB0cnVlOworfQorCisvKiBDb3B5IHVuY29tcHJlc3NlZCBkYXRhIGFzIGlzIGZyb20gaW5wdXQgdG8gZGljdGlvbmFyeSBhbmQgb3V0cHV0IGJ1ZmZlcnMuICovCitzdGF0aWMgdm9pZCBkaWN0X3VuY29tcHJlc3NlZChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYiwKKwkJCSAgICAgIHVpbnQzMl90ICpsZWZ0KQoreworCXNpemVfdCBjb3B5X3NpemU7CisKKwl3aGlsZSAoKmxlZnQgPiAwICYmIGItPmluX3BvcyA8IGItPmluX3NpemUKKwkJCSYmIGItPm91dF9wb3MgPCBiLT5vdXRfc2l6ZSkgeworCQljb3B5X3NpemUgPSBtaW4oYi0+aW5fc2l6ZSAtIGItPmluX3BvcywKKwkJCQliLT5vdXRfc2l6ZSAtIGItPm91dF9wb3MpOworCQlpZiAoY29weV9zaXplID4gZGljdC0+ZW5kIC0gZGljdC0+cG9zKQorCQkJY29weV9zaXplID0gZGljdC0+ZW5kIC0gZGljdC0+cG9zOworCQlpZiAoY29weV9zaXplID4gKmxlZnQpCisJCQljb3B5X3NpemUgPSAqbGVmdDsKKworCQkqbGVmdCAtPSBjb3B5X3NpemU7CisKKwkJbWVtY3B5KGRpY3QtPmJ1ZiArIGRpY3QtPnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisJCWRpY3QtPnBvcyArPSBjb3B5X3NpemU7CisKKwkJaWYgKGRpY3QtPmZ1bGwgPCBkaWN0LT5wb3MpCisJCQlkaWN0LT5mdWxsID0gZGljdC0+cG9zOworCisJCWlmIChERUNfSVNfTVVMVEkoZGljdC0+bW9kZSkpIHsKKwkJCWlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorCQkJCWRpY3QtPnBvcyA9IDA7CisKKwkJCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBiLT5pbiArIGItPmluX3BvcywKKwkJCQkJY29weV9zaXplKTsKKwkJfQorCisJCWRpY3QtPnN0YXJ0ID0gZGljdC0+cG9zOworCisJCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCQliLT5pbl9wb3MgKz0gY29weV9zaXplOworCX0KK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZGF0YSBmcm9tIGRpY3Rpb25hcnkgdG8gYi0+b3V0LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBzcGFjZSBpbiBiLT5vdXQuIFRoaXMgaXMgZ3VhcmFudGVlZCBiZWNhdXNlIGNhbGxlciB1c2VzIGRpY3RfbGltaXQoKQorICogYmVmb3JlIGRlY29kaW5nIGRhdGEgaW50byB0aGUgZGljdGlvbmFyeS4KKyAqLworc3RhdGljIHVpbnQzMl90IGRpY3RfZmx1c2goc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGNvcHlfc2l6ZSA9IGRpY3QtPnBvcyAtIGRpY3QtPnN0YXJ0OworCisJaWYgKERFQ19JU19NVUxUSShkaWN0LT5tb2RlKSkgeworCQlpZiAoZGljdC0+cG9zID09IGRpY3QtPmVuZCkKKwkJCWRpY3QtPnBvcyA9IDA7CisKKwkJbWVtY3B5KGItPm91dCArIGItPm91dF9wb3MsIGRpY3QtPmJ1ZiArIGRpY3QtPnN0YXJ0LAorCQkJCWNvcHlfc2l6ZSk7CisJfQorCisJZGljdC0+c3RhcnQgPSBkaWN0LT5wb3M7CisJYi0+b3V0X3BvcyArPSBjb3B5X3NpemU7CisJcmV0dXJuIGNvcHlfc2l6ZTsKK30KKworLyoqKioqKioqKioqKioqKioqCisgKiBSYW5nZSBkZWNvZGVyICoKKyAqKioqKioqKioqKioqKioqKi8KKworLyogUmVzZXQgdGhlIHJhbmdlIGRlY29kZXIuICovCitzdGF0aWMgdm9pZCByY19yZXNldChzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyYy0+cmFuZ2UgPSAodWludDMyX3QpLTE7CisJcmMtPmNvZGUgPSAwOworCXJjLT5pbml0X2J5dGVzX2xlZnQgPSBSQ19JTklUX0JZVEVTOworfQorCisvKgorICogUmVhZCB0aGUgZmlyc3QgZml2ZSBpbml0aWFsIGJ5dGVzIGludG8gcmMtPmNvZGUgaWYgdGhleSBoYXZlbid0IGJlZW4KKyAqIHJlYWQgYWxyZWFkeS4gKFllcywgdGhlIGZpcnN0IGJ5dGUgZ2V0cyBjb21wbGV0ZWx5IGlnbm9yZWQuKQorICovCitzdGF0aWMgYm9vbCByY19yZWFkX2luaXQoc3RydWN0IHJjX2RlYyAqcmMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJd2hpbGUgKHJjLT5pbml0X2J5dGVzX2xlZnQgPiAwKSB7CisJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSArIGItPmluW2ItPmluX3BvcysrXTsKKwkJLS1yYy0+aW5pdF9ieXRlc19sZWZ0OworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBtYXkgbm90IGJlIGVub3VnaCBpbnB1dCBmb3IgdGhlIG5leHQgZGVjb2RpbmcgbG9vcC4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByY19saW1pdF9leGNlZWRlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyZXR1cm4gcmMtPmluX3BvcyA+IHJjLT5pbl9saW1pdDsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIChmcm9tIHBvaW50IG9mIHZpZXcgb2YgcmFuZ2UgZGVjb2RlcikgdGhhdAorICogd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIExaTUEgY2h1bmsuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCByY19pc19maW5pc2hlZChjb25zdCBzdHJ1Y3QgcmNfZGVjICpyYykKK3sKKwlyZXR1cm4gcmMtPmNvZGUgPT0gMDsKK30KKworLyogUmVhZCB0aGUgbmV4dCBpbnB1dCBieXRlIGlmIG5lZWRlZC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCByY19ub3JtYWxpemUoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8IFJDX1RPUF9WQUxVRSkgeworCQlyYy0+cmFuZ2UgPDw9IFJDX1NISUZUX0JJVFM7CisJCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IFJDX1NISUZUX0JJVFMpICsgcmMtPmluW3JjLT5pbl9wb3MrK107CisJfQorfQorCisvKgorICogRGVjb2RlIG9uZSBiaXQuIEluIHNvbWUgdmVyc2lvbnMsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gc3BsaXR0ZWQgaW4gdGhyZWUKKyAqIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBjb21waWxlciBpcyBzdXBwb3NlZCB0byBiZSBhYmxlIHRvIG1vcmUgZWFzaWx5IGF2b2lkCisgKiBhbiBleHRyYSBicmFuY2guIEluIHRoaXMgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBMWk1BIGRlY29kZXIsIHRoaXMKKyAqIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2QgaWRlYSAodGVzdGVkIHdpdGggR0NDIDMuMy42LCAzLjQuNiwgYW5kIDQuMy4zCisgKiBvbiB4ODYpLiBVc2luZyBhIG5vbi1zcGxpdHRlZCB2ZXJzaW9uIHJlc3VsdHMgaW4gbmljZXIgbG9va2luZyBjb2RlIHRvby4KKyAqCisgKiBOT1RFOiBUaGlzIG11c3QgcmV0dXJuIGFuIGludC4gRG8gbm90IG1ha2UgaXQgcmV0dXJuIGEgYm9vbCBvciB0aGUgc3BlZWQKKyAqIG9mIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBHQ0MgMy54IGRlY3JlYXNlcyAxMC0xNSAlLiAoR0NDIDQuMyBkb2Vzbid0IGNhcmUsCisgKiBhbmQgaXQgZ2VuZXJhdGVzIDEwLTIwICUgZmFzdGVyIGNvZGUgdGhhbiBHQ0MgMy54IGZyb20gdGhpcyBmaWxlIGFueXdheS4pCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHJjX2JpdChzdHJ1Y3QgcmNfZGVjICpyYywgdWludDE2X3QgKnByb2IpCit7CisJdWludDMyX3QgYm91bmQ7CisJaW50IGJpdDsKKworCXJjX25vcm1hbGl6ZShyYyk7CisJYm91bmQgPSAocmMtPnJhbmdlID4+IFJDX0JJVF9NT0RFTF9UT1RBTF9CSVRTKSAqICpwcm9iOworCWlmIChyYy0+Y29kZSA8IGJvdW5kKSB7CisJCXJjLT5yYW5nZSA9IGJvdW5kOworCQkqcHJvYiArPSAoUkNfQklUX01PREVMX1RPVEFMIC0gKnByb2IpID4+IFJDX01PVkVfQklUUzsKKwkJYml0ID0gMDsKKwl9IGVsc2UgeworCQlyYy0+cmFuZ2UgLT0gYm91bmQ7CisJCXJjLT5jb2RlIC09IGJvdW5kOworCQkqcHJvYiAtPSAqcHJvYiA+PiBSQ19NT1ZFX0JJVFM7CisJCWJpdCA9IDE7CisJfQorCisJcmV0dXJuIGJpdDsKK30KKworLyogRGVjb2RlIGEgYml0dHJlZSBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdWludDMyX3QgcmNfYml0dHJlZShzdHJ1Y3QgcmNfZGVjICpyYywKKwkJCQkJICAgdWludDE2X3QgKnByb2JzLCB1aW50MzJfdCBsaW1pdCkKK3sKKwl1aW50MzJfdCBzeW1ib2wgPSAxOworCisJZG8geworCQlpZiAocmNfYml0KHJjLCAmcHJvYnNbc3ltYm9sXSkpCisJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJZWxzZQorCQkJc3ltYm9sIDw8PSAxOworCX0gd2hpbGUgKHN5bWJvbCA8IGxpbWl0KTsKKworCXJldHVybiBzeW1ib2w7Cit9CisKKy8qIERlY29kZSBhIGJpdHRyZWUgc3RhcnRpbmcgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0LiAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJjX2JpdHRyZWVfcmV2ZXJzZShzdHJ1Y3QgcmNfZGVjICpyYywKKwkJCQkJICAgICAgIHVpbnQxNl90ICpwcm9icywKKwkJCQkJICAgICAgIHVpbnQzMl90ICpkZXN0LCB1aW50MzJfdCBsaW1pdCkKK3sKKwl1aW50MzJfdCBzeW1ib2wgPSAxOworCXVpbnQzMl90IGkgPSAwOworCisJZG8geworCQlpZiAocmNfYml0KHJjLCAmcHJvYnNbc3ltYm9sXSkpIHsKKwkJCXN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworCQkJKmRlc3QgKz0gMSA8PCBpOworCQl9IGVsc2UgeworCQkJc3ltYm9sIDw8PSAxOworCQl9CisJfSB3aGlsZSAoKytpIDwgbGltaXQpOworfQorCisvKiBEZWNvZGUgZGlyZWN0IGJpdHMgKGZpeGVkIGZpZnR5LWZpZnR5IHByb2JhYmlsaXR5KSAqLworc3RhdGljIGlubGluZSB2b2lkIHJjX2RpcmVjdChzdHJ1Y3QgcmNfZGVjICpyYywgdWludDMyX3QgKmRlc3QsIHVpbnQzMl90IGxpbWl0KQoreworCXVpbnQzMl90IG1hc2s7CisKKwlkbyB7CisJCXJjX25vcm1hbGl6ZShyYyk7CisJCXJjLT5yYW5nZSA+Pj0gMTsKKwkJcmMtPmNvZGUgLT0gcmMtPnJhbmdlOworCQltYXNrID0gKHVpbnQzMl90KTAgLSAocmMtPmNvZGUgPj4gMzEpOworCQlyYy0+Y29kZSArPSByYy0+cmFuZ2UgJiBtYXNrOworCQkqZGVzdCA9ICgqZGVzdCA8PCAxKSArIChtYXNrICsgMSk7CisJfSB3aGlsZSAoLS1saW1pdCA+IDApOworfQorCisvKioqKioqKioKKyAqIExaTUEgKgorICoqKioqKioqLworCisvKiBHZXQgcG9pbnRlciB0byBsaXRlcmFsIGNvZGVyIHByb2JhYmlsaXR5IGFycmF5LiAqLworc3RhdGljIHVpbnQxNl90ICpsem1hX2xpdGVyYWxfcHJvYnMoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MzJfdCBwcmV2X2J5dGUgPSBkaWN0X2dldCgmcy0+ZGljdCwgMCk7CisJdWludDMyX3QgbG93ID0gcHJldl9ieXRlID4+ICg4IC0gcy0+bHptYS5sYyk7CisJdWludDMyX3QgaGlnaCA9IChzLT5kaWN0LnBvcyAmIHMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzaykgPDwgcy0+bHptYS5sYzsKKwlyZXR1cm4gcy0+bHptYS5saXRlcmFsW2xvdyArIGhpZ2hdOworfQorCisvKiBEZWNvZGUgYSBsaXRlcmFsIChvbmUgOC1iaXQgYnl0ZSkgKi8KK3N0YXRpYyB2b2lkIGx6bWFfbGl0ZXJhbChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBzeW1ib2w7CisJdWludDMyX3QgbWF0Y2hfYnl0ZTsKKwl1aW50MzJfdCBtYXRjaF9iaXQ7CisJdWludDMyX3Qgb2Zmc2V0OworCXVpbnQzMl90IGk7CisKKwlwcm9icyA9IGx6bWFfbGl0ZXJhbF9wcm9icyhzKTsKKworCWlmIChsem1hX3N0YXRlX2lzX2xpdGVyYWwocy0+bHptYS5zdGF0ZSkpIHsKKwkJc3ltYm9sID0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCAweDEwMCk7CisJfSBlbHNlIHsKKwkJc3ltYm9sID0gMTsKKwkJbWF0Y2hfYnl0ZSA9IGRpY3RfZ2V0KCZzLT5kaWN0LCBzLT5sem1hLnJlcDApIDw8IDE7CisJCW9mZnNldCA9IDB4MTAwOworCisJCWRvIHsKKwkJCW1hdGNoX2JpdCA9IG1hdGNoX2J5dGUgJiBvZmZzZXQ7CisJCQltYXRjaF9ieXRlIDw8PSAxOworCQkJaSA9IG9mZnNldCArIG1hdGNoX2JpdCArIHN5bWJvbDsKKworCQkJaWYgKHJjX2JpdCgmcy0+cmMsICZwcm9ic1tpXSkpIHsKKwkJCQlzeW1ib2wgPSAoc3ltYm9sIDw8IDEpICsgMTsKKwkJCQlvZmZzZXQgJj0gbWF0Y2hfYml0OworCQkJfSBlbHNlIHsKKwkJCQlzeW1ib2wgPDw9IDE7CisJCQkJb2Zmc2V0ICY9IH5tYXRjaF9iaXQ7CisJCQl9CisJCX0gd2hpbGUgKHN5bWJvbCA8IDB4MTAwKTsKKwl9CisKKwlkaWN0X3B1dCgmcy0+ZGljdCwgKHVpbnQ4X3Qpc3ltYm9sKTsKKwlsem1hX3N0YXRlX2xpdGVyYWwoJnMtPmx6bWEuc3RhdGUpOworfQorCisvKiBEZWNvZGUgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2ggaW50byBzLT5sem1hLmxlbi4gKi8KK3N0YXRpYyB2b2lkIGx6bWFfbGVuKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHN0cnVjdCBsem1hX2xlbl9kZWMgKmwsCisJCSAgICAgdWludDMyX3QgcG9zX3N0YXRlKQoreworCXVpbnQxNl90ICpwcm9iczsKKwl1aW50MzJfdCBsaW1pdDsKKworCWlmICghcmNfYml0KCZzLT5yYywgJmwtPmNob2ljZSkpIHsKKwkJcHJvYnMgPSBsLT5sb3dbcG9zX3N0YXRlXTsKKwkJbGltaXQgPSBMRU5fTE9XX1NZTUJPTFM7CisJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTjsKKwl9IGVsc2UgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UyKSkgeworCQkJcHJvYnMgPSBsLT5taWRbcG9zX3N0YXRlXTsKKwkJCWxpbWl0ID0gTEVOX01JRF9TWU1CT0xTOworCQkJcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTOworCQl9IGVsc2UgeworCQkJcHJvYnMgPSBsLT5oaWdoOworCQkJbGltaXQgPSBMRU5fSElHSF9TWU1CT0xTOworCQkJcy0+bHptYS5sZW4gPSBNQVRDSF9MRU5fTUlOICsgTEVOX0xPV19TWU1CT0xTCisJCQkJCSsgTEVOX01JRF9TWU1CT0xTOworCQl9CisJfQorCisJcy0+bHptYS5sZW4gKz0gcmNfYml0dHJlZSgmcy0+cmMsIHByb2JzLCBsaW1pdCkgLSBsaW1pdDsKK30KKworLyogRGVjb2RlIGEgbWF0Y2guIFRoZSBkaXN0YW5jZSB3aWxsIGJlIHN0b3JlZCBpbiBzLT5sem1hLnJlcDAuICovCitzdGF0aWMgdm9pZCBsem1hX21hdGNoKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgZGlzdF9zbG90OworCXVpbnQzMl90IGxpbWl0OworCisJbHptYV9zdGF0ZV9tYXRjaCgmcy0+bHptYS5zdGF0ZSk7CisKKwlzLT5sem1hLnJlcDMgPSBzLT5sem1hLnJlcDI7CisJcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworCXMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKworCWx6bWFfbGVuKHMsICZzLT5sem1hLm1hdGNoX2xlbl9kZWMsIHBvc19zdGF0ZSk7CisKKwlwcm9icyA9IHMtPmx6bWEuZGlzdF9zbG90W2x6bWFfZ2V0X2Rpc3Rfc3RhdGUocy0+bHptYS5sZW4pXTsKKwlkaXN0X3Nsb3QgPSByY19iaXR0cmVlKCZzLT5yYywgcHJvYnMsIERJU1RfU0xPVFMpIC0gRElTVF9TTE9UUzsKKworCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX1NUQVJUKSB7CisJCXMtPmx6bWEucmVwMCA9IGRpc3Rfc2xvdDsKKwl9IGVsc2UgeworCQlsaW1pdCA9IChkaXN0X3Nsb3QgPj4gMSkgLSAxOworCQlzLT5sem1hLnJlcDAgPSAyICsgKGRpc3Rfc2xvdCAmIDEpOworCisJCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX0VORCkgeworCQkJcy0+bHptYS5yZXAwIDw8PSBsaW1pdDsKKwkJCXByb2JzID0gcy0+bHptYS5kaXN0X3NwZWNpYWwgKyBzLT5sem1hLnJlcDAKKwkJCQkJLSBkaXN0X3Nsb3QgLSAxOworCQkJcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcHJvYnMsCisJCQkJCSZzLT5sem1hLnJlcDAsIGxpbWl0KTsKKwkJfSBlbHNlIHsKKwkJCXJjX2RpcmVjdCgmcy0+cmMsICZzLT5sem1hLnJlcDAsIGxpbWl0IC0gQUxJR05fQklUUyk7CisJCQlzLT5sem1hLnJlcDAgPDw9IEFMSUdOX0JJVFM7CisJCQlyY19iaXR0cmVlX3JldmVyc2UoJnMtPnJjLCBzLT5sem1hLmRpc3RfYWxpZ24sCisJCQkJCSZzLT5sem1hLnJlcDAsIEFMSUdOX0JJVFMpOworCQl9CisJfQorfQorCisvKgorICogRGVjb2RlIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgdGhlIGZvdXIgbW9zdCByZWNlbnRseQorICogc2VlbiBtYXRjaGVzLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLgorICovCitzdGF0aWMgdm9pZCBsem1hX3JlcF9tYXRjaChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50MzJfdCBwb3Nfc3RhdGUpCit7CisJdWludDMyX3QgdG1wOworCisJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAwW3MtPmx6bWEuc3RhdGVdKSkgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDBfbG9uZ1sKKwkJCQlzLT5sem1hLnN0YXRlXVtwb3Nfc3RhdGVdKSkgeworCQkJbHptYV9zdGF0ZV9zaG9ydF9yZXAoJnMtPmx6bWEuc3RhdGUpOworCQkJcy0+bHptYS5sZW4gPSAxOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAxW3MtPmx6bWEuc3RhdGVdKSkgeworCQkJdG1wID0gcy0+bHptYS5yZXAxOworCQl9IGVsc2UgeworCQkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXAyW3MtPmx6bWEuc3RhdGVdKSkgeworCQkJCXRtcCA9IHMtPmx6bWEucmVwMjsKKwkJCX0gZWxzZSB7CisJCQkJdG1wID0gcy0+bHptYS5yZXAzOworCQkJCXMtPmx6bWEucmVwMyA9IHMtPmx6bWEucmVwMjsKKwkJCX0KKworCQkJcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworCQl9CisKKwkJcy0+bHptYS5yZXAxID0gcy0+bHptYS5yZXAwOworCQlzLT5sem1hLnJlcDAgPSB0bXA7CisJfQorCisJbHptYV9zdGF0ZV9sb25nX3JlcCgmcy0+bHptYS5zdGF0ZSk7CisJbHptYV9sZW4ocywgJnMtPmx6bWEucmVwX2xlbl9kZWMsIHBvc19zdGF0ZSk7Cit9CisKKy8qIExaTUEgZGVjb2RlciBjb3JlICovCitzdGF0aWMgYm9vbCBsem1hX21haW4oc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MzJfdCBwb3Nfc3RhdGU7CisKKwkvKgorCSAqIElmIHRoZSBkaWN0aW9uYXJ5IHdhcyByZWFjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgY2FsbCwgdHJ5IHRvCisJICogZmluaXNoIHRoZSBwb3NzaWJseSBwZW5kaW5nIHJlcGVhdCBpbiB0aGUgZGljdGlvbmFyeS4KKwkgKi8KKwlpZiAoZGljdF9oYXNfc3BhY2UoJnMtPmRpY3QpICYmIHMtPmx6bWEubGVuID4gMCkKKwkJZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKTsKKworCS8qCisJICogRGVjb2RlIG1vcmUgTFpNQSBzeW1ib2xzLiBPbmUgaXRlcmF0aW9uIG1heSBjb25zdW1lIHVwIHRvCisJICogTFpNQV9JTl9SRVFVSVJFRCAtIDEgYnl0ZXMuCisJICovCisJd2hpbGUgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiAhcmNfbGltaXRfZXhjZWVkZWQoJnMtPnJjKSkgeworCQlwb3Nfc3RhdGUgPSBzLT5kaWN0LnBvcyAmIHMtPmx6bWEucG9zX21hc2s7CisKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19tYXRjaFsKKwkJCQlzLT5sem1hLnN0YXRlXVtwb3Nfc3RhdGVdKSkgeworCQkJbHptYV9saXRlcmFsKHMpOworCQl9IGVsc2UgeworCQkJaWYgKHJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcFtzLT5sem1hLnN0YXRlXSkpCisJCQkJbHptYV9yZXBfbWF0Y2gocywgcG9zX3N0YXRlKTsKKwkJCWVsc2UKKwkJCQlsem1hX21hdGNoKHMsIHBvc19zdGF0ZSk7CisKKwkJCWlmICghZGljdF9yZXBlYXQoJnMtPmRpY3QsICZzLT5sem1hLmxlbiwgcy0+bHptYS5yZXAwKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkvKgorCSAqIEhhdmluZyB0aGUgcmFuZ2UgZGVjb2RlciBhbHdheXMgbm9ybWFsaXplZCB3aGVuIHdlIGFyZSBvdXRzaWRlCisJICogdGhpcyBmdW5jdGlvbiBtYWtlcyBpdCBlYXNpZXIgdG8gY29ycmVjdGx5IGhhbmRsZSBlbmQgb2YgdGhlIGNodW5rLgorCSAqLworCXJjX25vcm1hbGl6ZSgmcy0+cmMpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgTFpNQSBkZWNvZGVyIGFuZCByYW5nZSBkZWNvZGVyIHN0YXRlLiBEaWN0aW9uYXJ5IGlzIG5vcmUgcmVzZXQKKyAqIGhlcmUsIGJlY2F1c2UgTFpNQSBzdGF0ZSBtYXkgYmUgcmVzZXQgd2l0aG91dCByZXNldHRpbmcgdGhlIGRpY3Rpb25hcnkuCisgKi8KK3N0YXRpYyB2b2lkIGx6bWFfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJc2l6ZV90IGk7CisKKwlzLT5sem1hLnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKwlzLT5sem1hLnJlcDAgPSAwOworCXMtPmx6bWEucmVwMSA9IDA7CisJcy0+bHptYS5yZXAyID0gMDsKKwlzLT5sem1hLnJlcDMgPSAwOworCisJLyoKKwkgKiBBbGwgcHJvYmFiaWxpdGllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWUuIFRoaXMgaGFjaworCSAqIG1ha2VzIHRoZSBjb2RlIHNtYWxsZXIgYnkgYXZvaWRpbmcgYSBzZXBhcmF0ZSBsb29wIGZvciBlYWNoCisJICogcHJvYmFiaWxpdHkgYXJyYXkuCisJICoKKwkgKiBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBzbyB0aGF0IG9ubHkgdGhhdCBwYXJ0IG9mIGxpdGVyYWwKKwkgKiBwcm9iYWJpbGl0aWVzIHRoYXQgYXJlIGFjdHVhbGx5IHJlcXVpcmVkLiBJbiB0aGUgY29tbW9uIGNhc2UKKwkgKiB3ZSB3b3VsZCB3cml0ZSAxMiBLaUIgbGVzcy4KKwkgKi8KKwlwcm9icyA9IHMtPmx6bWEuaXNfbWF0Y2hbMF07CisJZm9yIChpID0gMDsgaSA8IFBST0JTX1RPVEFMOyArK2kpCisJCXByb2JzW2ldID0gUkNfQklUX01PREVMX1RPVEFMIC8gMjsKKworCXJjX3Jlc2V0KCZzLT5yYyk7Cit9CisKKy8qCisgKiBEZWNvZGUgYW5kIHZhbGlkYXRlIExaTUEgcHJvcGVydGllcyAobGMvbHAvcGIpIGFuZCBjYWxjdWxhdGUgdGhlIGJpdCBtYXNrcworICogZnJvbSB0aGUgZGVjb2RlZCBscCBhbmQgcGIgdmFsdWVzLiBPbiBzdWNjZXNzLCB0aGUgTFpNQSBkZWNvZGVyIHN0YXRlIGlzCisgKiByZXNldCBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGJvb2wgbHptYV9wcm9wcyhzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50OF90IHByb3BzKQoreworCWlmIChwcm9wcyA+ICg0ICogNSArIDQpICogOSArIDgpCisJCXJldHVybiBmYWxzZTsKKworCXMtPmx6bWEucG9zX21hc2sgPSAwOworCXdoaWxlIChwcm9wcyA+PSA5ICogNSkgeworCQlwcm9wcyAtPSA5ICogNTsKKwkJKytzLT5sem1hLnBvc19tYXNrOworCX0KKworCXMtPmx6bWEucG9zX21hc2sgPSAoMSA8PCBzLT5sem1hLnBvc19tYXNrKSAtIDE7CisKKwlzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPSAwOworCXdoaWxlIChwcm9wcyA+PSA5KSB7CisJCXByb3BzIC09IDk7CisJCSsrcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrOworCX0KKworCXMtPmx6bWEubGMgPSBwcm9wczsKKworCWlmIChzLT5sem1hLmxjICsgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID4gNCkKKwkJcmV0dXJuIGZhbHNlOworCisJcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrID0gKDEgPDwgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrKSAtIDE7CisKKwlsem1hX3Jlc2V0KHMpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qKioqKioqKioKKyAqIExaTUEyICoKKyAqKioqKioqKiovCisKKy8qCisgKiBUaGUgTFpNQSBkZWNvZGVyIGFzc3VtZXMgdGhhdCBpZiB0aGUgaW5wdXQgbGltaXQgKHMtPnJjLmluX2xpbWl0KSBoYXNuJ3QKKyAqIGJlZW4gZXhjZWVkZWQsIGl0IGlzIHNhZmUgdG8gcmVhZCB1cCB0byBMWk1BX0lOX1JFUVVJUkVEIGJ5dGVzLiBUaGlzCisgKiB3cmFwcGVyIGZ1bmN0aW9uIHRha2VzIGNhcmUgb2YgbWFraW5nIHRoZSBMWk1BIGRlY29kZXIncyBhc3N1bXB0aW9uIHNhZmUuCisgKgorICogQXMgbG9uZyBhcyB0aGVyZSBpcyBwbGVudHkgb2YgaW5wdXQgbGVmdCB0byBiZSBkZWNvZGVkIGluIHRoZSBjdXJyZW50IExaTUEKKyAqIGNodW5rLCB3ZSBkZWNvZGUgZGlyZWN0bHkgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGlucHV0IGJ1ZmZlciB1bnRpbAorICogdGhlcmUncyBMWk1BX0lOX1JFUVVJUkVEIGJ5dGVzIGxlZnQuIFRob3NlIHJlbWFpbmluZyBieXRlcyBhcmUgY29waWVkIGludG8KKyAqIHMtPnRlbXAuYnVmLCB3aGljaCAoaG9wZWZ1bGx5KSBnZXRzIGZpbGxlZCBvbiB0aGUgbmV4dCBjYWxsIHRvIHRoaXMKKyAqIGZ1bmN0aW9uLiBXZSBkZWNvZGUgYSBmZXcgYnl0ZXMgZnJvbSB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBzbyB0aGF0IHdlIGNhbgorICogY29udGludWUgZGVjb2RpbmcgZnJvbSB0aGUgY2FsbGVyLXN1cHBsaWVkIGlucHV0IGJ1ZmZlciBhZ2Fpbi4KKyAqLworc3RhdGljIGJvb2wgbHptYTJfbHptYShzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBpbl9hdmFpbDsKKwl1aW50MzJfdCB0bXA7CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKHMtPnRlbXAuc2l6ZSA+IDAgfHwgcy0+bHptYTIuY29tcHJlc3NlZCA9PSAwKSB7CisJCXRtcCA9IDIgKiBMWk1BX0lOX1JFUVVJUkVEIC0gcy0+dGVtcC5zaXplOworCQlpZiAodG1wID4gcy0+bHptYTIuY29tcHJlc3NlZCAtIHMtPnRlbXAuc2l6ZSkKKwkJCXRtcCA9IHMtPmx6bWEyLmNvbXByZXNzZWQgLSBzLT50ZW1wLnNpemU7CisJCWlmICh0bXAgPiBpbl9hdmFpbCkKKwkJCXRtcCA9IGluX2F2YWlsOworCisJCW1lbWNweShzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSwgYi0+aW4gKyBiLT5pbl9wb3MsIHRtcCk7CisKKwkJaWYgKHMtPnRlbXAuc2l6ZSArIHRtcCA9PSBzLT5sem1hMi5jb21wcmVzc2VkKSB7CisJCQltZW16ZXJvKHMtPnRlbXAuYnVmICsgcy0+dGVtcC5zaXplICsgdG1wLAorCQkJCQlzaXplb2Yocy0+dGVtcC5idWYpCisJCQkJCQktIHMtPnRlbXAuc2l6ZSAtIHRtcCk7CisJCQlzLT5yYy5pbl9saW1pdCA9IHMtPnRlbXAuc2l6ZSArIHRtcDsKKwkJfSBlbHNlIGlmIChzLT50ZW1wLnNpemUgKyB0bXAgPCBMWk1BX0lOX1JFUVVJUkVEKSB7CisJCQlzLT50ZW1wLnNpemUgKz0gdG1wOworCQkJYi0+aW5fcG9zICs9IHRtcDsKKwkJCXJldHVybiB0cnVlOworCQl9IGVsc2UgeworCQkJcy0+cmMuaW5fbGltaXQgPSBzLT50ZW1wLnNpemUgKyB0bXAgLSBMWk1BX0lOX1JFUVVJUkVEOworCQl9CisKKwkJcy0+cmMuaW4gPSBzLT50ZW1wLmJ1ZjsKKwkJcy0+cmMuaW5fcG9zID0gMDsKKworCQlpZiAoIWx6bWFfbWFpbihzKSB8fCBzLT5yYy5pbl9wb3MgPiBzLT50ZW1wLnNpemUgKyB0bXApCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJcy0+bHptYTIuY29tcHJlc3NlZCAtPSBzLT5yYy5pbl9wb3M7CisKKwkJaWYgKHMtPnJjLmluX3BvcyA8IHMtPnRlbXAuc2l6ZSkgeworCQkJcy0+dGVtcC5zaXplIC09IHMtPnJjLmluX3BvczsKKwkJCW1lbW1vdmUocy0+dGVtcC5idWYsIHMtPnRlbXAuYnVmICsgcy0+cmMuaW5fcG9zLAorCQkJCQlzLT50ZW1wLnNpemUpOworCQkJcmV0dXJuIHRydWU7CisJCX0KKworCQliLT5pbl9wb3MgKz0gcy0+cmMuaW5fcG9zIC0gcy0+dGVtcC5zaXplOworCQlzLT50ZW1wLnNpemUgPSAwOworCX0KKworCWluX2F2YWlsID0gYi0+aW5fc2l6ZSAtIGItPmluX3BvczsKKwlpZiAoaW5fYXZhaWwgPj0gTFpNQV9JTl9SRVFVSVJFRCkgeworCQlzLT5yYy5pbiA9IGItPmluOworCQlzLT5yYy5pbl9wb3MgPSBiLT5pbl9wb3M7CisKKwkJaWYgKGluX2F2YWlsID49IHMtPmx6bWEyLmNvbXByZXNzZWQgKyBMWk1BX0lOX1JFUVVJUkVEKQorCQkJcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9wb3MgKyBzLT5sem1hMi5jb21wcmVzc2VkOworCQllbHNlCisJCQlzLT5yYy5pbl9saW1pdCA9IGItPmluX3NpemUgLSBMWk1BX0lOX1JFUVVJUkVEOworCisJCWlmICghbHptYV9tYWluKHMpKQorCQkJcmV0dXJuIGZhbHNlOworCisJCWluX2F2YWlsID0gcy0+cmMuaW5fcG9zIC0gYi0+aW5fcG9zOworCQlpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gaW5fYXZhaWw7CisJCWItPmluX3BvcyA9IHMtPnJjLmluX3BvczsKKwl9CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKGluX2F2YWlsIDwgTFpNQV9JTl9SRVFVSVJFRCkgeworCQlpZiAoaW5fYXZhaWwgPiBzLT5sem1hMi5jb21wcmVzc2VkKQorCQkJaW5fYXZhaWwgPSBzLT5sem1hMi5jb21wcmVzc2VkOworCisJCW1lbWNweShzLT50ZW1wLmJ1ZiwgYi0+aW4gKyBiLT5pbl9wb3MsIGluX2F2YWlsKTsKKwkJcy0+dGVtcC5zaXplID0gaW5fYXZhaWw7CisJCWItPmluX3BvcyArPSBpbl9hdmFpbDsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIFRha2UgY2FyZSBvZiB0aGUgTFpNQTIgY29udHJvbCBsYXllciwgYW5kIGZvcndhcmQgdGhlIGpvYiBvZiBhY3R1YWwgTFpNQQorICogZGVjb2Rpbmcgb3IgY29weWluZyBvZiB1bmNvbXByZXNzZWQgY2h1bmtzIHRvIG90aGVyIGZ1bmN0aW9ucy4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19sem1hMl9ydW4oc3RydWN0IHh6X2RlY19sem1hMiAqcywKKwkJCQkgICAgICAgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwl1aW50MzJfdCB0bXA7CisKKwl3aGlsZSAoYi0+aW5fcG9zIDwgYi0+aW5fc2l6ZSB8fCBzLT5sem1hMi5zZXF1ZW5jZSA9PSBTRVFfTFpNQV9SVU4pIHsKKwkJc3dpdGNoIChzLT5sem1hMi5zZXF1ZW5jZSkgeworCQljYXNlIFNFUV9DT05UUk9MOgorCQkJLyoKKwkJCSAqIExaTUEyIGNvbnRyb2wgYnl0ZQorCQkJICoKKwkJCSAqIEV4YWN0IHZhbHVlczoKKwkJCSAqICAgMHgwMCAgIEVuZCBtYXJrZXIKKwkJCSAqICAgMHgwMSAgIERpY3Rpb25hcnkgcmVzZXQgZm9sbG93ZWQgYnkKKwkJCSAqICAgICAgICAgIGFuIHVuY29tcHJlc3NlZCBjaHVuaworCQkJICogICAweDAyICAgVW5jb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5IHJlc2V0KQorCQkJICoKKwkJCSAqIEhpZ2hlc3QgdGhyZWUgYml0cyAocy0+Y29udHJvbCAmIDB4RTApOgorCQkJICogICAweEUwICAgRGljdGlvbmFyeSByZXNldCwgbmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlCisJCQkgKiAgICAgICAgICByZXNldCwgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rCisJCQkgKiAgIDB4QzAgICBOZXcgcHJvcGVydGllcyBhbmQgc3RhdGUgcmVzZXQsIGZvbGxvd2VkCisJCQkgKiAgICAgICAgICBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vIGRpY3Rpb25hcnkKKwkJCSAqICAgICAgICAgIHJlc2V0KQorCQkJICogICAweEEwICAgU3RhdGUgcmVzZXQgdXNpbmcgb2xkIHByb3BlcnRpZXMsCisJCQkgKiAgICAgICAgICBmb2xsb3dlZCBieSBMWk1BIGNvbXByZXNzZWQgY2h1bmsgKG5vCisJCQkgKiAgICAgICAgICBkaWN0aW9uYXJ5IHJlc2V0KQorCQkJICogICAweDgwICAgTFpNQSBjaHVuayAobm8gZGljdGlvbmFyeSBvciBzdGF0ZSByZXNldCkKKwkJCSAqCisJCQkgKiBGb3IgTFpNQSBjb21wcmVzc2VkIGNodW5rcywgdGhlIGxvd2VzdCBmaXZlIGJpdHMKKwkJCSAqIChzLT5jb250cm9sICYgMUYpIGFyZSB0aGUgaGlnaGVzdCBiaXRzIG9mIHRoZQorCQkJICogdW5jb21wcmVzc2VkIHNpemUgKGJpdHMgMTYtMjApLgorCQkJICoKKwkJCSAqIEEgbmV3IExaTUEyIHN0cmVhbSBtdXN0IGJlZ2luIHdpdGggYSBkaWN0aW9uYXJ5CisJCQkgKiByZXNldC4gVGhlIGZpcnN0IExaTUEgY2h1bmsgbXVzdCBzZXQgbmV3CisJCQkgKiBwcm9wZXJ0aWVzIGFuZCByZXNldCB0aGUgTFpNQSBzdGF0ZS4KKwkJCSAqCisJCQkgKiBWYWx1ZXMgdGhhdCBkb24ndCBtYXRjaCBhbnl0aGluZyBkZXNjcmliZWQgYWJvdmUKKwkJCSAqIGFyZSBpbnZhbGlkIGFuZCB3ZSByZXR1cm4gWFpfREFUQV9FUlJPUi4KKwkJCSAqLworCQkJdG1wID0gYi0+aW5bYi0+aW5fcG9zKytdOworCisJCQlpZiAodG1wID09IDB4MDApCisJCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisKKwkJCWlmICh0bXAgPj0gMHhFMCB8fCB0bXAgPT0gMHgwMSkgeworCQkJCXMtPmx6bWEyLm5lZWRfcHJvcHMgPSB0cnVlOworCQkJCXMtPmx6bWEyLm5lZWRfZGljdF9yZXNldCA9IGZhbHNlOworCQkJCWRpY3RfcmVzZXQoJnMtPmRpY3QsIGIpOworCQkJfSBlbHNlIGlmIChzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQpIHsKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKwkJCX0KKworCQkJaWYgKHRtcCA+PSAweDgwKSB7CisJCQkJcy0+bHptYTIudW5jb21wcmVzc2VkID0gKHRtcCAmIDB4MUYpIDw8IDE2OworCQkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX1VOQ09NUFJFU1NFRF8xOworCisJCQkJaWYgKHRtcCA+PSAweEMwKSB7CisJCQkJCS8qCisJCQkJCSAqIFdoZW4gdGhlcmUgYXJlIG5ldyBwcm9wZXJ0aWVzLAorCQkJCQkgKiBzdGF0ZSByZXNldCBpcyBkb25lIGF0CisJCQkJCSAqIFNFUV9QUk9QRVJUSUVTLgorCQkJCQkgKi8KKwkJCQkJcy0+bHptYTIubmVlZF9wcm9wcyA9IGZhbHNlOworCQkJCQlzLT5sem1hMi5uZXh0X3NlcXVlbmNlCisJCQkJCQkJPSBTRVFfUFJPUEVSVElFUzsKKworCQkJCX0gZWxzZSBpZiAocy0+bHptYTIubmVlZF9wcm9wcykgeworCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJCX0gZWxzZSB7CisJCQkJCXMtPmx6bWEyLm5leHRfc2VxdWVuY2UKKwkJCQkJCQk9IFNFUV9MWk1BX1BSRVBBUkU7CisJCQkJCWlmICh0bXAgPj0gMHhBMCkKKwkJCQkJCWx6bWFfcmVzZXQocyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodG1wID4gMHgwMikKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzA7CisJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZSA9IFNFUV9DT1BZOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNFUV9VTkNPTVBSRVNTRURfMToKKwkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZAorCQkJCQkrPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdIDw8IDg7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1VOQ09NUFJFU1NFRF8yOgorCQkJcy0+bHptYTIudW5jb21wcmVzc2VkCisJCQkJCSs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gKyAxOworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09NUFJFU1NFRF8wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09NUFJFU1NFRF8wOgorCQkJcy0+bHptYTIuY29tcHJlc3NlZAorCQkJCQk9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gPDwgODsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPTVBSRVNTRURfMToKKwkJCXMtPmx6bWEyLmNvbXByZXNzZWQKKwkJCQkJKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSArIDE7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IHMtPmx6bWEyLm5leHRfc2VxdWVuY2U7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9QUk9QRVJUSUVTOgorCQkJaWYgKCFsem1hX3Byb3BzKHMsIGItPmluW2ItPmluX3BvcysrXSkpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0xaTUFfUFJFUEFSRTsKKworCQkvKiBGYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFNFUV9MWk1BX1BSRVBBUkU6CisJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA8IFJDX0lOSVRfQllURVMpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCWlmICghcmNfcmVhZF9pbml0KCZzLT5yYywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlzLT5sem1hMi5jb21wcmVzc2VkIC09IFJDX0lOSVRfQllURVM7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9MWk1BX1JVTjsKKworCQkvKiBGYWxsIHRocm91Z2ggKi8KKworCQljYXNlIFNFUV9MWk1BX1JVTjoKKwkJCS8qCisJCQkgKiBTZXQgZGljdGlvbmFyeSBsaW1pdCB0byBpbmRpY2F0ZSBob3cgbXVjaCB3ZSB3YW50CisJCQkgKiB0byBiZSBlbmNvZGVkIGF0IG1heGltdW0uIERlY29kZSBuZXcgZGF0YSBpbnRvIHRoZQorCQkJICogZGljdGlvbmFyeS4gRmx1c2ggdGhlIG5ldyBkYXRhIGZyb20gZGljdGlvbmFyeSB0bworCQkJICogYi0+b3V0LiBDaGVjayBpZiB3ZSBmaW5pc2hlZCBkZWNvZGluZyB0aGlzIGNodW5rLgorCQkJICogSW4gY2FzZSB0aGUgZGljdGlvbmFyeSBnb3QgZnVsbCBidXQgd2UgZGlkbid0IGZpbGwKKwkJCSAqIHRoZSBvdXRwdXQgYnVmZmVyIHlldCwgd2UgbWF5IHJ1biB0aGlzIGxvb3AKKwkJCSAqIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgY2hhbmdpbmcgcy0+bHptYTIuc2VxdWVuY2UuCisJCQkgKi8KKwkJCWRpY3RfbGltaXQoJnMtPmRpY3QsIG1pbl90KHNpemVfdCwKKwkJCQkJYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zLAorCQkJCQlzLT5sem1hMi51bmNvbXByZXNzZWQpKTsKKwkJCWlmICghbHptYTJfbHptYShzLCBiKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+bHptYTIudW5jb21wcmVzc2VkIC09IGRpY3RfZmx1c2goJnMtPmRpY3QsIGIpOworCisJCQlpZiAocy0+bHptYTIudW5jb21wcmVzc2VkID09IDApIHsKKwkJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA+IDAgfHwgcy0+bHptYS5sZW4gPiAwCisJCQkJCQl8fCAhcmNfaXNfZmluaXNoZWQoJnMtPnJjKSkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQlyY19yZXNldCgmcy0+cmMpOworCQkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisKKwkJCX0gZWxzZSBpZiAoYi0+b3V0X3BvcyA9PSBiLT5vdXRfc2l6ZQorCQkJCQl8fCAoYi0+aW5fcG9zID09IGItPmluX3NpemUKKwkJCQkJCSYmIHMtPnRlbXAuc2l6ZQorCQkJCQkJPCBzLT5sem1hMi5jb21wcmVzc2VkKSkgeworCQkJCXJldHVybiBYWl9PSzsKKwkJCX0KKworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09QWToKKwkJCWRpY3RfdW5jb21wcmVzc2VkKCZzLT5kaWN0LCBiLCAmcy0+bHptYTIuY29tcHJlc3NlZCk7CisJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA+IDApCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT05UUk9MOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjX2x6bWEyICp4el9kZWNfbHptYTJfY3JlYXRlKGVudW0geHpfbW9kZSBtb2RlLAorCQkJCQkJICAgdWludDMyX3QgZGljdF9tYXgpCit7CisJc3RydWN0IHh6X2RlY19sem1hMiAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzLT5kaWN0Lm1vZGUgPSBtb2RlOworCXMtPmRpY3Quc2l6ZV9tYXggPSBkaWN0X21heDsKKworCWlmIChERUNfSVNfUFJFQUxMT0MobW9kZSkpIHsKKwkJcy0+ZGljdC5idWYgPSB2bWFsbG9jKGRpY3RfbWF4KTsKKwkJaWYgKHMtPmRpY3QuYnVmID09IE5VTEwpIHsKKwkJCWtmcmVlKHMpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKERFQ19JU19EWU5BTExPQyhtb2RlKSkgeworCQlzLT5kaWN0LmJ1ZiA9IE5VTEw7CisJCXMtPmRpY3QuYWxsb2NhdGVkID0gMDsKKwl9CisKKwlyZXR1cm4gczsKK30KKworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19sem1hMl9yZXNldChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLCB1aW50OF90IHByb3BzKQoreworCS8qIFRoaXMgbGltaXRzIGRpY3Rpb25hcnkgc2l6ZSB0byAzIEdpQiB0byBrZWVwIHBhcnNpbmcgc2ltcGxlci4gKi8KKwlpZiAocHJvcHMgPiAzOSkKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwlzLT5kaWN0LnNpemUgPSAyICsgKHByb3BzICYgMSk7CisJcy0+ZGljdC5zaXplIDw8PSAocHJvcHMgPj4gMSkgKyAxMTsKKworCWlmIChERUNfSVNfTVVMVEkocy0+ZGljdC5tb2RlKSkgeworCQlpZiAocy0+ZGljdC5zaXplID4gcy0+ZGljdC5zaXplX21heCkKKwkJCXJldHVybiBYWl9NRU1MSU1JVF9FUlJPUjsKKworCQlzLT5kaWN0LmVuZCA9IHMtPmRpY3Quc2l6ZTsKKworCQlpZiAoREVDX0lTX0RZTkFMTE9DKHMtPmRpY3QubW9kZSkpIHsKKwkJCWlmIChzLT5kaWN0LmFsbG9jYXRlZCA8IHMtPmRpY3Quc2l6ZSkgeworCQkJCXZmcmVlKHMtPmRpY3QuYnVmKTsKKwkJCQlzLT5kaWN0LmJ1ZiA9IHZtYWxsb2Mocy0+ZGljdC5zaXplKTsKKwkJCQlpZiAocy0+ZGljdC5idWYgPT0gTlVMTCkgeworCQkJCQlzLT5kaWN0LmFsbG9jYXRlZCA9IDA7CisJCQkJCXJldHVybiBYWl9NRU1fRVJST1I7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJcy0+bHptYS5sZW4gPSAwOworCisJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKwlzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSB0cnVlOworCisJcy0+dGVtcC5zaXplID0gMDsKKworCXJldHVybiBYWl9PSzsKK30KKworWFpfRVhURVJOIHZvaWQgeHpfZGVjX2x6bWEyX2VuZChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCWlmIChERUNfSVNfTVVMVEkocy0+ZGljdC5tb2RlKSkKKwkJdmZyZWUocy0+ZGljdC5idWYpOworCisJa2ZyZWUocyk7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfc3RyZWFtLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfc3RyZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4MDliMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2RlY19zdHJlYW0uYwpAQCAtMCwwICsxLDgyMSBAQAorLyoKKyAqIC54eiBTdHJlYW0gZGVjb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAieHpfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInh6X3N0cmVhbS5oIgorCisvKiBIYXNoIHVzZWQgdG8gdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkICovCitzdHJ1Y3QgeHpfZGVjX2hhc2ggeworCXZsaV90eXBlIHVucGFkZGVkOworCXZsaV90eXBlIHVuY29tcHJlc3NlZDsKKwl1aW50MzJfdCBjcmMzMjsKK307CisKK3N0cnVjdCB4el9kZWMgeworCS8qIFBvc2l0aW9uIGluIGRlY19tYWluKCkgKi8KKwllbnVtIHsKKwkJU0VRX1NUUkVBTV9IRUFERVIsCisJCVNFUV9CTE9DS19TVEFSVCwKKwkJU0VRX0JMT0NLX0hFQURFUiwKKwkJU0VRX0JMT0NLX1VOQ09NUFJFU1MsCisJCVNFUV9CTE9DS19QQURESU5HLAorCQlTRVFfQkxPQ0tfQ0hFQ0ssCisJCVNFUV9JTkRFWCwKKwkJU0VRX0lOREVYX1BBRERJTkcsCisJCVNFUV9JTkRFWF9DUkMzMiwKKwkJU0VRX1NUUkVBTV9GT09URVIKKwl9IHNlcXVlbmNlOworCisJLyogUG9zaXRpb24gaW4gdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzIGFuZCBDaGVjayBmaWVsZHMgKi8KKwl1aW50MzJfdCBwb3M7CisKKwkvKiBWYXJpYWJsZS1sZW5ndGggaW50ZWdlciBkZWNvZGVkIGJ5IGRlY192bGkoKSAqLworCXZsaV90eXBlIHZsaTsKKworCS8qIFNhdmVkIGluX3BvcyBhbmQgb3V0X3BvcyAqLworCXNpemVfdCBpbl9zdGFydDsKKwlzaXplX3Qgb3V0X3N0YXJ0OworCisJLyogQ1JDMzIgdmFsdWUgaW4gQmxvY2sgb3IgSW5kZXggKi8KKwl1aW50MzJfdCBjcmMzMjsKKworCS8qIFR5cGUgb2YgdGhlIGludGVncml0eSBjaGVjayBjYWxjdWxhdGVkIGZyb20gdW5jb21wcmVzc2VkIGRhdGEgKi8KKwllbnVtIHh6X2NoZWNrIGNoZWNrX3R5cGU7CisKKwkvKiBPcGVyYXRpb24gbW9kZSAqLworCWVudW0geHpfbW9kZSBtb2RlOworCisJLyoKKwkgKiBUcnVlIGlmIHRoZSBuZXh0IGNhbGwgdG8geHpfZGVjX3J1bigpIGlzIGFsbG93ZWQgdG8gcmV0dXJuCisJICogWFpfQlVGX0VSUk9SLgorCSAqLworCWJvb2wgYWxsb3dfYnVmX2Vycm9yOworCisJLyogSW5mb3JtYXRpb24gc3RvcmVkIGluIEJsb2NrIEhlYWRlciAqLworCXN0cnVjdCB7CisJCS8qCisJCSAqIFZhbHVlIHN0b3JlZCBpbiB0aGUgQ29tcHJlc3NlZCBTaXplIGZpZWxkLCBvcgorCQkgKiBWTElfVU5LTk9XTiBpZiBDb21wcmVzc2VkIFNpemUgaXMgbm90IHByZXNlbnQuCisJCSAqLworCQl2bGlfdHlwZSBjb21wcmVzc2VkOworCisJCS8qCisJCSAqIFZhbHVlIHN0b3JlZCBpbiB0aGUgVW5jb21wcmVzc2VkIFNpemUgZmllbGQsIG9yCisJCSAqIFZMSV9VTktOT1dOIGlmIFVuY29tcHJlc3NlZCBTaXplIGlzIG5vdCBwcmVzZW50LgorCQkgKi8KKwkJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCisJCS8qIFNpemUgb2YgdGhlIEJsb2NrIEhlYWRlciBmaWVsZCAqLworCQl1aW50MzJfdCBzaXplOworCX0gYmxvY2tfaGVhZGVyOworCisJLyogSW5mb3JtYXRpb24gY29sbGVjdGVkIHdoZW4gZGVjb2RpbmcgQmxvY2tzICovCisJc3RydWN0IHsKKwkJLyogT2JzZXJ2ZWQgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjdXJyZW50IEJsb2NrICovCisJCXZsaV90eXBlIGNvbXByZXNzZWQ7CisKKwkJLyogT2JzZXJ2ZWQgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKwkJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCisJCS8qIE51bWJlciBvZiBCbG9ja3MgZGVjb2RlZCBzbyBmYXIgKi8KKwkJdmxpX3R5cGUgY291bnQ7CisKKwkJLyoKKwkJICogSGFzaCBjYWxjdWxhdGVkIGZyb20gdGhlIEJsb2NrIHNpemVzLiBUaGlzIGlzIHVzZWQgdG8KKwkJICogdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorCQkgKi8KKwkJc3RydWN0IHh6X2RlY19oYXNoIGhhc2g7CisJfSBibG9jazsKKworCS8qIFZhcmlhYmxlcyBuZWVkZWQgd2hlbiB2ZXJpZnlpbmcgdGhlIEluZGV4IGZpZWxkICovCisJc3RydWN0IHsKKwkJLyogUG9zaXRpb24gaW4gZGVjX2luZGV4KCkgKi8KKwkJZW51bSB7CisJCQlTRVFfSU5ERVhfQ09VTlQsCisJCQlTRVFfSU5ERVhfVU5QQURERUQsCisJCQlTRVFfSU5ERVhfVU5DT01QUkVTU0VECisJCX0gc2VxdWVuY2U7CisKKwkJLyogU2l6ZSBvZiB0aGUgSW5kZXggaW4gYnl0ZXMgKi8KKwkJdmxpX3R5cGUgc2l6ZTsKKworCQkvKiBOdW1iZXIgb2YgUmVjb3JkcyAobWF0Y2hlcyBibG9jay5jb3VudCBpbiB2YWxpZCBmaWxlcykgKi8KKwkJdmxpX3R5cGUgY291bnQ7CisKKwkJLyoKKwkJICogSGFzaCBjYWxjdWxhdGVkIGZyb20gdGhlIFJlY29yZHMgKG1hdGNoZXMgYmxvY2suaGFzaCBpbgorCQkgKiB2YWxpZCBmaWxlcykuCisJCSAqLworCQlzdHJ1Y3QgeHpfZGVjX2hhc2ggaGFzaDsKKwl9IGluZGV4OworCisJLyoKKwkgKiBUZW1wb3JhcnkgYnVmZmVyIG5lZWRlZCB0byBob2xkIFN0cmVhbSBIZWFkZXIsIEJsb2NrIEhlYWRlciwKKwkgKiBhbmQgU3RyZWFtIEZvb3Rlci4gVGhlIEJsb2NrIEhlYWRlciBpcyB0aGUgYmlnZ2VzdCAoMSBLaUIpCisJICogc28gd2UgcmVzZXJ2ZSBzcGFjZSBhY2NvcmRpbmcgdG8gdGhhdC4gYnVmW10gaGFzIHRvIGJlIGFsaWduZWQKKwkgKiB0byBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXM7IHRoZSBzaXplX3QgdmFyaWFibGVzIGJlZm9yZSBpdAorCSAqIHNob3VsZCBndWFyYW50ZWUgdGhpcy4KKwkgKi8KKwlzdHJ1Y3QgeworCQlzaXplX3QgcG9zOworCQlzaXplX3Qgc2l6ZTsKKwkJdWludDhfdCBidWZbMTAyNF07CisJfSB0ZW1wOworCisJc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTI7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJc3RydWN0IHh6X2RlY19iY2ogKmJjajsKKwlib29sIGJjal9hY3RpdmU7CisjZW5kaWYKK307CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisvKiBTaXplcyBvZiB0aGUgQ2hlY2sgZmllbGQgd2l0aCBkaWZmZXJlbnQgQ2hlY2sgSURzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjaGVja19zaXplc1sxNl0gPSB7CisJMCwKKwk0LCA0LCA0LAorCTgsIDgsIDgsCisJMTYsIDE2LCAxNiwKKwkzMiwgMzIsIDMyLAorCTY0LCA2NCwgNjQKK307CisjZW5kaWYKKworLyoKKyAqIEZpbGwgcy0+dGVtcCBieSBjb3B5aW5nIGRhdGEgc3RhcnRpbmcgZnJvbSBiLT5pbltiLT5pbl9wb3NdLiBDYWxsZXIKKyAqIG11c3QgaGF2ZSBzZXQgcy0+dGVtcC5wb3MgdG8gaW5kaWNhdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3VwcG9zZWQKKyAqIHRvIGNvcHkgaW50byBzLT50ZW1wLmJ1Zi4gUmV0dXJuIHRydWUgb25jZSBzLT50ZW1wLnBvcyBoYXMgcmVhY2hlZAorICogcy0+dGVtcC5zaXplLgorICovCitzdGF0aWMgYm9vbCBmaWxsX3RlbXAoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplID0gbWluX3Qoc2l6ZV90LAorCQkJYi0+aW5fc2l6ZSAtIGItPmluX3Bvcywgcy0+dGVtcC5zaXplIC0gcy0+dGVtcC5wb3MpOworCisJbWVtY3B5KHMtPnRlbXAuYnVmICsgcy0+dGVtcC5wb3MsIGItPmluICsgYi0+aW5fcG9zLCBjb3B5X3NpemUpOworCWItPmluX3BvcyArPSBjb3B5X3NpemU7CisJcy0+dGVtcC5wb3MgKz0gY29weV9zaXplOworCisJaWYgKHMtPnRlbXAucG9zID09IHMtPnRlbXAuc2l6ZSkgeworCQlzLT50ZW1wLnBvcyA9IDA7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyogRGVjb2RlIGEgdmFyaWFibGUtbGVuZ3RoIGludGVnZXIgKGxpdHRsZS1lbmRpYW4gYmFzZS0xMjggZW5jb2RpbmcpICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX3ZsaShzdHJ1Y3QgeHpfZGVjICpzLCBjb25zdCB1aW50OF90ICppbiwKKwkJCSAgIHNpemVfdCAqaW5fcG9zLCBzaXplX3QgaW5fc2l6ZSkKK3sKKwl1aW50OF90IGJ5dGU7CisKKwlpZiAocy0+cG9zID09IDApCisJCXMtPnZsaSA9IDA7CisKKwl3aGlsZSAoKmluX3BvcyA8IGluX3NpemUpIHsKKwkJYnl0ZSA9IGluWyppbl9wb3NdOworCQkrKyppbl9wb3M7CisKKwkJcy0+dmxpIHw9ICh2bGlfdHlwZSkoYnl0ZSAmIDB4N0YpIDw8IHMtPnBvczsKKworCQlpZiAoKGJ5dGUgJiAweDgwKSA9PSAwKSB7CisJCQkvKiBEb24ndCBhbGxvdyBub24tbWluaW1hbCBlbmNvZGluZ3MuICovCisJCQlpZiAoYnl0ZSA9PSAwICYmIHMtPnBvcyAhPSAwKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5wb3MgPSAwOworCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisJCX0KKworCQlzLT5wb3MgKz0gNzsKKwkJaWYgKHMtPnBvcyA9PSA3ICogVkxJX0JZVEVTX01BWCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCX0KKworCXJldHVybiBYWl9PSzsKK30KKworLyoKKyAqIERlY29kZSB0aGUgQ29tcHJlc3NlZCBEYXRhIGZpZWxkIGZyb20gYSBCbG9jay4gVXBkYXRlIGFuZCB2YWxpZGF0ZQorICogdGhlIG9ic2VydmVkIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyBvZiB0aGUgQmxvY2sgc28gdGhhdAorICogdGhleSBkb24ndCBleGNlZWQgdGhlIHZhbHVlcyBwb3NzaWJseSBzdG9yZWQgaW4gdGhlIEJsb2NrIEhlYWRlcgorICogKHZhbGlkYXRpb24gYXNzdW1lcyB0aGF0IG5vIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJzLCBzaW5jZSB2bGlfdHlwZQorICogaXMgbm9ybWFsbHkgdWludDY0X3QpLiBVcGRhdGUgdGhlIENSQzMyIGlmIHByZXNlbmNlIG9mIHRoZSBDUkMzMgorICogZmllbGQgd2FzIGluZGljYXRlZCBpbiBTdHJlYW0gSGVhZGVyLgorICoKKyAqIE9uY2UgdGhlIGRlY29kaW5nIGlzIGZpbmlzaGVkLCB2YWxpZGF0ZSB0aGF0IHRoZSBvYnNlcnZlZCBzaXplcyBtYXRjaAorICogdGhlIHNpemVzIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyLiBVcGRhdGUgdGhlIGhhc2ggYW5kCisgKiBCbG9jayBjb3VudCwgd2hpY2ggYXJlIGxhdGVyIHVzZWQgdG8gdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgZGVjX2Jsb2NrKHN0cnVjdCB4el9kZWMgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJcy0+aW5fc3RhcnQgPSBiLT5pbl9wb3M7CisJcy0+b3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKworI2lmZGVmIFhaX0RFQ19CQ0oKKwlpZiAocy0+YmNqX2FjdGl2ZSkKKwkJcmV0ID0geHpfZGVjX2Jjal9ydW4ocy0+YmNqLCBzLT5sem1hMiwgYik7CisJZWxzZQorI2VuZGlmCisJCXJldCA9IHh6X2RlY19sem1hMl9ydW4ocy0+bHptYTIsIGIpOworCisJcy0+YmxvY2suY29tcHJlc3NlZCArPSBiLT5pbl9wb3MgLSBzLT5pbl9zdGFydDsKKwlzLT5ibG9jay51bmNvbXByZXNzZWQgKz0gYi0+b3V0X3BvcyAtIHMtPm91dF9zdGFydDsKKworCS8qCisJICogVGhlcmUgaXMgbm8gbmVlZCB0byBzZXBhcmF0ZWx5IGNoZWNrIGZvciBWTElfVU5LTk9XTiwgc2luY2UKKwkgKiB0aGUgb2JzZXJ2ZWQgc2l6ZXMgYXJlIGFsd2F5cyBzbWFsbGVyIHRoYW4gVkxJX1VOS05PV04uCisJICovCisJaWYgKHMtPmJsb2NrLmNvbXByZXNzZWQgPiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorCQkJfHwgcy0+YmxvY2sudW5jb21wcmVzc2VkCisJCQkJPiBzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCWlmIChzLT5jaGVja190eXBlID09IFhaX0NIRUNLX0NSQzMyKQorCQlzLT5jcmMzMiA9IHh6X2NyYzMyKGItPm91dCArIHMtPm91dF9zdGFydCwKKwkJCQliLT5vdXRfcG9zIC0gcy0+b3V0X3N0YXJ0LCBzLT5jcmMzMik7CisKKwlpZiAocmV0ID09IFhaX1NUUkVBTV9FTkQpIHsKKwkJaWYgKHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkICE9IFZMSV9VTktOT1dOCisJCQkJJiYgcy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQKKwkJCQkJIT0gcy0+YmxvY2suY29tcHJlc3NlZCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCWlmIChzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkICE9IFZMSV9VTktOT1dOCisJCQkJJiYgcy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZAorCQkJCQkhPSBzLT5ibG9jay51bmNvbXByZXNzZWQpCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5ibG9jay5oYXNoLnVucGFkZGVkICs9IHMtPmJsb2NrX2hlYWRlci5zaXplCisJCQkJKyBzLT5ibG9jay5jb21wcmVzc2VkOworCisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworCQlzLT5ibG9jay5oYXNoLnVucGFkZGVkICs9IGNoZWNrX3NpemVzW3MtPmNoZWNrX3R5cGVdOworI2Vsc2UKKwkJaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDMzIpCisJCQlzLT5ibG9jay5oYXNoLnVucGFkZGVkICs9IDQ7CisjZW5kaWYKKworCQlzLT5ibG9jay5oYXNoLnVuY29tcHJlc3NlZCArPSBzLT5ibG9jay51bmNvbXByZXNzZWQ7CisJCXMtPmJsb2NrLmhhc2guY3JjMzIgPSB4el9jcmMzMigKKwkJCQkoY29uc3QgdWludDhfdCAqKSZzLT5ibG9jay5oYXNoLAorCQkJCXNpemVvZihzLT5ibG9jay5oYXNoKSwgcy0+YmxvY2suaGFzaC5jcmMzMik7CisKKwkJKytzLT5ibG9jay5jb3VudDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBVcGRhdGUgdGhlIEluZGV4IHNpemUgYW5kIHRoZSBDUkMzMiB2YWx1ZS4gKi8KK3N0YXRpYyB2b2lkIGluZGV4X3VwZGF0ZShzdHJ1Y3QgeHpfZGVjICpzLCBjb25zdCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBpbl91c2VkID0gYi0+aW5fcG9zIC0gcy0+aW5fc3RhcnQ7CisJcy0+aW5kZXguc2l6ZSArPSBpbl91c2VkOworCXMtPmNyYzMyID0geHpfY3JjMzIoYi0+aW4gKyBzLT5pbl9zdGFydCwgaW5fdXNlZCwgcy0+Y3JjMzIpOworfQorCisvKgorICogRGVjb2RlIHRoZSBOdW1iZXIgb2YgUmVjb3JkcywgVW5wYWRkZWQgU2l6ZSwgYW5kIFVuY29tcHJlc3NlZCBTaXplCisgKiBmaWVsZHMgZnJvbSB0aGUgSW5kZXggZmllbGQuIFRoYXQgaXMsIEluZGV4IFBhZGRpbmcgYW5kIENSQzMyIGFyZSBub3QKKyAqIGRlY29kZWQgYnkgdGhpcyBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGNhbiByZXR1cm4gWFpfT0sgKG1vcmUgaW5wdXQgbmVlZGVkKSwgWFpfU1RSRUFNX0VORCAoZXZlcnl0aGluZworICogc3VjY2Vzc2Z1bGx5IGRlY29kZWQpLCBvciBYWl9EQVRBX0VSUk9SIChpbnB1dCBpcyBjb3JydXB0KS4KKyAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19pbmRleChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWVudW0geHpfcmV0IHJldDsKKworCWRvIHsKKwkJcmV0ID0gZGVjX3ZsaShzLCBiLT5pbiwgJmItPmluX3BvcywgYi0+aW5fc2l6ZSk7CisJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkgeworCQkJaW5kZXhfdXBkYXRlKHMsIGIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXN3aXRjaCAocy0+aW5kZXguc2VxdWVuY2UpIHsKKwkJY2FzZSBTRVFfSU5ERVhfQ09VTlQ6CisJCQlzLT5pbmRleC5jb3VudCA9IHMtPnZsaTsKKworCQkJLyoKKwkJCSAqIFZhbGlkYXRlIHRoYXQgdGhlIE51bWJlciBvZiBSZWNvcmRzIGZpZWxkCisJCQkgKiBpbmRpY2F0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIFJlY29yZHMgYXMKKwkJCSAqIHRoZXJlIHdlcmUgQmxvY2tzIGluIHRoZSBTdHJlYW0uCisJCQkgKi8KKwkJCWlmIChzLT5pbmRleC5jb3VudCAhPSBzLT5ibG9jay5jb3VudCkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5QQURERUQ7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9JTkRFWF9VTlBBRERFRDoKKwkJCXMtPmluZGV4Lmhhc2gudW5wYWRkZWQgKz0gcy0+dmxpOworCQkJcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5DT01QUkVTU0VEOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVhfVU5DT01QUkVTU0VEOgorCQkJcy0+aW5kZXguaGFzaC51bmNvbXByZXNzZWQgKz0gcy0+dmxpOworCQkJcy0+aW5kZXguaGFzaC5jcmMzMiA9IHh6X2NyYzMyKAorCQkJCQkoY29uc3QgdWludDhfdCAqKSZzLT5pbmRleC5oYXNoLAorCQkJCQlzaXplb2Yocy0+aW5kZXguaGFzaCksCisJCQkJCXMtPmluZGV4Lmhhc2guY3JjMzIpOworCQkJLS1zLT5pbmRleC5jb3VudDsKKwkJCXMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOUEFEREVEOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChzLT5pbmRleC5jb3VudCA+IDApOworCisJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGF0IHRoZSBuZXh0IGZvdXIgaW5wdXQgYnl0ZXMgbWF0Y2ggdGhlIHZhbHVlIG9mIHMtPmNyYzMyLgorICogcy0+cG9zIG11c3QgYmUgemVybyB3aGVuIHN0YXJ0aW5nIHRvIHZhbGlkYXRlIHRoZSBmaXJzdCBieXRlLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgY3JjMzJfdmFsaWRhdGUoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlkbyB7CisJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCXJldHVybiBYWl9PSzsKKworCQlpZiAoKChzLT5jcmMzMiA+PiBzLT5wb3MpICYgMHhGRikgIT0gYi0+aW5bYi0+aW5fcG9zKytdKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+cG9zICs9IDg7CisKKwl9IHdoaWxlIChzLT5wb3MgPCAzMik7CisKKwlzLT5jcmMzMiA9IDA7CisJcy0+cG9zID0gMDsKKworCXJldHVybiBYWl9TVFJFQU1fRU5EOworfQorCisjaWZkZWYgWFpfREVDX0FOWV9DSEVDSworLyoKKyAqIFNraXAgb3ZlciB0aGUgQ2hlY2sgZmllbGQgd2hlbiB0aGUgQ2hlY2sgSUQgaXMgbm90IHN1cHBvcnRlZC4KKyAqIFJldHVybnMgdHJ1ZSBvbmNlIHRoZSB3aG9sZSBDaGVjayBmaWVsZCBoYXMgYmVlbiBza2lwcGVkIG92ZXIuCisgKi8KK3N0YXRpYyBib29sIGNoZWNrX3NraXAoc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwl3aGlsZSAocy0+cG9zIDwgY2hlY2tfc2l6ZXNbcy0+Y2hlY2tfdHlwZV0pIHsKKwkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJcmV0dXJuIGZhbHNlOworCisJCSsrYi0+aW5fcG9zOworCQkrK3MtPnBvczsKKwl9CisKKwlzLT5wb3MgPSAwOworCisJcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKworLyogRGVjb2RlIHRoZSBTdHJlYW0gSGVhZGVyIGZpZWxkICh0aGUgZmlyc3QgMTIgYnl0ZXMgb2YgdGhlIC54eiBTdHJlYW0pLiAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19zdHJlYW1faGVhZGVyKHN0cnVjdCB4el9kZWMgKnMpCit7CisJaWYgKCFtZW1lcShzLT50ZW1wLmJ1ZiwgSEVBREVSX01BR0lDLCBIRUFERVJfTUFHSUNfU0laRSkpCisJCXJldHVybiBYWl9GT1JNQVRfRVJST1I7CisKKwlpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYgKyBIRUFERVJfTUFHSUNfU0laRSwgMiwgMCkKKwkJCSE9IGdldF9sZTMyKHMtPnRlbXAuYnVmICsgSEVBREVSX01BR0lDX1NJWkUgKyAyKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlpZiAocy0+dGVtcC5idWZbSEVBREVSX01BR0lDX1NJWkVdICE9IDApCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJLyoKKwkgKiBPZiBpbnRlZ3JpdHkgY2hlY2tzLCB3ZSBzdXBwb3J0IG9ubHkgbm9uZSAoQ2hlY2sgSUQgPSAwKSBhbmQKKwkgKiBDUkMzMiAoQ2hlY2sgSUQgPSAxKS4gSG93ZXZlciwgaWYgWFpfREVDX0FOWV9DSEVDSyBpcyBkZWZpbmVkLAorCSAqIHdlIHdpbGwgYWNjZXB0IG90aGVyIGNoZWNrIHR5cGVzIHRvbywgYnV0IHRoZW4gdGhlIGNoZWNrIHdvbid0CisJICogYmUgdmVyaWZpZWQgYW5kIGEgd2FybmluZyAoWFpfVU5TVVBQT1JURURfQ0hFQ0spIHdpbGwgYmUgZ2l2ZW4uCisJICovCisJcy0+Y2hlY2tfdHlwZSA9IHMtPnRlbXAuYnVmW0hFQURFUl9NQUdJQ19TSVpFICsgMV07CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisJaWYgKHMtPmNoZWNrX3R5cGUgPiBYWl9DSEVDS19NQVgpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJaWYgKHMtPmNoZWNrX3R5cGUgPiBYWl9DSEVDS19DUkMzMikKKwkJcmV0dXJuIFhaX1VOU1VQUE9SVEVEX0NIRUNLOworI2Vsc2UKKwlpZiAocy0+Y2hlY2tfdHlwZSA+IFhaX0NIRUNLX0NSQzMyKQorCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKyNlbmRpZgorCisJcmV0dXJuIFhaX09LOworfQorCisvKiBEZWNvZGUgdGhlIFN0cmVhbSBGb290ZXIgZmllbGQgKHRoZSBsYXN0IDEyIGJ5dGVzIG9mIHRoZSAueHogU3RyZWFtKSAqLworc3RhdGljIGVudW0geHpfcmV0IGRlY19zdHJlYW1fZm9vdGVyKHN0cnVjdCB4el9kZWMgKnMpCit7CisJaWYgKCFtZW1lcShzLT50ZW1wLmJ1ZiArIDEwLCBGT09URVJfTUFHSUMsIEZPT1RFUl9NQUdJQ19TSVpFKSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlpZiAoeHpfY3JjMzIocy0+dGVtcC5idWYgKyA0LCA2LCAwKSAhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZikpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJLyoKKwkgKiBWYWxpZGF0ZSBCYWNrd2FyZCBTaXplLiBOb3RlIHRoYXQgd2UgbmV2ZXIgYWRkZWQgdGhlIHNpemUgb2YgdGhlCisJICogSW5kZXggQ1JDMzIgZmllbGQgdG8gcy0+aW5kZXguc2l6ZSwgdGh1cyB3ZSB1c2Ugcy0+aW5kZXguc2l6ZSAvIDQKKwkgKiBpbnN0ZWFkIG9mIHMtPmluZGV4LnNpemUgLyA0IC0gMS4KKwkgKi8KKwlpZiAoKHMtPmluZGV4LnNpemUgPj4gMikgIT0gZ2V0X2xlMzIocy0+dGVtcC5idWYgKyA0KSkKKwkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwlpZiAocy0+dGVtcC5idWZbOF0gIT0gMCB8fCBzLT50ZW1wLmJ1Zls5XSAhPSBzLT5jaGVja190eXBlKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCS8qCisJICogVXNlIFhaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBYWl9PSyB0byBiZSBtb3JlIGNvbnZlbmllbnQKKwkgKiBmb3IgdGhlIGNhbGxlci4KKwkgKi8KKwlyZXR1cm4gWFpfU1RSRUFNX0VORDsKK30KKworLyogRGVjb2RlIHRoZSBCbG9jayBIZWFkZXIgYW5kIGluaXRpYWxpemUgdGhlIGZpbHRlciBjaGFpbi4gKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfYmxvY2tfaGVhZGVyKHN0cnVjdCB4el9kZWMgKnMpCit7CisJZW51bSB4el9yZXQgcmV0OworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUgQ1JDMzIuIFdlIGtub3cgdGhhdCB0aGUgdGVtcCBidWZmZXIgaXMgYXQgbGVhc3QKKwkgKiBlaWdodCBieXRlcyBzbyB0aGlzIGlzIHNhZmUuCisJICovCisJcy0+dGVtcC5zaXplIC09IDQ7CisJaWYgKHh6X2NyYzMyKHMtPnRlbXAuYnVmLCBzLT50ZW1wLnNpemUsIDApCisJCQkhPSBnZXRfbGUzMihzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSkpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJcy0+dGVtcC5wb3MgPSAyOworCisJLyoKKwkgKiBDYXRjaCB1bnN1cHBvcnRlZCBCbG9jayBGbGFncy4gV2Ugc3VwcG9ydCBvbmx5IG9uZSBvciB0d28gZmlsdGVycworCSAqIGluIHRoZSBjaGFpbiwgc28gd2UgY2F0Y2ggdGhhdCB3aXRoIHRoZSBzYW1lIHRlc3QuCisJICovCisjaWZkZWYgWFpfREVDX0JDSgorCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4M0UpCisjZWxzZQorCWlmIChzLT50ZW1wLmJ1ZlsxXSAmIDB4M0YpCisjZW5kaWYKKwkJcmV0dXJuIFhaX09QVElPTlNfRVJST1I7CisKKwkvKiBDb21wcmVzc2VkIFNpemUgKi8KKwlpZiAocy0+dGVtcC5idWZbMV0gJiAweDQwKSB7CisJCWlmIChkZWNfdmxpKHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5wb3MsIHMtPnRlbXAuc2l6ZSkKKwkJCQkJIT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCXMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkID0gcy0+dmxpOworCX0gZWxzZSB7CisJCXMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkID0gVkxJX1VOS05PV047CisJfQorCisJLyogVW5jb21wcmVzc2VkIFNpemUgKi8KKwlpZiAocy0+dGVtcC5idWZbMV0gJiAweDgwKSB7CisJCWlmIChkZWNfdmxpKHMsIHMtPnRlbXAuYnVmLCAmcy0+dGVtcC5wb3MsIHMtPnRlbXAuc2l6ZSkKKwkJCQkhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJcy0+YmxvY2tfaGVhZGVyLnVuY29tcHJlc3NlZCA9IHMtPnZsaTsKKwl9IGVsc2UgeworCQlzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkID0gVkxJX1VOS05PV047CisJfQorCisjaWZkZWYgWFpfREVDX0JDSgorCS8qIElmIHRoZXJlIGFyZSB0d28gZmlsdGVycywgdGhlIGZpcnN0IG9uZSBtdXN0IGJlIGEgQkNKIGZpbHRlci4gKi8KKwlzLT5iY2pfYWN0aXZlID0gcy0+dGVtcC5idWZbMV0gJiAweDAxOworCWlmIChzLT5iY2pfYWN0aXZlKSB7CisJCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDIpCisJCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKworCQlyZXQgPSB4el9kZWNfYmNqX3Jlc2V0KHMtPmJjaiwgcy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10pOworCQlpZiAocmV0ICE9IFhaX09LKQorCQkJcmV0dXJuIHJldDsKKworCQkvKgorCQkgKiBXZSBkb24ndCBzdXBwb3J0IGN1c3RvbSBzdGFydCBvZmZzZXQsCisJCSAqIHNvIFNpemUgb2YgUHJvcGVydGllcyBtdXN0IGJlIHplcm8uCisJCSAqLworCQlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMCkKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCX0KKyNlbmRpZgorCisJLyogVmFsaWQgRmlsdGVyIEZsYWdzIGFsd2F5cyB0YWtlIGF0IGxlYXN0IHR3byBieXRlcy4gKi8KKwlpZiAocy0+dGVtcC5zaXplIC0gcy0+dGVtcC5wb3MgPCAyKQorCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCS8qIEZpbHRlciBJRCA9IExaTUEyICovCisJaWYgKHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdICE9IDB4MjEpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJLyogU2l6ZSBvZiBQcm9wZXJ0aWVzID0gMS1ieXRlIEZpbHRlciBQcm9wZXJ0aWVzICovCisJaWYgKHMtPnRlbXAuYnVmW3MtPnRlbXAucG9zKytdICE9IDB4MDEpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJLyogRmlsdGVyIFByb3BlcnRpZXMgY29udGFpbnMgTFpNQTIgZGljdGlvbmFyeSBzaXplLiAqLworCWlmIChzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyA8IDEpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJcmV0ID0geHpfZGVjX2x6bWEyX3Jlc2V0KHMtPmx6bWEyLCBzLT50ZW1wLmJ1ZltzLT50ZW1wLnBvcysrXSk7CisJaWYgKHJldCAhPSBYWl9PSykKKwkJcmV0dXJuIHJldDsKKworCS8qIFRoZSByZXN0IG11c3QgYmUgSGVhZGVyIFBhZGRpbmcuICovCisJd2hpbGUgKHMtPnRlbXAucG9zIDwgcy0+dGVtcC5zaXplKQorCQlpZiAocy0+dGVtcC5idWZbcy0+dGVtcC5wb3MrK10gIT0gMHgwMCkKKwkJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJcy0+dGVtcC5wb3MgPSAwOworCXMtPmJsb2NrLmNvbXByZXNzZWQgPSAwOworCXMtPmJsb2NrLnVuY29tcHJlc3NlZCA9IDA7CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKK3N0YXRpYyBlbnVtIHh6X3JldCBkZWNfbWFpbihzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWVudW0geHpfcmV0IHJldDsKKworCS8qCisJICogU3RvcmUgdGhlIHN0YXJ0IHBvc2l0aW9uIGZvciB0aGUgY2FzZSB3aGVuIHdlIGFyZSBpbiB0aGUgbWlkZGxlCisJICogb2YgdGhlIEluZGV4IGZpZWxkLgorCSAqLworCXMtPmluX3N0YXJ0ID0gYi0+aW5fcG9zOworCisJd2hpbGUgKHRydWUpIHsKKwkJc3dpdGNoIChzLT5zZXF1ZW5jZSkgeworCQljYXNlIFNFUV9TVFJFQU1fSEVBREVSOgorCQkJLyoKKwkJCSAqIFN0cmVhbSBIZWFkZXIgaXMgY29waWVkIHRvIHMtPnRlbXAsIGFuZCB0aGVuCisJCQkgKiBkZWNvZGVkIGZyb20gdGhlcmUuIFRoaXMgd2F5IGlmIHRoZSBjYWxsZXIKKwkJCSAqIGdpdmVzIHVzIG9ubHkgbGl0dGxlIGlucHV0IGF0IGEgdGltZSwgd2UgY2FuCisJCQkgKiBzdGlsbCBrZWVwIHRoZSBTdHJlYW0gSGVhZGVyIGRlY29kaW5nIGNvZGUKKwkJCSAqIHNpbXBsZS4gU2ltaWxhciBhcHByb2FjaCBpcyB1c2VkIGluIG1hbnkgcGxhY2VzCisJCQkgKiBpbiB0aGlzIGZpbGUuCisJCQkgKi8KKwkJCWlmICghZmlsbF90ZW1wKHMsIGIpKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJLyoKKwkJCSAqIElmIGRlY19zdHJlYW1faGVhZGVyKCkgcmV0dXJucworCQkJICogWFpfVU5TVVBQT1JURURfQ0hFQ0ssIGl0IGlzIHN0aWxsIHBvc3NpYmxlCisJCQkgKiB0byBjb250aW51ZSBkZWNvZGluZyBpZiB3b3JraW5nIGluIG11bHRpLWNhbGwKKwkJCSAqIG1vZGUuIFRodXMsIHVwZGF0ZSBzLT5zZXF1ZW5jZSBiZWZvcmUgY2FsbGluZworCQkJICogZGVjX3N0cmVhbV9oZWFkZXIoKS4KKwkJCSAqLworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfU1RBUlQ7CisKKwkJCXJldCA9IGRlY19zdHJlYW1faGVhZGVyKHMpOworCQkJaWYgKHJldCAhPSBYWl9PSykKKwkJCQlyZXR1cm4gcmV0OworCisJCWNhc2UgU0VRX0JMT0NLX1NUQVJUOgorCQkJLyogV2UgbmVlZCBvbmUgYnl0ZSBvZiBpbnB1dCB0byBjb250aW51ZS4gKi8KKwkJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCS8qIFNlZSBpZiB0aGlzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIEluZGV4IGZpZWxkLiAqLworCQkJaWYgKGItPmluW2ItPmluX3Bvc10gPT0gMCkgeworCQkJCXMtPmluX3N0YXJ0ID0gYi0+aW5fcG9zKys7CisJCQkJcy0+c2VxdWVuY2UgPSBTRVFfSU5ERVg7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qCisJCQkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIEJsb2NrIEhlYWRlciBhbmQKKwkJCSAqIHByZXBhcmUgdG8gZGVjb2RlIGl0LgorCQkJICovCisJCQlzLT5ibG9ja19oZWFkZXIuc2l6ZQorCQkJCT0gKCh1aW50MzJfdCliLT5pbltiLT5pbl9wb3NdICsgMSkgKiA0OworCisJCQlzLT50ZW1wLnNpemUgPSBzLT5ibG9ja19oZWFkZXIuc2l6ZTsKKwkJCXMtPnRlbXAucG9zID0gMDsKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX0hFQURFUjsKKworCQljYXNlIFNFUV9CTE9DS19IRUFERVI6CisJCQlpZiAoIWZpbGxfdGVtcChzLCBiKSkKKwkJCQlyZXR1cm4gWFpfT0s7CisKKwkJCXJldCA9IGRlY19ibG9ja19oZWFkZXIocyk7CisJCQlpZiAocmV0ICE9IFhaX09LKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0JMT0NLX1VOQ09NUFJFU1M7CisKKwkJY2FzZSBTRVFfQkxPQ0tfVU5DT01QUkVTUzoKKwkJCXJldCA9IGRlY19ibG9jayhzLCBiKTsKKwkJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCQlyZXR1cm4gcmV0OworCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19QQURESU5HOworCisJCWNhc2UgU0VRX0JMT0NLX1BBRERJTkc6CisJCQkvKgorCQkJICogU2l6ZSBvZiBDb21wcmVzc2VkIERhdGEgKyBCbG9jayBQYWRkaW5nCisJCQkgKiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgZm91ci4gV2UgZG9uJ3QgbmVlZAorCQkJICogcy0+YmxvY2suY29tcHJlc3NlZCBmb3IgYW55dGhpbmcgZWxzZQorCQkJICogYW55bW9yZSwgc28gd2UgdXNlIGl0IGhlcmUgdG8gdGVzdCB0aGUgc2l6ZQorCQkJICogb2YgdGhlIEJsb2NrIFBhZGRpbmcgZmllbGQuCisJCQkgKi8KKwkJCXdoaWxlIChzLT5ibG9jay5jb21wcmVzc2VkICYgMykgeworCQkJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCQkJcmV0dXJuIFhaX09LOworCisJCQkJaWYgKGItPmluW2ItPmluX3BvcysrXSAhPSAwKQorCQkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJCSsrcy0+YmxvY2suY29tcHJlc3NlZDsKKwkJCX0KKworCQkJcy0+c2VxdWVuY2UgPSBTRVFfQkxPQ0tfQ0hFQ0s7CisKKwkJY2FzZSBTRVFfQkxPQ0tfQ0hFQ0s6CisJCQlpZiAocy0+Y2hlY2tfdHlwZSA9PSBYWl9DSEVDS19DUkMzMikgeworCQkJCXJldCA9IGNyYzMyX3ZhbGlkYXRlKHMsIGIpOworCQkJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisJCQllbHNlIGlmICghY2hlY2tfc2tpcChzLCBiKSkgeworCQkJCXJldHVybiBYWl9PSzsKKwkJCX0KKyNlbmRpZgorCisJCQlzLT5zZXF1ZW5jZSA9IFNFUV9CTE9DS19TVEFSVDsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0lOREVYOgorCQkJcmV0ID0gZGVjX2luZGV4KHMsIGIpOworCQkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJCXJldHVybiByZXQ7CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0lOREVYX1BBRERJTkc7CisKKwkJY2FzZSBTRVFfSU5ERVhfUEFERElORzoKKwkJCXdoaWxlICgocy0+aW5kZXguc2l6ZSArIChiLT5pbl9wb3MgLSBzLT5pbl9zdGFydCkpCisJCQkJCSYgMykgeworCQkJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkgeworCQkJCQlpbmRleF91cGRhdGUocywgYik7CisJCQkJCXJldHVybiBYWl9PSzsKKwkJCQl9CisKKwkJCQlpZiAoYi0+aW5bYi0+aW5fcG9zKytdICE9IDApCisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCQkJfQorCisJCQkvKiBGaW5pc2ggdGhlIENSQzMyIHZhbHVlIGFuZCBJbmRleCBzaXplLiAqLworCQkJaW5kZXhfdXBkYXRlKHMsIGIpOworCisJCQkvKiBDb21wYXJlIHRoZSBoYXNoZXMgdG8gdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLiAqLworCQkJaWYgKCFtZW1lcSgmcy0+YmxvY2suaGFzaCwgJnMtPmluZGV4Lmhhc2gsCisJCQkJCXNpemVvZihzLT5ibG9jay5oYXNoKSkpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPnNlcXVlbmNlID0gU0VRX0lOREVYX0NSQzMyOworCisJCWNhc2UgU0VRX0lOREVYX0NSQzMyOgorCQkJcmV0ID0gY3JjMzJfdmFsaWRhdGUocywgYik7CisJCQlpZiAocmV0ICE9IFhaX1NUUkVBTV9FTkQpCisJCQkJcmV0dXJuIHJldDsKKworCQkJcy0+dGVtcC5zaXplID0gU1RSRUFNX0hFQURFUl9TSVpFOworCQkJcy0+c2VxdWVuY2UgPSBTRVFfU1RSRUFNX0ZPT1RFUjsKKworCQljYXNlIFNFUV9TVFJFQU1fRk9PVEVSOgorCQkJaWYgKCFmaWxsX3RlbXAocywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlyZXR1cm4gZGVjX3N0cmVhbV9mb290ZXIocyk7CisJCX0KKwl9CisKKwkvKiBOZXZlciByZWFjaGVkICovCit9CisKKy8qCisgKiB4el9kZWNfcnVuKCkgaXMgYSB3cmFwcGVyIGZvciBkZWNfbWFpbigpIHRvIGhhbmRsZSBzb21lIHNwZWNpYWwgY2FzZXMgaW4KKyAqIG11bHRpLWNhbGwgYW5kIHNpbmdsZS1jYWxsIGRlY29kaW5nLgorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgd2UgbXVzdCByZXR1cm4gWFpfQlVGX0VSUk9SIHdoZW4gaXQgc2VlbXMgY2xlYXIgdGhhdCB3ZQorICogYXJlIG5vdCBnb2luZyB0byBtYWtlIGFueSBwcm9ncmVzcyBhbnltb3JlLiBUaGlzIGlzIHRvIHByZXZlbnQgdGhlIGNhbGxlcgorICogZnJvbSBjYWxsaW5nIHVzIGluZmluaXRlbHkgd2hlbiB0aGUgaW5wdXQgZmlsZSBpcyB0cnVuY2F0ZWQgb3Igb3RoZXJ3aXNlCisgKiBjb3JydXB0LiBTaW5jZSB6bGliLXN0eWxlIEFQSSBhbGxvd3MgdGhhdCB0aGUgY2FsbGVyIGZpbGxzIHRoZSBpbnB1dCBidWZmZXIKKyAqIG9ubHkgd2hlbiB0aGUgZGVjb2RlciBkb2Vzbid0IHByb2R1Y2UgYW55IG5ldyBvdXRwdXQsIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bAorICogdG8gYXZvaWQgcmV0dXJuaW5nIFhaX0JVRl9FUlJPUiB0b28gZWFzaWx5OiBYWl9CVUZfRVJST1IgaXMgcmV0dXJuZWQgb25seQorICogYWZ0ZXIgdGhlIHNlY29uZCBjb25zZWN1dGl2ZSBjYWxsIHRvIHh6X2RlY19ydW4oKSB0aGF0IG1ha2VzIG5vIHByb2dyZXNzLgorICoKKyAqIEluIHNpbmdsZS1jYWxsIG1vZGUsIGlmIHdlIGNvdWxkbid0IGRlY29kZSBldmVyeXRoaW5nIGFuZCBubyBlcnJvcgorICogb2NjdXJyZWQsIGVpdGhlciB0aGUgaW5wdXQgaXMgdHJ1bmNhdGVkIG9yIHRoZSBvdXRwdXQgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAqIFNpbmNlIHdlIGtub3cgdGhhdCB0aGUgbGFzdCBpbnB1dCBieXRlIG5ldmVyIHByb2R1Y2VzIGFueSBvdXRwdXQsIHdlIGtub3cKKyAqIHRoYXQgaWYgYWxsIHRoZSBpbnB1dCB3YXMgY29uc3VtZWQgYW5kIGRlY29kaW5nIHdhc24ndCBmaW5pc2hlZCwgdGhlIGZpbGUKKyAqIG11c3QgYmUgY29ycnVwdC4gT3RoZXJ3aXNlIHRoZSBvdXRwdXQgYnVmZmVyIGhhcyB0byBiZSB0b28gc21hbGwgb3IgdGhlCisgKiBmaWxlIGlzIGNvcnJ1cHQgaW4gYSB3YXkgdGhhdCBkZWNvZGluZyBpdCBwcm9kdWNlcyB0b28gYmlnIG91dHB1dC4KKyAqCisgKiBJZiBzaW5nbGUtY2FsbCBkZWNvZGluZyBmYWlscywgd2UgcmVzZXQgYi0+aW5fcG9zIGFuZCBiLT5vdXRfcG9zIGJhY2sgdG8KKyAqIHRoZWlyIG9yaWdpbmFsIHZhbHVlcy4gVGhpcyBpcyBiZWNhdXNlIHdpdGggc29tZSBmaWx0ZXIgY2hhaW5zIHRoZXJlIHdvbid0CisgKiBiZSBhbnkgdmFsaWQgdW5jb21wcmVzc2VkIGRhdGEgaW4gdGhlIG91dHB1dCBidWZmZXIgdW5sZXNzIHRoZSBkZWNvZGluZworICogYWN0dWFsbHkgc3VjY2VlZHMgKHRoYXQncyB0aGUgcHJpY2UgdG8gcGF5IG9mIHVzaW5nIHRoZSBvdXRwdXQgYnVmZmVyIGFzCisgKiB0aGUgd29ya3NwYWNlKS4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19ydW4oc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgaW5fc3RhcnQ7CisJc2l6ZV90IG91dF9zdGFydDsKKwllbnVtIHh6X3JldCByZXQ7CisKKwlpZiAoREVDX0lTX1NJTkdMRShzLT5tb2RlKSkKKwkJeHpfZGVjX3Jlc2V0KHMpOworCisJaW5fc3RhcnQgPSBiLT5pbl9wb3M7CisJb3V0X3N0YXJ0ID0gYi0+b3V0X3BvczsKKwlyZXQgPSBkZWNfbWFpbihzLCBiKTsKKworCWlmIChERUNfSVNfU0lOR0xFKHMtPm1vZGUpKSB7CisJCWlmIChyZXQgPT0gWFpfT0spCisJCQlyZXQgPSBiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZQorCQkJCQk/IFhaX0RBVEFfRVJST1IgOiBYWl9CVUZfRVJST1I7CisKKwkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKSB7CisJCQliLT5pbl9wb3MgPSBpbl9zdGFydDsKKwkJCWItPm91dF9wb3MgPSBvdXRfc3RhcnQ7CisJCX0KKworCX0gZWxzZSBpZiAocmV0ID09IFhaX09LICYmIGluX3N0YXJ0ID09IGItPmluX3BvcworCQkJJiYgb3V0X3N0YXJ0ID09IGItPm91dF9wb3MpIHsKKwkJaWYgKHMtPmFsbG93X2J1Zl9lcnJvcikKKwkJCXJldCA9IFhaX0JVRl9FUlJPUjsKKworCQlzLT5hbGxvd19idWZfZXJyb3IgPSB0cnVlOworCX0gZWxzZSB7CisJCXMtPmFsbG93X2J1Zl9lcnJvciA9IGZhbHNlOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK1haX0VYVEVSTiBzdHJ1Y3QgeHpfZGVjICp4el9kZWNfaW5pdChlbnVtIHh6X21vZGUgbW9kZSwgdWludDMyX3QgZGljdF9tYXgpCit7CisJc3RydWN0IHh6X2RlYyAqcyA9IGttYWxsb2Moc2l6ZW9mKCpzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzLT5tb2RlID0gbW9kZTsKKworI2lmZGVmIFhaX0RFQ19CQ0oKKwlzLT5iY2ogPSB4el9kZWNfYmNqX2NyZWF0ZShERUNfSVNfU0lOR0xFKG1vZGUpKTsKKwlpZiAocy0+YmNqID09IE5VTEwpCisJCWdvdG8gZXJyb3JfYmNqOworI2VuZGlmCisKKwlzLT5sem1hMiA9IHh6X2RlY19sem1hMl9jcmVhdGUobW9kZSwgZGljdF9tYXgpOworCWlmIChzLT5sem1hMiA9PSBOVUxMKQorCQlnb3RvIGVycm9yX2x6bWEyOworCisJeHpfZGVjX3Jlc2V0KHMpOworCXJldHVybiBzOworCitlcnJvcl9sem1hMjoKKyNpZmRlZiBYWl9ERUNfQkNKCisJeHpfZGVjX2Jjal9lbmQocy0+YmNqKTsKK2Vycm9yX2JjajoKKyNlbmRpZgorCWtmcmVlKHMpOworCXJldHVybiBOVUxMOworfQorCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfcmVzZXQoc3RydWN0IHh6X2RlYyAqcykKK3sKKwlzLT5zZXF1ZW5jZSA9IFNFUV9TVFJFQU1fSEVBREVSOworCXMtPmFsbG93X2J1Zl9lcnJvciA9IGZhbHNlOworCXMtPnBvcyA9IDA7CisJcy0+Y3JjMzIgPSAwOworCW1lbXplcm8oJnMtPmJsb2NrLCBzaXplb2Yocy0+YmxvY2spKTsKKwltZW16ZXJvKCZzLT5pbmRleCwgc2l6ZW9mKHMtPmluZGV4KSk7CisJcy0+dGVtcC5wb3MgPSAwOworCXMtPnRlbXAuc2l6ZSA9IFNUUkVBTV9IRUFERVJfU0laRTsKK30KKworWFpfRVhURVJOIHZvaWQgeHpfZGVjX2VuZChzdHJ1Y3QgeHpfZGVjICpzKQoreworCWlmIChzICE9IE5VTEwpIHsKKwkJeHpfZGVjX2x6bWEyX2VuZChzLT5sem1hMik7CisjaWZkZWYgWFpfREVDX0JDSgorCQl4el9kZWNfYmNqX2VuZChzLT5iY2opOworI2VuZGlmCisJCWtmcmVlKHMpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2RlY19zeW1zLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZWIzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfc3ltcy5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBYWiBkZWNvZGVyIG1vZHVsZSBpbmZvcm1hdGlvbgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgveHouaD4KKworRVhQT1JUX1NZTUJPTCh4el9kZWNfaW5pdCk7CitFWFBPUlRfU1lNQk9MKHh6X2RlY19yZXNldCk7CitFWFBPUlRfU1lNQk9MKHh6X2RlY19ydW4pOworRVhQT1JUX1NZTUJPTCh4el9kZWNfZW5kKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYWiBkZWNvbXByZXNzb3IiKTsKK01PRFVMRV9WRVJTSU9OKCIxLjAiKTsKK01PRFVMRV9BVVRIT1IoIkxhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPiBhbmQgSWdvciBQYXZsb3YiKTsKKworLyoKKyAqIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgYnV0IGluIExpbnV4IGl0J3Mgc2ltcGxlc3QgdG8ganVzdAorICogc2F5IGl0J3MgR1BMIGFuZCBjb25zaWRlciB0aGUgYXV0aG9ycyBhcyB0aGUgY29weXJpZ2h0IGhvbGRlcnMuCisgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2RlY190ZXN0LmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMjhhMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9kZWNfdGVzdC5jCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogWFogZGVjb2RlciB0ZXN0ZXIKKyAqCisgKiBBdXRob3I6IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICoKKyAqIFRoaXMgZmlsZSBoYXMgYmVlbiBwdXQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KKyAqIFlvdSBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIGZpbGUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjaW5jbHVkZSA8bGludXgveHouaD4KKworLyogTWF4aW11bSBzdXBwb3J0ZWQgZGljdGlvbmFyeSBzaXplICovCisjZGVmaW5lIERJQ1RfTUFYICgxIDw8IDIwKQorCisvKiBEZXZpY2UgbmFtZSB0byBwYXNzIHRvIHJlZ2lzdGVyX2NocmRldigpLiAqLworI2RlZmluZSBERVZJQ0VfTkFNRSAieHpfZGVjX3Rlc3QiCisKKy8qIER5bmFtaWNhbGx5IGFsbG9jYXRlZCBkZXZpY2UgbWFqb3IgbnVtYmVyICovCitzdGF0aWMgaW50IGRldmljZV9tYWpvcjsKKworLyoKKyAqIFdlIHJldXNlIHRoZSBzYW1lIGRlY29kZXIgc3RhdGUsIGFuZCB0aHVzIGNhbiBkZWNvZGUgb25seSBvbmUKKyAqIGZpbGUgYXQgYSB0aW1lLgorICovCitzdGF0aWMgYm9vbCBkZXZpY2VfaXNfb3BlbjsKKworLyogWFogZGVjb2RlciBzdGF0ZSAqLworc3RhdGljIHN0cnVjdCB4el9kZWMgKnN0YXRlOworCisvKgorICogUmV0dXJuIHZhbHVlIG9mIHh6X2RlY19ydW4oKS4gV2UgbmVlZCB0byBhdm9pZCBjYWxsaW5nIHh6X2RlY19ydW4oKSBhZnRlcgorICogaXQgaGFzIHJldHVybmVkIFhaX1NUUkVBTV9FTkQsIHNvIHdlIG1ha2UgdGhpcyBzdGF0aWMuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCByZXQ7CisKKy8qCisgKiBJbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMuIFRoZSBpbnB1dCBidWZmZXIgaXMgdXNlZCBhcyBhIHRlbXBvcmFyeSBzYWZlCisgKiBwbGFjZSBmb3IgdGhlIGRhdGEgY29taW5nIGZyb20gdGhlIHVzZXJzcGFjZS4KKyAqLworc3RhdGljIHVpbnQ4X3QgYnVmZmVyX2luWzEwMjRdOworc3RhdGljIHVpbnQ4X3QgYnVmZmVyX291dFsxMDI0XTsKKworLyoKKyAqIFN0cnVjdHVyZSB0byBwYXNzIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlIFhaIGRlY29kZXIuCisgKiBBIGZldyBvZiB0aGUgZmllbGRzIGFyZSBuZXZlciBtb2RpZmllZCBzbyB3ZSBpbml0aWFsaXplIHRoZW0gaGVyZS4KKyAqLworc3RhdGljIHN0cnVjdCB4el9idWYgYnVmZmVycyA9IHsKKwkuaW4gPSBidWZmZXJfaW4sCisJLm91dCA9IGJ1ZmZlcl9vdXQsCisJLm91dF9zaXplID0gc2l6ZW9mKGJ1ZmZlcl9vdXQpCit9OworCisvKgorICogQ1JDMzIgb2YgdW5jb21wcmVzc2VkIGRhdGEuIFRoaXMgaXMgdXNlZCB0byBnaXZlIHRoZSB1c2VyIGEgc2ltcGxlIHdheQorICogdG8gY2hlY2sgdGhhdCB0aGUgZGVjb2RlciBwcm9kdWNlcyBjb3JyZWN0IG91dHB1dC4KKyAqLworc3RhdGljIHVpbnQzMl90IGNyYzsKKworc3RhdGljIGludCB4el9kZWNfdGVzdF9vcGVuKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpCit7CisJaWYgKGRldmljZV9pc19vcGVuKQorCQlyZXR1cm4gLUVCVVNZOworCisJZGV2aWNlX2lzX29wZW4gPSB0cnVlOworCisJeHpfZGVjX3Jlc2V0KHN0YXRlKTsKKwlyZXQgPSBYWl9PSzsKKwljcmMgPSAweEZGRkZGRkZGOworCisJYnVmZmVycy5pbl9wb3MgPSAwOworCWJ1ZmZlcnMuaW5fc2l6ZSA9IDA7CisJYnVmZmVycy5vdXRfcG9zID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogb3BlbmVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4el9kZWNfdGVzdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaSwgc3RydWN0IGZpbGUgKmYpCit7CisJZGV2aWNlX2lzX29wZW4gPSBmYWxzZTsKKworCWlmIChyZXQgPT0gWFpfT0spCisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogaW5wdXQgd2FzIHRydW5jYXRlZFxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IGNsb3NlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEZWNvZGUgdGhlIGRhdGEgZ2l2ZW4gdG8gdXMgZnJvbSB0aGUgdXNlcnNwYWNlLiBDUkMzMiBvZiB0aGUgdW5jb21wcmVzc2VkCisgKiBkYXRhIGlzIGNhbGN1bGF0ZWQgYW5kIGlzIHByaW50ZWQgYXQgdGhlIGVuZCBvZiBzdWNjZXNzZnVsIGRlY29kaW5nLiBUaGUKKyAqIHVuY29tcHJlc3NlZCBkYXRhIGlzbid0IHN0b3JlZCBhbnl3aGVyZSBmb3IgZnVydGhlciB1c2UuCisgKgorICogVGhlIC54eiBmaWxlIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBTdHJlYW0gYW5kIG5vIFN0cmVhbSBQYWRkaW5nLiBUaGUgZGF0YQorICogYWZ0ZXIgdGhlIGZpcnN0IFN0cmVhbSBpcyBjb25zaWRlcmVkIHRvIGJlIGdhcmJhZ2UuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHh6X2RlY190ZXN0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSBzaXplX3Qgc2l6ZSwgbG9mZl90ICpwb3MpCit7CisJc2l6ZV90IHJlbWFpbmluZzsKKworCWlmIChyZXQgIT0gWFpfT0spIHsKKwkJaWYgKHNpemUgPiAwKQorCQkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiAlenUgYnl0ZXMgb2YgIgorCQkJCQkiZ2FyYmFnZSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlXG4iLAorCQkJCQlzaXplKTsKKworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IGRlY29kaW5nICV6dSBieXRlcyBvZiBpbnB1dFxuIiwKKwkJCXNpemUpOworCisJcmVtYWluaW5nID0gc2l6ZTsKKwl3aGlsZSAoKHJlbWFpbmluZyA+IDAgfHwgYnVmZmVycy5vdXRfcG9zID09IGJ1ZmZlcnMub3V0X3NpemUpCisJCQkmJiByZXQgPT0gWFpfT0spIHsKKwkJaWYgKGJ1ZmZlcnMuaW5fcG9zID09IGJ1ZmZlcnMuaW5fc2l6ZSkgeworCQkJYnVmZmVycy5pbl9wb3MgPSAwOworCQkJYnVmZmVycy5pbl9zaXplID0gbWluKHJlbWFpbmluZywgc2l6ZW9mKGJ1ZmZlcl9pbikpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlcl9pbiwgYnVmLCBidWZmZXJzLmluX3NpemUpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlidWYgKz0gYnVmZmVycy5pbl9zaXplOworCQkJcmVtYWluaW5nIC09IGJ1ZmZlcnMuaW5fc2l6ZTsKKwkJfQorCisJCWJ1ZmZlcnMub3V0X3BvcyA9IDA7CisJCXJldCA9IHh6X2RlY19ydW4oc3RhdGUsICZidWZmZXJzKTsKKwkJY3JjID0gY3JjMzIoY3JjLCBidWZmZXJfb3V0LCBidWZmZXJzLm91dF9wb3MpOworCX0KKworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBYWl9PSzoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9PS1xuIik7CisJCXJldHVybiBzaXplOworCisJY2FzZSBYWl9TVFJFQU1fRU5EOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX1NUUkVBTV9FTkQsICIKKwkJCQkiQ1JDMzIgPSAweCUwOFhcbiIsIH5jcmMpOworCQlyZXR1cm4gc2l6ZSAtIHJlbWFpbmluZyAtIChidWZmZXJzLmluX3NpemUgLSBidWZmZXJzLmluX3Bvcyk7CisKKwljYXNlIFhaX01FTUxJTUlUX0VSUk9SOgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IFhaX01FTUxJTUlUX0VSUk9SXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0ZPUk1BVF9FUlJPUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9GT1JNQVRfRVJST1JcbiIpOworCQlicmVhazsKKworCWNhc2UgWFpfT1BUSU9OU19FUlJPUjoKKwkJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBYWl9PUFRJT05TX0VSUk9SXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFhaX0RBVEFfRVJST1I6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogWFpfREFUQV9FUlJPUlxuIik7CisJCWJyZWFrOworCisJY2FzZSBYWl9CVUZfRVJST1I6CisJCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogWFpfQlVGX0VSUk9SXG4iKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9JTkZPIERFVklDRV9OQU1FICI6IEJ1ZyBkZXRlY3RlZCFcbiIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTzsKK30KKworLyogQWxsb2NhdGUgdGhlIFhaIGRlY29kZXIgc3RhdGUgYW5kIHJlZ2lzdGVyIHRoZSBjaGFyYWN0ZXIgZGV2aWNlLiAqLworc3RhdGljIGludCBfX2luaXQgeHpfZGVjX3Rlc3RfaW5pdCh2b2lkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZpbGVvcHMgPSB7CisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkub3BlbiA9ICZ4el9kZWNfdGVzdF9vcGVuLAorCQkucmVsZWFzZSA9ICZ4el9kZWNfdGVzdF9yZWxlYXNlLAorCQkud3JpdGUgPSAmeHpfZGVjX3Rlc3Rfd3JpdGUKKwl9OworCisJc3RhdGUgPSB4el9kZWNfaW5pdChYWl9QUkVBTExPQywgRElDVF9NQVgpOworCWlmIChzdGF0ZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldmljZV9tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBERVZJQ0VfTkFNRSwgJmZpbGVvcHMpOworCWlmIChkZXZpY2VfbWFqb3IgPCAwKSB7CisJCXh6X2RlY19lbmQoc3RhdGUpOworCQlyZXR1cm4gZGV2aWNlX21ham9yOworCX0KKworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogbW9kdWxlIGxvYWRlZFxuIik7CisJcHJpbnRrKEtFUk5fSU5GTyBERVZJQ0VfTkFNRSAiOiBDcmVhdGUgYSBkZXZpY2Ugbm9kZSB3aXRoICIKKwkJCSInbWtub2QgIiBERVZJQ0VfTkFNRSAiIGMgJWQgMCcgYW5kIHdyaXRlIC54eiBmaWxlcyAiCisJCQkidG8gaXQuXG4iLCBkZXZpY2VfbWFqb3IpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgeHpfZGVjX3Rlc3RfZXhpdCh2b2lkKQoreworCXVucmVnaXN0ZXJfY2hyZGV2KGRldmljZV9tYWpvciwgREVWSUNFX05BTUUpOworCXh6X2RlY19lbmQoc3RhdGUpOworCXByaW50ayhLRVJOX0lORk8gREVWSUNFX05BTUUgIjogbW9kdWxlIHVubG9hZGVkXG4iKTsKK30KKworbW9kdWxlX2luaXQoeHpfZGVjX3Rlc3RfaW5pdCk7Cittb2R1bGVfZXhpdCh4el9kZWNfdGVzdF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJYWiBkZWNvbXByZXNzb3IgdGVzdGVyIik7CitNT0RVTEVfVkVSU0lPTigiMS4wIik7CitNT0RVTEVfQVVUSE9SKCJMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4iKTsKKworLyoKKyAqIFRoaXMgY29kZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgYnV0IGluIExpbnV4IGl0J3Mgc2ltcGxlc3QgdG8ganVzdAorICogc2F5IGl0J3MgR1BMIGFuZCBjb25zaWRlciB0aGUgYXV0aG9ycyBhcyB0aGUgY29weXJpZ2h0IGhvbGRlcnMuCisgKi8KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3h6L3h6X2x6bWEyLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9sem1hMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MWQ2N2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9sem1hMi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTFpNQTIgZGVmaW5pdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfTFpNQTJfSAorI2RlZmluZSBYWl9MWk1BMl9ICisKKy8qIFJhbmdlIGNvZGVyIGNvbnN0YW50cyAqLworI2RlZmluZSBSQ19TSElGVF9CSVRTIDgKKyNkZWZpbmUgUkNfVE9QX0JJVFMgMjQKKyNkZWZpbmUgUkNfVE9QX1ZBTFVFICgxIDw8IFJDX1RPUF9CSVRTKQorI2RlZmluZSBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUyAxMQorI2RlZmluZSBSQ19CSVRfTU9ERUxfVE9UQUwgKDEgPDwgUkNfQklUX01PREVMX1RPVEFMX0JJVFMpCisjZGVmaW5lIFJDX01PVkVfQklUUyA1CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBwb3NpdGlvbiBzdGF0ZXMuIEEgcG9zaXRpb24gc3RhdGUgaXMgdGhlIGxvd2VzdCBwYgorICogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGN1cnJlbnQgdW5jb21wcmVzc2VkIG9mZnNldC4gSW4gc29tZSBwbGFjZXMgdGhlcmUKKyAqIGFyZSBkaWZmZXJlbnQgc2V0cyBvZiBwcm9iYWJpbGl0aWVzIGZvciBkaWZmZXJlbnQgcG9zaXRpb24gc3RhdGVzLgorICovCisjZGVmaW5lIFBPU19TVEFURVNfTUFYICgxIDw8IDQpCisKKy8qCisgKiBUaGlzIGVudW0gaXMgdXNlZCB0byB0cmFjayB3aGljaCBMWk1BIHN5bWJvbHMgaGF2ZSBvY2N1cnJlZCBtb3N0IHJlY2VudGx5CisgKiBhbmQgaW4gd2hpY2ggb3JkZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcmVkaWN0IHRoZSBuZXh0IHN5bWJvbC4KKyAqCisgKiBTeW1ib2xzOgorICogIC0gTGl0ZXJhbDogT25lIDgtYml0IGJ5dGUKKyAqICAtIE1hdGNoOiBSZXBlYXQgYSBjaHVuayBvZiBkYXRhIGF0IHNvbWUgZGlzdGFuY2UKKyAqICAtIExvbmcgcmVwZWF0OiBNdWx0aS1ieXRlIG1hdGNoIGF0IGEgcmVjZW50bHkgc2VlbiBkaXN0YW5jZQorICogIC0gU2hvcnQgcmVwZWF0OiBPbmUtYnl0ZSByZXBlYXQgYXQgYSByZWNlbnRseSBzZWVuIGRpc3RhbmNlCisgKgorICogVGhlIHN5bWJvbCBuYW1lcyBhcmUgaW4gZnJvbSBTVEFURV9vbGRlc3Rfb2xkZXJfcHJldmlvdXMuIFJFUCBtZWFucworICogZWl0aGVyIHNob3J0IG9yIGxvbmcgcmVwZWF0ZWQgbWF0Y2gsIGFuZCBOT05MSVQgbWVhbnMgYW55IG5vbi1saXRlcmFsLgorICovCitlbnVtIGx6bWFfc3RhdGUgeworCVNUQVRFX0xJVF9MSVQsCisJU1RBVEVfTUFUQ0hfTElUX0xJVCwKKwlTVEFURV9SRVBfTElUX0xJVCwKKwlTVEFURV9TSE9SVFJFUF9MSVRfTElULAorCVNUQVRFX01BVENIX0xJVCwKKwlTVEFURV9SRVBfTElULAorCVNUQVRFX1NIT1JUUkVQX0xJVCwKKwlTVEFURV9MSVRfTUFUQ0gsCisJU1RBVEVfTElUX0xPTkdSRVAsCisJU1RBVEVfTElUX1NIT1JUUkVQLAorCVNUQVRFX05PTkxJVF9NQVRDSCwKKwlTVEFURV9OT05MSVRfUkVQCit9OworCisvKiBUb3RhbCBudW1iZXIgb2Ygc3RhdGVzICovCisjZGVmaW5lIFNUQVRFUyAxMgorCisvKiBUaGUgbG93ZXN0IDcgc3RhdGVzIGluZGljYXRlIHRoYXQgdGhlIHByZXZpb3VzIHN0YXRlIHdhcyBhIGxpdGVyYWwuICovCisjZGVmaW5lIExJVF9TVEFURVMgNworCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9saXRlcmFsKGVudW0gbHptYV9zdGF0ZSAqc3RhdGUpCit7CisJaWYgKCpzdGF0ZSA8PSBTVEFURV9TSE9SVFJFUF9MSVRfTElUKQorCQkqc3RhdGUgPSBTVEFURV9MSVRfTElUOworCWVsc2UgaWYgKCpzdGF0ZSA8PSBTVEFURV9MSVRfU0hPUlRSRVApCisJCSpzdGF0ZSAtPSAzOworCWVsc2UKKwkJKnN0YXRlIC09IDY7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzeW1ib2wgd2FzIGEgbWF0Y2guICovCitzdGF0aWMgaW5saW5lIHZvaWQgbHptYV9zdGF0ZV9tYXRjaChlbnVtIGx6bWFfc3RhdGUgKnN0YXRlKQoreworCSpzdGF0ZSA9ICpzdGF0ZSA8IExJVF9TVEFURVMgPyBTVEFURV9MSVRfTUFUQ0ggOiBTVEFURV9OT05MSVRfTUFUQ0g7Cit9CisKKy8qIEluZGljYXRlIHRoYXQgdGhlIGxhdGVzdCBzdGF0ZSB3YXMgYSBsb25nIHJlcGVhdGVkIG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIGx6bWFfc3RhdGVfbG9uZ19yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX0xPTkdSRVAgOiBTVEFURV9OT05MSVRfUkVQOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIHNob3J0IG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIGx6bWFfc3RhdGVfc2hvcnRfcmVwKGVudW0gbHptYV9zdGF0ZSAqc3RhdGUpCit7CisJKnN0YXRlID0gKnN0YXRlIDwgTElUX1NUQVRFUyA/IFNUQVRFX0xJVF9TSE9SVFJFUCA6IFNUQVRFX05PTkxJVF9SRVA7Cit9CisKKy8qIFRlc3QgaWYgdGhlIHByZXZpb3VzIHN5bWJvbCB3YXMgYSBsaXRlcmFsLiAqLworc3RhdGljIGlubGluZSBib29sIGx6bWFfc3RhdGVfaXNfbGl0ZXJhbChlbnVtIGx6bWFfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIHN0YXRlIDwgTElUX1NUQVRFUzsKK30KKworLyogRWFjaCBsaXRlcmFsIGNvZGVyIGlzIGRpdmlkZWQgaW4gdGhyZWUgc2VjdGlvbnM6CisgKiAgIC0gMHgwMDEtMHgwRkY6IFdpdGhvdXQgbWF0Y2ggYnl0ZQorICogICAtIDB4MTAxLTB4MUZGOiBXaXRoIG1hdGNoIGJ5dGU7IG1hdGNoIGJpdCBpcyAwCisgKiAgIC0gMHgyMDEtMHgyRkY6IFdpdGggbWF0Y2ggYnl0ZTsgbWF0Y2ggYml0IGlzIDEKKyAqCisgKiBNYXRjaCBieXRlIGlzIHVzZWQgd2hlbiB0aGUgcHJldmlvdXMgTFpNQSBzeW1ib2wgd2FzIHNvbWV0aGluZyBlbHNlIHRoYW4KKyAqIGEgbGl0ZXJhbCAodGhhdCBpcywgaXQgd2FzIHNvbWUga2luZCBvZiBtYXRjaCkuCisgKi8KKyNkZWZpbmUgTElURVJBTF9DT0RFUl9TSVpFIDB4MzAwCisKKy8qIE1heGltdW0gbnVtYmVyIG9mIGxpdGVyYWwgY29kZXJzICovCisjZGVmaW5lIExJVEVSQUxfQ09ERVJTX01BWCAoMSA8PCA0KQorCisvKiBNaW5pbXVtIGxlbmd0aCBvZiBhIG1hdGNoIGlzIHR3byBieXRlcy4gKi8KKyNkZWZpbmUgTUFUQ0hfTEVOX01JTiAyCisKKy8qIE1hdGNoIGxlbmd0aCBpcyBlbmNvZGVkIHdpdGggNCwgNSwgb3IgMTAgYml0cy4KKyAqCisgKiBMZW5ndGggICBCaXRzCisgKiAgMi05ICAgICAgNCA9IENob2ljZT0wICsgMyBiaXRzCisgKiAxMC0xNyAgICAgNSA9IENob2ljZT0xICsgQ2hvaWNlMj0wICsgMyBiaXRzCisgKiAxOC0yNzMgICAxMCA9IENob2ljZT0xICsgQ2hvaWNlMj0xICsgOCBiaXRzCisgKi8KKyNkZWZpbmUgTEVOX0xPV19CSVRTIDMKKyNkZWZpbmUgTEVOX0xPV19TWU1CT0xTICgxIDw8IExFTl9MT1dfQklUUykKKyNkZWZpbmUgTEVOX01JRF9CSVRTIDMKKyNkZWZpbmUgTEVOX01JRF9TWU1CT0xTICgxIDw8IExFTl9NSURfQklUUykKKyNkZWZpbmUgTEVOX0hJR0hfQklUUyA4CisjZGVmaW5lIExFTl9ISUdIX1NZTUJPTFMgKDEgPDwgTEVOX0hJR0hfQklUUykKKyNkZWZpbmUgTEVOX1NZTUJPTFMgKExFTl9MT1dfU1lNQk9MUyArIExFTl9NSURfU1lNQk9MUyArIExFTl9ISUdIX1NZTUJPTFMpCisKKy8qCisgKiBNYXhpbXVtIGxlbmd0aCBvZiBhIG1hdGNoIGlzIDI3MyB3aGljaCBpcyBhIHJlc3VsdCBvZiB0aGUgZW5jb2RpbmcKKyAqIGRlc2NyaWJlZCBhYm92ZS4KKyAqLworI2RlZmluZSBNQVRDSF9MRU5fTUFYIChNQVRDSF9MRU5fTUlOICsgTEVOX1NZTUJPTFMgLSAxKQorCisvKgorICogRGlmZmVyZW50IHNldHMgb2YgcHJvYmFiaWxpdGllcyBhcmUgdXNlZCBmb3IgbWF0Y2ggZGlzdGFuY2VzIHRoYXQgaGF2ZQorICogdmVyeSBzaG9ydCBtYXRjaCBsZW5ndGg6IExlbmd0aHMgb2YgMiwgMywgYW5kIDQgYnl0ZXMgaGF2ZSBhIHNlcGFyYXRlCisgKiBzZXQgb2YgcHJvYmFiaWxpdGllcyBmb3IgZWFjaCBsZW5ndGguIFRoZSBtYXRjaGVzIHdpdGggbG9uZ2VyIGxlbmd0aAorICogdXNlIGEgc2hhcmVkIHNldCBvZiBwcm9iYWJpbGl0aWVzLgorICovCisjZGVmaW5lIERJU1RfU1RBVEVTIDQKKworLyoKKyAqIEdldCB0aGUgaW5kZXggb2YgdGhlIGFwcHJvcHJpYXRlIHByb2JhYmlsaXR5IGFycmF5IGZvciBkZWNvZGluZworICogdGhlIGRpc3RhbmNlIHNsb3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbHptYV9nZXRfZGlzdF9zdGF0ZSh1aW50MzJfdCBsZW4pCit7CisJcmV0dXJuIGxlbiA8IERJU1RfU1RBVEVTICsgTUFUQ0hfTEVOX01JTgorCQkJPyBsZW4gLSBNQVRDSF9MRU5fTUlOIDogRElTVF9TVEFURVMgLSAxOworfQorCisvKgorICogVGhlIGhpZ2hlc3QgdHdvIGJpdHMgb2YgYSAzMi1iaXQgbWF0Y2ggZGlzdGFuY2UgYXJlIGVuY29kZWQgdXNpbmcgc2l4IGJpdHMuCisgKiBUaGlzIHNpeC1iaXQgdmFsdWUgaXMgY2FsbGVkIGEgZGlzdGFuY2Ugc2xvdC4gVGhpcyB3YXkgZW5jb2RpbmcgYSAzMi1iaXQKKyAqIHZhbHVlIHRha2VzIDYtMzYgYml0cywgbGFyZ2VyIHZhbHVlcyB0YWtpbmcgbW9yZSBiaXRzLgorICovCisjZGVmaW5lIERJU1RfU0xPVF9CSVRTIDYKKyNkZWZpbmUgRElTVF9TTE9UUyAoMSA8PCBESVNUX1NMT1RfQklUUykKKworLyogTWF0Y2ggZGlzdGFuY2VzIHVwIHRvIDEyNyBhcmUgZnVsbHkgZW5jb2RlZCB1c2luZyBwcm9iYWJpbGl0aWVzLiBTaW5jZQorICogdGhlIGhpZ2hlc3QgdHdvIGJpdHMgKGRpc3RhbmNlIHNsb3QpIGFyZSBhbHdheXMgZW5jb2RlZCB1c2luZyBzaXggYml0cywKKyAqIHRoZSBkaXN0YW5jZXMgMC0zIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgYml0cyB0byBlbmNvZGUsIHNpbmNlIHRoZQorICogZGlzdGFuY2Ugc2xvdCBpdHNlbGYgaXMgdGhlIHNhbWUgYXMgdGhlIGFjdHVhbCBkaXN0YW5jZS4gRElTVF9NT0RFTF9TVEFSVAorICogaW5kaWNhdGVzIHRoZSBmaXJzdCBkaXN0YW5jZSBzbG90IHdoZXJlIGF0IGxlYXN0IG9uZSBhZGRpdGlvbmFsIGJpdCBpcworICogbmVlZGVkLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfU1RBUlQgNAorCisvKgorICogTWF0Y2ggZGlzdGFuY2VzIGdyZWF0ZXIgdGhhbiAxMjcgYXJlIGVuY29kZWQgaW4gdGhyZWUgcGllY2VzOgorICogICAtIGRpc3RhbmNlIHNsb3Q6IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gZGlyZWN0IGJpdHM6IDItMjYgYml0cyBiZWxvdyB0aGUgaGlnaGVzdCB0d28gYml0cworICogICAtIGFsaWdubWVudCBiaXRzOiBmb3VyIGxvd2VzdCBiaXRzCisgKgorICogRGlyZWN0IGJpdHMgZG9uJ3QgdXNlIGFueSBwcm9iYWJpbGl0aWVzLgorICoKKyAqIFRoZSBkaXN0YW5jZSBzbG90IHZhbHVlIG9mIDE0IGlzIGZvciBkaXN0YW5jZXMgMTI4LTE5MS4KKyAqLworI2RlZmluZSBESVNUX01PREVMX0VORCAxNAorCisvKiBEaXN0YW5jZSBzbG90cyB0aGF0IGluZGljYXRlIGEgZGlzdGFuY2UgPD0gMTI3LiAqLworI2RlZmluZSBGVUxMX0RJU1RBTkNFU19CSVRTIChESVNUX01PREVMX0VORCAvIDIpCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTICgxIDw8IEZVTExfRElTVEFOQ0VTX0JJVFMpCisKKy8qCisgKiBGb3IgbWF0Y2ggZGlzdGFuY2VzIGdyZWF0ZXIgdGhhbiAxMjcsIG9ubHkgdGhlIGhpZ2hlc3QgdHdvIGJpdHMgYW5kIHRoZQorICogbG93ZXN0IGZvdXIgYml0cyAoYWxpZ25tZW50KSBpcyBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuCisgKi8KKyNkZWZpbmUgQUxJR05fQklUUyA0CisjZGVmaW5lIEFMSUdOX1NJWkUgKDEgPDwgQUxJR05fQklUUykKKyNkZWZpbmUgQUxJR05fTUFTSyAoQUxJR05fU0laRSAtIDEpCisKKy8qIFRvdGFsIG51bWJlciBvZiBhbGwgcHJvYmFiaWxpdHkgdmFyaWFibGVzICovCisjZGVmaW5lIFBST0JTX1RPVEFMICgxODQ2ICsgTElURVJBTF9DT0RFUlNfTUFYICogTElURVJBTF9DT0RFUl9TSVpFKQorCisvKgorICogTFpNQSByZW1lbWJlcnMgdGhlIGZvdXIgbW9zdCByZWNlbnQgbWF0Y2ggZGlzdGFuY2VzLiBSZXVzaW5nIHRoZXNlCisgKiBkaXN0YW5jZXMgdGVuZHMgdG8gdGFrZSBsZXNzIHNwYWNlIHRoYW4gcmUtZW5jb2RpbmcgdGhlIGFjdHVhbAorICogZGlzdGFuY2UgdmFsdWUuCisgKi8KKyNkZWZpbmUgUkVQUyA0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfcHJpdmF0ZS5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfcHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MmI5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9wcml2YXRlLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBQcml2YXRlIGluY2x1ZGVzIGFuZCBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIFhaX1BSSVZBVEVfSAorI2RlZmluZSBYWl9QUklWQVRFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKyMJaW5jbHVkZSA8bGludXgveHouaD4KKyMJaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjCWluY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKwkvKiBYWl9QUkVCT09UIG1heSBiZSBkZWZpbmVkIG9ubHkgdmlhIGRlY29tcHJlc3NfdW54ei5jLiAqLworIwlpZm5kZWYgWFpfUFJFQk9PVAorIwkJaW5jbHVkZSA8bGludXgvc2xhYi5oPgorIwkJaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorIwkJaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjCQlpZmRlZiBDT05GSUdfWFpfREVDX1g4NgorIwkJCWRlZmluZSBYWl9ERUNfWDg2CisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19QT1dFUlBDCisjCQkJZGVmaW5lIFhaX0RFQ19QT1dFUlBDCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19JQTY0CisjCQkJZGVmaW5lIFhaX0RFQ19JQTY0CisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19BUk0KKyMJCQlkZWZpbmUgWFpfREVDX0FSTQorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfQVJNVEhVTUIKKyMJCQlkZWZpbmUgWFpfREVDX0FSTVRIVU1CCisjCQllbmRpZgorIwkJaWZkZWYgQ09ORklHX1haX0RFQ19TUEFSQworIwkJCWRlZmluZSBYWl9ERUNfU1BBUkMKKyMJCWVuZGlmCisjCQlkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorIwkJZGVmaW5lIG1lbXplcm8oYnVmLCBzaXplKSBtZW1zZXQoYnVmLCAwLCBzaXplKQorIwllbmRpZgorIwlkZWZpbmUgZ2V0X2xlMzIocCkgbGUzMl90b19jcHVwKChjb25zdCB1aW50MzJfdCAqKShwKSkKKyNlbHNlCisJLyoKKwkgKiBGb3IgdXNlcnNwYWNlIGJ1aWxkcywgdXNlIGEgc2VwYXJhdGUgaGVhZGVyIHRvIGRlZmluZSB0aGUgcmVxdWlyZWQKKwkgKiBtYWNyb3MgYW5kIGZ1bmN0aW9ucy4gVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gYWRhcHQgdGhlIGNvZGUgaW50bworCSAqIGRpZmZlcmVudCBlbnZpcm9ubWVudHMgYW5kIGF2b2lkcyBjbHV0dGVyIGluIHRoZSBMaW51eCBrZXJuZWwgdHJlZS4KKwkgKi8KKyMJaW5jbHVkZSAieHpfY29uZmlnLmgiCisjZW5kaWYKKworLyogSWYgbm8gc3BlY2lmaWMgZGVjb2RpbmcgbW9kZSBpcyByZXF1ZXN0ZWQsIGVuYWJsZSBzdXBwb3J0IGZvciBhbGwgbW9kZXMuICovCisjaWYgIWRlZmluZWQoWFpfREVDX1NJTkdMRSkgJiYgIWRlZmluZWQoWFpfREVDX1BSRUFMTE9DKSBcCisJCSYmICFkZWZpbmVkKFhaX0RFQ19EWU5BTExPQykKKyMJZGVmaW5lIFhaX0RFQ19TSU5HTEUKKyMJZGVmaW5lIFhaX0RFQ19QUkVBTExPQworIwlkZWZpbmUgWFpfREVDX0RZTkFMTE9DCisjZW5kaWYKKworLyoKKyAqIFRoZSBERUNfSVNfZm9vKG1vZGUpIG1hY3JvcyBhcmUgdXNlZCBpbiAiaWYiIHN0YXRlbWVudHMuIElmIG9ubHkgc29tZQorICogb2YgdGhlIHN1cHBvcnRlZCBtb2RlcyBhcmUgZW5hYmxlZCwgdGhlc2UgbWFjcm9zIHdpbGwgZXZhbHVhdGUgdG8gdHJ1ZSBvcgorICogZmFsc2UgYXQgY29tcGlsZSB0aW1lIGFuZCB0aHVzIGFsbG93IHRoZSBjb21waWxlciB0byBvbWl0IHVubmVlZGVkIGNvZGUuCisgKi8KKyNpZmRlZiBYWl9ERUNfU0lOR0xFCisjCWRlZmluZSBERUNfSVNfU0lOR0xFKG1vZGUpICgobW9kZSkgPT0gWFpfU0lOR0xFKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19TSU5HTEUobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfUFJFQUxMT0MKKyMJZGVmaW5lIERFQ19JU19QUkVBTExPQyhtb2RlKSAoKG1vZGUpID09IFhaX1BSRUFMTE9DKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19QUkVBTExPQyhtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19EWU5BTExPQworIwlkZWZpbmUgREVDX0lTX0RZTkFMTE9DKG1vZGUpICgobW9kZSkgPT0gWFpfRFlOQUxMT0MpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX0RZTkFMTE9DKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoWFpfREVDX1NJTkdMRSkKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAodHJ1ZSkKKyNlbGlmIGRlZmluZWQoWFpfREVDX1BSRUFMTE9DKSB8fCBkZWZpbmVkKFhaX0RFQ19EWU5BTExPQykKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAoKG1vZGUpICE9IFhaX1NJTkdMRSkKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfTVVMVEkobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKy8qCisgKiBJZiBhbnkgb2YgdGhlIEJDSiBmaWx0ZXIgZGVjb2RlcnMgYXJlIHdhbnRlZCwgZGVmaW5lIFhaX0RFQ19CQ0ouCisgKiBYWl9ERUNfQkNKIGlzIHVzZWQgdG8gZW5hYmxlIGdlbmVyaWMgc3VwcG9ydCBmb3IgQkNKIGRlY29kZXJzLgorICovCisjaWZuZGVmIFhaX0RFQ19CQ0oKKyMJaWYgZGVmaW5lZChYWl9ERUNfWDg2KSB8fCBkZWZpbmVkKFhaX0RFQ19QT1dFUlBDKSBcCisJCQl8fCBkZWZpbmVkKFhaX0RFQ19JQTY0KSB8fCBkZWZpbmVkKFhaX0RFQ19BUk0pIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX0FSTSkgfHwgZGVmaW5lZChYWl9ERUNfQVJNVEhVTUIpIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX1NQQVJDKQorIwkJZGVmaW5lIFhaX0RFQ19CQ0oKKyMJZW5kaWYKKyNlbmRpZgorCisvKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBMWk1BMiBkZWNvZGVyLiB4el9kZWNfbHptYTJfcmVzZXQoKSBtdXN0IGJlIHVzZWQKKyAqIGJlZm9yZSBjYWxsaW5nIHh6X2RlY19sem1hMl9ydW4oKS4KKyAqLworWFpfRVhURVJOIHN0cnVjdCB4el9kZWNfbHptYTIgKnh6X2RlY19sem1hMl9jcmVhdGUoZW51bSB4el9tb2RlIG1vZGUsCisJCQkJCQkgICB1aW50MzJfdCBkaWN0X21heCk7CisKKy8qCisgKiBEZWNvZGUgdGhlIExaTUEyIHByb3BlcnRpZXMgKG9uZSBieXRlKSBhbmQgcmVzZXQgdGhlIGRlY29kZXIuIFJldHVybgorICogWFpfT0sgb24gc3VjY2VzcywgWFpfTUVNTElNSVRfRVJST1IgaWYgdGhlIHByZWFsbG9jYXRlZCBkaWN0aW9uYXJ5IGlzIG5vdAorICogYmlnIGVub3VnaCwgYW5kIFhaX09QVElPTlNfRVJST1IgaWYgcHJvcHMgaW5kaWNhdGVzIHNvbWV0aGluZyB0aGF0IHRoaXMKKyAqIGRlY29kZXIgZG9lc24ndCBzdXBwb3J0LgorICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3Jlc2V0KHN0cnVjdCB4el9kZWNfbHptYTIgKnMsCisJCQkJCSB1aW50OF90IHByb3BzKTsKKworLyogRGVjb2RlIHJhdyBMWk1BMiBzdHJlYW0gZnJvbSBiLT5pbiB0byBiLT5vdXQuICovCitYWl9FWFRFUk4gZW51bSB4el9yZXQgeHpfZGVjX2x6bWEyX3J1bihzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzLAorCQkJCSAgICAgICBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIExaTUEyIGRlY29kZXIuICovCitYWl9FWFRFUk4gdm9pZCB4el9kZWNfbHptYTJfZW5kKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpOworCisjaWZkZWYgWFpfREVDX0JDSgorLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgQkNKIGRlY29kZXJzLiB4el9kZWNfYmNqX3Jlc2V0KCkgbXVzdCBiZSB1c2VkIGJlZm9yZQorICogY2FsbGluZyB4el9kZWNfYmNqX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19iY2ogKnh6X2RlY19iY2pfY3JlYXRlKGJvb2wgc2luZ2xlX2NhbGwpOworCisvKgorICogRGVjb2RlIHRoZSBGaWx0ZXIgSUQgb2YgYSBCQ0ogZmlsdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAqIHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldHMsIHNvIG5vIGRlY29kaW5nIG9mIEZpbHRlciBQcm9wZXJ0aWVzCisgKiBpcyBuZWVkZWQuIFJldHVybnMgWFpfT0sgaWYgdGhlIGdpdmVuIEZpbHRlciBJRCBpcyBzdXBwb3J0ZWQuCisgKiBPdGhlcndpc2UgWFpfT1BUSU9OU19FUlJPUiBpcyByZXR1cm5lZC4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19iY2pfcmVzZXQoc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgaWQpOworCisvKgorICogRGVjb2RlIHJhdyBCQ0ogKyBMWk1BMiBzdHJlYW0uIFRoaXMgbXVzdCBiZSB1c2VkIG9ubHkgaWYgdGhlcmUgYWN0dWFsbHkgaXMKKyAqIGEgQkNKIGZpbHRlciBpbiB0aGUgY2hhaW4uIElmIHRoZSBjaGFpbiBoYXMgb25seSBMWk1BMiwgeHpfZGVjX2x6bWEyX3J1bigpCisgKiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseS4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IHh6X2RlY19iY2pfcnVuKHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQkJCSAgICAgc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTIsCisJCQkJICAgICBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIEJDSiBmaWx0ZXJzLiAqLworI2RlZmluZSB4el9kZWNfYmNqX2VuZChzKSBrZnJlZShzKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfc3RyZWFtLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi94ei94el9zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmNiNWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIveHoveHpfc3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBoYW5kbGluZyB0aGUgLnh6IGZpbGUgZm9ybWF0CisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfU1RSRUFNX0gKKyNkZWZpbmUgWFpfU1RSRUFNX0gKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgIVhaX0lOVEVSTkFMX0NSQzMyCisjCWluY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjCXVuZGVmIGNyYzMyCisjCWRlZmluZSB4el9jcmMzMihidWYsIHNpemUsIGNyYykgXAorCQkofmNyYzMyX2xlKH4odWludDMyX3QpKGNyYyksIGJ1Ziwgc2l6ZSkpCisjZW5kaWYKKworLyoKKyAqIFNlZSB0aGUgLnh6IGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQKKyAqIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRhaW5lciBmb3JtYXQuCisgKi8KKworI2RlZmluZSBTVFJFQU1fSEVBREVSX1NJWkUgMTIKKworI2RlZmluZSBIRUFERVJfTUFHSUMgIlwzNzU3elhaIgorI2RlZmluZSBIRUFERVJfTUFHSUNfU0laRSA2CisKKyNkZWZpbmUgRk9PVEVSX01BR0lDICJZWiIKKyNkZWZpbmUgRk9PVEVSX01BR0lDX1NJWkUgMgorCisvKgorICogVmFyaWFibGUtbGVuZ3RoIGludGVnZXIgY2FuIGhvbGQgYSA2My1iaXQgdW5zaWduZWQgaW50ZWdlciBvciBhIHNwZWNpYWwKKyAqIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgaXMgdW5rbm93bi4KKyAqCisgKiBFeHBlcmltZW50YWw6IHZsaV90eXBlIGNhbiBiZSBkZWZpbmVkIHRvIHVpbnQzMl90IHRvIHNhdmUgYSBmZXcgYnl0ZXMKKyAqIGluIGNvZGUgc2l6ZSAobm8gZWZmZWN0IG9uIHNwZWVkKS4gRG9pbmcgc28gbGltaXRzIHRoZSB1bmNvbXByZXNzZWQgYW5kCisgKiBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUgdG8gbGVzcyB0aGFuIDI1NiBNaUIgYW5kIG1heSBhbHNvIHdlYWtlbgorICogZXJyb3IgZGV0ZWN0aW9uIHNsaWdodGx5LgorICovCit0eXBlZGVmIHVpbnQ2NF90IHZsaV90eXBlOworCisjZGVmaW5lIFZMSV9NQVggKCh2bGlfdHlwZSktMSAvIDIpCisjZGVmaW5lIFZMSV9VTktOT1dOICgodmxpX3R5cGUpLTEpCisKKy8qIE1heGltdW0gZW5jb2RlZCBzaXplIG9mIGEgVkxJICovCisjZGVmaW5lIFZMSV9CWVRFU19NQVggKHNpemVvZih2bGlfdHlwZSkgKiA4IC8gNykKKworLyogSW50ZWdyaXR5IENoZWNrIHR5cGVzICovCitlbnVtIHh6X2NoZWNrIHsKKwlYWl9DSEVDS19OT05FID0gMCwKKwlYWl9DSEVDS19DUkMzMiA9IDEsCisJWFpfQ0hFQ0tfQ1JDNjQgPSA0LAorCVhaX0NIRUNLX1NIQTI1NiA9IDEwCit9OworCisvKiBNYXhpbXVtIHBvc3NpYmxlIENoZWNrIElEICovCisjZGVmaW5lIFhaX0NIRUNLX01BWCAxNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9NYWtlZmlsZSBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI3NWUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9kZWZsYXRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTEgQEAKKyMKKyMgVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgemxpYiwgd2hpY2ggZG9lcyBhbGwgbWVtb3J5CisjIGFsbG9jYXRpb24gYWhlYWQgb2YgdGltZS4KKyMKKyMgVGhpcyBpcyB0aGUgY29tcHJlc3Npb24gY29kZSwgc2VlIHpsaWJfaW5mbGF0ZSBmb3IgdGhlCisjIGRlY29tcHJlc3Npb24gY29kZS4KKyMKKworb2JqLSQoQ09ORklHX1pMSUJfREVGTEFURSkgKz0gemxpYl9kZWZsYXRlLm8KKworemxpYl9kZWZsYXRlLW9ianMgOj0gZGVmbGF0ZS5vIGRlZnRyZWUubyBkZWZsYXRlX3N5bXMubwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9kZWZsYXRlL2RlZmxhdGUuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwZWY0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlLmMKQEAgLTAsMCArMSwxMTM3IEBACisvKiArKysgZGVmbGF0ZS5jICovCisvKiBkZWZsYXRlLmMgLS0gY29tcHJlc3MgZGF0YSB1c2luZyB0aGUgZGVmbGF0aW9uIGFsZ29yaXRobQorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTYgSmVhbi1sb3VwIEdhaWxseS4KKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIGRlcGVuZHMgb24gYmVpbmcgYWJsZSB0byBpZGVudGlmeSBwb3J0aW9ucworICogICAgICBvZiB0aGUgaW5wdXQgdGV4dCB3aGljaCBhcmUgaWRlbnRpY2FsIHRvIGVhcmxpZXIgaW5wdXQgKHdpdGhpbiBhCisgKiAgICAgIHNsaWRpbmcgd2luZG93IHRyYWlsaW5nIGJlaGluZCB0aGUgaW5wdXQgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCkuCisgKgorICogICAgICBUaGUgbW9zdCBzdHJhaWdodGZvcndhcmQgdGVjaG5pcXVlIHR1cm5zIG91dCB0byBiZSB0aGUgZmFzdGVzdCBmb3IKKyAqICAgICAgbW9zdCBpbnB1dCBmaWxlczogdHJ5IGFsbCBwb3NzaWJsZSBtYXRjaGVzIGFuZCBzZWxlY3QgdGhlIGxvbmdlc3QuCisgKiAgICAgIFRoZSBrZXkgZmVhdHVyZSBvZiB0aGlzIGFsZ29yaXRobSBpcyB0aGF0IGluc2VydGlvbnMgaW50byB0aGUgc3RyaW5nCisgKiAgICAgIGRpY3Rpb25hcnkgYXJlIHZlcnkgc2ltcGxlIGFuZCB0aHVzIGZhc3QsIGFuZCBkZWxldGlvbnMgYXJlIGF2b2lkZWQKKyAqICAgICAgY29tcGxldGVseS4gSW5zZXJ0aW9ucyBhcmUgcGVyZm9ybWVkIGF0IGVhY2ggaW5wdXQgY2hhcmFjdGVyLCB3aGVyZWFzCisgKiAgICAgIHN0cmluZyBtYXRjaGVzIGFyZSBwZXJmb3JtZWQgb25seSB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBlbmRzLiBTbyBpdAorICogICAgICBpcyBwcmVmZXJhYmxlIHRvIHNwZW5kIG1vcmUgdGltZSBpbiBtYXRjaGVzIHRvIGFsbG93IHZlcnkgZmFzdCBzdHJpbmcKKyAqICAgICAgaW5zZXJ0aW9ucyBhbmQgYXZvaWQgZGVsZXRpb25zLiBUaGUgbWF0Y2hpbmcgYWxnb3JpdGhtIGZvciBzbWFsbAorICogICAgICBzdHJpbmdzIGlzIGluc3BpcmVkIGZyb20gdGhhdCBvZiBSYWJpbiAmIEthcnAuIEEgYnJ1dGUgZm9yY2UgYXBwcm9hY2gKKyAqICAgICAgaXMgdXNlZCB0byBmaW5kIGxvbmdlciBzdHJpbmdzIHdoZW4gYSBzbWFsbCBtYXRjaCBoYXMgYmVlbiBmb3VuZC4KKyAqICAgICAgQSBzaW1pbGFyIGFsZ29yaXRobSBpcyB1c2VkIGluIGNvbWljIChieSBKYW4tTWFyayBXYW1zKSBhbmQgZnJlZXplCisgKiAgICAgIChieSBMZW9uaWQgQnJvdWtoaXMpLgorICogICAgICAgICBBIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBmaWxlIHVzZWQgYSBtb3JlIHNvcGhpc3RpY2F0ZWQgYWxnb3JpdGhtCisgKiAgICAgIChieSBGaWFsYSBhbmQgR3JlZW5lKSB3aGljaCBpcyBndWFyYW50ZWVkIHRvIHJ1biBpbiBsaW5lYXIgYW1vcnRpemVkCisgKiAgICAgIHRpbWUsIGJ1dCBoYXMgYSBsYXJnZXIgYXZlcmFnZSBjb3N0LCB1c2VzIG1vcmUgbWVtb3J5IGFuZCBpcyBwYXRlbnRlZC4KKyAqICAgICAgSG93ZXZlciB0aGUgRiZHIGFsZ29yaXRobSBtYXkgYmUgZmFzdGVyIGZvciBzb21lIGhpZ2hseSByZWR1bmRhbnQKKyAqICAgICAgZmlsZXMgaWYgdGhlIHBhcmFtZXRlciBtYXhfY2hhaW5fbGVuZ3RoIChkZXNjcmliZWQgYmVsb3cpIGlzIHRvbyBsYXJnZS4KKyAqCisgKiAgQUNLTk9XTEVER0VNRU5UUworICoKKyAqICAgICAgVGhlIGlkZWEgb2YgbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgaXMgZHVlIHRvIEphbi1NYXJrIFdhbXMsIGFuZAorICogICAgICBJIGZvdW5kIGl0IGluICdmcmVlemUnIHdyaXR0ZW4gYnkgTGVvbmlkIEJyb3VraGlzLgorICogICAgICBUaGFua3MgdG8gbWFueSBwZW9wbGUgZm9yIGJ1ZyByZXBvcnRzIGFuZCB0ZXN0aW5nLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCJERUZMQVRFIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCisgKiAgICAgIEF2YWlsYWJsZSBpbiBmdHA6Ly9kcy5pbnRlcm5pYy5uZXQvcmZjL3JmYzE5NTEudHh0CisgKgorICogICAgICBBIGRlc2NyaXB0aW9uIG9mIHRoZSBSYWJpbiBhbmQgS2FycCBhbGdvcml0aG0gaXMgZ2l2ZW4gaW4gdGhlIGJvb2sKKyAqICAgICAgICAgIkFsZ29yaXRobXMiIGJ5IFIuIFNlZGdld2ljaywgQWRkaXNvbi1XZXNsZXksIHAyNTIuCisgKgorICogICAgICBGaWFsYSxFLlIuLCBhbmQgR3JlZW5lLEQuSC4KKyAqICAgICAgICAgRGF0YSBDb21wcmVzc2lvbiB3aXRoIEZpbml0ZSBXaW5kb3dzLCBDb21tLkFDTSwgMzIsNCAoMTk4OSkgNDkwLTU5NQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvenV0aWwuaD4KKyNpbmNsdWRlICJkZWZ1dGlsLmgiCisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiAgRnVuY3Rpb24gcHJvdG90eXBlcy4KKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBuZWVkX21vcmUsICAgICAgLyogYmxvY2sgbm90IGNvbXBsZXRlZCwgbmVlZCBtb3JlIGlucHV0IG9yIG1vcmUgb3V0cHV0ICovCisgICAgYmxvY2tfZG9uZSwgICAgIC8qIGJsb2NrIGZsdXNoIHBlcmZvcm1lZCAqLworICAgIGZpbmlzaF9zdGFydGVkLCAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqLworICAgIGZpbmlzaF9kb25lICAgICAvKiBmaW5pc2ggZG9uZSwgYWNjZXB0IG5vIG1vcmUgaW5wdXQgb3Igb3V0cHV0ICovCit9IGJsb2NrX3N0YXRlOworCit0eXBlZGVmIGJsb2NrX3N0YXRlICgqY29tcHJlc3NfZnVuYykgKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCk7CisvKiBDb21wcmVzc2lvbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgYmxvY2sgc3RhdGUgYWZ0ZXIgdGhlIGNhbGwuICovCisKK3N0YXRpYyB2b2lkIGZpbGxfd2luZG93ICAgIChkZWZsYXRlX3N0YXRlICpzKTsKK3N0YXRpYyBibG9ja19zdGF0ZSBkZWZsYXRlX3N0b3JlZCAoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKTsKK3N0YXRpYyBibG9ja19zdGF0ZSBkZWZsYXRlX2Zhc3QgICAoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKTsKK3N0YXRpYyBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3cgICAoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKTsKK3N0YXRpYyB2b2lkIGxtX2luaXQgICAgICAgIChkZWZsYXRlX3N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIHB1dFNob3J0TVNCICAgIChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpOworc3RhdGljIHZvaWQgZmx1c2hfcGVuZGluZyAgKHpfc3RyZWFtcCBzdHJtKTsKK3N0YXRpYyBpbnQgcmVhZF9idWYgICAgICAgICh6X3N0cmVhbXAgc3RybSwgQnl0ZSAqYnVmLCB1bnNpZ25lZCBzaXplKTsKK3N0YXRpYyB1SW50IGxvbmdlc3RfbWF0Y2ggIChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCk7CisKKyNpZmRlZiBERUJVR19aTElCCitzdGF0aWMgIHZvaWQgY2hlY2tfbWF0Y2ggKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhCisgKi8KKworI2RlZmluZSBOSUwgMAorLyogVGFpbCBvZiBoYXNoIGNoYWlucyAqLworCisjaWZuZGVmIFRPT19GQVIKKyMgIGRlZmluZSBUT09fRkFSIDQwOTYKKyNlbmRpZgorLyogTWF0Y2hlcyBvZiBsZW5ndGggMyBhcmUgZGlzY2FyZGVkIGlmIHRoZWlyIGRpc3RhbmNlIGV4Y2VlZHMgVE9PX0ZBUiAqLworCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgKE1BWF9NQVRDSCtNSU5fTUFUQ0grMSkKKy8qIE1pbmltdW0gYW1vdW50IG9mIGxvb2thaGVhZCwgZXhjZXB0IGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuCisgKiBTZWUgZGVmbGF0ZS5jIGZvciBjb21tZW50cyBhYm91dCB0aGUgTUlOX01BVENIKzEuCisgKi8KKworLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCisgKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG8KKyAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZQorICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLgorICovCit0eXBlZGVmIHN0cnVjdCBjb25maWdfcyB7CisgICB1c2ggZ29vZF9sZW5ndGg7IC8qIHJlZHVjZSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9sYXp5OyAgICAvKiBkbyBub3QgcGVyZm9ybSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG5pY2VfbGVuZ3RoOyAvKiBxdWl0IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLworICAgdXNoIG1heF9jaGFpbjsKKyAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKK30gY29uZmlnOworCitzdGF0aWMgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMTBdID0geworLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqLworLyogMCAqLyB7MCwgICAgMCwgIDAsICAgIDAsIGRlZmxhdGVfc3RvcmVkfSwgIC8qIHN0b3JlIG9ubHkgKi8KKy8qIDEgKi8gezQsICAgIDQsICA4LCAgICA0LCBkZWZsYXRlX2Zhc3R9LCAvKiBtYXhpbXVtIHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KKy8qIDIgKi8gezQsICAgIDUsIDE2LCAgICA4LCBkZWZsYXRlX2Zhc3R9LAorLyogMyAqLyB7NCwgICAgNiwgMzIsICAgMzIsIGRlZmxhdGVfZmFzdH0sCisKKy8qIDQgKi8gezQsICAgIDQsIDE2LCAgIDE2LCBkZWZsYXRlX3Nsb3d9LCAgLyogbGF6eSBtYXRjaGVzICovCisvKiA1ICovIHs4LCAgIDE2LCAzMiwgICAzMiwgZGVmbGF0ZV9zbG93fSwKKy8qIDYgKi8gezgsICAgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3d9LAorLyogNyAqLyB7OCwgICAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvd30sCisvKiA4ICovIHszMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvd30sCisvKiA5ICovIHszMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvd319OyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uICovCisKKy8qIE5vdGU6IHRoZSBkZWZsYXRlKCkgY29kZSByZXF1aXJlcyBtYXhfbGF6eSA+PSBNSU5fTUFUQ0ggYW5kIG1heF9jaGFpbiA+PSA0CisgKiBGb3IgZGVmbGF0ZV9mYXN0KCkgKGxldmVscyA8PSAzKSBnb29kIGlzIGlnbm9yZWQgYW5kIGxhenkgaGFzIGEgZGlmZmVyZW50CisgKiBtZWFuaW5nLgorICovCisKKyNkZWZpbmUgRVFVQUwgMAorLyogcmVzdWx0IG9mIG1lbWNtcCBmb3IgZXF1YWwgc3RyaW5ncyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0gocyxoLGMpIChoID0gKCgoaCk8PHMtPmhhc2hfc2hpZnQpIF4gKGMpKSAmIHMtPmhhc2hfbWFzaykKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluc2VydCBzdHJpbmcgc3RyIGluIHRoZSBkaWN0aW9uYXJ5IGFuZCBzZXQgbWF0Y2hfaGVhZCB0byB0aGUgcHJldmlvdXMgaGVhZAorICogb2YgdGhlIGhhc2ggY2hhaW4gKHRoZSBtb3N0IHJlY2VudCBzdHJpbmcgd2l0aCBzYW1lIGhhc2gga2V5KS4gUmV0dXJuCisgKiB0aGUgcHJldmlvdXMgbGVuZ3RoIG9mIHRoZSBoYXNoIGNoYWluLgorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIElOU0VSVF9TVFJJTkcgYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQorICogICAgaW5wdXQgY2hhcmFjdGVycyBhbmQgdGhlIGZpcnN0IE1JTl9NQVRDSCBieXRlcyBvZiBzdHIgYXJlIHZhbGlkCisgKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuCisgKi8KKyNkZWZpbmUgSU5TRVJUX1NUUklORyhzLCBzdHIsIG1hdGNoX2hlYWQpIFwKKyAgIChVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93WyhzdHIpICsgKE1JTl9NQVRDSC0xKV0pLCBcCisgICAgcy0+cHJldlsoc3RyKSAmIHMtPndfbWFza10gPSBtYXRjaF9oZWFkID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKKyAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0YWJsZSAoYXZvaWRpbmcgNjRLIG92ZXJmbG93IGZvciAxNiBiaXQgc3lzdGVtcykuCisgKiBwcmV2W10gd2lsbCBiZSBpbml0aWFsaXplZCBvbiB0aGUgZmx5LgorICovCisjZGVmaW5lIENMRUFSX0hBU0gocykgXAorICAgIHMtPmhlYWRbcy0+aGFzaF9zaXplLTFdID0gTklMOyBcCisgICAgbWVtc2V0KChjaGFyICopcy0+aGVhZCwgMCwgKHVuc2lnbmVkKShzLT5oYXNoX3NpemUtMSkqc2l6ZW9mKCpzLT5oZWFkKSk7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2ludCB6bGliX2RlZmxhdGVJbml0MigKKwl6X3N0cmVhbXAgc3RybSwKKwlpbnQgIGxldmVsLAorCWludCAgbWV0aG9kLAorCWludCAgd2luZG93Qml0cywKKwlpbnQgIG1lbUxldmVsLAorCWludCAgc3RyYXRlZ3kKKykKK3sKKyAgICBkZWZsYXRlX3N0YXRlICpzOworICAgIGludCBub2hlYWRlciA9IDA7CisgICAgZGVmbGF0ZV93b3Jrc3BhY2UgKm1lbTsKKyAgICBjaGFyICpuZXh0OworCisgICAgdXNoICpvdmVybGF5OworICAgIC8qIFdlIG92ZXJsYXkgcGVuZGluZ19idWYgYW5kIGRfYnVmK2xfYnVmLiBUaGlzIHdvcmtzIHNpbmNlIHRoZSBhdmVyYWdlCisgICAgICogb3V0cHV0IHNpemUgZm9yIChsZW5ndGgsZGlzdGFuY2UpIGNvZGVzIGlzIDw9IDI0IGJpdHMuCisgICAgICovCisKKyAgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisKKyAgICBzdHJtLT5tc2cgPSBOVUxMOworCisgICAgaWYgKGxldmVsID09IFpfREVGQVVMVF9DT01QUkVTU0lPTikgbGV2ZWwgPSA2OworCisgICAgbWVtID0gKGRlZmxhdGVfd29ya3NwYWNlICopIHN0cm0tPndvcmtzcGFjZTsKKworICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiB1bmRvY3VtZW50ZWQgZmVhdHVyZTogc3VwcHJlc3MgemxpYiBoZWFkZXIgKi8KKyAgICAgICAgbm9oZWFkZXIgPSAxOworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisgICAgfQorICAgIGlmIChtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IG1ldGhvZCAhPSBaX0RFRkxBVEVEIHx8CisgICAgICAgIHdpbmRvd0JpdHMgPCA5IHx8IHdpbmRvd0JpdHMgPiAxNSB8fCBsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8CisJc3RyYXRlZ3kgPCAwIHx8IHN0cmF0ZWd5ID4gWl9IVUZGTUFOX09OTFkpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKworICAgIC8qCisgICAgICogRGlyZWN0IHRoZSB3b3Jrc3BhY2UncyBwb2ludGVycyB0byB0aGUgY2h1bmtzIHRoYXQgd2VyZSBhbGxvY2F0ZWQKKyAgICAgKiBhbG9uZyB3aXRoIHRoZSBkZWZsYXRlX3dvcmtzcGFjZSBzdHJ1Y3QuCisgICAgICovCisgICAgbmV4dCA9IChjaGFyICopIG1lbTsKKyAgICBuZXh0ICs9IHNpemVvZigqbWVtKTsKKyAgICBtZW0tPndpbmRvd19tZW1vcnkgPSAoQnl0ZSAqKSBuZXh0OworICAgIG5leHQgKz0gemxpYl9kZWZsYXRlX3dpbmRvd19tZW1zaXplKHdpbmRvd0JpdHMpOworICAgIG1lbS0+cHJldl9tZW1vcnkgPSAoUG9zICopIG5leHQ7CisgICAgbmV4dCArPSB6bGliX2RlZmxhdGVfcHJldl9tZW1zaXplKHdpbmRvd0JpdHMpOworICAgIG1lbS0+aGVhZF9tZW1vcnkgPSAoUG9zICopIG5leHQ7CisgICAgbmV4dCArPSB6bGliX2RlZmxhdGVfaGVhZF9tZW1zaXplKG1lbUxldmVsKTsKKyAgICBtZW0tPm92ZXJsYXlfbWVtb3J5ID0gbmV4dDsKKworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSAmKG1lbS0+ZGVmbGF0ZV9tZW1vcnkpOworICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSAqKXM7CisgICAgcy0+c3RybSA9IHN0cm07CisKKyAgICBzLT5ub2hlYWRlciA9IG5vaGVhZGVyOworICAgIHMtPndfYml0cyA9IHdpbmRvd0JpdHM7CisgICAgcy0+d19zaXplID0gMSA8PCBzLT53X2JpdHM7CisgICAgcy0+d19tYXNrID0gcy0+d19zaXplIC0gMTsKKworICAgIHMtPmhhc2hfYml0cyA9IG1lbUxldmVsICsgNzsKKyAgICBzLT5oYXNoX3NpemUgPSAxIDw8IHMtPmhhc2hfYml0czsKKyAgICBzLT5oYXNoX21hc2sgPSBzLT5oYXNoX3NpemUgLSAxOworICAgIHMtPmhhc2hfc2hpZnQgPSAgKChzLT5oYXNoX2JpdHMrTUlOX01BVENILTEpL01JTl9NQVRDSCk7CisKKyAgICBzLT53aW5kb3cgPSAoQnl0ZSAqKSBtZW0tPndpbmRvd19tZW1vcnk7CisgICAgcy0+cHJldiAgID0gKFBvcyAqKSAgbWVtLT5wcmV2X21lbW9yeTsKKyAgICBzLT5oZWFkICAgPSAoUG9zICopICBtZW0tPmhlYWRfbWVtb3J5OworCisgICAgcy0+bGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqLworCisgICAgb3ZlcmxheSA9ICh1c2ggKikgbWVtLT5vdmVybGF5X21lbW9yeTsKKyAgICBzLT5wZW5kaW5nX2J1ZiA9ICh1Y2ggKikgb3ZlcmxheTsKKyAgICBzLT5wZW5kaW5nX2J1Zl9zaXplID0gKHVsZylzLT5saXRfYnVmc2l6ZSAqIChzaXplb2YodXNoKSsyTCk7CisKKyAgICBzLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKKyAgICBzLT5sX2J1ZiA9IHMtPnBlbmRpbmdfYnVmICsgKDErc2l6ZW9mKHVzaCkpKnMtPmxpdF9idWZzaXplOworCisgICAgcy0+bGV2ZWwgPSBsZXZlbDsKKyAgICBzLT5zdHJhdGVneSA9IHN0cmF0ZWd5OworICAgIHMtPm1ldGhvZCA9IChCeXRlKW1ldGhvZDsKKworICAgIHJldHVybiB6bGliX2RlZmxhdGVSZXNldChzdHJtKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IHpsaWJfZGVmbGF0ZVJlc2V0KAorCXpfc3RyZWFtcCBzdHJtCispCit7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKyAgICAKKyAgICBpZiAoc3RybSA9PSBOVUxMIHx8IHN0cm0tPnN0YXRlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0cm0tPnRvdGFsX2luID0gc3RybS0+dG90YWxfb3V0ID0gMDsKKyAgICBzdHJtLT5tc2cgPSBOVUxMOworICAgIHN0cm0tPmRhdGFfdHlwZSA9IFpfVU5LTk9XTjsKKworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworICAgIHMtPnBlbmRpbmcgPSAwOworICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7CisKKyAgICBpZiAocy0+bm9oZWFkZXIgPCAwKSB7CisgICAgICAgIHMtPm5vaGVhZGVyID0gMDsgLyogd2FzIHNldCB0byAtMSBieSBkZWZsYXRlKC4uLiwgWl9GSU5JU0gpOyAqLworICAgIH0KKyAgICBzLT5zdGF0dXMgPSBzLT5ub2hlYWRlciA/IEJVU1lfU1RBVEUgOiBJTklUX1NUQVRFOworICAgIHN0cm0tPmFkbGVyID0gMTsKKyAgICBzLT5sYXN0X2ZsdXNoID0gWl9OT19GTFVTSDsKKworICAgIHpsaWJfdHJfaW5pdChzKTsKKyAgICBsbV9pbml0KHMpOworCisgICAgcmV0dXJuIFpfT0s7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCisgKiBwZW5kaW5nX2J1Zi4KKyAqLworc3RhdGljIHZvaWQgcHV0U2hvcnRNU0IoCisJZGVmbGF0ZV9zdGF0ZSAqcywKKwl1SW50IGIKKykKK3sKKyAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiA+PiA4KSk7CisgICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgJiAweGZmKSk7Cit9ICAgCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXMKKyAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQKKyAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X291dCBidWZmZXIgYW5kIGNvcHlpbmcgaW50byBpdC4KKyAqIChTZWUgYWxzbyByZWFkX2J1ZigpKS4KKyAqLworc3RhdGljIHZvaWQgZmx1c2hfcGVuZGluZygKKwl6X3N0cmVhbXAgc3RybQorKQoreworICAgIGRlZmxhdGVfc3RhdGUgKnMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBzdHJtLT5zdGF0ZTsKKyAgICB1bnNpZ25lZCBsZW4gPSBzLT5wZW5kaW5nOworCisgICAgaWYgKGxlbiA+IHN0cm0tPmF2YWlsX291dCkgbGVuID0gc3RybS0+YXZhaWxfb3V0OworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOworCisgICAgaWYgKHN0cm0tPm5leHRfb3V0ICE9IE5VTEwpIHsKKwltZW1jcHkoc3RybS0+bmV4dF9vdXQsIHMtPnBlbmRpbmdfb3V0LCBsZW4pOworCXN0cm0tPm5leHRfb3V0ICs9IGxlbjsKKyAgICB9CisgICAgcy0+cGVuZGluZ19vdXQgKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX291dCArPSBsZW47CisgICAgc3RybS0+YXZhaWxfb3V0ICAtPSBsZW47CisgICAgcy0+cGVuZGluZyAtPSBsZW47CisgICAgaWYgKHMtPnBlbmRpbmcgPT0gMCkgeworICAgICAgICBzLT5wZW5kaW5nX291dCA9IHMtPnBlbmRpbmdfYnVmOworICAgIH0KK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IHpsaWJfZGVmbGF0ZSgKKwl6X3N0cmVhbXAgc3RybSwKKwlpbnQgZmx1c2gKKykKK3sKKyAgICBpbnQgb2xkX2ZsdXNoOyAvKiB2YWx1ZSBvZiBmbHVzaCBwYXJhbSBmb3IgcHJldmlvdXMgZGVmbGF0ZSBjYWxsICovCisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IE5VTEwgfHwgc3RybS0+c3RhdGUgPT0gTlVMTCB8fAorCWZsdXNoID4gWl9GSU5JU0ggfHwgZmx1c2ggPCAwKSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgcyA9IChkZWZsYXRlX3N0YXRlICopIHN0cm0tPnN0YXRlOworCisgICAgaWYgKChzdHJtLT5uZXh0X2luID09IE5VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgfHwKKwkocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPSBaX0ZJTklTSCkpIHsKKyAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiBaX0JVRl9FUlJPUjsKKworICAgIHMtPnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi8KKyAgICBvbGRfZmx1c2ggPSBzLT5sYXN0X2ZsdXNoOworICAgIHMtPmxhc3RfZmx1c2ggPSBmbHVzaDsKKworICAgIC8qIFdyaXRlIHRoZSB6bGliIGhlYWRlciAqLworICAgIGlmIChzLT5zdGF0dXMgPT0gSU5JVF9TVEFURSkgeworCisgICAgICAgIHVJbnQgaGVhZGVyID0gKFpfREVGTEFURUQgKyAoKHMtPndfYml0cy04KTw8NCkpIDw8IDg7CisgICAgICAgIHVJbnQgbGV2ZWxfZmxhZ3MgPSAocy0+bGV2ZWwtMSkgPj4gMTsKKworICAgICAgICBpZiAobGV2ZWxfZmxhZ3MgPiAzKSBsZXZlbF9mbGFncyA9IDM7CisgICAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7CisJaWYgKHMtPnN0cnN0YXJ0ICE9IDApIGhlYWRlciB8PSBQUkVTRVRfRElDVDsKKyAgICAgICAgaGVhZGVyICs9IDMxIC0gKGhlYWRlciAlIDMxKTsKKworICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOworICAgICAgICBwdXRTaG9ydE1TQihzLCBoZWFkZXIpOworCisJLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovCisJaWYgKHMtPnN0cnN0YXJ0ICE9IDApIHsKKwkgICAgcHV0U2hvcnRNU0IocywgKHVJbnQpKHN0cm0tPmFkbGVyID4+IDE2KSk7CisJICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworCX0KKwlzdHJtLT5hZGxlciA9IDFMOworICAgIH0KKworICAgIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi8KKyAgICBpZiAocy0+cGVuZGluZyAhPSAwKSB7CisgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgeworCSAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoCisJICAgICAqIG1vcmUgb3V0cHV0IHNwYWNlLCBidXQgcG9zc2libHkgd2l0aCBib3RoIHBlbmRpbmcgYW5kCisJICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLAorCSAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZQorCSAgICAgKiByZXR1cm4gT0sgaW5zdGVhZCBvZiBCVUZfRVJST1IgYXQgbmV4dCBjYWxsIG9mIGRlZmxhdGU6CisgICAgICAgICAgICAgKi8KKwkgICAgcy0+bGFzdF9mbHVzaCA9IC0xOworCSAgICByZXR1cm4gWl9PSzsKKwl9CisKKyAgICAvKiBNYWtlIHN1cmUgdGhlcmUgaXMgc29tZXRoaW5nIHRvIGRvIGFuZCBhdm9pZCBkdXBsaWNhdGUgY29uc2VjdXRpdmUKKyAgICAgKiBmbHVzaGVzLiBGb3IgcmVwZWF0ZWQgYW5kIHVzZWxlc3MgY2FsbHMgd2l0aCBaX0ZJTklTSCwgd2Uga2VlcAorICAgICAqIHJldHVybmluZyBaX1NUUkVBTV9FTkQgaW5zdGVhZCBvZiBaX0JVRkZfRVJST1IuCisgICAgICovCisgICAgfSBlbHNlIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwICYmIGZsdXNoIDw9IG9sZF9mbHVzaCAmJgorCSAgICAgICBmbHVzaCAhPSBaX0ZJTklTSCkgeworICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7CisgICAgfQorCisgICAgLyogVXNlciBtdXN0IG5vdCBwcm92aWRlIG1vcmUgaW5wdXQgYWZ0ZXIgdGhlIGZpcnN0IEZJTklTSDogKi8KKyAgICBpZiAocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBaX0JVRl9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuCisgICAgICovCisgICAgaWYgKHN0cm0tPmF2YWlsX2luICE9IDAgfHwgcy0+bG9va2FoZWFkICE9IDAgfHwKKyAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKKyAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOworCisJYnN0YXRlID0gKCooY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYykpKHMsIGZsdXNoKTsKKworICAgICAgICBpZiAoYnN0YXRlID09IGZpbmlzaF9zdGFydGVkIHx8IGJzdGF0ZSA9PSBmaW5pc2hfZG9uZSkgeworICAgICAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOworICAgICAgICB9CisgICAgICAgIGlmIChic3RhdGUgPT0gbmVlZF9tb3JlIHx8IGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCkgeworCSAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKKwkgICAgICAgIHMtPmxhc3RfZmx1c2ggPSAtMTsgLyogYXZvaWQgQlVGX0VSUk9SIG5leHQgY2FsbCwgc2VlIGFib3ZlICovCisJICAgIH0KKwkgICAgcmV0dXJuIFpfT0s7CisJICAgIC8qIElmIGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgYXZhaWxfb3V0ID09IDAsIHRoZSBuZXh0IGNhbGwKKwkgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmUKKwkgICAgICogdGhhdCB0aGUgZmx1c2ggaXMgY29tcGxldGUuIFNvIHdlIGRvbid0IGhhdmUgdG8gb3V0cHV0IGFuCisJICAgICAqIGVtcHR5IGJsb2NrIGhlcmUsIHRoaXMgd2lsbCBiZSBkb25lIGF0IG5leHQgY2FsbC4gVGhpcyBhbHNvCisJICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdAorCSAgICAgKiBvbmUgZW1wdHkgYmxvY2suCisJICAgICAqLworCX0KKyAgICAgICAgaWYgKGJzdGF0ZSA9PSBibG9ja19kb25lKSB7CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9QQVJUSUFMX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgemxpYl90cl9hbGlnbihzKTsKKwkgICAgfSBlbHNlIGlmIChmbHVzaCA9PSBaX1BBQ0tFVF9GTFVTSCkgeworCQkvKiBPdXRwdXQganVzdCB0aGUgMy1iaXQgYHN0b3JlZCcgYmxvY2sgdHlwZSB2YWx1ZSwKKwkJICAgYnV0IG5vdCBhIHplcm8gbGVuZ3RoLiAqLworCQl6bGliX3RyX3N0b3JlZF90eXBlX29ubHkocyk7CisgICAgICAgICAgICB9IGVsc2UgeyAvKiBGVUxMX0ZMVVNIIG9yIFNZTkNfRkxVU0ggKi8KKyAgICAgICAgICAgICAgICB6bGliX3RyX3N0b3JlZF9ibG9jayhzLCAoY2hhciopMCwgMEwsIDApOworICAgICAgICAgICAgICAgIC8qIEZvciBhIGZ1bGwgZmx1c2gsIHRoaXMgZW1wdHkgYmxvY2sgd2lsbCBiZSByZWNvZ25pemVkCisgICAgICAgICAgICAgICAgICogYXMgYSBzcGVjaWFsIG1hcmtlciBieSBpbmZsYXRlX3N5bmMoKS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9GVUxMX0ZMVVNIKSB7CisgICAgICAgICAgICAgICAgICAgIENMRUFSX0hBU0gocyk7ICAgICAgICAgICAgIC8qIGZvcmdldCBoaXN0b3J5ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKKwkgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7CisJICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KKwkgICAgICByZXR1cm4gWl9PSzsKKwkgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFzc2VydChzdHJtLT5hdmFpbF9vdXQgPiAwLCAiYnVnMiIpOworCisgICAgaWYgKGZsdXNoICE9IFpfRklOSVNIKSByZXR1cm4gWl9PSzsKKyAgICBpZiAocy0+bm9oZWFkZXIpIHJldHVybiBaX1NUUkVBTV9FTkQ7CisKKyAgICAvKiBXcml0ZSB0aGUgemxpYiB0cmFpbGVyIChhZGxlcjMyKSAqLworICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOworICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOworICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7CisgICAgLyogSWYgYXZhaWxfb3V0IGlzIHplcm8sIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGNhbGwgZGVmbGF0ZSBhZ2FpbgorICAgICAqIHRvIGZsdXNoIHRoZSByZXN0LgorICAgICAqLworICAgIHMtPm5vaGVhZGVyID0gLTE7IC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi8KKyAgICByZXR1cm4gcy0+cGVuZGluZyAhPSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworaW50IHpsaWJfZGVmbGF0ZUVuZCgKKwl6X3N0cmVhbXAgc3RybQorKQoreworICAgIGludCBzdGF0dXM7CisgICAgZGVmbGF0ZV9zdGF0ZSAqczsKKworICAgIGlmIChzdHJtID09IE5VTEwgfHwgc3RybS0+c3RhdGUgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHMgPSAoZGVmbGF0ZV9zdGF0ZSAqKSBzdHJtLT5zdGF0ZTsKKworICAgIHN0YXR1cyA9IHMtPnN0YXR1czsKKyAgICBpZiAoc3RhdHVzICE9IElOSVRfU1RBVEUgJiYgc3RhdHVzICE9IEJVU1lfU1RBVEUgJiYKKwlzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSB7CisgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgfQorCisgICAgc3RybS0+c3RhdGUgPSBOVUxMOworCisgICAgcmV0dXJuIHN0YXR1cyA9PSBCVVNZX1NUQVRFID8gWl9EQVRBX0VSUk9SIDogWl9PSzsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyCisgKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaAorICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWQKKyAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X2luIGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LgorICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuCisgKi8KK3N0YXRpYyBpbnQgcmVhZF9idWYoCisJel9zdHJlYW1wIHN0cm0sCisJQnl0ZSAqYnVmLAorCXVuc2lnbmVkIHNpemUKKykKK3sKKyAgICB1bnNpZ25lZCBsZW4gPSBzdHJtLT5hdmFpbF9pbjsKKworICAgIGlmIChsZW4gPiBzaXplKSBsZW4gPSBzaXplOworICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuIDA7CisKKyAgICBzdHJtLT5hdmFpbF9pbiAgLT0gbGVuOworCisgICAgaWYgKCEoKGRlZmxhdGVfc3RhdGUgKikoc3RybS0+c3RhdGUpKS0+bm9oZWFkZXIpIHsKKyAgICAgICAgc3RybS0+YWRsZXIgPSB6bGliX2FkbGVyMzIoc3RybS0+YWRsZXIsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgfQorICAgIG1lbWNweShidWYsIHN0cm0tPm5leHRfaW4sIGxlbik7CisgICAgc3RybS0+bmV4dF9pbiAgKz0gbGVuOworICAgIHN0cm0tPnRvdGFsX2luICs9IGxlbjsKKworICAgIHJldHVybiAoaW50KWxlbjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtCisgKi8KK3N0YXRpYyB2b2lkIGxtX2luaXQoCisJZGVmbGF0ZV9zdGF0ZSAqcworKQoreworICAgIHMtPndpbmRvd19zaXplID0gKHVsZykyTCpzLT53X3NpemU7CisKKyAgICBDTEVBUl9IQVNIKHMpOworCisgICAgLyogU2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczoKKyAgICAgKi8KKyAgICBzLT5tYXhfbGF6eV9tYXRjaCAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubWF4X2xhenk7CisgICAgcy0+Z29vZF9tYXRjaCAgICAgICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLmdvb2RfbGVuZ3RoOworICAgIHMtPm5pY2VfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5uaWNlX2xlbmd0aDsKKyAgICBzLT5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubWF4X2NoYWluOworCisgICAgcy0+c3Ryc3RhcnQgPSAwOworICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7CisgICAgcy0+bG9va2FoZWFkID0gMDsKKyAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7CisgICAgcy0+aW5zX2ggPSAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZAorICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLAorICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpcworICogZ2FyYmFnZS4KKyAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnQKKyAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDEKKyAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuCisgKi8KKy8qIEZvciA4MHg4NiBhbmQgNjgweDAsIGFuIG9wdGltaXplZCB2ZXJzaW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gbWF0Y2guYXNtIG9yCisgKiBtYXRjaC5TLiBUaGUgY29kZSB3aWxsIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LgorICovCitzdGF0aWMgdUludCBsb25nZXN0X21hdGNoKAorCWRlZmxhdGVfc3RhdGUgKnMsCisJSVBvcyBjdXJfbWF0Y2gJCQkvKiBjdXJyZW50IG1hdGNoICovCispCit7CisgICAgdW5zaWduZWQgY2hhaW5fbGVuZ3RoID0gcy0+bWF4X2NoYWluX2xlbmd0aDsvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KKyAgICByZWdpc3RlciBCeXRlICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovCisgICAgcmVnaXN0ZXIgQnl0ZSAqbWF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXRjaGVkIHN0cmluZyAqLworICAgIHJlZ2lzdGVyIGludCBsZW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgbWF0Y2ggKi8KKyAgICBpbnQgYmVzdF9sZW4gPSBzLT5wcmV2X2xlbmd0aDsgICAgICAgICAgICAgIC8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworICAgIGludCBuaWNlX21hdGNoID0gcy0+bmljZV9tYXRjaDsgICAgICAgICAgICAgLyogc3RvcCBpZiBtYXRjaCBsb25nIGVub3VnaCAqLworICAgIElQb3MgbGltaXQgPSBzLT5zdHJzdGFydCA+IChJUG9zKU1BWF9ESVNUKHMpID8KKyAgICAgICAgcy0+c3Ryc3RhcnQgLSAoSVBvcylNQVhfRElTVChzKSA6IE5JTDsKKyAgICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorICAgICAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisgICAgICovCisgICAgUG9zICpwcmV2ID0gcy0+cHJldjsKKyAgICB1SW50IHdtYXNrID0gcy0+d19tYXNrOworCisjaWZkZWYgVU5BTElHTkVEX09LCisgICAgLyogQ29tcGFyZSB0d28gYnl0ZXMgYXQgYSB0aW1lLiBOb3RlOiB0aGlzIGlzIG5vdCBhbHdheXMgYmVuZWZpY2lhbC4KKyAgICAgKiBUcnkgd2l0aCBhbmQgd2l0aG91dCAtRFVOQUxJR05FRF9PSyB0byBjaGVjay4KKyAgICAgKi8KKyAgICByZWdpc3RlciBCeXRlICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSCAtIDE7CisgICAgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaCopc2NhbjsKKyAgICByZWdpc3RlciB1c2ggc2Nhbl9lbmQgICA9ICoodXNoKikoc2NhbitiZXN0X2xlbi0xKTsKKyNlbHNlCisgICAgcmVnaXN0ZXIgQnl0ZSAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7CisgICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKKyAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKKyNlbmRpZgorCisgICAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCisgICAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgIkNvZGUgdG9vIGNsZXZlciIpOworCisgICAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi8KKyAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgeworICAgICAgICBjaGFpbl9sZW5ndGggPj49IDI7CisgICAgfQorICAgIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnkKKyAgICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy4KKyAgICAgKi8KKyAgICBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKKworICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOworCisgICAgZG8geworICAgICAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsKKyAgICAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7CisKKyAgICAgICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlCisgICAgICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6CisgICAgICAgICAqLworI2lmIChkZWZpbmVkKFVOQUxJR05FRF9PSykgJiYgTUFYX01BVENIID09IDI1OCkKKyAgICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSA9PSAyLiBEbyBub3QgdXNlCisgICAgICAgICAqIFVOQUxJR05FRF9PSyBpZiB5b3VyIGNvbXBpbGVyIHVzZXMgYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmICgqKHVzaCopKG1hdGNoK2Jlc3RfbGVuLTEpICE9IHNjYW5fZW5kIHx8CisgICAgICAgICAgICAqKHVzaCopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7CisKKyAgICAgICAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkgYXJlCisgICAgICAgICAqIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdCB0aGUgaGFzaCBrZXlzCisgICAgICAgICAqIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4gQ29tcGFyZSAyIGJ5dGVzIGF0IGEgdGltZSBhdAorICAgICAgICAgKiBzdHJzdGFydCszLCArNSwgLi4uIHVwIHRvIHN0cnN0YXJ0KzI1Ny4gV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudAorICAgICAgICAgKiBsb29rYWhlYWQgb25seSBldmVyeSA0dGggY29tcGFyaXNvbjsgdGhlIDEyOHRoIGNoZWNrIHdpbGwgYmUgbWFkZQorICAgICAgICAgKiBhdCBzdHJzdGFydCsyNTcuIElmIE1BWF9NQVRDSC0yIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgsIGl0IGlzCisgICAgICAgICAqIG5lY2Vzc2FyeSB0byBwdXQgbW9yZSBndWFyZCBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3csIG9yCisgICAgICAgICAqIHRvIGNoZWNrIG1vcmUgb2Z0ZW4gZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQuCisgICAgICAgICAqLworICAgICAgICBBc3NlcnQoc2NhblsyXSA9PSBtYXRjaFsyXSwgInNjYW5bMl0/Iik7CisgICAgICAgIHNjYW4rKywgbWF0Y2grKzsKKyAgICAgICAgZG8geworICAgICAgICB9IHdoaWxlICgqKHVzaCopKHNjYW4rPTIpID09ICoodXNoKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgICoodXNoKikoc2Nhbis9MikgPT0gKih1c2gqKShtYXRjaCs9MikgJiYKKyAgICAgICAgICAgICAgICAgKih1c2gqKShzY2FuKz0yKSA9PSAqKHVzaCopKG1hdGNoKz0yKSAmJgorICAgICAgICAgICAgICAgICAqKHVzaCopKHNjYW4rPTIpID09ICoodXNoKikobWF0Y2grPTIpICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworICAgICAgICAvKiBUaGUgZnVubnkgImRvIHt9IiBnZW5lcmF0ZXMgYmV0dGVyIGNvZGUgb24gbW9zdCBjb21waWxlcnMgKi8KKworICAgICAgICAvKiBIZXJlLCBzY2FuIDw9IHdpbmRvdytzdHJzdGFydCsyNTcgKi8KKyAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICptYXRjaCkgc2NhbisrOworCisgICAgICAgIGxlbiA9IChNQVhfTUFUQ0ggLSAxKSAtIChpbnQpKHN0cmVuZC1zY2FuKTsKKyAgICAgICAgc2NhbiA9IHN0cmVuZCAtIChNQVhfTUFUQ0gtMSk7CisKKyNlbHNlIC8qIFVOQUxJR05FRF9PSyAqLworCisgICAgICAgIGlmIChtYXRjaFtiZXN0X2xlbl0gICAhPSBzY2FuX2VuZCAgfHwKKyAgICAgICAgICAgIG1hdGNoW2Jlc3RfbGVuLTFdICE9IHNjYW5fZW5kMSB8fAorICAgICAgICAgICAgKm1hdGNoICAgICAgICAgICAgIT0gKnNjYW4gICAgIHx8CisgICAgICAgICAgICAqKyttYXRjaCAgICAgICAgICAhPSBzY2FuWzFdKSAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8qIFRoZSBjaGVjayBhdCBiZXN0X2xlbi0xIGNhbiBiZSByZW1vdmVkIGJlY2F1c2UgaXQgd2lsbCBiZSBtYWRlCisgICAgICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pCisgICAgICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5CisgICAgICAgICAqIGFyZSBhbHdheXMgZXF1YWwgd2hlbiB0aGUgb3RoZXIgYnl0ZXMgbWF0Y2gsIGdpdmVuIHRoYXQKKyAgICAgICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguCisgICAgICAgICAqLworICAgICAgICBzY2FuICs9IDIsIG1hdGNoKys7CisgICAgICAgIEFzc2VydCgqc2NhbiA9PSAqbWF0Y2gsICJtYXRjaFsyXT8iKTsKKworICAgICAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOworICAgICAgICAgKiB0aGUgMjU2dGggY2hlY2sgd2lsbCBiZSBtYWRlIGF0IHN0cnN0YXJ0KzI1OC4KKyAgICAgICAgICovCisgICAgICAgIGRvIHsKKyAgICAgICAgfSB3aGlsZSAoKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKyAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisgICAgICAgICAgICAgICAgIHNjYW4gPCBzdHJlbmQpOworCisgICAgICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7CisKKyAgICAgICAgbGVuID0gTUFYX01BVENIIC0gKGludCkoc3RyZW5kIC0gc2Nhbik7CisgICAgICAgIHNjYW4gPSBzdHJlbmQgLSBNQVhfTUFUQ0g7CisKKyNlbmRpZiAvKiBVTkFMSUdORURfT0sgKi8KKworICAgICAgICBpZiAobGVuID4gYmVzdF9sZW4pIHsKKyAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoOworICAgICAgICAgICAgYmVzdF9sZW4gPSBsZW47CisgICAgICAgICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIGJyZWFrOworI2lmZGVmIFVOQUxJR05FRF9PSworICAgICAgICAgICAgc2Nhbl9lbmQgPSAqKHVzaCopKHNjYW4rYmVzdF9sZW4tMSk7CisjZWxzZQorICAgICAgICAgICAgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07CisgICAgICAgICAgICBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAorICAgICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOworCisgICAgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuIGJlc3RfbGVuOworICAgIHJldHVybiBzLT5sb29rYWhlYWQ7Cit9CisKKyNpZmRlZiBERUJVR19aTElCCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENoZWNrIHRoYXQgdGhlIG1hdGNoIGF0IG1hdGNoX3N0YXJ0IGlzIGluZGVlZCBhIG1hdGNoLgorICovCitzdGF0aWMgdm9pZCBjaGVja19tYXRjaCgKKwlkZWZsYXRlX3N0YXRlICpzLAorCUlQb3Mgc3RhcnQsCisJSVBvcyBtYXRjaCwKKwlpbnQgbGVuZ3RoCispCit7CisgICAgLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKyAgICBpZiAobWVtY21wKChjaGFyICopcy0+d2luZG93ICsgbWF0Y2gsCisgICAgICAgICAgICAgICAgKGNoYXIgKilzLT53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSBFUVVBTCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBzdGFydCAldSwgbWF0Y2ggJXUsIGxlbmd0aCAlZFxuIiwKKwkJc3RhcnQsIG1hdGNoLCBsZW5ndGgpOworICAgICAgICBkbyB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiJWMlYyIsIHMtPndpbmRvd1ttYXRjaCsrXSwgcy0+d2luZG93W3N0YXJ0KytdKTsKKwl9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKKyAgICAgICAgel9lcnJvcigiaW52YWxpZCBtYXRjaCIpOworICAgIH0KKyAgICBpZiAoel92ZXJib3NlID4gMSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXFxbJWQsJWRdIiwgc3RhcnQtbWF0Y2gsIGxlbmd0aCk7CisgICAgICAgIGRvIHsgcHV0YyhzLT53aW5kb3dbc3RhcnQrK10sIHN0ZGVycik7IH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOworICAgIH0KK30KKyNlbHNlCisjICBkZWZpbmUgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgorICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLgorICoKKyAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRAorICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQUQKKyAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZQorICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2wKKyAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLgorICovCitzdGF0aWMgdm9pZCBmaWxsX3dpbmRvdygKKwlkZWZsYXRlX3N0YXRlICpzCispCit7CisgICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKKyAgICByZWdpc3RlciBQb3MgKnA7CisgICAgdW5zaWduZWQgbW9yZTsgICAgLyogQW1vdW50IG9mIGZyZWUgc3BhY2UgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93LiAqLworICAgIHVJbnQgd3NpemUgPSBzLT53X3NpemU7CisKKyAgICBkbyB7CisgICAgICAgIG1vcmUgPSAodW5zaWduZWQpKHMtPndpbmRvd19zaXplIC0odWxnKXMtPmxvb2thaGVhZCAtKHVsZylzLT5zdHJzdGFydCk7CisKKyAgICAgICAgLyogRGVhbCB3aXRoICFAIyQlIDY0SyBsaW1pdDogKi8KKyAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7CisgICAgICAgICAgICBtb3JlID0gd3NpemU7CisKKyAgICAgICAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7CisgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYgc3Ryc3RhcnQgPT0gMAorICAgICAgICAgICAgICogYW5kIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIG9uZSBieXRlIGF0IHRpbWUpCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1vcmUtLTsKKworICAgICAgICAvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLAorICAgICAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLgorICAgICAgICAgKi8KKyAgICAgICAgfSBlbHNlIGlmIChzLT5zdHJzdGFydCA+PSB3c2l6ZStNQVhfRElTVChzKSkgeworCisgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKilzLT53aW5kb3csIChjaGFyICopcy0+d2luZG93K3dzaXplLAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCl3c2l6ZSk7CisgICAgICAgICAgICBzLT5tYXRjaF9zdGFydCAtPSB3c2l6ZTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICAgIC09IHdzaXplOyAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqLworICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgLT0gKGxvbmcpIHdzaXplOworCisgICAgICAgICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXMKKyAgICAgICAgICAgICAgIGF0IHRoZSBleHBlbnNlIG9mIG1lbW9yeSB1c2FnZSkuIFdlIHNsaWRlIGV2ZW4gd2hlbiBsZXZlbCA9PSAwCisgICAgICAgICAgICAgICB0byBrZWVwIHRoZSBoYXNoIHRhYmxlIGNvbnNpc3RlbnQgaWYgd2Ugc3dpdGNoIGJhY2sgdG8gbGV2ZWwgPiAwCisgICAgICAgICAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2YKKyAgICAgICAgICAgICAgIHpsaWIsIHNvIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhpcyBwYXRob2xvZ2ljYWwgY2FzZS4pCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG4gPSBzLT5oYXNoX3NpemU7CisgICAgICAgICAgICBwID0gJnMtPmhlYWRbbl07CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbSA9ICotLXA7CisgICAgICAgICAgICAgICAgKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisgICAgICAgICAgICB9IHdoaWxlICgtLW4pOworCisgICAgICAgICAgICBuID0gd3NpemU7CisgICAgICAgICAgICBwID0gJnMtPnByZXZbbl07CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgbSA9ICotLXA7CisgICAgICAgICAgICAgICAgKnAgPSAoUG9zKShtID49IHdzaXplID8gbS13c2l6ZSA6IE5JTCk7CisgICAgICAgICAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXQKKyAgICAgICAgICAgICAgICAgKiBpdHMgdmFsdWUgd2lsbCBuZXZlciBiZSB1c2VkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSB3aGlsZSAoLS1uKTsKKyAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIHJldHVybjsKKworICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gc2xpZGluZzoKKyAgICAgICAgICogICAgc3Ryc3RhcnQgPD0gV1NJWkUrTUFYX0RJU1QtMSAmJiBsb29rYWhlYWQgPD0gTUlOX0xPT0tBSEVBRCAtIDEgJiYKKyAgICAgICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0CisgICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAoTUlOX0xPT0tBSEVBRC0xICsgV1NJWkUgKyBNQVhfRElTVC0xKQorICAgICAgICAgKiA9PiBtb3JlID49IHdpbmRvd19zaXplIC0gMipXU0laRSArIDIKKyAgICAgICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksCisgICAgICAgICAqICAgd2luZG93X3NpemUgPT0gaW5wdXRfc2l6ZSArIE1JTl9MT09LQUhFQUQgICYmCisgICAgICAgICAqICAgc3Ryc3RhcnQgKyBzLT5sb29rYWhlYWQgPD0gaW5wdXRfc2l6ZSA9PiBtb3JlID49IE1JTl9MT09LQUhFQUQuCisgICAgICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuCisgICAgICAgICAqIElmIHRoZXJlIHdhcyBzbGlkaW5nLCBtb3JlID49IFdTSVpFLiBTbyBpbiBhbGwgY2FzZXMsIG1vcmUgPj0gMi4KKyAgICAgICAgICovCisgICAgICAgIEFzc2VydChtb3JlID49IDIsICJtb3JlIDwgMiIpOworCisgICAgICAgIG4gPSByZWFkX2J1ZihzLT5zdHJtLCBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIHMtPmxvb2thaGVhZCwgbW9yZSk7CisgICAgICAgIHMtPmxvb2thaGVhZCArPSBuOworCisgICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdmFsdWUgbm93IHRoYXQgd2UgaGF2ZSBzb21lIGlucHV0OiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgeworICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdOworICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzLT5zdHJzdGFydCsxXSk7CisjaWYgTUlOX01BVENIICE9IDMKKyAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICAvKiBJZiB0aGUgd2hvbGUgaW5wdXQgaGFzIGxlc3MgdGhhbiBNSU5fTUFUQ0ggYnl0ZXMsIGluc19oIGlzIGdhcmJhZ2UsCisgICAgICAgICAqIGJ1dCB0aGlzIGlzIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKyAgICAgICAgICovCisKKyAgICB9IHdoaWxlIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMtPnN0cm0tPmF2YWlsX2luICE9IDApOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCisgKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgorICovCisjZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgZW9mKSB7IFwKKyAgIHpsaWJfdHJfZmx1c2hfYmxvY2socywgKHMtPmJsb2NrX3N0YXJ0ID49IDBMID8gXAorICAgICAgICAgICAgICAgICAgIChjaGFyICopJnMtPndpbmRvd1sodW5zaWduZWQpcy0+YmxvY2tfc3RhcnRdIDogXAorICAgICAgICAgICAgICAgICAgIE5VTEwpLCBcCisJCSh1bGcpKChsb25nKXMtPnN0cnN0YXJ0IC0gcy0+YmxvY2tfc3RhcnQpLCBcCisJCShlb2YpKTsgXAorICAgcy0+YmxvY2tfc3RhcnQgPSBzLT5zdHJzdGFydDsgXAorICAgZmx1c2hfcGVuZGluZyhzLT5zdHJtKTsgXAorICAgVHJhY2V2KChzdGRlcnIsIltGTFVTSF0iKSk7IFwKK30KKworLyogU2FtZSBidXQgZm9yY2UgcHJlbWF0dXJlIGV4aXQgaWYgbmVjZXNzYXJ5LiAqLworI2RlZmluZSBGTFVTSF9CTE9DSyhzLCBlb2YpIHsgXAorICAgRkxVU0hfQkxPQ0tfT05MWShzLCBlb2YpOyBcCisgICBpZiAocy0+c3RybS0+YXZhaWxfb3V0ID09IDApIHJldHVybiAoZW9mKSA/IGZpbmlzaF9zdGFydGVkIDogbmVlZF9tb3JlOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4KKyAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLgorICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2UKKyAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tCisgKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuCisgKi8KK3N0YXRpYyBibG9ja19zdGF0ZSBkZWZsYXRlX3N0b3JlZCgKKwlkZWZsYXRlX3N0YXRlICpzLAorCWludCBmbHVzaAorKQoreworICAgIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkCisgICAgICogdG8gcGVuZGluZ19idWZfc2l6ZSwgYW5kIGVhY2ggc3RvcmVkIGJsb2NrIGhhcyBhIDUgYnl0ZSBoZWFkZXI6CisgICAgICovCisgICAgdWxnIG1heF9ibG9ja19zaXplID0gMHhmZmZmOworICAgIHVsZyBtYXhfc3RhcnQ7CisKKyAgICBpZiAobWF4X2Jsb2NrX3NpemUgPiBzLT5wZW5kaW5nX2J1Zl9zaXplIC0gNSkgeworICAgICAgICBtYXhfYmxvY2tfc2l6ZSA9IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1OworICAgIH0KKworICAgIC8qIENvcHkgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIGlucHV0IHRvIG91dHB1dDogKi8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIEZpbGwgdGhlIHdpbmRvdyBhcyBtdWNoIGFzIHBvc3NpYmxlOiAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDw9IDEpIHsKKworICAgICAgICAgICAgQXNzZXJ0KHMtPnN0cnN0YXJ0IDwgcy0+d19zaXplK01BWF9ESVNUKHMpIHx8CisJCSAgIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgInNsaWRlIHRvbyBsYXRlIik7CisKKyAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOworICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHJldHVybiBuZWVkX21vcmU7CisKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKwlBc3NlcnQocy0+YmxvY2tfc3RhcnQgPj0gMEwsICJibG9jayBnb25lIik7CisKKwlzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7CisJcy0+bG9va2FoZWFkID0gMDsKKworCS8qIEVtaXQgYSBzdG9yZWQgYmxvY2sgaWYgcGVuZGluZ19idWYgd2lsbCBiZSBmdWxsOiAqLworIAltYXhfc3RhcnQgPSBzLT5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplOworICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPT0gMCB8fCAodWxnKXMtPnN0cnN0YXJ0ID49IG1heF9zdGFydCkgeworCSAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLworCSAgICBzLT5sb29rYWhlYWQgPSAodUludCkocy0+c3Ryc3RhcnQgLSBtYXhfc3RhcnQpOworCSAgICBzLT5zdHJzdGFydCA9ICh1SW50KW1heF9zdGFydDsKKyAgICAgICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOworCX0KKwkvKiBGbHVzaCBpZiB3ZSBtYXkgaGF2ZSB0byBzbGlkZSwgb3RoZXJ3aXNlIGJsb2NrX3N0YXJ0IG1heSBiZWNvbWUKKyAgICAgICAgICogbmVnYXRpdmUgYW5kIHRoZSBkYXRhIHdpbGwgYmUgZ29uZToKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5zdHJzdGFydCAtICh1SW50KXMtPmJsb2NrX3N0YXJ0ID49IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICBGTFVTSF9CTE9DSyhzLCAwKTsKKwl9CisgICAgfQorICAgIEZMVVNIX0JMT0NLKHMsIGZsdXNoID09IFpfRklOSVNIKTsKKyAgICByZXR1cm4gZmx1c2ggPT0gWl9GSU5JU0ggPyBmaW5pc2hfZG9uZSA6IGJsb2NrX2RvbmU7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHJlc3MgYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybiB0aGUgY3VycmVudAorICogYmxvY2sgc3RhdGUuCisgKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHBlcmZvcm0gbGF6eSBldmFsdWF0aW9uIG9mIG1hdGNoZXMgYW5kIGluc2VydHMKKyAqIG5ldyBzdHJpbmdzIGluIHRoZSBkaWN0aW9uYXJ5IG9ubHkgZm9yIHVubWF0Y2hlZCBzdHJpbmdzIG9yIGZvciBzaG9ydAorICogbWF0Y2hlcy4gSXQgaXMgdXNlZCBvbmx5IGZvciB0aGUgZmFzdCBjb21wcmVzc2lvbiBvcHRpb25zLgorICovCitzdGF0aWMgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0KAorCWRlZmxhdGVfc3RhdGUgKnMsCisJaW50IGZsdXNoCispCit7CisgICAgSVBvcyBoYXNoX2hlYWQgPSBOSUw7IC8qIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gKi8KKyAgICBpbnQgYmZsdXNoOyAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovCisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQsIGV4Y2VwdAorICAgICAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlcworICAgICAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGUKKyAgICAgICAgICogc3RyaW5nIGZvbGxvd2luZyB0aGUgbmV4dCBtYXRjaC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEKSB7CisgICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09IFpfTk9fRkxVU0gpIHsKKwkgICAgICAgIHJldHVybiBuZWVkX21vcmU7CisJICAgIH0KKyAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCisgICAgICAgIH0KKworICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisgICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorICAgICAgICAgKiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYWx3YXlzIG1hdGNoX2xlbmd0aCA8IE1JTl9NQVRDSAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKKyAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCisgICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKKyAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ICE9IFpfSFVGRk1BTl9PTkxZKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHMtPm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHsKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LCBzLT5tYXRjaF9zdGFydCwgcy0+bWF0Y2hfbGVuZ3RoKTsKKworICAgICAgICAgICAgYmZsdXNoID0gemxpYl90cl90YWxseShzLCBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7CisKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7CisKKyAgICAgICAgICAgIC8qIEluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgaGFzaCB0YWJsZSBvbmx5IGlmIHRoZSBtYXRjaCBsZW5ndGgKKyAgICAgICAgICAgICAqIGlzIG5vdCB0b28gbGFyZ2UuIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gcy0+bWF4X2luc2VydF9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICBzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIGhhc2ggdGFibGUgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICAgICAgICAgIC8qIHN0cnN0YXJ0IG5ldmVyIGV4Y2VlZHMgV1NJWkUtTUFYX01BVENILCBzbyB0aGVyZSBhcmUKKyAgICAgICAgICAgICAgICAgICAgICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5tYXRjaF9sZW5ndGggIT0gMCk7CisgICAgICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsgCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOworICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKKyAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKKyNpZiBNSU5fTUFUQ0ggIT0gMworICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAorICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCisgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOworICAgICAgICAgICAgYmZsdXNoID0gemxpYl90cl90YWxseSAocywgMCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSk7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7IAorICAgICAgICB9CisgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOworICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhbWUgYXMgYWJvdmUsIGJ1dCBhY2hpZXZlcyBiZXR0ZXIgY29tcHJlc3Npb24uIFdlIHVzZSBhIGxhenkKKyAqIGV2YWx1YXRpb24gZm9yIG1hdGNoZXM6IGEgbWF0Y2ggaXMgZmluYWxseSBhZG9wdGVkIG9ubHkgaWYgdGhlcmUgaXMKKyAqIG5vIGJldHRlciBtYXRjaCBhdCB0aGUgbmV4dCB3aW5kb3cgcG9zaXRpb24uCisgKi8KK3N0YXRpYyBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3coCisJZGVmbGF0ZV9zdGF0ZSAqcywKKwlpbnQgZmx1c2gKKykKK3sKKyAgICBJUG9zIGhhc2hfaGVhZCA9IE5JTDsgICAgLyogaGVhZCBvZiBoYXNoIGNoYWluICovCisgICAgaW50IGJmbHVzaDsgICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCisgICAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovCisgICAgZm9yICg7OykgeworICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKyAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKyAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisgICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisgICAgICAgICAqLworICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgeworICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7CisJICAgICAgICByZXR1cm4gbmVlZF9tb3JlOworCSAgICB9CisgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLworICAgICAgICB9CisKKyAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQorICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKKyAgICAgICAgICovCisgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7CisgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICB9CisKKyAgICAgICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIHMtPnByZXZfbGVuZ3RoID0gcy0+bWF0Y2hfbGVuZ3RoLCBzLT5wcmV2X21hdGNoID0gcy0+bWF0Y2hfc3RhcnQ7CisgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworCisgICAgICAgIGlmIChoYXNoX2hlYWQgIT0gTklMICYmIHMtPnByZXZfbGVuZ3RoIDwgcy0+bWF4X2xhenlfbWF0Y2ggJiYKKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IE1BWF9ESVNUKHMpKSB7CisgICAgICAgICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworICAgICAgICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisgICAgICAgICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChzLT5zdHJhdGVneSAhPSBaX0hVRkZNQU5fT05MWSkgeworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2ggKHMsIGhhc2hfaGVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqLworCisgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoIDw9IDUgJiYgKHMtPnN0cmF0ZWd5ID09IFpfRklMVEVSRUQgfHwKKyAgICAgICAgICAgICAgICAgKHMtPm1hdGNoX2xlbmd0aCA9PSBNSU5fTUFUQ0ggJiYKKyAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0IC0gcy0+bWF0Y2hfc3RhcnQgPiBUT09fRkFSKSkpIHsKKworICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKyAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKKyAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOworICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCisKKyAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKKworICAgICAgICAgICAgYmZsdXNoID0gemxpYl90cl90YWxseShzLCBzLT5zdHJzdGFydCAtMSAtIHMtPnByZXZfbWF0Y2gsCisJCQkJICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gpOworCisgICAgICAgICAgICAvKiBJbnNlcnQgaW4gaGFzaCB0YWJsZSBhbGwgc3RyaW5ncyB1cCB0byB0aGUgZW5kIG9mIHRoZSBtYXRjaC4KKyAgICAgICAgICAgICAqIHN0cnN0YXJ0LTEgYW5kIHN0cnN0YXJ0IGFyZSBhbHJlYWR5IGluc2VydGVkLiBJZiB0aGVyZSBpcyBub3QKKyAgICAgICAgICAgICAqIGVub3VnaCBsb29rYWhlYWQsIHRoZSBsYXN0IHR3byBzdHJpbmdzIGFyZSBub3QgaW5zZXJ0ZWQgaW4KKyAgICAgICAgICAgICAqIHRoZSBoYXNoIHRhYmxlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcy0+cHJldl9sZW5ndGgtMTsKKyAgICAgICAgICAgIHMtPnByZXZfbGVuZ3RoIC09IDI7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKCsrcy0+c3Ryc3RhcnQgPD0gbWF4X2luc2VydCkgeworICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+cHJldl9sZW5ndGggIT0gMCk7CisgICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7CisgICAgICAgICAgICBzLT5zdHJzdGFydCsrOworCisgICAgICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKKworICAgICAgICB9IGVsc2UgaWYgKHMtPm1hdGNoX2F2YWlsYWJsZSkgeworICAgICAgICAgICAgLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGEKKyAgICAgICAgICAgICAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2gKKyAgICAgICAgICAgICAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwiJWMiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTsKKyAgICAgICAgICAgIGlmICh6bGliX3RyX3RhbGx5IChzLCAwLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKSB7CisgICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7CisgICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKKyAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKKyAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOworICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKKyAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOworICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKKyAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOworICAgICAgICB6bGliX3RyX3RhbGx5IChzLCAwLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pOworICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAwOworICAgIH0KKyAgICBGTFVTSF9CTE9DSyhzLCBmbHVzaCA9PSBaX0ZJTklTSCk7CisgICAgcmV0dXJuIGZsdXNoID09IFpfRklOSVNIID8gZmluaXNoX2RvbmUgOiBibG9ja19kb25lOworfQorCitpbnQgemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUoaW50IHdpbmRvd0JpdHMsIGludCBtZW1MZXZlbCkKK3sKKyAgICBpZiAod2luZG93Qml0cyA8IDApIC8qIHVuZG9jdW1lbnRlZCBmZWF0dXJlOiBzdXBwcmVzcyB6bGliIGhlYWRlciAqLworICAgICAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7CisKKyAgICAvKiBTaW5jZSB0aGUgcmV0dXJuIHZhbHVlIGlzIHR5cGljYWxseSBwYXNzZWQgdG8gdm1hbGxvYygpIHVuY2hlY2tlZC4uLiAqLworICAgIEJVR19PTihtZW1MZXZlbCA8IDEgfHwgbWVtTGV2ZWwgPiBNQVhfTUVNX0xFVkVMIHx8IHdpbmRvd0JpdHMgPCA5IHx8CisJCQkJCQkJd2luZG93Qml0cyA+IDE1KTsKKworICAgIHJldHVybiBzaXplb2YoZGVmbGF0ZV93b3Jrc3BhY2UpCisgICAgICAgICsgemxpYl9kZWZsYXRlX3dpbmRvd19tZW1zaXplKHdpbmRvd0JpdHMpCisgICAgICAgICsgemxpYl9kZWZsYXRlX3ByZXZfbWVtc2l6ZSh3aW5kb3dCaXRzKQorICAgICAgICArIHpsaWJfZGVmbGF0ZV9oZWFkX21lbXNpemUobWVtTGV2ZWwpCisgICAgICAgICsgemxpYl9kZWZsYXRlX292ZXJsYXlfbWVtc2l6ZShtZW1MZXZlbCk7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2RlZmxhdGUvZGVmbGF0ZV9zeW1zLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2RlZmxhdGUvZGVmbGF0ZV9zeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NmZTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlX3N5bXMuYwpAQCAtMCwwICsxLDE4IEBACisvKgorICogbGludXgvbGliL3psaWJfZGVmbGF0ZS9kZWZsYXRlX3N5bXMuYworICoKKyAqIEV4cG9ydGVkIHN5bWJvbHMgZm9yIHRoZSBkZWZsYXRlIGZ1bmN0aW9uYWxpdHkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKK0VYUE9SVF9TWU1CT0woemxpYl9kZWZsYXRlX3dvcmtzcGFjZXNpemUpOworRVhQT1JUX1NZTUJPTCh6bGliX2RlZmxhdGUpOworRVhQT1JUX1NZTUJPTCh6bGliX2RlZmxhdGVJbml0Mik7CitFWFBPUlRfU1lNQk9MKHpsaWJfZGVmbGF0ZUVuZCk7CitFWFBPUlRfU1lNQk9MKHpsaWJfZGVmbGF0ZVJlc2V0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9kZWZ0cmVlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2RlZmxhdGUvZGVmdHJlZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTc1NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2RlZmxhdGUvZGVmdHJlZS5jCkBAIC0wLDAgKzEsMTExMyBAQAorLyogKysrIHRyZWVzLmMgKi8KKy8qIHRyZWVzLmMgLS0gb3V0cHV0IGRlZmxhdGVkIGRhdGEgdXNpbmcgSHVmZm1hbiBjb2RpbmcKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk2IEplYW4tbG91cCBHYWlsbHkKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmggCisgKi8KKworLyoKKyAqICBBTEdPUklUSE0KKyAqCisgKiAgICAgIFRoZSAiZGVmbGF0aW9uIiBwcm9jZXNzIHVzZXMgc2V2ZXJhbCBIdWZmbWFuIHRyZWVzLiBUaGUgbW9yZQorICogICAgICBjb21tb24gc291cmNlIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYnkgc2hvcnRlciBiaXQgc2VxdWVuY2VzLgorICoKKyAqICAgICAgRWFjaCBjb2RlIHRyZWUgaXMgc3RvcmVkIGluIGEgY29tcHJlc3NlZCBmb3JtIHdoaWNoIGlzIGl0c2VsZgorICogYSBIdWZmbWFuIGVuY29kaW5nIG9mIHRoZSBsZW5ndGhzIG9mIGFsbCB0aGUgY29kZSBzdHJpbmdzIChpbgorICogYXNjZW5kaW5nIG9yZGVyIGJ5IHNvdXJjZSB2YWx1ZXMpLiAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlCisgKiByZWNvbnN0cnVjdGVkIGZyb20gdGhlIGxlbmd0aHMgaW4gdGhlIGluZmxhdGUgcHJvY2VzcywgYXMgZGVzY3JpYmVkCisgKiBpbiB0aGUgZGVmbGF0ZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqICBSRUZFUkVOQ0VTCisgKgorICogICAgICBEZXV0c2NoLCBMLlAuLCInRGVmbGF0ZScgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KKyAqICAgICAgQXZhaWxhYmxlIGluIGZ0cC51dS5uZXQ6L3B1Yi9hcmNoaXZpbmcvemlwL2RvYy9kZWZsYXRlLTEuMS5kb2MKKyAqCisgKiAgICAgIFN0b3JlciwgSmFtZXMgQS4KKyAqICAgICAgICAgIERhdGEgQ29tcHJlc3Npb246ICBNZXRob2RzIGFuZCBUaGVvcnksIHBwLiA0OS01MC4KKyAqICAgICAgICAgIENvbXB1dGVyIFNjaWVuY2UgUHJlc3MsIDE5ODguICBJU0JOIDAtNzE2Ny04MTU2LTUuCisgKgorICogICAgICBTZWRnZXdpY2ssIFIuCisgKiAgICAgICAgICBBbGdvcml0aG1zLCBwMjkwLgorICogICAgICAgICAgQWRkaXNvbi1XZXNsZXksIDE5ODMuIElTQk4gMC0yMDEtMDY2NzItNi4KKyAqLworCisvKiBGcm9tOiB0cmVlcy5jLHYgMS4xMSAxOTk2LzA3LzI0IDEzOjQxOjA2IG1lIEV4cCAkICovCisKKy8qICNpbmNsdWRlICJkZWZsYXRlLmgiICovCisKKyNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdHJldi5oPgorI2luY2x1ZGUgImRlZnV0aWwuaCIKKworI2lmZGVmIERFQlVHX1pMSUIKKyMgIGluY2x1ZGUgPGN0eXBlLmg+CisjZW5kaWYKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdGFudHMKKyAqLworCisjZGVmaW5lIE1BWF9CTF9CSVRTIDcKKy8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi8KKworI2RlZmluZSBFTkRfQkxPQ0sgMjU2CisvKiBlbmQgb2YgYmxvY2sgbGl0ZXJhbCBjb2RlICovCisKKyNkZWZpbmUgUkVQXzNfNiAgICAgIDE2CisvKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKKyNkZWZpbmUgUkVQWl8zXzEwICAgIDE3CisvKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworI2RlZmluZSBSRVBaXzExXzEzOCAgMTgKKy8qIHJlcGVhdCBhIHplcm8gbGVuZ3RoIDExLTEzOCB0aW1lcyAgKDcgYml0cyBvZiByZXBlYXQgY291bnQpICovCisKK3N0YXRpYyBjb25zdCBpbnQgZXh0cmFfbGJpdHNbTEVOR1RIX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCisgICA9IHswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDB9OworCitzdGF0aWMgY29uc3QgaW50IGV4dHJhX2RiaXRzW0RfQ09ERVNdIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworICAgPSB7MCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM307CisKK3N0YXRpYyBjb25zdCBpbnQgZXh0cmFfYmxiaXRzW0JMX0NPREVTXS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggYml0IGxlbmd0aCBjb2RlICovCisgICA9IHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDIsMyw3fTsKKworc3RhdGljIGNvbnN0IHVjaCBibF9vcmRlcltCTF9DT0RFU10KKyAgID0gezE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTV9OworLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZworICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuCisgKi8KKworI2RlZmluZSBCdWZfc2l6ZSAoOCAqIDIqc2l6ZW9mKGNoYXIpKQorLyogTnVtYmVyIG9mIGJpdHMgdXNlZCB3aXRoaW4gYmlfYnVmLiAoYmlfYnVmIG1pZ2h0IGJlIGltcGxlbWVudGVkIG9uCisgKiBtb3JlIHRoYW4gMTYgYml0cyBvbiBzb21lIHN5c3RlbXMuKQorICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS4KKyAqLworCitzdGF0aWMgY3RfZGF0YSBzdGF0aWNfbHRyZWVbTF9DT0RFUysyXTsKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIHpsaWJfdHJfaW5pdAorICogYmVsb3cpLgorICovCisKK3N0YXRpYyBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXTsKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKworc3RhdGljIHVjaCBkaXN0X2NvZGVbNTEyXTsKKy8qIGRpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXMKKyAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2YKKyAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLgorICovCisKK3N0YXRpYyB1Y2ggbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXTsKKy8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi8KKworc3RhdGljIGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdOworLyogRmlyc3Qgbm9ybWFsaXplZCBsZW5ndGggZm9yIGVhY2ggY29kZSAoMCA9IE1JTl9NQVRDSCkgKi8KKworc3RhdGljIGludCBiYXNlX2Rpc3RbRF9DT0RFU107CisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCitzdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHsKKyAgICBjb25zdCBjdF9kYXRhICpzdGF0aWNfdHJlZTsgIC8qIHN0YXRpYyB0cmVlIG9yIE5VTEwgKi8KKyAgICBjb25zdCBpbnQgKmV4dHJhX2JpdHM7ICAgICAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisgICAgaW50ICAgICBleHRyYV9iYXNlOyAgICAgICAgICAvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisgICAgaW50ICAgICBlbGVtczsgICAgICAgICAgICAgICAvKiBtYXggbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0cmVlICovCisgICAgaW50ICAgICBtYXhfbGVuZ3RoOyAgICAgICAgICAvKiBtYXggYml0IGxlbmd0aCBmb3IgdGhlIGNvZGVzICovCit9OworCitzdGF0aWMgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2xfZGVzYyA9Cit7c3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMrMSwgTF9DT0RFUywgTUFYX0JJVFN9OworCitzdGF0aWMgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2RfZGVzYyA9Cit7c3RhdGljX2R0cmVlLCBleHRyYV9kYml0cywgMCwgICAgICAgICAgRF9DT0RFUywgTUFYX0JJVFN9OworCitzdGF0aWMgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2JsX2Rlc2MgPQoreyhjb25zdCBjdF9kYXRhICopMCwgZXh0cmFfYmxiaXRzLCAwLCAgIEJMX0NPREVTLCBNQVhfQkxfQklUU307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogTG9jYWwgKHN0YXRpYykgcm91dGluZXMgaW4gdGhpcyBmaWxlLgorICovCisKK3N0YXRpYyB2b2lkIHRyX3N0YXRpY19pbml0ICh2b2lkKTsKK3N0YXRpYyB2b2lkIGluaXRfYmxvY2sgICAgIChkZWZsYXRlX3N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIHBxZG93bmhlYXAgICAgIChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgayk7CitzdGF0aWMgdm9pZCBnZW5fYml0bGVuICAgICAoZGVmbGF0ZV9zdGF0ZSAqcywgdHJlZV9kZXNjICpkZXNjKTsKK3N0YXRpYyB2b2lkIGdlbl9jb2RlcyAgICAgIChjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUsIHVzaCAqYmxfY291bnQpOworc3RhdGljIHZvaWQgYnVpbGRfdHJlZSAgICAgKGRlZmxhdGVfc3RhdGUgKnMsIHRyZWVfZGVzYyAqZGVzYyk7CitzdGF0aWMgdm9pZCBzY2FuX3RyZWUgICAgICAoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKTsKK3N0YXRpYyB2b2lkIHNlbmRfdHJlZSAgICAgIChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUpOworc3RhdGljIGludCAgYnVpbGRfYmxfdHJlZSAgKGRlZmxhdGVfc3RhdGUgKnMpOworc3RhdGljIHZvaWQgc2VuZF9hbGxfdHJlZXMgKGRlZmxhdGVfc3RhdGUgKnMsIGludCBsY29kZXMsIGludCBkY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxjb2Rlcyk7CitzdGF0aWMgdm9pZCBjb21wcmVzc19ibG9jayAoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdF9kYXRhICpkdHJlZSk7CitzdGF0aWMgdm9pZCBzZXRfZGF0YV90eXBlICAoZGVmbGF0ZV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBiaV93aW5kdXAgICAgICAoZGVmbGF0ZV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBiaV9mbHVzaCAgICAgICAoZGVmbGF0ZV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBjb3B5X2Jsb2NrICAgICAoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyKTsKKworI2lmbmRlZiBERUJVR19aTElCCisjICBkZWZpbmUgc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKQorICAgLyogU2VuZCBhIGNvZGUgb2YgdGhlIGdpdmVuIHRyZWUuIGMgYW5kIHRyZWUgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KKworI2Vsc2UgLyogREVCVUdfWkxJQiAqLworIyAgZGVmaW5lIHNlbmRfY29kZShzLCBjLCB0cmVlKSBcCisgICAgIHsgaWYgKHpfdmVyYm9zZT4yKSBmcHJpbnRmKHN0ZGVyciwiXG5jZCAlM2QgIiwoYykpOyBcCisgICAgICAgc2VuZF9iaXRzKHMsIHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyB9CisjZW5kaWYKKworI2RlZmluZSBkX2NvZGUoZGlzdCkgXAorICAgKChkaXN0KSA8IDI1NiA/IGRpc3RfY29kZVtkaXN0XSA6IGRpc3RfY29kZVsyNTYrKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gZGlzdF9jb2RlWzI1Nl0gYW5kIGRpc3RfY29kZVsyNTddIGFyZSBuZXZlcgorICogdXNlZC4KKyAqLworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCisgKi8KKyNpZmRlZiBERUJVR19aTElCCitzdGF0aWMgdm9pZCBzZW5kX2JpdHMgICAgICAoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKTsKKworc3RhdGljIHZvaWQgc2VuZF9iaXRzKAorCWRlZmxhdGVfc3RhdGUgKnMsCisJaW50IHZhbHVlLCAgLyogdmFsdWUgdG8gc2VuZCAqLworCWludCBsZW5ndGggIC8qIG51bWJlciBvZiBiaXRzICovCispCit7CisgICAgVHJhY2V2digoc3RkZXJyLCIgbCAlMmQgdiAlNHggIiwgbGVuZ3RoLCB2YWx1ZSkpOworICAgIEFzc2VydChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxNSwgImludmFsaWQgbGVuZ3RoIik7CisgICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuZ3RoOworCisgICAgLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKKyAgICAgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCisgICAgICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCisgICAgICovCisgICAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbmd0aCkgeworICAgICAgICBzLT5iaV9idWYgfD0gKHZhbHVlIDw8IHMtPmJpX3ZhbGlkKTsKKyAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7CisgICAgICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpOworICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBzLT5iaV9idWYgfD0gdmFsdWUgPDwgcy0+YmlfdmFsaWQ7CisgICAgICAgIHMtPmJpX3ZhbGlkICs9IGxlbmd0aDsKKyAgICB9Cit9CisjZWxzZSAvKiAhREVCVUdfWkxJQiAqLworCisjZGVmaW5lIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSBcCit7IGludCBsZW4gPSBsZW5ndGg7XAorICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuKSB7XAorICAgIGludCB2YWwgPSB2YWx1ZTtcCisgICAgcy0+YmlfYnVmIHw9ICh2YWwgPDwgcy0+YmlfdmFsaWQpO1wKKyAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTtcCisgICAgcy0+YmlfYnVmID0gKHVzaCl2YWwgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW4gLSBCdWZfc2l6ZTtcCisgIH0gZWxzZSB7XAorICAgIHMtPmJpX2J1ZiB8PSAodmFsdWUpIDw8IHMtPmJpX3ZhbGlkO1wKKyAgICBzLT5iaV92YWxpZCArPSBsZW47XAorICB9XAorfQorI2VuZGlmIC8qIERFQlVHX1pMSUIgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzICdjb25zdGFudCcgdGFibGVzLiBJbiBhIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50LAorICogdGhpcyBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGJ5IHR3byB0aHJlYWRzIGNvbmN1cnJlbnRseSwgYnV0IHRoaXMgaXMKKyAqIGhhcm1sZXNzIHNpbmNlIGJvdGggaW52b2NhdGlvbnMgZG8gZXhhY3RseSB0aGUgc2FtZSB0aGluZy4KKyAqLworc3RhdGljIHZvaWQgdHJfc3RhdGljX2luaXQodm9pZCkKK3sKKyAgICBzdGF0aWMgaW50IHN0YXRpY19pbml0X2RvbmU7CisgICAgaW50IG47ICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovCisgICAgaW50IGxlbmd0aDsgICAvKiBsZW5ndGggdmFsdWUgKi8KKyAgICBpbnQgY29kZTsgICAgIC8qIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovCisgICAgdXNoIGJsX2NvdW50W01BWF9CSVRTKzFdOworICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggZm9yIGFuIG9wdGltYWwgdHJlZSAqLworCisgICAgaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KKyAgICBsZW5ndGggPSAwOworICAgIGZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMtMTsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoOworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2xiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBsZW5ndGhfY29kZVtsZW5ndGgrK10gPSAodWNoKWNvZGU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXNzZXJ0IChsZW5ndGggPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKKyAgICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAorICAgICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCisgICAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgorICAgICAqLworICAgIGxlbmd0aF9jb2RlW2xlbmd0aC0xXSA9ICh1Y2gpY29kZTsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworICAgIGRpc3QgPSAwOworICAgIGZvciAoY29kZSA9IDAgOyBjb2RlIDwgMTY7IGNvZGUrKykgeworICAgICAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0OworICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PGV4dHJhX2RiaXRzW2NvZGVdKTsgbisrKSB7CisgICAgICAgICAgICBkaXN0X2NvZGVbZGlzdCsrXSA9ICh1Y2gpY29kZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBc3NlcnQgKGRpc3QgPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGRpc3QgIT0gMjU2Iik7CisgICAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovCisgICAgZm9yICggOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7CisgICAgICAgIGJhc2VfZGlzdFtjb2RlXSA9IGRpc3QgPDwgNzsKKyAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDwoZXh0cmFfZGJpdHNbY29kZV0tNykpOyBuKyspIHsKKyAgICAgICAgICAgIGRpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gKHVjaCljb2RlOworICAgICAgICB9CisgICAgfQorICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyIik7CisKKyAgICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovCisgICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBibF9jb3VudFtiaXRzXSA9IDA7CisgICAgbiA9IDA7CisgICAgd2hpbGUgKG4gPD0gMTQzKSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIHdoaWxlIChuIDw9IDI1NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKKyAgICB3aGlsZSAobiA8PSAyNzkpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDcsIGJsX2NvdW50WzddKys7CisgICAgd2hpbGUgKG4gPD0gMjg3KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOworICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZQorICAgICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQorICAgICAqIGFsbCBvbmVzKQorICAgICAqLworICAgIGdlbl9jb2RlcygoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgTF9DT0RFUysxLCBibF9jb3VudCk7CisKKyAgICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7CisgICAgICAgIHN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OworICAgICAgICBzdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpdHJldjMyKCh1MzIpbikgPj4gKDMyIC0gNSk7CisgICAgfQorICAgIHN0YXRpY19pbml0X2RvbmUgPSAxOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS4KKyAqLwordm9pZCB6bGliX3RyX2luaXQoCisJZGVmbGF0ZV9zdGF0ZSAqcworKQoreworICAgIHRyX3N0YXRpY19pbml0KCk7CisKKyAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOworCisgICAgcy0+bF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2x0cmVlOworICAgIHMtPmxfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2xfZGVzYzsKKworICAgIHMtPmRfZGVzYy5keW5fdHJlZSA9IHMtPmR5bl9kdHJlZTsKKyAgICBzLT5kX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19kX2Rlc2M7CisKKyAgICBzLT5ibF9kZXNjLmR5bl90cmVlID0gcy0+YmxfdHJlZTsKKyAgICBzLT5ibF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfYmxfZGVzYzsKKworICAgIHMtPmJpX2J1ZiA9IDA7CisgICAgcy0+YmlfdmFsaWQgPSAwOworICAgIHMtPmxhc3RfZW9iX2xlbiA9IDg7IC8qIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUgKi8KKyNpZmRlZiBERUJVR19aTElCCisgICAgcy0+Yml0c19zZW50ID0gMEw7CisjZW5kaWYKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBmaXJzdCBmaWxlOiAqLworICAgIGluaXRfYmxvY2socyk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogSW5pdGlhbGl6ZSBhIG5ldyBibG9jay4KKyAqLworc3RhdGljIHZvaWQgaW5pdF9ibG9jaygKKwlkZWZsYXRlX3N0YXRlICpzCispCit7CisgICAgaW50IG47IC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCisgICAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovCisgICAgZm9yIChuID0gMDsgbiA8IExfQ09ERVM7ICBuKyspIHMtPmR5bl9sdHJlZVtuXS5GcmVxID0gMDsKKyAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgIG4rKykgcy0+ZHluX2R0cmVlW25dLkZyZXEgPSAwOworICAgIGZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKSBzLT5ibF90cmVlW25dLkZyZXEgPSAwOworCisgICAgcy0+ZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisgICAgcy0+b3B0X2xlbiA9IHMtPnN0YXRpY19sZW4gPSAwTDsKKyAgICBzLT5sYXN0X2xpdCA9IHMtPm1hdGNoZXMgPSAwOworfQorCisjZGVmaW5lIFNNQUxMRVNUIDEKKy8qIEluZGV4IHdpdGhpbiB0aGUgaGVhcCBhcnJheSBvZiBsZWFzdCBmcmVxdWVudCBub2RlIGluIHRoZSBIdWZmbWFuIHRyZWUgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlbW92ZSB0aGUgc21hbGxlc3QgZWxlbWVudCBmcm9tIHRoZSBoZWFwIGFuZCByZWNyZWF0ZSB0aGUgaGVhcCB3aXRoCisgKiBvbmUgbGVzcyBlbGVtZW50LiBVcGRhdGVzIGhlYXAgYW5kIGhlYXBfbGVuLgorICovCisjZGVmaW5lIHBxcmVtb3ZlKHMsIHRyZWUsIHRvcCkgXAore1wKKyAgICB0b3AgPSBzLT5oZWFwW1NNQUxMRVNUXTsgXAorICAgIHMtPmhlYXBbU01BTExFU1RdID0gcy0+aGVhcFtzLT5oZWFwX2xlbi0tXTsgXAorICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGFyZXMgdG8gc3VidHJlZXMsIHVzaW5nIHRoZSB0cmVlIGRlcHRoIGFzIHRpZSBicmVha2VyIHdoZW4KKyAqIHRoZSBzdWJ0cmVlcyBoYXZlIGVxdWFsIGZyZXF1ZW5jeS4gVGhpcyBtaW5pbWl6ZXMgdGhlIHdvcnN0IGNhc2UgbGVuZ3RoLgorICovCisjZGVmaW5lIHNtYWxsZXIodHJlZSwgbiwgbSwgZGVwdGgpIFwKKyAgICh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgfHwgXAorICAgKHRyZWVbbl0uRnJlcSA9PSB0cmVlW21dLkZyZXEgJiYgZGVwdGhbbl0gPD0gZGVwdGhbbV0pKQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworc3RhdGljIHZvaWQgcHFkb3duaGVhcCgKKwlkZWZsYXRlX3N0YXRlICpzLAorCWN0X2RhdGEgKnRyZWUsICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCisJaW50IGsJCS8qIG5vZGUgdG8gbW92ZSBkb3duICovCispCit7CisgICAgaW50IHYgPSBzLT5oZWFwW2tdOworICAgIGludCBqID0gayA8PCAxOyAgLyogbGVmdCBzb24gb2YgayAqLworICAgIHdoaWxlIChqIDw9IHMtPmhlYXBfbGVuKSB7CisgICAgICAgIC8qIFNldCBqIHRvIHRoZSBzbWFsbGVzdCBvZiB0aGUgdHdvIHNvbnM6ICovCisgICAgICAgIGlmIChqIDwgcy0+aGVhcF9sZW4gJiYKKyAgICAgICAgICAgIHNtYWxsZXIodHJlZSwgcy0+aGVhcFtqKzFdLCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgICAgICAvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworICAgICAgICBpZiAoc21hbGxlcih0cmVlLCB2LCBzLT5oZWFwW2pdLCBzLT5kZXB0aCkpIGJyZWFrOworCisgICAgICAgIC8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisgICAgICAgIHMtPmhlYXBba10gPSBzLT5oZWFwW2pdOyAgayA9IGo7CisKKyAgICAgICAgLyogQW5kIGNvbnRpbnVlIGRvd24gdGhlIHRyZWUsIHNldHRpbmcgaiB0byB0aGUgbGVmdCBzb24gb2YgayAqLworICAgICAgICBqIDw8PSAxOworICAgIH0KKyAgICBzLT5oZWFwW2tdID0gdjsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzIGZvciBhIHRyZWUgYW5kIHVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aAorICogZm9yIHRoZSBjdXJyZW50IGJsb2NrLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIGZyZXEgYW5kIGRhZCBhcmUgc2V0LCBoZWFwW2hlYXBfbWF4XSBhbmQKKyAqICAgIGFib3ZlIGFyZSB0aGUgdHJlZSBub2RlcyBzb3J0ZWQgYnkgaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkIGxlbiBpcyBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aCwgdGhlCisgKiAgICAgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGZyZXF1ZW5jaWVzIGZvciBlYWNoIGJpdCBsZW5ndGguCisgKiAgICAgVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzCisgKiAgICAgbm90IG51bGwuCisgKi8KK3N0YXRpYyB2b2lkIGdlbl9iaXRsZW4oCisJZGVmbGF0ZV9zdGF0ZSAqcywKKwl0cmVlX2Rlc2MgKmRlc2MgICAgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLworKQoreworICAgIGN0X2RhdGEgKnRyZWUgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7CisgICAgaW50IG1heF9jb2RlICAgICAgICAgPSBkZXNjLT5tYXhfY29kZTsKKyAgICBjb25zdCBjdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRfZGVzYy0+c3RhdGljX3RyZWU7CisgICAgY29uc3QgaW50ICpleHRyYSAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmV4dHJhX2JpdHM7CisgICAgaW50IGJhc2UgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmV4dHJhX2Jhc2U7CisgICAgaW50IG1heF9sZW5ndGggICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPm1heF9sZW5ndGg7CisgICAgaW50IGg7ICAgICAgICAgICAgICAvKiBoZWFwIGluZGV4ICovCisgICAgaW50IG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgIC8qIGJpdCBsZW5ndGggKi8KKyAgICBpbnQgeGJpdHM7ICAgICAgICAgIC8qIGV4dHJhIGJpdHMgKi8KKyAgICB1c2ggZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqLworICAgIGludCBvdmVyZmxvdyA9IDA7ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KKworICAgIGZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgcy0+YmxfY291bnRbYml0c10gPSAwOworCisgICAgLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXkKKyAgICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KKyAgICAgKi8KKyAgICB0cmVlW3MtPmhlYXBbcy0+aGVhcF9tYXhdXS5MZW4gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovCisKKyAgICBmb3IgKGggPSBzLT5oZWFwX21heCsxOyBoIDwgSEVBUF9TSVpFOyBoKyspIHsKKyAgICAgICAgbiA9IHMtPmhlYXBbaF07CisgICAgICAgIGJpdHMgPSB0cmVlW3RyZWVbbl0uRGFkXS5MZW4gKyAxOworICAgICAgICBpZiAoYml0cyA+IG1heF9sZW5ndGgpIGJpdHMgPSBtYXhfbGVuZ3RoLCBvdmVyZmxvdysrOworICAgICAgICB0cmVlW25dLkxlbiA9ICh1c2gpYml0czsKKyAgICAgICAgLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKworICAgICAgICBpZiAobiA+IG1heF9jb2RlKSBjb250aW51ZTsgLyogbm90IGEgbGVhZiBub2RlICovCisKKyAgICAgICAgcy0+YmxfY291bnRbYml0c10rKzsKKyAgICAgICAgeGJpdHMgPSAwOworICAgICAgICBpZiAobiA+PSBiYXNlKSB4Yml0cyA9IGV4dHJhW24tYmFzZV07CisgICAgICAgIGYgPSB0cmVlW25dLkZyZXE7CisgICAgICAgIHMtPm9wdF9sZW4gKz0gKHVsZylmICogKGJpdHMgKyB4Yml0cyk7CisgICAgICAgIGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiArPSAodWxnKWYgKiAoc3RyZWVbbl0uTGVuICsgeGJpdHMpOworICAgIH0KKyAgICBpZiAob3ZlcmZsb3cgPT0gMCkgcmV0dXJuOworCisgICAgVHJhY2UoKHN0ZGVyciwiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7CisgICAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KKworICAgIC8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovCisgICAgZG8geworICAgICAgICBiaXRzID0gbWF4X2xlbmd0aC0xOworICAgICAgICB3aGlsZSAocy0+YmxfY291bnRbYml0c10gPT0gMCkgYml0cy0tOworICAgICAgICBzLT5ibF9jb3VudFtiaXRzXS0tOyAgICAgIC8qIG1vdmUgb25lIGxlYWYgZG93biB0aGUgdHJlZSAqLworICAgICAgICBzLT5ibF9jb3VudFtiaXRzKzFdICs9IDI7IC8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KKyAgICAgICAgcy0+YmxfY291bnRbbWF4X2xlbmd0aF0tLTsKKyAgICAgICAgLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKKyAgICAgICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdCisgICAgICAgICAqLworICAgICAgICBvdmVyZmxvdyAtPSAyOworICAgIH0gd2hpbGUgKG92ZXJmbG93ID4gMCk7CisKKyAgICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCisgICAgICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAorICAgICAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuCisgICAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCisgICAgICovCisgICAgZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKKyAgICAgICAgbiA9IHMtPmJsX2NvdW50W2JpdHNdOworICAgICAgICB3aGlsZSAobiAhPSAwKSB7CisgICAgICAgICAgICBtID0gcy0+aGVhcFstLWhdOworICAgICAgICAgICAgaWYgKG0gPiBtYXhfY29kZSkgY29udGludWU7CisgICAgICAgICAgICBpZiAodHJlZVttXS5MZW4gIT0gKHVuc2lnbmVkKSBiaXRzKSB7CisgICAgICAgICAgICAgICAgVHJhY2UoKHN0ZGVyciwiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKyAgICAgICAgICAgICAgICBzLT5vcHRfbGVuICs9ICgobG9uZyliaXRzIC0gKGxvbmcpdHJlZVttXS5MZW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxvbmcpdHJlZVttXS5GcmVxOworICAgICAgICAgICAgICAgIHRyZWVbbV0uTGVuID0gKHVzaCliaXRzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbi0tOworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEdlbmVyYXRlIHRoZSBjb2RlcyBmb3IgYSBnaXZlbiB0cmVlIGFuZCBiaXQgY291bnRzICh3aGljaCBuZWVkIG5vdCBiZQorICogb3B0aW1hbCkuCisgKiBJTiBhc3NlcnRpb246IHRoZSBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgYml0IGxlbmd0aCBzdGF0aXN0aWNzIGZvcgorICogdGhlIGdpdmVuIHRyZWUgYW5kIHRoZSBmaWVsZCBsZW4gaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb246IHRoZSBmaWVsZCBjb2RlIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMgb2Ygbm9uCisgKiAgICAgemVybyBjb2RlIGxlbmd0aC4KKyAqLworc3RhdGljIHZvaWQgZ2VuX2NvZGVzKAorCWN0X2RhdGEgKnRyZWUsICAgICAgICAgICAgIC8qIHRoZSB0cmVlIHRvIGRlY29yYXRlICovCisJaW50IG1heF9jb2RlLCAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisJdXNoICpibF9jb3VudCAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovCispCit7CisgICAgdXNoIG5leHRfY29kZVtNQVhfQklUUysxXTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKyAgICB1c2ggY29kZSA9IDA7ICAgICAgICAgICAgICAvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKyAgICBpbnQgYml0czsgICAgICAgICAgICAgICAgICAvKiBiaXQgaW5kZXggKi8KKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovCisKKyAgICAvKiBUaGUgZGlzdHJpYnV0aW9uIGNvdW50cyBhcmUgZmlyc3QgdXNlZCB0byBnZW5lcmF0ZSB0aGUgY29kZSB2YWx1ZXMKKyAgICAgKiB3aXRob3V0IGJpdCByZXZlcnNhbC4KKyAgICAgKi8KKyAgICBmb3IgKGJpdHMgPSAxOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHsKKyAgICAgICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cy0xXSkgPDwgMTsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorICAgICAqIG11c3QgYmUgYWxsIG9uZXMuCisgICAgICovCisgICAgQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLAorICAgICAgICAgICAgImluY29uc2lzdGVudCBiaXQgY291bnRzIik7CisgICAgVHJhY2V2KChzdGRlcnIsIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisgICAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBpbnQgbGVuID0gdHJlZVtuXS5MZW47CisgICAgICAgIGlmIChsZW4gPT0gMCkgY29udGludWU7CisgICAgICAgIC8qIE5vdyByZXZlcnNlIHRoZSBiaXRzICovCisgICAgICAgIHRyZWVbbl0uQ29kZSA9IGJpdHJldjMyKCh1MzIpKG5leHRfY29kZVtsZW5dKyspKSA+PiAoMzIgLSBsZW4pOworCisgICAgICAgIFRyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLAorICAgICAgICAgICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgorICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KKyAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKKyAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcworICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KKyAqLworc3RhdGljIHZvaWQgYnVpbGRfdHJlZSgKKwlkZWZsYXRlX3N0YXRlICpzLAorCXRyZWVfZGVzYyAqZGVzYwkgLyogdGhlIHRyZWUgZGVzY3JpcHRvciAqLworKQoreworICAgIGN0X2RhdGEgKnRyZWUgICAgICAgICA9IGRlc2MtPmR5bl90cmVlOworICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlICA9IGRlc2MtPnN0YXRfZGVzYy0+c3RhdGljX3RyZWU7CisgICAgaW50IGVsZW1zICAgICAgICAgICAgID0gZGVzYy0+c3RhdF9kZXNjLT5lbGVtczsKKyAgICBpbnQgbiwgbTsgICAgICAgICAgLyogaXRlcmF0ZSBvdmVyIGhlYXAgZWxlbWVudHMgKi8KKyAgICBpbnQgbWF4X2NvZGUgPSAtMTsgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgaW50IG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi8KKworICAgIC8qIENvbnN0cnVjdCB0aGUgaW5pdGlhbCBoZWFwLCB3aXRoIGxlYXN0IGZyZXF1ZW50IGVsZW1lbnQgaW4KKyAgICAgKiBoZWFwW1NNQUxMRVNUXS4gVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4KKyAgICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqLworICAgIHMtPmhlYXBfbGVuID0gMCwgcy0+aGVhcF9tYXggPSBIRUFQX1NJWkU7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgZWxlbXM7IG4rKykgeworICAgICAgICBpZiAodHJlZVtuXS5GcmVxICE9IDApIHsKKyAgICAgICAgICAgIHMtPmhlYXBbKysocy0+aGVhcF9sZW4pXSA9IG1heF9jb2RlID0gbjsKKyAgICAgICAgICAgIHMtPmRlcHRoW25dID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyZWVbbl0uTGVuID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsCisgICAgICogYW5kIHRoYXQgYXQgbGVhc3Qgb25lIGJpdCBzaG91bGQgYmUgc2VudCBldmVuIGlmIHRoZXJlIGlzIG9ubHkgb25lCisgICAgICogcG9zc2libGUgY29kZS4gU28gdG8gYXZvaWQgc3BlY2lhbCBjaGVja3MgbGF0ZXIgb24gd2UgZm9yY2UgYXQgbGVhc3QKKyAgICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LgorICAgICAqLworICAgIHdoaWxlIChzLT5oZWFwX2xlbiA8IDIpIHsKKyAgICAgICAgbm9kZSA9IHMtPmhlYXBbKysocy0+aGVhcF9sZW4pXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7CisgICAgICAgIHRyZWVbbm9kZV0uRnJlcSA9IDE7CisgICAgICAgIHMtPmRlcHRoW25vZGVdID0gMDsKKyAgICAgICAgcy0+b3B0X2xlbi0tOyBpZiAoc3RyZWUpIHMtPnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZV0uTGVuOworICAgICAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi8KKyAgICB9CisgICAgZGVzYy0+bWF4X2NvZGUgPSBtYXhfY29kZTsKKworICAgIC8qIFRoZSBlbGVtZW50cyBoZWFwW2hlYXBfbGVuLzIrMSAuLiBoZWFwX2xlbl0gYXJlIGxlYXZlcyBvZiB0aGUgdHJlZSwKKyAgICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczoKKyAgICAgKi8KKyAgICBmb3IgKG4gPSBzLT5oZWFwX2xlbi8yOyBuID49IDE7IG4tLSkgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsKKworICAgIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d28KKyAgICAgKiBmcmVxdWVudCBub2Rlcy4KKyAgICAgKi8KKyAgICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi8KKyAgICBkbyB7CisgICAgICAgIHBxcmVtb3ZlKHMsIHRyZWUsIG4pOyAgLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovCisgICAgICAgIG0gPSBzLT5oZWFwW1NNQUxMRVNUXTsgLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi8KKworICAgICAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBuOyAvKiBrZWVwIHRoZSBub2RlcyBzb3J0ZWQgYnkgZnJlcXVlbmN5ICovCisgICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG07CisKKyAgICAgICAgLyogQ3JlYXRlIGEgbmV3IG5vZGUgZmF0aGVyIG9mIG4gYW5kIG0gKi8KKyAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gdHJlZVtuXS5GcmVxICsgdHJlZVttXS5GcmVxOworICAgICAgICBzLT5kZXB0aFtub2RlXSA9ICh1Y2gpIChtYXgocy0+ZGVwdGhbbl0sIHMtPmRlcHRoW21dKSArIDEpOworICAgICAgICB0cmVlW25dLkRhZCA9IHRyZWVbbV0uRGFkID0gKHVzaClub2RlOworI2lmZGVmIERVTVBfQkxfVFJFRQorICAgICAgICBpZiAodHJlZSA9PSBzLT5ibF90cmVlKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXG5ub2RlICVkKCVkKSwgc29ucyAlZCglZCkgJWQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgbm9kZSwgdHJlZVtub2RlXS5GcmVxLCBuLCB0cmVlW25dLkZyZXEsIG0sIHRyZWVbbV0uRnJlcSk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqLworICAgICAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IG5vZGUrKzsKKyAgICAgICAgcHFkb3duaGVhcChzLCB0cmVlLCBTTUFMTEVTVCk7CisKKyAgICB9IHdoaWxlIChzLT5oZWFwX2xlbiA+PSAyKTsKKworICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IHMtPmhlYXBbU01BTExFU1RdOworCisgICAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vdworICAgICAqIGdlbmVyYXRlIHRoZSBiaXQgbGVuZ3Rocy4KKyAgICAgKi8KKyAgICBnZW5fYml0bGVuKHMsICh0cmVlX2Rlc2MgKilkZXNjKTsKKworICAgIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi8KKyAgICBnZW5fY29kZXMgKChjdF9kYXRhICopdHJlZSwgbWF4X2NvZGUsIHMtPmJsX2NvdW50KTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzCisgKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLgorICovCitzdGF0aWMgdm9pZCBzY2FuX3RyZWUoCisJZGVmbGF0ZV9zdGF0ZSAqcywKKwljdF9kYXRhICp0cmVlLCAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKwlpbnQgbWF4X2NvZGUgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworKQoreworICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKyAgICBpbnQgcHJldmxlbiA9IC0xOyAgICAgICAgICAvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisgICAgaW50IGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqLworICAgIGludCBuZXh0bGVuID0gdHJlZVswXS5MZW47IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi8KKyAgICBpbnQgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworICAgIGludCBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi8KKyAgICBpbnQgbWluX2NvdW50ID0gNDsgICAgICAgICAvKiBtaW4gcmVwZWF0IGNvdW50ICovCisKKyAgICBpZiAobmV4dGxlbiA9PSAwKSBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgdHJlZVttYXhfY29kZSsxXS5MZW4gPSAodXNoKTB4ZmZmZjsgLyogZ3VhcmQgKi8KKworICAgIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykgeworICAgICAgICBjdXJsZW4gPSBuZXh0bGVuOyBuZXh0bGVuID0gdHJlZVtuKzFdLkxlbjsKKyAgICAgICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSArPSBjb3VudDsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSBzLT5ibF90cmVlW2N1cmxlbl0uRnJlcSsrOworICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBfM182XS5GcmVxKys7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQWl8zXzEwXS5GcmVxKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfMTFfMTM4XS5GcmVxKys7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW4KKyAqIGJsX3RyZWUuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfdHJlZSgKKwlkZWZsYXRlX3N0YXRlICpzLAorCWN0X2RhdGEgKnRyZWUsIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi8KKwlpbnQgbWF4X2NvZGUgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KKykKK3sKKyAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCisgICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLworICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisgICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KKyAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCisgICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLworCisgICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCisgICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworCisgICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisgICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOworICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKKyAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7CisKKyAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7CisgICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOworCisgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7CisgICAgICAgIH0KKyAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOworICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKyAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OworICAgICAgICB9CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KKyAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgorICovCitzdGF0aWMgaW50IGJ1aWxkX2JsX3RyZWUoCisJZGVmbGF0ZV9zdGF0ZSAqcworKQoreworICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KKworICAgIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKyAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIHMtPmxfZGVzYy5tYXhfY29kZSk7CisgICAgc2Nhbl90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlLCBzLT5kX2Rlc2MubWF4X2NvZGUpOworCisgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi8KKyAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5ibF9kZXNjKSkpOworICAgIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHQKKyAgICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLgorICAgICAqLworCisgICAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0CisgICAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXMKKyAgICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pCisgICAgICovCisgICAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTLTE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHsKKyAgICAgICAgaWYgKHMtPmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdXS5MZW4gIT0gMCkgYnJlYWs7CisgICAgfQorICAgIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovCisgICAgcy0+b3B0X2xlbiArPSAzKihtYXhfYmxpbmRleCsxKSArIDUrNSs0OworICAgIFRyYWNldigoc3RkZXJyLCAiXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkIiwKKyAgICAgICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTsKKworICAgIHJldHVybiBtYXhfYmxpbmRleDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKKyAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLgorICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LgorICovCitzdGF0aWMgdm9pZCBzZW5kX2FsbF90cmVlcygKKwlkZWZsYXRlX3N0YXRlICpzLAorCWludCBsY29kZXMsICAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqLworCWludCBkY29kZXMsICAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqLworCWludCBibGNvZGVzICAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqLworKQoreworICAgIGludCByYW5rOyAgICAgICAgICAgICAgICAgICAgLyogaW5kZXggaW4gYmxfb3JkZXIgKi8KKworICAgIEFzc2VydCAobGNvZGVzID49IDI1NyAmJiBkY29kZXMgPj0gMSAmJiBibGNvZGVzID49IDQsICJub3QgZW5vdWdoIGNvZGVzIik7CisgICAgQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLAorICAgICAgICAgICAgInRvbyBtYW55IGNvZGVzIik7CisgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIGNvdW50czogIikpOworICAgIHNlbmRfYml0cyhzLCBsY29kZXMtMjU3LCA1KTsgLyogbm90ICsyNTUgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCisgICAgc2VuZF9iaXRzKHMsIGRjb2Rlcy0xLCAgIDUpOworICAgIHNlbmRfYml0cyhzLCBibGNvZGVzLTQsICA0KTsgLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworICAgIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHsKKyAgICAgICAgVHJhY2V2KChzdGRlcnIsICJcbmJsIGNvZGUgJTJkICIsIGJsX29yZGVyW3JhbmtdKSk7CisgICAgICAgIHNlbmRfYml0cyhzLCBzLT5ibF90cmVlW2JsX29yZGVyW3JhbmtdXS5MZW4sIDMpOworICAgIH0KKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKKworICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgbGNvZGVzLTEpOyAvKiBsaXRlcmFsIHRyZWUgKi8KKyAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7CisKKyAgICBzZW5kX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUsIGRjb2Rlcy0xKTsgLyogZGlzdGFuY2UgdHJlZSAqLworICAgIFRyYWNldigoc3RkZXJyLCAiXG5kaXN0IHRyZWU6IHNlbnQgJWxkIiwgcy0+Yml0c19zZW50KSk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCBhIHN0b3JlZCBibG9jaworICovCit2b2lkIHpsaWJfdHJfc3RvcmVkX2Jsb2NrKAorCWRlZmxhdGVfc3RhdGUgKnMsCisJY2hhciAqYnVmLCAgICAgICAgLyogaW5wdXQgYmxvY2sgKi8KKwl1bGcgc3RvcmVkX2xlbiwgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKwlpbnQgZW9mICAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworKQoreworICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLPDwxKStlb2YsIDMpOyAgLyogc2VuZCBibG9jayB0eXBlICovCisgICAgcy0+Y29tcHJlc3NlZF9sZW4gPSAocy0+Y29tcHJlc3NlZF9sZW4gKyAzICsgNykgJiAodWxnKX43TDsKKyAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAoc3RvcmVkX2xlbiArIDQpIDw8IDM7CisKKyAgICBjb3B5X2Jsb2NrKHMsIGJ1ZiwgKHVuc2lnbmVkKXN0b3JlZF9sZW4sIDEpOyAvKiB3aXRoIGhlYWRlciAqLworfQorCisvKiBTZW5kIGp1c3QgdGhlIGBzdG9yZWQgYmxvY2snIHR5cGUgY29kZSB3aXRob3V0IGFueSBsZW5ndGggYnl0ZXMgb3IgZGF0YS4KKyAqLwordm9pZCB6bGliX3RyX3N0b3JlZF90eXBlX29ubHkoCisJZGVmbGF0ZV9zdGF0ZSAqcworKQoreworICAgIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpLCAzKTsKKyAgICBiaV93aW5kdXAocyk7CisgICAgcy0+Y29tcHJlc3NlZF9sZW4gPSAocy0+Y29tcHJlc3NlZF9sZW4gKyAzKSAmIH43TDsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgb25lIGVtcHR5IHN0YXRpYyBibG9jayB0byBnaXZlIGVub3VnaCBsb29rYWhlYWQgZm9yIGluZmxhdGUuCisgKiBUaGlzIHRha2VzIDEwIGJpdHMsIG9mIHdoaWNoIDcgbWF5IHJlbWFpbiBpbiB0aGUgYml0IGJ1ZmZlci4KKyAqIFRoZSBjdXJyZW50IGluZmxhdGUgY29kZSByZXF1aXJlcyA5IGJpdHMgb2YgbG9va2FoZWFkLiBJZiB0aGUKKyAqIGxhc3QgdHdvIGNvZGVzIGZvciB0aGUgcHJldmlvdXMgYmxvY2sgKHJlYWwgY29kZSBwbHVzIEVPQikgd2VyZSBjb2RlZAorICogb24gNSBiaXRzIG9yIGxlc3MsIGluZmxhdGUgbWF5IGhhdmUgb25seSA1KzMgYml0cyBvZiBsb29rYWhlYWQgdG8gZGVjb2RlCisgKiB0aGUgbGFzdCByZWFsIGNvZGUuIEluIHRoaXMgY2FzZSB3ZSBzZW5kIHR3byBlbXB0eSBzdGF0aWMgYmxvY2tzIGluc3RlYWQKKyAqIG9mIG9uZS4gKFRoZXJlIGFyZSBubyBwcm9ibGVtcyBpZiB0aGUgcHJldmlvdXMgYmxvY2sgaXMgc3RvcmVkIG9yIGZpeGVkLikKKyAqIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBhc3N1bWUgdGhlIHdvcnN0IGNhc2Ugb2YgbGFzdCByZWFsIGNvZGUgZW5jb2RlZAorICogb24gb25lIGJpdCBvbmx5LgorICovCit2b2lkIHpsaWJfdHJfYWxpZ24oCisJZGVmbGF0ZV9zdGF0ZSAqcworKQoreworICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOworICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIHN0YXRpY19sdHJlZSk7CisgICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOyAvKiAzIGZvciBibG9jayB0eXBlLCA3IGZvciBFT0IgKi8KKyAgICBiaV9mbHVzaChzKTsKKyAgICAvKiBPZiB0aGUgMTAgYml0cyBmb3IgdGhlIGVtcHR5IGJsb2NrLCB3ZSBoYXZlIGFscmVhZHkgc2VudAorICAgICAqICgxMCAtIGJpX3ZhbGlkKSBiaXRzLiBUaGUgbG9va2FoZWFkIGZvciB0aGUgbGFzdCByZWFsIGNvZGUgKGJlZm9yZQorICAgICAqIHRoZSBFT0Igb2YgdGhlIHByZXZpb3VzIGJsb2NrKSB3YXMgdGh1cyBhdCBsZWFzdCBvbmUgcGx1cyB0aGUgbGVuZ3RoCisgICAgICogb2YgdGhlIEVPQiBwbHVzIHdoYXQgd2UgaGF2ZSBqdXN0IHNlbnQgb2YgdGhlIGVtcHR5IHN0YXRpYyBibG9jay4KKyAgICAgKi8KKyAgICBpZiAoMSArIHMtPmxhc3RfZW9iX2xlbiArIDEwIC0gcy0+YmlfdmFsaWQgPCA5KSB7CisgICAgICAgIHNlbmRfYml0cyhzLCBTVEFUSUNfVFJFRVM8PDEsIDMpOworICAgICAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAxMEw7CisgICAgICAgIGJpX2ZsdXNoKHMpOworICAgIH0KKyAgICBzLT5sYXN0X2VvYl9sZW4gPSA3OworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYworICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLiBUaGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIHRoZSB0b3RhbCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGhlIGZpbGUgc28gZmFyLgorICovCit1bGcgemxpYl90cl9mbHVzaF9ibG9jaygKKwlkZWZsYXRlX3N0YXRlICpzLAorCWNoYXIgKmJ1ZiwgICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi8KKwl1bGcgc3RvcmVkX2xlbiwgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KKwlpbnQgZW9mICAgICAgICAgICAvKiB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2sgZm9yIGEgZmlsZSAqLworKQoreworICAgIHVsZyBvcHRfbGVuYiwgc3RhdGljX2xlbmI7IC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi8KKyAgICBpbnQgbWF4X2JsaW5kZXggPSAwOyAgLyogaW5kZXggb2YgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgb2Ygbm9uIHplcm8gZnJlcSAqLworCisgICAgLyogQnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgdW5sZXNzIGEgc3RvcmVkIGJsb2NrIGlzIGZvcmNlZCAqLworICAgIGlmIChzLT5sZXZlbCA+IDApIHsKKworCSAvKiBDaGVjayBpZiB0aGUgZmlsZSBpcyBhc2NpaSBvciBiaW5hcnkgKi8KKwlpZiAocy0+ZGF0YV90eXBlID09IFpfVU5LTk9XTikgc2V0X2RhdGFfdHlwZShzKTsKKworCS8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KKwlidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5sX2Rlc2MpKSk7CisJVHJhY2V2KChzdGRlcnIsICJcbmxpdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisJCXMtPnN0YXRpY19sZW4pKTsKKworCWJ1aWxkX3RyZWUocywgKHRyZWVfZGVzYyAqKSgmKHMtPmRfZGVzYykpKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCisJCXMtPnN0YXRpY19sZW4pKTsKKwkvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKwkgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLgorCSAqLworCisJLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKwkgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKwkgKi8KKwltYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7CisKKwkvKiBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcuIENvbXB1dGUgZmlyc3QgdGhlIGJsb2NrIGxlbmd0aCBpbiBieXRlcyovCisJb3B0X2xlbmIgPSAocy0+b3B0X2xlbiszKzcpPj4zOworCXN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKKworCVRyYWNldigoc3RkZXJyLCAiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSAiLAorCQlvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisJCXMtPmxhc3RfbGl0KSk7CisKKwlpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKKwlvcHRfbGVuYiA9IHN0YXRpY19sZW5iID0gc3RvcmVkX2xlbiArIDU7IC8qIGZvcmNlIGEgc3RvcmVkIGJsb2NrICovCisgICAgfQorCisgICAgLyogSWYgY29tcHJlc3Npb24gZmFpbGVkIGFuZCB0aGlzIGlzIHRoZSBmaXJzdCBhbmQgbGFzdCBibG9jaywKKyAgICAgKiBhbmQgaWYgdGhlIC56aXAgZmlsZSBjYW4gYmUgc2Vla2VkICh0byByZXdyaXRlIHRoZSBsb2NhbCBoZWFkZXIpLAorICAgICAqIHRoZSB3aG9sZSBmaWxlIGlzIHRyYW5zZm9ybWVkIGludG8gYSBzdG9yZWQgZmlsZToKKyAgICAgKi8KKyNpZmRlZiBTVE9SRURfRklMRV9PSworIyAgaWZkZWYgRk9SQ0VfU1RPUkVEX0ZJTEUKKyAgICBpZiAoZW9mICYmIHMtPmNvbXByZXNzZWRfbGVuID09IDBMKSB7IC8qIGZvcmNlIHN0b3JlZCBmaWxlICovCisjICBlbHNlCisgICAgaWYgKHN0b3JlZF9sZW4gPD0gb3B0X2xlbmIgJiYgZW9mICYmIHMtPmNvbXByZXNzZWRfbGVuPT0wTCAmJiBzZWVrYWJsZSgpKSB7CisjICBlbmRpZgorICAgICAgICAvKiBTaW5jZSBMSVRfQlVGU0laRSA8PSAyKldTSVpFLCB0aGUgaW5wdXQgZGF0YSBtdXN0IGJlIHRoZXJlOiAqLworICAgICAgICBpZiAoYnVmID09IChjaGFyKikwKSBlcnJvciAoImJsb2NrIHZhbmlzaGVkIik7CisKKyAgICAgICAgY29weV9ibG9jayhzLCBidWYsICh1bnNpZ25lZClzdG9yZWRfbGVuLCAwKTsgLyogd2l0aG91dCBoZWFkZXIgKi8KKyAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4gPSBzdG9yZWRfbGVuIDw8IDM7CisgICAgICAgIHMtPm1ldGhvZCA9IFNUT1JFRDsKKyAgICB9IGVsc2UKKyNlbmRpZiAvKiBTVE9SRURfRklMRV9PSyAqLworCisjaWZkZWYgRk9SQ0VfU1RPUkVECisgICAgaWYgKGJ1ZiAhPSAoY2hhciopMCkgeyAvKiBmb3JjZSBzdG9yZWQgYmxvY2sgKi8KKyNlbHNlCisgICAgaWYgKHN0b3JlZF9sZW4rNCA8PSBvcHRfbGVuYiAmJiBidWYgIT0gKGNoYXIqKTApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgLyogNDogdHdvIHdvcmRzIGZvciB0aGUgbGVuZ3RocyAqLworI2VuZGlmCisgICAgICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuCisgICAgICAgICAqIE90aGVyd2lzZSB3ZSBjYW4ndCBoYXZlIHByb2Nlc3NlZCBtb3JlIHRoYW4gV1NJWkUgaW5wdXQgYnl0ZXMgc2luY2UKKyAgICAgICAgICogdGhlIGxhc3QgYmxvY2sgZmx1c2gsIGJlY2F1c2UgY29tcHJlc3Npb24gd291bGQgaGF2ZSBiZWVuCisgICAgICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0bworICAgICAgICAgKiB0cmFuc2Zvcm0gYSBibG9jayBpbnRvIGEgc3RvcmVkIGJsb2NrLgorICAgICAgICAgKi8KKyAgICAgICAgemxpYl90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBlb2YpOworCisjaWZkZWYgRk9SQ0VfU1RBVElDCisgICAgfSBlbHNlIGlmIChzdGF0aWNfbGVuYiA+PSAwKSB7IC8qIGZvcmNlIHN0YXRpYyB0cmVlcyAqLworI2Vsc2UKKyAgICB9IGVsc2UgaWYgKHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7CisjZW5kaWYKKyAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2VvZiwgMyk7CisgICAgICAgIGNvbXByZXNzX2Jsb2NrKHMsIChjdF9kYXRhICopc3RhdGljX2x0cmVlLCAoY3RfZGF0YSAqKXN0YXRpY19kdHJlZSk7CisgICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5zdGF0aWNfbGVuOworICAgIH0gZWxzZSB7CisgICAgICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTPDwxKStlb2YsIDMpOworICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLT5sX2Rlc2MubWF4X2NvZGUrMSwgcy0+ZF9kZXNjLm1heF9jb2RlKzEsCisgICAgICAgICAgICAgICAgICAgICAgIG1heF9ibGluZGV4KzEpOworICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwgKGN0X2RhdGEgKilzLT5keW5fZHRyZWUpOworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSAzICsgcy0+b3B0X2xlbjsKKyAgICB9CisgICAgQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsICJiYWQgY29tcHJlc3NlZCBzaXplIik7CisgICAgaW5pdF9ibG9jayhzKTsKKworICAgIGlmIChlb2YpIHsKKyAgICAgICAgYmlfd2luZHVwKHMpOworICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworICAgIH0KKyAgICBUcmFjZXYoKHN0ZGVyciwiXG5jb21wcmxlbiAlbHUoJWx1KSAiLCBzLT5jb21wcmVzc2VkX2xlbj4+MywKKyAgICAgICAgICAgcy0+Y29tcHJlc3NlZF9sZW4tNyplb2YpKTsKKworICAgIHJldHVybiBzLT5jb21wcmVzc2VkX2xlbiA+PiAzOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLiBSZXR1cm4gdHJ1ZSBpZgorICogdGhlIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkLgorICovCitpbnQgemxpYl90cl90YWxseSgKKwlkZWZsYXRlX3N0YXRlICpzLAorCXVuc2lnbmVkIGRpc3QsICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLworCXVuc2lnbmVkIGxjICAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLworKQoreworICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKKyAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7CisgICAgaWYgKGRpc3QgPT0gMCkgeworICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KKyAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcy0+bWF0Y2hlcysrOworICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLworICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgorICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgorICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiemxpYl90cl90YWxseTogYmFkIG1hdGNoIik7CisKKyAgICAgICAgcy0+ZHluX2x0cmVlW2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7CisgICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKKyAgICB9CisKKyAgICAvKiBUcnkgdG8gZ3Vlc3MgaWYgaXQgaXMgcHJvZml0YWJsZSB0byBzdG9wIHRoZSBjdXJyZW50IGJsb2NrIGhlcmUgKi8KKyAgICBpZiAoKHMtPmxhc3RfbGl0ICYgMHhmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7CisgICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLworICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7CisgICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKKyAgICAgICAgaW50IGRjb2RlOworICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7CisgICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKKyAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKKyAgICAgICAgfQorICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOworICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKKyAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCisgICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOworICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsKKyAgICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEsKKyAgICAgKiBvbiAxNiBiaXQgbWFjaGluZXMgYW5kIGJlY2F1c2Ugc3RvcmVkIGJsb2NrcyBhcmUgcmVzdHJpY3RlZCB0bworICAgICAqIDY0Sy0xIGJ5dGVzLgorICAgICAqLworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgdGhlIGJsb2NrIGRhdGEgY29tcHJlc3NlZCB1c2luZyB0aGUgZ2l2ZW4gSHVmZm1hbiB0cmVlcworICovCitzdGF0aWMgdm9pZCBjb21wcmVzc19ibG9jaygKKwlkZWZsYXRlX3N0YXRlICpzLAorCWN0X2RhdGEgKmx0cmVlLCAvKiBsaXRlcmFsIHRyZWUgKi8KKwljdF9kYXRhICpkdHJlZSAgLyogZGlzdGFuY2UgdHJlZSAqLworKQoreworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgLyogZGlzdGFuY2Ugb2YgbWF0Y2hlZCBzdHJpbmcgKi8KKyAgICBpbnQgbGM7ICAgICAgICAgICAgIC8qIG1hdGNoIGxlbmd0aCBvciB1bm1hdGNoZWQgY2hhciAoaWYgZGlzdCA9PSAwKSAqLworICAgIHVuc2lnbmVkIGx4ID0gMDsgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworICAgIHVuc2lnbmVkIGNvZGU7ICAgICAgLyogdGhlIGNvZGUgdG8gc2VuZCAqLworICAgIGludCBleHRyYTsgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgdG8gc2VuZCAqLworCisgICAgaWYgKHMtPmxhc3RfbGl0ICE9IDApIGRvIHsKKyAgICAgICAgZGlzdCA9IHMtPmRfYnVmW2x4XTsKKyAgICAgICAgbGMgPSBzLT5sX2J1ZltseCsrXTsKKyAgICAgICAgaWYgKGRpc3QgPT0gMCkgeworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGxjLCBsdHJlZSk7IC8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi8KKyAgICAgICAgICAgIFRyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsIiAnJWMnICIsIGxjKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCisgICAgICAgICAgICBjb2RlID0gbGVuZ3RoX2NvZGVbbGNdOworICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGNvZGUrTElURVJBTFMrMSwgbHRyZWUpOyAvKiBzZW5kIHRoZSBsZW5ndGggY29kZSAqLworICAgICAgICAgICAgZXh0cmEgPSBleHRyYV9sYml0c1tjb2RlXTsKKyAgICAgICAgICAgIGlmIChleHRyYSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGMgLT0gYmFzZV9sZW5ndGhbY29kZV07CisgICAgICAgICAgICAgICAgc2VuZF9iaXRzKHMsIGxjLCBleHRyYSk7ICAgICAgIC8qIHNlbmQgdGhlIGV4dHJhIGxlbmd0aCBiaXRzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBkaXN0LS07IC8qIGRpc3QgaXMgbm93IHRoZSBtYXRjaCBkaXN0YW5jZSAtIDEgKi8KKyAgICAgICAgICAgIGNvZGUgPSBkX2NvZGUoZGlzdCk7CisgICAgICAgICAgICBBc3NlcnQgKGNvZGUgPCBEX0NPREVTLCAiYmFkIGRfY29kZSIpOworCisgICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhX2RiaXRzW2NvZGVdOworICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKKyAgICAgICAgICAgICAgICBkaXN0IC09IGJhc2VfZGlzdFtjb2RlXTsKKyAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgZGlzdCwgZXh0cmEpOyAgIC8qIHNlbmQgdGhlIGV4dHJhIGRpc3RhbmNlIGJpdHMgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBsaXRlcmFsIG9yIG1hdGNoIHBhaXIgPyAqLworCisgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovCisgICAgICAgIEFzc2VydChzLT5wZW5kaW5nIDwgcy0+bGl0X2J1ZnNpemUgKyAyKmx4LCAicGVuZGluZ0J1ZiBvdmVyZmxvdyIpOworCisgICAgfSB3aGlsZSAobHggPCBzLT5sYXN0X2xpdCk7CisKKyAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBsdHJlZSk7CisgICAgcy0+bGFzdF9lb2JfbGVuID0gbHRyZWVbRU5EX0JMT0NLXS5MZW47Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IHRoZSBkYXRhIHR5cGUgdG8gQVNDSUkgb3IgQklOQVJZLCB1c2luZyBhIGNydWRlIGFwcHJveGltYXRpb246CisgKiBiaW5hcnkgaWYgbW9yZSB0aGFuIDIwJSBvZiB0aGUgYnl0ZXMgYXJlIDw9IDYgb3IgPj0gMTI4LCBhc2NpaSBvdGhlcndpc2UuCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBvZiBkeW5fbHRyZWUgYXJlIHNldCBhbmQgdGhlIHRvdGFsIG9mIGFsbAorICogZnJlcXVlbmNpZXMgZG9lcyBub3QgZXhjZWVkIDY0SyAodG8gZml0IGluIGFuIGludCBvbiAxNiBiaXQgbWFjaGluZXMpLgorICovCitzdGF0aWMgdm9pZCBzZXRfZGF0YV90eXBlKAorCWRlZmxhdGVfc3RhdGUgKnMKKykKK3sKKyAgICBpbnQgbiA9IDA7CisgICAgdW5zaWduZWQgYXNjaWlfZnJlcSA9IDA7CisgICAgdW5zaWduZWQgYmluX2ZyZXEgPSAwOworICAgIHdoaWxlIChuIDwgNykgICAgICAgIGJpbl9mcmVxICs9IHMtPmR5bl9sdHJlZVtuKytdLkZyZXE7CisgICAgd2hpbGUgKG4gPCAxMjgpICAgIGFzY2lpX2ZyZXEgKz0gcy0+ZHluX2x0cmVlW24rK10uRnJlcTsKKyAgICB3aGlsZSAobiA8IExJVEVSQUxTKSBiaW5fZnJlcSArPSBzLT5keW5fbHRyZWVbbisrXS5GcmVxOworICAgIHMtPmRhdGFfdHlwZSA9IChCeXRlKShiaW5fZnJlcSA+IChhc2NpaV9mcmVxID4+IDIpID8gWl9CSU5BUlkgOiBaX0FTQ0lJKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IGEgc3RvcmVkIGJsb2NrLCBzdG9yaW5nIGZpcnN0IHRoZSBsZW5ndGggYW5kIGl0cworICogb25lJ3MgY29tcGxlbWVudCBpZiByZXF1ZXN0ZWQuCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfYmxvY2soCisJZGVmbGF0ZV9zdGF0ZSAqcywKKwljaGFyICAgICpidWYsICAgICAvKiB0aGUgaW5wdXQgZGF0YSAqLworCXVuc2lnbmVkIGxlbiwgICAgIC8qIGl0cyBsZW5ndGggKi8KKwlpbnQgICAgICBoZWFkZXIgICAvKiB0cnVlIGlmIGJsb2NrIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gKi8KKykKK3sKKyAgICBiaV93aW5kdXAocyk7ICAgICAgICAvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisgICAgcy0+bGFzdF9lb2JfbGVuID0gODsgLyogZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZSAqLworCisgICAgaWYgKGhlYWRlcikgeworICAgICAgICBwdXRfc2hvcnQocywgKHVzaClsZW4pOyAgIAorICAgICAgICBwdXRfc2hvcnQocywgKHVzaCl+bGVuKTsKKyNpZmRlZiBERUJVR19aTElCCisgICAgICAgIHMtPmJpdHNfc2VudCArPSAyKjE2OworI2VuZGlmCisgICAgfQorI2lmZGVmIERFQlVHX1pMSUIKKyAgICBzLT5iaXRzX3NlbnQgKz0gKHVsZylsZW48PDM7CisjZW5kaWYKKyAgICAvKiBidW5kbGUgdXAgdGhlIHB1dF9ieXRlKHMsICpidWYrKykgY2FsbHMgKi8KKyAgICBtZW1jcHkoJnMtPnBlbmRpbmdfYnVmW3MtPnBlbmRpbmddLCBidWYsIGxlbik7CisgICAgcy0+cGVuZGluZyArPSBsZW47Cit9CisKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfZGVmbGF0ZS9kZWZ1dGlsLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2RlZmxhdGUvZGVmdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzM3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2RlZmxhdGUvZGVmdXRpbC5oCkBAIC0wLDAgKzEsMzI3IEBACisKKworCisjZGVmaW5lIEFzc2VydChlcnIsIHN0cikgCisjZGVmaW5lIFRyYWNlKGR1bW15KSAKKyNkZWZpbmUgVHJhY2V2KGR1bW15KSAKKyNkZWZpbmUgVHJhY2VjdihlcnIsIGR1bW15KSAKKyNkZWZpbmUgVHJhY2V2dihkdW1teSkgCisKKworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgTF9DT0RFUyAoTElURVJBTFMrMStMRU5HVEhfQ09ERVMpCisvKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi8KKworI2RlZmluZSBEX0NPREVTICAgMzAKKy8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqLworCisjZGVmaW5lIEJMX0NPREVTICAxOQorLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovCisKKyNkZWZpbmUgSEVBUF9TSVpFICgyKkxfQ09ERVMrMSkKKy8qIG1heGltdW0gaGVhcCBzaXplICovCisKKyNkZWZpbmUgTUFYX0JJVFMgMTUKKy8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqLworCisjZGVmaW5lIElOSVRfU1RBVEUgICAgNDIKKyNkZWZpbmUgQlVTWV9TVEFURSAgIDExMworI2RlZmluZSBGSU5JU0hfU1RBVEUgNjY2CisvKiBTdHJlYW0gc3RhdHVzICovCisKKworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YV9zIHsKKyAgICB1bmlvbiB7CisgICAgICAgIHVzaCAgZnJlcTsgICAgICAgLyogZnJlcXVlbmN5IGNvdW50ICovCisgICAgICAgIHVzaCAgY29kZTsgICAgICAgLyogYml0IHN0cmluZyAqLworICAgIH0gZmM7CisgICAgdW5pb24geworICAgICAgICB1c2ggIGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLworICAgICAgICB1c2ggIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCisgICAgfSBkbDsKK30gY3RfZGF0YTsKKworI2RlZmluZSBGcmVxIGZjLmZyZXEKKyNkZWZpbmUgQ29kZSBmYy5jb2RlCisjZGVmaW5lIERhZCAgZGwuZGFkCisjZGVmaW5lIExlbiAgZGwubGVuCisKK3R5cGVkZWYgc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyAgc3RhdGljX3RyZWVfZGVzYzsKKwordHlwZWRlZiBzdHJ1Y3QgdHJlZV9kZXNjX3MgeworICAgIGN0X2RhdGEgKmR5bl90cmVlOyAgICAgICAgICAgLyogdGhlIGR5bmFtaWMgdHJlZSAqLworICAgIGludCAgICAgbWF4X2NvZGU7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovCisgICAgc3RhdGljX3RyZWVfZGVzYyAqc3RhdF9kZXNjOyAvKiB0aGUgY29ycmVzcG9uZGluZyBzdGF0aWMgdHJlZSAqLworfSB0cmVlX2Rlc2M7CisKK3R5cGVkZWYgdXNoIFBvczsKK3R5cGVkZWYgdW5zaWduZWQgSVBvczsKKworLyogQSBQb3MgaXMgYW4gaW5kZXggaW4gdGhlIGNoYXJhY3RlciB3aW5kb3cuIFdlIHVzZSBzaG9ydCBpbnN0ZWFkIG9mIGludCB0bworICogc2F2ZSBzcGFjZSBpbiB0aGUgdmFyaW91cyB0YWJsZXMuIElQb3MgaXMgdXNlZCBvbmx5IGZvciBwYXJhbWV0ZXIgcGFzc2luZy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBkZWZsYXRlX3N0YXRlIHsKKyAgICB6X3N0cmVhbXAgc3RybTsgICAgICAvKiBwb2ludGVyIGJhY2sgdG8gdGhpcyB6bGliIHN0cmVhbSAqLworICAgIGludCAgIHN0YXR1czsgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi8KKyAgICBCeXRlICpwZW5kaW5nX2J1ZjsgICAvKiBvdXRwdXQgc3RpbGwgcGVuZGluZyAqLworICAgIHVsZyAgIHBlbmRpbmdfYnVmX3NpemU7IC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi8KKyAgICBCeXRlICpwZW5kaW5nX291dDsgICAvKiBuZXh0IHBlbmRpbmcgYnl0ZSB0byBvdXRwdXQgdG8gdGhlIHN0cmVhbSAqLworICAgIGludCAgIHBlbmRpbmc7ICAgICAgIC8qIG5iIG9mIGJ5dGVzIGluIHRoZSBwZW5kaW5nIGJ1ZmZlciAqLworICAgIGludCAgIG5vaGVhZGVyOyAgICAgIC8qIHN1cHByZXNzIHpsaWIgaGVhZGVyIGFuZCBhZGxlcjMyICovCisgICAgQnl0ZSAgZGF0YV90eXBlOyAgICAgLyogVU5LTk9XTiwgQklOQVJZIG9yIEFTQ0lJICovCisgICAgQnl0ZSAgbWV0aG9kOyAgICAgICAgLyogU1RPUkVEIChmb3IgemlwIG9ubHkpIG9yIERFRkxBVEVEICovCisgICAgaW50ICAgbGFzdF9mbHVzaDsgICAgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLworCisgICAgICAgICAgICAgICAgLyogdXNlZCBieSBkZWZsYXRlLmM6ICovCisKKyAgICB1SW50ICB3X3NpemU7ICAgICAgICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi8KKyAgICB1SW50ICB3X2JpdHM7ICAgICAgICAvKiBsb2cyKHdfc2l6ZSkgICg4Li4xNikgKi8KKyAgICB1SW50ICB3X21hc2s7ICAgICAgICAvKiB3X3NpemUgLSAxICovCisKKyAgICBCeXRlICp3aW5kb3c7CisgICAgLyogU2xpZGluZyB3aW5kb3cuIElucHV0IGJ5dGVzIGFyZSByZWFkIGludG8gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB3aW5kb3csCisgICAgICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3Qgd1NpemUKKyAgICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mCisgICAgICogd1NpemUtTUFYX01BVENIIGJ5dGVzLCBidXQgdGhpcyBlbnN1cmVzIHRoYXQgSU8gaXMgYWx3YXlzCisgICAgICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cworICAgICAqIHRoZSB3aW5kb3cgc2l6ZSB0byA2NEssIHdoaWNoIGlzIHF1aXRlIHVzZWZ1bCBvbiBNU0RPUy4KKyAgICAgKiBUbyBkbzogdXNlIHRoZSB1c2VyIGlucHV0IGJ1ZmZlciBhcyBzbGlkaW5nIHdpbmRvdy4KKyAgICAgKi8KKworICAgIHVsZyB3aW5kb3dfc2l6ZTsKKyAgICAvKiBBY3R1YWwgc2l6ZSBvZiB3aW5kb3c6IDIqd1NpemUsIGV4Y2VwdCB3aGVuIHRoZSB1c2VyIGlucHV0IGJ1ZmZlcgorICAgICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuCisgICAgICovCisKKyAgICBQb3MgKnByZXY7CisgICAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKKyAgICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgorICAgICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLgorICAgICAqLworCisgICAgUG9zICpoZWFkOyAvKiBIZWFkcyBvZiB0aGUgaGFzaCBjaGFpbnMgb3IgTklMLiAqLworCisgICAgdUludCAgaW5zX2g7ICAgICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovCisgICAgdUludCAgaGFzaF9zaXplOyAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBoYXNoIHRhYmxlICovCisgICAgdUludCAgaGFzaF9iaXRzOyAgICAgIC8qIGxvZzIoaGFzaF9zaXplKSAqLworICAgIHVJbnQgIGhhc2hfbWFzazsgICAgICAvKiBoYXNoX3NpemUtMSAqLworCisgICAgdUludCAgaGFzaF9zaGlmdDsKKyAgICAvKiBOdW1iZXIgb2YgYml0cyBieSB3aGljaCBpbnNfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaCBpbnB1dAorICAgICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdAorICAgICAqIGJ5dGUgbm8gbG9uZ2VyIHRha2VzIHBhcnQgaW4gdGhlIGhhc2gga2V5LCB0aGF0IGlzOgorICAgICAqICAgaGFzaF9zaGlmdCAqIE1JTl9NQVRDSCA+PSBoYXNoX2JpdHMKKyAgICAgKi8KKworICAgIGxvbmcgYmxvY2tfc3RhcnQ7CisgICAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzCisgICAgICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy4KKyAgICAgKi8KKworICAgIHVJbnQgbWF0Y2hfbGVuZ3RoOyAgICAgICAgICAgLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi8KKyAgICBJUG9zIHByZXZfbWF0Y2g7ICAgICAgICAgICAgIC8qIHByZXZpb3VzIG1hdGNoICovCisgICAgaW50IG1hdGNoX2F2YWlsYWJsZTsgICAgICAgICAvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCisgICAgdUludCBzdHJzdGFydDsgICAgICAgICAgICAgICAvKiBzdGFydCBvZiBzdHJpbmcgdG8gaW5zZXJ0ICovCisgICAgdUludCBtYXRjaF9zdGFydDsgICAgICAgICAgICAvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi8KKyAgICB1SW50IGxvb2thaGVhZDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8KKworICAgIHVJbnQgcHJldl9sZW5ndGg7CisgICAgLyogTGVuZ3RoIG9mIHRoZSBiZXN0IG1hdGNoIGF0IHByZXZpb3VzIHN0ZXAuIE1hdGNoZXMgbm90IGdyZWF0ZXIgdGhhbiB0aGlzCisgICAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uCisgICAgICovCisKKyAgICB1SW50IG1heF9jaGFpbl9sZW5ndGg7CisgICAgLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXMKKyAgICAgKiBsZW5ndGguICBBIGhpZ2hlciBsaW1pdCBpbXByb3ZlcyBjb21wcmVzc2lvbiByYXRpbyBidXQgZGVncmFkZXMgdGhlCisgICAgICogc3BlZWQuCisgICAgICovCisKKyAgICB1SW50IG1heF9sYXp5X21hdGNoOworICAgIC8qIEF0dGVtcHQgdG8gZmluZCBhIGJldHRlciBtYXRjaCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgbWF0Y2ggaXMgc3RyaWN0bHkKKyAgICAgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbgorICAgICAqIGxldmVscyA+PSA0LgorICAgICAqLworIyAgIGRlZmluZSBtYXhfaW5zZXJ0X2xlbmd0aCAgbWF4X2xhenlfbWF0Y2gKKyAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdAorICAgICAqIGdyZWF0ZXIgdGhhbiB0aGlzIGxlbmd0aC4gVGhpcyBzYXZlcyB0aW1lIGJ1dCBkZWdyYWRlcyBjb21wcmVzc2lvbi4KKyAgICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLgorICAgICAqLworCisgICAgaW50IGxldmVsOyAgICAvKiBjb21wcmVzc2lvbiBsZXZlbCAoMS4uOSkgKi8KKyAgICBpbnQgc3RyYXRlZ3k7IC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi8KKworICAgIHVJbnQgZ29vZF9tYXRjaDsKKyAgICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi8KKworICAgIGludCBuaWNlX21hdGNoOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovCisKKyAgICAgICAgICAgICAgICAvKiB1c2VkIGJ5IHRyZWVzLmM6ICovCisgICAgLyogRGlkbid0IHVzZSBjdF9kYXRhIHR5cGVkZWYgYmVsb3cgdG8gc3VwcHJlc3MgY29tcGlsZXIgd2FybmluZyAqLworICAgIHN0cnVjdCBjdF9kYXRhX3MgZHluX2x0cmVlW0hFQVBfU0laRV07ICAgLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9kdHJlZVsyKkRfQ09ERVMrMV07IC8qIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi8KKworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBsX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqLworICAgIHN0cnVjdCB0cmVlX2Rlc2NfcyBkX2Rlc2M7ICAgICAgICAgICAgICAgLyogZGVzYy4gZm9yIGRpc3RhbmNlIHRyZWUgKi8KKyAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgYmxfZGVzYzsgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBiaXQgbGVuZ3RoIHRyZWUgKi8KKworICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKKyAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KKworICAgIGludCBoZWFwWzIqTF9DT0RFUysxXTsgICAgICAvKiBoZWFwIHVzZWQgdG8gYnVpbGQgdGhlIEh1ZmZtYW4gdHJlZXMgKi8KKyAgICBpbnQgaGVhcF9sZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBoZWFwICovCisgICAgaW50IGhlYXBfbWF4OyAgICAgICAgICAgICAgIC8qIGVsZW1lbnQgb2YgbGFyZ2VzdCBmcmVxdWVuY3kgKi8KKyAgICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICAgICAqIFRoZSBzYW1lIGhlYXAgYXJyYXkgaXMgdXNlZCB0byBidWlsZCBhbGwgdHJlZXMuCisgICAgICovCisKKyAgICB1Y2ggZGVwdGhbMipMX0NPREVTKzFdOworICAgIC8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kKKyAgICAgKi8KKworICAgIHVjaCAqbF9idWY7ICAgICAgICAgIC8qIGJ1ZmZlciBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqLworCisgICAgdUludCAgbGl0X2J1ZnNpemU7CisgICAgLyogU2l6ZSBvZiBtYXRjaCBidWZmZXIgZm9yIGxpdGVyYWxzL2xlbmd0aHMuICBUaGVyZSBhcmUgNCByZWFzb25zIGZvcgorICAgICAqIGxpbWl0aW5nIGxpdF9idWZzaXplIHRvIDY0SzoKKyAgICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzCisgICAgICogICAtIGlmIGNvbXByZXNzaW9uIGlzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZmlyc3QgYmxvY2ssIGFsbCBpbnB1dAorICAgICAqICAgICBkYXRhIGlzIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlbgorICAgICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvcgorICAgICAqICAgICBhbGwgYmxvY2tzIGlmIGxpdF9idWZzaXplIGlzIG5vdCBncmVhdGVyIHRoYW4gMzJLLikKKyAgICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4KKyAgICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLgorICAgICAqICAgICBUaGlzIGlzIGFwcGxpY2FibGUgb25seSBmb3IgemlwIChub3QgZ3ppcCBvciB6bGliKS4KKyAgICAgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0CisgICAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3IKKyAgICAgKiAgICAgZXhhbXBsZSBhIGJpbmFyeSBmaWxlIHdpdGggcG9vcmx5IGNvbXByZXNzaWJsZSBjb2RlIGZvbGxvd2VkIGJ5CisgICAgICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlCisgICAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZworICAgICAqICAgICB0cmVlcyBtb3JlIGZyZXF1ZW50bHkuCisgICAgICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNAorICAgICAqLworCisgICAgdUludCBsYXN0X2xpdDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGxfYnVmICovCisKKyAgICB1c2ggKmRfYnVmOworICAgIC8qIEJ1ZmZlciBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmUKKyAgICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZworICAgICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KKyAgICAgKi8KKworICAgIHVsZyBvcHRfbGVuOyAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLworICAgIHVsZyBzdGF0aWNfbGVuOyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCisgICAgdWxnIGNvbXByZXNzZWRfbGVuOyAvKiB0b3RhbCBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZmlsZSAqLworICAgIHVJbnQgbWF0Y2hlczsgICAgICAgLyogbnVtYmVyIG9mIHN0cmluZyBtYXRjaGVzIGluIGN1cnJlbnQgYmxvY2sgKi8KKyAgICBpbnQgbGFzdF9lb2JfbGVuOyAgIC8qIGJpdCBsZW5ndGggb2YgRU9CIGNvZGUgZm9yIGxhc3QgYmxvY2sgKi8KKworI2lmZGVmIERFQlVHX1pMSUIKKyAgICB1bGcgYml0c19zZW50OyAgICAgIC8qIGJpdCBsZW5ndGggb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAqLworI2VuZGlmCisKKyAgICB1c2ggYmlfYnVmOworICAgIC8qIE91dHB1dCBidWZmZXIuIGJpdHMgYXJlIGluc2VydGVkIHN0YXJ0aW5nIGF0IHRoZSBib3R0b20gKGxlYXN0CisgICAgICogc2lnbmlmaWNhbnQgYml0cykuCisgICAgICovCisgICAgaW50IGJpX3ZhbGlkOworICAgIC8qIE51bWJlciBvZiB2YWxpZCBiaXRzIGluIGJpX2J1Zi4gIEFsbCBiaXRzIGFib3ZlIHRoZSBsYXN0IHZhbGlkIGJpdAorICAgICAqIGFyZSBhbHdheXMgemVyby4KKyAgICAgKi8KKworfSBkZWZsYXRlX3N0YXRlOworCit0eXBlZGVmIHN0cnVjdCBkZWZsYXRlX3dvcmtzcGFjZSB7CisgICAgLyogU3RhdGUgbWVtb3J5IGZvciB0aGUgZGVmbGF0b3IgKi8KKyAgICBkZWZsYXRlX3N0YXRlIGRlZmxhdGVfbWVtb3J5OworICAgIEJ5dGUgKndpbmRvd19tZW1vcnk7CisgICAgUG9zICpwcmV2X21lbW9yeTsKKyAgICBQb3MgKmhlYWRfbWVtb3J5OworICAgIGNoYXIgKm92ZXJsYXlfbWVtb3J5OworfSBkZWZsYXRlX3dvcmtzcGFjZTsKKworI2RlZmluZSB6bGliX2RlZmxhdGVfd2luZG93X21lbXNpemUod2luZG93Qml0cykgXAorCSgyICogKDEgPDwgKHdpbmRvd0JpdHMpKSAqIHNpemVvZihCeXRlKSkKKyNkZWZpbmUgemxpYl9kZWZsYXRlX3ByZXZfbWVtc2l6ZSh3aW5kb3dCaXRzKSBcCisJKCgxIDw8ICh3aW5kb3dCaXRzKSkgKiBzaXplb2YoUG9zKSkKKyNkZWZpbmUgemxpYl9kZWZsYXRlX2hlYWRfbWVtc2l6ZShtZW1MZXZlbCkgXAorCSgoMSA8PCAoKG1lbUxldmVsKSs3KSkgKiBzaXplb2YoUG9zKSkKKyNkZWZpbmUgemxpYl9kZWZsYXRlX292ZXJsYXlfbWVtc2l6ZShtZW1MZXZlbCkgXAorCSgoMSA8PCAoKG1lbUxldmVsKSs2KSkgKiAoc2l6ZW9mKHVzaCkrMikpCisKKy8qIE91dHB1dCBhIGJ5dGUgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ19idWYuCisgKi8KKyNkZWZpbmUgcHV0X2J5dGUocywgYykge3MtPnBlbmRpbmdfYnVmW3MtPnBlbmRpbmcrK10gPSAoYyk7fQorCisKKyNkZWZpbmUgTUlOX0xPT0tBSEVBRCAoTUFYX01BVENIK01JTl9NQVRDSCsxKQorLyogTWluaW11bSBhbW91bnQgb2YgbG9va2FoZWFkLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KKyAqIFNlZSBkZWZsYXRlLmMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBNSU5fTUFUQ0grMS4KKyAqLworCisjZGVmaW5lIE1BWF9ESVNUKHMpICAoKHMpLT53X3NpemUtTUlOX0xPT0tBSEVBRCkKKy8qIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24gMTYgYml0IG1hY2hpbmVzLCBtYXRjaAorICogZGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9ESVNUIGluc3RlYWQgb2YgV1NJWkUuCisgKi8KKworICAgICAgICAvKiBpbiB0cmVlcy5jICovCit2b2lkIHpsaWJfdHJfaW5pdCAgICAgICAgIChkZWZsYXRlX3N0YXRlICpzKTsKK2ludCAgemxpYl90cl90YWxseSAgICAgICAgKGRlZmxhdGVfc3RhdGUgKnMsIHVuc2lnbmVkIGRpc3QsIHVuc2lnbmVkIGxjKTsKK3VsZyAgemxpYl90cl9mbHVzaF9ibG9jayAgKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sCisJCQkgICBpbnQgZW9mKTsKK3ZvaWQgemxpYl90cl9hbGlnbiAgICAgICAgKGRlZmxhdGVfc3RhdGUgKnMpOwordm9pZCB6bGliX3RyX3N0b3JlZF9ibG9jayAoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhciAqYnVmLCB1bGcgc3RvcmVkX2xlbiwKKwkJCSAgIGludCBlb2YpOwordm9pZCB6bGliX3RyX3N0b3JlZF90eXBlX29ubHkgKGRlZmxhdGVfc3RhdGUgKik7CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS4KKyAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi4KKyAqLworI2RlZmluZSBwdXRfc2hvcnQocywgdykgeyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHcpICYgMHhmZikpOyBcCisgICAgcHV0X2J5dGUocywgKHVjaCkoKHVzaCkodykgPj4gOCkpOyBcCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRmx1c2ggdGhlIGJpdCBidWZmZXIsIGtlZXBpbmcgYXQgbW9zdCA3IGJpdHMgaW4gaXQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBiaV9mbHVzaChkZWZsYXRlX3N0YXRlICpzKQoreworICAgIGlmIChzLT5iaV92YWxpZCA9PSAxNikgeworICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKKyAgICAgICAgcy0+YmlfYnVmID0gMDsKKyAgICAgICAgcy0+YmlfdmFsaWQgPSAwOworICAgIH0gZWxzZSBpZiAocy0+YmlfdmFsaWQgPj0gOCkgeworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpOworICAgICAgICBzLT5iaV9idWYgPj49IDg7CisgICAgICAgIHMtPmJpX3ZhbGlkIC09IDg7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyIGFuZCBhbGlnbiB0aGUgb3V0cHV0IG9uIGEgYnl0ZSBib3VuZGFyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYmlfd2luZHVwKGRlZmxhdGVfc3RhdGUgKnMpCit7CisgICAgaWYgKHMtPmJpX3ZhbGlkID4gOCkgeworICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKKyAgICB9IGVsc2UgaWYgKHMtPmJpX3ZhbGlkID4gMCkgeworICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpOworICAgIH0KKyAgICBzLT5iaV9idWYgPSAwOworICAgIHMtPmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVR19aTElCCisgICAgcy0+Yml0c19zZW50ID0gKHMtPmJpdHNfc2VudCs3KSAmIH43OworI2VuZGlmCit9CisKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9NYWtlZmlsZSBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY4Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL01ha2VmaWxlCkBAIC0wLDAgKzEsMTkgQEAKKyMKKyMgVGhpcyBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgemxpYiwgd2hpY2ggZG9lcyBhbGwgbWVtb3J5CisjIGFsbG9jYXRpb24gYWhlYWQgb2YgdGltZS4KKyMKKyMgVGhpcyBpcyBvbmx5IHRoZSBkZWNvbXByZXNzaW9uLCBzZWUgemxpYl9kZWZsYXRlIGZvciB0aGUKKyMgdGhlIGNvbXByZXNzaW9uCisjCisjIERlY29tcHJlc3Npb24gbmVlZHMgdG8gYmUgc2VyaWFsaXplZCBmb3IgZWFjaCBtZW1vcnkKKyMgYWxsb2NhdGlvbi4KKyMKKyMgKFRoZSB1cHNpZGVzIG9mIHRoZSBzaW1wbGlmaWNhdGlvbiBpcyB0aGF0IHlvdSBjYW4ndCBnZXQgaW4KKyMgYW55IG5hc3R5IHNpdHVhdGlvbnMgd3J0IG1lbW9yeSBtYW5hZ2VtZW50LCBhbmQgdGhhdCB0aGUKKyMgdW5jb21wcmVzc2lvbiBjYW4gYmUgZG9uZSB3aXRob3V0IGJsb2NraW5nIG9uIGFsbG9jYXRpb24pLgorIworCitvYmotJChDT05GSUdfWkxJQl9JTkZMQVRFKSArPSB6bGliX2luZmxhdGUubworCit6bGliX2luZmxhdGUtb2JqcyA6PSBpbmZmYXN0Lm8gaW5mbGF0ZS5vIGluZnV0aWwubyBcCisJCSAgICAgaW5mdHJlZXMubyBpbmZsYXRlX3N5bXMubwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZmZhc3QuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZmYXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxZjNkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZmYXN0LmMKQEAgLTAsMCArMSwzNDIgQEAKKy8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNCBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3p1dGlsLmg+CisjaW5jbHVkZSAiaW5mdHJlZXMuaCIKKyNpbmNsdWRlICJpbmZsYXRlLmgiCisjaW5jbHVkZSAiaW5mZmFzdC5oIgorCisjaWZuZGVmIEFTTUlORgorCit1bmlvbiB1dSB7CisJdW5zaWduZWQgc2hvcnQgdXM7CisJdW5zaWduZWQgY2hhciBiWzJdOworfTsKKworLyogRW5kaWFuIGluZGVwZW5kZWQgdmVyc2lvbiAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydAorZ2V0X3VuYWxpZ25lZDE2KGNvbnN0IHVuc2lnbmVkIHNob3J0ICpwKQoreworCXVuaW9uIHV1ICBtbTsKKwl1bnNpZ25lZCBjaGFyICpiID0gKHVuc2lnbmVkIGNoYXIgKilwOworCisJbW0uYlswXSA9IGJbMF07CisJbW0uYlsxXSA9IGJbMV07CisJcmV0dXJuIG1tLnVzOworfQorCisvKgorICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZworICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzCisgICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLgorICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgorICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZQorICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuCisKKyAgIEVudHJ5IGFzc3VtcHRpb25zOgorCisgICAgICAgIHN0YXRlLT5tb2RlID09IExFTgorICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2CisgICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKKyAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0CisgICAgICAgIHN0YXRlLT5iaXRzIDwgOAorCisgICBPbiByZXR1cm4sIHN0YXRlLT5tb2RlIGlzIG9uZSBvZjoKKworICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQKKyAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2sKKyAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKKworICAgTm90ZXM6CisKKyAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQorICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsCisgICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgorICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkCisgICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLgorCisgICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4CisgICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKKyAgICAgIHJlcXVpcmVzIHN0cm0tPmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3IKKyAgICAgIG91dHB1dCBzcGFjZS4KKworICAgIC0gQHN0YXJ0OglpbmZsYXRlKCkncyBzdGFydGluZyB2YWx1ZSBmb3Igc3RybS0+YXZhaWxfb3V0CisgKi8KK3ZvaWQgaW5mbGF0ZV9mYXN0KHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBzdGFydCkKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqaW47ICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfaW4gKi8KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpsYXN0OyAgLyogd2hpbGUgaW4gPCBsYXN0LCBlbm91Z2ggaW5wdXQgYXZhaWxhYmxlICovCisgICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgICAgIC8qIGxvY2FsIHN0cm0tPm5leHRfb3V0ICovCisgICAgdW5zaWduZWQgY2hhciAqYmVnOyAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS0+bmV4dF9vdXQgKi8KKyAgICB1bnNpZ25lZCBjaGFyICplbmQ7ICAgICAgICAgLyogd2hpbGUgb3V0IDwgZW5kLCBlbm91Z2ggc3BhY2UgYXZhaWxhYmxlICovCisjaWZkZWYgSU5GTEFURV9TVFJJQ1QKKyAgICB1bnNpZ25lZCBkbWF4OyAgICAgICAgICAgICAgLyogbWF4aW11bSBkaXN0YW5jZSBmcm9tIHpsaWIgaGVhZGVyICovCisjZW5kaWYKKyAgICB1bnNpZ25lZCB3c2l6ZTsgICAgICAgICAgICAgLyogd2luZG93IHNpemUgb3IgemVybyBpZiBub3QgdXNpbmcgd2luZG93ICovCisgICAgdW5zaWduZWQgd2hhdmU7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3cml0ZTsgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovCisgICAgdW5zaWduZWQgY2hhciAqd2luZG93OyAgICAgIC8qIGFsbG9jYXRlZCBzbGlkaW5nIHdpbmRvdywgaWYgd3NpemUgIT0gMCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBsb2NhbCBzdHJtLT5ob2xkICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0tPmJpdHMgKi8KKyAgICBjb2RlIGNvbnN0ICpsY29kZTsgICAgICAgICAgLyogbG9jYWwgc3RybS0+bGVuY29kZSAqLworICAgIGNvZGUgY29uc3QgKmRjb2RlOyAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5kaXN0Y29kZSAqLworICAgIHVuc2lnbmVkIGxtYXNrOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBmaXJzdCBsZXZlbCBvZiBsZW5ndGggY29kZXMgKi8KKyAgICB1bnNpZ25lZCBkbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogcmV0cmlldmVkIHRhYmxlIGVudHJ5ICovCisgICAgdW5zaWduZWQgb3A7ICAgICAgICAgICAgICAgIC8qIGNvZGUgYml0cywgb3BlcmF0aW9uLCBleHRyYSBiaXRzLCBvciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGgsIHVudXNlZCBieXRlcyAqLworICAgIHVuc2lnbmVkIGRpc3Q7ICAgICAgICAgICAgICAvKiBtYXRjaCBkaXN0YW5jZSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmZyb207ICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi8KKworICAgIC8qIGNvcHkgc3RhdGUgdG8gbG9jYWwgdmFyaWFibGVzICovCisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgKilzdHJtLT5zdGF0ZTsKKyAgICBpbiA9IHN0cm0tPm5leHRfaW47CisgICAgbGFzdCA9IGluICsgKHN0cm0tPmF2YWlsX2luIC0gNSk7CisgICAgb3V0ID0gc3RybS0+bmV4dF9vdXQ7CisgICAgYmVnID0gb3V0IC0gKHN0YXJ0IC0gc3RybS0+YXZhaWxfb3V0KTsKKyAgICBlbmQgPSBvdXQgKyAoc3RybS0+YXZhaWxfb3V0IC0gMjU3KTsKKyNpZmRlZiBJTkZMQVRFX1NUUklDVAorICAgIGRtYXggPSBzdGF0ZS0+ZG1heDsKKyNlbmRpZgorICAgIHdzaXplID0gc3RhdGUtPndzaXplOworICAgIHdoYXZlID0gc3RhdGUtPndoYXZlOworICAgIHdyaXRlID0gc3RhdGUtPndyaXRlOworICAgIHdpbmRvdyA9IHN0YXRlLT53aW5kb3c7CisgICAgaG9sZCA9IHN0YXRlLT5ob2xkOworICAgIGJpdHMgPSBzdGF0ZS0+Yml0czsKKyAgICBsY29kZSA9IHN0YXRlLT5sZW5jb2RlOworICAgIGRjb2RlID0gc3RhdGUtPmRpc3Rjb2RlOworICAgIGxtYXNrID0gKDFVIDw8IHN0YXRlLT5sZW5iaXRzKSAtIDE7CisgICAgZG1hc2sgPSAoMVUgPDwgc3RhdGUtPmRpc3RiaXRzKSAtIDE7CisKKyAgICAvKiBkZWNvZGUgbGl0ZXJhbHMgYW5kIGxlbmd0aC9kaXN0YW5jZXMgdW50aWwgZW5kLW9mLWJsb2NrIG9yIG5vdCBlbm91Z2gKKyAgICAgICBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSAqLworICAgIGRvIHsKKyAgICAgICAgaWYgKGJpdHMgPCAxNSkgeworICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKmluKyspIDw8IGJpdHM7CisgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqaW4rKykgPDwgYml0czsKKyAgICAgICAgICAgIGJpdHMgKz0gODsKKyAgICAgICAgfQorICAgICAgICB0aGlzID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKKyAgICAgIGRvbGVuOgorICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5iaXRzKTsKKyAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgIG9wID0gKHVuc2lnbmVkKSh0aGlzLm9wKTsKKyAgICAgICAgaWYgKG9wID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KKyAgICAgICAgICAgICpvdXQrKyA9ICh1bnNpZ25lZCBjaGFyKSh0aGlzLnZhbCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovCisgICAgICAgICAgICBsZW4gPSAodW5zaWduZWQpKHRoaXMudmFsKTsKKyAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovCisgICAgICAgICAgICBpZiAob3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCppbisrKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbiArPSAodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgb3ApIC0gMSk7CisgICAgICAgICAgICAgICAgaG9sZCA+Pj0gb3A7CisgICAgICAgICAgICAgICAgYml0cyAtPSBvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiaXRzIDwgMTUpIHsKKyAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKSgqaW4rKykgPDwgYml0czsKKyAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKmluKyspIDw8IGJpdHM7CisgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcyA9IGRjb2RlW2hvbGQgJiBkbWFza107CisgICAgICAgICAgZG9kaXN0OgorICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKHRoaXMuYml0cyk7CisgICAgICAgICAgICBob2xkID4+PSBvcDsKKyAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkodGhpcy5vcCk7CisgICAgICAgICAgICBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYXNlICovCisgICAgICAgICAgICAgICAgZGlzdCA9ICh1bnNpZ25lZCkodGhpcy52YWwpOworICAgICAgICAgICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKyAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7CisgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCppbisrKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICBiaXRzICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCppbisrKSA8PCBiaXRzOworICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpc3QgKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOworI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOworICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7CisgICAgICAgICAgICAgICAgb3AgPSAodW5zaWduZWQpKG91dCAtIGJlZyk7ICAgICAvKiBtYXggZGlzdGFuY2UgaW4gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wID4gd2hhdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlID09IDApIHsgICAgICAgICAgIC8qIHZlcnkgY29tbW9uIGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHdyaXRlIDwgb3ApIHsgICAgICAvKiB3cmFwIGFyb3VuZCB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3cml0ZSAtIG9wOworICAgICAgICAgICAgICAgICAgICAgICAgb3AgLT0gd3JpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gZW5kIG9mIHdpbmRvdyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod3JpdGUgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3cml0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAgICAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgLyogY29udGlndW91cyBpbiB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gKz0gd3JpdGUgLSBvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqLworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKmZyb20rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAqZnJvbSsrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm91dCsrID0gKmZyb20rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKwkJICAgIHVuc2lnbmVkIHNob3J0ICpzb3V0OworCQkgICAgdW5zaWduZWQgbG9uZyBsb29wczsKKworICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi8KKwkJICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovCisJCSAgICAvKiBBbGlnbiBvdXQgYWRkciAqLworCQkgICAgaWYgKCEoKGxvbmcpKG91dCAtIDEpICYgMSkpIHsKKwkJCSpvdXQrKyA9ICpmcm9tKys7CisJCQlsZW4tLTsKKwkJICAgIH0KKwkJICAgIHNvdXQgPSAodW5zaWduZWQgc2hvcnQgKikob3V0KTsKKwkJICAgIGlmIChkaXN0ID4gMikgeworCQkJdW5zaWduZWQgc2hvcnQgKnNmcm9tOworCisJCQlzZnJvbSA9ICh1bnNpZ25lZCBzaG9ydCAqKShmcm9tKTsKKwkJCWxvb3BzID0gbGVuID4+IDE7CisJCQlkbworI2lmZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCisJCQkgICAgKnNvdXQrKyA9ICpzZnJvbSsrOworI2Vsc2UKKwkJCSAgICAqc291dCsrID0gZ2V0X3VuYWxpZ25lZDE2KHNmcm9tKyspOworI2VuZGlmCisJCQl3aGlsZSAoLS1sb29wcyk7CisJCQlvdXQgPSAodW5zaWduZWQgY2hhciAqKXNvdXQ7CisJCQlmcm9tID0gKHVuc2lnbmVkIGNoYXIgKilzZnJvbTsKKwkJICAgIH0gZWxzZSB7IC8qIGRpc3QgPT0gMSBvciBkaXN0ID09IDIgKi8KKwkJCXVuc2lnbmVkIHNob3J0IHBhdDE2OworCisJCQlwYXQxNiA9ICooc291dC0xKTsKKwkJCWlmIChkaXN0ID09IDEpIHsKKwkJCQl1bmlvbiB1dSBtbTsKKwkJCQkvKiBjb3B5IG9uZSBjaGFyIHBhdHRlcm4gdG8gYm90aCBieXRlcyAqLworCQkJCW1tLnVzID0gcGF0MTY7CisJCQkJbW0uYlswXSA9IG1tLmJbMV07CisJCQkJcGF0MTYgPSBtbS51czsKKwkJCX0KKwkJCWxvb3BzID0gbGVuID4+IDE7CisJCQlkbworCQkJICAgICpzb3V0KysgPSBwYXQxNjsKKwkJCXdoaWxlICgtLWxvb3BzKTsKKwkJCW91dCA9ICh1bnNpZ25lZCBjaGFyICopc291dDsKKwkJICAgIH0KKwkJICAgIGlmIChsZW4gJiAxKQorCQkJKm91dCsrID0gKmZyb20rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAvKiAybmQgbGV2ZWwgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgICAgIHRoaXMgPSBkY29kZVt0aGlzLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOworICAgICAgICAgICAgICAgIGdvdG8gZG9kaXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT0gMCkgeyAgICAgICAgICAgICAgLyogMm5kIGxldmVsIGxlbmd0aCBjb2RlICovCisgICAgICAgICAgICB0aGlzID0gbGNvZGVbdGhpcy52YWwgKyAoaG9sZCAmICgoMVUgPDwgb3ApIC0gMSkpXTsKKyAgICAgICAgICAgIGdvdG8gZG9sZW47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAob3AgJiAzMikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGVuZC1vZi1ibG9jayAqLworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOworCisgICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCisgICAgbGVuID0gYml0cyA+PiAzOworICAgIGluIC09IGxlbjsKKyAgICBiaXRzIC09IGxlbiA8PCAzOworICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKKworICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCisgICAgc3RybS0+bmV4dF9pbiA9IGluOworICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0OworICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOworICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOworICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKKyAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7CisgICAgcmV0dXJuOworfQorCisvKgorICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6CisgICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCisgICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCisgICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHdyaXRlID09IDAKKyAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQorICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQorICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcworICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCisgICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQorICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCisgICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAorICovCisKKyNlbmRpZiAvKiAhQVNNSU5GICovCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mZmFzdC5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZmZhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMxNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZmZhc3QuaApAQCAtMCwwICsxLDExIEBACisvKiBpbmZmYXN0LmggLS0gaGVhZGVyIHRvIHVzZSBpbmZmYXN0LmMKKyAqIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIE1hcmsgQWRsZXIKKyAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKwordm9pZCBpbmZsYXRlX2Zhc3QgKHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBzdGFydCk7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mZml4ZWQuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZmaXhlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZWQ0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mZml4ZWQuaApAQCAtMCwwICsxLDk0IEBACisgICAgLyogaW5mZml4ZWQuaCAtLSB0YWJsZSBmb3IgZGVjb2RpbmcgZml4ZWQgY29kZXMKKyAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4KKyAgICAgKi8KKworICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0CisgICAgICAgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kCisgICAgICAgaXMgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgorICAgICAqLworCisgICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7CisgICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSwKKyAgICAgICAgezAsOSwxOTJ9LHsxNiw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sezAsOCwwfSx7MCw4LDEyOH0sCisgICAgICAgIHswLDgsNjR9LHswLDksMjI0fSx7MTYsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NH0sezE5LDcsNTl9LAorICAgICAgICB7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDh9LHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzZ9LAorICAgICAgICB7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSx7MCw5LDI0MH0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sCisgICAgICAgIHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSx7MCw4LDUyfSx7MCw5LDIwMH0sezE3LDcsMTN9LHswLDgsMTAwfSwKKyAgICAgICAgezAsOCwzNn0sezAsOSwxNjh9LHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMyfSx7MTYsNyw4fSwKKyAgICAgICAgezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTZ9LAorICAgICAgICB7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg0fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sCisgICAgICAgIHswLDksMjQ4fSx7MTYsNywzfSx7MCw4LDgyfSx7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sCisgICAgICAgIHswLDgsNTB9LHswLDksMTk2fSx7MTcsNywxMX0sezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjR9LHswLDgsMn0sCisgICAgICAgIHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOH0sezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDh9LAorICAgICAgICB7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LAorICAgICAgICB7MCw5LDE4MH0sezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ0fSx7MTYsNyw1fSx7MCw4LDg2fSwKKyAgICAgICAgezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNH0sezE3LDcsMTV9LAorICAgICAgICB7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzJ9LHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM2fSwKKyAgICAgICAgezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sezAsOSwxNTZ9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sCisgICAgICAgIHswLDksMjIwfSx7MTgsNywyN30sezAsOCwxMTB9LHswLDgsNDZ9LHswLDksMTg4fSx7MCw4LDE0fSx7MCw4LDE0Mn0sCisgICAgICAgIHswLDgsNzh9LHswLDksMjUyfSx7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSwKKyAgICAgICAgezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk0fSx7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjJ9LAorICAgICAgICB7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyNn0sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sCisgICAgICAgIHswLDksMTQ2fSx7MTksNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjEwfSx7MTcsNywxN30sezAsOCwxMDV9LAorICAgICAgICB7MCw4LDQxfSx7MCw5LDE3OH0sezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxNiw3LDR9LAorICAgICAgICB7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDJ9LAorICAgICAgICB7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LHswLDksMTcwfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSwKKyAgICAgICAgezAsOSwyMzR9LHsxNiw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSx7MjAsNyw4M30sezAsOCwxMjV9LAorICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOH0sezE4LDcsMjN9LHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sCisgICAgICAgIHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MH0sezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSwKKyAgICAgICAgezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSx7MCw5LDE5OH0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LAorICAgICAgICB7MCw5LDE2Nn0sezAsOCwzfSx7MCw4LDEzMX0sezAsOCw2N30sezAsOSwyMzB9LHsxNiw3LDd9LHswLDgsOTF9LAorICAgICAgICB7MCw4LDI3fSx7MCw5LDE1MH0sezIwLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sezE4LDcsMTl9LAorICAgICAgICB7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODJ9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0Nn0sCisgICAgICAgIHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sCisgICAgICAgIHswLDksMjA2fSx7MTcsNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc0fSx7MCw4LDd9LHswLDgsMTM1fSwKKyAgICAgICAgezAsOCw3MX0sezAsOSwyMzh9LHsxNiw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MjAsNyw5OX0sCisgICAgICAgIHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyMn0sezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MH0sCisgICAgICAgIHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSx7MCw5LDI1NH0sezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sCisgICAgICAgIHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSx7MCw5LDE5M30sezE2LDcsMTB9LHswLDgsOTZ9LAorICAgICAgICB7MCw4LDMyfSx7MCw5LDE2MX0sezAsOCwwfSx7MCw4LDEyOH0sezAsOCw2NH0sezAsOSwyMjV9LHsxNiw3LDZ9LAorICAgICAgICB7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sezE5LDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOX0sCisgICAgICAgIHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LAorICAgICAgICB7MCw5LDI0MX0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LAorICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezE3LDcsMTN9LHswLDgsMTAwfSx7MCw4LDM2fSx7MCw5LDE2OX0sezAsOCw0fSwKKyAgICAgICAgezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMzfSx7MTYsNyw4fSx7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1M30sCisgICAgICAgIHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sCisgICAgICAgIHswLDksMTg1fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDl9LHsxNiw3LDN9LHswLDgsODJ9LAorICAgICAgICB7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTd9LHsxNyw3LDExfSwKKyAgICAgICAgezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKKyAgICAgICAgezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDl9LHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sCisgICAgICAgIHswLDksMjEzfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSx7MCw4LDEwfSx7MCw4LDEzOH0sCisgICAgICAgIHswLDgsNzR9LHswLDksMjQ1fSx7MTYsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sCisgICAgICAgIHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNX0sezE3LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3M30sCisgICAgICAgIHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM3fSx7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSwKKyAgICAgICAgezAsOSwxNTd9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxOCw3LDI3fSx7MCw4LDExMH0sCisgICAgICAgIHswLDgsNDZ9LHswLDksMTg5fSx7MCw4LDE0fSx7MCw4LDE0Mn0sezAsOCw3OH0sezAsOSwyNTN9LHs5Niw3LDB9LAorICAgICAgICB7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSx7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTV9LAorICAgICAgICB7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjN9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LAorICAgICAgICB7MCw5LDIyN30sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sezAsOSwxNDd9LHsxOSw3LDU5fSx7MCw4LDEyMX0sCisgICAgICAgIHswLDgsNTd9LHswLDksMjExfSx7MTcsNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc5fSx7MCw4LDl9LAorICAgICAgICB7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDN9LHsxNiw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sCisgICAgICAgIHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sCisgICAgICAgIHswLDksMTcxfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSx7MCw5LDIzNX0sezE2LDcsOH0sezAsOCw5M30sCisgICAgICAgIHswLDgsMjl9LHswLDksMTU1fSx7MjAsNyw4M30sezAsOCwxMjV9LHswLDgsNjF9LHswLDksMjE5fSx7MTgsNywyM30sCisgICAgICAgIHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4N30sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUxfSwKKyAgICAgICAgezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSx7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LAorICAgICAgICB7MCw5LDE5OX0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKKyAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxNiw3LDd9LHswLDgsOTF9LHswLDgsMjd9LHswLDksMTUxfSx7MjAsNyw2N30sCisgICAgICAgIHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNX0sezE4LDcsMTl9LHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4M30sCisgICAgICAgIHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sCisgICAgICAgIHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sezAsOSwyMDd9LHsxNyw3LDE1fSx7MCw4LDEwM30sCisgICAgICAgIHswLDgsMzl9LHswLDksMTc1fSx7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOX0sezE2LDcsOX0sCisgICAgICAgIHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU5fSx7MjAsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKKyAgICAgICAgezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MX0sezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LAorICAgICAgICB7MCw5LDI1NX0KKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFszMl0gPSB7CisgICAgICAgIHsxNiw1LDF9LHsyMyw1LDI1N30sezE5LDUsMTd9LHsyNyw1LDQwOTd9LHsxNyw1LDV9LHsyNSw1LDEwMjV9LAorICAgICAgICB7MjEsNSw2NX0sezI5LDUsMTYzODV9LHsxNiw1LDN9LHsyNCw1LDUxM30sezIwLDUsMzN9LHsyOCw1LDgxOTN9LAorICAgICAgICB7MTgsNSw5fSx7MjYsNSwyMDQ5fSx7MjIsNSwxMjl9LHs2NCw1LDB9LHsxNiw1LDJ9LHsyMyw1LDM4NX0sCisgICAgICAgIHsxOSw1LDI1fSx7MjcsNSw2MTQ1fSx7MTcsNSw3fSx7MjUsNSwxNTM3fSx7MjEsNSw5N30sezI5LDUsMjQ1Nzd9LAorICAgICAgICB7MTYsNSw0fSx7MjQsNSw3Njl9LHsyMCw1LDQ5fSx7MjgsNSwxMjI4OX0sezE4LDUsMTN9LHsyNiw1LDMwNzN9LAorICAgICAgICB7MjIsNSwxOTN9LHs2NCw1LDB9CisgICAgfTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTczM2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5jCkBAIC0wLDAgKzEsNzg2IEBACisvKiBpbmZsYXRlLmMgLS0gemxpYiBkZWNvbXByZXNzaW9uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNSBNYXJrIEFkbGVyCisgKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCisgKgorICogQmFzZWQgb24gemxpYiAxLjIuMyBidXQgbW9kaWZpZWQgZm9yIHRoZSBMaW51eCBLZXJuZWwgYnkKKyAqIFJpY2hhcmQgUHVyZGllIDxyaWNoYXJkQG9wZW5lZGhhbmQuY29tPgorICoKKyAqIENoYW5nZXMgbWFpbmx5IGZvciBzdGF0aWMgaW5zdGVhZCBvZiBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisjaW5jbHVkZSAiaW5mbGF0ZS5oIgorI2luY2x1ZGUgImluZmZhc3QuaCIKKyNpbmNsdWRlICJpbmZ1dGlsLmgiCisKK2ludCB6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSh2b2lkKQoreworICAgIHJldHVybiBzaXplb2Yoc3RydWN0IGluZmxhdGVfd29ya3NwYWNlKTsKK30KKworaW50IHpsaWJfaW5mbGF0ZVJlc2V0KHpfc3RyZWFtcCBzdHJtKQoreworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKworICAgIGlmIChzdHJtID09IE5VTEwgfHwgc3RybS0+c3RhdGUgPT0gTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7CisgICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOworICAgIHN0cm0tPm1zZyA9IE5VTEw7CisgICAgc3RybS0+YWRsZXIgPSAxOyAgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqLworICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKKyAgICBzdGF0ZS0+bGFzdCA9IDA7CisgICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKKyAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKKyAgICBzdGF0ZS0+aG9sZCA9IDA7CisgICAgc3RhdGUtPmJpdHMgPSAwOworICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisKKyAgICAvKiBJbml0aWFsaXNlIFdpbmRvdyAqLworICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKKyAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgIHN0YXRlLT53aGF2ZSA9IDA7CisKKyAgICByZXR1cm4gWl9PSzsKK30KKworaW50IHpsaWJfaW5mbGF0ZUluaXQyKHpfc3RyZWFtcCBzdHJtLCBpbnQgd2luZG93Qml0cykKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGU7CisKKyAgICBpZiAoc3RybSA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RybS0+bXNnID0gTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCisKKyAgICBzdGF0ZSA9ICZXUyhzdHJtKS0+aW5mbGF0ZV9zdGF0ZTsKKyAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgKilzdGF0ZTsKKworICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeworICAgICAgICBzdGF0ZS0+d3JhcCA9IDA7CisgICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRlLT53cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxOworICAgIH0KKyAgICBpZiAod2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1KSB7CisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgc3RhdGUtPndiaXRzID0gKHVuc2lnbmVkKXdpbmRvd0JpdHM7CisgICAgc3RhdGUtPndpbmRvdyA9ICZXUyhzdHJtKS0+d29ya2luZ193aW5kb3dbMF07CisKKyAgICByZXR1cm4gemxpYl9pbmZsYXRlUmVzZXQoc3RybSk7Cit9CisKKy8qCisgICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCisgICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgVGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCisgKi8KK3N0YXRpYyB2b2lkIHpsaWJfZml4ZWR0YWJsZXMoc3RydWN0IGluZmxhdGVfc3RhdGUgKnN0YXRlKQoreworIyAgIGluY2x1ZGUgImluZmZpeGVkLmgiCisgICAgc3RhdGUtPmxlbmNvZGUgPSBsZW5maXg7CisgICAgc3RhdGUtPmxlbmJpdHMgPSA5OworICAgIHN0YXRlLT5kaXN0Y29kZSA9IGRpc3RmaXg7CisgICAgc3RhdGUtPmRpc3RiaXRzID0gNTsKK30KKworCisvKgorICAgVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZQorICAgcmV0dXJuaW5nLiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4KKyAgIG91dHB1dCBoYXMgYmVlbiB3cml0dGVuIGR1cmluZyB0aGlzIGluZmxhdGUgY2FsbCwgYnV0IHRoZSBlbmQgb2YgdGhlIGRlZmxhdGUKKyAgIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuIEl0IGlzIGFsc28gY2FsbGVkIHRvIHdpbmRvdyBkaWN0aW9uYXJ5IGRhdGEKKyAgIHdoZW4gYSBkaWN0aW9uYXJ5IGlzIGxvYWRlZC4KKworICAgUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZAorICAgYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvdworICAgdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2YKKyAgIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci4KKyAgIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuCisgKi8KK3N0YXRpYyB2b2lkIHpsaWJfdXBkYXRld2luZG93KHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBvdXQpCit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgKnN0YXRlOworICAgIHVuc2lnbmVkIGNvcHksIGRpc3Q7CisKKyAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqKXN0cm0tPnN0YXRlOworCisgICAgLyogY29weSBzdGF0ZS0+d3NpemUgb3IgbGVzcyBvdXRwdXQgYnl0ZXMgaW50byB0aGUgY2lyY3VsYXIgd2luZG93ICovCisgICAgY29weSA9IG91dCAtIHN0cm0tPmF2YWlsX291dDsKKyAgICBpZiAoY29weSA+PSBzdGF0ZS0+d3NpemUpIHsKKyAgICAgICAgbWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPndzaXplLCBzdGF0ZS0+d3NpemUpOworICAgICAgICBzdGF0ZS0+d3JpdGUgPSAwOworICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBkaXN0ID0gc3RhdGUtPndzaXplIC0gc3RhdGUtPndyaXRlOworICAgICAgICBpZiAoZGlzdCA+IGNvcHkpIGRpc3QgPSBjb3B5OworICAgICAgICBtZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53cml0ZSwgc3RybS0+bmV4dF9vdXQgLSBjb3B5LCBkaXN0KTsKKyAgICAgICAgY29weSAtPSBkaXN0OworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgbWVtY3B5KHN0YXRlLT53aW5kb3csIHN0cm0tPm5leHRfb3V0IC0gY29weSwgY29weSk7CisgICAgICAgICAgICBzdGF0ZS0+d3JpdGUgPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgc3RhdGUtPndyaXRlICs9IGRpc3Q7CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyaXRlID09IHN0YXRlLT53c2l6ZSkgc3RhdGUtPndyaXRlID0gMDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpIHN0YXRlLT53aGF2ZSArPSBkaXN0OworICAgICAgICB9CisgICAgfQorfQorCisKKy8qCisgKiBBdCB0aGUgZW5kIG9mIGEgRGVmbGF0ZS1jb21wcmVzc2VkIFBQUCBwYWNrZXQsIHdlIGV4cGVjdCB0byBoYXZlIHNlZW4KKyAqIGEgYHN0b3JlZCcgYmxvY2sgdHlwZSB2YWx1ZSBidXQgbm90IHRoZSAoemVybykgbGVuZ3RoIGJ5dGVzLgorICovCisvKgorICAgUmV0dXJucyB0cnVlIGlmIGluZmxhdGUgaXMgY3VycmVudGx5IGF0IHRoZSBlbmQgb2YgYSBibG9jayBnZW5lcmF0ZWQgYnkKKyAgIFpfU1lOQ19GTFVTSCBvciBaX0ZVTExfRkxVU0guIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBvbmUgUFBQCisgICBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGFuIGFkZGl0aW9uYWwgc2FmZXR5IGNoZWNrLiBQUFAgdXNlcworICAgWl9TWU5DX0ZMVVNIIGJ1dCByZW1vdmVzIHRoZSBsZW5ndGggYnl0ZXMgb2YgdGhlIHJlc3VsdGluZyBlbXB0eSBzdG9yZWQKKyAgIGJsb2NrLiBXaGVuIGRlY29tcHJlc3NpbmcsIFBQUCBjaGVja3MgdGhhdCBhdCB0aGUgZW5kIG9mIGlucHV0IHBhY2tldCwKKyAgIGluZmxhdGUgaXMgd2FpdGluZyBmb3IgdGhlc2UgbGVuZ3RoIGJ5dGVzLgorICovCitzdGF0aWMgaW50IHpsaWJfaW5mbGF0ZVN5bmNQYWNrZXQoel9zdHJlYW1wIHN0cm0pCit7CisgICAgc3RydWN0IGluZmxhdGVfc3RhdGUgKnN0YXRlOworCisgICAgaWYgKHN0cm0gPT0gTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBOVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7CisgICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgKilzdHJtLT5zdGF0ZTsKKworICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBTVE9SRUQgJiYgc3RhdGUtPmJpdHMgPT0gMCkgeworCXN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgcmV0dXJuIFpfT0s7CisgICAgfQorICAgIHJldHVybiBaX0RBVEFfRVJST1I7Cit9CisKKy8qIE1hY3JvcyBmb3IgaW5mbGF0ZSgpOiAqLworCisvKiBjaGVjayBmdW5jdGlvbiB0byB1c2UgYWRsZXIzMigpIGZvciB6bGliIG9yIGNyYzMyKCkgZm9yIGd6aXAgKi8KKyNkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgemxpYl9hZGxlcjMyKGNoZWNrLCBidWYsIGxlbikKKworLyogTG9hZCByZWdpc3RlcnMgd2l0aCBzdGF0ZSBpbiBpbmZsYXRlKCkgZm9yIHNwZWVkICovCisjZGVmaW5lIExPQUQoKSBcCisgICAgZG8geyBcCisgICAgICAgIHB1dCA9IHN0cm0tPm5leHRfb3V0OyBcCisgICAgICAgIGxlZnQgPSBzdHJtLT5hdmFpbF9vdXQ7IFwKKyAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47IFwKKyAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOyBcCisgICAgICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsgXAorICAgICAgICBiaXRzID0gc3RhdGUtPmJpdHM7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBSZXN0b3JlIHN0YXRlIGZyb20gcmVnaXN0ZXJzIGluIGluZmxhdGUoKSAqLworI2RlZmluZSBSRVNUT1JFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBzdHJtLT5uZXh0X291dCA9IHB1dDsgXAorICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBsZWZ0OyBcCisgICAgICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OyBcCisgICAgICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsgXAorICAgICAgICBzdGF0ZS0+aG9sZCA9IGhvbGQ7IFwKKyAgICAgICAgc3RhdGUtPmJpdHMgPSBiaXRzOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogQ2xlYXIgdGhlIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLworI2RlZmluZSBJTklUQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA9IDA7IFwKKyAgICAgICAgYml0cyA9IDA7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBHZXQgYSBieXRlIG9mIGlucHV0IGludG8gdGhlIGJpdCBhY2N1bXVsYXRvciwgb3IgcmV0dXJuIGZyb20gaW5mbGF0ZSgpCisgICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICovCisjZGVmaW5lIFBVTExCWVRFKCkgXAorICAgIGRvIHsgXAorICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsgXAorICAgICAgICBoYXZlLS07IFwKKyAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoKm5leHQrKykgPDwgYml0czsgXAorICAgICAgICBiaXRzICs9IDg7IFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBBc3N1cmUgdGhhdCB0aGVyZSBhcmUgYXQgbGVhc3QgbiBiaXRzIGluIHRoZSBiaXQgYWNjdW11bGF0b3IuICBJZiB0aGVyZSBpcworICAgbm90IGVub3VnaCBhdmFpbGFibGUgaW5wdXQgdG8gZG8gdGhhdCwgdGhlbiByZXR1cm4gZnJvbSBpbmZsYXRlKCkuICovCisjZGVmaW5lIE5FRURCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgd2hpbGUgKGJpdHMgPCAodW5zaWduZWQpKG4pKSBcCisgICAgICAgICAgICBQVUxMQllURSgpOyBcCisgICAgfSB3aGlsZSAoMCkKKworLyogUmV0dXJuIHRoZSBsb3cgbiBiaXRzIG9mIHRoZSBiaXQgYWNjdW11bGF0b3IgKG4gPCAxNikgKi8KKyNkZWZpbmUgQklUUyhuKSBcCisgICAgKCh1bnNpZ25lZClob2xkICYgKCgxVSA8PCAobikpIC0gMSkpCisKKy8qIFJlbW92ZSBuIGJpdHMgZnJvbSB0aGUgYml0IGFjY3VtdWxhdG9yICovCisjZGVmaW5lIERST1BCSVRTKG4pIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gKG4pOyBcCisgICAgICAgIGJpdHMgLT0gKHVuc2lnbmVkKShuKTsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJlbW92ZSB6ZXJvIHRvIHNldmVuIGJpdHMgYXMgbmVlZGVkIHRvIGdvIHRvIGEgYnl0ZSBib3VuZGFyeSAqLworI2RlZmluZSBCWVRFQklUUygpIFwKKyAgICBkbyB7IFwKKyAgICAgICAgaG9sZCA+Pj0gYml0cyAmIDc7IFwKKyAgICAgICAgYml0cyAtPSBiaXRzICYgNzsgXAorICAgIH0gd2hpbGUgKDApCisKKy8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCisjZGVmaW5lIFJFVkVSU0UocSkgXAorICAgICgoKChxKSA+PiAyNCkgJiAweGZmKSArICgoKHEpID4+IDgpICYgMHhmZjAwKSArIFwKKyAgICAgKCgocSkgJiAweGZmMDApIDw8IDgpICsgKCgocSkgJiAweGZmKSA8PCAyNCkpCisKKy8qCisgICBpbmZsYXRlKCkgdXNlcyBhIHN0YXRlIG1hY2hpbmUgdG8gcHJvY2VzcyBhcyBtdWNoIGlucHV0IGRhdGEgYW5kIGdlbmVyYXRlIGFzCisgICBtdWNoIG91dHB1dCBkYXRhIGFzIHBvc3NpYmxlIGJlZm9yZSByZXR1cm5pbmcuICBUaGUgc3RhdGUgbWFjaGluZSBpcworICAgc3RydWN0dXJlZCByb3VnaGx5IGFzIGZvbGxvd3M6CisKKyAgICBmb3IgKDs7KSBzd2l0Y2ggKHN0YXRlKSB7CisgICAgLi4uCisgICAgY2FzZSBTVEFURW46CisgICAgICAgIGlmIChub3QgZW5vdWdoIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlIHRvIG1ha2UgcHJvZ3Jlc3MpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC4uLiBtYWtlIHByb2dyZXNzIC4uLgorICAgICAgICBzdGF0ZSA9IFNUQVRFbTsKKyAgICAgICAgYnJlYWs7CisgICAgLi4uCisgICAgfQorCisgICBzbyB3aGVuIGluZmxhdGUoKSBpcyBjYWxsZWQgYWdhaW4sIHRoZSBzYW1lIGNhc2UgaXMgYXR0ZW1wdGVkIGFnYWluLCBhbmQKKyAgIGlmIHRoZSBhcHByb3ByaWF0ZSByZXNvdXJjZXMgYXJlIHByb3ZpZGVkLCB0aGUgbWFjaGluZSBwcm9jZWVkcyB0byB0aGUKKyAgIG5leHQgc3RhdGUuICBUaGUgTkVFREJJVFMoKSBtYWNybyBpcyB1c3VhbGx5IHRoZSB3YXkgdGhlIHN0YXRlIGV2YWx1YXRlcworICAgd2hldGhlciBpdCBjYW4gcHJvY2VlZCBvciBzaG91bGQgcmV0dXJuLiAgTkVFREJJVFMoKSBkb2VzIHRoZSByZXR1cm4gaWYKKyAgIHRoZSByZXF1ZXN0ZWQgYml0cyBhcmUgbm90IGF2YWlsYWJsZS4gIFRoZSB0eXBpY2FsIHVzZSBvZiB0aGUgQklUUyBtYWNyb3MKKyAgIGlzOgorCisgICAgICAgIE5FRURCSVRTKG4pOworICAgICAgICAuLi4gZG8gc29tZXRoaW5nIHdpdGggQklUUyhuKSAuLi4KKyAgICAgICAgRFJPUEJJVFMobik7CisKKyAgIHdoZXJlIE5FRURCSVRTKG4pIGVpdGhlciByZXR1cm5zIGZyb20gaW5mbGF0ZSgpIGlmIHRoZXJlIGlzbid0IGVub3VnaAorICAgaW5wdXQgbGVmdCB0byBsb2FkIG4gYml0cyBpbnRvIHRoZSBhY2N1bXVsYXRvciwgb3IgaXQgY29udGludWVzLiAgQklUUyhuKQorICAgZ2l2ZXMgdGhlIGxvdyBuIGJpdHMgaW4gdGhlIGFjY3VtdWxhdG9yLiAgV2hlbiBkb25lLCBEUk9QQklUUyhuKSBkcm9wcworICAgdGhlIGxvdyBuIGJpdHMgb2ZmIHRoZSBhY2N1bXVsYXRvci4gIElOSVRCSVRTKCkgY2xlYXJzIHRoZSBhY2N1bXVsYXRvcgorICAgYW5kIHNldHMgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgYml0cyB0byB6ZXJvLiAgQllURUJJVFMoKSBkaXNjYXJkcyBqdXN0CisgICBlbm91Z2ggYml0cyB0byBwdXQgdGhlIGFjY3VtdWxhdG9yIG9uIGEgYnl0ZSBib3VuZGFyeS4gIEFmdGVyIEJZVEVCSVRTKCkKKyAgIGFuZCBhIE5FRURCSVRTKDgpLCB0aGVuIEJJVFMoOCkgd291bGQgcmV0dXJuIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbS4KKworICAgTkVFREJJVFMobikgdXNlcyBQVUxMQllURSgpIHRvIGdldCBhbiBhdmFpbGFibGUgYnl0ZSBvZiBpbnB1dCwgb3IgdG8gcmV0dXJuCisgICBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICBUaGUgZGVjb2Rpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGNvZGVzIHVzZXMKKyAgIFBVTExCWVRFKCkgZGlyZWN0bHkgaW4gb3JkZXIgdG8gcHVsbCBqdXN0IGVub3VnaCBieXRlcyB0byBkZWNvZGUgdGhlIG5leHQKKyAgIGNvZGUsIGFuZCBubyBtb3JlLgorCisgICBTb21lIHN0YXRlcyBsb29wIHVudGlsIHRoZXkgZ2V0IGVub3VnaCBpbnB1dCwgbWFraW5nIHN1cmUgdGhhdCBlbm91Z2gKKyAgIHN0YXRlIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgdG8gY29udGludWUgdGhlIGxvb3Agd2hlcmUgaXQgbGVmdCBvZmYKKyAgIGlmIE5FRURCSVRTKCkgcmV0dXJucyBpbiB0aGUgbG9vcC4gIEZvciBleGFtcGxlLCB3YW50LCBuZWVkLCBhbmQga2VlcAorICAgd291bGQgYWxsIGhhdmUgdG8gYWN0dWFsbHkgYmUgcGFydCBvZiB0aGUgc2F2ZWQgc3RhdGUgaW4gY2FzZSBORUVEQklUUygpCisgICByZXR1cm5zOgorCisgICAgY2FzZSBTVEFURXc6CisgICAgICAgIHdoaWxlICh3YW50IDwgbmVlZCkgeworICAgICAgICAgICAgTkVFREJJVFMobik7CisgICAgICAgICAgICBrZWVwW3dhbnQrK10gPSBCSVRTKG4pOworICAgICAgICAgICAgRFJPUEJJVFMobik7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUgPSBTVEFURXg7CisgICAgY2FzZSBTVEFURXg6CisKKyAgIEFzIHNob3duIGFib3ZlLCBpZiB0aGUgbmV4dCBzdGF0ZSBpcyBhbHNvIHRoZSBuZXh0IGNhc2UsIHRoZW4gdGhlIGJyZWFrCisgICBpcyBvbWl0dGVkLgorCisgICBBIHN0YXRlIG1heSBhbHNvIHJldHVybiBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBhdmFpbGFibGUgdG8KKyAgIGNvbXBsZXRlIHRoYXQgc3RhdGUuICBUaG9zZSBzdGF0ZXMgYXJlIGNvcHlpbmcgc3RvcmVkIGRhdGEsIHdyaXRpbmcgYQorICAgbGl0ZXJhbCBieXRlLCBhbmQgY29weWluZyBhIG1hdGNoaW5nIHN0cmluZy4KKworICAgV2hlbiByZXR1cm5pbmcsIGEgImdvdG8gaW5mX2xlYXZlIiBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgdG90YWwgY291bnRlcnMsCisgICB1cGRhdGUgdGhlIGNoZWNrIHZhbHVlLCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgYW55IHByb2dyZXNzIGhhcyBiZWVuIG1hZGUKKyAgIGR1cmluZyB0aGF0IGluZmxhdGUoKSBjYWxsIGluIG9yZGVyIHRvIHJldHVybiB0aGUgcHJvcGVyIHJldHVybiBjb2RlLgorICAgUHJvZ3Jlc3MgaXMgZGVmaW5lZCBhcyBhIGNoYW5nZSBpbiBlaXRoZXIgc3RybS0+YXZhaWxfaW4gb3Igc3RybS0+YXZhaWxfb3V0LgorICAgV2hlbiB0aGVyZSBpcyBhIHdpbmRvdywgZ290byBpbmZfbGVhdmUgd2lsbCB1cGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0CisgICBvdXRwdXQgd3JpdHRlbi4gIElmIGEgZ290byBpbmZfbGVhdmUgb2NjdXJzIGluIHRoZSBtaWRkbGUgb2YgZGVjb21wcmVzc2lvbgorICAgYW5kIHRoZXJlIGlzIG5vIHdpbmRvdyBjdXJyZW50bHksIGdvdG8gaW5mX2xlYXZlIHdpbGwgY3JlYXRlIG9uZSBhbmQgY29weQorICAgb3V0cHV0IHRvIHRoZSB3aW5kb3cgZm9yIHRoZSBuZXh0IGNhbGwgb2YgaW5mbGF0ZSgpLgorCisgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCB0aGUgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKSBvbmx5IGFmZmVjdHMgdGhlCisgICByZXR1cm4gY29kZSAocGVyIHpsaWIuaCkuICBpbmZsYXRlKCkgYWx3YXlzIHdyaXRlcyBhcyBtdWNoIGFzIHBvc3NpYmxlIHRvCisgICBzdHJtLT5uZXh0X291dCwgZ2l2ZW4gdGhlIHNwYWNlIGF2YWlsYWJsZSBhbmQgdGhlIHByb3ZpZGVkIGlucHV0LS10aGUgZWZmZWN0CisgICBkb2N1bWVudGVkIGluIHpsaWIuaCBvZiBaX1NZTkNfRkxVU0guICBGdXJ0aGVybW9yZSwgaW5mbGF0ZSgpIGFsd2F5cyBkZWZlcnMKKyAgIHRoZSBhbGxvY2F0aW9uIG9mIGFuZCBjb3B5aW5nIGludG8gYSBzbGlkaW5nIHdpbmRvdyB1bnRpbCBuZWNlc3NhcnksIHdoaWNoCisgICBwcm92aWRlcyB0aGUgZWZmZWN0IGRvY3VtZW50ZWQgaW4gemxpYi5oIGZvciBaX0ZJTklTSCB3aGVuIHRoZSBlbnRpcmUgaW5wdXQKKyAgIHN0cmVhbSBhdmFpbGFibGUuICBTbyB0aGUgb25seSB0aGluZyB0aGUgZmx1c2ggcGFyYW1ldGVyIGFjdHVhbGx5IGRvZXMgaXM6CisgICB3aGVuIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgaW5mbGF0ZSgpIGNhbm5vdCByZXR1cm4gWl9PSy4gIEluc3RlYWQgaXQKKyAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIGl0IGhhcyBub3QgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCisgKi8KKworaW50IHpsaWJfaW5mbGF0ZSh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKQoreworICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlICpzdGF0ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpuZXh0OyAgLyogbmV4dCBpbnB1dCAqLworICAgIHVuc2lnbmVkIGNoYXIgKnB1dDsgICAgICAgICAvKiBuZXh0IG91dHB1dCAqLworICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLworICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworICAgIHVuc2lnbmVkIGluLCBvdXQ7ICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgdW5zaWduZWQgY29weTsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdG9yZWQgb3IgbWF0Y2ggYnl0ZXMgdG8gY29weSAqLworICAgIHVuc2lnbmVkIGNoYXIgKmZyb207ICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGJ5dGVzIGZyb20gKi8KKyAgICBjb2RlIHRoaXM7ICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBkZWNvZGluZyB0YWJsZSBlbnRyeSAqLworICAgIGNvZGUgbGFzdDsgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi8KKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbGVuZ3RoIHRvIGNvcHkgZm9yIHJlcGVhdHMsIGJpdHMgdG8gZHJvcCAqLworICAgIGludCByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KKyAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OworCisgICAgLyogRG8gbm90IGNoZWNrIGZvciBzdHJtLT5uZXh0X291dCA9PSBOVUxMIGhlcmUgYXMgcHBjIHpJbWFnZQorICAgICAgIGluZmxhdGVzIHRvIHN0cm0tPm5leHRfb3V0ID0gMCAqLworCisgICAgaWYgKHN0cm0gPT0gTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBOVUxMIHx8CisgICAgICAgIChzdHJtLT5uZXh0X2luID09IE5VTEwgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKworICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlICopc3RybS0+c3RhdGU7CisKKyAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkgc3RhdGUtPm1vZGUgPSBUWVBFRE87ICAgICAgLyogc2tpcCBjaGVjayAqLworICAgIExPQUQoKTsKKyAgICBpbiA9IGhhdmU7CisgICAgb3V0ID0gbGVmdDsKKyAgICByZXQgPSBaX09LOworICAgIGZvciAoOzspCisgICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKKyAgICAgICAgY2FzZSBIRUFEOgorICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEVETzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAoKEJJVFMoOCkgPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEJJVFMoNCkgIT0gWl9ERUZMQVRFRCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKDQpOworICAgICAgICAgICAgbGVuID0gQklUUyg0KSArIDg7CisgICAgICAgICAgICBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCB3aW5kb3cgc2l6ZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZG1heCA9IDFVIDw8IGxlbjsKKyAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gemxpYl9hZGxlcjMyKDBMLCBOVUxMLCAwKTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gaG9sZCAmIDB4MjAwID8gRElDVElEIDogVFlQRTsKKyAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBESUNUSUQ6CisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9IFJFVkVSU0UoaG9sZCk7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESUNUOworICAgICAgICBjYXNlIERJQ1Q6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmVkaWN0ID09IDApIHsKKyAgICAgICAgICAgICAgICBSRVNUT1JFKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSB6bGliX2FkbGVyMzIoMEwsIE5VTEwsIDApOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOworICAgICAgICBjYXNlIFRZUEU6CisgICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9CTE9DSykgZ290byBpbmZfbGVhdmU7CisgICAgICAgIGNhc2UgVFlQRURPOgorICAgICAgICAgICAgaWYgKHN0YXRlLT5sYXN0KSB7CisgICAgICAgICAgICAgICAgQllURUJJVFMoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENIRUNLOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTkVFREJJVFMoMyk7CisgICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7CisgICAgICAgICAgICBEUk9QQklUUygxKTsKKyAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgeworICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLworICAgICAgICAgICAgICAgIHpsaWJfZml4ZWR0YWJsZXMoc3RhdGUpOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOyAgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGJsb2NrICovCisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUQUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9SRUQ6CisgICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7CisgICAgICAgICAgICBJTklUQklUUygpOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZOworICAgICAgICBjYXNlIENPUFk6CisgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKKyAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgICAgIGlmIChjb3B5ID09IDApIGdvdG8gaW5mX2xlYXZlOworICAgICAgICAgICAgICAgIG1lbWNweShwdXQsIG5leHQsIGNvcHkpOworICAgICAgICAgICAgICAgIGhhdmUgLT0gY29weTsKKyAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7CisgICAgICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgICAgIHB1dCArPSBjb3B5OworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFRBQkxFOgorICAgICAgICAgICAgTkVFREJJVFMoMTQpOworICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OworICAgICAgICAgICAgRFJPUEJJVFMoNSk7CisgICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKKyAgICAgICAgICAgIERST1BCSVRTKDUpOworICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7CisgICAgICAgICAgICBEUk9QQklUUyg0KTsKKyNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5MRU5TOworICAgICAgICBjYXNlIExFTkxFTlM6CisgICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQorICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvZGUgY29uc3QgKikoc3RhdGUtPm5leHQpOworICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA3OworICAgICAgICAgICAgcmV0ID0gemxpYl9pbmZsYXRlX3RhYmxlKENPREVTLCBzdGF0ZS0+bGVucywgMTksICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgY29kZSBsZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPREVMRU5TOworICAgICAgICBjYXNlIENPREVMRU5TOgorICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbCA8IDE2KSB7CisgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gdGhpcy52YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWwgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52YWwgPT0gMTcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKHRoaXMuYml0cyArIDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFModGhpcy5iaXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOworICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KKyAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOworCisgICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAqLworICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7CisgICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0ICopKHN0YXRlLT5uZXh0KTsKKyAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKKyAgICAgICAgICAgIHJldCA9IHpsaWJfaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgc3RhdGUtPm5sZW4sICYoc3RhdGUtPm5leHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0YXRlLT5sZW5iaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGhzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGNvZGUgPSAoY29kZSBjb25zdCAqKShzdGF0ZS0+bmV4dCk7CisgICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OworICAgICAgICAgICAgcmV0ID0gemxpYl9pbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOworICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsKKyAgICAgICAgY2FzZSBMRU46CisgICAgICAgICAgICBpZiAoaGF2ZSA+PSA2ICYmIGxlZnQgPj0gMjU4KSB7CisgICAgICAgICAgICAgICAgUkVTVE9SRSgpOworICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBvdXQpOworICAgICAgICAgICAgICAgIExPQUQoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOworICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYmICh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5sZW5jb2RlW2xhc3QudmFsICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgdGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERST1BCSVRTKHRoaXMuYml0cyk7CisgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgaWYgKChpbnQpKHRoaXMub3ApID09IDApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExJVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLm9wICYgMzIpIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy5vcCAmIDY0KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aCBjb2RlIjsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkodGhpcy5vcCkgJiAxNTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVORVhUOworICAgICAgICBjYXNlIExFTkVYVDoKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEpIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERJU1Q7CisgICAgICAgIGNhc2UgRElTVDoKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICB0aGlzID0gc3RhdGUtPmRpc3Rjb2RlW0JJVFMoc3RhdGUtPmRpc3RiaXRzKV07CisgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkodGhpcy5iaXRzKSA8PSBiaXRzKSBicmVhazsKKyAgICAgICAgICAgICAgICBQVUxMQllURSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh0aGlzLm9wICYgMHhmMCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3QgPSB0aGlzOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHN0YXRlLT5kaXN0Y29kZVtsYXN0LnZhbCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkgPj4gbGFzdC5iaXRzKV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGxhc3QuYml0cyArIHRoaXMuYml0cykgPD0gYml0cykgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERST1BCSVRTKGxhc3QuYml0cyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEUk9QQklUUyh0aGlzLmJpdHMpOworICAgICAgICAgICAgaWYgKHRoaXMub3AgJiA2NCkgeworICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKXRoaXMudmFsOworICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKSh0aGlzLm9wKSAmIDE1OworICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNURVhUOworICAgICAgICBjYXNlIERJU1RFWFQ6CisgICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7CisgICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKKyAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOworICAgICAgICAgICAgfQorI2lmZGVmIElORkxBVEVfU1RSSUNUCisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT5kbWF4KSB7CisgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOworICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IHN0YXRlLT53aGF2ZSArIG91dCAtIGxlZnQpIHsKKyAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE1BVENIOworICAgICAgICBjYXNlIE1BVENIOgorICAgICAgICAgICAgaWYgKGxlZnQgPT0gMCkgZ290byBpbmZfbGVhdmU7CisgICAgICAgICAgICBjb3B5ID0gb3V0IC0gbGVmdDsKKyAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gY29weSkgeyAgICAgICAgIC8qIGNvcHkgZnJvbSB3aW5kb3cgKi8KKyAgICAgICAgICAgICAgICBjb3B5ID0gc3RhdGUtPm9mZnNldCAtIGNvcHk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d3JpdGU7CisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53cml0ZSAtIGNvcHkpOworICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovCisgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7CisgICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OworICAgICAgICAgICAgbGVmdCAtPSBjb3B5OworICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7CisgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOworICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMSVQ6CisgICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKKyAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKKyAgICAgICAgICAgIGxlZnQtLTsKKyAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0hFQ0s6CisgICAgICAgICAgICBpZiAoc3RhdGUtPndyYXApIHsKKyAgICAgICAgICAgICAgICBORUVEQklUUygzMik7CisgICAgICAgICAgICAgICAgb3V0IC09IGxlZnQ7CisgICAgICAgICAgICAgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OworICAgICAgICAgICAgICAgIGlmIChvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHB1dCAtIG91dCwgb3V0KTsKKyAgICAgICAgICAgICAgICBvdXQgPSBsZWZ0OworICAgICAgICAgICAgICAgIGlmICgoCisgICAgICAgICAgICAgICAgICAgICBSRVZFUlNFKGhvbGQpKSAhPSBzdGF0ZS0+Y2hlY2spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGRhdGEgY2hlY2siOworICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7CisgICAgICAgIGNhc2UgRE9ORToKKyAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIEJBRDoKKyAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKKyAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOworICAgICAgICBjYXNlIE1FTToKKyAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKKyAgICAgICAgY2FzZSBTWU5DOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOworICAgICAgICB9CisKKyAgICAvKgorICAgICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLgorICAgICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXIKKyAgICAgICBlcnJvci4gIENhbGwgemxpYl91cGRhdGV3aW5kb3coKSB0byBjcmVhdGUgYW5kL29yIHVwZGF0ZSB0aGUgd2luZG93IHN0YXRlLgorICAgICAqLworICBpbmZfbGVhdmU6CisgICAgUkVTVE9SRSgpOworICAgIGlmIChzdGF0ZS0+d3NpemUgfHwgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgJiYgb3V0ICE9IHN0cm0tPmF2YWlsX291dCkpCisgICAgICAgIHpsaWJfdXBkYXRld2luZG93KHN0cm0sIG91dCk7CisKKyAgICBpbiAtPSBzdHJtLT5hdmFpbF9pbjsKKyAgICBvdXQgLT0gc3RybS0+YXZhaWxfb3V0OworICAgIHN0cm0tPnRvdGFsX2luICs9IGluOworICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7CisgICAgc3RhdGUtPnRvdGFsICs9IG91dDsKKyAgICBpZiAoc3RhdGUtPndyYXAgJiYgb3V0KQorICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9CisgICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBzdHJtLT5uZXh0X291dCAtIG91dCwgb3V0KTsKKworICAgIHN0cm0tPmRhdGFfdHlwZSA9IHN0YXRlLT5iaXRzICsgKHN0YXRlLT5sYXN0ID8gNjQgOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlLT5tb2RlID09IFRZUEUgPyAxMjggOiAwKTsKKworICAgIGlmIChmbHVzaCA9PSBaX1BBQ0tFVF9GTFVTSCAmJiByZXQgPT0gWl9PSyAmJgorICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ICE9IDAgJiYgc3RybS0+YXZhaWxfaW4gPT0gMCkKKwkJcmV0dXJuIHpsaWJfaW5mbGF0ZVN5bmNQYWNrZXQoc3RybSk7CisKKyAgICBpZiAoKChpbiA9PSAwICYmIG91dCA9PSAwKSB8fCBmbHVzaCA9PSBaX0ZJTklTSCkgJiYgcmV0ID09IFpfT0spCisgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOworCisgICAgcmV0dXJuIHJldDsKK30KKworaW50IHpsaWJfaW5mbGF0ZUVuZCh6X3N0cmVhbXAgc3RybSkKK3sKKyAgICBpZiAoc3RybSA9PSBOVUxMIHx8IHN0cm0tPnN0YXRlID09IE5VTEwpCisgICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKKyAgICByZXR1cm4gWl9PSzsKK30KKworLyoKKyAqIFRoaXMgc3Vicm91dGluZSBhZGRzIHRoZSBkYXRhIGF0IG5leHRfaW4vYXZhaWxfaW4gdG8gdGhlIG91dHB1dCBoaXN0b3J5CisgKiB3aXRob3V0IHBlcmZvcm1pbmcgYW55IG91dHB1dC4gIFRoZSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgImNhdWdodCB1cCI7CisgKiBpLmUuIG5vIHBlbmRpbmcgb3V0cHV0IGJ1dCB0aGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIGNhc2UuIFRoZSBzdGF0ZSBtdXN0CisgKiBiZSB3YWl0aW5nIG9uIHRoZSBzdGFydCBvZiBhIGJsb2NrIChpLmUuIG1vZGUgPT0gVFlQRSBvciBIRUFEKS4gIE9uIGV4aXQsCisgKiB0aGUgb3V0cHV0IHdpbGwgYWxzbyBiZSBjYXVnaHQgdXAsIGFuZCB0aGUgY2hlY2tzdW0gd2lsbCBoYXZlIGJlZW4gdXBkYXRlZAorICogaWYgbmVlZCBiZS4KKyAqLworaW50IHpsaWJfaW5mbGF0ZUluY29tcCh6X3N0cmVhbSAqeikKK3sKKyAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgKil6LT5zdGF0ZTsKKyAgICBCeXRlICpzYXZlZF9ubyA9IHotPm5leHRfb3V0OworICAgIHVJbnQgc2F2ZWRfYW8gPSB6LT5hdmFpbF9vdXQ7CisKKyAgICBpZiAoc3RhdGUtPm1vZGUgIT0gVFlQRSAmJiBzdGF0ZS0+bW9kZSAhPSBIRUFEKQorCXJldHVybiBaX0RBVEFfRVJST1I7CisKKyAgICAvKiBTZXR1cCBzb21lIHZhcmlhYmxlcyB0byBhbGxvdyBtaXN1c2Ugb2YgdXBkYXRlV2luZG93ICovCisgICAgei0+YXZhaWxfb3V0ID0gMDsKKyAgICB6LT5uZXh0X291dCA9ICh1bnNpZ25lZCBjaGFyKil6LT5uZXh0X2luICsgei0+YXZhaWxfaW47CisKKyAgICB6bGliX3VwZGF0ZXdpbmRvdyh6LCB6LT5hdmFpbF9pbik7CisKKyAgICAvKiBSZXN0b3JlIHNhdmVkIHZhcmlhYmxlcyAqLworICAgIHotPmF2YWlsX291dCA9IHNhdmVkX2FvOworICAgIHotPm5leHRfb3V0ID0gc2F2ZWRfbm87CisKKyAgICB6LT5hZGxlciA9IHN0YXRlLT5jaGVjayA9CisgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHotPm5leHRfaW4sIHotPmF2YWlsX2luKTsKKworICAgIHotPnRvdGFsX291dCArPSB6LT5hdmFpbF9pbjsKKyAgICB6LT50b3RhbF9pbiArPSB6LT5hdmFpbF9pbjsKKyAgICB6LT5uZXh0X2luICs9IHotPmF2YWlsX2luOworICAgIHN0YXRlLT50b3RhbCArPSB6LT5hdmFpbF9pbjsKKyAgICB6LT5hdmFpbF9pbiA9IDA7CisKKyAgICByZXR1cm4gWl9PSzsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTdiM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZS5oCkBAIC0wLDAgKzEsMTExIEBACisjaWZuZGVmIElORkxBVEVfSAorI2RlZmluZSBJTkZMQVRFX0gKKworLyogaW5mbGF0ZS5oIC0tIGludGVybmFsIGluZmxhdGUgc3RhdGUgZGVmaW5pdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDQgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBQb3NzaWJsZSBpbmZsYXRlIG1vZGVzIGJldHdlZW4gaW5mbGF0ZSgpIGNhbGxzICovCit0eXBlZGVmIGVudW0geworICAgIEhFQUQsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqLworICAgIEZMQUdTLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1ldGhvZCBhbmQgZmxhZ3MgKGd6aXApICovCisgICAgVElNRSwgICAgICAgLyogaTogd2FpdGluZyBmb3IgbW9kaWZpY2F0aW9uIHRpbWUgKGd6aXApICovCisgICAgT1MsICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovCisgICAgRVhMRU4sICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgbGVuZ3RoIChnemlwKSAqLworICAgIEVYVFJBLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGJ5dGVzIChnemlwKSAqLworICAgIE5BTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovCisgICAgQ09NTUVOVCwgICAgLyogaTogd2FpdGluZyBmb3IgZW5kIG9mIGNvbW1lbnQgKGd6aXApICovCisgICAgSENSQywgICAgICAgLyogaTogd2FpdGluZyBmb3IgaGVhZGVyIGNyYyAoZ3ppcCkgKi8KKyAgICBESUNUSUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovCisgICAgRElDVCwgICAgICAgLyogd2FpdGluZyBmb3IgaW5mbGF0ZVNldERpY3Rpb25hcnkoKSBjYWxsICovCisgICAgICAgIFRZUEUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIHR5cGUgYml0cywgaW5jbHVkaW5nIGxhc3QtZmxhZyBiaXQgKi8KKyAgICAgICAgVFlQRURPLCAgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqLworICAgICAgICBTVE9SRUQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBzdG9yZWQgc2l6ZSAobGVuZ3RoIGFuZCBjb21wbGVtZW50KSAqLworICAgICAgICBDT1BZLCAgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqLworICAgICAgICBUQUJMRSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBkeW5hbWljIGJsb2NrIHRhYmxlIGxlbmd0aHMgKi8KKyAgICAgICAgTEVOTEVOUywgICAgLyogaTogd2FpdGluZyBmb3IgY29kZSBsZW5ndGggY29kZSBsZW5ndGhzICovCisgICAgICAgIENPREVMRU5TLCAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgICAgICAgICAgTEVOLCAgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdCBjb2RlICovCisgICAgICAgICAgICBMRU5FWFQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqLworICAgICAgICAgICAgRElTVCwgICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqLworICAgICAgICAgICAgRElTVEVYVCwgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqLworICAgICAgICAgICAgTUFUQ0gsICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovCisgICAgICAgICAgICBMSVQsICAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqLworICAgIENIRUNLLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqLworICAgIExFTkdUSCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovCisgICAgRE9ORSwgICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBCQUQsICAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCisgICAgTUVNLCAgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KKyAgICBTWU5DICAgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi8KK30gaW5mbGF0ZV9tb2RlOworCisvKgorICAgIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gYWJvdmUgbW9kZXMgLQorCisgICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIHRoZSBCQUQgb3IgTUVNIG1vZGUgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQorCisgICAgUHJvY2VzcyBoZWFkZXI6CisgICAgICAgIEhFQUQgLT4gKGd6aXApIG9yICh6bGliKQorICAgICAgICAoZ3ppcCkgLT4gRkxBR1MgLT4gVElNRSAtPiBPUyAtPiBFWExFTiAtPiBFWFRSQSAtPiBOQU1FCisgICAgICAgIE5BTUUgLT4gQ09NTUVOVCAtPiBIQ1JDIC0+IFRZUEUKKyAgICAgICAgKHpsaWIpIC0+IERJQ1RJRCBvciBUWVBFCisgICAgICAgIERJQ1RJRCAtPiBESUNUIC0+IFRZUEUKKyAgICBSZWFkIGRlZmxhdGUgYmxvY2tzOgorICAgICAgICAgICAgVFlQRSAtPiBTVE9SRUQgb3IgVEFCTEUgb3IgTEVOIG9yIENIRUNLCisgICAgICAgICAgICBTVE9SRUQgLT4gQ09QWSAtPiBUWVBFCisgICAgICAgICAgICBUQUJMRSAtPiBMRU5MRU5TIC0+IENPREVMRU5TIC0+IExFTgorICAgIFJlYWQgZGVmbGF0ZSBjb2RlczoKKyAgICAgICAgICAgICAgICBMRU4gLT4gTEVORVhUIG9yIExJVCBvciBUWVBFCisgICAgICAgICAgICAgICAgTEVORVhUIC0+IERJU1QgLT4gRElTVEVYVCAtPiBNQVRDSCAtPiBMRU4KKyAgICAgICAgICAgICAgICBMSVQgLT4gTEVOCisgICAgUHJvY2VzcyB0cmFpbGVyOgorICAgICAgICBDSEVDSyAtPiBMRU5HVEggLT4gRE9ORQorICovCisKKy8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDdLIGJ5dGVzLiAqLworc3RydWN0IGluZmxhdGVfc3RhdGUgeworICAgIGluZmxhdGVfbW9kZSBtb2RlOyAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqLworICAgIGludCBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiB0cnVlIGlmIHByb2Nlc3NpbmcgbGFzdCBibG9jayAqLworICAgIGludCB3cmFwOyAgICAgICAgICAgICAgICAgICAvKiBiaXQgMCB0cnVlIGZvciB6bGliLCBiaXQgMSB0cnVlIGZvciBnemlwICovCisgICAgaW50IGhhdmVkaWN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqLworICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAvKiBnemlwIGhlYWRlciBtZXRob2QgYW5kIGZsYWdzICgwIGlmIHpsaWIpICovCisgICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIHpsaWIgaGVhZGVyIG1heCBkaXN0YW5jZSAoSU5GTEFURV9TVFJJQ1QpICovCisgICAgdW5zaWduZWQgbG9uZyBjaGVjazsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovCisgICAgdW5zaWduZWQgbG9uZyB0b3RhbDsgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIG91dHB1dCBjb3VudCAqLworIC8qICAgZ3pfaGVhZGVycCBoZWFkOyAqLyAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqLworICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdiaXRzOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqLworICAgIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi8KKyAgICB1bnNpZ25lZCB3aGF2ZTsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqLworICAgIHVuc2lnbmVkIHdyaXRlOyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBjaGFyICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIG5lZWRlZCAqLworICAgICAgICAvKiBiaXQgYWNjdW11bGF0b3IgKi8KKyAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCisgICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluICJpbiIgKi8KKyAgICAgICAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi8KKyAgICB1bnNpZ25lZCBsZW5ndGg7ICAgICAgICAgICAgLyogbGl0ZXJhbCBvciBsZW5ndGggb2YgZGF0YSB0byBjb3B5ICovCisgICAgdW5zaWduZWQgb2Zmc2V0OyAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgdG8gY29weSBzdHJpbmcgZnJvbSAqLworICAgICAgICAvKiBmb3IgdGFibGUgYW5kIGNvZGUgZGVjb2RpbmcgKi8KKyAgICB1bnNpZ25lZCBleHRyYTsgICAgICAgICAgICAgLyogZXh0cmEgYml0cyBuZWVkZWQgKi8KKyAgICAgICAgLyogZml4ZWQgYW5kIGR5bmFtaWMgY29kZSB0YWJsZXMgKi8KKyAgICBjb2RlIGNvbnN0ICpsZW5jb2RlOyAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKi8KKyAgICBjb2RlIGNvbnN0ICpkaXN0Y29kZTsgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KKyAgICB1bnNpZ25lZCBsZW5iaXRzOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqLworICAgIHVuc2lnbmVkIGRpc3RiaXRzOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqLworICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovCisgICAgdW5zaWduZWQgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBubGVuOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KKyAgICB1bnNpZ25lZCBuZGlzdDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqLworICAgIGNvZGUgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIGNvZGVzW10gKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBsZW5zWzMyMF07ICAgLyogdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvZGUgbGVuZ3RocyAqLworICAgIHVuc2lnbmVkIHNob3J0IHdvcmtbMjg4XTsgICAvKiB3b3JrIGFyZWEgZm9yIGNvZGUgdGFibGUgYnVpbGRpbmcgKi8KKyAgICBjb2RlIGNvZGVzW0VOT1VHSF07ICAgICAgICAgLyogc3BhY2UgZm9yIGNvZGUgdGFibGVzICovCit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZV9zeW1zLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mbGF0ZV9zeW1zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczMjlmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bXMuYwpAQCAtMCwwICsxLDIwIEBACisvKgorICogbGludXgvbGliL3psaWJfaW5mbGF0ZS9pbmZsYXRlX3N5bXMuYworICoKKyAqIEV4cG9ydGVkIHN5bWJvbHMgZm9yIHRoZSBpbmZsYXRlIGZ1bmN0aW9uYWxpdHkuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC96bGliLmg+CisKK0VYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlX3dvcmtzcGFjZXNpemUpOworRVhQT1JUX1NZTUJPTCh6bGliX2luZmxhdGUpOworRVhQT1JUX1NZTUJPTCh6bGliX2luZmxhdGVJbml0Mik7CitFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZUVuZCk7CitFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZVJlc2V0KTsKK0VYUE9SVF9TWU1CT0woemxpYl9pbmZsYXRlSW5jb21wKTsgCitFWFBPUlRfU1lNQk9MKHpsaWJfaW5mbGF0ZV9ibG9iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZ0cmVlcy5jIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZnRyZWVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI4OTQzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZ0cmVlcy5jCkBAIC0wLDAgKzEsMzE1IEBACisvKiBpbmZ0cmVlcy5jIC0tIGdlbmVyYXRlIEh1ZmZtYW4gdHJlZXMgZm9yIGVmZmljaWVudCBkZWNvZGluZworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKyNpbmNsdWRlIDxsaW51eC96dXRpbC5oPgorI2luY2x1ZGUgImluZnRyZWVzLmgiCisKKyNkZWZpbmUgTUFYQklUUyAxNQorCisvKgorICAgQnVpbGQgYSBzZXQgb2YgdGFibGVzIHRvIGRlY29kZSB0aGUgcHJvdmlkZWQgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4KKyAgIFRoZSBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBUaGUgcmVzdWx0IHN0YXJ0cyBhdCAqdGFibGUsCisgICB3aG9zZSBpbmRpY2VzIGFyZSAwLi4yXmJpdHMtMS4gIHdvcmsgaXMgYSB3cml0YWJsZSBhcnJheSBvZiBhdCBsZWFzdAorICAgbGVucyBzaG9ydHMsIHdoaWNoIGlzIHVzZWQgYXMgYSB3b3JrIGFyZWEuICB0eXBlIGlzIHRoZSB0eXBlIG9mIGNvZGUKKyAgIHRvIGJlIGdlbmVyYXRlZCwgQ09ERVMsIExFTlMsIG9yIERJU1RTLiAgT24gcmV0dXJuLCB6ZXJvIGlzIHN1Y2Nlc3MsCisgICAtMSBpcyBhbiBpbnZhbGlkIGNvZGUsIGFuZCArMSBtZWFucyB0aGF0IEVOT1VHSCBpc24ndCBlbm91Z2guICB0YWJsZQorICAgb24gcmV0dXJuIHBvaW50cyB0byB0aGUgbmV4dCBhdmFpbGFibGUgZW50cnkncyBhZGRyZXNzLiAgYml0cyBpcyB0aGUKKyAgIHJlcXVlc3RlZCByb290IHRhYmxlIGluZGV4IGJpdHMsIGFuZCBvbiByZXR1cm4gaXQgaXMgdGhlIGFjdHVhbCByb290CisgICB0YWJsZSBpbmRleCBiaXRzLiAgSXQgd2lsbCBkaWZmZXIgaWYgdGhlIHJlcXVlc3QgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAgbG9uZ2VzdCBjb2RlIG9yIGlmIGl0IGlzIGxlc3MgdGhhbiB0aGUgc2hvcnRlc3QgY29kZS4KKyAqLworaW50IHpsaWJfaW5mbGF0ZV90YWJsZShjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCAqbGVucywgdW5zaWduZWQgY29kZXMsCisJCQljb2RlICoqdGFibGUsIHVuc2lnbmVkICpiaXRzLCB1bnNpZ25lZCBzaG9ydCAqd29yaykKK3sKKyAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi8KKyAgICB1bnNpZ25lZCBzeW07ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovCisgICAgdW5zaWduZWQgbWluLCBtYXg7ICAgICAgICAgIC8qIG1pbmltdW0gYW5kIG1heGltdW0gY29kZSBsZW5ndGhzICovCisgICAgdW5zaWduZWQgcm9vdDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciByb290IHRhYmxlICovCisgICAgdW5zaWduZWQgY3VycjsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciBjdXJyZW50IHRhYmxlICovCisgICAgdW5zaWduZWQgZHJvcDsgICAgICAgICAgICAgIC8qIGNvZGUgYml0cyB0byBkcm9wIGZvciBzdWItdGFibGUgKi8KKyAgICBpbnQgbGVmdDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi8KKyAgICB1bnNpZ25lZCB1c2VkOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi8KKyAgICB1bnNpZ25lZCBodWZmOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovCisgICAgdW5zaWduZWQgaW5jcjsgICAgICAgICAgICAgIC8qIGZvciBpbmNyZW1lbnRpbmcgY29kZSwgaW5kZXggKi8KKyAgICB1bnNpZ25lZCBmaWxsOyAgICAgICAgICAgICAgLyogaW5kZXggZm9yIHJlcGxpY2F0aW5nIGVudHJpZXMgKi8KKyAgICB1bnNpZ25lZCBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqLworICAgIHVuc2lnbmVkIG1hc2s7ICAgICAgICAgICAgICAvKiBtYXNrIGZvciBsb3cgcm9vdCBiaXRzICovCisgICAgY29kZSB0aGlzOyAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGVudHJ5IGZvciBkdXBsaWNhdGlvbiAqLworICAgIGNvZGUgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgKmJhc2U7ICAgICAvKiBiYXNlIHZhbHVlIHRhYmxlIHRvIHVzZSAqLworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0ICpleHRyYTsgICAgLyogZXh0cmEgYml0cyB0YWJsZSB0byB1c2UgKi8KKyAgICBpbnQgZW5kOyAgICAgICAgICAgICAgICAgICAgLyogdXNlIGJhc2UgYW5kIGV4dHJhIGZvciBzeW1ib2wgPiBlbmQgKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBjb3VudFtNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi8KKyAgICB1bnNpZ25lZCBzaG9ydCBvZmZzW01BWEJJVFMrMV07ICAgICAvKiBvZmZzZXRzIGluIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsYmFzZVszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovCisgICAgICAgIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsCisgICAgICAgIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgbGV4dFszMV0gPSB7IC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBleHRyYSAqLworICAgICAgICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE3LCAxNywgMTcsIDE3LCAxOCwgMTgsIDE4LCAxOCwKKyAgICAgICAgMTksIDE5LCAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMTYsIDIwMSwgMTk2fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGJhc2VbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKKyAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAorICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV4dFszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovCisgICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLAorICAgICAgICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNywKKyAgICAgICAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NH07CisKKyAgICAvKgorICAgICAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGUKKyAgICAgICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZQorICAgICAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyCisgICAgICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0cworICAgICAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyCisgICAgICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGgKKyAgICAgICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzCisgICAgICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZQorICAgICAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzCisgICAgICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy4KKworICAgICAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluCisgICAgICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy4KKyAgICAgICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdAorICAgICAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuCisKKyAgICAgICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsCisgICAgICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlCisgICAgICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkCisgICAgICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5CisgICAgICAgdGhlIGNhbGxlci4KKworICAgICAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmcKKyAgICAgICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZAorICAgICAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZQorICAgICAgIGRlY29kaW5nIHRhYmxlcy4KKyAgICAgKi8KKworICAgIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqLworICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQorICAgICAgICBjb3VudFtsZW5dID0gMDsKKyAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKKyAgICAgICAgY291bnRbbGVuc1tzeW1dXSsrOworCisgICAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi8KKyAgICByb290ID0gKmJpdHM7CisgICAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pCisgICAgICAgIGlmIChjb3VudFttYXhdICE9IDApIGJyZWFrOworICAgIGlmIChyb290ID4gbWF4KSByb290ID0gbWF4OworICAgIGlmIChtYXggPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi8KKyAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCisgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKTE7CisgICAgICAgIHRoaXMudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7CisgICAgICAgICooKnRhYmxlKSsrID0gdGhpczsgICAgICAgICAgICAgLyogbWFrZSBhIHRhYmxlIHRvIGZvcmNlIGFuIGVycm9yICovCisgICAgICAgICooKnRhYmxlKSsrID0gdGhpczsKKyAgICAgICAgKmJpdHMgPSAxOworICAgICAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi8KKyAgICB9CisgICAgZm9yIChtaW4gPSAxOyBtaW4gPCBNQVhCSVRTOyBtaW4rKykKKyAgICAgICAgaWYgKGNvdW50W21pbl0gIT0gMCkgYnJlYWs7CisgICAgaWYgKHJvb3QgPCBtaW4pIHJvb3QgPSBtaW47CisKKyAgICAvKiBjaGVjayBmb3IgYW4gb3Zlci1zdWJzY3JpYmVkIG9yIGluY29tcGxldGUgc2V0IG9mIGxlbmd0aHMgKi8KKyAgICBsZWZ0ID0gMTsKKyAgICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykgeworICAgICAgICBsZWZ0IDw8PSAxOworICAgICAgICBsZWZ0IC09IGNvdW50W2xlbl07CisgICAgICAgIGlmIChsZWZ0IDwgMCkgcmV0dXJuIC0xOyAgICAgICAgLyogb3Zlci1zdWJzY3JpYmVkICovCisgICAgfQorICAgIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PSBDT0RFUyB8fCBtYXggIT0gMSkpCisgICAgICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi8KKworICAgIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovCisgICAgb2Zmc1sxXSA9IDA7CisgICAgZm9yIChsZW4gPSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKKyAgICAgICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07CisKKyAgICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovCisgICAgZm9yIChzeW0gPSAwOyBzeW0gPCBjb2Rlczsgc3ltKyspCisgICAgICAgIGlmIChsZW5zW3N5bV0gIT0gMCkgd29ya1tvZmZzW2xlbnNbc3ltXV0rK10gPSAodW5zaWduZWQgc2hvcnQpc3ltOworCisgICAgLyoKKyAgICAgICBDcmVhdGUgYW5kIGZpbGwgaW4gZGVjb2RpbmcgdGFibGVzLiAgSW4gdGhpcyBsb29wLCB0aGUgdGFibGUgYmVpbmcKKyAgICAgICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZgorICAgICAgIHdpdGggbGVuZ3RoIGxlbi4gIFRoYXQgY29kZSBpcyBjb252ZXJ0ZWQgdG8gYW4gaW5kZXggYnkgZHJvcHBpbmcgZHJvcAorICAgICAgIGJpdHMgb2ZmIG9mIHRoZSBib3R0b20uICBGb3IgY29kZXMgd2hlcmUgbGVuIGlzIGxlc3MgdGhhbiBkcm9wICsgY3VyciwKKyAgICAgICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvCisgICAgICAgZmlsbCB0aGUgdGFibGUgd2l0aCByZXBsaWNhdGVkIGVudHJpZXMuCisKKyAgICAgICByb290IGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgdGhlIHJvb3QgdGFibGUuICBXaGVuIGxlbiBleGNlZWRzCisgICAgICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXgKKyAgICAgICBvZiB0aGUgbG93IHJvb3QgYml0cyBvZiBodWZmLiAgVGhpcyBpcyBzYXZlZCBpbiBsb3cgdG8gY2hlY2sgZm9yIHdoZW4gYQorICAgICAgIG5ldyBzdWItdGFibGUgc2hvdWxkIGJlIHN0YXJ0ZWQuICBkcm9wIGlzIHplcm8gd2hlbiB0aGUgcm9vdCB0YWJsZSBpcworICAgICAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC4KKworICAgICAgIFdoZW4gYSBuZXcgc3ViLXRhYmxlIGlzIG5lZWRlZCwgaXQgaXMgbmVjZXNzYXJ5IHRvIGxvb2sgYWhlYWQgaW4gdGhlCisgICAgICAgY29kZSBsZW5ndGhzIHRvIGRldGVybWluZSB3aGF0IHNpemUgc3ViLXRhYmxlIGlzIG5lZWRlZC4gIFRoZSBsZW5ndGgKKyAgICAgICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZQorICAgICAgIGVudGVyZWQgaW4gdGhlIHRhYmxlcy4KKworICAgICAgIHVzZWQga2VlcHMgdHJhY2sgb2YgaG93IG1hbnkgdGFibGUgZW50cmllcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGZyb20gdGhlCisgICAgICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCB3aGVuIGEgTEVOUyB0YWJsZSBpcyBiZWluZyBtYWRlCisgICAgICAgYWdhaW5zdCB0aGUgc3BhY2UgaW4gKnRhYmxlLCBFTk9VR0gsIG1pbnVzIHRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCBieQorICAgICAgIHRoZSB3b3JzdCBjYXNlIGRpc3RhbmNlIGNvZGUsIE1BWEQuICBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCB0aGUKKyAgICAgICBzdWZmaWNpZW5jeSBvZiBFTk9VR0ggaGFzIG5vdCBiZWVuIHByb3ZlbiBleGhhdXN0aXZlbHksIGhlbmNlIHRoZSBjaGVjay4KKyAgICAgICBUaGlzIGFzc3VtZXMgdGhhdCB3aGVuIHR5cGUgPT0gTEVOUywgYml0cyA9PSA5LgorCisgICAgICAgc3ltIGluY3JlbWVudHMgdGhyb3VnaCBhbGwgc3ltYm9scywgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMgd2hlbgorICAgICAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXMKKyAgICAgICByb3V0aW5lIHBlcm1pdHMgaW5jb21wbGV0ZSBjb2Rlcywgc28gYW5vdGhlciBsb29wIGFmdGVyIHRoaXMgb25lIGZpbGxzCisgICAgICAgaW4gdGhlIHJlc3Qgb2YgdGhlIGRlY29kaW5nIHRhYmxlcyB3aXRoIGludmFsaWQgY29kZSBtYXJrZXJzLgorICAgICAqLworCisgICAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi8KKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENPREVTOgorICAgICAgICBiYXNlID0gZXh0cmEgPSB3b3JrOyAgICAvKiBkdW1teSB2YWx1ZS0tbm90IHVzZWQgKi8KKyAgICAgICAgZW5kID0gMTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgTEVOUzoKKyAgICAgICAgYmFzZSA9IGxiYXNlOworICAgICAgICBiYXNlIC09IDI1NzsKKyAgICAgICAgZXh0cmEgPSBsZXh0OworICAgICAgICBleHRyYSAtPSAyNTc7CisgICAgICAgIGVuZCA9IDI1NjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDogICAgICAgICAgICAvKiBESVNUUyAqLworICAgICAgICBiYXNlID0gZGJhc2U7CisgICAgICAgIGV4dHJhID0gZGV4dDsKKyAgICAgICAgZW5kID0gLTE7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSBmb3IgbG9vcCAqLworICAgIGh1ZmYgPSAwOyAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlICovCisgICAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovCisgICAgbGVuID0gbWluOyAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgbGVuZ3RoICovCisgICAgbmV4dCA9ICp0YWJsZTsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgdG8gZmlsbCBpbiAqLworICAgIGN1cnIgPSByb290OyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIGluZGV4IGJpdHMgKi8KKyAgICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqLworICAgIGxvdyA9ICh1bnNpZ25lZCkoLTEpOyAgICAgICAvKiB0cmlnZ2VyIG5ldyBzdWItdGFibGUgd2hlbiBsZW4gPiByb290ICovCisgICAgdXNlZCA9IDFVIDw8IHJvb3Q7ICAgICAgICAgIC8qIHVzZSByb290IHRhYmxlIGVudHJpZXMgKi8KKyAgICBtYXNrID0gdXNlZCAtIDE7ICAgICAgICAgICAgLyogbWFzayBmb3IgY29tcGFyaW5nIGxvdyAqLworCisgICAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovCisgICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCisgICAgICAgIHJldHVybiAxOworCisgICAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqLworICAgIGZvciAoOzspIHsKKyAgICAgICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovCisgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKKyAgICAgICAgaWYgKChpbnQpKHdvcmtbc3ltXSkgPCBlbmQpIHsKKyAgICAgICAgICAgIHRoaXMub3AgPSAodW5zaWduZWQgY2hhcikwOworICAgICAgICAgICAgdGhpcy52YWwgPSB3b3JrW3N5bV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoKGludCkod29ya1tzeW1dKSA+IGVuZCkgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKShleHRyYVt3b3JrW3N5bV1dKTsKKyAgICAgICAgICAgIHRoaXMudmFsID0gYmFzZVt3b3JrW3N5bV1dOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhpcy5vcCA9ICh1bnNpZ25lZCBjaGFyKSgzMiArIDY0KTsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KKyAgICAgICAgICAgIHRoaXMudmFsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gZHJvcCk7CisgICAgICAgIGZpbGwgPSAxVSA8PCBjdXJyOworICAgICAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqLworICAgICAgICBkbyB7CisgICAgICAgICAgICBmaWxsIC09IGluY3I7CisgICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSB0aGlzOworICAgICAgICB9IHdoaWxlIChmaWxsICE9IDApOworCisgICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCisgICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7CisgICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKKyAgICAgICAgICAgIGluY3IgPj49IDE7CisgICAgICAgIGlmIChpbmNyICE9IDApIHsKKyAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7CisgICAgICAgICAgICBodWZmICs9IGluY3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaHVmZiA9IDA7CisKKyAgICAgICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovCisgICAgICAgIHN5bSsrOworICAgICAgICBpZiAoLS0oY291bnRbbGVuXSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGxlbiA9PSBtYXgpIGJyZWFrOworICAgICAgICAgICAgbGVuID0gbGVuc1t3b3JrW3N5bV1dOworICAgICAgICB9CisKKyAgICAgICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovCisgICAgICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi8KKyAgICAgICAgICAgIGlmIChkcm9wID09IDApCisgICAgICAgICAgICAgICAgZHJvcCA9IHJvb3Q7CisKKyAgICAgICAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi8KKyAgICAgICAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqLworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi8KKyAgICAgICAgICAgIGN1cnIgPSBsZW4gLSBkcm9wOworICAgICAgICAgICAgbGVmdCA9IChpbnQpKDEgPDwgY3Vycik7CisgICAgICAgICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHsKKyAgICAgICAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKKyAgICAgICAgICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKKyAgICAgICAgICAgICAgICBjdXJyKys7CisgICAgICAgICAgICAgICAgbGVmdCA8PD0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLworICAgICAgICAgICAgdXNlZCArPSAxVSA8PCBjdXJyOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEVOUyAmJiB1c2VkID49IEVOT1VHSCAtIE1BWEQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAgICAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovCisgICAgICAgICAgICBsb3cgPSBodWZmICYgbWFzazsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10ub3AgPSAodW5zaWduZWQgY2hhciljdXJyOworICAgICAgICAgICAgKCp0YWJsZSlbbG93XS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpcm9vdDsKKyAgICAgICAgICAgICgqdGFibGUpW2xvd10udmFsID0gKHVuc2lnbmVkIHNob3J0KShuZXh0IC0gKnRhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICAgRmlsbCBpbiByZXN0IG9mIHRhYmxlIGZvciBpbmNvbXBsZXRlIGNvZGVzLiAgVGhpcyBsb29wIGlzIHNpbWlsYXIgdG8gdGhlCisgICAgICAgbG9vcCBhYm92ZSBpbiBpbmNyZW1lbnRpbmcgaHVmZiBmb3IgdGFibGUgaW5kaWNlcy4gIEl0IGlzIGFzc3VtZWQgdGhhdAorICAgICAgIGxlbiBpcyBlcXVhbCB0byBjdXJyICsgZHJvcCwgc28gdGhlcmUgaXMgbm8gbG9vcCBuZWVkZWQgdG8gaW5jcmVtZW50CisgICAgICAgdGhyb3VnaCBoaWdoIGluZGV4IGJpdHMuICBXaGVuIHRoZSBjdXJyZW50IHN1Yi10YWJsZSBpcyBmaWxsZWQsIHRoZSBsb29wCisgICAgICAgZHJvcHMgYmFjayB0byB0aGUgcm9vdCB0YWJsZSB0byBmaWxsIGluIGFueSByZW1haW5pbmcgZW50cmllcyB0aGVyZS4KKyAgICAgKi8KKyAgICB0aGlzLm9wID0gKHVuc2lnbmVkIGNoYXIpNjQ7ICAgICAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KKyAgICB0aGlzLmJpdHMgPSAodW5zaWduZWQgY2hhcikobGVuIC0gZHJvcCk7CisgICAgdGhpcy52YWwgPSAodW5zaWduZWQgc2hvcnQpMDsKKyAgICB3aGlsZSAoaHVmZiAhPSAwKSB7CisgICAgICAgIC8qIHdoZW4gZG9uZSB3aXRoIHN1Yi10YWJsZSwgZHJvcCBiYWNrIHRvIHJvb3QgdGFibGUgKi8KKyAgICAgICAgaWYgKGRyb3AgIT0gMCAmJiAoaHVmZiAmIG1hc2spICE9IGxvdykgeworICAgICAgICAgICAgZHJvcCA9IDA7CisgICAgICAgICAgICBsZW4gPSByb290OworICAgICAgICAgICAgbmV4dCA9ICp0YWJsZTsKKyAgICAgICAgICAgIHRoaXMuYml0cyA9ICh1bnNpZ25lZCBjaGFyKWxlbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHB1dCBpbnZhbGlkIGNvZGUgbWFya2VyIGluIHRhYmxlICovCisgICAgICAgIG5leHRbaHVmZiA+PiBkcm9wXSA9IHRoaXM7CisKKyAgICAgICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi8KKyAgICAgICAgaW5jciA9IDFVIDw8IChsZW4gLSAxKTsKKyAgICAgICAgd2hpbGUgKGh1ZmYgJiBpbmNyKQorICAgICAgICAgICAgaW5jciA+Pj0gMTsKKyAgICAgICAgaWYgKGluY3IgIT0gMCkgeworICAgICAgICAgICAgaHVmZiAmPSBpbmNyIC0gMTsKKyAgICAgICAgICAgIGh1ZmYgKz0gaW5jcjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBodWZmID0gMDsKKyAgICB9CisKKyAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KKyAgICAqdGFibGUgKz0gdXNlZDsKKyAgICAqYml0cyA9IHJvb3Q7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mdHJlZXMuaCBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZ0cmVlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MGI0NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mdHJlZXMuaApAQCAtMCwwICsxLDU5IEBACisjaWZuZGVmIElORlRSRUVTX0gKKyNkZWZpbmUgSU5GVFJFRVNfSAorCisvKiBpbmZ0cmVlcy5oIC0tIGhlYWRlciB0byB1c2UgaW5mdHJlZXMuYworICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUgTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAorICovCisKKy8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCisgICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKKyAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KKyAqLworCisvKiBTdHJ1Y3R1cmUgZm9yIGRlY29kaW5nIHRhYmxlcy4gIEVhY2ggZW50cnkgcHJvdmlkZXMgZWl0aGVyIHRoZQorICAgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGRvIHRoZSBvcGVyYXRpb24gcmVxdWVzdGVkIGJ5IHRoZSBjb2RlIHRoYXQKKyAgIGluZGV4ZWQgdGhhdCB0YWJsZSBlbnRyeSwgb3IgaXQgcHJvdmlkZXMgYSBwb2ludGVyIHRvIGFub3RoZXIKKyAgIHRhYmxlIHRoYXQgaW5kZXhlcyBtb3JlIGJpdHMgb2YgdGhlIGNvZGUuICBvcCBpbmRpY2F0ZXMgd2hldGhlcgorICAgdGhlIGVudHJ5IGlzIGEgcG9pbnRlciB0byBhbm90aGVyIHRhYmxlLCBhIGxpdGVyYWwsIGEgbGVuZ3RoIG9yCisgICBkaXN0YW5jZSwgYW4gZW5kLW9mLWJsb2NrLCBvciBhbiBpbnZhbGlkIGNvZGUuICBGb3IgYSB0YWJsZQorICAgcG9pbnRlciwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIG9mCisgICB0aGF0IHRhYmxlLiAgRm9yIGEgbGVuZ3RoIG9yIGRpc3RhbmNlLCB0aGUgbG93IGZvdXIgYml0cyBvZiBvcAorICAgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIGdldCBhZnRlciB0aGUgY29kZS4gIGJpdHMgaXMKKyAgIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGNvZGUgb3IgcGFydCBvZiB0aGUgY29kZSB0byBkcm9wIG9mZgorICAgb2YgdGhlIGJpdCBidWZmZXIuICB2YWwgaXMgdGhlIGFjdHVhbCBieXRlIHRvIG91dHB1dCBpbiB0aGUgY2FzZQorICAgb2YgYSBsaXRlcmFsLCB0aGUgYmFzZSBsZW5ndGggb3IgZGlzdGFuY2UsIG9yIHRoZSBvZmZzZXQgZnJvbQorICAgdGhlIGN1cnJlbnQgdGFibGUgdG8gdGhlIG5leHQgdGFibGUuICBFYWNoIGVudHJ5IGlzIGZvdXIgYnl0ZXMuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdW5zaWduZWQgY2hhciBvcDsgICAgICAgICAgIC8qIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgdGFibGUgYml0cyAqLworICAgIHVuc2lnbmVkIGNoYXIgYml0czsgICAgICAgICAvKiBiaXRzIGluIHRoaXMgcGFydCBvZiB0aGUgY29kZSAqLworICAgIHVuc2lnbmVkIHNob3J0IHZhbDsgICAgICAgICAvKiBvZmZzZXQgaW4gdGFibGUgb3IgY29kZSB2YWx1ZSAqLworfSBjb2RlOworCisvKiBvcCB2YWx1ZXMgYXMgc2V0IGJ5IGluZmxhdGVfdGFibGUoKToKKyAgICAwMDAwMDAwMCAtIGxpdGVyYWwKKyAgICAwMDAwdHR0dCAtIHRhYmxlIGxpbmssIHR0dHQgIT0gMCBpcyB0aGUgbnVtYmVyIG9mIHRhYmxlIGluZGV4IGJpdHMKKyAgICAwMDAxZWVlZSAtIGxlbmd0aCBvciBkaXN0YW5jZSwgZWVlZSBpcyB0aGUgbnVtYmVyIG9mIGV4dHJhIGJpdHMKKyAgICAwMTEwMDAwMCAtIGVuZCBvZiBibG9jaworICAgIDAxMDAwMDAwIC0gaW52YWxpZCBjb2RlCisgKi8KKworLyogTWF4aW11bSBzaXplIG9mIGR5bmFtaWMgdHJlZS4gIFRoZSBtYXhpbXVtIGZvdW5kIGluIGEgbG9uZyBidXQgbm9uLQorICAgZXhoYXVzdGl2ZSBzZWFyY2ggd2FzIDE0NDQgY29kZSBzdHJ1Y3R1cmVzICg4NTIgZm9yIGxlbmd0aC9saXRlcmFscworICAgYW5kIDU5MiBmb3IgZGlzdGFuY2VzLCB0aGUgbGF0dGVyIGFjdHVhbGx5IHRoZSByZXN1bHQgb2YgYW4KKyAgIGV4aGF1c3RpdmUgc2VhcmNoKS4gIFRoZSB0cnVlIG1heGltdW0gaXMgbm90IGtub3duLCBidXQgdGhlIHZhbHVlCisgICBiZWxvdyBpcyBtb3JlIHRoYW4gc2FmZS4gKi8KKyNkZWZpbmUgRU5PVUdIIDIwNDgKKyNkZWZpbmUgTUFYRCA1OTIKKworLyogVHlwZSBvZiBjb2RlIHRvIGJ1aWxkIGZvciBpbmZ0YWJsZSgpICovCit0eXBlZGVmIGVudW0geworICAgIENPREVTLAorICAgIExFTlMsCisgICAgRElTVFMKK30gY29kZXR5cGU7CisKK2V4dGVybiBpbnQgemxpYl9pbmZsYXRlX3RhYmxlIChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCAqbGVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY29kZXMsIGNvZGUgKip0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKmJpdHMsIHVuc2lnbmVkIHNob3J0ICp3b3JrKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZnV0aWwuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZ1dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyNGMyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3psaWJfaW5mbGF0ZS9pbmZ1dGlsLmMKQEAgLTAsMCArMSw0OSBAQAorI2luY2x1ZGUgPGxpbnV4L3p1dGlsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uOiBpbml0aWFsaXplIHpsaWIsIHVucGFjayBiaW5hcnkgYmxvYiwgY2xlYW4gdXAgemxpYiwKKyAqIHJldHVybiBsZW4gb3IgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHpsaWJfaW5mbGF0ZV9ibG9iKHZvaWQgKmd1bnppcF9idWYsIHVuc2lnbmVkIGludCBzeiwKKwkJICAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNvbnN0IHU4ICp6YnVmID0gYnVmOworCXN0cnVjdCB6X3N0cmVhbV9zICpzdHJtOworCWludCByYzsKKworCXJjID0gLUVOT01FTTsKKwlzdHJtID0ga21hbGxvYyhzaXplb2YoKnN0cm0pLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RybSA9PSBOVUxMKQorCQlnb3RvIGd1bnppcF9ub21lbTE7CisJc3RybS0+d29ya3NwYWNlID0ga21hbGxvYyh6bGliX2luZmxhdGVfd29ya3NwYWNlc2l6ZSgpLCBHRlBfS0VSTkVMKTsKKwlpZiAoc3RybS0+d29ya3NwYWNlID09IE5VTEwpCisJCWdvdG8gZ3VuemlwX25vbWVtMjsKKworCS8qIGd6aXAgaGVhZGVyICgxZiw4YiwwOC4uLiAxMCBieXRlcyB0b3RhbCArIHBvc3NpYmxlIGFzY2l6IGZpbGVuYW1lKQorCSAqIGV4cGVjdGVkIHRvIGJlIHN0cmlwcGVkIGZyb20gaW5wdXQKKwkgKi8KKwlzdHJtLT5uZXh0X2luID0gemJ1ZjsKKwlzdHJtLT5hdmFpbF9pbiA9IGxlbjsKKwlzdHJtLT5uZXh0X291dCA9IGd1bnppcF9idWY7CisJc3RybS0+YXZhaWxfb3V0ID0gc3o7CisKKwlyYyA9IHpsaWJfaW5mbGF0ZUluaXQyKHN0cm0sIC1NQVhfV0JJVFMpOworCWlmIChyYyA9PSBaX09LKSB7CisJCXJjID0gemxpYl9pbmZsYXRlKHN0cm0sIFpfRklOSVNIKTsKKwkJLyogYWZ0ZXIgWl9GSU5JU0gsIG9ubHkgWl9TVFJFQU1fRU5EIGlzICJ3ZSB1bnBhY2tlZCBpdCBhbGwiICovCisJCWlmIChyYyA9PSBaX1NUUkVBTV9FTkQpCisJCQlyYyA9IHN6IC0gc3RybS0+YXZhaWxfb3V0OworCQllbHNlCisJCQlyYyA9IC1FSU5WQUw7CisJCXpsaWJfaW5mbGF0ZUVuZChzdHJtKTsKKwl9IGVsc2UKKwkJcmMgPSAtRUlOVkFMOworCisJa2ZyZWUoc3RybS0+d29ya3NwYWNlKTsKK2d1bnppcF9ub21lbTI6CisJa2ZyZWUoc3RybSk7CitndW56aXBfbm9tZW0xOgorCXJldHVybiByYzsgLyogcmV0dXJucyBaX09LICgwKSBpZiBzdWNjZXNzZnVsICovCit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96bGliX2luZmxhdGUvaW5mdXRpbC5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZnV0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFhOTAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvemxpYl9pbmZsYXRlL2luZnV0aWwuaApAQCAtMCwwICsxLDI1IEBACisvKiBpbmZ1dGlsLmggLS0gdHlwZXMgYW5kIG1hY3JvcyBjb21tb24gdG8gYmxvY2tzIGFuZCBjb2RlcworICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTggTWFyayBBZGxlcgorICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaCAKKyAqLworCisvKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcworICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCisgICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCisgKi8KKworI2lmbmRlZiBfSU5GVVRJTF9ICisjZGVmaW5lIF9JTkZVVElMX0gKKworI2luY2x1ZGUgPGxpbnV4L3psaWIuaD4KKworLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGluZmxhdGlvbiAqLworCitzdHJ1Y3QgaW5mbGF0ZV93b3Jrc3BhY2UgeworCXN0cnVjdCBpbmZsYXRlX3N0YXRlIGluZmxhdGVfc3RhdGU7CisJdW5zaWduZWQgY2hhciB3b3JraW5nX3dpbmRvd1sxIDw8IE1BWF9XQklUU107Cit9OworCisjZGVmaW5lIFdTKHopICgoc3RydWN0IGluZmxhdGVfd29ya3NwYWNlICopKHotPndvcmtzcGFjZSkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9NYWtlZmlsZSBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwYTM1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorb2JqLSQoQ09ORklHX1pTVERfQ09NUFJFU1MpICs9IHpzdGRfY29tcHJlc3Mubworb2JqLSQoQ09ORklHX1pTVERfREVDT01QUkVTUykgKz0genN0ZF9kZWNvbXByZXNzLm8KKworY2NmbGFncy15ICs9IC1PMworCisjIE9iamVjdCBmaWxlcyB1bmlxdWUgdG8genN0ZF9jb21wcmVzcyBhbmQgenN0ZF9kZWNvbXByZXNzCit6c3RkX2NvbXByZXNzLXkgOj0gZnNlX2NvbXByZXNzLm8gaHVmX2NvbXByZXNzLm8gY29tcHJlc3MubworenN0ZF9kZWNvbXByZXNzLXkgOj0gaHVmX2RlY29tcHJlc3MubyBkZWNvbXByZXNzLm8KKworIyBUaGVzZSBvYmplY3QgZmlsZXMgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBtb2R1bGVzLgorIyBBbHdheXMgYWRkIHRoZW0gdG8genN0ZF9jb21wcmVzcy4KKyMgVW5sZXNzIGJvdGggenN0ZF9jb21wcmVzcyBhbmQgenN0ZF9kZWNvbXByZXNzIGFyZSBidWlsdCBpbgorIyB0aGVuIGFsc28gYWRkIHRoZW0gdG8genN0ZF9kZWNvbXByZXNzLgorenN0ZF9jb21wcmVzcy15ICs9IGVudHJvcHlfY29tbW9uLm8gZnNlX2RlY29tcHJlc3MubyB6c3RkX2NvbW1vbi5vCisKK2lmbmVxICgkKENPTkZJR19aU1REX0NPTVBSRVNTKSQoQ09ORklHX1pTVERfREVDT01QUkVTUykseXkpCisJenN0ZF9kZWNvbXByZXNzLXkgKz0gZW50cm9weV9jb21tb24ubyBmc2VfZGVjb21wcmVzcy5vIHpzdGRfY29tbW9uLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2JpdHN0cmVhbS5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9iaXRzdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODI2Yjk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9iaXRzdHJlYW0uaApAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIGJpdHN0cmVhbQorICogUGFydCBvZiBGU0UgbGlicmFyeQorICogaGVhZGVyIGZpbGUgKHRvIGluY2x1ZGUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiwgWWFubiBDb2xsZXQuCisgKgorICogQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKiAtIFNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL0N5YW40OTczL0Zpbml0ZVN0YXRlRW50cm9weQorICovCisjaWZuZGVmIEJJVFNUUkVBTV9IX01PRFVMRQorI2RlZmluZSBCSVRTVFJFQU1fSF9NT0RVTEUKKworLyoKKyogIFRoaXMgQVBJIGNvbnNpc3RzIG9mIHNtYWxsIHVuaXRhcnkgZnVuY3Rpb25zLCB3aGljaCBtdXN0IGJlIGlubGluZWQgZm9yIGJlc3QgcGVyZm9ybWFuY2UuCisqICBTaW5jZSBsaW5rLXRpbWUtb3B0aW1pemF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIGFsbCBjb21waWxlcnMsCisqICB0aGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW50byBhIC5oIHRvIGJlIGluY2x1ZGVkLgorKi8KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVwZW5kZW5jaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZXJyb3JfcHJpdmF0ZS5oIiAvKiBlcnJvciBjb2RlcyBhbmQgbWVzc2FnZXMgKi8KKyNpbmNsdWRlICJtZW0uaCIJICAgLyogdW5hbGlnbmVkIGFjY2VzcyByb3V0aW5lcyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICBUYXJnZXQgc3BlY2lmaWMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNkZWZpbmUgU1RSRUFNX0FDQ1VNVUxBVE9SX01JTl8zMiAyNQorI2RlZmluZSBTVFJFQU1fQUNDVU1VTEFUT1JfTUlOXzY0IDU3CisjZGVmaW5lIFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU4gKChVMzIpKFpTVERfMzJiaXRzKCkgPyBTVFJFQU1fQUNDVU1VTEFUT1JfTUlOXzMyIDogU1RSRUFNX0FDQ1VNVUxBVE9SX01JTl82NCkpCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgYml0U3RyZWFtIGVuY29kaW5nIEFQSSAod3JpdGUgZm9yd2FyZCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYml0U3RyZWFtIGNhbiBtaXggaW5wdXQgZnJvbSBtdWx0aXBsZSBzb3VyY2VzLgorKiAgQSBjcml0aWNhbCBwcm9wZXJ0eSBvZiB0aGVzZSBzdHJlYW1zIGlzIHRoYXQgdGhleSBlbmNvZGUgYW5kIGRlY29kZSBpbiAqKnJldmVyc2UqKiBkaXJlY3Rpb24uCisqICBTbyB0aGUgZmlyc3QgYml0IHNlcXVlbmNlIHlvdSBhZGQgd2lsbCBiZSB0aGUgbGFzdCB0byBiZSByZWFkLCBsaWtlIGEgTElGTyBzdGFjay4KKyovCit0eXBlZGVmIHN0cnVjdCB7CisJc2l6ZV90IGJpdENvbnRhaW5lcjsKKwlpbnQgYml0UG9zOworCWNoYXIgKnN0YXJ0UHRyOworCWNoYXIgKnB0cjsKKwljaGFyICplbmRQdHI7Cit9IEJJVF9DU3RyZWFtX3Q7CisKK1pTVERfU1RBVElDIHNpemVfdCBCSVRfaW5pdENTdHJlYW0oQklUX0NTdHJlYW1fdCAqYml0Qywgdm9pZCAqZHN0QnVmZmVyLCBzaXplX3QgZHN0Q2FwYWNpdHkpOworWlNURF9TVEFUSUMgdm9pZCBCSVRfYWRkQml0cyhCSVRfQ1N0cmVhbV90ICpiaXRDLCBzaXplX3QgdmFsdWUsIHVuc2lnbmVkIG5iQml0cyk7CitaU1REX1NUQVRJQyB2b2lkIEJJVF9mbHVzaEJpdHMoQklUX0NTdHJlYW1fdCAqYml0Qyk7CitaU1REX1NUQVRJQyBzaXplX3QgQklUX2Nsb3NlQ1N0cmVhbShCSVRfQ1N0cmVhbV90ICpiaXRDKTsKKworLyogU3RhcnQgd2l0aCBpbml0Q1N0cmVhbSwgcHJvdmlkaW5nIHRoZSBzaXplIG9mIGJ1ZmZlciB0byB3cml0ZSBpbnRvLgorKiAgYml0U3RyZWFtIHdpbGwgbmV2ZXIgd3JpdGUgb3V0c2lkZSBvZiB0aGlzIGJ1ZmZlci4KKyogIGBkc3RDYXBhY2l0eWAgbXVzdCBiZSA+PSBzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKSwgb3RoZXJ3aXNlIEByZXR1cm4gd2lsbCBiZSBhbiBlcnJvciBjb2RlLgorKgorKiAgYml0cyBhcmUgZmlyc3QgYWRkZWQgdG8gYSBsb2NhbCByZWdpc3Rlci4KKyogIExvY2FsIHJlZ2lzdGVyIGlzIHNpemVfdCwgaGVuY2UgNjQtYml0cyBvbiA2NC1iaXRzIHN5c3RlbXMsIG9yIDMyLWJpdHMgb24gMzItYml0cyBzeXN0ZW1zLgorKiAgV3JpdGluZyBkYXRhIGludG8gbWVtb3J5IGlzIGFuIGV4cGxpY2l0IG9wZXJhdGlvbiwgcGVyZm9ybWVkIGJ5IHRoZSBmbHVzaEJpdHMgZnVuY3Rpb24uCisqICBIZW5jZSBrZWVwIHRyYWNrIGhvdyBtYW55IGJpdHMgYXJlIHBvdGVudGlhbGx5IHN0b3JlZCBpbnRvIGxvY2FsIHJlZ2lzdGVyIHRvIGF2b2lkIHJlZ2lzdGVyIG92ZXJmbG93LgorKiAgQWZ0ZXIgYSBmbHVzaEJpdHMsIGEgbWF4aW11bSBvZiA3IGJpdHMgbWlnaHQgc3RpbGwgYmUgc3RvcmVkIGludG8gbG9jYWwgcmVnaXN0ZXIuCisqCisqICBBdm9pZCBzdG9yaW5nIGVsZW1lbnRzIG9mIG1vcmUgdGhhbiAyNCBiaXRzIGlmIHlvdSB3YW50IGNvbXBhdGliaWxpdHkgd2l0aCAzMi1iaXRzIGJpdHN0cmVhbSByZWFkZXJzLgorKgorKiAgTGFzdCBvcGVyYXRpb24gaXMgdG8gY2xvc2UgdGhlIGJpdFN0cmVhbS4KKyogIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaW5hbCBzaXplIG9mIENTdHJlYW0gaW4gYnl0ZXMuCisqICBJZiBkYXRhIGNvdWxkbid0IGZpdCBpbnRvIGBkc3RCdWZmZXJgLCBpdCB3aWxsIHJldHVybiBhIDAgKCA9PSBub3Qgc3RvcmFibGUpCisqLworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgYml0U3RyZWFtIGRlY29kaW5nIEFQSSAocmVhZCBiYWNrd2FyZCkKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCB7CisJc2l6ZV90IGJpdENvbnRhaW5lcjsKKwl1bnNpZ25lZCBiaXRzQ29uc3VtZWQ7CisJY29uc3QgY2hhciAqcHRyOworCWNvbnN0IGNoYXIgKnN0YXJ0OworfSBCSVRfRFN0cmVhbV90OworCit0eXBlZGVmIGVudW0geworCUJJVF9EU3RyZWFtX3VuZmluaXNoZWQgPSAwLAorCUJJVF9EU3RyZWFtX2VuZE9mQnVmZmVyID0gMSwKKwlCSVRfRFN0cmVhbV9jb21wbGV0ZWQgPSAyLAorCUJJVF9EU3RyZWFtX292ZXJmbG93ID0gMworfSBCSVRfRFN0cmVhbV9zdGF0dXM7IC8qIHJlc3VsdCBvZiBCSVRfcmVsb2FkRFN0cmVhbSgpICovCisvKiAxLDIsNCw4IHdvdWxkIGJlIGJldHRlciBmb3IgYml0bWFwIGNvbWJpbmF0aW9ucywgYnV0IHNsb3dzIGRvd24gcGVyZm9ybWFuY2UgYSBiaXQgLi4uIDooICovCisKK1pTVERfU1RBVElDIHNpemVfdCBCSVRfaW5pdERTdHJlYW0oQklUX0RTdHJlYW1fdCAqYml0RCwgY29uc3Qgdm9pZCAqc3JjQnVmZmVyLCBzaXplX3Qgc3JjU2l6ZSk7CitaU1REX1NUQVRJQyBzaXplX3QgQklUX3JlYWRCaXRzKEJJVF9EU3RyZWFtX3QgKmJpdEQsIHVuc2lnbmVkIG5iQml0cyk7CitaU1REX1NUQVRJQyBCSVRfRFN0cmVhbV9zdGF0dXMgQklUX3JlbG9hZERTdHJlYW0oQklUX0RTdHJlYW1fdCAqYml0RCk7CitaU1REX1NUQVRJQyB1bnNpZ25lZCBCSVRfZW5kT2ZEU3RyZWFtKGNvbnN0IEJJVF9EU3RyZWFtX3QgKmJpdEQpOworCisvKiBTdGFydCBieSBpbnZva2luZyBCSVRfaW5pdERTdHJlYW0oKS4KKyogIEEgY2h1bmsgb2YgdGhlIGJpdFN0cmVhbSBpcyB0aGVuIHN0b3JlZCBpbnRvIGEgbG9jYWwgcmVnaXN0ZXIuCisqICBMb2NhbCByZWdpc3RlciBzaXplIGlzIDY0LWJpdHMgb24gNjQtYml0cyBzeXN0ZW1zLCAzMi1iaXRzIG9uIDMyLWJpdHMgc3lzdGVtcyAoc2l6ZV90KS4KKyogIFlvdSBjYW4gdGhlbiByZXRyaWV2ZSBiaXRGaWVsZHMgc3RvcmVkIGludG8gdGhlIGxvY2FsIHJlZ2lzdGVyLCAqKmluIHJldmVyc2Ugb3JkZXIqKi4KKyogIExvY2FsIHJlZ2lzdGVyIGlzIGV4cGxpY2l0bHkgcmVsb2FkZWQgZnJvbSBtZW1vcnkgYnkgdGhlIEJJVF9yZWxvYWREU3RyZWFtKCkgbWV0aG9kLgorKiAgQSByZWxvYWQgZ3VhcmFudGVlIGEgbWluaW11bSBvZiAoKDgqc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikpLTcpIGJpdHMgd2hlbiBpdHMgcmVzdWx0IGlzIEJJVF9EU3RyZWFtX3VuZmluaXNoZWQuCisqICBPdGhlcndpc2UsIGl0IGNhbiBiZSBsZXNzIHRoYW4gdGhhdCwgc28gcHJvY2VlZCBhY2NvcmRpbmdseS4KKyogIENoZWNraW5nIGlmIERTdHJlYW0gaGFzIHJlYWNoZWQgaXRzIGVuZCBjYW4gYmUgcGVyZm9ybWVkIHdpdGggQklUX2VuZE9mRFN0cmVhbSgpLgorKi8KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgdW5zYWZlIEFQSQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworWlNURF9TVEFUSUMgdm9pZCBCSVRfYWRkQml0c0Zhc3QoQklUX0NTdHJlYW1fdCAqYml0Qywgc2l6ZV90IHZhbHVlLCB1bnNpZ25lZCBuYkJpdHMpOworLyogZmFzdGVyLCBidXQgd29ya3Mgb25seSBpZiB2YWx1ZSBpcyAiY2xlYW4iLCBtZWFuaW5nIGFsbCBoaWdoIGJpdHMgYWJvdmUgbmJCaXRzIGFyZSAwICovCisKK1pTVERfU1RBVElDIHZvaWQgQklUX2ZsdXNoQml0c0Zhc3QoQklUX0NTdHJlYW1fdCAqYml0Qyk7CisvKiB1bnNhZmUgdmVyc2lvbjsgZG9lcyBub3QgY2hlY2sgYnVmZmVyIG92ZXJmbG93ICovCisKK1pTVERfU1RBVElDIHNpemVfdCBCSVRfcmVhZEJpdHNGYXN0KEJJVF9EU3RyZWFtX3QgKmJpdEQsIHVuc2lnbmVkIG5iQml0cyk7CisvKiBmYXN0ZXIsIGJ1dCB3b3JrcyBvbmx5IGlmIG5iQml0cyA+PSAxICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJbnRlcm5hbCBmdW5jdGlvbnMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitaU1REX1NUQVRJQyB1bnNpZ25lZCBCSVRfaGlnaGJpdDMyKHJlZ2lzdGVyIFUzMiB2YWwpIHsgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih2YWwpOyB9CisKKy8qPT09PT0gICAgTG9jYWwgQ29uc3RhbnRzICAgPT09PT0qLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIEJJVF9tYXNrW10gPSB7MCwgICAgICAgMSwgICAgICAgMywgICAgICAgNywJMHhGLCAgICAgIDB4MUYsICAgICAweDNGLCAgICAgMHg3RiwgICAgICAweEZGLAorCQkJCSAgICAweDFGRiwgICAweDNGRiwgICAweDdGRiwgICAweEZGRiwgICAgMHgxRkZGLCAgIDB4M0ZGRiwgICAweDdGRkYsICAgMHhGRkZGLCAgICAweDFGRkZGLAorCQkJCSAgICAweDNGRkZGLCAweDdGRkZGLCAweEZGRkZGLCAweDFGRkZGRiwgMHgzRkZGRkYsIDB4N0ZGRkZGLCAweEZGRkZGRiwgMHgxRkZGRkZGLCAweDNGRkZGRkZ9OyAvKiB1cCB0byAyNiBiaXRzICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBiaXRTdHJlYW0gZW5jb2RpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEgQklUX2luaXRDU3RyZWFtKCkgOgorICogIGBkc3RDYXBhY2l0eWAgbXVzdCBiZSA+IHNpemVvZih2b2lkKikKKyAqICBAcmV0dXJuIDogMCBpZiBzdWNjZXNzLAorCQkJICBvdGhlcndpc2UgYW4gZXJyb3IgY29kZSAoY2FuIGJlIHRlc3RlZCB1c2luZyBFUlJfaXNFcnJvcigpICkgKi8KK1pTVERfU1RBVElDIHNpemVfdCBCSVRfaW5pdENTdHJlYW0oQklUX0NTdHJlYW1fdCAqYml0Qywgdm9pZCAqc3RhcnRQdHIsIHNpemVfdCBkc3RDYXBhY2l0eSkKK3sKKwliaXRDLT5iaXRDb250YWluZXIgPSAwOworCWJpdEMtPmJpdFBvcyA9IDA7CisJYml0Qy0+c3RhcnRQdHIgPSAoY2hhciAqKXN0YXJ0UHRyOworCWJpdEMtPnB0ciA9IGJpdEMtPnN0YXJ0UHRyOworCWJpdEMtPmVuZFB0ciA9IGJpdEMtPnN0YXJ0UHRyICsgZHN0Q2FwYWNpdHkgLSBzaXplb2YoYml0Qy0+cHRyKTsKKwlpZiAoZHN0Q2FwYWNpdHkgPD0gc2l6ZW9mKGJpdEMtPnB0cikpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwlyZXR1cm4gMDsKK30KKworLyohIEJJVF9hZGRCaXRzKCkgOgorCWNhbiBhZGQgdXAgdG8gMjYgYml0cyBpbnRvIGBiaXRDYC4KKwlEb2VzIG5vdCBjaGVjayBmb3IgcmVnaXN0ZXIgb3ZlcmZsb3cgISAqLworWlNURF9TVEFUSUMgdm9pZCBCSVRfYWRkQml0cyhCSVRfQ1N0cmVhbV90ICpiaXRDLCBzaXplX3QgdmFsdWUsIHVuc2lnbmVkIG5iQml0cykKK3sKKwliaXRDLT5iaXRDb250YWluZXIgfD0gKHZhbHVlICYgQklUX21hc2tbbmJCaXRzXSkgPDwgYml0Qy0+Yml0UG9zOworCWJpdEMtPmJpdFBvcyArPSBuYkJpdHM7Cit9CisKKy8qISBCSVRfYWRkQml0c0Zhc3QoKSA6CisgKiAgd29ya3Mgb25seSBpZiBgdmFsdWVgIGlzIF9jbGVhbl8sIG1lYW5pbmcgYWxsIGhpZ2ggYml0cyBhYm92ZSBuYkJpdHMgYXJlIDAgKi8KK1pTVERfU1RBVElDIHZvaWQgQklUX2FkZEJpdHNGYXN0KEJJVF9DU3RyZWFtX3QgKmJpdEMsIHNpemVfdCB2YWx1ZSwgdW5zaWduZWQgbmJCaXRzKQoreworCWJpdEMtPmJpdENvbnRhaW5lciB8PSB2YWx1ZSA8PCBiaXRDLT5iaXRQb3M7CisJYml0Qy0+Yml0UG9zICs9IG5iQml0czsKK30KKworLyohIEJJVF9mbHVzaEJpdHNGYXN0KCkgOgorICogIHVuc2FmZSB2ZXJzaW9uOyBkb2VzIG5vdCBjaGVjayBidWZmZXIgb3ZlcmZsb3cgKi8KK1pTVERfU1RBVElDIHZvaWQgQklUX2ZsdXNoQml0c0Zhc3QoQklUX0NTdHJlYW1fdCAqYml0QykKK3sKKwlzaXplX3QgY29uc3QgbmJCeXRlcyA9IGJpdEMtPmJpdFBvcyA+PiAzOworCVpTVERfd3JpdGVMRVNUKGJpdEMtPnB0ciwgYml0Qy0+Yml0Q29udGFpbmVyKTsKKwliaXRDLT5wdHIgKz0gbmJCeXRlczsKKwliaXRDLT5iaXRQb3MgJj0gNzsKKwliaXRDLT5iaXRDb250YWluZXIgPj49IG5iQnl0ZXMgKiA4OyAvKiBpZiBiaXRQb3MgPj0gc2l6ZW9mKGJpdENvbnRhaW5lcikqOCAtLT4gdW5kZWZpbmVkIGJlaGF2aW9yICovCit9CisKKy8qISBCSVRfZmx1c2hCaXRzKCkgOgorICogIHNhZmUgdmVyc2lvbjsgY2hlY2sgZm9yIGJ1ZmZlciBvdmVyZmxvdywgYW5kIHByZXZlbnRzIGl0LgorICogIG5vdGUgOiBkb2VzIG5vdCBzaWduYWwgYnVmZmVyIG92ZXJmbG93LiBUaGlzIHdpbGwgYmUgcmV2ZWFsZWQgbGF0ZXIgb24gdXNpbmcgQklUX2Nsb3NlQ1N0cmVhbSgpICovCitaU1REX1NUQVRJQyB2b2lkIEJJVF9mbHVzaEJpdHMoQklUX0NTdHJlYW1fdCAqYml0QykKK3sKKwlzaXplX3QgY29uc3QgbmJCeXRlcyA9IGJpdEMtPmJpdFBvcyA+PiAzOworCVpTVERfd3JpdGVMRVNUKGJpdEMtPnB0ciwgYml0Qy0+Yml0Q29udGFpbmVyKTsKKwliaXRDLT5wdHIgKz0gbmJCeXRlczsKKwlpZiAoYml0Qy0+cHRyID4gYml0Qy0+ZW5kUHRyKQorCQliaXRDLT5wdHIgPSBiaXRDLT5lbmRQdHI7CisJYml0Qy0+Yml0UG9zICY9IDc7CisJYml0Qy0+Yml0Q29udGFpbmVyID4+PSBuYkJ5dGVzICogODsgLyogaWYgYml0UG9zID49IHNpemVvZihiaXRDb250YWluZXIpKjggLS0+IHVuZGVmaW5lZCBiZWhhdmlvciAqLworfQorCisvKiEgQklUX2Nsb3NlQ1N0cmVhbSgpIDoKKyAqICBAcmV0dXJuIDogc2l6ZSBvZiBDU3RyZWFtLCBpbiBieXRlcywKKwkJCSAgb3IgMCBpZiBpdCBjb3VsZCBub3QgZml0IGludG8gZHN0QnVmZmVyICovCitaU1REX1NUQVRJQyBzaXplX3QgQklUX2Nsb3NlQ1N0cmVhbShCSVRfQ1N0cmVhbV90ICpiaXRDKQoreworCUJJVF9hZGRCaXRzRmFzdChiaXRDLCAxLCAxKTsgLyogZW5kTWFyayAqLworCUJJVF9mbHVzaEJpdHMoYml0Qyk7CisKKwlpZiAoYml0Qy0+cHRyID49IGJpdEMtPmVuZFB0cikKKwkJcmV0dXJuIDA7IC8qIGRvZXNuJ3QgZml0IHdpdGhpbiBhdXRob3JpemVkIGJ1ZGdldCA6IGNhbmNlbCAqLworCisJcmV0dXJuIChiaXRDLT5wdHIgLSBiaXRDLT5zdGFydFB0cikgKyAoYml0Qy0+Yml0UG9zID4gMCk7Cit9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIGJpdFN0cmVhbSBkZWNvZGluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qISBCSVRfaW5pdERTdHJlYW0oKSA6CisqICAgSW5pdGlhbGl6ZSBhIEJJVF9EU3RyZWFtX3QuCisqICAgYGJpdERgIDogYSBwb2ludGVyIHRvIGFuIGFscmVhZHkgYWxsb2NhdGVkIEJJVF9EU3RyZWFtX3Qgc3RydWN0dXJlLgorKiAgIGBzcmNTaXplYCBtdXN0IGJlIHRoZSAqZXhhY3QqIHNpemUgb2YgdGhlIGJpdFN0cmVhbSwgaW4gYnl0ZXMuCisqICAgQHJldHVybiA6IHNpemUgb2Ygc3RyZWFtICg9PSBzcmNTaXplKSBvciBhbiBlcnJvckNvZGUgaWYgYSBwcm9ibGVtIGlzIGRldGVjdGVkCisqLworWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9pbml0RFN0cmVhbShCSVRfRFN0cmVhbV90ICpiaXRELCBjb25zdCB2b2lkICpzcmNCdWZmZXIsIHNpemVfdCBzcmNTaXplKQoreworCWlmIChzcmNTaXplIDwgMSkgeworCQltZW1zZXQoYml0RCwgMCwgc2l6ZW9mKCpiaXREKSk7CisJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwl9CisKKwlpZiAoc3JjU2l6ZSA+PSBzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKSkgeyAvKiBub3JtYWwgY2FzZSAqLworCQliaXRELT5zdGFydCA9IChjb25zdCBjaGFyICopc3JjQnVmZmVyOworCQliaXRELT5wdHIgPSAoY29uc3QgY2hhciAqKXNyY0J1ZmZlciArIHNyY1NpemUgLSBzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKTsKKwkJYml0RC0+Yml0Q29udGFpbmVyID0gWlNURF9yZWFkTEVTVChiaXRELT5wdHIpOworCQl7CisJCQlCWVRFIGNvbnN0IGxhc3RCeXRlID0gKChjb25zdCBCWVRFICopc3JjQnVmZmVyKVtzcmNTaXplIC0gMV07CisJCQliaXRELT5iaXRzQ29uc3VtZWQgPSBsYXN0Qnl0ZSA/IDggLSBCSVRfaGlnaGJpdDMyKGxhc3RCeXRlKSA6IDA7IC8qIGVuc3VyZXMgYml0c0NvbnN1bWVkIGlzIGFsd2F5cyBzZXQgKi8KKwkJCWlmIChsYXN0Qnl0ZSA9PSAwKQorCQkJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogZW5kTWFyayBub3QgcHJlc2VudCAqLworCQl9CisJfSBlbHNlIHsKKwkJYml0RC0+c3RhcnQgPSAoY29uc3QgY2hhciAqKXNyY0J1ZmZlcjsKKwkJYml0RC0+cHRyID0gYml0RC0+c3RhcnQ7CisJCWJpdEQtPmJpdENvbnRhaW5lciA9ICooY29uc3QgQllURSAqKShiaXRELT5zdGFydCk7CisJCXN3aXRjaCAoc3JjU2l6ZSkgeworCQljYXNlIDc6IGJpdEQtPmJpdENvbnRhaW5lciArPSAoc2l6ZV90KSgoKGNvbnN0IEJZVEUgKikoc3JjQnVmZmVyKSlbNl0pIDw8IChzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKSAqIDggLSAxNik7CisJCWNhc2UgNjogYml0RC0+Yml0Q29udGFpbmVyICs9IChzaXplX3QpKCgoY29uc3QgQllURSAqKShzcmNCdWZmZXIpKVs1XSkgPDwgKHNpemVvZihiaXRELT5iaXRDb250YWluZXIpICogOCAtIDI0KTsKKwkJY2FzZSA1OiBiaXRELT5iaXRDb250YWluZXIgKz0gKHNpemVfdCkoKChjb25zdCBCWVRFICopKHNyY0J1ZmZlcikpWzRdKSA8PCAoc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikgKiA4IC0gMzIpOworCQljYXNlIDQ6IGJpdEQtPmJpdENvbnRhaW5lciArPSAoc2l6ZV90KSgoKGNvbnN0IEJZVEUgKikoc3JjQnVmZmVyKSlbM10pIDw8IDI0OworCQljYXNlIDM6IGJpdEQtPmJpdENvbnRhaW5lciArPSAoc2l6ZV90KSgoKGNvbnN0IEJZVEUgKikoc3JjQnVmZmVyKSlbMl0pIDw8IDE2OworCQljYXNlIDI6IGJpdEQtPmJpdENvbnRhaW5lciArPSAoc2l6ZV90KSgoKGNvbnN0IEJZVEUgKikoc3JjQnVmZmVyKSlbMV0pIDw8IDg7CisJCWRlZmF1bHQ6OworCQl9CisJCXsKKwkJCUJZVEUgY29uc3QgbGFzdEJ5dGUgPSAoKGNvbnN0IEJZVEUgKilzcmNCdWZmZXIpW3NyY1NpemUgLSAxXTsKKwkJCWJpdEQtPmJpdHNDb25zdW1lZCA9IGxhc3RCeXRlID8gOCAtIEJJVF9oaWdoYml0MzIobGFzdEJ5dGUpIDogMDsKKwkJCWlmIChsYXN0Qnl0ZSA9PSAwKQorCQkJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogZW5kTWFyayBub3QgcHJlc2VudCAqLworCQl9CisJCWJpdEQtPmJpdHNDb25zdW1lZCArPSAoVTMyKShzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKSAtIHNyY1NpemUpICogODsKKwl9CisKKwlyZXR1cm4gc3JjU2l6ZTsKK30KKworWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9nZXRVcHBlckJpdHMoc2l6ZV90IGJpdENvbnRhaW5lciwgVTMyIGNvbnN0IHN0YXJ0KSB7IHJldHVybiBiaXRDb250YWluZXIgPj4gc3RhcnQ7IH0KKworWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9nZXRNaWRkbGVCaXRzKHNpemVfdCBiaXRDb250YWluZXIsIFUzMiBjb25zdCBzdGFydCwgVTMyIGNvbnN0IG5iQml0cykgeyByZXR1cm4gKGJpdENvbnRhaW5lciA+PiBzdGFydCkgJiBCSVRfbWFza1tuYkJpdHNdOyB9CisKK1pTVERfU1RBVElDIHNpemVfdCBCSVRfZ2V0TG93ZXJCaXRzKHNpemVfdCBiaXRDb250YWluZXIsIFUzMiBjb25zdCBuYkJpdHMpIHsgcmV0dXJuIGJpdENvbnRhaW5lciAmIEJJVF9tYXNrW25iQml0c107IH0KKworLyohIEJJVF9sb29rQml0cygpIDoKKyAqICBQcm92aWRlcyBuZXh0IG4gYml0cyBmcm9tIGxvY2FsIHJlZ2lzdGVyLgorICogIGxvY2FsIHJlZ2lzdGVyIGlzIG5vdCBtb2RpZmllZC4KKyAqICBPbiAzMi1iaXRzLCBtYXhOYkJpdHM9PTI0LgorICogIE9uIDY0LWJpdHMsIG1heE5iQml0cz09NTYuCisgKiAgQHJldHVybiA6IHZhbHVlIGV4dHJhY3RlZAorICovCitaU1REX1NUQVRJQyBzaXplX3QgQklUX2xvb2tCaXRzKGNvbnN0IEJJVF9EU3RyZWFtX3QgKmJpdEQsIFUzMiBuYkJpdHMpCit7CisJVTMyIGNvbnN0IGJpdE1hc2sgPSBzaXplb2YoYml0RC0+Yml0Q29udGFpbmVyKSAqIDggLSAxOworCXJldHVybiAoKGJpdEQtPmJpdENvbnRhaW5lciA8PCAoYml0RC0+Yml0c0NvbnN1bWVkICYgYml0TWFzaykpID4+IDEpID4+ICgoYml0TWFzayAtIG5iQml0cykgJiBiaXRNYXNrKTsKK30KKworLyohIEJJVF9sb29rQml0c0Zhc3QoKSA6CisqICAgdW5zYWZlIHZlcnNpb247IG9ubHkgd29ya3Mgb25seSBpZiBuYkJpdHMgPj0gMSAqLworWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9sb29rQml0c0Zhc3QoY29uc3QgQklUX0RTdHJlYW1fdCAqYml0RCwgVTMyIG5iQml0cykKK3sKKwlVMzIgY29uc3QgYml0TWFzayA9IHNpemVvZihiaXRELT5iaXRDb250YWluZXIpICogOCAtIDE7CisJcmV0dXJuIChiaXRELT5iaXRDb250YWluZXIgPDwgKGJpdEQtPmJpdHNDb25zdW1lZCAmIGJpdE1hc2spKSA+PiAoKChiaXRNYXNrICsgMSkgLSBuYkJpdHMpICYgYml0TWFzayk7Cit9CisKK1pTVERfU1RBVElDIHZvaWQgQklUX3NraXBCaXRzKEJJVF9EU3RyZWFtX3QgKmJpdEQsIFUzMiBuYkJpdHMpIHsgYml0RC0+Yml0c0NvbnN1bWVkICs9IG5iQml0czsgfQorCisvKiEgQklUX3JlYWRCaXRzKCkgOgorICogIFJlYWQgKGNvbnN1bWUpIG5leHQgbiBiaXRzIGZyb20gbG9jYWwgcmVnaXN0ZXIgYW5kIHVwZGF0ZS4KKyAqICBQYXkgYXR0ZW50aW9uIHRvIG5vdCByZWFkIG1vcmUgdGhhbiBuYkJpdHMgY29udGFpbmVkIGludG8gbG9jYWwgcmVnaXN0ZXIuCisgKiAgQHJldHVybiA6IGV4dHJhY3RlZCB2YWx1ZS4KKyAqLworWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9yZWFkQml0cyhCSVRfRFN0cmVhbV90ICpiaXRELCBVMzIgbmJCaXRzKQoreworCXNpemVfdCBjb25zdCB2YWx1ZSA9IEJJVF9sb29rQml0cyhiaXRELCBuYkJpdHMpOworCUJJVF9za2lwQml0cyhiaXRELCBuYkJpdHMpOworCXJldHVybiB2YWx1ZTsKK30KKworLyohIEJJVF9yZWFkQml0c0Zhc3QoKSA6CisqICAgdW5zYWZlIHZlcnNpb247IG9ubHkgd29ya3Mgb25seSBpZiBuYkJpdHMgPj0gMSAqLworWlNURF9TVEFUSUMgc2l6ZV90IEJJVF9yZWFkQml0c0Zhc3QoQklUX0RTdHJlYW1fdCAqYml0RCwgVTMyIG5iQml0cykKK3sKKwlzaXplX3QgY29uc3QgdmFsdWUgPSBCSVRfbG9va0JpdHNGYXN0KGJpdEQsIG5iQml0cyk7CisJQklUX3NraXBCaXRzKGJpdEQsIG5iQml0cyk7CisJcmV0dXJuIHZhbHVlOworfQorCisvKiEgQklUX3JlbG9hZERTdHJlYW0oKSA6CisqICAgUmVmaWxsIGBiaXREYCBmcm9tIGJ1ZmZlciBwcmV2aW91c2x5IHNldCBpbiBCSVRfaW5pdERTdHJlYW0oKSAuCisqICAgVGhpcyBmdW5jdGlvbiBpcyBzYWZlLCBpdCBndWFyYW50ZWVzIGl0IHdpbGwgbm90IHJlYWQgYmV5b25kIHNyYyBidWZmZXIuCisqICAgQHJldHVybiA6IHN0YXR1cyBvZiBgQklUX0RTdHJlYW1fdGAgaW50ZXJuYWwgcmVnaXN0ZXIuCisJCQkgIGlmIHN0YXR1cyA9PSBCSVRfRFN0cmVhbV91bmZpbmlzaGVkLCBpbnRlcm5hbCByZWdpc3RlciBpcyBmaWxsZWQgd2l0aCA+PSAoc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikqOCAtIDcpIGJpdHMgKi8KK1pTVERfU1RBVElDIEJJVF9EU3RyZWFtX3N0YXR1cyBCSVRfcmVsb2FkRFN0cmVhbShCSVRfRFN0cmVhbV90ICpiaXREKQoreworCWlmIChiaXRELT5iaXRzQ29uc3VtZWQgPiAoc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikgKiA4KSkgLyogc2hvdWxkIG5vdCBoYXBwZW4gPT4gY29ycnVwdGlvbiBkZXRlY3RlZCAqLworCQlyZXR1cm4gQklUX0RTdHJlYW1fb3ZlcmZsb3c7CisKKwlpZiAoYml0RC0+cHRyID49IGJpdEQtPnN0YXJ0ICsgc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikpIHsKKwkJYml0RC0+cHRyIC09IGJpdEQtPmJpdHNDb25zdW1lZCA+PiAzOworCQliaXRELT5iaXRzQ29uc3VtZWQgJj0gNzsKKwkJYml0RC0+Yml0Q29udGFpbmVyID0gWlNURF9yZWFkTEVTVChiaXRELT5wdHIpOworCQlyZXR1cm4gQklUX0RTdHJlYW1fdW5maW5pc2hlZDsKKwl9CisJaWYgKGJpdEQtPnB0ciA9PSBiaXRELT5zdGFydCkgeworCQlpZiAoYml0RC0+Yml0c0NvbnN1bWVkIDwgc2l6ZW9mKGJpdEQtPmJpdENvbnRhaW5lcikgKiA4KQorCQkJcmV0dXJuIEJJVF9EU3RyZWFtX2VuZE9mQnVmZmVyOworCQlyZXR1cm4gQklUX0RTdHJlYW1fY29tcGxldGVkOworCX0KKwl7CisJCVUzMiBuYkJ5dGVzID0gYml0RC0+Yml0c0NvbnN1bWVkID4+IDM7CisJCUJJVF9EU3RyZWFtX3N0YXR1cyByZXN1bHQgPSBCSVRfRFN0cmVhbV91bmZpbmlzaGVkOworCQlpZiAoYml0RC0+cHRyIC0gbmJCeXRlcyA8IGJpdEQtPnN0YXJ0KSB7CisJCQluYkJ5dGVzID0gKFUzMikoYml0RC0+cHRyIC0gYml0RC0+c3RhcnQpOyAvKiBwdHIgPiBzdGFydCAqLworCQkJcmVzdWx0ID0gQklUX0RTdHJlYW1fZW5kT2ZCdWZmZXI7CisJCX0KKwkJYml0RC0+cHRyIC09IG5iQnl0ZXM7CisJCWJpdEQtPmJpdHNDb25zdW1lZCAtPSBuYkJ5dGVzICogODsKKwkJYml0RC0+Yml0Q29udGFpbmVyID0gWlNURF9yZWFkTEVTVChiaXRELT5wdHIpOyAvKiByZW1pbmRlciA6IHNyY1NpemUgPiBzaXplb2YoYml0RCkgKi8KKwkJcmV0dXJuIHJlc3VsdDsKKwl9Cit9CisKKy8qISBCSVRfZW5kT2ZEU3RyZWFtKCkgOgorKiAgIEByZXR1cm4gVGVsbHMgaWYgRFN0cmVhbSBoYXMgZXhhY3RseSByZWFjaGVkIGl0cyBlbmQgKGFsbCBiaXRzIGNvbnN1bWVkKS4KKyovCitaU1REX1NUQVRJQyB1bnNpZ25lZCBCSVRfZW5kT2ZEU3RyZWFtKGNvbnN0IEJJVF9EU3RyZWFtX3QgKkRTdHJlYW0pCit7CisJcmV0dXJuICgoRFN0cmVhbS0+cHRyID09IERTdHJlYW0tPnN0YXJ0KSAmJiAoRFN0cmVhbS0+Yml0c0NvbnN1bWVkID09IHNpemVvZihEU3RyZWFtLT5iaXRDb250YWluZXIpICogOCkpOworfQorCisjZW5kaWYgLyogQklUU1RSRUFNX0hfTU9EVUxFICovCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2NvbXByZXNzLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxNjZjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvY29tcHJlc3MuYwpAQCAtMCwwICsxLDM0ODQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIFlhbm4gQ29sbGV0LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3pzdGQuCisgKiBBbiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlCisgKiBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QKKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UKKyAqICgiQlNEIikuCisgKi8KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVwZW5kZW5jaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiZnNlLmgiCisjaW5jbHVkZSAiaHVmLmgiCisjaW5jbHVkZSAibWVtLmgiCisjaW5jbHVkZSAienN0ZF9pbnRlcm5hbC5oIiAvKiBpbmNsdWRlcyB6c3RkLmggKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtc2V0ICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIENvbnN0YW50cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGNvbnN0IFUzMiBnX3NlYXJjaFN0cmVuZ3RoID0gODsgLyogY29udHJvbCBza2lwIG92ZXIgaW5jb21wcmVzc2libGUgZGF0YSAqLworI2RlZmluZSBIQVNIX1JFQURfU0laRSA4Cit0eXBlZGVmIGVudW0geyBaU1REY3NfY3JlYXRlZCA9IDAsIFpTVERjc19pbml0LCBaU1REY3Nfb25nb2luZywgWlNURGNzX2VuZGluZyB9IFpTVERfY29tcHJlc3Npb25TdGFnZV9lOworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBIZWxwZXIgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgWlNURF9jb21wcmVzc0JvdW5kKHNpemVfdCBzcmNTaXplKSB7IHJldHVybiBGU0VfY29tcHJlc3NCb3VuZChzcmNTaXplKSArIDEyOyB9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFNlcXVlbmNlIHN0b3JhZ2UKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFpTVERfcmVzZXRTZXFTdG9yZShzZXFTdG9yZV90ICpzc1B0cikKK3sKKwlzc1B0ci0+bGl0ID0gc3NQdHItPmxpdFN0YXJ0OworCXNzUHRyLT5zZXF1ZW5jZXMgPSBzc1B0ci0+c2VxdWVuY2VzU3RhcnQ7CisJc3NQdHItPmxvbmdMZW5ndGhJRCA9IDA7Cit9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIENvbnRleHQgbWVtb3J5IG1hbmFnZW1lbnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0cnVjdCBaU1REX0NDdHhfcyB7CisJY29uc3QgQllURSAqbmV4dFNyYzsgIC8qIG5leHQgYmxvY2sgaGVyZSB0byBjb250aW51ZSBvbiBjdXJyIHByZWZpeCAqLworCWNvbnN0IEJZVEUgKmJhc2U7ICAgICAvKiBBbGwgcmVndWxhciBpbmRleGVzIHJlbGF0aXZlIHRvIHRoaXMgcG9zaXRpb24gKi8KKwljb25zdCBCWVRFICpkaWN0QmFzZTsgLyogZXh0RGljdCBpbmRleGVzIHJlbGF0aXZlIHRvIHRoaXMgcG9zaXRpb24gKi8KKwlVMzIgZGljdExpbWl0OwkvKiBiZWxvdyB0aGF0IHBvaW50LCBuZWVkIGV4dERpY3QgKi8KKwlVMzIgbG93TGltaXQ7CSAvKiBiZWxvdyB0aGF0IHBvaW50LCBubyBtb3JlIGRhdGEgKi8KKwlVMzIgbmV4dFRvVXBkYXRlOyAgICAgLyogaW5kZXggZnJvbSB3aGljaCB0byBjb250aW51ZSBkaWN0aW9uYXJ5IHVwZGF0ZSAqLworCVUzMiBuZXh0VG9VcGRhdGUzOyAgICAvKiBpbmRleCBmcm9tIHdoaWNoIHRvIGNvbnRpbnVlIGRpY3Rpb25hcnkgdXBkYXRlICovCisJVTMyIGhhc2hMb2czOwkgLyogZGlzcGF0Y2ggdGFibGUgOiBsYXJnZXIgPT0gZmFzdGVyLCBtb3JlIG1lbW9yeSAqLworCVUzMiBsb2FkZWREaWN0RW5kOyAgICAvKiBpbmRleCBvZiBlbmQgb2YgZGljdGlvbmFyeSAqLworCVUzMiBmb3JjZVdpbmRvdzsgICAgICAvKiBmb3JjZSBiYWNrLXJlZmVyZW5jZXMgdG8gcmVzcGVjdCBsaW1pdCBvZiAxPDx3TG9nLCBldmVuIGZvciBkaWN0aW9uYXJ5ICovCisJVTMyIGZvcmNlUmF3RGljdDsgICAgIC8qIEZvcmNlIGxvYWRpbmcgZGljdGlvbmFyeSBpbiAiY29udGVudC1vbmx5IiBtb2RlIChubyBoZWFkZXIgYW5hbHlzaXMpICovCisJWlNURF9jb21wcmVzc2lvblN0YWdlX2Ugc3RhZ2U7CisJVTMyIHJlcFtaU1REX1JFUF9OVU1dOworCVUzMiByZXBUb0NvbmZpcm1bWlNURF9SRVBfTlVNXTsKKwlVMzIgZGljdElEOworCVpTVERfcGFyYW1ldGVycyBwYXJhbXM7CisJdm9pZCAqd29ya1NwYWNlOworCXNpemVfdCB3b3JrU3BhY2VTaXplOworCXNpemVfdCBibG9ja1NpemU7CisJVTY0IGZyYW1lQ29udGVudFNpemU7CisJc3RydWN0IHh4aDY0X3N0YXRlIHh4aFN0YXRlOworCVpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbTsKKworCXNlcVN0b3JlX3Qgc2VxU3RvcmU7IC8qIHNlcXVlbmNlcyBzdG9yYWdlIHB0cnMgKi8KKwlVMzIgKmhhc2hUYWJsZTsKKwlVMzIgKmhhc2hUYWJsZTM7CisJVTMyICpjaGFpblRhYmxlOworCUhVRl9DRWx0ICpodWZUYWJsZTsKKwlVMzIgZmxhZ1N0YXRpY1RhYmxlczsKKwlIVUZfcmVwZWF0IGZsYWdTdGF0aWNIdWZUYWJsZTsKKwlGU0VfQ1RhYmxlIG9mZmNvZGVDVGFibGVbRlNFX0NUQUJMRV9TSVpFX1UzMihPZmZGU0VMb2csIE1heE9mZildOworCUZTRV9DVGFibGUgbWF0Y2hsZW5ndGhDVGFibGVbRlNFX0NUQUJMRV9TSVpFX1UzMihNTEZTRUxvZywgTWF4TUwpXTsKKwlGU0VfQ1RhYmxlIGxpdGxlbmd0aENUYWJsZVtGU0VfQ1RBQkxFX1NJWkVfVTMyKExMRlNFTG9nLCBNYXhMTCldOworCXVuc2lnbmVkIHRtcENvdW50ZXJzW0hVRl9DT01QUkVTU19XT1JLU1BBQ0VfU0laRV9VMzJdOworfTsKKworc2l6ZV90IFpTVERfQ0N0eFdvcmtzcGFjZUJvdW5kKFpTVERfY29tcHJlc3Npb25QYXJhbWV0ZXJzIGNQYXJhbXMpCit7CisJc2l6ZV90IGNvbnN0IGJsb2NrU2l6ZSA9IE1JTihaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCwgKHNpemVfdCkxIDw8IGNQYXJhbXMud2luZG93TG9nKTsKKwlVMzIgY29uc3QgZGl2aWRlciA9IChjUGFyYW1zLnNlYXJjaExlbmd0aCA9PSAzKSA/IDMgOiA0OworCXNpemVfdCBjb25zdCBtYXhOYlNlcSA9IGJsb2NrU2l6ZSAvIGRpdmlkZXI7CisJc2l6ZV90IGNvbnN0IHRva2VuU3BhY2UgPSBibG9ja1NpemUgKyAxMSAqIG1heE5iU2VxOworCXNpemVfdCBjb25zdCBjaGFpblNpemUgPSAoY1BhcmFtcy5zdHJhdGVneSA9PSBaU1REX2Zhc3QpID8gMCA6ICgxIDw8IGNQYXJhbXMuY2hhaW5Mb2cpOworCXNpemVfdCBjb25zdCBoU2l6ZSA9ICgoc2l6ZV90KTEpIDw8IGNQYXJhbXMuaGFzaExvZzsKKwlVMzIgY29uc3QgaGFzaExvZzMgPSAoY1BhcmFtcy5zZWFyY2hMZW5ndGggPiAzKSA/IDAgOiBNSU4oWlNURF9IQVNITE9HM19NQVgsIGNQYXJhbXMud2luZG93TG9nKTsKKwlzaXplX3QgY29uc3QgaDNTaXplID0gKChzaXplX3QpMSkgPDwgaGFzaExvZzM7CisJc2l6ZV90IGNvbnN0IHRhYmxlU3BhY2UgPSAoY2hhaW5TaXplICsgaFNpemUgKyBoM1NpemUpICogc2l6ZW9mKFUzMik7CisJc2l6ZV90IGNvbnN0IG9wdFNwYWNlID0KKwkgICAgKChNYXhNTCArIDEpICsgKE1heExMICsgMSkgKyAoTWF4T2ZmICsgMSkgKyAoMSA8PCBMaXRiaXRzKSkgKiBzaXplb2YoVTMyKSArIChaU1REX09QVF9OVU0gKyAxKSAqIChzaXplb2YoWlNURF9tYXRjaF90KSArIHNpemVvZihaU1REX29wdGltYWxfdCkpOworCXNpemVfdCBjb25zdCB3b3Jrc3BhY2VTaXplID0gdGFibGVTcGFjZSArICgyNTYgKiBzaXplb2YoVTMyKSkgLyogaHVmZlRhYmxlICovICsgdG9rZW5TcGFjZSArCisJCQkJICAgICAoKChjUGFyYW1zLnN0cmF0ZWd5ID09IFpTVERfYnRvcHQpIHx8IChjUGFyYW1zLnN0cmF0ZWd5ID09IFpTVERfYnRvcHQyKSkgPyBvcHRTcGFjZSA6IDApOworCisJcmV0dXJuIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfc3RhY2spKSArIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfQ0N0eCkpICsgWlNURF9BTElHTih3b3Jrc3BhY2VTaXplKTsKK30KKworc3RhdGljIFpTVERfQ0N0eCAqWlNURF9jcmVhdGVDQ3R4X2FkdmFuY2VkKFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkKK3sKKwlaU1REX0NDdHggKmNjdHg7CisJaWYgKCFjdXN0b21NZW0uY3VzdG9tQWxsb2MgfHwgIWN1c3RvbU1lbS5jdXN0b21GcmVlKQorCQlyZXR1cm4gTlVMTDsKKwljY3R4ID0gKFpTVERfQ0N0eCAqKVpTVERfbWFsbG9jKHNpemVvZihaU1REX0NDdHgpLCBjdXN0b21NZW0pOworCWlmICghY2N0eCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGNjdHgsIDAsIHNpemVvZihaU1REX0NDdHgpKTsKKwljY3R4LT5jdXN0b21NZW0gPSBjdXN0b21NZW07CisJcmV0dXJuIGNjdHg7Cit9CisKK1pTVERfQ0N0eCAqWlNURF9pbml0Q0N0eCh2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCVpTVERfY3VzdG9tTWVtIGNvbnN0IHN0YWNrTWVtID0gWlNURF9pbml0U3RhY2sod29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwlaU1REX0NDdHggKmNjdHggPSBaU1REX2NyZWF0ZUNDdHhfYWR2YW5jZWQoc3RhY2tNZW0pOworCWlmIChjY3R4KSB7CisJCWNjdHgtPndvcmtTcGFjZSA9IFpTVERfc3RhY2tBbGxvY0FsbChjY3R4LT5jdXN0b21NZW0ub3BhcXVlLCAmY2N0eC0+d29ya1NwYWNlU2l6ZSk7CisJfQorCXJldHVybiBjY3R4OworfQorCitzaXplX3QgWlNURF9mcmVlQ0N0eChaU1REX0NDdHggKmNjdHgpCit7CisJaWYgKGNjdHggPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIHN1cHBvcnQgZnJlZSBvbiBOVUxMICovCisJWlNURF9mcmVlKGNjdHgtPndvcmtTcGFjZSwgY2N0eC0+Y3VzdG9tTWVtKTsKKwlaU1REX2ZyZWUoY2N0eCwgY2N0eC0+Y3VzdG9tTWVtKTsKKwlyZXR1cm4gMDsgLyogcmVzZXJ2ZWQgYXMgYSBwb3RlbnRpYWwgZXJyb3IgY29kZSBpbiB0aGUgZnV0dXJlICovCit9CisKK2NvbnN0IHNlcVN0b3JlX3QgKlpTVERfZ2V0U2VxU3RvcmUoY29uc3QgWlNURF9DQ3R4ICpjdHgpIC8qIGhpZGRlbiBpbnRlcmZhY2UgKi8geyByZXR1cm4gJihjdHgtPnNlcVN0b3JlKTsgfQorCitzdGF0aWMgWlNURF9wYXJhbWV0ZXJzIFpTVERfZ2V0UGFyYW1zRnJvbUNDdHgoY29uc3QgWlNURF9DQ3R4ICpjY3R4KSB7IHJldHVybiBjY3R4LT5wYXJhbXM7IH0KKworLyoqIFpTVERfY2hlY2tQYXJhbXMoKSA6CisJZW5zdXJlIHBhcmFtIHZhbHVlcyByZW1haW4gd2l0aGluIGF1dGhvcml6ZWQgcmFuZ2UuCisJQHJldHVybiA6IDAsIG9yIGFuIGVycm9yIGNvZGUgaWYgb25lIHZhbHVlIGlzIGJleW9uZCBhdXRob3JpemVkIHJhbmdlICovCitzaXplX3QgWlNURF9jaGVja0NQYXJhbXMoWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgY1BhcmFtcykKK3sKKyNkZWZpbmUgQ0xBTVBDSEVDSyh2YWwsIG1pbiwgbWF4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoKHZhbCA8IG1pbikgfCAodmFsID4gbWF4KSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJCXJldHVybiBFUlJPUihjb21wcmVzc2lvblBhcmFtZXRlcl91bnN1cHBvcnRlZCk7IFwKKwl9CisJQ0xBTVBDSEVDSyhjUGFyYW1zLndpbmRvd0xvZywgWlNURF9XSU5ET1dMT0dfTUlOLCBaU1REX1dJTkRPV0xPR19NQVgpOworCUNMQU1QQ0hFQ0soY1BhcmFtcy5jaGFpbkxvZywgWlNURF9DSEFJTkxPR19NSU4sIFpTVERfQ0hBSU5MT0dfTUFYKTsKKwlDTEFNUENIRUNLKGNQYXJhbXMuaGFzaExvZywgWlNURF9IQVNITE9HX01JTiwgWlNURF9IQVNITE9HX01BWCk7CisJQ0xBTVBDSEVDSyhjUGFyYW1zLnNlYXJjaExvZywgWlNURF9TRUFSQ0hMT0dfTUlOLCBaU1REX1NFQVJDSExPR19NQVgpOworCUNMQU1QQ0hFQ0soY1BhcmFtcy5zZWFyY2hMZW5ndGgsIFpTVERfU0VBUkNITEVOR1RIX01JTiwgWlNURF9TRUFSQ0hMRU5HVEhfTUFYKTsKKwlDTEFNUENIRUNLKGNQYXJhbXMudGFyZ2V0TGVuZ3RoLCBaU1REX1RBUkdFVExFTkdUSF9NSU4sIFpTVERfVEFSR0VUTEVOR1RIX01BWCk7CisJaWYgKChVMzIpKGNQYXJhbXMuc3RyYXRlZ3kpID4gKFUzMilaU1REX2J0b3B0MikKKwkJcmV0dXJuIEVSUk9SKGNvbXByZXNzaW9uUGFyYW1ldGVyX3Vuc3VwcG9ydGVkKTsKKwlyZXR1cm4gMDsKK30KKworLyoqIFpTVERfY3ljbGVMb2coKSA6CisgKiAgY29uZGl0aW9uIGZvciBjb3JyZWN0IG9wZXJhdGlvbiA6IGhhc2hMb2cgPiAxICovCitzdGF0aWMgVTMyIFpTVERfY3ljbGVMb2coVTMyIGhhc2hMb2csIFpTVERfc3RyYXRlZ3kgc3RyYXQpCit7CisJVTMyIGNvbnN0IGJ0U2NhbGUgPSAoKFUzMilzdHJhdCA+PSAoVTMyKVpTVERfYnRsYXp5Mik7CisJcmV0dXJuIGhhc2hMb2cgLSBidFNjYWxlOworfQorCisvKiogWlNURF9hZGp1c3RDUGFyYW1zKCkgOgorCW9wdGltaXplIGBjUGFyYCBmb3IgYSBnaXZlbiBpbnB1dCAoYHNyY1NpemVgIGFuZCBgZGljdFNpemVgKS4KKwltb3N0bHkgZG93bnNpemluZyB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uIGFuZCBpbml0aWFsaXphdGlvbi4KKwlCb3RoIGBzcmNTaXplYCBhbmQgYGRpY3RTaXplYCBhcmUgb3B0aW9uYWwgKHVzZSAwIGlmIHVua25vd24pLAorCWJ1dCBpZiBib3RoIGFyZSAwLCBubyBvcHRpbWl6YXRpb24gY2FuIGJlIGRvbmUuCisJTm90ZSA6IGNQYXIgaXMgY29uc2lkZXJlZCB2YWxpZGF0ZWQgYXQgdGhpcyBzdGFnZS4gVXNlIFpTVERfY2hlY2tQYXJhbXMoKSB0byBlbnN1cmUgdGhhdC4gKi8KK1pTVERfY29tcHJlc3Npb25QYXJhbWV0ZXJzIFpTVERfYWRqdXN0Q1BhcmFtcyhaU1REX2NvbXByZXNzaW9uUGFyYW1ldGVycyBjUGFyLCB1bnNpZ25lZCBsb25nIGxvbmcgc3JjU2l6ZSwgc2l6ZV90IGRpY3RTaXplKQoreworCWlmIChzcmNTaXplICsgZGljdFNpemUgPT0gMCkKKwkJcmV0dXJuIGNQYXI7IC8qIG5vIHNpemUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIDogbm8gYWRqdXN0bWVudCAqLworCisJLyogcmVzaXplIHBhcmFtcywgdG8gdXNlIGxlc3MgbWVtb3J5IHdoZW4gbmVjZXNzYXJ5ICovCisJeworCQlVMzIgY29uc3QgbWluU3JjU2l6ZSA9IChzcmNTaXplID09IDApID8gNTAwIDogMDsKKwkJVTY0IGNvbnN0IHJTaXplID0gc3JjU2l6ZSArIGRpY3RTaXplICsgbWluU3JjU2l6ZTsKKwkJaWYgKHJTaXplIDwgKChVNjQpMSA8PCBaU1REX1dJTkRPV0xPR19NQVgpKSB7CisJCQlVMzIgY29uc3Qgc3JjTG9nID0gTUFYKFpTVERfSEFTSExPR19NSU4sIFpTVERfaGlnaGJpdDMyKChVMzIpKHJTaXplKS0xKSArIDEpOworCQkJaWYgKGNQYXIud2luZG93TG9nID4gc3JjTG9nKQorCQkJCWNQYXIud2luZG93TG9nID0gc3JjTG9nOworCQl9CisJfQorCWlmIChjUGFyLmhhc2hMb2cgPiBjUGFyLndpbmRvd0xvZykKKwkJY1Bhci5oYXNoTG9nID0gY1Bhci53aW5kb3dMb2c7CisJeworCQlVMzIgY29uc3QgY3ljbGVMb2cgPSBaU1REX2N5Y2xlTG9nKGNQYXIuY2hhaW5Mb2csIGNQYXIuc3RyYXRlZ3kpOworCQlpZiAoY3ljbGVMb2cgPiBjUGFyLndpbmRvd0xvZykKKwkJCWNQYXIuY2hhaW5Mb2cgLT0gKGN5Y2xlTG9nIC0gY1Bhci53aW5kb3dMb2cpOworCX0KKworCWlmIChjUGFyLndpbmRvd0xvZyA8IFpTVERfV0lORE9XTE9HX0FCU09MVVRFTUlOKQorCQljUGFyLndpbmRvd0xvZyA9IFpTVERfV0lORE9XTE9HX0FCU09MVVRFTUlOOyAvKiByZXF1aXJlZCBmb3IgZnJhbWUgaGVhZGVyICovCisKKwlyZXR1cm4gY1BhcjsKK30KKworc3RhdGljIFUzMiBaU1REX2VxdWl2YWxlbnRQYXJhbXMoWlNURF9wYXJhbWV0ZXJzIHBhcmFtMSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtMikKK3sKKwlyZXR1cm4gKHBhcmFtMS5jUGFyYW1zLmhhc2hMb2cgPT0gcGFyYW0yLmNQYXJhbXMuaGFzaExvZykgJiAocGFyYW0xLmNQYXJhbXMuY2hhaW5Mb2cgPT0gcGFyYW0yLmNQYXJhbXMuY2hhaW5Mb2cpICYKKwkgICAgICAgKHBhcmFtMS5jUGFyYW1zLnN0cmF0ZWd5ID09IHBhcmFtMi5jUGFyYW1zLnN0cmF0ZWd5KSAmICgocGFyYW0xLmNQYXJhbXMuc2VhcmNoTGVuZ3RoID09IDMpID09IChwYXJhbTIuY1BhcmFtcy5zZWFyY2hMZW5ndGggPT0gMykpOworfQorCisvKiEgWlNURF9jb250aW51ZUNDdHgoKSA6CisJcmV1c2UgQ0N0eCB3aXRob3V0IHJlc2V0IChub3RlIDogcmVxdWlyZXMgbm8gZGljdGlvbmFyeSkgKi8KK3N0YXRpYyBzaXplX3QgWlNURF9jb250aW51ZUNDdHgoWlNURF9DQ3R4ICpjY3R4LCBaU1REX3BhcmFtZXRlcnMgcGFyYW1zLCBVNjQgZnJhbWVDb250ZW50U2l6ZSkKK3sKKwlVMzIgY29uc3QgZW5kID0gKFUzMikoY2N0eC0+bmV4dFNyYyAtIGNjdHgtPmJhc2UpOworCWNjdHgtPnBhcmFtcyA9IHBhcmFtczsKKwljY3R4LT5mcmFtZUNvbnRlbnRTaXplID0gZnJhbWVDb250ZW50U2l6ZTsKKwljY3R4LT5sb3dMaW1pdCA9IGVuZDsKKwljY3R4LT5kaWN0TGltaXQgPSBlbmQ7CisJY2N0eC0+bmV4dFRvVXBkYXRlID0gZW5kICsgMTsKKwljY3R4LT5zdGFnZSA9IFpTVERjc19pbml0OworCWNjdHgtPmRpY3RJRCA9IDA7CisJY2N0eC0+bG9hZGVkRGljdEVuZCA9IDA7CisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJY2N0eC0+cmVwW2ldID0gcmVwU3RhcnRWYWx1ZVtpXTsKKwl9CisJY2N0eC0+c2VxU3RvcmUubGl0TGVuZ3RoU3VtID0gMDsgLyogZm9yY2UgcmVzZXQgb2YgYnRvcHQgc3RhdHMgKi8KKwl4eGg2NF9yZXNldCgmY2N0eC0+eHhoU3RhdGUsIDApOworCXJldHVybiAwOworfQorCit0eXBlZGVmIGVudW0geyBaU1REY3JwX2NvbnRpbnVlLCBaU1REY3JwX25vTWVtc2V0LCBaU1REY3JwX2Z1bGxSZXNldCB9IFpTVERfY29tcFJlc2V0UG9saWN5X2U7CisKKy8qISBaU1REX3Jlc2V0Q0N0eF9hZHZhbmNlZCgpIDoKKwlub3RlIDogYHBhcmFtc2AgbXVzdCBiZSB2YWxpZGF0ZWQgKi8KK3N0YXRpYyBzaXplX3QgWlNURF9yZXNldENDdHhfYWR2YW5jZWQoWlNURF9DQ3R4ICp6YywgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcywgVTY0IGZyYW1lQ29udGVudFNpemUsIFpTVERfY29tcFJlc2V0UG9saWN5X2UgY29uc3QgY3JwKQoreworCWlmIChjcnAgPT0gWlNURGNycF9jb250aW51ZSkKKwkJaWYgKFpTVERfZXF1aXZhbGVudFBhcmFtcyhwYXJhbXMsIHpjLT5wYXJhbXMpKSB7CisJCQl6Yy0+ZmxhZ1N0YXRpY1RhYmxlcyA9IDA7CisJCQl6Yy0+ZmxhZ1N0YXRpY0h1ZlRhYmxlID0gSFVGX3JlcGVhdF9ub25lOworCQkJcmV0dXJuIFpTVERfY29udGludWVDQ3R4KHpjLCBwYXJhbXMsIGZyYW1lQ29udGVudFNpemUpOworCQl9CisKKwl7CisJCXNpemVfdCBjb25zdCBibG9ja1NpemUgPSBNSU4oWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgsIChzaXplX3QpMSA8PCBwYXJhbXMuY1BhcmFtcy53aW5kb3dMb2cpOworCQlVMzIgY29uc3QgZGl2aWRlciA9IChwYXJhbXMuY1BhcmFtcy5zZWFyY2hMZW5ndGggPT0gMykgPyAzIDogNDsKKwkJc2l6ZV90IGNvbnN0IG1heE5iU2VxID0gYmxvY2tTaXplIC8gZGl2aWRlcjsKKwkJc2l6ZV90IGNvbnN0IHRva2VuU3BhY2UgPSBibG9ja1NpemUgKyAxMSAqIG1heE5iU2VxOworCQlzaXplX3QgY29uc3QgY2hhaW5TaXplID0gKHBhcmFtcy5jUGFyYW1zLnN0cmF0ZWd5ID09IFpTVERfZmFzdCkgPyAwIDogKDEgPDwgcGFyYW1zLmNQYXJhbXMuY2hhaW5Mb2cpOworCQlzaXplX3QgY29uc3QgaFNpemUgPSAoKHNpemVfdCkxKSA8PCBwYXJhbXMuY1BhcmFtcy5oYXNoTG9nOworCQlVMzIgY29uc3QgaGFzaExvZzMgPSAocGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoID4gMykgPyAwIDogTUlOKFpTVERfSEFTSExPRzNfTUFYLCBwYXJhbXMuY1BhcmFtcy53aW5kb3dMb2cpOworCQlzaXplX3QgY29uc3QgaDNTaXplID0gKChzaXplX3QpMSkgPDwgaGFzaExvZzM7CisJCXNpemVfdCBjb25zdCB0YWJsZVNwYWNlID0gKGNoYWluU2l6ZSArIGhTaXplICsgaDNTaXplKSAqIHNpemVvZihVMzIpOworCQl2b2lkICpwdHI7CisKKwkJLyogQ2hlY2sgaWYgd29ya1NwYWNlIGlzIGxhcmdlIGVub3VnaCwgYWxsb2MgYSBuZXcgb25lIGlmIG5lZWRlZCAqLworCQl7CisJCQlzaXplX3QgY29uc3Qgb3B0U3BhY2UgPSAoKE1heE1MICsgMSkgKyAoTWF4TEwgKyAxKSArIChNYXhPZmYgKyAxKSArICgxIDw8IExpdGJpdHMpKSAqIHNpemVvZihVMzIpICsKKwkJCQkJCShaU1REX09QVF9OVU0gKyAxKSAqIChzaXplb2YoWlNURF9tYXRjaF90KSArIHNpemVvZihaU1REX29wdGltYWxfdCkpOworCQkJc2l6ZV90IGNvbnN0IG5lZWRlZFNwYWNlID0gdGFibGVTcGFjZSArICgyNTYgKiBzaXplb2YoVTMyKSkgLyogaHVmZlRhYmxlICovICsgdG9rZW5TcGFjZSArCisJCQkJCQkgICAoKChwYXJhbXMuY1BhcmFtcy5zdHJhdGVneSA9PSBaU1REX2J0b3B0KSB8fCAocGFyYW1zLmNQYXJhbXMuc3RyYXRlZ3kgPT0gWlNURF9idG9wdDIpKSA/IG9wdFNwYWNlIDogMCk7CisJCQlpZiAoemMtPndvcmtTcGFjZVNpemUgPCBuZWVkZWRTcGFjZSkgeworCQkJCVpTVERfZnJlZSh6Yy0+d29ya1NwYWNlLCB6Yy0+Y3VzdG9tTWVtKTsKKwkJCQl6Yy0+d29ya1NwYWNlID0gWlNURF9tYWxsb2MobmVlZGVkU3BhY2UsIHpjLT5jdXN0b21NZW0pOworCQkJCWlmICh6Yy0+d29ya1NwYWNlID09IE5VTEwpCisJCQkJCXJldHVybiBFUlJPUihtZW1vcnlfYWxsb2NhdGlvbik7CisJCQkJemMtPndvcmtTcGFjZVNpemUgPSBuZWVkZWRTcGFjZTsKKwkJCX0KKwkJfQorCisJCWlmIChjcnAgIT0gWlNURGNycF9ub01lbXNldCkKKwkJCW1lbXNldCh6Yy0+d29ya1NwYWNlLCAwLCB0YWJsZVNwYWNlKTsgLyogcmVzZXQgdGFibGVzIG9ubHkgKi8KKwkJeHhoNjRfcmVzZXQoJnpjLT54eGhTdGF0ZSwgMCk7CisJCXpjLT5oYXNoTG9nMyA9IGhhc2hMb2czOworCQl6Yy0+aGFzaFRhYmxlID0gKFUzMiAqKSh6Yy0+d29ya1NwYWNlKTsKKwkJemMtPmNoYWluVGFibGUgPSB6Yy0+aGFzaFRhYmxlICsgaFNpemU7CisJCXpjLT5oYXNoVGFibGUzID0gemMtPmNoYWluVGFibGUgKyBjaGFpblNpemU7CisJCXB0ciA9IHpjLT5oYXNoVGFibGUzICsgaDNTaXplOworCQl6Yy0+aHVmVGFibGUgPSAoSFVGX0NFbHQgKilwdHI7CisJCXpjLT5mbGFnU3RhdGljVGFibGVzID0gMDsKKwkJemMtPmZsYWdTdGF0aWNIdWZUYWJsZSA9IEhVRl9yZXBlYXRfbm9uZTsKKwkJcHRyID0gKChVMzIgKilwdHIpICsgMjU2OyAvKiBub3RlIDogSFVGX0NFbHQqIGlzIGluY29tcGxldGUgdHlwZSwgc2l6ZSBpcyBzaW11bGF0ZWQgdXNpbmcgVTMyICovCisKKwkJemMtPm5leHRUb1VwZGF0ZSA9IDE7CisJCXpjLT5uZXh0U3JjID0gTlVMTDsKKwkJemMtPmJhc2UgPSBOVUxMOworCQl6Yy0+ZGljdEJhc2UgPSBOVUxMOworCQl6Yy0+ZGljdExpbWl0ID0gMDsKKwkJemMtPmxvd0xpbWl0ID0gMDsKKwkJemMtPnBhcmFtcyA9IHBhcmFtczsKKwkJemMtPmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKKwkJemMtPmZyYW1lQ29udGVudFNpemUgPSBmcmFtZUNvbnRlbnRTaXplOworCQl7CisJCQlpbnQgaTsKKwkJCWZvciAoaSA9IDA7IGkgPCBaU1REX1JFUF9OVU07IGkrKykKKwkJCQl6Yy0+cmVwW2ldID0gcmVwU3RhcnRWYWx1ZVtpXTsKKwkJfQorCisJCWlmICgocGFyYW1zLmNQYXJhbXMuc3RyYXRlZ3kgPT0gWlNURF9idG9wdCkgfHwgKHBhcmFtcy5jUGFyYW1zLnN0cmF0ZWd5ID09IFpTVERfYnRvcHQyKSkgeworCQkJemMtPnNlcVN0b3JlLmxpdEZyZXEgPSAoVTMyICopcHRyOworCQkJemMtPnNlcVN0b3JlLmxpdExlbmd0aEZyZXEgPSB6Yy0+c2VxU3RvcmUubGl0RnJlcSArICgxIDw8IExpdGJpdHMpOworCQkJemMtPnNlcVN0b3JlLm1hdGNoTGVuZ3RoRnJlcSA9IHpjLT5zZXFTdG9yZS5saXRMZW5ndGhGcmVxICsgKE1heExMICsgMSk7CisJCQl6Yy0+c2VxU3RvcmUub2ZmQ29kZUZyZXEgPSB6Yy0+c2VxU3RvcmUubWF0Y2hMZW5ndGhGcmVxICsgKE1heE1MICsgMSk7CisJCQlwdHIgPSB6Yy0+c2VxU3RvcmUub2ZmQ29kZUZyZXEgKyAoTWF4T2ZmICsgMSk7CisJCQl6Yy0+c2VxU3RvcmUubWF0Y2hUYWJsZSA9IChaU1REX21hdGNoX3QgKilwdHI7CisJCQlwdHIgPSB6Yy0+c2VxU3RvcmUubWF0Y2hUYWJsZSArIFpTVERfT1BUX05VTSArIDE7CisJCQl6Yy0+c2VxU3RvcmUucHJpY2VUYWJsZSA9IChaU1REX29wdGltYWxfdCAqKXB0cjsKKwkJCXB0ciA9IHpjLT5zZXFTdG9yZS5wcmljZVRhYmxlICsgWlNURF9PUFRfTlVNICsgMTsKKwkJCXpjLT5zZXFTdG9yZS5saXRMZW5ndGhTdW0gPSAwOworCQl9CisJCXpjLT5zZXFTdG9yZS5zZXF1ZW5jZXNTdGFydCA9IChzZXFEZWYgKilwdHI7CisJCXB0ciA9IHpjLT5zZXFTdG9yZS5zZXF1ZW5jZXNTdGFydCArIG1heE5iU2VxOworCQl6Yy0+c2VxU3RvcmUubGxDb2RlID0gKEJZVEUgKilwdHI7CisJCXpjLT5zZXFTdG9yZS5tbENvZGUgPSB6Yy0+c2VxU3RvcmUubGxDb2RlICsgbWF4TmJTZXE7CisJCXpjLT5zZXFTdG9yZS5vZkNvZGUgPSB6Yy0+c2VxU3RvcmUubWxDb2RlICsgbWF4TmJTZXE7CisJCXpjLT5zZXFTdG9yZS5saXRTdGFydCA9IHpjLT5zZXFTdG9yZS5vZkNvZGUgKyBtYXhOYlNlcTsKKworCQl6Yy0+c3RhZ2UgPSBaU1REY3NfaW5pdDsKKwkJemMtPmRpY3RJRCA9IDA7CisJCXpjLT5sb2FkZWREaWN0RW5kID0gMDsKKworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qIFpTVERfaW52YWxpZGF0ZVJlcENvZGVzKCkgOgorICogZW5zdXJlcyBuZXh0IGNvbXByZXNzaW9uIHdpbGwgbm90IHVzZSByZXBjb2RlcyBmcm9tIHByZXZpb3VzIGJsb2NrLgorICogTm90ZSA6IG9ubHkgd29ya3Mgd2l0aCByZWd1bGFyIHZhcmlhbnQ7CisgKiAgICAgICAgZG8gbm90IHVzZSB3aXRoIGV4dERpY3QgdmFyaWFudCAhICovCit2b2lkIFpTVERfaW52YWxpZGF0ZVJlcENvZGVzKFpTVERfQ0N0eCAqY2N0eCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspCisJCWNjdHgtPnJlcFtpXSA9IDA7Cit9CisKKy8qISBaU1REX2NvcHlDQ3R4KCkgOgorKiAgIER1cGxpY2F0ZSBhbiBleGlzdGluZyBjb250ZXh0IGBzcmNDQ3R4YCBpbnRvIGFub3RoZXIgb25lIGBkc3RDQ3R4YC4KKyogICBPbmx5IHdvcmtzIGR1cmluZyBzdGFnZSBaU1REY3NfaW5pdCAoaS5lLiBhZnRlciBjcmVhdGlvbiwgYnV0IGJlZm9yZSBmaXJzdCBjYWxsIHRvIFpTVERfY29tcHJlc3NDb250aW51ZSgpKS4KKyogICBAcmV0dXJuIDogMCwgb3IgYW4gZXJyb3IgY29kZSAqLworc2l6ZV90IFpTVERfY29weUNDdHgoWlNURF9DQ3R4ICpkc3RDQ3R4LCBjb25zdCBaU1REX0NDdHggKnNyY0NDdHgsIHVuc2lnbmVkIGxvbmcgbG9uZyBwbGVkZ2VkU3JjU2l6ZSkKK3sKKwlpZiAoc3JjQ0N0eC0+c3RhZ2UgIT0gWlNURGNzX2luaXQpCisJCXJldHVybiBFUlJPUihzdGFnZV93cm9uZyk7CisKKwltZW1jcHkoJmRzdENDdHgtPmN1c3RvbU1lbSwgJnNyY0NDdHgtPmN1c3RvbU1lbSwgc2l6ZW9mKFpTVERfY3VzdG9tTWVtKSk7CisJeworCQlaU1REX3BhcmFtZXRlcnMgcGFyYW1zID0gc3JjQ0N0eC0+cGFyYW1zOworCQlwYXJhbXMuZlBhcmFtcy5jb250ZW50U2l6ZUZsYWcgPSAocGxlZGdlZFNyY1NpemUgPiAwKTsKKwkJWlNURF9yZXNldENDdHhfYWR2YW5jZWQoZHN0Q0N0eCwgcGFyYW1zLCBwbGVkZ2VkU3JjU2l6ZSwgWlNURGNycF9ub01lbXNldCk7CisJfQorCisJLyogY29weSB0YWJsZXMgKi8KKwl7CisJCXNpemVfdCBjb25zdCBjaGFpblNpemUgPSAoc3JjQ0N0eC0+cGFyYW1zLmNQYXJhbXMuc3RyYXRlZ3kgPT0gWlNURF9mYXN0KSA/IDAgOiAoMSA8PCBzcmNDQ3R4LT5wYXJhbXMuY1BhcmFtcy5jaGFpbkxvZyk7CisJCXNpemVfdCBjb25zdCBoU2l6ZSA9ICgoc2l6ZV90KTEpIDw8IHNyY0NDdHgtPnBhcmFtcy5jUGFyYW1zLmhhc2hMb2c7CisJCXNpemVfdCBjb25zdCBoM1NpemUgPSAoc2l6ZV90KTEgPDwgc3JjQ0N0eC0+aGFzaExvZzM7CisJCXNpemVfdCBjb25zdCB0YWJsZVNwYWNlID0gKGNoYWluU2l6ZSArIGhTaXplICsgaDNTaXplKSAqIHNpemVvZihVMzIpOworCQltZW1jcHkoZHN0Q0N0eC0+d29ya1NwYWNlLCBzcmNDQ3R4LT53b3JrU3BhY2UsIHRhYmxlU3BhY2UpOworCX0KKworCS8qIGNvcHkgZGljdGlvbmFyeSBvZmZzZXRzICovCisJZHN0Q0N0eC0+bmV4dFRvVXBkYXRlID0gc3JjQ0N0eC0+bmV4dFRvVXBkYXRlOworCWRzdENDdHgtPm5leHRUb1VwZGF0ZTMgPSBzcmNDQ3R4LT5uZXh0VG9VcGRhdGUzOworCWRzdENDdHgtPm5leHRTcmMgPSBzcmNDQ3R4LT5uZXh0U3JjOworCWRzdENDdHgtPmJhc2UgPSBzcmNDQ3R4LT5iYXNlOworCWRzdENDdHgtPmRpY3RCYXNlID0gc3JjQ0N0eC0+ZGljdEJhc2U7CisJZHN0Q0N0eC0+ZGljdExpbWl0ID0gc3JjQ0N0eC0+ZGljdExpbWl0OworCWRzdENDdHgtPmxvd0xpbWl0ID0gc3JjQ0N0eC0+bG93TGltaXQ7CisJZHN0Q0N0eC0+bG9hZGVkRGljdEVuZCA9IHNyY0NDdHgtPmxvYWRlZERpY3RFbmQ7CisJZHN0Q0N0eC0+ZGljdElEID0gc3JjQ0N0eC0+ZGljdElEOworCisJLyogY29weSBlbnRyb3B5IHRhYmxlcyAqLworCWRzdENDdHgtPmZsYWdTdGF0aWNUYWJsZXMgPSBzcmNDQ3R4LT5mbGFnU3RhdGljVGFibGVzOworCWRzdENDdHgtPmZsYWdTdGF0aWNIdWZUYWJsZSA9IHNyY0NDdHgtPmZsYWdTdGF0aWNIdWZUYWJsZTsKKwlpZiAoc3JjQ0N0eC0+ZmxhZ1N0YXRpY1RhYmxlcykgeworCQltZW1jcHkoZHN0Q0N0eC0+bGl0bGVuZ3RoQ1RhYmxlLCBzcmNDQ3R4LT5saXRsZW5ndGhDVGFibGUsIHNpemVvZihkc3RDQ3R4LT5saXRsZW5ndGhDVGFibGUpKTsKKwkJbWVtY3B5KGRzdENDdHgtPm1hdGNobGVuZ3RoQ1RhYmxlLCBzcmNDQ3R4LT5tYXRjaGxlbmd0aENUYWJsZSwgc2l6ZW9mKGRzdENDdHgtPm1hdGNobGVuZ3RoQ1RhYmxlKSk7CisJCW1lbWNweShkc3RDQ3R4LT5vZmZjb2RlQ1RhYmxlLCBzcmNDQ3R4LT5vZmZjb2RlQ1RhYmxlLCBzaXplb2YoZHN0Q0N0eC0+b2ZmY29kZUNUYWJsZSkpOworCX0KKwlpZiAoc3JjQ0N0eC0+ZmxhZ1N0YXRpY0h1ZlRhYmxlKSB7CisJCW1lbWNweShkc3RDQ3R4LT5odWZUYWJsZSwgc3JjQ0N0eC0+aHVmVGFibGUsIDI1NiAqIDQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiEgWlNURF9yZWR1Y2VUYWJsZSgpIDoKKyogICByZWR1Y2UgdGFibGUgaW5kZXhlcyBieSBgcmVkdWNlclZhbHVlYCAqLworc3RhdGljIHZvaWQgWlNURF9yZWR1Y2VUYWJsZShVMzIgKmNvbnN0IHRhYmxlLCBVMzIgY29uc3Qgc2l6ZSwgVTMyIGNvbnN0IHJlZHVjZXJWYWx1ZSkKK3sKKwlVMzIgdTsKKwlmb3IgKHUgPSAwOyB1IDwgc2l6ZTsgdSsrKSB7CisJCWlmICh0YWJsZVt1XSA8IHJlZHVjZXJWYWx1ZSkKKwkJCXRhYmxlW3VdID0gMDsKKwkJZWxzZQorCQkJdGFibGVbdV0gLT0gcmVkdWNlclZhbHVlOworCX0KK30KKworLyohIFpTVERfcmVkdWNlSW5kZXgoKSA6CisqICAgcmVzY2FsZSBhbGwgaW5kZXhlcyB0byBhdm9pZCBmdXR1cmUgb3ZlcmZsb3cgKGluZGV4ZXMgYXJlIFUzMikgKi8KK3N0YXRpYyB2b2lkIFpTVERfcmVkdWNlSW5kZXgoWlNURF9DQ3R4ICp6YywgY29uc3QgVTMyIHJlZHVjZXJWYWx1ZSkKK3sKKwl7CisJCVUzMiBjb25zdCBoU2l6ZSA9IDEgPDwgemMtPnBhcmFtcy5jUGFyYW1zLmhhc2hMb2c7CisJCVpTVERfcmVkdWNlVGFibGUoemMtPmhhc2hUYWJsZSwgaFNpemUsIHJlZHVjZXJWYWx1ZSk7CisJfQorCisJeworCQlVMzIgY29uc3QgY2hhaW5TaXplID0gKHpjLT5wYXJhbXMuY1BhcmFtcy5zdHJhdGVneSA9PSBaU1REX2Zhc3QpID8gMCA6ICgxIDw8IHpjLT5wYXJhbXMuY1BhcmFtcy5jaGFpbkxvZyk7CisJCVpTVERfcmVkdWNlVGFibGUoemMtPmNoYWluVGFibGUsIGNoYWluU2l6ZSwgcmVkdWNlclZhbHVlKTsKKwl9CisKKwl7CisJCVUzMiBjb25zdCBoM1NpemUgPSAoemMtPmhhc2hMb2czKSA/IDEgPDwgemMtPmhhc2hMb2czIDogMDsKKwkJWlNURF9yZWR1Y2VUYWJsZSh6Yy0+aGFzaFRhYmxlMywgaDNTaXplLCByZWR1Y2VyVmFsdWUpOworCX0KK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQmxvY2sgZW50cm9waWMgY29tcHJlc3Npb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU2VlIGRvYy96c3RkX2NvbXByZXNzaW9uX2Zvcm1hdC5tZCBmb3IgZGV0YWlsZWQgZm9ybWF0IGRlc2NyaXB0aW9uICovCisKK3NpemVfdCBaU1REX25vQ29tcHJlc3NCbG9jayh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlpZiAoc3JjU2l6ZSArIFpTVERfYmxvY2tIZWFkZXJTaXplID4gZHN0Q2FwYWNpdHkpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwltZW1jcHkoKEJZVEUgKilkc3QgKyBaU1REX2Jsb2NrSGVhZGVyU2l6ZSwgc3JjLCBzcmNTaXplKTsKKwlaU1REX3dyaXRlTEUyNChkc3QsIChVMzIpKHNyY1NpemUgPDwgMikgKyAoVTMyKWJ0X3Jhdyk7CisJcmV0dXJuIFpTVERfYmxvY2tIZWFkZXJTaXplICsgc3JjU2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBaU1REX25vQ29tcHJlc3NMaXRlcmFscyh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqIGNvbnN0KWRzdDsKKwlVMzIgY29uc3QgZmxTaXplID0gMSArIChzcmNTaXplID4gMzEpICsgKHNyY1NpemUgPiA0MDk1KTsKKworCWlmIChzcmNTaXplICsgZmxTaXplID4gZHN0Q2FwYWNpdHkpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKworCXN3aXRjaCAoZmxTaXplKSB7CisJY2FzZSAxOiAvKiAyIC0gMSAtIDUgKi8gb3N0YXJ0WzBdID0gKEJZVEUpKChVMzIpc2V0X2Jhc2ljICsgKHNyY1NpemUgPDwgMykpOyBicmVhazsKKwljYXNlIDI6IC8qIDIgLSAyIC0gMTIgKi8gWlNURF93cml0ZUxFMTYob3N0YXJ0LCAoVTE2KSgoVTMyKXNldF9iYXNpYyArICgxIDw8IDIpICsgKHNyY1NpemUgPDwgNCkpKTsgYnJlYWs7CisJZGVmYXVsdDogLypub3RlIDogc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgOiBmbFNpemUgaXMgd2l0aGluIHsxLDIsM30gKi8KKwljYXNlIDM6IC8qIDIgLSAyIC0gMjAgKi8gWlNURF93cml0ZUxFMzIob3N0YXJ0LCAoVTMyKSgoVTMyKXNldF9iYXNpYyArICgzIDw8IDIpICsgKHNyY1NpemUgPDwgNCkpKTsgYnJlYWs7CisJfQorCisJbWVtY3B5KG9zdGFydCArIGZsU2l6ZSwgc3JjLCBzcmNTaXplKTsKKwlyZXR1cm4gc3JjU2l6ZSArIGZsU2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBaU1REX2NvbXByZXNzUmxlTGl0ZXJhbHNCbG9jayh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqIGNvbnN0KWRzdDsKKwlVMzIgY29uc3QgZmxTaXplID0gMSArIChzcmNTaXplID4gMzEpICsgKHNyY1NpemUgPiA0MDk1KTsKKworCSh2b2lkKWRzdENhcGFjaXR5OyAvKiBkc3RDYXBhY2l0eSBhbHJlYWR5IGd1YXJhbnRlZWQgdG8gYmUgPj00LCBoZW5jZSBsYXJnZSBlbm91Z2ggKi8KKworCXN3aXRjaCAoZmxTaXplKSB7CisJY2FzZSAxOiAvKiAyIC0gMSAtIDUgKi8gb3N0YXJ0WzBdID0gKEJZVEUpKChVMzIpc2V0X3JsZSArIChzcmNTaXplIDw8IDMpKTsgYnJlYWs7CisJY2FzZSAyOiAvKiAyIC0gMiAtIDEyICovIFpTVERfd3JpdGVMRTE2KG9zdGFydCwgKFUxNikoKFUzMilzZXRfcmxlICsgKDEgPDwgMikgKyAoc3JjU2l6ZSA8PCA0KSkpOyBicmVhazsKKwlkZWZhdWx0OiAvKm5vdGUgOiBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSA6IGZsU2l6ZSBpcyBuZWNlc3NhcmlseSB3aXRoaW4gezEsMiwzfSAqLworCWNhc2UgMzogLyogMiAtIDIgLSAyMCAqLyBaU1REX3dyaXRlTEUzMihvc3RhcnQsIChVMzIpKChVMzIpc2V0X3JsZSArICgzIDw8IDIpICsgKHNyY1NpemUgPDwgNCkpKTsgYnJlYWs7CisJfQorCisJb3N0YXJ0W2ZsU2l6ZV0gPSAqKGNvbnN0IEJZVEUgKilzcmM7CisJcmV0dXJuIGZsU2l6ZSArIDE7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9taW5HYWluKHNpemVfdCBzcmNTaXplKSB7IHJldHVybiAoc3JjU2l6ZSA+PiA2KSArIDI7IH0KKworc3RhdGljIHNpemVfdCBaU1REX2NvbXByZXNzTGl0ZXJhbHMoWlNURF9DQ3R4ICp6Yywgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJc2l6ZV90IGNvbnN0IG1pbkdhaW4gPSBaU1REX21pbkdhaW4oc3JjU2l6ZSk7CisJc2l6ZV90IGNvbnN0IGxoU2l6ZSA9IDMgKyAoc3JjU2l6ZSA+PSAxIEtCKSArIChzcmNTaXplID49IDE2IEtCKTsKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWRzdDsKKwlVMzIgc2luZ2xlU3RyZWFtID0gc3JjU2l6ZSA8IDI1NjsKKwlzeW1ib2xFbmNvZGluZ1R5cGVfZSBoVHlwZSA9IHNldF9jb21wcmVzc2VkOworCXNpemVfdCBjTGl0U2l6ZTsKKworLyogc21hbGwgPyBkb24ndCBldmVuIGF0dGVtcHQgY29tcHJlc3Npb24gKHNwZWVkIG9wdCkgKi8KKyNkZWZpbmUgTElURVJBTF9OT0VOVFJPUFkgNjMKKwl7CisJCXNpemVfdCBjb25zdCBtaW5MaXRTaXplID0gemMtPmZsYWdTdGF0aWNIdWZUYWJsZSA9PSBIVUZfcmVwZWF0X3ZhbGlkID8gNiA6IExJVEVSQUxfTk9FTlRST1BZOworCQlpZiAoc3JjU2l6ZSA8PSBtaW5MaXRTaXplKQorCQkJcmV0dXJuIFpTVERfbm9Db21wcmVzc0xpdGVyYWxzKGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSk7CisJfQorCisJaWYgKGRzdENhcGFjaXR5IDwgbGhTaXplICsgMSkKKwkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOyAvKiBub3QgZW5vdWdoIHNwYWNlIGZvciBjb21wcmVzc2lvbiAqLworCXsKKwkJSFVGX3JlcGVhdCByZXBlYXQgPSB6Yy0+ZmxhZ1N0YXRpY0h1ZlRhYmxlOworCQlpbnQgY29uc3QgcHJlZmVyUmVwZWF0ID0gemMtPnBhcmFtcy5jUGFyYW1zLnN0cmF0ZWd5IDwgWlNURF9sYXp5ID8gc3JjU2l6ZSA8PSAxMDI0IDogMDsKKwkJaWYgKHJlcGVhdCA9PSBIVUZfcmVwZWF0X3ZhbGlkICYmIGxoU2l6ZSA9PSAzKQorCQkJc2luZ2xlU3RyZWFtID0gMTsKKwkJY0xpdFNpemUgPSBzaW5nbGVTdHJlYW0gPyBIVUZfY29tcHJlc3MxWF9yZXBlYXQob3N0YXJ0ICsgbGhTaXplLCBkc3RDYXBhY2l0eSAtIGxoU2l6ZSwgc3JjLCBzcmNTaXplLCAyNTUsIDExLCB6Yy0+dG1wQ291bnRlcnMsCisJCQkJCQkJCXNpemVvZih6Yy0+dG1wQ291bnRlcnMpLCB6Yy0+aHVmVGFibGUsICZyZXBlYXQsIHByZWZlclJlcGVhdCkKKwkJCQkJOiBIVUZfY29tcHJlc3M0WF9yZXBlYXQob3N0YXJ0ICsgbGhTaXplLCBkc3RDYXBhY2l0eSAtIGxoU2l6ZSwgc3JjLCBzcmNTaXplLCAyNTUsIDExLCB6Yy0+dG1wQ291bnRlcnMsCisJCQkJCQkJCXNpemVvZih6Yy0+dG1wQ291bnRlcnMpLCB6Yy0+aHVmVGFibGUsICZyZXBlYXQsIHByZWZlclJlcGVhdCk7CisJCWlmIChyZXBlYXQgIT0gSFVGX3JlcGVhdF9ub25lKSB7CisJCQloVHlwZSA9IHNldF9yZXBlYXQ7CisJCX0gLyogcmV1c2VkIHRoZSBleGlzdGluZyB0YWJsZSAqLworCQllbHNlIHsKKwkJCXpjLT5mbGFnU3RhdGljSHVmVGFibGUgPSBIVUZfcmVwZWF0X2NoZWNrOworCQl9IC8qIG5vdyBoYXZlIGEgdGFibGUgdG8gcmV1c2UgKi8KKwl9CisKKwlpZiAoKGNMaXRTaXplID09IDApIHwgKGNMaXRTaXplID49IHNyY1NpemUgLSBtaW5HYWluKSkgeworCQl6Yy0+ZmxhZ1N0YXRpY0h1ZlRhYmxlID0gSFVGX3JlcGVhdF9ub25lOworCQlyZXR1cm4gWlNURF9ub0NvbXByZXNzTGl0ZXJhbHMoZHN0LCBkc3RDYXBhY2l0eSwgc3JjLCBzcmNTaXplKTsKKwl9CisJaWYgKGNMaXRTaXplID09IDEpIHsKKwkJemMtPmZsYWdTdGF0aWNIdWZUYWJsZSA9IEhVRl9yZXBlYXRfbm9uZTsKKwkJcmV0dXJuIFpTVERfY29tcHJlc3NSbGVMaXRlcmFsc0Jsb2NrKGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSk7CisJfQorCisJLyogQnVpbGQgaGVhZGVyICovCisJc3dpdGNoIChsaFNpemUpIHsKKwljYXNlIDM6IC8qIDIgLSAyIC0gMTAgLSAxMCAqLworCXsKKwkJVTMyIGNvbnN0IGxoYyA9IGhUeXBlICsgKCghc2luZ2xlU3RyZWFtKSA8PCAyKSArICgoVTMyKXNyY1NpemUgPDwgNCkgKyAoKFUzMiljTGl0U2l6ZSA8PCAxNCk7CisJCVpTVERfd3JpdGVMRTI0KG9zdGFydCwgbGhjKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgNDogLyogMiAtIDIgLSAxNCAtIDE0ICovCisJeworCQlVMzIgY29uc3QgbGhjID0gaFR5cGUgKyAoMiA8PCAyKSArICgoVTMyKXNyY1NpemUgPDwgNCkgKyAoKFUzMiljTGl0U2l6ZSA8PCAxOCk7CisJCVpTVERfd3JpdGVMRTMyKG9zdGFydCwgbGhjKTsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6IC8qIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5LCBsaFNpemUgaXMgb25seSB7Myw0LDV9ICovCisJY2FzZSA1OiAgLyogMiAtIDIgLSAxOCAtIDE4ICovCisJeworCQlVMzIgY29uc3QgbGhjID0gaFR5cGUgKyAoMyA8PCAyKSArICgoVTMyKXNyY1NpemUgPDwgNCkgKyAoKFUzMiljTGl0U2l6ZSA8PCAyMik7CisJCVpTVERfd3JpdGVMRTMyKG9zdGFydCwgbGhjKTsKKwkJb3N0YXJ0WzRdID0gKEJZVEUpKGNMaXRTaXplID4+IDEwKTsKKwkJYnJlYWs7CisJfQorCX0KKwlyZXR1cm4gbGhTaXplICsgY0xpdFNpemU7Cit9CisKK3N0YXRpYyBjb25zdCBCWVRFIExMX0NvZGVbNjRdID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTYsIDE3LCAxNywgMTgsIDE4LAorCQkJCSAxOSwgMTksIDIwLCAyMCwgMjAsIDIwLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsIDIzLCAyMywKKwkJCQkgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0fTsKKworc3RhdGljIGNvbnN0IEJZVEUgTUxfQ29kZVsxMjhdID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwKKwkJCQkgIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMiwgMzMsIDMzLCAzNCwgMzQsIDM1LCAzNSwgMzYsIDM2LCAzNiwgMzYsIDM3LCAzNywgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOCwKKwkJCQkgIDM4LCAzOCwgMzgsIDM4LCAzOSwgMzksIDM5LCAzOSwgMzksIDM5LCAzOSwgMzksIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwgNDAsIDQwLCA0MCwKKwkJCQkgIDQwLCA0MCwgNDEsIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsIDQxLCA0MSwgNDEsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwKKwkJCQkgIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDIsIDQyLCA0MiwgNDJ9OworCit2b2lkIFpTVERfc2VxVG9Db2Rlcyhjb25zdCBzZXFTdG9yZV90ICpzZXFTdG9yZVB0cikKK3sKKwlCWVRFIGNvbnN0IExMX2RlbHRhQ29kZSA9IDE5OworCUJZVEUgY29uc3QgTUxfZGVsdGFDb2RlID0gMzY7CisJY29uc3Qgc2VxRGVmICpjb25zdCBzZXF1ZW5jZXMgPSBzZXFTdG9yZVB0ci0+c2VxdWVuY2VzU3RhcnQ7CisJQllURSAqY29uc3QgbGxDb2RlVGFibGUgPSBzZXFTdG9yZVB0ci0+bGxDb2RlOworCUJZVEUgKmNvbnN0IG9mQ29kZVRhYmxlID0gc2VxU3RvcmVQdHItPm9mQ29kZTsKKwlCWVRFICpjb25zdCBtbENvZGVUYWJsZSA9IHNlcVN0b3JlUHRyLT5tbENvZGU7CisJVTMyIGNvbnN0IG5iU2VxID0gKFUzMikoc2VxU3RvcmVQdHItPnNlcXVlbmNlcyAtIHNlcVN0b3JlUHRyLT5zZXF1ZW5jZXNTdGFydCk7CisJVTMyIHU7CisJZm9yICh1ID0gMDsgdSA8IG5iU2VxOyB1KyspIHsKKwkJVTMyIGNvbnN0IGxsdiA9IHNlcXVlbmNlc1t1XS5saXRMZW5ndGg7CisJCVUzMiBjb25zdCBtbHYgPSBzZXF1ZW5jZXNbdV0ubWF0Y2hMZW5ndGg7CisJCWxsQ29kZVRhYmxlW3VdID0gKGxsdiA+IDYzKSA/IChCWVRFKVpTVERfaGlnaGJpdDMyKGxsdikgKyBMTF9kZWx0YUNvZGUgOiBMTF9Db2RlW2xsdl07CisJCW9mQ29kZVRhYmxlW3VdID0gKEJZVEUpWlNURF9oaWdoYml0MzIoc2VxdWVuY2VzW3VdLm9mZnNldCk7CisJCW1sQ29kZVRhYmxlW3VdID0gKG1sdiA+IDEyNykgPyAoQllURSlaU1REX2hpZ2hiaXQzMihtbHYpICsgTUxfZGVsdGFDb2RlIDogTUxfQ29kZVttbHZdOworCX0KKwlpZiAoc2VxU3RvcmVQdHItPmxvbmdMZW5ndGhJRCA9PSAxKQorCQlsbENvZGVUYWJsZVtzZXFTdG9yZVB0ci0+bG9uZ0xlbmd0aFBvc10gPSBNYXhMTDsKKwlpZiAoc2VxU3RvcmVQdHItPmxvbmdMZW5ndGhJRCA9PSAyKQorCQltbENvZGVUYWJsZVtzZXFTdG9yZVB0ci0+bG9uZ0xlbmd0aFBvc10gPSBNYXhNTDsKK30KKworWlNURF9TVEFUSUMgc2l6ZV90IFpTVERfY29tcHJlc3NTZXF1ZW5jZXNfaW50ZXJuYWwoWlNURF9DQ3R4ICp6Yywgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHkpCit7CisJY29uc3QgaW50IGxvbmdPZmZzZXRzID0gemMtPnBhcmFtcy5jUGFyYW1zLndpbmRvd0xvZyA+IFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU47CisJY29uc3Qgc2VxU3RvcmVfdCAqc2VxU3RvcmVQdHIgPSAmKHpjLT5zZXFTdG9yZSk7CisJRlNFX0NUYWJsZSAqQ1RhYmxlX0xpdExlbmd0aCA9IHpjLT5saXRsZW5ndGhDVGFibGU7CisJRlNFX0NUYWJsZSAqQ1RhYmxlX09mZnNldEJpdHMgPSB6Yy0+b2ZmY29kZUNUYWJsZTsKKwlGU0VfQ1RhYmxlICpDVGFibGVfTWF0Y2hMZW5ndGggPSB6Yy0+bWF0Y2hsZW5ndGhDVGFibGU7CisJVTMyIExMdHlwZSwgT2ZmdHlwZSwgTUx0eXBlOyAvKiBjb21wcmVzc2VkLCByYXcgb3IgcmxlICovCisJY29uc3Qgc2VxRGVmICpjb25zdCBzZXF1ZW5jZXMgPSBzZXFTdG9yZVB0ci0+c2VxdWVuY2VzU3RhcnQ7CisJY29uc3QgQllURSAqY29uc3Qgb2ZDb2RlVGFibGUgPSBzZXFTdG9yZVB0ci0+b2ZDb2RlOworCWNvbnN0IEJZVEUgKmNvbnN0IGxsQ29kZVRhYmxlID0gc2VxU3RvcmVQdHItPmxsQ29kZTsKKwljb25zdCBCWVRFICpjb25zdCBtbENvZGVUYWJsZSA9IHNlcVN0b3JlUHRyLT5tbENvZGU7CisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7CisJQllURSAqY29uc3Qgb2VuZCA9IG9zdGFydCArIGRzdENhcGFjaXR5OworCUJZVEUgKm9wID0gb3N0YXJ0OworCXNpemVfdCBjb25zdCBuYlNlcSA9IHNlcVN0b3JlUHRyLT5zZXF1ZW5jZXMgLSBzZXFTdG9yZVB0ci0+c2VxdWVuY2VzU3RhcnQ7CisJQllURSAqc2VxSGVhZDsKKworCVUzMiAqY291bnQ7CisJUzE2ICpub3JtOworCVUzMiAqd29ya3NwYWNlOworCXNpemVfdCB3b3Jrc3BhY2VTaXplID0gc2l6ZW9mKHpjLT50bXBDb3VudGVycyk7CisJeworCQlzaXplX3Qgc3BhY2VVc2VkMzIgPSAwOworCQljb3VudCA9IChVMzIgKil6Yy0+dG1wQ291bnRlcnMgKyBzcGFjZVVzZWQzMjsKKwkJc3BhY2VVc2VkMzIgKz0gTWF4U2VxICsgMTsKKwkJbm9ybSA9IChTMTYgKikoKFUzMiAqKXpjLT50bXBDb3VudGVycyArIHNwYWNlVXNlZDMyKTsKKwkJc3BhY2VVc2VkMzIgKz0gQUxJR04oc2l6ZW9mKFMxNikgKiAoTWF4U2VxICsgMSksIHNpemVvZihVMzIpKSA+PiAyOworCisJCXdvcmtzcGFjZSA9IChVMzIgKil6Yy0+dG1wQ291bnRlcnMgKyBzcGFjZVVzZWQzMjsKKwkJd29ya3NwYWNlU2l6ZSAtPSAoc3BhY2VVc2VkMzIgPDwgMik7CisJfQorCisJLyogQ29tcHJlc3MgbGl0ZXJhbHMgKi8KKwl7CisJCWNvbnN0IEJZVEUgKmNvbnN0IGxpdGVyYWxzID0gc2VxU3RvcmVQdHItPmxpdFN0YXJ0OworCQlzaXplX3QgY29uc3QgbGl0U2l6ZSA9IHNlcVN0b3JlUHRyLT5saXQgLSBsaXRlcmFsczsKKwkJc2l6ZV90IGNvbnN0IGNTaXplID0gWlNURF9jb21wcmVzc0xpdGVyYWxzKHpjLCBvcCwgZHN0Q2FwYWNpdHksIGxpdGVyYWxzLCBsaXRTaXplKTsKKwkJaWYgKFpTVERfaXNFcnJvcihjU2l6ZSkpCisJCQlyZXR1cm4gY1NpemU7CisJCW9wICs9IGNTaXplOworCX0KKworCS8qIFNlcXVlbmNlcyBIZWFkZXIgKi8KKwlpZiAoKG9lbmQgLSBvcCkgPCAzIC8qbWF4IG5iU2VxIFNpemUqLyArIDEgLypzZXFIZWFkICovKQorCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7CisJaWYgKG5iU2VxIDwgMHg3RikKKwkJKm9wKysgPSAoQllURSluYlNlcTsKKwllbHNlIGlmIChuYlNlcSA8IExPTkdOQlNFUSkKKwkJb3BbMF0gPSAoQllURSkoKG5iU2VxID4+IDgpICsgMHg4MCksIG9wWzFdID0gKEJZVEUpbmJTZXEsIG9wICs9IDI7CisJZWxzZQorCQlvcFswXSA9IDB4RkYsIFpTVERfd3JpdGVMRTE2KG9wICsgMSwgKFUxNikobmJTZXEgLSBMT05HTkJTRVEpKSwgb3AgKz0gMzsKKwlpZiAobmJTZXEgPT0gMCkKKwkJcmV0dXJuIG9wIC0gb3N0YXJ0OworCisJLyogc2VxSGVhZCA6IGZsYWdzIGZvciBGU0UgZW5jb2RpbmcgdHlwZSAqLworCXNlcUhlYWQgPSBvcCsrOworCisjZGVmaW5lIE1JTl9TRVFfRk9SX0RZTkFNSUNfRlNFIDY0CisjZGVmaW5lIE1BWF9TRVFfRk9SX1NUQVRJQ19GU0UgMTAwMAorCisJLyogY29udmVydCBsZW5ndGgvZGlzdGFuY2VzIGludG8gY29kZXMgKi8KKwlaU1REX3NlcVRvQ29kZXMoc2VxU3RvcmVQdHIpOworCisJLyogQ1RhYmxlIGZvciBMaXRlcmFsIExlbmd0aHMgKi8KKwl7CisJCVUzMiBtYXggPSBNYXhMTDsKKwkJc2l6ZV90IGNvbnN0IG1vc3RGcmVxdWVudCA9IEZTRV9jb3VudEZhc3Rfd2tzcChjb3VudCwgJm1heCwgbGxDb2RlVGFibGUsIG5iU2VxLCB3b3Jrc3BhY2UpOworCQlpZiAoKG1vc3RGcmVxdWVudCA9PSBuYlNlcSkgJiYgKG5iU2VxID4gMikpIHsKKwkJCSpvcCsrID0gbGxDb2RlVGFibGVbMF07CisJCQlGU0VfYnVpbGRDVGFibGVfcmxlKENUYWJsZV9MaXRMZW5ndGgsIChCWVRFKW1heCk7CisJCQlMTHR5cGUgPSBzZXRfcmxlOworCQl9IGVsc2UgaWYgKCh6Yy0+ZmxhZ1N0YXRpY1RhYmxlcykgJiYgKG5iU2VxIDwgTUFYX1NFUV9GT1JfU1RBVElDX0ZTRSkpIHsKKwkJCUxMdHlwZSA9IHNldF9yZXBlYXQ7CisJCX0gZWxzZSBpZiAoKG5iU2VxIDwgTUlOX1NFUV9GT1JfRFlOQU1JQ19GU0UpIHx8IChtb3N0RnJlcXVlbnQgPCAobmJTZXEgPj4gKExMX2RlZmF1bHROb3JtTG9nIC0gMSkpKSkgeworCQkJRlNFX2J1aWxkQ1RhYmxlX3drc3AoQ1RhYmxlX0xpdExlbmd0aCwgTExfZGVmYXVsdE5vcm0sIE1heExMLCBMTF9kZWZhdWx0Tm9ybUxvZywgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwkJCUxMdHlwZSA9IHNldF9iYXNpYzsKKwkJfSBlbHNlIHsKKwkJCXNpemVfdCBuYlNlcV8xID0gbmJTZXE7CisJCQljb25zdCBVMzIgdGFibGVMb2cgPSBGU0Vfb3B0aW1hbFRhYmxlTG9nKExMRlNFTG9nLCBuYlNlcSwgbWF4KTsKKwkJCWlmIChjb3VudFtsbENvZGVUYWJsZVtuYlNlcSAtIDFdXSA+IDEpIHsKKwkJCQljb3VudFtsbENvZGVUYWJsZVtuYlNlcSAtIDFdXS0tOworCQkJCW5iU2VxXzEtLTsKKwkJCX0KKwkJCUZTRV9ub3JtYWxpemVDb3VudChub3JtLCB0YWJsZUxvZywgY291bnQsIG5iU2VxXzEsIG1heCk7CisJCQl7CisJCQkJc2l6ZV90IGNvbnN0IE5Db3VudFNpemUgPSBGU0Vfd3JpdGVOQ291bnQob3AsIG9lbmQgLSBvcCwgbm9ybSwgbWF4LCB0YWJsZUxvZyk7IC8qIG92ZXJmbG93IHByb3RlY3RlZCAqLworCQkJCWlmIChGU0VfaXNFcnJvcihOQ291bnRTaXplKSkKKwkJCQkJcmV0dXJuIE5Db3VudFNpemU7CisJCQkJb3AgKz0gTkNvdW50U2l6ZTsKKwkJCX0KKwkJCUZTRV9idWlsZENUYWJsZV93a3NwKENUYWJsZV9MaXRMZW5ndGgsIG5vcm0sIG1heCwgdGFibGVMb2csIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJCQlMTHR5cGUgPSBzZXRfY29tcHJlc3NlZDsKKwkJfQorCX0KKworCS8qIENUYWJsZSBmb3IgT2Zmc2V0cyAqLworCXsKKwkJVTMyIG1heCA9IE1heE9mZjsKKwkJc2l6ZV90IGNvbnN0IG1vc3RGcmVxdWVudCA9IEZTRV9jb3VudEZhc3Rfd2tzcChjb3VudCwgJm1heCwgb2ZDb2RlVGFibGUsIG5iU2VxLCB3b3Jrc3BhY2UpOworCQlpZiAoKG1vc3RGcmVxdWVudCA9PSBuYlNlcSkgJiYgKG5iU2VxID4gMikpIHsKKwkJCSpvcCsrID0gb2ZDb2RlVGFibGVbMF07CisJCQlGU0VfYnVpbGRDVGFibGVfcmxlKENUYWJsZV9PZmZzZXRCaXRzLCAoQllURSltYXgpOworCQkJT2ZmdHlwZSA9IHNldF9ybGU7CisJCX0gZWxzZSBpZiAoKHpjLT5mbGFnU3RhdGljVGFibGVzKSAmJiAobmJTZXEgPCBNQVhfU0VRX0ZPUl9TVEFUSUNfRlNFKSkgeworCQkJT2ZmdHlwZSA9IHNldF9yZXBlYXQ7CisJCX0gZWxzZSBpZiAoKG5iU2VxIDwgTUlOX1NFUV9GT1JfRFlOQU1JQ19GU0UpIHx8IChtb3N0RnJlcXVlbnQgPCAobmJTZXEgPj4gKE9GX2RlZmF1bHROb3JtTG9nIC0gMSkpKSkgeworCQkJRlNFX2J1aWxkQ1RhYmxlX3drc3AoQ1RhYmxlX09mZnNldEJpdHMsIE9GX2RlZmF1bHROb3JtLCBNYXhPZmYsIE9GX2RlZmF1bHROb3JtTG9nLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCQkJT2ZmdHlwZSA9IHNldF9iYXNpYzsKKwkJfSBlbHNlIHsKKwkJCXNpemVfdCBuYlNlcV8xID0gbmJTZXE7CisJCQljb25zdCBVMzIgdGFibGVMb2cgPSBGU0Vfb3B0aW1hbFRhYmxlTG9nKE9mZkZTRUxvZywgbmJTZXEsIG1heCk7CisJCQlpZiAoY291bnRbb2ZDb2RlVGFibGVbbmJTZXEgLSAxXV0gPiAxKSB7CisJCQkJY291bnRbb2ZDb2RlVGFibGVbbmJTZXEgLSAxXV0tLTsKKwkJCQluYlNlcV8xLS07CisJCQl9CisJCQlGU0Vfbm9ybWFsaXplQ291bnQobm9ybSwgdGFibGVMb2csIGNvdW50LCBuYlNlcV8xLCBtYXgpOworCQkJeworCQkJCXNpemVfdCBjb25zdCBOQ291bnRTaXplID0gRlNFX3dyaXRlTkNvdW50KG9wLCBvZW5kIC0gb3AsIG5vcm0sIG1heCwgdGFibGVMb2cpOyAvKiBvdmVyZmxvdyBwcm90ZWN0ZWQgKi8KKwkJCQlpZiAoRlNFX2lzRXJyb3IoTkNvdW50U2l6ZSkpCisJCQkJCXJldHVybiBOQ291bnRTaXplOworCQkJCW9wICs9IE5Db3VudFNpemU7CisJCQl9CisJCQlGU0VfYnVpbGRDVGFibGVfd2tzcChDVGFibGVfT2Zmc2V0Qml0cywgbm9ybSwgbWF4LCB0YWJsZUxvZywgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwkJCU9mZnR5cGUgPSBzZXRfY29tcHJlc3NlZDsKKwkJfQorCX0KKworCS8qIENUYWJsZSBmb3IgTWF0Y2hMZW5ndGhzICovCisJeworCQlVMzIgbWF4ID0gTWF4TUw7CisJCXNpemVfdCBjb25zdCBtb3N0RnJlcXVlbnQgPSBGU0VfY291bnRGYXN0X3drc3AoY291bnQsICZtYXgsIG1sQ29kZVRhYmxlLCBuYlNlcSwgd29ya3NwYWNlKTsKKwkJaWYgKChtb3N0RnJlcXVlbnQgPT0gbmJTZXEpICYmIChuYlNlcSA+IDIpKSB7CisJCQkqb3ArKyA9ICptbENvZGVUYWJsZTsKKwkJCUZTRV9idWlsZENUYWJsZV9ybGUoQ1RhYmxlX01hdGNoTGVuZ3RoLCAoQllURSltYXgpOworCQkJTUx0eXBlID0gc2V0X3JsZTsKKwkJfSBlbHNlIGlmICgoemMtPmZsYWdTdGF0aWNUYWJsZXMpICYmIChuYlNlcSA8IE1BWF9TRVFfRk9SX1NUQVRJQ19GU0UpKSB7CisJCQlNTHR5cGUgPSBzZXRfcmVwZWF0OworCQl9IGVsc2UgaWYgKChuYlNlcSA8IE1JTl9TRVFfRk9SX0RZTkFNSUNfRlNFKSB8fCAobW9zdEZyZXF1ZW50IDwgKG5iU2VxID4+IChNTF9kZWZhdWx0Tm9ybUxvZyAtIDEpKSkpIHsKKwkJCUZTRV9idWlsZENUYWJsZV93a3NwKENUYWJsZV9NYXRjaExlbmd0aCwgTUxfZGVmYXVsdE5vcm0sIE1heE1MLCBNTF9kZWZhdWx0Tm9ybUxvZywgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwkJCU1MdHlwZSA9IHNldF9iYXNpYzsKKwkJfSBlbHNlIHsKKwkJCXNpemVfdCBuYlNlcV8xID0gbmJTZXE7CisJCQljb25zdCBVMzIgdGFibGVMb2cgPSBGU0Vfb3B0aW1hbFRhYmxlTG9nKE1MRlNFTG9nLCBuYlNlcSwgbWF4KTsKKwkJCWlmIChjb3VudFttbENvZGVUYWJsZVtuYlNlcSAtIDFdXSA+IDEpIHsKKwkJCQljb3VudFttbENvZGVUYWJsZVtuYlNlcSAtIDFdXS0tOworCQkJCW5iU2VxXzEtLTsKKwkJCX0KKwkJCUZTRV9ub3JtYWxpemVDb3VudChub3JtLCB0YWJsZUxvZywgY291bnQsIG5iU2VxXzEsIG1heCk7CisJCQl7CisJCQkJc2l6ZV90IGNvbnN0IE5Db3VudFNpemUgPSBGU0Vfd3JpdGVOQ291bnQob3AsIG9lbmQgLSBvcCwgbm9ybSwgbWF4LCB0YWJsZUxvZyk7IC8qIG92ZXJmbG93IHByb3RlY3RlZCAqLworCQkJCWlmIChGU0VfaXNFcnJvcihOQ291bnRTaXplKSkKKwkJCQkJcmV0dXJuIE5Db3VudFNpemU7CisJCQkJb3AgKz0gTkNvdW50U2l6ZTsKKwkJCX0KKwkJCUZTRV9idWlsZENUYWJsZV93a3NwKENUYWJsZV9NYXRjaExlbmd0aCwgbm9ybSwgbWF4LCB0YWJsZUxvZywgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwkJCU1MdHlwZSA9IHNldF9jb21wcmVzc2VkOworCQl9CisJfQorCisJKnNlcUhlYWQgPSAoQllURSkoKExMdHlwZSA8PCA2KSArIChPZmZ0eXBlIDw8IDQpICsgKE1MdHlwZSA8PCAyKSk7CisJemMtPmZsYWdTdGF0aWNUYWJsZXMgPSAwOworCisJLyogRW5jb2RpbmcgU2VxdWVuY2VzICovCisJeworCQlCSVRfQ1N0cmVhbV90IGJsb2NrU3RyZWFtOworCQlGU0VfQ1N0YXRlX3Qgc3RhdGVNYXRjaExlbmd0aDsKKwkJRlNFX0NTdGF0ZV90IHN0YXRlT2Zmc2V0Qml0czsKKwkJRlNFX0NTdGF0ZV90IHN0YXRlTGl0TGVuZ3RoOworCisJCUNIRUNLX0UoQklUX2luaXRDU3RyZWFtKCZibG9ja1N0cmVhbSwgb3AsIG9lbmQgLSBvcCksIGRzdFNpemVfdG9vU21hbGwpOyAvKiBub3QgZW5vdWdoIHNwYWNlIHJlbWFpbmluZyAqLworCisJCS8qIGZpcnN0IHN5bWJvbHMgKi8KKwkJRlNFX2luaXRDU3RhdGUyKCZzdGF0ZU1hdGNoTGVuZ3RoLCBDVGFibGVfTWF0Y2hMZW5ndGgsIG1sQ29kZVRhYmxlW25iU2VxIC0gMV0pOworCQlGU0VfaW5pdENTdGF0ZTIoJnN0YXRlT2Zmc2V0Qml0cywgQ1RhYmxlX09mZnNldEJpdHMsIG9mQ29kZVRhYmxlW25iU2VxIC0gMV0pOworCQlGU0VfaW5pdENTdGF0ZTIoJnN0YXRlTGl0TGVuZ3RoLCBDVGFibGVfTGl0TGVuZ3RoLCBsbENvZGVUYWJsZVtuYlNlcSAtIDFdKTsKKwkJQklUX2FkZEJpdHMoJmJsb2NrU3RyZWFtLCBzZXF1ZW5jZXNbbmJTZXEgLSAxXS5saXRMZW5ndGgsIExMX2JpdHNbbGxDb2RlVGFibGVbbmJTZXEgLSAxXV0pOworCQlpZiAoWlNURF8zMmJpdHMoKSkKKwkJCUJJVF9mbHVzaEJpdHMoJmJsb2NrU3RyZWFtKTsKKwkJQklUX2FkZEJpdHMoJmJsb2NrU3RyZWFtLCBzZXF1ZW5jZXNbbmJTZXEgLSAxXS5tYXRjaExlbmd0aCwgTUxfYml0c1ttbENvZGVUYWJsZVtuYlNlcSAtIDFdXSk7CisJCWlmIChaU1REXzMyYml0cygpKQorCQkJQklUX2ZsdXNoQml0cygmYmxvY2tTdHJlYW0pOworCQlpZiAobG9uZ09mZnNldHMpIHsKKwkJCVUzMiBjb25zdCBvZkJpdHMgPSBvZkNvZGVUYWJsZVtuYlNlcSAtIDFdOworCQkJaW50IGNvbnN0IGV4dHJhQml0cyA9IG9mQml0cyAtIE1JTihvZkJpdHMsIFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU4gLSAxKTsKKwkJCWlmIChleHRyYUJpdHMpIHsKKwkJCQlCSVRfYWRkQml0cygmYmxvY2tTdHJlYW0sIHNlcXVlbmNlc1tuYlNlcSAtIDFdLm9mZnNldCwgZXh0cmFCaXRzKTsKKwkJCQlCSVRfZmx1c2hCaXRzKCZibG9ja1N0cmVhbSk7CisJCQl9CisJCQlCSVRfYWRkQml0cygmYmxvY2tTdHJlYW0sIHNlcXVlbmNlc1tuYlNlcSAtIDFdLm9mZnNldCA+PiBleHRyYUJpdHMsIG9mQml0cyAtIGV4dHJhQml0cyk7CisJCX0gZWxzZSB7CisJCQlCSVRfYWRkQml0cygmYmxvY2tTdHJlYW0sIHNlcXVlbmNlc1tuYlNlcSAtIDFdLm9mZnNldCwgb2ZDb2RlVGFibGVbbmJTZXEgLSAxXSk7CisJCX0KKwkJQklUX2ZsdXNoQml0cygmYmxvY2tTdHJlYW0pOworCisJCXsKKwkJCXNpemVfdCBuOworCQkJZm9yIChuID0gbmJTZXEgLSAyOyBuIDwgbmJTZXE7IG4tLSkgeyAvKiBpbnRlbnRpb25hbCB1bmRlcmZsb3cgKi8KKwkJCQlCWVRFIGNvbnN0IGxsQ29kZSA9IGxsQ29kZVRhYmxlW25dOworCQkJCUJZVEUgY29uc3Qgb2ZDb2RlID0gb2ZDb2RlVGFibGVbbl07CisJCQkJQllURSBjb25zdCBtbENvZGUgPSBtbENvZGVUYWJsZVtuXTsKKwkJCQlVMzIgY29uc3QgbGxCaXRzID0gTExfYml0c1tsbENvZGVdOworCQkJCVUzMiBjb25zdCBvZkJpdHMgPSBvZkNvZGU7IC8qIDMyYiovIC8qIDY0YiovCisJCQkJVTMyIGNvbnN0IG1sQml0cyA9IE1MX2JpdHNbbWxDb2RlXTsKKwkJCQkvKiAoNykqLwkJCQkJCQkgICAgLyogKDcpKi8KKwkJCQlGU0VfZW5jb2RlU3ltYm9sKCZibG9ja1N0cmVhbSwgJnN0YXRlT2Zmc2V0Qml0cywgb2ZDb2RlKTsgLyogMTUgKi8gIC8qIDE1ICovCisJCQkJRlNFX2VuY29kZVN5bWJvbCgmYmxvY2tTdHJlYW0sICZzdGF0ZU1hdGNoTGVuZ3RoLCBtbENvZGUpOyAvKiAyNCAqLyAvKiAyNCAqLworCQkJCWlmIChaU1REXzMyYml0cygpKQorCQkJCQlCSVRfZmx1c2hCaXRzKCZibG9ja1N0cmVhbSk7CQkJCSAgLyogKDcpKi8KKwkJCQlGU0VfZW5jb2RlU3ltYm9sKCZibG9ja1N0cmVhbSwgJnN0YXRlTGl0TGVuZ3RoLCBsbENvZGUpOyAvKiAxNiAqLyAvKiAzMyAqLworCQkJCWlmIChaU1REXzMyYml0cygpIHx8IChvZkJpdHMgKyBtbEJpdHMgKyBsbEJpdHMgPj0gNjQgLSA3IC0gKExMRlNFTG9nICsgTUxGU0VMb2cgKyBPZmZGU0VMb2cpKSkKKwkJCQkJQklUX2ZsdXNoQml0cygmYmxvY2tTdHJlYW0pOyAvKiAoNykqLworCQkJCUJJVF9hZGRCaXRzKCZibG9ja1N0cmVhbSwgc2VxdWVuY2VzW25dLmxpdExlbmd0aCwgbGxCaXRzKTsKKwkJCQlpZiAoWlNURF8zMmJpdHMoKSAmJiAoKGxsQml0cyArIG1sQml0cykgPiAyNCkpCisJCQkJCUJJVF9mbHVzaEJpdHMoJmJsb2NrU3RyZWFtKTsKKwkJCQlCSVRfYWRkQml0cygmYmxvY2tTdHJlYW0sIHNlcXVlbmNlc1tuXS5tYXRjaExlbmd0aCwgbWxCaXRzKTsKKwkJCQlpZiAoWlNURF8zMmJpdHMoKSkKKwkJCQkJQklUX2ZsdXNoQml0cygmYmxvY2tTdHJlYW0pOyAvKiAoNykqLworCQkJCWlmIChsb25nT2Zmc2V0cykgeworCQkJCQlpbnQgY29uc3QgZXh0cmFCaXRzID0gb2ZCaXRzIC0gTUlOKG9mQml0cywgU1RSRUFNX0FDQ1VNVUxBVE9SX01JTiAtIDEpOworCQkJCQlpZiAoZXh0cmFCaXRzKSB7CisJCQkJCQlCSVRfYWRkQml0cygmYmxvY2tTdHJlYW0sIHNlcXVlbmNlc1tuXS5vZmZzZXQsIGV4dHJhQml0cyk7CisJCQkJCQlCSVRfZmx1c2hCaXRzKCZibG9ja1N0cmVhbSk7IC8qICg3KSovCisJCQkJCX0KKwkJCQkJQklUX2FkZEJpdHMoJmJsb2NrU3RyZWFtLCBzZXF1ZW5jZXNbbl0ub2Zmc2V0ID4+IGV4dHJhQml0cywgb2ZCaXRzIC0gZXh0cmFCaXRzKTsgLyogMzEgKi8KKwkJCQl9IGVsc2UgeworCQkJCQlCSVRfYWRkQml0cygmYmxvY2tTdHJlYW0sIHNlcXVlbmNlc1tuXS5vZmZzZXQsIG9mQml0cyk7IC8qIDMxICovCisJCQkJfQorCQkJCUJJVF9mbHVzaEJpdHMoJmJsb2NrU3RyZWFtKTsgLyogKDcpKi8KKwkJCX0KKwkJfQorCisJCUZTRV9mbHVzaENTdGF0ZSgmYmxvY2tTdHJlYW0sICZzdGF0ZU1hdGNoTGVuZ3RoKTsKKwkJRlNFX2ZsdXNoQ1N0YXRlKCZibG9ja1N0cmVhbSwgJnN0YXRlT2Zmc2V0Qml0cyk7CisJCUZTRV9mbHVzaENTdGF0ZSgmYmxvY2tTdHJlYW0sICZzdGF0ZUxpdExlbmd0aCk7CisKKwkJeworCQkJc2l6ZV90IGNvbnN0IHN0cmVhbVNpemUgPSBCSVRfY2xvc2VDU3RyZWFtKCZibG9ja1N0cmVhbSk7CisJCQlpZiAoc3RyZWFtU2l6ZSA9PSAwKQorCQkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogbm90IGVub3VnaCBzcGFjZSAqLworCQkJb3AgKz0gc3RyZWFtU2l6ZTsKKwkJfQorCX0KKwlyZXR1cm4gb3AgLSBvc3RhcnQ7Cit9CisKK1pTVERfU1RBVElDIHNpemVfdCBaU1REX2NvbXByZXNzU2VxdWVuY2VzKFpTVERfQ0N0eCAqemMsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlzaXplX3QgY29uc3QgY1NpemUgPSBaU1REX2NvbXByZXNzU2VxdWVuY2VzX2ludGVybmFsKHpjLCBkc3QsIGRzdENhcGFjaXR5KTsKKwlzaXplX3QgY29uc3QgbWluR2FpbiA9IFpTVERfbWluR2FpbihzcmNTaXplKTsKKwlzaXplX3QgY29uc3QgbWF4Q1NpemUgPSBzcmNTaXplIC0gbWluR2FpbjsKKwkvKiBJZiB0aGUgc3JjU2l6ZSA8PSBkc3RDYXBhY2l0eSwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgYQorCSAqIHJhdyB1bmNvbXByZXNzZWQgYmxvY2suIFNpbmNlIHdlIHJhbiBvdXQgb2Ygc3BhY2UsIHRoZSBibG9jayBtdXN0IG5vdAorCSAqIGJlIGNvbXByZXNzaWJsZSwgc28gZmFsbCBiYWNrIHRvIGEgcmF3IHVuY29tcHJlc3NlZCBibG9jay4KKwkgKi8KKwlpbnQgY29uc3QgdW5jb21wcmVzc2libGVFcnJvciA9IGNTaXplID09IEVSUk9SKGRzdFNpemVfdG9vU21hbGwpICYmIHNyY1NpemUgPD0gZHN0Q2FwYWNpdHk7CisJaW50IGk7CisKKwlpZiAoWlNURF9pc0Vycm9yKGNTaXplKSAmJiAhdW5jb21wcmVzc2libGVFcnJvcikKKwkJcmV0dXJuIGNTaXplOworCWlmIChjU2l6ZSA+PSBtYXhDU2l6ZSB8fCB1bmNvbXByZXNzaWJsZUVycm9yKSB7CisJCXpjLT5mbGFnU3RhdGljSHVmVGFibGUgPSBIVUZfcmVwZWF0X25vbmU7CisJCXJldHVybiAwOworCX0KKwkvKiBjb25maXJtIHJlcGNvZGVzICovCisJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQl6Yy0+cmVwW2ldID0gemMtPnJlcFRvQ29uZmlybVtpXTsKKwlyZXR1cm4gY1NpemU7Cit9CisKKy8qISBaU1REX3N0b3JlU2VxKCkgOgorCVN0b3JlIGEgc2VxdWVuY2UgKGxpdGVyYWwgbGVuZ3RoLCBsaXRlcmFscywgb2Zmc2V0IGNvZGUgYW5kIG1hdGNoIGxlbmd0aCBjb2RlKSBpbnRvIHNlcVN0b3JlX3QuCisJYG9mZnNldENvZGVgIDogZGlzdGFuY2UgdG8gbWF0Y2gsIG9yIDAgPT0gcmVwQ29kZS4KKwlgbWF0Y2hDb2RlYCA6IG1hdGNoTGVuZ3RoIC0gTUlOTUFUQ0gKKyovCitaU1REX1NUQVRJQyB2b2lkIFpTVERfc3RvcmVTZXEoc2VxU3RvcmVfdCAqc2VxU3RvcmVQdHIsIHNpemVfdCBsaXRMZW5ndGgsIGNvbnN0IHZvaWQgKmxpdGVyYWxzLCBVMzIgb2Zmc2V0Q29kZSwgc2l6ZV90IG1hdGNoQ29kZSkKK3sKKwkvKiBjb3B5IExpdGVyYWxzICovCisJWlNURF93aWxkY29weShzZXFTdG9yZVB0ci0+bGl0LCBsaXRlcmFscywgbGl0TGVuZ3RoKTsKKwlzZXFTdG9yZVB0ci0+bGl0ICs9IGxpdExlbmd0aDsKKworCS8qIGxpdGVyYWwgTGVuZ3RoICovCisJaWYgKGxpdExlbmd0aCA+IDB4RkZGRikgeworCQlzZXFTdG9yZVB0ci0+bG9uZ0xlbmd0aElEID0gMTsKKwkJc2VxU3RvcmVQdHItPmxvbmdMZW5ndGhQb3MgPSAoVTMyKShzZXFTdG9yZVB0ci0+c2VxdWVuY2VzIC0gc2VxU3RvcmVQdHItPnNlcXVlbmNlc1N0YXJ0KTsKKwl9CisJc2VxU3RvcmVQdHItPnNlcXVlbmNlc1swXS5saXRMZW5ndGggPSAoVTE2KWxpdExlbmd0aDsKKworCS8qIG1hdGNoIG9mZnNldCAqLworCXNlcVN0b3JlUHRyLT5zZXF1ZW5jZXNbMF0ub2Zmc2V0ID0gb2Zmc2V0Q29kZSArIDE7CisKKwkvKiBtYXRjaCBMZW5ndGggKi8KKwlpZiAobWF0Y2hDb2RlID4gMHhGRkZGKSB7CisJCXNlcVN0b3JlUHRyLT5sb25nTGVuZ3RoSUQgPSAyOworCQlzZXFTdG9yZVB0ci0+bG9uZ0xlbmd0aFBvcyA9IChVMzIpKHNlcVN0b3JlUHRyLT5zZXF1ZW5jZXMgLSBzZXFTdG9yZVB0ci0+c2VxdWVuY2VzU3RhcnQpOworCX0KKwlzZXFTdG9yZVB0ci0+c2VxdWVuY2VzWzBdLm1hdGNoTGVuZ3RoID0gKFUxNiltYXRjaENvZGU7CisKKwlzZXFTdG9yZVB0ci0+c2VxdWVuY2VzKys7Cit9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIE1hdGNoIGxlbmd0aCBjb3VudGVyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdW5zaWduZWQgWlNURF9OYkNvbW1vbkJ5dGVzKHJlZ2lzdGVyIHNpemVfdCB2YWwpCit7CisJaWYgKFpTVERfaXNMaXR0bGVFbmRpYW4oKSkgeworCQlpZiAoWlNURF82NGJpdHMoKSkgeworCQkJcmV0dXJuIChfX2J1aWx0aW5fY3R6bGwoKFU2NCl2YWwpID4+IDMpOworCQl9IGVsc2UgeyAvKiAzMiBiaXRzICovCisJCQlyZXR1cm4gKF9fYnVpbHRpbl9jdHooKFUzMil2YWwpID4+IDMpOworCQl9CisJfSBlbHNlIHsgLyogQmlnIEVuZGlhbiBDUFUgKi8KKwkJaWYgKFpTVERfNjRiaXRzKCkpIHsKKwkJCXJldHVybiAoX19idWlsdGluX2NsemxsKHZhbCkgPj4gMyk7CisJCX0gZWxzZSB7IC8qIDMyIGJpdHMgKi8KKwkJCXJldHVybiAoX19idWlsdGluX2NseigoVTMyKXZhbCkgPj4gMyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9jb3VudChjb25zdCBCWVRFICpwSW4sIGNvbnN0IEJZVEUgKnBNYXRjaCwgY29uc3QgQllURSAqY29uc3QgcEluTGltaXQpCit7CisJY29uc3QgQllURSAqY29uc3QgcFN0YXJ0ID0gcEluOworCWNvbnN0IEJZVEUgKmNvbnN0IHBJbkxvb3BMaW1pdCA9IHBJbkxpbWl0IC0gKHNpemVvZihzaXplX3QpIC0gMSk7CisKKwl3aGlsZSAocEluIDwgcEluTG9vcExpbWl0KSB7CisJCXNpemVfdCBjb25zdCBkaWZmID0gWlNURF9yZWFkU1QocE1hdGNoKSBeIFpTVERfcmVhZFNUKHBJbik7CisJCWlmICghZGlmZikgeworCQkJcEluICs9IHNpemVvZihzaXplX3QpOworCQkJcE1hdGNoICs9IHNpemVvZihzaXplX3QpOworCQkJY29udGludWU7CisJCX0KKwkJcEluICs9IFpTVERfTmJDb21tb25CeXRlcyhkaWZmKTsKKwkJcmV0dXJuIChzaXplX3QpKHBJbiAtIHBTdGFydCk7CisJfQorCWlmIChaU1REXzY0Yml0cygpKQorCQlpZiAoKHBJbiA8IChwSW5MaW1pdCAtIDMpKSAmJiAoWlNURF9yZWFkMzIocE1hdGNoKSA9PSBaU1REX3JlYWQzMihwSW4pKSkgeworCQkJcEluICs9IDQ7CisJCQlwTWF0Y2ggKz0gNDsKKwkJfQorCWlmICgocEluIDwgKHBJbkxpbWl0IC0gMSkpICYmIChaU1REX3JlYWQxNihwTWF0Y2gpID09IFpTVERfcmVhZDE2KHBJbikpKSB7CisJCXBJbiArPSAyOworCQlwTWF0Y2ggKz0gMjsKKwl9CisJaWYgKChwSW4gPCBwSW5MaW1pdCkgJiYgKCpwTWF0Y2ggPT0gKnBJbikpCisJCXBJbisrOworCXJldHVybiAoc2l6ZV90KShwSW4gLSBwU3RhcnQpOworfQorCisvKiogWlNURF9jb3VudF8yc2VnbWVudHMoKSA6CisqICAgY2FuIGNvdW50IG1hdGNoIGxlbmd0aCB3aXRoIGBpcGAgJiBgbWF0Y2hgIGluIDIgZGlmZmVyZW50IHNlZ21lbnRzLgorKiAgIGNvbnZlbnRpb24gOiBvbiByZWFjaGluZyBtRW5kLCBtYXRjaCBjb3VudCBjb250aW51ZSBzdGFydGluZyBmcm9tIGlTdGFydAorKi8KK3N0YXRpYyBzaXplX3QgWlNURF9jb3VudF8yc2VnbWVudHMoY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKm1hdGNoLCBjb25zdCBCWVRFICppRW5kLCBjb25zdCBCWVRFICptRW5kLCBjb25zdCBCWVRFICppU3RhcnQpCit7CisJY29uc3QgQllURSAqY29uc3QgdkVuZCA9IE1JTihpcCArIChtRW5kIC0gbWF0Y2gpLCBpRW5kKTsKKwlzaXplX3QgY29uc3QgbWF0Y2hMZW5ndGggPSBaU1REX2NvdW50KGlwLCBtYXRjaCwgdkVuZCk7CisJaWYgKG1hdGNoICsgbWF0Y2hMZW5ndGggIT0gbUVuZCkKKwkJcmV0dXJuIG1hdGNoTGVuZ3RoOworCXJldHVybiBtYXRjaExlbmd0aCArIFpTVERfY291bnQoaXAgKyBtYXRjaExlbmd0aCwgaVN0YXJ0LCBpRW5kKTsKK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSGFzaGVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgY29uc3QgVTMyIHByaW1lM2J5dGVzID0gNTA2ODMyODI5VTsKK3N0YXRpYyBVMzIgWlNURF9oYXNoMyhVMzIgdSwgVTMyIGgpIHsgcmV0dXJuICgodSA8PCAoMzIgLSAyNCkpICogcHJpbWUzYnl0ZXMpID4+ICgzMiAtIGgpOyB9CitaU1REX1NUQVRJQyBzaXplX3QgWlNURF9oYXNoM1B0cihjb25zdCB2b2lkICpwdHIsIFUzMiBoKSB7IHJldHVybiBaU1REX2hhc2gzKFpTVERfcmVhZExFMzIocHRyKSwgaCk7IH0gLyogb25seSBpbiB6c3RkX29wdC5oICovCisKK3N0YXRpYyBjb25zdCBVMzIgcHJpbWU0Ynl0ZXMgPSAyNjU0NDM1NzYxVTsKK3N0YXRpYyBVMzIgWlNURF9oYXNoNChVMzIgdSwgVTMyIGgpIHsgcmV0dXJuICh1ICogcHJpbWU0Ynl0ZXMpID4+ICgzMiAtIGgpOyB9CitzdGF0aWMgc2l6ZV90IFpTVERfaGFzaDRQdHIoY29uc3Qgdm9pZCAqcHRyLCBVMzIgaCkgeyByZXR1cm4gWlNURF9oYXNoNChaU1REX3JlYWQzMihwdHIpLCBoKTsgfQorCitzdGF0aWMgY29uc3QgVTY0IHByaW1lNWJ5dGVzID0gODg5NTIzNTkyMzc5VUxMOworc3RhdGljIHNpemVfdCBaU1REX2hhc2g1KFU2NCB1LCBVMzIgaCkgeyByZXR1cm4gKHNpemVfdCkoKCh1IDw8ICg2NCAtIDQwKSkgKiBwcmltZTVieXRlcykgPj4gKDY0IC0gaCkpOyB9CitzdGF0aWMgc2l6ZV90IFpTVERfaGFzaDVQdHIoY29uc3Qgdm9pZCAqcCwgVTMyIGgpIHsgcmV0dXJuIFpTVERfaGFzaDUoWlNURF9yZWFkTEU2NChwKSwgaCk7IH0KKworc3RhdGljIGNvbnN0IFU2NCBwcmltZTZieXRlcyA9IDIyNzcxODAzOTY1MDIwM1VMTDsKK3N0YXRpYyBzaXplX3QgWlNURF9oYXNoNihVNjQgdSwgVTMyIGgpIHsgcmV0dXJuIChzaXplX3QpKCgodSA8PCAoNjQgLSA0OCkpICogcHJpbWU2Ynl0ZXMpID4+ICg2NCAtIGgpKTsgfQorc3RhdGljIHNpemVfdCBaU1REX2hhc2g2UHRyKGNvbnN0IHZvaWQgKnAsIFUzMiBoKSB7IHJldHVybiBaU1REX2hhc2g2KFpTVERfcmVhZExFNjQocCksIGgpOyB9CisKK3N0YXRpYyBjb25zdCBVNjQgcHJpbWU3Ynl0ZXMgPSA1ODI5NTgxODE1MDQ1NDYyN1VMTDsKK3N0YXRpYyBzaXplX3QgWlNURF9oYXNoNyhVNjQgdSwgVTMyIGgpIHsgcmV0dXJuIChzaXplX3QpKCgodSA8PCAoNjQgLSA1NikpICogcHJpbWU3Ynl0ZXMpID4+ICg2NCAtIGgpKTsgfQorc3RhdGljIHNpemVfdCBaU1REX2hhc2g3UHRyKGNvbnN0IHZvaWQgKnAsIFUzMiBoKSB7IHJldHVybiBaU1REX2hhc2g3KFpTVERfcmVhZExFNjQocCksIGgpOyB9CisKK3N0YXRpYyBjb25zdCBVNjQgcHJpbWU4Ynl0ZXMgPSAweENGMUJCQ0RDQjdBNTY0NjNVTEw7CitzdGF0aWMgc2l6ZV90IFpTVERfaGFzaDgoVTY0IHUsIFUzMiBoKSB7IHJldHVybiAoc2l6ZV90KSgoKHUpKnByaW1lOGJ5dGVzKSA+PiAoNjQgLSBoKSk7IH0KK3N0YXRpYyBzaXplX3QgWlNURF9oYXNoOFB0cihjb25zdCB2b2lkICpwLCBVMzIgaCkgeyByZXR1cm4gWlNURF9oYXNoOChaU1REX3JlYWRMRTY0KHApLCBoKTsgfQorCitzdGF0aWMgc2l6ZV90IFpTVERfaGFzaFB0cihjb25zdCB2b2lkICpwLCBVMzIgaEJpdHMsIFUzMiBtbHMpCit7CisJc3dpdGNoIChtbHMpIHsKKwkvLyBjYXNlIDM6IHJldHVybiBaU1REX2hhc2gzUHRyKHAsIGhCaXRzKTsKKwlkZWZhdWx0OgorCWNhc2UgNDogcmV0dXJuIFpTVERfaGFzaDRQdHIocCwgaEJpdHMpOworCWNhc2UgNTogcmV0dXJuIFpTVERfaGFzaDVQdHIocCwgaEJpdHMpOworCWNhc2UgNjogcmV0dXJuIFpTVERfaGFzaDZQdHIocCwgaEJpdHMpOworCWNhc2UgNzogcmV0dXJuIFpTVERfaGFzaDdQdHIocCwgaEJpdHMpOworCWNhc2UgODogcmV0dXJuIFpTVERfaGFzaDhQdHIocCwgaEJpdHMpOworCX0KK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRmFzdCBTY2FuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBaU1REX2ZpbGxIYXNoVGFibGUoWlNURF9DQ3R4ICp6YywgY29uc3Qgdm9pZCAqZW5kLCBjb25zdCBVMzIgbWxzKQoreworCVUzMiAqY29uc3QgaGFzaFRhYmxlID0gemMtPmhhc2hUYWJsZTsKKwlVMzIgY29uc3QgaEJpdHMgPSB6Yy0+cGFyYW1zLmNQYXJhbXMuaGFzaExvZzsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gemMtPmJhc2U7CisJY29uc3QgQllURSAqaXAgPSBiYXNlICsgemMtPm5leHRUb1VwZGF0ZTsKKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gKChjb25zdCBCWVRFICopZW5kKSAtIEhBU0hfUkVBRF9TSVpFOworCWNvbnN0IHNpemVfdCBmYXN0SGFzaEZpbGxTdGVwID0gMzsKKworCXdoaWxlIChpcCA8PSBpZW5kKSB7CisJCWhhc2hUYWJsZVtaU1REX2hhc2hQdHIoaXAsIGhCaXRzLCBtbHMpXSA9IChVMzIpKGlwIC0gYmFzZSk7CisJCWlwICs9IGZhc3RIYXNoRmlsbFN0ZXA7CisJfQorfQorCitGT1JDRV9JTkxJTkUKK3ZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZ2VuZXJpYyhaU1REX0NDdHggKmNjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IFUzMiBtbHMpCit7CisJVTMyICpjb25zdCBoYXNoVGFibGUgPSBjY3R4LT5oYXNoVGFibGU7CisJVTMyIGNvbnN0IGhCaXRzID0gY2N0eC0+cGFyYW1zLmNQYXJhbXMuaGFzaExvZzsKKwlzZXFTdG9yZV90ICpzZXFTdG9yZVB0ciA9ICYoY2N0eC0+c2VxU3RvcmUpOworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSBjY3R4LT5iYXNlOworCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICopc3JjOworCWNvbnN0IEJZVEUgKmlwID0gaXN0YXJ0OworCWNvbnN0IEJZVEUgKmFuY2hvciA9IGlzdGFydDsKKwljb25zdCBVMzIgbG93ZXN0SW5kZXggPSBjY3R4LT5kaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgbG93ZXN0ID0gYmFzZSArIGxvd2VzdEluZGV4OworCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOworCWNvbnN0IEJZVEUgKmNvbnN0IGlsaW1pdCA9IGllbmQgLSBIQVNIX1JFQURfU0laRTsKKwlVMzIgb2Zmc2V0XzEgPSBjY3R4LT5yZXBbMF0sIG9mZnNldF8yID0gY2N0eC0+cmVwWzFdOworCVUzMiBvZmZzZXRTYXZlZCA9IDA7CisKKwkvKiBpbml0ICovCisJaXAgKz0gKGlwID09IGxvd2VzdCk7CisJeworCQlVMzIgY29uc3QgbWF4UmVwID0gKFUzMikoaXAgLSBsb3dlc3QpOworCQlpZiAob2Zmc2V0XzIgPiBtYXhSZXApCisJCQlvZmZzZXRTYXZlZCA9IG9mZnNldF8yLCBvZmZzZXRfMiA9IDA7CisJCWlmIChvZmZzZXRfMSA+IG1heFJlcCkKKwkJCW9mZnNldFNhdmVkID0gb2Zmc2V0XzEsIG9mZnNldF8xID0gMDsKKwl9CisKKwkvKiBNYWluIFNlYXJjaCBMb29wICovCisJd2hpbGUgKGlwIDwgaWxpbWl0KSB7IC8qIDwgaW5zdGVhZCBvZiA8PSwgYmVjYXVzZSByZXBjb2RlIGNoZWNrIGF0IChpcCsxKSAqLworCQlzaXplX3QgbUxlbmd0aDsKKwkJc2l6ZV90IGNvbnN0IGggPSBaU1REX2hhc2hQdHIoaXAsIGhCaXRzLCBtbHMpOworCQlVMzIgY29uc3QgY3VyciA9IChVMzIpKGlwIC0gYmFzZSk7CisJCVUzMiBjb25zdCBtYXRjaEluZGV4ID0gaGFzaFRhYmxlW2hdOworCQljb25zdCBCWVRFICptYXRjaCA9IGJhc2UgKyBtYXRjaEluZGV4OworCQloYXNoVGFibGVbaF0gPSBjdXJyOyAvKiB1cGRhdGUgaGFzaCB0YWJsZSAqLworCisJCWlmICgob2Zmc2V0XzEgPiAwKSAmIChaU1REX3JlYWQzMihpcCArIDEgLSBvZmZzZXRfMSkgPT0gWlNURF9yZWFkMzIoaXAgKyAxKSkpIHsKKwkJCW1MZW5ndGggPSBaU1REX2NvdW50KGlwICsgMSArIDQsIGlwICsgMSArIDQgLSBvZmZzZXRfMSwgaWVuZCkgKyA0OworCQkJaXArKzsKKwkJCVpTVERfc3RvcmVTZXEoc2VxU3RvcmVQdHIsIGlwIC0gYW5jaG9yLCBhbmNob3IsIDAsIG1MZW5ndGggLSBNSU5NQVRDSCk7CisJCX0gZWxzZSB7CisJCQlVMzIgb2Zmc2V0OworCQkJaWYgKChtYXRjaEluZGV4IDw9IGxvd2VzdEluZGV4KSB8fCAoWlNURF9yZWFkMzIobWF0Y2gpICE9IFpTVERfcmVhZDMyKGlwKSkpIHsKKwkJCQlpcCArPSAoKGlwIC0gYW5jaG9yKSA+PiBnX3NlYXJjaFN0cmVuZ3RoKSArIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQltTGVuZ3RoID0gWlNURF9jb3VudChpcCArIDQsIG1hdGNoICsgNCwgaWVuZCkgKyA0OworCQkJb2Zmc2V0ID0gKFUzMikoaXAgLSBtYXRjaCk7CisJCQl3aGlsZSAoKChpcCA+IGFuY2hvcikgJiAobWF0Y2ggPiBsb3dlc3QpKSAmJiAoaXBbLTFdID09IG1hdGNoWy0xXSkpIHsKKwkJCQlpcC0tOworCQkJCW1hdGNoLS07CisJCQkJbUxlbmd0aCsrOworCQkJfSAvKiBjYXRjaCB1cCAqLworCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCW9mZnNldF8xID0gb2Zmc2V0OworCisJCQlaU1REX3N0b3JlU2VxKHNlcVN0b3JlUHRyLCBpcCAtIGFuY2hvciwgYW5jaG9yLCBvZmZzZXQgKyBaU1REX1JFUF9NT1ZFLCBtTGVuZ3RoIC0gTUlOTUFUQ0gpOworCQl9CisKKwkJLyogbWF0Y2ggZm91bmQgKi8KKwkJaXAgKz0gbUxlbmd0aDsKKwkJYW5jaG9yID0gaXA7CisKKwkJaWYgKGlwIDw9IGlsaW1pdCkgeworCQkJLyogRmlsbCBUYWJsZSAqLworCQkJaGFzaFRhYmxlW1pTVERfaGFzaFB0cihiYXNlICsgY3VyciArIDIsIGhCaXRzLCBtbHMpXSA9IGN1cnIgKyAyOyAvKiBoZXJlIGJlY2F1c2UgY3VycisyIGNvdWxkIGJlID4gaWVuZC04ICovCisJCQloYXNoVGFibGVbWlNURF9oYXNoUHRyKGlwIC0gMiwgaEJpdHMsIG1scyldID0gKFUzMikoaXAgLSAyIC0gYmFzZSk7CisJCQkvKiBjaGVjayBpbW1lZGlhdGUgcmVwY29kZSAqLworCQkJd2hpbGUgKChpcCA8PSBpbGltaXQpICYmICgob2Zmc2V0XzIgPiAwKSAmIChaU1REX3JlYWQzMihpcCkgPT0gWlNURF9yZWFkMzIoaXAgLSBvZmZzZXRfMikpKSkgeworCQkJCS8qIHN0b3JlIHNlcXVlbmNlICovCisJCQkJc2l6ZV90IGNvbnN0IHJMZW5ndGggPSBaU1REX2NvdW50KGlwICsgNCwgaXAgKyA0IC0gb2Zmc2V0XzIsIGllbmQpICsgNDsKKwkJCQl7CisJCQkJCVUzMiBjb25zdCB0bXBPZmYgPSBvZmZzZXRfMjsKKwkJCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCQkJb2Zmc2V0XzEgPSB0bXBPZmY7CisJCQkJfSAvKiBzd2FwIG9mZnNldF8yIDw9PiBvZmZzZXRfMSAqLworCQkJCWhhc2hUYWJsZVtaU1REX2hhc2hQdHIoaXAsIGhCaXRzLCBtbHMpXSA9IChVMzIpKGlwIC0gYmFzZSk7CisJCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgMCwgYW5jaG9yLCAwLCByTGVuZ3RoIC0gTUlOTUFUQ0gpOworCQkJCWlwICs9IHJMZW5ndGg7CisJCQkJYW5jaG9yID0gaXA7CisJCQkJY29udGludWU7IC8qIGZhc3RlciB3aGVuIHByZXNlbnQgLi4uICg/KSAqLworCQkJfQorCQl9CisJfQorCisJLyogc2F2ZSByZXBzIGZvciBuZXh0IGJsb2NrICovCisJY2N0eC0+cmVwVG9Db25maXJtWzBdID0gb2Zmc2V0XzEgPyBvZmZzZXRfMSA6IG9mZnNldFNhdmVkOworCWNjdHgtPnJlcFRvQ29uZmlybVsxXSA9IG9mZnNldF8yID8gb2Zmc2V0XzIgOiBvZmZzZXRTYXZlZDsKKworCS8qIExhc3QgTGl0ZXJhbHMgKi8KKwl7CisJCXNpemVfdCBjb25zdCBsYXN0TExTaXplID0gaWVuZCAtIGFuY2hvcjsKKwkJbWVtY3B5KHNlcVN0b3JlUHRyLT5saXQsIGFuY2hvciwgbGFzdExMU2l6ZSk7CisJCXNlcVN0b3JlUHRyLT5saXQgKz0gbGFzdExMU2l6ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFpTVERfY29tcHJlc3NCbG9ja19mYXN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCWNvbnN0IFUzMiBtbHMgPSBjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExlbmd0aDsKKwlzd2l0Y2ggKG1scykgeworCWRlZmF1bHQ6IC8qIGluY2x1ZGVzIGNhc2UgMyAqLworCWNhc2UgNDogWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgNCk7IHJldHVybjsKKwljYXNlIDU6IFpTVERfY29tcHJlc3NCbG9ja19mYXN0X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDUpOyByZXR1cm47CisJY2FzZSA2OiBaU1REX2NvbXByZXNzQmxvY2tfZmFzdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA2KTsgcmV0dXJuOworCWNhc2UgNzogWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgNyk7IHJldHVybjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFpTVERfY29tcHJlc3NCbG9ja19mYXN0X2V4dERpY3RfZ2VuZXJpYyhaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3QgVTMyIG1scykKK3sKKwlVMzIgKmhhc2hUYWJsZSA9IGN0eC0+aGFzaFRhYmxlOworCWNvbnN0IFUzMiBoQml0cyA9IGN0eC0+cGFyYW1zLmNQYXJhbXMuaGFzaExvZzsKKwlzZXFTdG9yZV90ICpzZXFTdG9yZVB0ciA9ICYoY3R4LT5zZXFTdG9yZSk7CisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IGN0eC0+YmFzZTsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0QmFzZSA9IGN0eC0+ZGljdEJhc2U7CisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7CisJY29uc3QgQllURSAqaXAgPSBpc3RhcnQ7CisJY29uc3QgQllURSAqYW5jaG9yID0gaXN0YXJ0OworCWNvbnN0IFUzMiBsb3dlc3RJbmRleCA9IGN0eC0+bG93TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgZGljdFN0YXJ0ID0gZGljdEJhc2UgKyBsb3dlc3RJbmRleDsKKwljb25zdCBVMzIgZGljdExpbWl0ID0gY3R4LT5kaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgbG93UHJlZml4UHRyID0gYmFzZSArIGRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0RW5kID0gZGljdEJhc2UgKyBkaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlzdGFydCArIHNyY1NpemU7CisJY29uc3QgQllURSAqY29uc3QgaWxpbWl0ID0gaWVuZCAtIDg7CisJVTMyIG9mZnNldF8xID0gY3R4LT5yZXBbMF0sIG9mZnNldF8yID0gY3R4LT5yZXBbMV07CisKKwkvKiBTZWFyY2ggTG9vcCAqLworCXdoaWxlIChpcCA8IGlsaW1pdCkgeyAvKiA8IGluc3RlYWQgb2YgPD0sIGJlY2F1c2UgKGlwKzEpICovCisJCWNvbnN0IHNpemVfdCBoID0gWlNURF9oYXNoUHRyKGlwLCBoQml0cywgbWxzKTsKKwkJY29uc3QgVTMyIG1hdGNoSW5kZXggPSBoYXNoVGFibGVbaF07CisJCWNvbnN0IEJZVEUgKm1hdGNoQmFzZSA9IG1hdGNoSW5kZXggPCBkaWN0TGltaXQgPyBkaWN0QmFzZSA6IGJhc2U7CisJCWNvbnN0IEJZVEUgKm1hdGNoID0gbWF0Y2hCYXNlICsgbWF0Y2hJbmRleDsKKwkJY29uc3QgVTMyIGN1cnIgPSAoVTMyKShpcCAtIGJhc2UpOworCQljb25zdCBVMzIgcmVwSW5kZXggPSBjdXJyICsgMSAtIG9mZnNldF8xOyAvKiBvZmZzZXRfMSBleHBlY3RlZCA8PSBjdXJyICsxICovCisJCWNvbnN0IEJZVEUgKnJlcEJhc2UgPSByZXBJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RCYXNlIDogYmFzZTsKKwkJY29uc3QgQllURSAqcmVwTWF0Y2ggPSByZXBCYXNlICsgcmVwSW5kZXg7CisJCXNpemVfdCBtTGVuZ3RoOworCQloYXNoVGFibGVbaF0gPSBjdXJyOyAvKiB1cGRhdGUgaGFzaCB0YWJsZSAqLworCisJCWlmICgoKChVMzIpKChkaWN0TGltaXQgLSAxKSAtIHJlcEluZGV4KSA+PSAzKSAvKiBpbnRlbnRpb25hbCB1bmRlcmZsb3cgKi8gJiAocmVwSW5kZXggPiBsb3dlc3RJbmRleCkpICYmCisJCSAgICAoWlNURF9yZWFkMzIocmVwTWF0Y2gpID09IFpTVERfcmVhZDMyKGlwICsgMSkpKSB7CisJCQljb25zdCBCWVRFICpyZXBNYXRjaEVuZCA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQltTGVuZ3RoID0gWlNURF9jb3VudF8yc2VnbWVudHMoaXAgKyAxICsgRVFVQUxfUkVBRDMyLCByZXBNYXRjaCArIEVRVUFMX1JFQUQzMiwgaWVuZCwgcmVwTWF0Y2hFbmQsIGxvd1ByZWZpeFB0cikgKyBFUVVBTF9SRUFEMzI7CisJCQlpcCsrOworCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgaXAgLSBhbmNob3IsIGFuY2hvciwgMCwgbUxlbmd0aCAtIE1JTk1BVENIKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgobWF0Y2hJbmRleCA8IGxvd2VzdEluZGV4KSB8fCAoWlNURF9yZWFkMzIobWF0Y2gpICE9IFpTVERfcmVhZDMyKGlwKSkpIHsKKwkJCQlpcCArPSAoKGlwIC0gYW5jaG9yKSA+PiBnX3NlYXJjaFN0cmVuZ3RoKSArIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQl7CisJCQkJY29uc3QgQllURSAqbWF0Y2hFbmQgPSBtYXRjaEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJY29uc3QgQllURSAqbG93TWF0Y2hQdHIgPSBtYXRjaEluZGV4IDwgZGljdExpbWl0ID8gZGljdFN0YXJ0IDogbG93UHJlZml4UHRyOworCQkJCVUzMiBvZmZzZXQ7CisJCQkJbUxlbmd0aCA9IFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgRVFVQUxfUkVBRDMyLCBtYXRjaCArIEVRVUFMX1JFQUQzMiwgaWVuZCwgbWF0Y2hFbmQsIGxvd1ByZWZpeFB0cikgKyBFUVVBTF9SRUFEMzI7CisJCQkJd2hpbGUgKCgoaXAgPiBhbmNob3IpICYgKG1hdGNoID4gbG93TWF0Y2hQdHIpKSAmJiAoaXBbLTFdID09IG1hdGNoWy0xXSkpIHsKKwkJCQkJaXAtLTsKKwkJCQkJbWF0Y2gtLTsKKwkJCQkJbUxlbmd0aCsrOworCQkJCX0gLyogY2F0Y2ggdXAgKi8KKwkJCQlvZmZzZXQgPSBjdXJyIC0gbWF0Y2hJbmRleDsKKwkJCQlvZmZzZXRfMiA9IG9mZnNldF8xOworCQkJCW9mZnNldF8xID0gb2Zmc2V0OworCQkJCVpTVERfc3RvcmVTZXEoc2VxU3RvcmVQdHIsIGlwIC0gYW5jaG9yLCBhbmNob3IsIG9mZnNldCArIFpTVERfUkVQX01PVkUsIG1MZW5ndGggLSBNSU5NQVRDSCk7CisJCQl9CisJCX0KKworCQkvKiBmb3VuZCBhIG1hdGNoIDogc3RvcmUgaXQgKi8KKwkJaXAgKz0gbUxlbmd0aDsKKwkJYW5jaG9yID0gaXA7CisKKwkJaWYgKGlwIDw9IGlsaW1pdCkgeworCQkJLyogRmlsbCBUYWJsZSAqLworCQkJaGFzaFRhYmxlW1pTVERfaGFzaFB0cihiYXNlICsgY3VyciArIDIsIGhCaXRzLCBtbHMpXSA9IGN1cnIgKyAyOworCQkJaGFzaFRhYmxlW1pTVERfaGFzaFB0cihpcCAtIDIsIGhCaXRzLCBtbHMpXSA9IChVMzIpKGlwIC0gMiAtIGJhc2UpOworCQkJLyogY2hlY2sgaW1tZWRpYXRlIHJlcGNvZGUgKi8KKwkJCXdoaWxlIChpcCA8PSBpbGltaXQpIHsKKwkJCQlVMzIgY29uc3QgY3VycjIgPSAoVTMyKShpcCAtIGJhc2UpOworCQkJCVUzMiBjb25zdCByZXBJbmRleDIgPSBjdXJyMiAtIG9mZnNldF8yOworCQkJCWNvbnN0IEJZVEUgKnJlcE1hdGNoMiA9IHJlcEluZGV4MiA8IGRpY3RMaW1pdCA/IGRpY3RCYXNlICsgcmVwSW5kZXgyIDogYmFzZSArIHJlcEluZGV4MjsKKwkJCQlpZiAoKCgoVTMyKSgoZGljdExpbWl0IC0gMSkgLSByZXBJbmRleDIpID49IDMpICYgKHJlcEluZGV4MiA+IGxvd2VzdEluZGV4KSkgLyogaW50ZW50aW9uYWwgb3ZlcmZsb3cgKi8KKwkJCQkgICAgJiYgKFpTVERfcmVhZDMyKHJlcE1hdGNoMikgPT0gWlNURF9yZWFkMzIoaXApKSkgeworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBFbmQyID0gcmVwSW5kZXgyIDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJCXNpemVfdCByZXBMZW5ndGgyID0KKwkJCQkJICAgIFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgRVFVQUxfUkVBRDMyLCByZXBNYXRjaDIgKyBFUVVBTF9SRUFEMzIsIGllbmQsIHJlcEVuZDIsIGxvd1ByZWZpeFB0cikgKyBFUVVBTF9SRUFEMzI7CisJCQkJCVUzMiB0bXBPZmZzZXQgPSBvZmZzZXRfMjsKKwkJCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCQkJb2Zmc2V0XzEgPSB0bXBPZmZzZXQ7IC8qIHN3YXAgb2Zmc2V0XzIgPD0+IG9mZnNldF8xICovCisJCQkJCVpTVERfc3RvcmVTZXEoc2VxU3RvcmVQdHIsIDAsIGFuY2hvciwgMCwgcmVwTGVuZ3RoMiAtIE1JTk1BVENIKTsKKwkJCQkJaGFzaFRhYmxlW1pTVERfaGFzaFB0cihpcCwgaEJpdHMsIG1scyldID0gY3VycjI7CisJCQkJCWlwICs9IHJlcExlbmd0aDI7CisJCQkJCWFuY2hvciA9IGlwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBzYXZlIHJlcHMgZm9yIG5leHQgYmxvY2sgKi8KKwljdHgtPnJlcFRvQ29uZmlybVswXSA9IG9mZnNldF8xOworCWN0eC0+cmVwVG9Db25maXJtWzFdID0gb2Zmc2V0XzI7CisKKwkvKiBMYXN0IExpdGVyYWxzICovCisJeworCQlzaXplX3QgY29uc3QgbGFzdExMU2l6ZSA9IGllbmQgLSBhbmNob3I7CisJCW1lbWNweShzZXFTdG9yZVB0ci0+bGl0LCBhbmNob3IsIGxhc3RMTFNpemUpOworCQlzZXFTdG9yZVB0ci0+bGl0ICs9IGxhc3RMTFNpemU7CisJfQorfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfZmFzdF9leHREaWN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCVUzMiBjb25zdCBtbHMgPSBjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExlbmd0aDsKKwlzd2l0Y2ggKG1scykgeworCWRlZmF1bHQ6IC8qIGluY2x1ZGVzIGNhc2UgMyAqLworCWNhc2UgNDogWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA0KTsgcmV0dXJuOworCWNhc2UgNTogWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA1KTsgcmV0dXJuOworCWNhc2UgNjogWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA2KTsgcmV0dXJuOworCWNhc2UgNzogWlNURF9jb21wcmVzc0Jsb2NrX2Zhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA3KTsgcmV0dXJuOworCX0KK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRG91YmxlIEZhc3QKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFpTVERfZmlsbERvdWJsZUhhc2hUYWJsZShaU1REX0NDdHggKmNjdHgsIGNvbnN0IHZvaWQgKmVuZCwgY29uc3QgVTMyIG1scykKK3sKKwlVMzIgKmNvbnN0IGhhc2hMYXJnZSA9IGNjdHgtPmhhc2hUYWJsZTsKKwlVMzIgY29uc3QgaEJpdHNMID0gY2N0eC0+cGFyYW1zLmNQYXJhbXMuaGFzaExvZzsKKwlVMzIgKmNvbnN0IGhhc2hTbWFsbCA9IGNjdHgtPmNoYWluVGFibGU7CisJVTMyIGNvbnN0IGhCaXRzUyA9IGNjdHgtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nOworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSBjY3R4LT5iYXNlOworCWNvbnN0IEJZVEUgKmlwID0gYmFzZSArIGNjdHgtPm5leHRUb1VwZGF0ZTsKKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gKChjb25zdCBCWVRFICopZW5kKSAtIEhBU0hfUkVBRF9TSVpFOworCWNvbnN0IHNpemVfdCBmYXN0SGFzaEZpbGxTdGVwID0gMzsKKworCXdoaWxlIChpcCA8PSBpZW5kKSB7CisJCWhhc2hTbWFsbFtaU1REX2hhc2hQdHIoaXAsIGhCaXRzUywgbWxzKV0gPSAoVTMyKShpcCAtIGJhc2UpOworCQloYXNoTGFyZ2VbWlNURF9oYXNoUHRyKGlwLCBoQml0c0wsIDgpXSA9IChVMzIpKGlwIC0gYmFzZSk7CisJCWlwICs9IGZhc3RIYXNoRmlsbFN0ZXA7CisJfQorfQorCitGT1JDRV9JTkxJTkUKK3ZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZ2VuZXJpYyhaU1REX0NDdHggKmNjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IFUzMiBtbHMpCit7CisJVTMyICpjb25zdCBoYXNoTG9uZyA9IGNjdHgtPmhhc2hUYWJsZTsKKwljb25zdCBVMzIgaEJpdHNMID0gY2N0eC0+cGFyYW1zLmNQYXJhbXMuaGFzaExvZzsKKwlVMzIgKmNvbnN0IGhhc2hTbWFsbCA9IGNjdHgtPmNoYWluVGFibGU7CisJY29uc3QgVTMyIGhCaXRzUyA9IGNjdHgtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nOworCXNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyID0gJihjY3R4LT5zZXFTdG9yZSk7CisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IGNjdHgtPmJhc2U7CisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7CisJY29uc3QgQllURSAqaXAgPSBpc3RhcnQ7CisJY29uc3QgQllURSAqYW5jaG9yID0gaXN0YXJ0OworCWNvbnN0IFUzMiBsb3dlc3RJbmRleCA9IGNjdHgtPmRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBsb3dlc3QgPSBiYXNlICsgbG93ZXN0SW5kZXg7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlzdGFydCArIHNyY1NpemU7CisJY29uc3QgQllURSAqY29uc3QgaWxpbWl0ID0gaWVuZCAtIEhBU0hfUkVBRF9TSVpFOworCVUzMiBvZmZzZXRfMSA9IGNjdHgtPnJlcFswXSwgb2Zmc2V0XzIgPSBjY3R4LT5yZXBbMV07CisJVTMyIG9mZnNldFNhdmVkID0gMDsKKworCS8qIGluaXQgKi8KKwlpcCArPSAoaXAgPT0gbG93ZXN0KTsKKwl7CisJCVUzMiBjb25zdCBtYXhSZXAgPSAoVTMyKShpcCAtIGxvd2VzdCk7CisJCWlmIChvZmZzZXRfMiA+IG1heFJlcCkKKwkJCW9mZnNldFNhdmVkID0gb2Zmc2V0XzIsIG9mZnNldF8yID0gMDsKKwkJaWYgKG9mZnNldF8xID4gbWF4UmVwKQorCQkJb2Zmc2V0U2F2ZWQgPSBvZmZzZXRfMSwgb2Zmc2V0XzEgPSAwOworCX0KKworCS8qIE1haW4gU2VhcmNoIExvb3AgKi8KKwl3aGlsZSAoaXAgPCBpbGltaXQpIHsgLyogPCBpbnN0ZWFkIG9mIDw9LCBiZWNhdXNlIHJlcGNvZGUgY2hlY2sgYXQgKGlwKzEpICovCisJCXNpemVfdCBtTGVuZ3RoOworCQlzaXplX3QgY29uc3QgaDIgPSBaU1REX2hhc2hQdHIoaXAsIGhCaXRzTCwgOCk7CisJCXNpemVfdCBjb25zdCBoID0gWlNURF9oYXNoUHRyKGlwLCBoQml0c1MsIG1scyk7CisJCVUzMiBjb25zdCBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsKKwkJVTMyIGNvbnN0IG1hdGNoSW5kZXhMID0gaGFzaExvbmdbaDJdOworCQlVMzIgY29uc3QgbWF0Y2hJbmRleFMgPSBoYXNoU21hbGxbaF07CisJCWNvbnN0IEJZVEUgKm1hdGNoTG9uZyA9IGJhc2UgKyBtYXRjaEluZGV4TDsKKwkJY29uc3QgQllURSAqbWF0Y2ggPSBiYXNlICsgbWF0Y2hJbmRleFM7CisJCWhhc2hMb25nW2gyXSA9IGhhc2hTbWFsbFtoXSA9IGN1cnI7IC8qIHVwZGF0ZSBoYXNoIHRhYmxlcyAqLworCisJCWlmICgob2Zmc2V0XzEgPiAwKSAmIChaU1REX3JlYWQzMihpcCArIDEgLSBvZmZzZXRfMSkgPT0gWlNURF9yZWFkMzIoaXAgKyAxKSkpIHsgLyogbm90ZSA6IGJ5IGNvbnN0cnVjdGlvbiwgb2Zmc2V0XzEgPD0gY3VyciAqLworCQkJbUxlbmd0aCA9IFpTVERfY291bnQoaXAgKyAxICsgNCwgaXAgKyAxICsgNCAtIG9mZnNldF8xLCBpZW5kKSArIDQ7CisJCQlpcCsrOworCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgaXAgLSBhbmNob3IsIGFuY2hvciwgMCwgbUxlbmd0aCAtIE1JTk1BVENIKTsKKwkJfSBlbHNlIHsKKwkJCVUzMiBvZmZzZXQ7CisJCQlpZiAoKG1hdGNoSW5kZXhMID4gbG93ZXN0SW5kZXgpICYmIChaU1REX3JlYWQ2NChtYXRjaExvbmcpID09IFpTVERfcmVhZDY0KGlwKSkpIHsKKwkJCQltTGVuZ3RoID0gWlNURF9jb3VudChpcCArIDgsIG1hdGNoTG9uZyArIDgsIGllbmQpICsgODsKKwkJCQlvZmZzZXQgPSAoVTMyKShpcCAtIG1hdGNoTG9uZyk7CisJCQkJd2hpbGUgKCgoaXAgPiBhbmNob3IpICYgKG1hdGNoTG9uZyA+IGxvd2VzdCkpICYmIChpcFstMV0gPT0gbWF0Y2hMb25nWy0xXSkpIHsKKwkJCQkJaXAtLTsKKwkJCQkJbWF0Y2hMb25nLS07CisJCQkJCW1MZW5ndGgrKzsKKwkJCQl9IC8qIGNhdGNoIHVwICovCisJCQl9IGVsc2UgaWYgKChtYXRjaEluZGV4UyA+IGxvd2VzdEluZGV4KSAmJiAoWlNURF9yZWFkMzIobWF0Y2gpID09IFpTVERfcmVhZDMyKGlwKSkpIHsKKwkJCQlzaXplX3QgY29uc3QgaDMgPSBaU1REX2hhc2hQdHIoaXAgKyAxLCBoQml0c0wsIDgpOworCQkJCVUzMiBjb25zdCBtYXRjaEluZGV4MyA9IGhhc2hMb25nW2gzXTsKKwkJCQljb25zdCBCWVRFICptYXRjaDMgPSBiYXNlICsgbWF0Y2hJbmRleDM7CisJCQkJaGFzaExvbmdbaDNdID0gY3VyciArIDE7CisJCQkJaWYgKChtYXRjaEluZGV4MyA+IGxvd2VzdEluZGV4KSAmJiAoWlNURF9yZWFkNjQobWF0Y2gzKSA9PSBaU1REX3JlYWQ2NChpcCArIDEpKSkgeworCQkJCQltTGVuZ3RoID0gWlNURF9jb3VudChpcCArIDksIG1hdGNoMyArIDgsIGllbmQpICsgODsKKwkJCQkJaXArKzsKKwkJCQkJb2Zmc2V0ID0gKFUzMikoaXAgLSBtYXRjaDMpOworCQkJCQl3aGlsZSAoKChpcCA+IGFuY2hvcikgJiAobWF0Y2gzID4gbG93ZXN0KSkgJiYgKGlwWy0xXSA9PSBtYXRjaDNbLTFdKSkgeworCQkJCQkJaXAtLTsKKwkJCQkJCW1hdGNoMy0tOworCQkJCQkJbUxlbmd0aCsrOworCQkJCQl9IC8qIGNhdGNoIHVwICovCisJCQkJfSBlbHNlIHsKKwkJCQkJbUxlbmd0aCA9IFpTVERfY291bnQoaXAgKyA0LCBtYXRjaCArIDQsIGllbmQpICsgNDsKKwkJCQkJb2Zmc2V0ID0gKFUzMikoaXAgLSBtYXRjaCk7CisJCQkJCXdoaWxlICgoKGlwID4gYW5jaG9yKSAmIChtYXRjaCA+IGxvd2VzdCkpICYmIChpcFstMV0gPT0gbWF0Y2hbLTFdKSkgeworCQkJCQkJaXAtLTsKKwkJCQkJCW1hdGNoLS07CisJCQkJCQltTGVuZ3RoKys7CisJCQkJCX0gLyogY2F0Y2ggdXAgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlwICs9ICgoaXAgLSBhbmNob3IpID4+IGdfc2VhcmNoU3RyZW5ndGgpICsgMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCW9mZnNldF8xID0gb2Zmc2V0OworCisJCQlaU1REX3N0b3JlU2VxKHNlcVN0b3JlUHRyLCBpcCAtIGFuY2hvciwgYW5jaG9yLCBvZmZzZXQgKyBaU1REX1JFUF9NT1ZFLCBtTGVuZ3RoIC0gTUlOTUFUQ0gpOworCQl9CisKKwkJLyogbWF0Y2ggZm91bmQgKi8KKwkJaXAgKz0gbUxlbmd0aDsKKwkJYW5jaG9yID0gaXA7CisKKwkJaWYgKGlwIDw9IGlsaW1pdCkgeworCQkJLyogRmlsbCBUYWJsZSAqLworCQkJaGFzaExvbmdbWlNURF9oYXNoUHRyKGJhc2UgKyBjdXJyICsgMiwgaEJpdHNMLCA4KV0gPSBoYXNoU21hbGxbWlNURF9oYXNoUHRyKGJhc2UgKyBjdXJyICsgMiwgaEJpdHNTLCBtbHMpXSA9CisJCQkgICAgY3VyciArIDI7IC8qIGhlcmUgYmVjYXVzZSBjdXJyKzIgY291bGQgYmUgPiBpZW5kLTggKi8KKwkJCWhhc2hMb25nW1pTVERfaGFzaFB0cihpcCAtIDIsIGhCaXRzTCwgOCldID0gaGFzaFNtYWxsW1pTVERfaGFzaFB0cihpcCAtIDIsIGhCaXRzUywgbWxzKV0gPSAoVTMyKShpcCAtIDIgLSBiYXNlKTsKKworCQkJLyogY2hlY2sgaW1tZWRpYXRlIHJlcGNvZGUgKi8KKwkJCXdoaWxlICgoaXAgPD0gaWxpbWl0KSAmJiAoKG9mZnNldF8yID4gMCkgJiAoWlNURF9yZWFkMzIoaXApID09IFpTVERfcmVhZDMyKGlwIC0gb2Zmc2V0XzIpKSkpIHsKKwkJCQkvKiBzdG9yZSBzZXF1ZW5jZSAqLworCQkJCXNpemVfdCBjb25zdCByTGVuZ3RoID0gWlNURF9jb3VudChpcCArIDQsIGlwICsgNCAtIG9mZnNldF8yLCBpZW5kKSArIDQ7CisJCQkJeworCQkJCQlVMzIgY29uc3QgdG1wT2ZmID0gb2Zmc2V0XzI7CisJCQkJCW9mZnNldF8yID0gb2Zmc2V0XzE7CisJCQkJCW9mZnNldF8xID0gdG1wT2ZmOworCQkJCX0gLyogc3dhcCBvZmZzZXRfMiA8PT4gb2Zmc2V0XzEgKi8KKwkJCQloYXNoU21hbGxbWlNURF9oYXNoUHRyKGlwLCBoQml0c1MsIG1scyldID0gKFUzMikoaXAgLSBiYXNlKTsKKwkJCQloYXNoTG9uZ1taU1REX2hhc2hQdHIoaXAsIGhCaXRzTCwgOCldID0gKFUzMikoaXAgLSBiYXNlKTsKKwkJCQlaU1REX3N0b3JlU2VxKHNlcVN0b3JlUHRyLCAwLCBhbmNob3IsIDAsIHJMZW5ndGggLSBNSU5NQVRDSCk7CisJCQkJaXAgKz0gckxlbmd0aDsKKwkJCQlhbmNob3IgPSBpcDsKKwkJCQljb250aW51ZTsgLyogZmFzdGVyIHdoZW4gcHJlc2VudCAuLi4gKD8pICovCisJCQl9CisJCX0KKwl9CisKKwkvKiBzYXZlIHJlcHMgZm9yIG5leHQgYmxvY2sgKi8KKwljY3R4LT5yZXBUb0NvbmZpcm1bMF0gPSBvZmZzZXRfMSA/IG9mZnNldF8xIDogb2Zmc2V0U2F2ZWQ7CisJY2N0eC0+cmVwVG9Db25maXJtWzFdID0gb2Zmc2V0XzIgPyBvZmZzZXRfMiA6IG9mZnNldFNhdmVkOworCisJLyogTGFzdCBMaXRlcmFscyAqLworCXsKKwkJc2l6ZV90IGNvbnN0IGxhc3RMTFNpemUgPSBpZW5kIC0gYW5jaG9yOworCQltZW1jcHkoc2VxU3RvcmVQdHItPmxpdCwgYW5jaG9yLCBsYXN0TExTaXplKTsKKwkJc2VxU3RvcmVQdHItPmxpdCArPSBsYXN0TExTaXplOworCX0KK30KKworc3RhdGljIHZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3QoWlNURF9DQ3R4ICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJY29uc3QgVTMyIG1scyA9IGN0eC0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoOworCXN3aXRjaCAobWxzKSB7CisJZGVmYXVsdDogLyogaW5jbHVkZXMgY2FzZSAzICovCisJY2FzZSA0OiBaU1REX2NvbXByZXNzQmxvY2tfZG91YmxlRmFzdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA0KTsgcmV0dXJuOworCWNhc2UgNTogWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgNSk7IHJldHVybjsKKwljYXNlIDY6IFpTVERfY29tcHJlc3NCbG9ja19kb3VibGVGYXN0X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDYpOyByZXR1cm47CisJY2FzZSA3OiBaU1REX2NvbXByZXNzQmxvY2tfZG91YmxlRmFzdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA3KTsgcmV0dXJuOworCX0KK30KKworc3RhdGljIHZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZXh0RGljdF9nZW5lcmljKFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBVMzIgbWxzKQoreworCVUzMiAqY29uc3QgaGFzaExvbmcgPSBjdHgtPmhhc2hUYWJsZTsKKwlVMzIgY29uc3QgaEJpdHNMID0gY3R4LT5wYXJhbXMuY1BhcmFtcy5oYXNoTG9nOworCVUzMiAqY29uc3QgaGFzaFNtYWxsID0gY3R4LT5jaGFpblRhYmxlOworCVUzMiBjb25zdCBoQml0c1MgPSBjdHgtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nOworCXNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyID0gJihjdHgtPnNlcVN0b3JlKTsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gY3R4LT5iYXNlOworCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RCYXNlID0gY3R4LT5kaWN0QmFzZTsKKwljb25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAqKXNyYzsKKwljb25zdCBCWVRFICppcCA9IGlzdGFydDsKKwljb25zdCBCWVRFICphbmNob3IgPSBpc3RhcnQ7CisJY29uc3QgVTMyIGxvd2VzdEluZGV4ID0gY3R4LT5sb3dMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0U3RhcnQgPSBkaWN0QmFzZSArIGxvd2VzdEluZGV4OworCWNvbnN0IFUzMiBkaWN0TGltaXQgPSBjdHgtPmRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBsb3dQcmVmaXhQdHIgPSBiYXNlICsgZGljdExpbWl0OworCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RFbmQgPSBkaWN0QmFzZSArIGRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXN0YXJ0ICsgc3JjU2l6ZTsKKwljb25zdCBCWVRFICpjb25zdCBpbGltaXQgPSBpZW5kIC0gODsKKwlVMzIgb2Zmc2V0XzEgPSBjdHgtPnJlcFswXSwgb2Zmc2V0XzIgPSBjdHgtPnJlcFsxXTsKKworCS8qIFNlYXJjaCBMb29wICovCisJd2hpbGUgKGlwIDwgaWxpbWl0KSB7IC8qIDwgaW5zdGVhZCBvZiA8PSwgYmVjYXVzZSAoaXArMSkgKi8KKwkJY29uc3Qgc2l6ZV90IGhTbWFsbCA9IFpTVERfaGFzaFB0cihpcCwgaEJpdHNTLCBtbHMpOworCQljb25zdCBVMzIgbWF0Y2hJbmRleCA9IGhhc2hTbWFsbFtoU21hbGxdOworCQljb25zdCBCWVRFICptYXRjaEJhc2UgPSBtYXRjaEluZGV4IDwgZGljdExpbWl0ID8gZGljdEJhc2UgOiBiYXNlOworCQljb25zdCBCWVRFICptYXRjaCA9IG1hdGNoQmFzZSArIG1hdGNoSW5kZXg7CisKKwkJY29uc3Qgc2l6ZV90IGhMb25nID0gWlNURF9oYXNoUHRyKGlwLCBoQml0c0wsIDgpOworCQljb25zdCBVMzIgbWF0Y2hMb25nSW5kZXggPSBoYXNoTG9uZ1toTG9uZ107CisJCWNvbnN0IEJZVEUgKm1hdGNoTG9uZ0Jhc2UgPSBtYXRjaExvbmdJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RCYXNlIDogYmFzZTsKKwkJY29uc3QgQllURSAqbWF0Y2hMb25nID0gbWF0Y2hMb25nQmFzZSArIG1hdGNoTG9uZ0luZGV4OworCisJCWNvbnN0IFUzMiBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsKKwkJY29uc3QgVTMyIHJlcEluZGV4ID0gY3VyciArIDEgLSBvZmZzZXRfMTsgLyogb2Zmc2V0XzEgZXhwZWN0ZWQgPD0gY3VyciArMSAqLworCQljb25zdCBCWVRFICpyZXBCYXNlID0gcmVwSW5kZXggPCBkaWN0TGltaXQgPyBkaWN0QmFzZSA6IGJhc2U7CisJCWNvbnN0IEJZVEUgKnJlcE1hdGNoID0gcmVwQmFzZSArIHJlcEluZGV4OworCQlzaXplX3QgbUxlbmd0aDsKKwkJaGFzaFNtYWxsW2hTbWFsbF0gPSBoYXNoTG9uZ1toTG9uZ10gPSBjdXJyOyAvKiB1cGRhdGUgaGFzaCB0YWJsZSAqLworCisJCWlmICgoKChVMzIpKChkaWN0TGltaXQgLSAxKSAtIHJlcEluZGV4KSA+PSAzKSAvKiBpbnRlbnRpb25hbCB1bmRlcmZsb3cgKi8gJiAocmVwSW5kZXggPiBsb3dlc3RJbmRleCkpICYmCisJCSAgICAoWlNURF9yZWFkMzIocmVwTWF0Y2gpID09IFpTVERfcmVhZDMyKGlwICsgMSkpKSB7CisJCQljb25zdCBCWVRFICpyZXBNYXRjaEVuZCA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQltTGVuZ3RoID0gWlNURF9jb3VudF8yc2VnbWVudHMoaXAgKyAxICsgNCwgcmVwTWF0Y2ggKyA0LCBpZW5kLCByZXBNYXRjaEVuZCwgbG93UHJlZml4UHRyKSArIDQ7CisJCQlpcCsrOworCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgaXAgLSBhbmNob3IsIGFuY2hvciwgMCwgbUxlbmd0aCAtIE1JTk1BVENIKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgobWF0Y2hMb25nSW5kZXggPiBsb3dlc3RJbmRleCkgJiYgKFpTVERfcmVhZDY0KG1hdGNoTG9uZykgPT0gWlNURF9yZWFkNjQoaXApKSkgeworCQkJCWNvbnN0IEJZVEUgKm1hdGNoRW5kID0gbWF0Y2hMb25nSW5kZXggPCBkaWN0TGltaXQgPyBkaWN0RW5kIDogaWVuZDsKKwkJCQljb25zdCBCWVRFICpsb3dNYXRjaFB0ciA9IG1hdGNoTG9uZ0luZGV4IDwgZGljdExpbWl0ID8gZGljdFN0YXJ0IDogbG93UHJlZml4UHRyOworCQkJCVUzMiBvZmZzZXQ7CisJCQkJbUxlbmd0aCA9IFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgOCwgbWF0Y2hMb25nICsgOCwgaWVuZCwgbWF0Y2hFbmQsIGxvd1ByZWZpeFB0cikgKyA4OworCQkJCW9mZnNldCA9IGN1cnIgLSBtYXRjaExvbmdJbmRleDsKKwkJCQl3aGlsZSAoKChpcCA+IGFuY2hvcikgJiAobWF0Y2hMb25nID4gbG93TWF0Y2hQdHIpKSAmJiAoaXBbLTFdID09IG1hdGNoTG9uZ1stMV0pKSB7CisJCQkJCWlwLS07CisJCQkJCW1hdGNoTG9uZy0tOworCQkJCQltTGVuZ3RoKys7CisJCQkJfSAvKiBjYXRjaCB1cCAqLworCQkJCW9mZnNldF8yID0gb2Zmc2V0XzE7CisJCQkJb2Zmc2V0XzEgPSBvZmZzZXQ7CisJCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgaXAgLSBhbmNob3IsIGFuY2hvciwgb2Zmc2V0ICsgWlNURF9SRVBfTU9WRSwgbUxlbmd0aCAtIE1JTk1BVENIKTsKKworCQkJfSBlbHNlIGlmICgobWF0Y2hJbmRleCA+IGxvd2VzdEluZGV4KSAmJiAoWlNURF9yZWFkMzIobWF0Y2gpID09IFpTVERfcmVhZDMyKGlwKSkpIHsKKwkJCQlzaXplX3QgY29uc3QgaDMgPSBaU1REX2hhc2hQdHIoaXAgKyAxLCBoQml0c0wsIDgpOworCQkJCVUzMiBjb25zdCBtYXRjaEluZGV4MyA9IGhhc2hMb25nW2gzXTsKKwkJCQljb25zdCBCWVRFICpjb25zdCBtYXRjaDNCYXNlID0gbWF0Y2hJbmRleDMgPCBkaWN0TGltaXQgPyBkaWN0QmFzZSA6IGJhc2U7CisJCQkJY29uc3QgQllURSAqbWF0Y2gzID0gbWF0Y2gzQmFzZSArIG1hdGNoSW5kZXgzOworCQkJCVUzMiBvZmZzZXQ7CisJCQkJaGFzaExvbmdbaDNdID0gY3VyciArIDE7CisJCQkJaWYgKChtYXRjaEluZGV4MyA+IGxvd2VzdEluZGV4KSAmJiAoWlNURF9yZWFkNjQobWF0Y2gzKSA9PSBaU1REX3JlYWQ2NChpcCArIDEpKSkgeworCQkJCQljb25zdCBCWVRFICptYXRjaEVuZCA9IG1hdGNoSW5kZXgzIDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJCWNvbnN0IEJZVEUgKmxvd01hdGNoUHRyID0gbWF0Y2hJbmRleDMgPCBkaWN0TGltaXQgPyBkaWN0U3RhcnQgOiBsb3dQcmVmaXhQdHI7CisJCQkJCW1MZW5ndGggPSBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIDksIG1hdGNoMyArIDgsIGllbmQsIG1hdGNoRW5kLCBsb3dQcmVmaXhQdHIpICsgODsKKwkJCQkJaXArKzsKKwkJCQkJb2Zmc2V0ID0gY3VyciArIDEgLSBtYXRjaEluZGV4MzsKKwkJCQkJd2hpbGUgKCgoaXAgPiBhbmNob3IpICYgKG1hdGNoMyA+IGxvd01hdGNoUHRyKSkgJiYgKGlwWy0xXSA9PSBtYXRjaDNbLTFdKSkgeworCQkJCQkJaXAtLTsKKwkJCQkJCW1hdGNoMy0tOworCQkJCQkJbUxlbmd0aCsrOworCQkJCQl9IC8qIGNhdGNoIHVwICovCisJCQkJfSBlbHNlIHsKKwkJCQkJY29uc3QgQllURSAqbWF0Y2hFbmQgPSBtYXRjaEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJCWNvbnN0IEJZVEUgKmxvd01hdGNoUHRyID0gbWF0Y2hJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RTdGFydCA6IGxvd1ByZWZpeFB0cjsKKwkJCQkJbUxlbmd0aCA9IFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgNCwgbWF0Y2ggKyA0LCBpZW5kLCBtYXRjaEVuZCwgbG93UHJlZml4UHRyKSArIDQ7CisJCQkJCW9mZnNldCA9IGN1cnIgLSBtYXRjaEluZGV4OworCQkJCQl3aGlsZSAoKChpcCA+IGFuY2hvcikgJiAobWF0Y2ggPiBsb3dNYXRjaFB0cikpICYmIChpcFstMV0gPT0gbWF0Y2hbLTFdKSkgeworCQkJCQkJaXAtLTsKKwkJCQkJCW1hdGNoLS07CisJCQkJCQltTGVuZ3RoKys7CisJCQkJCX0gLyogY2F0Y2ggdXAgKi8KKwkJCQl9CisJCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCQlvZmZzZXRfMSA9IG9mZnNldDsKKwkJCQlaU1REX3N0b3JlU2VxKHNlcVN0b3JlUHRyLCBpcCAtIGFuY2hvciwgYW5jaG9yLCBvZmZzZXQgKyBaU1REX1JFUF9NT1ZFLCBtTGVuZ3RoIC0gTUlOTUFUQ0gpOworCisJCQl9IGVsc2UgeworCQkJCWlwICs9ICgoaXAgLSBhbmNob3IpID4+IGdfc2VhcmNoU3RyZW5ndGgpICsgMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIGZvdW5kIGEgbWF0Y2ggOiBzdG9yZSBpdCAqLworCQlpcCArPSBtTGVuZ3RoOworCQlhbmNob3IgPSBpcDsKKworCQlpZiAoaXAgPD0gaWxpbWl0KSB7CisJCQkvKiBGaWxsIFRhYmxlICovCisJCQloYXNoU21hbGxbWlNURF9oYXNoUHRyKGJhc2UgKyBjdXJyICsgMiwgaEJpdHNTLCBtbHMpXSA9IGN1cnIgKyAyOworCQkJaGFzaExvbmdbWlNURF9oYXNoUHRyKGJhc2UgKyBjdXJyICsgMiwgaEJpdHNMLCA4KV0gPSBjdXJyICsgMjsKKwkJCWhhc2hTbWFsbFtaU1REX2hhc2hQdHIoaXAgLSAyLCBoQml0c1MsIG1scyldID0gKFUzMikoaXAgLSAyIC0gYmFzZSk7CisJCQloYXNoTG9uZ1taU1REX2hhc2hQdHIoaXAgLSAyLCBoQml0c0wsIDgpXSA9IChVMzIpKGlwIC0gMiAtIGJhc2UpOworCQkJLyogY2hlY2sgaW1tZWRpYXRlIHJlcGNvZGUgKi8KKwkJCXdoaWxlIChpcCA8PSBpbGltaXQpIHsKKwkJCQlVMzIgY29uc3QgY3VycjIgPSAoVTMyKShpcCAtIGJhc2UpOworCQkJCVUzMiBjb25zdCByZXBJbmRleDIgPSBjdXJyMiAtIG9mZnNldF8yOworCQkJCWNvbnN0IEJZVEUgKnJlcE1hdGNoMiA9IHJlcEluZGV4MiA8IGRpY3RMaW1pdCA/IGRpY3RCYXNlICsgcmVwSW5kZXgyIDogYmFzZSArIHJlcEluZGV4MjsKKwkJCQlpZiAoKCgoVTMyKSgoZGljdExpbWl0IC0gMSkgLSByZXBJbmRleDIpID49IDMpICYgKHJlcEluZGV4MiA+IGxvd2VzdEluZGV4KSkgLyogaW50ZW50aW9uYWwgb3ZlcmZsb3cgKi8KKwkJCQkgICAgJiYgKFpTVERfcmVhZDMyKHJlcE1hdGNoMikgPT0gWlNURF9yZWFkMzIoaXApKSkgeworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBFbmQyID0gcmVwSW5kZXgyIDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJCXNpemVfdCBjb25zdCByZXBMZW5ndGgyID0KKwkJCQkJICAgIFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgRVFVQUxfUkVBRDMyLCByZXBNYXRjaDIgKyBFUVVBTF9SRUFEMzIsIGllbmQsIHJlcEVuZDIsIGxvd1ByZWZpeFB0cikgKyBFUVVBTF9SRUFEMzI7CisJCQkJCVUzMiB0bXBPZmZzZXQgPSBvZmZzZXRfMjsKKwkJCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCQkJb2Zmc2V0XzEgPSB0bXBPZmZzZXQ7IC8qIHN3YXAgb2Zmc2V0XzIgPD0+IG9mZnNldF8xICovCisJCQkJCVpTVERfc3RvcmVTZXEoc2VxU3RvcmVQdHIsIDAsIGFuY2hvciwgMCwgcmVwTGVuZ3RoMiAtIE1JTk1BVENIKTsKKwkJCQkJaGFzaFNtYWxsW1pTVERfaGFzaFB0cihpcCwgaEJpdHNTLCBtbHMpXSA9IGN1cnIyOworCQkJCQloYXNoTG9uZ1taU1REX2hhc2hQdHIoaXAsIGhCaXRzTCwgOCldID0gY3VycjI7CisJCQkJCWlwICs9IHJlcExlbmd0aDI7CisJCQkJCWFuY2hvciA9IGlwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBzYXZlIHJlcHMgZm9yIG5leHQgYmxvY2sgKi8KKwljdHgtPnJlcFRvQ29uZmlybVswXSA9IG9mZnNldF8xOworCWN0eC0+cmVwVG9Db25maXJtWzFdID0gb2Zmc2V0XzI7CisKKwkvKiBMYXN0IExpdGVyYWxzICovCisJeworCQlzaXplX3QgY29uc3QgbGFzdExMU2l6ZSA9IGllbmQgLSBhbmNob3I7CisJCW1lbWNweShzZXFTdG9yZVB0ci0+bGl0LCBhbmNob3IsIGxhc3RMTFNpemUpOworCQlzZXFTdG9yZVB0ci0+bGl0ICs9IGxhc3RMTFNpemU7CisJfQorfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfZG91YmxlRmFzdF9leHREaWN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCVUzMiBjb25zdCBtbHMgPSBjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExlbmd0aDsKKwlzd2l0Y2ggKG1scykgeworCWRlZmF1bHQ6IC8qIGluY2x1ZGVzIGNhc2UgMyAqLworCWNhc2UgNDogWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA0KTsgcmV0dXJuOworCWNhc2UgNTogWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA1KTsgcmV0dXJuOworCWNhc2UgNjogWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA2KTsgcmV0dXJuOworCWNhc2UgNzogWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3RfZXh0RGljdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCA3KTsgcmV0dXJuOworCX0KK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQmluYXJ5IFRyZWUgc2VhcmNoCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogWlNURF9pbnNlcnRCdDEoKSA6IGFkZCBvbmUgb3IgbXVsdGlwbGUgcG9zaXRpb25zIHRvIHRyZWUuCisqICAgaXAgOiBhc3N1bWVkIDw9IGllbmQtOCAuCisqICAgQHJldHVybiA6IG5iIG9mIHBvc2l0aW9ucyBhZGRlZCAqLworc3RhdGljIFUzMiBaU1REX2luc2VydEJ0MShaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29uc3QgVTMyIG1scywgY29uc3QgQllURSAqY29uc3QgaWVuZCwgVTMyIG5iQ29tcGFyZXMsIFUzMiBleHREaWN0KQoreworCVUzMiAqY29uc3QgaGFzaFRhYmxlID0gemMtPmhhc2hUYWJsZTsKKwlVMzIgY29uc3QgaGFzaExvZyA9IHpjLT5wYXJhbXMuY1BhcmFtcy5oYXNoTG9nOworCXNpemVfdCBjb25zdCBoID0gWlNURF9oYXNoUHRyKGlwLCBoYXNoTG9nLCBtbHMpOworCVUzMiAqY29uc3QgYnQgPSB6Yy0+Y2hhaW5UYWJsZTsKKwlVMzIgY29uc3QgYnRMb2cgPSB6Yy0+cGFyYW1zLmNQYXJhbXMuY2hhaW5Mb2cgLSAxOworCVUzMiBjb25zdCBidE1hc2sgPSAoMSA8PCBidExvZykgLSAxOworCVUzMiBtYXRjaEluZGV4ID0gaGFzaFRhYmxlW2hdOworCXNpemVfdCBjb21tb25MZW5ndGhTbWFsbGVyID0gMCwgY29tbW9uTGVuZ3RoTGFyZ2VyID0gMDsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gemMtPmJhc2U7CisJY29uc3QgQllURSAqY29uc3QgZGljdEJhc2UgPSB6Yy0+ZGljdEJhc2U7CisJY29uc3QgVTMyIGRpY3RMaW1pdCA9IHpjLT5kaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RCYXNlICsgZGljdExpbWl0OworCWNvbnN0IEJZVEUgKmNvbnN0IHByZWZpeFN0YXJ0ID0gYmFzZSArIGRpY3RMaW1pdDsKKwljb25zdCBCWVRFICptYXRjaDsKKwljb25zdCBVMzIgY3VyciA9IChVMzIpKGlwIC0gYmFzZSk7CisJY29uc3QgVTMyIGJ0TG93ID0gYnRNYXNrID49IGN1cnIgPyAwIDogY3VyciAtIGJ0TWFzazsKKwlVMzIgKnNtYWxsZXJQdHIgPSBidCArIDIgKiAoY3VyciAmIGJ0TWFzayk7CisJVTMyICpsYXJnZXJQdHIgPSBzbWFsbGVyUHRyICsgMTsKKwlVMzIgZHVtbXkzMjsgLyogdG8gYmUgbnVsbGlmaWVkIGF0IHRoZSBlbmQgKi8KKwlVMzIgY29uc3Qgd2luZG93TG93ID0gemMtPmxvd0xpbWl0OworCVUzMiBtYXRjaEVuZElkeCA9IGN1cnIgKyA4OworCXNpemVfdCBiZXN0TGVuZ3RoID0gODsKKworCWhhc2hUYWJsZVtoXSA9IGN1cnI7IC8qIFVwZGF0ZSBIYXNoIFRhYmxlICovCisKKwl3aGlsZSAobmJDb21wYXJlcy0tICYmIChtYXRjaEluZGV4ID4gd2luZG93TG93KSkgeworCQlVMzIgKmNvbnN0IG5leHRQdHIgPSBidCArIDIgKiAobWF0Y2hJbmRleCAmIGJ0TWFzayk7CisJCXNpemVfdCBtYXRjaExlbmd0aCA9IE1JTihjb21tb25MZW5ndGhTbWFsbGVyLCBjb21tb25MZW5ndGhMYXJnZXIpOyAvKiBndWFyYW50ZWVkIG1pbmltdW0gbmIgb2YgY29tbW9uIGJ5dGVzICovCisKKwkJaWYgKCghZXh0RGljdCkgfHwgKG1hdGNoSW5kZXggKyBtYXRjaExlbmd0aCA+PSBkaWN0TGltaXQpKSB7CisJCQltYXRjaCA9IGJhc2UgKyBtYXRjaEluZGV4OworCQkJaWYgKG1hdGNoW21hdGNoTGVuZ3RoXSA9PSBpcFttYXRjaExlbmd0aF0pCisJCQkJbWF0Y2hMZW5ndGggKz0gWlNURF9jb3VudChpcCArIG1hdGNoTGVuZ3RoICsgMSwgbWF0Y2ggKyBtYXRjaExlbmd0aCArIDEsIGllbmQpICsgMTsKKwkJfSBlbHNlIHsKKwkJCW1hdGNoID0gZGljdEJhc2UgKyBtYXRjaEluZGV4OworCQkJbWF0Y2hMZW5ndGggKz0gWlNURF9jb3VudF8yc2VnbWVudHMoaXAgKyBtYXRjaExlbmd0aCwgbWF0Y2ggKyBtYXRjaExlbmd0aCwgaWVuZCwgZGljdEVuZCwgcHJlZml4U3RhcnQpOworCQkJaWYgKG1hdGNoSW5kZXggKyBtYXRjaExlbmd0aCA+PSBkaWN0TGltaXQpCisJCQkJbWF0Y2ggPSBiYXNlICsgbWF0Y2hJbmRleDsgLyogdG8gcHJlcGFyZSBmb3IgbmV4dCB1c2FnZSBvZiBtYXRjaFttYXRjaExlbmd0aF0gKi8KKwkJfQorCisJCWlmIChtYXRjaExlbmd0aCA+IGJlc3RMZW5ndGgpIHsKKwkJCWJlc3RMZW5ndGggPSBtYXRjaExlbmd0aDsKKwkJCWlmIChtYXRjaExlbmd0aCA+IG1hdGNoRW5kSWR4IC0gbWF0Y2hJbmRleCkKKwkJCQltYXRjaEVuZElkeCA9IG1hdGNoSW5kZXggKyAoVTMyKW1hdGNoTGVuZ3RoOworCQl9CisKKwkJaWYgKGlwICsgbWF0Y2hMZW5ndGggPT0gaWVuZCkgLyogZXF1YWwgOiBubyB3YXkgdG8ga25vdyBpZiBpbmYgb3Igc3VwICovCisJCQlicmVhazsJCSAgICAgIC8qIGRyb3AgLCB0byBndWFyYW50ZWUgY29uc2lzdGVuY3kgOyBtaXNzIGEgYml0IG9mIGNvbXByZXNzaW9uLCBidXQgb3RoZXIgc29sdXRpb25zIGNhbiBjb3JydXB0IHRoZSB0cmVlICovCisKKwkJaWYgKG1hdGNoW21hdGNoTGVuZ3RoXSA8IGlwW21hdGNoTGVuZ3RoXSkgeyAvKiBuZWNlc3NhcmlseSB3aXRoaW4gY29ycmVjdCBidWZmZXIgKi8KKwkJCS8qIG1hdGNoIGlzIHNtYWxsZXIgdGhhbiBjdXJyICovCisJCQkqc21hbGxlclB0ciA9IG1hdGNoSW5kZXg7CSAgLyogdXBkYXRlIHNtYWxsZXIgaWR4ICovCisJCQljb21tb25MZW5ndGhTbWFsbGVyID0gbWF0Y2hMZW5ndGg7IC8qIGFsbCBzbWFsbGVyIHdpbGwgbm93IGhhdmUgYXQgbGVhc3QgdGhpcyBndWFyYW50ZWVkIGNvbW1vbiBsZW5ndGggKi8KKwkJCWlmIChtYXRjaEluZGV4IDw9IGJ0TG93KSB7CisJCQkJc21hbGxlclB0ciA9ICZkdW1teTMyOworCQkJCWJyZWFrOworCQkJfQkJCSAgLyogYmV5b25kIHRyZWUgc2l6ZSwgc3RvcCB0aGUgc2VhcmNoICovCisJCQlzbWFsbGVyUHRyID0gbmV4dFB0ciArIDE7IC8qIG5ldyAic21hbGxlciIgPT4gbGFyZ2VyIG9mIG1hdGNoICovCisJCQltYXRjaEluZGV4ID0gbmV4dFB0clsxXTsgIC8qIG5ldyBtYXRjaEluZGV4IGxhcmdlciB0aGFuIHByZXZpb3VzIChjbG9zZXIgdG8gY3VycikgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIG1hdGNoIGlzIGxhcmdlciB0aGFuIGN1cnIgKi8KKwkJCSpsYXJnZXJQdHIgPSBtYXRjaEluZGV4OworCQkJY29tbW9uTGVuZ3RoTGFyZ2VyID0gbWF0Y2hMZW5ndGg7CisJCQlpZiAobWF0Y2hJbmRleCA8PSBidExvdykgeworCQkJCWxhcmdlclB0ciA9ICZkdW1teTMyOworCQkJCWJyZWFrOworCQkJfSAvKiBiZXlvbmQgdHJlZSBzaXplLCBzdG9wIHRoZSBzZWFyY2ggKi8KKwkJCWxhcmdlclB0ciA9IG5leHRQdHI7CisJCQltYXRjaEluZGV4ID0gbmV4dFB0clswXTsKKwkJfQorCX0KKworCSpzbWFsbGVyUHRyID0gKmxhcmdlclB0ciA9IDA7CisJaWYgKGJlc3RMZW5ndGggPiAzODQpCisJCXJldHVybiBNSU4oMTkyLCAoVTMyKShiZXN0TGVuZ3RoIC0gMzg0KSk7IC8qIHNwZWVkIG9wdGltaXphdGlvbiAqLworCWlmIChtYXRjaEVuZElkeCA+IGN1cnIgKyA4KQorCQlyZXR1cm4gbWF0Y2hFbmRJZHggLSBjdXJyIC0gODsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHNpemVfdCBaU1REX2luc2VydEJ0QW5kRmluZEJlc3RNYXRjaChaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29uc3QgQllURSAqY29uc3QgaWVuZCwgc2l6ZV90ICpvZmZzZXRQdHIsIFUzMiBuYkNvbXBhcmVzLCBjb25zdCBVMzIgbWxzLAorCQkJCQkgICAgVTMyIGV4dERpY3QpCit7CisJVTMyICpjb25zdCBoYXNoVGFibGUgPSB6Yy0+aGFzaFRhYmxlOworCVUzMiBjb25zdCBoYXNoTG9nID0gemMtPnBhcmFtcy5jUGFyYW1zLmhhc2hMb2c7CisJc2l6ZV90IGNvbnN0IGggPSBaU1REX2hhc2hQdHIoaXAsIGhhc2hMb2csIG1scyk7CisJVTMyICpjb25zdCBidCA9IHpjLT5jaGFpblRhYmxlOworCVUzMiBjb25zdCBidExvZyA9IHpjLT5wYXJhbXMuY1BhcmFtcy5jaGFpbkxvZyAtIDE7CisJVTMyIGNvbnN0IGJ0TWFzayA9ICgxIDw8IGJ0TG9nKSAtIDE7CisJVTMyIG1hdGNoSW5kZXggPSBoYXNoVGFibGVbaF07CisJc2l6ZV90IGNvbW1vbkxlbmd0aFNtYWxsZXIgPSAwLCBjb21tb25MZW5ndGhMYXJnZXIgPSAwOworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSB6Yy0+YmFzZTsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0QmFzZSA9IHpjLT5kaWN0QmFzZTsKKwljb25zdCBVMzIgZGljdExpbWl0ID0gemMtPmRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0RW5kID0gZGljdEJhc2UgKyBkaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgcHJlZml4U3RhcnQgPSBiYXNlICsgZGljdExpbWl0OworCWNvbnN0IFUzMiBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsKKwljb25zdCBVMzIgYnRMb3cgPSBidE1hc2sgPj0gY3VyciA/IDAgOiBjdXJyIC0gYnRNYXNrOworCWNvbnN0IFUzMiB3aW5kb3dMb3cgPSB6Yy0+bG93TGltaXQ7CisJVTMyICpzbWFsbGVyUHRyID0gYnQgKyAyICogKGN1cnIgJiBidE1hc2spOworCVUzMiAqbGFyZ2VyUHRyID0gYnQgKyAyICogKGN1cnIgJiBidE1hc2spICsgMTsKKwlVMzIgbWF0Y2hFbmRJZHggPSBjdXJyICsgODsKKwlVMzIgZHVtbXkzMjsgLyogdG8gYmUgbnVsbGlmaWVkIGF0IHRoZSBlbmQgKi8KKwlzaXplX3QgYmVzdExlbmd0aCA9IDA7CisKKwloYXNoVGFibGVbaF0gPSBjdXJyOyAvKiBVcGRhdGUgSGFzaCBUYWJsZSAqLworCisJd2hpbGUgKG5iQ29tcGFyZXMtLSAmJiAobWF0Y2hJbmRleCA+IHdpbmRvd0xvdykpIHsKKwkJVTMyICpjb25zdCBuZXh0UHRyID0gYnQgKyAyICogKG1hdGNoSW5kZXggJiBidE1hc2spOworCQlzaXplX3QgbWF0Y2hMZW5ndGggPSBNSU4oY29tbW9uTGVuZ3RoU21hbGxlciwgY29tbW9uTGVuZ3RoTGFyZ2VyKTsgLyogZ3VhcmFudGVlZCBtaW5pbXVtIG5iIG9mIGNvbW1vbiBieXRlcyAqLworCQljb25zdCBCWVRFICptYXRjaDsKKworCQlpZiAoKCFleHREaWN0KSB8fCAobWF0Y2hJbmRleCArIG1hdGNoTGVuZ3RoID49IGRpY3RMaW1pdCkpIHsKKwkJCW1hdGNoID0gYmFzZSArIG1hdGNoSW5kZXg7CisJCQlpZiAobWF0Y2hbbWF0Y2hMZW5ndGhdID09IGlwW21hdGNoTGVuZ3RoXSkKKwkJCQltYXRjaExlbmd0aCArPSBaU1REX2NvdW50KGlwICsgbWF0Y2hMZW5ndGggKyAxLCBtYXRjaCArIG1hdGNoTGVuZ3RoICsgMSwgaWVuZCkgKyAxOworCQl9IGVsc2UgeworCQkJbWF0Y2ggPSBkaWN0QmFzZSArIG1hdGNoSW5kZXg7CisJCQltYXRjaExlbmd0aCArPSBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIG1hdGNoTGVuZ3RoLCBtYXRjaCArIG1hdGNoTGVuZ3RoLCBpZW5kLCBkaWN0RW5kLCBwcmVmaXhTdGFydCk7CisJCQlpZiAobWF0Y2hJbmRleCArIG1hdGNoTGVuZ3RoID49IGRpY3RMaW1pdCkKKwkJCQltYXRjaCA9IGJhc2UgKyBtYXRjaEluZGV4OyAvKiB0byBwcmVwYXJlIGZvciBuZXh0IHVzYWdlIG9mIG1hdGNoW21hdGNoTGVuZ3RoXSAqLworCQl9CisKKwkJaWYgKG1hdGNoTGVuZ3RoID4gYmVzdExlbmd0aCkgeworCQkJaWYgKG1hdGNoTGVuZ3RoID4gbWF0Y2hFbmRJZHggLSBtYXRjaEluZGV4KQorCQkJCW1hdGNoRW5kSWR4ID0gbWF0Y2hJbmRleCArIChVMzIpbWF0Y2hMZW5ndGg7CisJCQlpZiAoKDQgKiAoaW50KShtYXRjaExlbmd0aCAtIGJlc3RMZW5ndGgpKSA+IChpbnQpKFpTVERfaGlnaGJpdDMyKGN1cnIgLSBtYXRjaEluZGV4ICsgMSkgLSBaU1REX2hpZ2hiaXQzMigoVTMyKW9mZnNldFB0clswXSArIDEpKSkKKwkJCQliZXN0TGVuZ3RoID0gbWF0Y2hMZW5ndGgsICpvZmZzZXRQdHIgPSBaU1REX1JFUF9NT1ZFICsgY3VyciAtIG1hdGNoSW5kZXg7CisJCQlpZiAoaXAgKyBtYXRjaExlbmd0aCA9PSBpZW5kKSAvKiBlcXVhbCA6IG5vIHdheSB0byBrbm93IGlmIGluZiBvciBzdXAgKi8KKwkJCQlicmVhazsJCSAgICAgIC8qIGRyb3AsIHRvIGd1YXJhbnRlZSBjb25zaXN0ZW5jeSAobWlzcyBhIGxpdHRsZSBiaXQgb2YgY29tcHJlc3Npb24pICovCisJCX0KKworCQlpZiAobWF0Y2hbbWF0Y2hMZW5ndGhdIDwgaXBbbWF0Y2hMZW5ndGhdKSB7CisJCQkvKiBtYXRjaCBpcyBzbWFsbGVyIHRoYW4gY3VyciAqLworCQkJKnNtYWxsZXJQdHIgPSBtYXRjaEluZGV4OwkgIC8qIHVwZGF0ZSBzbWFsbGVyIGlkeCAqLworCQkJY29tbW9uTGVuZ3RoU21hbGxlciA9IG1hdGNoTGVuZ3RoOyAvKiBhbGwgc21hbGxlciB3aWxsIG5vdyBoYXZlIGF0IGxlYXN0IHRoaXMgZ3VhcmFudGVlZCBjb21tb24gbGVuZ3RoICovCisJCQlpZiAobWF0Y2hJbmRleCA8PSBidExvdykgeworCQkJCXNtYWxsZXJQdHIgPSAmZHVtbXkzMjsKKwkJCQlicmVhazsKKwkJCX0JCQkgIC8qIGJleW9uZCB0cmVlIHNpemUsIHN0b3AgdGhlIHNlYXJjaCAqLworCQkJc21hbGxlclB0ciA9IG5leHRQdHIgKyAxOyAvKiBuZXcgInNtYWxsZXIiID0+IGxhcmdlciBvZiBtYXRjaCAqLworCQkJbWF0Y2hJbmRleCA9IG5leHRQdHJbMV07ICAvKiBuZXcgbWF0Y2hJbmRleCBsYXJnZXIgdGhhbiBwcmV2aW91cyAoY2xvc2VyIHRvIGN1cnIpICovCisJCX0gZWxzZSB7CisJCQkvKiBtYXRjaCBpcyBsYXJnZXIgdGhhbiBjdXJyICovCisJCQkqbGFyZ2VyUHRyID0gbWF0Y2hJbmRleDsKKwkJCWNvbW1vbkxlbmd0aExhcmdlciA9IG1hdGNoTGVuZ3RoOworCQkJaWYgKG1hdGNoSW5kZXggPD0gYnRMb3cpIHsKKwkJCQlsYXJnZXJQdHIgPSAmZHVtbXkzMjsKKwkJCQlicmVhazsKKwkJCX0gLyogYmV5b25kIHRyZWUgc2l6ZSwgc3RvcCB0aGUgc2VhcmNoICovCisJCQlsYXJnZXJQdHIgPSBuZXh0UHRyOworCQkJbWF0Y2hJbmRleCA9IG5leHRQdHJbMF07CisJCX0KKwl9CisKKwkqc21hbGxlclB0ciA9ICpsYXJnZXJQdHIgPSAwOworCisJemMtPm5leHRUb1VwZGF0ZSA9IChtYXRjaEVuZElkeCA+IGN1cnIgKyA4KSA/IG1hdGNoRW5kSWR4IC0gOCA6IGN1cnIgKyAxOworCXJldHVybiBiZXN0TGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBaU1REX3VwZGF0ZVRyZWUoWlNURF9DQ3R4ICp6YywgY29uc3QgQllURSAqY29uc3QgaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGllbmQsIGNvbnN0IFUzMiBuYkNvbXBhcmVzLCBjb25zdCBVMzIgbWxzKQoreworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSB6Yy0+YmFzZTsKKwljb25zdCBVMzIgdGFyZ2V0ID0gKFUzMikoaXAgLSBiYXNlKTsKKwlVMzIgaWR4ID0gemMtPm5leHRUb1VwZGF0ZTsKKworCXdoaWxlIChpZHggPCB0YXJnZXQpCisJCWlkeCArPSBaU1REX2luc2VydEJ0MSh6YywgYmFzZSArIGlkeCwgbWxzLCBpZW5kLCBuYkNvbXBhcmVzLCAwKTsKK30KKworLyoqIFpTVERfQnRGaW5kQmVzdE1hdGNoKCkgOiBUcmVlIHVwZGF0ZXIsIHByb3ZpZGluZyBiZXN0IG1hdGNoICovCitzdGF0aWMgc2l6ZV90IFpTVERfQnRGaW5kQmVzdE1hdGNoKFpTVERfQ0N0eCAqemMsIGNvbnN0IEJZVEUgKmNvbnN0IGlwLCBjb25zdCBCWVRFICpjb25zdCBpTGltaXQsIHNpemVfdCAqb2Zmc2V0UHRyLCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywgY29uc3QgVTMyIG1scykKK3sKKwlpZiAoaXAgPCB6Yy0+YmFzZSArIHpjLT5uZXh0VG9VcGRhdGUpCisJCXJldHVybiAwOyAvKiBza2lwcGVkIGFyZWEgKi8KKwlaU1REX3VwZGF0ZVRyZWUoemMsIGlwLCBpTGltaXQsIG1heE5iQXR0ZW1wdHMsIG1scyk7CisJcmV0dXJuIFpTVERfaW5zZXJ0QnRBbmRGaW5kQmVzdE1hdGNoKHpjLCBpcCwgaUxpbWl0LCBvZmZzZXRQdHIsIG1heE5iQXR0ZW1wdHMsIG1scywgMCk7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9CdEZpbmRCZXN0TWF0Y2hfc2VsZWN0TUxTKFpTVERfQ0N0eCAqemMsIC8qIEluZGV4IHRhYmxlIHdpbGwgYmUgdXBkYXRlZCAqLworCQkJCQkgICAgIGNvbnN0IEJZVEUgKmlwLCBjb25zdCBCWVRFICpjb25zdCBpTGltaXQsIHNpemVfdCAqb2Zmc2V0UHRyLCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywgY29uc3QgVTMyIG1hdGNoTGVuZ3RoU2VhcmNoKQoreworCXN3aXRjaCAobWF0Y2hMZW5ndGhTZWFyY2gpIHsKKwlkZWZhdWx0OiAvKiBpbmNsdWRlcyBjYXNlIDMgKi8KKwljYXNlIDQ6IHJldHVybiBaU1REX0J0RmluZEJlc3RNYXRjaCh6YywgaXAsIGlMaW1pdCwgb2Zmc2V0UHRyLCBtYXhOYkF0dGVtcHRzLCA0KTsKKwljYXNlIDU6IHJldHVybiBaU1REX0J0RmluZEJlc3RNYXRjaCh6YywgaXAsIGlMaW1pdCwgb2Zmc2V0UHRyLCBtYXhOYkF0dGVtcHRzLCA1KTsKKwljYXNlIDc6CisJY2FzZSA2OiByZXR1cm4gWlNURF9CdEZpbmRCZXN0TWF0Y2goemMsIGlwLCBpTGltaXQsIG9mZnNldFB0ciwgbWF4TmJBdHRlbXB0cywgNik7CisJfQorfQorCitzdGF0aWMgdm9pZCBaU1REX3VwZGF0ZVRyZWVfZXh0RGljdChaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29uc3QgQllURSAqY29uc3QgaWVuZCwgY29uc3QgVTMyIG5iQ29tcGFyZXMsIGNvbnN0IFUzMiBtbHMpCit7CisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IHpjLT5iYXNlOworCWNvbnN0IFUzMiB0YXJnZXQgPSAoVTMyKShpcCAtIGJhc2UpOworCVUzMiBpZHggPSB6Yy0+bmV4dFRvVXBkYXRlOworCisJd2hpbGUgKGlkeCA8IHRhcmdldCkKKwkJaWR4ICs9IFpTVERfaW5zZXJ0QnQxKHpjLCBiYXNlICsgaWR4LCBtbHMsIGllbmQsIG5iQ29tcGFyZXMsIDEpOworfQorCisvKiogVHJlZSB1cGRhdGVyLCBwcm92aWRpbmcgYmVzdCBtYXRjaCAqLworc3RhdGljIHNpemVfdCBaU1REX0J0RmluZEJlc3RNYXRjaF9leHREaWN0KFpTVERfQ0N0eCAqemMsIGNvbnN0IEJZVEUgKmNvbnN0IGlwLCBjb25zdCBCWVRFICpjb25zdCBpTGltaXQsIHNpemVfdCAqb2Zmc2V0UHRyLCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywKKwkJCQkJICAgY29uc3QgVTMyIG1scykKK3sKKwlpZiAoaXAgPCB6Yy0+YmFzZSArIHpjLT5uZXh0VG9VcGRhdGUpCisJCXJldHVybiAwOyAvKiBza2lwcGVkIGFyZWEgKi8KKwlaU1REX3VwZGF0ZVRyZWVfZXh0RGljdCh6YywgaXAsIGlMaW1pdCwgbWF4TmJBdHRlbXB0cywgbWxzKTsKKwlyZXR1cm4gWlNURF9pbnNlcnRCdEFuZEZpbmRCZXN0TWF0Y2goemMsIGlwLCBpTGltaXQsIG9mZnNldFB0ciwgbWF4TmJBdHRlbXB0cywgbWxzLCAxKTsKK30KKworc3RhdGljIHNpemVfdCBaU1REX0J0RmluZEJlc3RNYXRjaF9zZWxlY3RNTFNfZXh0RGljdChaU1REX0NDdHggKnpjLCAvKiBJbmRleCB0YWJsZSB3aWxsIGJlIHVwZGF0ZWQgKi8KKwkJCQkJCSAgICAgY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGlMaW1pdCwgc2l6ZV90ICpvZmZzZXRQdHIsIGNvbnN0IFUzMiBtYXhOYkF0dGVtcHRzLAorCQkJCQkJICAgICBjb25zdCBVMzIgbWF0Y2hMZW5ndGhTZWFyY2gpCit7CisJc3dpdGNoIChtYXRjaExlbmd0aFNlYXJjaCkgeworCWRlZmF1bHQ6IC8qIGluY2x1ZGVzIGNhc2UgMyAqLworCWNhc2UgNDogcmV0dXJuIFpTVERfQnRGaW5kQmVzdE1hdGNoX2V4dERpY3QoemMsIGlwLCBpTGltaXQsIG9mZnNldFB0ciwgbWF4TmJBdHRlbXB0cywgNCk7CisJY2FzZSA1OiByZXR1cm4gWlNURF9CdEZpbmRCZXN0TWF0Y2hfZXh0RGljdCh6YywgaXAsIGlMaW1pdCwgb2Zmc2V0UHRyLCBtYXhOYkF0dGVtcHRzLCA1KTsKKwljYXNlIDc6CisJY2FzZSA2OiByZXR1cm4gWlNURF9CdEZpbmRCZXN0TWF0Y2hfZXh0RGljdCh6YywgaXAsIGlMaW1pdCwgb2Zmc2V0UHRyLCBtYXhOYkF0dGVtcHRzLCA2KTsKKwl9Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSGFzaCBDaGFpbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5FWFRfSU5fQ0hBSU4oZCwgbWFzaykgY2hhaW5UYWJsZVsoZCkmbWFza10KKworLyogVXBkYXRlIGNoYWlucyB1cCB0byBpcCAoZXhjbHVkZWQpCisgICBBc3N1bXB0aW9uIDogYWx3YXlzIHdpdGhpbiBwcmVmaXggKGkuZS4gbm90IHdpdGhpbiBleHREaWN0KSAqLworRk9SQ0VfSU5MSU5FCitVMzIgWlNURF9pbnNlcnRBbmRGaW5kRmlyc3RJbmRleChaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICppcCwgVTMyIG1scykKK3sKKwlVMzIgKmNvbnN0IGhhc2hUYWJsZSA9IHpjLT5oYXNoVGFibGU7CisJY29uc3QgVTMyIGhhc2hMb2cgPSB6Yy0+cGFyYW1zLmNQYXJhbXMuaGFzaExvZzsKKwlVMzIgKmNvbnN0IGNoYWluVGFibGUgPSB6Yy0+Y2hhaW5UYWJsZTsKKwljb25zdCBVMzIgY2hhaW5NYXNrID0gKDEgPDwgemMtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nKSAtIDE7CisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IHpjLT5iYXNlOworCWNvbnN0IFUzMiB0YXJnZXQgPSAoVTMyKShpcCAtIGJhc2UpOworCVUzMiBpZHggPSB6Yy0+bmV4dFRvVXBkYXRlOworCisJd2hpbGUgKGlkeCA8IHRhcmdldCkgeyAvKiBjYXRjaCB1cCAqLworCQlzaXplX3QgY29uc3QgaCA9IFpTVERfaGFzaFB0cihiYXNlICsgaWR4LCBoYXNoTG9nLCBtbHMpOworCQlORVhUX0lOX0NIQUlOKGlkeCwgY2hhaW5NYXNrKSA9IGhhc2hUYWJsZVtoXTsKKwkJaGFzaFRhYmxlW2hdID0gaWR4OworCQlpZHgrKzsKKwl9CisKKwl6Yy0+bmV4dFRvVXBkYXRlID0gdGFyZ2V0OworCXJldHVybiBoYXNoVGFibGVbWlNURF9oYXNoUHRyKGlwLCBoYXNoTG9nLCBtbHMpXTsKK30KKworLyogaW5saW5pbmcgaXMgaW1wb3J0YW50IHRvIGhhcmR3aXJlIGEgaG90IGJyYW5jaCAodGVtcGxhdGUgZW11bGF0aW9uKSAqLworRk9SQ0VfSU5MSU5FCitzaXplX3QgWlNURF9IY0ZpbmRCZXN0TWF0Y2hfZ2VuZXJpYyhaU1REX0NDdHggKnpjLCAvKiBJbmRleCB0YWJsZSB3aWxsIGJlIHVwZGF0ZWQgKi8KKwkJCQkgICAgY29uc3QgQllURSAqY29uc3QgaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGlMaW1pdCwgc2l6ZV90ICpvZmZzZXRQdHIsIGNvbnN0IFUzMiBtYXhOYkF0dGVtcHRzLCBjb25zdCBVMzIgbWxzLAorCQkJCSAgICBjb25zdCBVMzIgZXh0RGljdCkKK3sKKwlVMzIgKmNvbnN0IGNoYWluVGFibGUgPSB6Yy0+Y2hhaW5UYWJsZTsKKwljb25zdCBVMzIgY2hhaW5TaXplID0gKDEgPDwgemMtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nKTsKKwljb25zdCBVMzIgY2hhaW5NYXNrID0gY2hhaW5TaXplIC0gMTsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gemMtPmJhc2U7CisJY29uc3QgQllURSAqY29uc3QgZGljdEJhc2UgPSB6Yy0+ZGljdEJhc2U7CisJY29uc3QgVTMyIGRpY3RMaW1pdCA9IHpjLT5kaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgcHJlZml4U3RhcnQgPSBiYXNlICsgZGljdExpbWl0OworCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RFbmQgPSBkaWN0QmFzZSArIGRpY3RMaW1pdDsKKwljb25zdCBVMzIgbG93TGltaXQgPSB6Yy0+bG93TGltaXQ7CisJY29uc3QgVTMyIGN1cnIgPSAoVTMyKShpcCAtIGJhc2UpOworCWNvbnN0IFUzMiBtaW5DaGFpbiA9IGN1cnIgPiBjaGFpblNpemUgPyBjdXJyIC0gY2hhaW5TaXplIDogMDsKKwlpbnQgbmJBdHRlbXB0cyA9IG1heE5iQXR0ZW1wdHM7CisJc2l6ZV90IG1sID0gRVFVQUxfUkVBRDMyIC0gMTsKKworCS8qIEhDNCBtYXRjaCBmaW5kZXIgKi8KKwlVMzIgbWF0Y2hJbmRleCA9IFpTVERfaW5zZXJ0QW5kRmluZEZpcnN0SW5kZXgoemMsIGlwLCBtbHMpOworCisJZm9yICg7IChtYXRjaEluZGV4ID4gbG93TGltaXQpICYgKG5iQXR0ZW1wdHMgPiAwKTsgbmJBdHRlbXB0cy0tKSB7CisJCWNvbnN0IEJZVEUgKm1hdGNoOworCQlzaXplX3QgY3Vyck1sID0gMDsKKwkJaWYgKCghZXh0RGljdCkgfHwgbWF0Y2hJbmRleCA+PSBkaWN0TGltaXQpIHsKKwkJCW1hdGNoID0gYmFzZSArIG1hdGNoSW5kZXg7CisJCQlpZiAobWF0Y2hbbWxdID09IGlwW21sXSkgLyogcG90ZW50aWFsbHkgYmV0dGVyICovCisJCQkJY3Vyck1sID0gWlNURF9jb3VudChpcCwgbWF0Y2gsIGlMaW1pdCk7CisJCX0gZWxzZSB7CisJCQltYXRjaCA9IGRpY3RCYXNlICsgbWF0Y2hJbmRleDsKKwkJCWlmIChaU1REX3JlYWQzMihtYXRjaCkgPT0gWlNURF9yZWFkMzIoaXApKSAvKiBhc3N1bXB0aW9uIDogbWF0Y2hJbmRleCA8PSBkaWN0TGltaXQtNCAoYnkgdGFibGUgY29uc3RydWN0aW9uKSAqLworCQkJCWN1cnJNbCA9IFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgRVFVQUxfUkVBRDMyLCBtYXRjaCArIEVRVUFMX1JFQUQzMiwgaUxpbWl0LCBkaWN0RW5kLCBwcmVmaXhTdGFydCkgKyBFUVVBTF9SRUFEMzI7CisJCX0KKworCQkvKiBzYXZlIGJlc3Qgc29sdXRpb24gKi8KKwkJaWYgKGN1cnJNbCA+IG1sKSB7CisJCQltbCA9IGN1cnJNbDsKKwkJCSpvZmZzZXRQdHIgPSBjdXJyIC0gbWF0Y2hJbmRleCArIFpTVERfUkVQX01PVkU7CisJCQlpZiAoaXAgKyBjdXJyTWwgPT0gaUxpbWl0KQorCQkJCWJyZWFrOyAvKiBiZXN0IHBvc3NpYmxlLCBhbmQgYXZvaWQgcmVhZCBvdmVyZmxvdyovCisJCX0KKworCQlpZiAobWF0Y2hJbmRleCA8PSBtaW5DaGFpbikKKwkJCWJyZWFrOworCQltYXRjaEluZGV4ID0gTkVYVF9JTl9DSEFJTihtYXRjaEluZGV4LCBjaGFpbk1hc2spOworCX0KKworCXJldHVybiBtbDsKK30KKworRk9SQ0VfSU5MSU5FIHNpemVfdCBaU1REX0hjRmluZEJlc3RNYXRjaF9zZWxlY3RNTFMoWlNURF9DQ3R4ICp6YywgY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGlMaW1pdCwgc2l6ZV90ICpvZmZzZXRQdHIsIGNvbnN0IFUzMiBtYXhOYkF0dGVtcHRzLAorCQkJCQkJICAgY29uc3QgVTMyIG1hdGNoTGVuZ3RoU2VhcmNoKQoreworCXN3aXRjaCAobWF0Y2hMZW5ndGhTZWFyY2gpIHsKKwlkZWZhdWx0OiAvKiBpbmNsdWRlcyBjYXNlIDMgKi8KKwljYXNlIDQ6IHJldHVybiBaU1REX0hjRmluZEJlc3RNYXRjaF9nZW5lcmljKHpjLCBpcCwgaUxpbWl0LCBvZmZzZXRQdHIsIG1heE5iQXR0ZW1wdHMsIDQsIDApOworCWNhc2UgNTogcmV0dXJuIFpTVERfSGNGaW5kQmVzdE1hdGNoX2dlbmVyaWMoemMsIGlwLCBpTGltaXQsIG9mZnNldFB0ciwgbWF4TmJBdHRlbXB0cywgNSwgMCk7CisJY2FzZSA3OgorCWNhc2UgNjogcmV0dXJuIFpTVERfSGNGaW5kQmVzdE1hdGNoX2dlbmVyaWMoemMsIGlwLCBpTGltaXQsIG9mZnNldFB0ciwgbWF4TmJBdHRlbXB0cywgNiwgMCk7CisJfQorfQorCitGT1JDRV9JTkxJTkUgc2l6ZV90IFpTVERfSGNGaW5kQmVzdE1hdGNoX2V4dERpY3Rfc2VsZWN0TUxTKFpTVERfQ0N0eCAqemMsIGNvbnN0IEJZVEUgKmlwLCBjb25zdCBCWVRFICpjb25zdCBpTGltaXQsIHNpemVfdCAqb2Zmc2V0UHRyLCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywKKwkJCQkJCQkgICBjb25zdCBVMzIgbWF0Y2hMZW5ndGhTZWFyY2gpCit7CisJc3dpdGNoIChtYXRjaExlbmd0aFNlYXJjaCkgeworCWRlZmF1bHQ6IC8qIGluY2x1ZGVzIGNhc2UgMyAqLworCWNhc2UgNDogcmV0dXJuIFpTVERfSGNGaW5kQmVzdE1hdGNoX2dlbmVyaWMoemMsIGlwLCBpTGltaXQsIG9mZnNldFB0ciwgbWF4TmJBdHRlbXB0cywgNCwgMSk7CisJY2FzZSA1OiByZXR1cm4gWlNURF9IY0ZpbmRCZXN0TWF0Y2hfZ2VuZXJpYyh6YywgaXAsIGlMaW1pdCwgb2Zmc2V0UHRyLCBtYXhOYkF0dGVtcHRzLCA1LCAxKTsKKwljYXNlIDc6CisJY2FzZSA2OiByZXR1cm4gWlNURF9IY0ZpbmRCZXN0TWF0Y2hfZ2VuZXJpYyh6YywgaXAsIGlMaW1pdCwgb2Zmc2V0UHRyLCBtYXhOYkF0dGVtcHRzLCA2LCAxKTsKKwl9Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIENvbW1vbiBwYXJzZXIgLSBsYXp5IHN0cmF0ZWd5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGT1JDRV9JTkxJTkUKK3ZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2xhenlfZ2VuZXJpYyhaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3QgVTMyIHNlYXJjaE1ldGhvZCwgY29uc3QgVTMyIGRlcHRoKQoreworCXNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyID0gJihjdHgtPnNlcVN0b3JlKTsKKwljb25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAqKXNyYzsKKwljb25zdCBCWVRFICppcCA9IGlzdGFydDsKKwljb25zdCBCWVRFICphbmNob3IgPSBpc3RhcnQ7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlzdGFydCArIHNyY1NpemU7CisJY29uc3QgQllURSAqY29uc3QgaWxpbWl0ID0gaWVuZCAtIDg7CisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IGN0eC0+YmFzZSArIGN0eC0+ZGljdExpbWl0OworCisJVTMyIGNvbnN0IG1heFNlYXJjaGVzID0gMSA8PCBjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExvZzsKKwlVMzIgY29uc3QgbWxzID0gY3R4LT5wYXJhbXMuY1BhcmFtcy5zZWFyY2hMZW5ndGg7CisKKwl0eXBlZGVmIHNpemVfdCAoKnNlYXJjaE1heF9mKShaU1REX0NDdHggKiB6YywgY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKmlMaW1pdCwgc2l6ZV90ICpvZmZzZXRQdHIsIFUzMiBtYXhOYkF0dGVtcHRzLCBVMzIgbWF0Y2hMZW5ndGhTZWFyY2gpOworCXNlYXJjaE1heF9mIGNvbnN0IHNlYXJjaE1heCA9IHNlYXJjaE1ldGhvZCA/IFpTVERfQnRGaW5kQmVzdE1hdGNoX3NlbGVjdE1MUyA6IFpTVERfSGNGaW5kQmVzdE1hdGNoX3NlbGVjdE1MUzsKKwlVMzIgb2Zmc2V0XzEgPSBjdHgtPnJlcFswXSwgb2Zmc2V0XzIgPSBjdHgtPnJlcFsxXSwgc2F2ZWRPZmZzZXQgPSAwOworCisJLyogaW5pdCAqLworCWlwICs9IChpcCA9PSBiYXNlKTsKKwljdHgtPm5leHRUb1VwZGF0ZTMgPSBjdHgtPm5leHRUb1VwZGF0ZTsKKwl7CisJCVUzMiBjb25zdCBtYXhSZXAgPSAoVTMyKShpcCAtIGJhc2UpOworCQlpZiAob2Zmc2V0XzIgPiBtYXhSZXApCisJCQlzYXZlZE9mZnNldCA9IG9mZnNldF8yLCBvZmZzZXRfMiA9IDA7CisJCWlmIChvZmZzZXRfMSA+IG1heFJlcCkKKwkJCXNhdmVkT2Zmc2V0ID0gb2Zmc2V0XzEsIG9mZnNldF8xID0gMDsKKwl9CisKKwkvKiBNYXRjaCBMb29wICovCisJd2hpbGUgKGlwIDwgaWxpbWl0KSB7CisJCXNpemVfdCBtYXRjaExlbmd0aCA9IDA7CisJCXNpemVfdCBvZmZzZXQgPSAwOworCQljb25zdCBCWVRFICpzdGFydCA9IGlwICsgMTsKKworCQkvKiBjaGVjayByZXBDb2RlICovCisJCWlmICgob2Zmc2V0XzEgPiAwKSAmIChaU1REX3JlYWQzMihpcCArIDEpID09IFpTVERfcmVhZDMyKGlwICsgMSAtIG9mZnNldF8xKSkpIHsKKwkJCS8qIHJlcGNvZGUgOiB3ZSB0YWtlIGl0ICovCisJCQltYXRjaExlbmd0aCA9IFpTVERfY291bnQoaXAgKyAxICsgRVFVQUxfUkVBRDMyLCBpcCArIDEgKyBFUVVBTF9SRUFEMzIgLSBvZmZzZXRfMSwgaWVuZCkgKyBFUVVBTF9SRUFEMzI7CisJCQlpZiAoZGVwdGggPT0gMCkKKwkJCQlnb3RvIF9zdG9yZVNlcXVlbmNlOworCQl9CisKKwkJLyogZmlyc3Qgc2VhcmNoIChkZXB0aCAwKSAqLworCQl7CisJCQlzaXplX3Qgb2Zmc2V0Rm91bmQgPSA5OTk5OTk5OTsKKwkJCXNpemVfdCBjb25zdCBtbDIgPSBzZWFyY2hNYXgoY3R4LCBpcCwgaWVuZCwgJm9mZnNldEZvdW5kLCBtYXhTZWFyY2hlcywgbWxzKTsKKwkJCWlmIChtbDIgPiBtYXRjaExlbmd0aCkKKwkJCQltYXRjaExlbmd0aCA9IG1sMiwgc3RhcnQgPSBpcCwgb2Zmc2V0ID0gb2Zmc2V0Rm91bmQ7CisJCX0KKworCQlpZiAobWF0Y2hMZW5ndGggPCBFUVVBTF9SRUFEMzIpIHsKKwkJCWlwICs9ICgoaXAgLSBhbmNob3IpID4+IGdfc2VhcmNoU3RyZW5ndGgpICsgMTsgLyoganVtcCBmYXN0ZXIgb3ZlciBpbmNvbXByZXNzaWJsZSBzZWN0aW9ucyAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKiBsZXQncyB0cnkgdG8gZmluZCBhIGJldHRlciBzb2x1dGlvbiAqLworCQlpZiAoZGVwdGggPj0gMSkKKwkJCXdoaWxlIChpcCA8IGlsaW1pdCkgeworCQkJCWlwKys7CisJCQkJaWYgKChvZmZzZXQpICYmICgob2Zmc2V0XzEgPiAwKSAmIChaU1REX3JlYWQzMihpcCkgPT0gWlNURF9yZWFkMzIoaXAgLSBvZmZzZXRfMSkpKSkgeworCQkJCQlzaXplX3QgY29uc3QgbWxSZXAgPSBaU1REX2NvdW50KGlwICsgRVFVQUxfUkVBRDMyLCBpcCArIEVRVUFMX1JFQUQzMiAtIG9mZnNldF8xLCBpZW5kKSArIEVRVUFMX1JFQUQzMjsKKwkJCQkJaW50IGNvbnN0IGdhaW4yID0gKGludCkobWxSZXAgKiAzKTsKKwkJCQkJaW50IGNvbnN0IGdhaW4xID0gKGludCkobWF0Y2hMZW5ndGggKiAzIC0gWlNURF9oaWdoYml0MzIoKFUzMilvZmZzZXQgKyAxKSArIDEpOworCQkJCQlpZiAoKG1sUmVwID49IEVRVUFMX1JFQUQzMikgJiYgKGdhaW4yID4gZ2FpbjEpKQorCQkJCQkJbWF0Y2hMZW5ndGggPSBtbFJlcCwgb2Zmc2V0ID0gMCwgc3RhcnQgPSBpcDsKKwkJCQl9CisJCQkJeworCQkJCQlzaXplX3Qgb2Zmc2V0MiA9IDk5OTk5OTk5OworCQkJCQlzaXplX3QgY29uc3QgbWwyID0gc2VhcmNoTWF4KGN0eCwgaXAsIGllbmQsICZvZmZzZXQyLCBtYXhTZWFyY2hlcywgbWxzKTsKKwkJCQkJaW50IGNvbnN0IGdhaW4yID0gKGludCkobWwyICogNCAtIFpTVERfaGlnaGJpdDMyKChVMzIpb2Zmc2V0MiArIDEpKTsgLyogcmF3IGFwcHJveCAqLworCQkJCQlpbnQgY29uc3QgZ2FpbjEgPSAoaW50KShtYXRjaExlbmd0aCAqIDQgLSBaU1REX2hpZ2hiaXQzMigoVTMyKW9mZnNldCArIDEpICsgNCk7CisJCQkJCWlmICgobWwyID49IEVRVUFMX1JFQUQzMikgJiYgKGdhaW4yID4gZ2FpbjEpKSB7CisJCQkJCQltYXRjaExlbmd0aCA9IG1sMiwgb2Zmc2V0ID0gb2Zmc2V0Miwgc3RhcnQgPSBpcDsKKwkJCQkJCWNvbnRpbnVlOyAvKiBzZWFyY2ggYSBiZXR0ZXIgb25lICovCisJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBsZXQncyBmaW5kIGFuIGV2ZW4gYmV0dGVyIG9uZSAqLworCQkJCWlmICgoZGVwdGggPT0gMikgJiYgKGlwIDwgaWxpbWl0KSkgeworCQkJCQlpcCsrOworCQkJCQlpZiAoKG9mZnNldCkgJiYgKChvZmZzZXRfMSA+IDApICYgKFpTVERfcmVhZDMyKGlwKSA9PSBaU1REX3JlYWQzMihpcCAtIG9mZnNldF8xKSkpKSB7CisJCQkJCQlzaXplX3QgY29uc3QgbWwyID0gWlNURF9jb3VudChpcCArIEVRVUFMX1JFQUQzMiwgaXAgKyBFUVVBTF9SRUFEMzIgLSBvZmZzZXRfMSwgaWVuZCkgKyBFUVVBTF9SRUFEMzI7CisJCQkJCQlpbnQgY29uc3QgZ2FpbjIgPSAoaW50KShtbDIgKiA0KTsKKwkJCQkJCWludCBjb25zdCBnYWluMSA9IChpbnQpKG1hdGNoTGVuZ3RoICogNCAtIFpTVERfaGlnaGJpdDMyKChVMzIpb2Zmc2V0ICsgMSkgKyAxKTsKKwkJCQkJCWlmICgobWwyID49IEVRVUFMX1JFQUQzMikgJiYgKGdhaW4yID4gZ2FpbjEpKQorCQkJCQkJCW1hdGNoTGVuZ3RoID0gbWwyLCBvZmZzZXQgPSAwLCBzdGFydCA9IGlwOworCQkJCQl9CisJCQkJCXsKKwkJCQkJCXNpemVfdCBvZmZzZXQyID0gOTk5OTk5OTk7CisJCQkJCQlzaXplX3QgY29uc3QgbWwyID0gc2VhcmNoTWF4KGN0eCwgaXAsIGllbmQsICZvZmZzZXQyLCBtYXhTZWFyY2hlcywgbWxzKTsKKwkJCQkJCWludCBjb25zdCBnYWluMiA9IChpbnQpKG1sMiAqIDQgLSBaU1REX2hpZ2hiaXQzMigoVTMyKW9mZnNldDIgKyAxKSk7IC8qIHJhdyBhcHByb3ggKi8KKwkJCQkJCWludCBjb25zdCBnYWluMSA9IChpbnQpKG1hdGNoTGVuZ3RoICogNCAtIFpTVERfaGlnaGJpdDMyKChVMzIpb2Zmc2V0ICsgMSkgKyA3KTsKKwkJCQkJCWlmICgobWwyID49IEVRVUFMX1JFQUQzMikgJiYgKGdhaW4yID4gZ2FpbjEpKSB7CisJCQkJCQkJbWF0Y2hMZW5ndGggPSBtbDIsIG9mZnNldCA9IG9mZnNldDIsIHN0YXJ0ID0gaXA7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJYnJlYWs7IC8qIG5vdGhpbmcgZm91bmQgOiBzdG9yZSBwcmV2aW91cyBzb2x1dGlvbiAqLworCQkJfQorCisJCS8qIE5PVEU6CisJCSAqIHN0YXJ0Wy1vZmZzZXQrWlNURF9SRVBfTU9WRS0xXSBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisJCSAqICgtb2Zmc2V0K1pTVERfUkVQX01PVkUtMSkgaXMgdW5zaWduZWQsIGFuZCBpcyBhZGRlZCB0byBzdGFydCwgd2hpY2gKKwkJICogb3ZlcmZsb3dzIHRoZSBwb2ludGVyLCB3aGljaCBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisJCSAqLworCQkvKiBjYXRjaCB1cCAqLworCQlpZiAob2Zmc2V0KSB7CisJCQl3aGlsZSAoKHN0YXJ0ID4gYW5jaG9yKSAmJiAoc3RhcnQgPiBiYXNlICsgb2Zmc2V0IC0gWlNURF9SRVBfTU9WRSkgJiYKKwkJCSAgICAgICAoc3RhcnRbLTFdID09IChzdGFydC1vZmZzZXQrWlNURF9SRVBfTU9WRSlbLTFdKSkgLyogb25seSBzZWFyY2ggZm9yIG9mZnNldCB3aXRoaW4gcHJlZml4ICovCisJCQl7CisJCQkJc3RhcnQtLTsKKwkJCQltYXRjaExlbmd0aCsrOworCQkJfQorCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCW9mZnNldF8xID0gKFUzMikob2Zmc2V0IC0gWlNURF9SRVBfTU9WRSk7CisJCX0KKworCS8qIHN0b3JlIHNlcXVlbmNlICovCitfc3RvcmVTZXF1ZW5jZToKKwkJeworCQkJc2l6ZV90IGNvbnN0IGxpdExlbmd0aCA9IHN0YXJ0IC0gYW5jaG9yOworCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgbGl0TGVuZ3RoLCBhbmNob3IsIChVMzIpb2Zmc2V0LCBtYXRjaExlbmd0aCAtIE1JTk1BVENIKTsKKwkJCWFuY2hvciA9IGlwID0gc3RhcnQgKyBtYXRjaExlbmd0aDsKKwkJfQorCisJCS8qIGNoZWNrIGltbWVkaWF0ZSByZXBjb2RlICovCisJCXdoaWxlICgoaXAgPD0gaWxpbWl0KSAmJiAoKG9mZnNldF8yID4gMCkgJiAoWlNURF9yZWFkMzIoaXApID09IFpTVERfcmVhZDMyKGlwIC0gb2Zmc2V0XzIpKSkpIHsKKwkJCS8qIHN0b3JlIHNlcXVlbmNlICovCisJCQltYXRjaExlbmd0aCA9IFpTVERfY291bnQoaXAgKyBFUVVBTF9SRUFEMzIsIGlwICsgRVFVQUxfUkVBRDMyIC0gb2Zmc2V0XzIsIGllbmQpICsgRVFVQUxfUkVBRDMyOworCQkJb2Zmc2V0ID0gb2Zmc2V0XzI7CisJCQlvZmZzZXRfMiA9IG9mZnNldF8xOworCQkJb2Zmc2V0XzEgPSAoVTMyKW9mZnNldDsgLyogc3dhcCByZXBjb2RlcyAqLworCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgMCwgYW5jaG9yLCAwLCBtYXRjaExlbmd0aCAtIE1JTk1BVENIKTsKKwkJCWlwICs9IG1hdGNoTGVuZ3RoOworCQkJYW5jaG9yID0gaXA7CisJCQljb250aW51ZTsgLyogZmFzdGVyIHdoZW4gcHJlc2VudCAuLi4gKD8pICovCisJCX0KKwl9CisKKwkvKiBTYXZlIHJlcHMgZm9yIG5leHQgYmxvY2sgKi8KKwljdHgtPnJlcFRvQ29uZmlybVswXSA9IG9mZnNldF8xID8gb2Zmc2V0XzEgOiBzYXZlZE9mZnNldDsKKwljdHgtPnJlcFRvQ29uZmlybVsxXSA9IG9mZnNldF8yID8gb2Zmc2V0XzIgOiBzYXZlZE9mZnNldDsKKworCS8qIExhc3QgTGl0ZXJhbHMgKi8KKwl7CisJCXNpemVfdCBjb25zdCBsYXN0TExTaXplID0gaWVuZCAtIGFuY2hvcjsKKwkJbWVtY3B5KHNlcVN0b3JlUHRyLT5saXQsIGFuY2hvciwgbGFzdExMU2l6ZSk7CisJCXNlcVN0b3JlUHRyLT5saXQgKz0gbGFzdExMU2l6ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFpTVERfY29tcHJlc3NCbG9ja19idGxhenkyKFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKSB7IFpTVERfY29tcHJlc3NCbG9ja19sYXp5X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDEsIDIpOyB9CisKK3N0YXRpYyB2b2lkIFpTVERfY29tcHJlc3NCbG9ja19sYXp5MihaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkgeyBaU1REX2NvbXByZXNzQmxvY2tfbGF6eV9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCAwLCAyKTsgfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfbGF6eShaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkgeyBaU1REX2NvbXByZXNzQmxvY2tfbGF6eV9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCAwLCAxKTsgfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfZ3JlZWR5KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKSB7IFpTVERfY29tcHJlc3NCbG9ja19sYXp5X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDAsIDApOyB9CisKK0ZPUkNFX0lOTElORQordm9pZCBaU1REX2NvbXByZXNzQmxvY2tfbGF6eV9leHREaWN0X2dlbmVyaWMoWlNURF9DQ3R4ICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IFUzMiBzZWFyY2hNZXRob2QsIGNvbnN0IFUzMiBkZXB0aCkKK3sKKwlzZXFTdG9yZV90ICpzZXFTdG9yZVB0ciA9ICYoY3R4LT5zZXFTdG9yZSk7CisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7CisJY29uc3QgQllURSAqaXAgPSBpc3RhcnQ7CisJY29uc3QgQllURSAqYW5jaG9yID0gaXN0YXJ0OworCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOworCWNvbnN0IEJZVEUgKmNvbnN0IGlsaW1pdCA9IGllbmQgLSA4OworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSBjdHgtPmJhc2U7CisJY29uc3QgVTMyIGRpY3RMaW1pdCA9IGN0eC0+ZGljdExpbWl0OworCWNvbnN0IFUzMiBsb3dlc3RJbmRleCA9IGN0eC0+bG93TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgcHJlZml4U3RhcnQgPSBiYXNlICsgZGljdExpbWl0OworCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RCYXNlID0gY3R4LT5kaWN0QmFzZTsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0RW5kID0gZGljdEJhc2UgKyBkaWN0TGltaXQ7CisJY29uc3QgQllURSAqY29uc3QgZGljdFN0YXJ0ID0gZGljdEJhc2UgKyBjdHgtPmxvd0xpbWl0OworCisJY29uc3QgVTMyIG1heFNlYXJjaGVzID0gMSA8PCBjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExvZzsKKwljb25zdCBVMzIgbWxzID0gY3R4LT5wYXJhbXMuY1BhcmFtcy5zZWFyY2hMZW5ndGg7CisKKwl0eXBlZGVmIHNpemVfdCAoKnNlYXJjaE1heF9mKShaU1REX0NDdHggKiB6YywgY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKmlMaW1pdCwgc2l6ZV90ICpvZmZzZXRQdHIsIFUzMiBtYXhOYkF0dGVtcHRzLCBVMzIgbWF0Y2hMZW5ndGhTZWFyY2gpOworCXNlYXJjaE1heF9mIHNlYXJjaE1heCA9IHNlYXJjaE1ldGhvZCA/IFpTVERfQnRGaW5kQmVzdE1hdGNoX3NlbGVjdE1MU19leHREaWN0IDogWlNURF9IY0ZpbmRCZXN0TWF0Y2hfZXh0RGljdF9zZWxlY3RNTFM7CisKKwlVMzIgb2Zmc2V0XzEgPSBjdHgtPnJlcFswXSwgb2Zmc2V0XzIgPSBjdHgtPnJlcFsxXTsKKworCS8qIGluaXQgKi8KKwljdHgtPm5leHRUb1VwZGF0ZTMgPSBjdHgtPm5leHRUb1VwZGF0ZTsKKwlpcCArPSAoaXAgPT0gcHJlZml4U3RhcnQpOworCisJLyogTWF0Y2ggTG9vcCAqLworCXdoaWxlIChpcCA8IGlsaW1pdCkgeworCQlzaXplX3QgbWF0Y2hMZW5ndGggPSAwOworCQlzaXplX3Qgb2Zmc2V0ID0gMDsKKwkJY29uc3QgQllURSAqc3RhcnQgPSBpcCArIDE7CisJCVUzMiBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsKKworCQkvKiBjaGVjayByZXBDb2RlICovCisJCXsKKwkJCWNvbnN0IFUzMiByZXBJbmRleCA9IChVMzIpKGN1cnIgKyAxIC0gb2Zmc2V0XzEpOworCQkJY29uc3QgQllURSAqY29uc3QgcmVwQmFzZSA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEJhc2UgOiBiYXNlOworCQkJY29uc3QgQllURSAqY29uc3QgcmVwTWF0Y2ggPSByZXBCYXNlICsgcmVwSW5kZXg7CisJCQlpZiAoKChVMzIpKChkaWN0TGltaXQgLSAxKSAtIHJlcEluZGV4KSA+PSAzKSAmIChyZXBJbmRleCA+IGxvd2VzdEluZGV4KSkgLyogaW50ZW50aW9uYWwgb3ZlcmZsb3cgKi8KKwkJCQlpZiAoWlNURF9yZWFkMzIoaXAgKyAxKSA9PSBaU1REX3JlYWQzMihyZXBNYXRjaCkpIHsKKwkJCQkJLyogcmVwY29kZSBkZXRlY3RlZCB3ZSBzaG91bGQgdGFrZSBpdCAqLworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBFbmQgPSByZXBJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RFbmQgOiBpZW5kOworCQkJCQltYXRjaExlbmd0aCA9CisJCQkJCSAgICBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIDEgKyBFUVVBTF9SRUFEMzIsIHJlcE1hdGNoICsgRVFVQUxfUkVBRDMyLCBpZW5kLCByZXBFbmQsIHByZWZpeFN0YXJ0KSArIEVRVUFMX1JFQUQzMjsKKwkJCQkJaWYgKGRlcHRoID09IDApCisJCQkJCQlnb3RvIF9zdG9yZVNlcXVlbmNlOworCQkJCX0KKwkJfQorCisJCS8qIGZpcnN0IHNlYXJjaCAoZGVwdGggMCkgKi8KKwkJeworCQkJc2l6ZV90IG9mZnNldEZvdW5kID0gOTk5OTk5OTk7CisJCQlzaXplX3QgY29uc3QgbWwyID0gc2VhcmNoTWF4KGN0eCwgaXAsIGllbmQsICZvZmZzZXRGb3VuZCwgbWF4U2VhcmNoZXMsIG1scyk7CisJCQlpZiAobWwyID4gbWF0Y2hMZW5ndGgpCisJCQkJbWF0Y2hMZW5ndGggPSBtbDIsIHN0YXJ0ID0gaXAsIG9mZnNldCA9IG9mZnNldEZvdW5kOworCQl9CisKKwkJaWYgKG1hdGNoTGVuZ3RoIDwgRVFVQUxfUkVBRDMyKSB7CisJCQlpcCArPSAoKGlwIC0gYW5jaG9yKSA+PiBnX3NlYXJjaFN0cmVuZ3RoKSArIDE7IC8qIGp1bXAgZmFzdGVyIG92ZXIgaW5jb21wcmVzc2libGUgc2VjdGlvbnMgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogbGV0J3MgdHJ5IHRvIGZpbmQgYSBiZXR0ZXIgc29sdXRpb24gKi8KKwkJaWYgKGRlcHRoID49IDEpCisJCQl3aGlsZSAoaXAgPCBpbGltaXQpIHsKKwkJCQlpcCsrOworCQkJCWN1cnIrKzsKKwkJCQkvKiBjaGVjayByZXBDb2RlICovCisJCQkJaWYgKG9mZnNldCkgeworCQkJCQljb25zdCBVMzIgcmVwSW5kZXggPSAoVTMyKShjdXJyIC0gb2Zmc2V0XzEpOworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBCYXNlID0gcmVwSW5kZXggPCBkaWN0TGltaXQgPyBkaWN0QmFzZSA6IGJhc2U7CisJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcE1hdGNoID0gcmVwQmFzZSArIHJlcEluZGV4OworCQkJCQlpZiAoKChVMzIpKChkaWN0TGltaXQgLSAxKSAtIHJlcEluZGV4KSA+PSAzKSAmIChyZXBJbmRleCA+IGxvd2VzdEluZGV4KSkgLyogaW50ZW50aW9uYWwgb3ZlcmZsb3cgKi8KKwkJCQkJCWlmIChaU1REX3JlYWQzMihpcCkgPT0gWlNURF9yZWFkMzIocmVwTWF0Y2gpKSB7CisJCQkJCQkJLyogcmVwY29kZSBkZXRlY3RlZCAqLworCQkJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcEVuZCA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJCQkJc2l6ZV90IGNvbnN0IHJlcExlbmd0aCA9CisJCQkJCQkJICAgIFpTVERfY291bnRfMnNlZ21lbnRzKGlwICsgRVFVQUxfUkVBRDMyLCByZXBNYXRjaCArIEVRVUFMX1JFQUQzMiwgaWVuZCwgcmVwRW5kLCBwcmVmaXhTdGFydCkgKworCQkJCQkJCSAgICBFUVVBTF9SRUFEMzI7CisJCQkJCQkJaW50IGNvbnN0IGdhaW4yID0gKGludCkocmVwTGVuZ3RoICogMyk7CisJCQkJCQkJaW50IGNvbnN0IGdhaW4xID0gKGludCkobWF0Y2hMZW5ndGggKiAzIC0gWlNURF9oaWdoYml0MzIoKFUzMilvZmZzZXQgKyAxKSArIDEpOworCQkJCQkJCWlmICgocmVwTGVuZ3RoID49IEVRVUFMX1JFQUQzMikgJiYgKGdhaW4yID4gZ2FpbjEpKQorCQkJCQkJCQltYXRjaExlbmd0aCA9IHJlcExlbmd0aCwgb2Zmc2V0ID0gMCwgc3RhcnQgPSBpcDsKKwkJCQkJCX0KKwkJCQl9CisKKwkJCQkvKiBzZWFyY2ggbWF0Y2gsIGRlcHRoIDEgKi8KKwkJCQl7CisJCQkJCXNpemVfdCBvZmZzZXQyID0gOTk5OTk5OTk7CisJCQkJCXNpemVfdCBjb25zdCBtbDIgPSBzZWFyY2hNYXgoY3R4LCBpcCwgaWVuZCwgJm9mZnNldDIsIG1heFNlYXJjaGVzLCBtbHMpOworCQkJCQlpbnQgY29uc3QgZ2FpbjIgPSAoaW50KShtbDIgKiA0IC0gWlNURF9oaWdoYml0MzIoKFUzMilvZmZzZXQyICsgMSkpOyAvKiByYXcgYXBwcm94ICovCisJCQkJCWludCBjb25zdCBnYWluMSA9IChpbnQpKG1hdGNoTGVuZ3RoICogNCAtIFpTVERfaGlnaGJpdDMyKChVMzIpb2Zmc2V0ICsgMSkgKyA0KTsKKwkJCQkJaWYgKChtbDIgPj0gRVFVQUxfUkVBRDMyKSAmJiAoZ2FpbjIgPiBnYWluMSkpIHsKKwkJCQkJCW1hdGNoTGVuZ3RoID0gbWwyLCBvZmZzZXQgPSBvZmZzZXQyLCBzdGFydCA9IGlwOworCQkJCQkJY29udGludWU7IC8qIHNlYXJjaCBhIGJldHRlciBvbmUgKi8KKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIGxldCdzIGZpbmQgYW4gZXZlbiBiZXR0ZXIgb25lICovCisJCQkJaWYgKChkZXB0aCA9PSAyKSAmJiAoaXAgPCBpbGltaXQpKSB7CisJCQkJCWlwKys7CisJCQkJCWN1cnIrKzsKKwkJCQkJLyogY2hlY2sgcmVwQ29kZSAqLworCQkJCQlpZiAob2Zmc2V0KSB7CisJCQkJCQljb25zdCBVMzIgcmVwSW5kZXggPSAoVTMyKShjdXJyIC0gb2Zmc2V0XzEpOworCQkJCQkJY29uc3QgQllURSAqY29uc3QgcmVwQmFzZSA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEJhc2UgOiBiYXNlOworCQkJCQkJY29uc3QgQllURSAqY29uc3QgcmVwTWF0Y2ggPSByZXBCYXNlICsgcmVwSW5kZXg7CisJCQkJCQlpZiAoKChVMzIpKChkaWN0TGltaXQgLSAxKSAtIHJlcEluZGV4KSA+PSAzKSAmIChyZXBJbmRleCA+IGxvd2VzdEluZGV4KSkgLyogaW50ZW50aW9uYWwgb3ZlcmZsb3cgKi8KKwkJCQkJCQlpZiAoWlNURF9yZWFkMzIoaXApID09IFpTVERfcmVhZDMyKHJlcE1hdGNoKSkgeworCQkJCQkJCQkvKiByZXBjb2RlIGRldGVjdGVkICovCisJCQkJCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcEVuZCA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEVuZCA6IGllbmQ7CisJCQkJCQkJCXNpemVfdCByZXBMZW5ndGggPSBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIEVRVUFMX1JFQUQzMiwgcmVwTWF0Y2ggKyBFUVVBTF9SRUFEMzIsIGllbmQsCisJCQkJCQkJCQkJCQkJcmVwRW5kLCBwcmVmaXhTdGFydCkgKworCQkJCQkJCQkJCSAgIEVRVUFMX1JFQUQzMjsKKwkJCQkJCQkJaW50IGdhaW4yID0gKGludCkocmVwTGVuZ3RoICogNCk7CisJCQkJCQkJCWludCBnYWluMSA9IChpbnQpKG1hdGNoTGVuZ3RoICogNCAtIFpTVERfaGlnaGJpdDMyKChVMzIpb2Zmc2V0ICsgMSkgKyAxKTsKKwkJCQkJCQkJaWYgKChyZXBMZW5ndGggPj0gRVFVQUxfUkVBRDMyKSAmJiAoZ2FpbjIgPiBnYWluMSkpCisJCQkJCQkJCQltYXRjaExlbmd0aCA9IHJlcExlbmd0aCwgb2Zmc2V0ID0gMCwgc3RhcnQgPSBpcDsKKwkJCQkJCQl9CisJCQkJCX0KKworCQkJCQkvKiBzZWFyY2ggbWF0Y2gsIGRlcHRoIDIgKi8KKwkJCQkJeworCQkJCQkJc2l6ZV90IG9mZnNldDIgPSA5OTk5OTk5OTsKKwkJCQkJCXNpemVfdCBjb25zdCBtbDIgPSBzZWFyY2hNYXgoY3R4LCBpcCwgaWVuZCwgJm9mZnNldDIsIG1heFNlYXJjaGVzLCBtbHMpOworCQkJCQkJaW50IGNvbnN0IGdhaW4yID0gKGludCkobWwyICogNCAtIFpTVERfaGlnaGJpdDMyKChVMzIpb2Zmc2V0MiArIDEpKTsgLyogcmF3IGFwcHJveCAqLworCQkJCQkJaW50IGNvbnN0IGdhaW4xID0gKGludCkobWF0Y2hMZW5ndGggKiA0IC0gWlNURF9oaWdoYml0MzIoKFUzMilvZmZzZXQgKyAxKSArIDcpOworCQkJCQkJaWYgKChtbDIgPj0gRVFVQUxfUkVBRDMyKSAmJiAoZ2FpbjIgPiBnYWluMSkpIHsKKwkJCQkJCQltYXRjaExlbmd0aCA9IG1sMiwgb2Zmc2V0ID0gb2Zmc2V0Miwgc3RhcnQgPSBpcDsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsgLyogbm90aGluZyBmb3VuZCA6IHN0b3JlIHByZXZpb3VzIHNvbHV0aW9uICovCisJCQl9CisKKwkJLyogY2F0Y2ggdXAgKi8KKwkJaWYgKG9mZnNldCkgeworCQkJVTMyIGNvbnN0IG1hdGNoSW5kZXggPSAoVTMyKSgoc3RhcnQgLSBiYXNlKSAtIChvZmZzZXQgLSBaU1REX1JFUF9NT1ZFKSk7CisJCQljb25zdCBCWVRFICptYXRjaCA9IChtYXRjaEluZGV4IDwgZGljdExpbWl0KSA/IGRpY3RCYXNlICsgbWF0Y2hJbmRleCA6IGJhc2UgKyBtYXRjaEluZGV4OworCQkJY29uc3QgQllURSAqY29uc3QgbVN0YXJ0ID0gKG1hdGNoSW5kZXggPCBkaWN0TGltaXQpID8gZGljdFN0YXJ0IDogcHJlZml4U3RhcnQ7CisJCQl3aGlsZSAoKHN0YXJ0ID4gYW5jaG9yKSAmJiAobWF0Y2ggPiBtU3RhcnQpICYmIChzdGFydFstMV0gPT0gbWF0Y2hbLTFdKSkgeworCQkJCXN0YXJ0LS07CisJCQkJbWF0Y2gtLTsKKwkJCQltYXRjaExlbmd0aCsrOworCQkJfSAvKiBjYXRjaCB1cCAqLworCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCW9mZnNldF8xID0gKFUzMikob2Zmc2V0IC0gWlNURF9SRVBfTU9WRSk7CisJCX0KKworCS8qIHN0b3JlIHNlcXVlbmNlICovCisJX3N0b3JlU2VxdWVuY2UgOiB7CisJCXNpemVfdCBjb25zdCBsaXRMZW5ndGggPSBzdGFydCAtIGFuY2hvcjsKKwkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgbGl0TGVuZ3RoLCBhbmNob3IsIChVMzIpb2Zmc2V0LCBtYXRjaExlbmd0aCAtIE1JTk1BVENIKTsKKwkJYW5jaG9yID0gaXAgPSBzdGFydCArIG1hdGNoTGVuZ3RoOworCX0KKworCQkvKiBjaGVjayBpbW1lZGlhdGUgcmVwY29kZSAqLworCQl3aGlsZSAoaXAgPD0gaWxpbWl0KSB7CisJCQljb25zdCBVMzIgcmVwSW5kZXggPSAoVTMyKSgoaXAgLSBiYXNlKSAtIG9mZnNldF8yKTsKKwkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcEJhc2UgPSByZXBJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RCYXNlIDogYmFzZTsKKwkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcE1hdGNoID0gcmVwQmFzZSArIHJlcEluZGV4OworCQkJaWYgKCgoVTMyKSgoZGljdExpbWl0IC0gMSkgLSByZXBJbmRleCkgPj0gMykgJiAocmVwSW5kZXggPiBsb3dlc3RJbmRleCkpIC8qIGludGVudGlvbmFsIG92ZXJmbG93ICovCisJCQkJaWYgKFpTVERfcmVhZDMyKGlwKSA9PSBaU1REX3JlYWQzMihyZXBNYXRjaCkpIHsKKwkJCQkJLyogcmVwY29kZSBkZXRlY3RlZCB3ZSBzaG91bGQgdGFrZSBpdCAqLworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBFbmQgPSByZXBJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RFbmQgOiBpZW5kOworCQkJCQltYXRjaExlbmd0aCA9CisJCQkJCSAgICBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIEVRVUFMX1JFQUQzMiwgcmVwTWF0Y2ggKyBFUVVBTF9SRUFEMzIsIGllbmQsIHJlcEVuZCwgcHJlZml4U3RhcnQpICsgRVFVQUxfUkVBRDMyOworCQkJCQlvZmZzZXQgPSBvZmZzZXRfMjsKKwkJCQkJb2Zmc2V0XzIgPSBvZmZzZXRfMTsKKwkJCQkJb2Zmc2V0XzEgPSAoVTMyKW9mZnNldDsgLyogc3dhcCBvZmZzZXQgaGlzdG9yeSAqLworCQkJCQlaU1REX3N0b3JlU2VxKHNlcVN0b3JlUHRyLCAwLCBhbmNob3IsIDAsIG1hdGNoTGVuZ3RoIC0gTUlOTUFUQ0gpOworCQkJCQlpcCArPSBtYXRjaExlbmd0aDsKKwkJCQkJYW5jaG9yID0gaXA7CisJCQkJCWNvbnRpbnVlOyAvKiBmYXN0ZXIgd2hlbiBwcmVzZW50IC4uLiAoPykgKi8KKwkJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIFNhdmUgcmVwcyBmb3IgbmV4dCBibG9jayAqLworCWN0eC0+cmVwVG9Db25maXJtWzBdID0gb2Zmc2V0XzE7CisJY3R4LT5yZXBUb0NvbmZpcm1bMV0gPSBvZmZzZXRfMjsKKworCS8qIExhc3QgTGl0ZXJhbHMgKi8KKwl7CisJCXNpemVfdCBjb25zdCBsYXN0TExTaXplID0gaWVuZCAtIGFuY2hvcjsKKwkJbWVtY3B5KHNlcVN0b3JlUHRyLT5saXQsIGFuY2hvciwgbGFzdExMU2l6ZSk7CisJCXNlcVN0b3JlUHRyLT5saXQgKz0gbGFzdExMU2l6ZTsKKwl9Cit9CisKK3ZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2dyZWVkeV9leHREaWN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKSB7IFpTVERfY29tcHJlc3NCbG9ja19sYXp5X2V4dERpY3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgMCwgMCk7IH0KKworc3RhdGljIHZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2xhenlfZXh0RGljdChaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlaU1REX2NvbXByZXNzQmxvY2tfbGF6eV9leHREaWN0X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDAsIDEpOworfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfbGF6eTJfZXh0RGljdChaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlaU1REX2NvbXByZXNzQmxvY2tfbGF6eV9leHREaWN0X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDAsIDIpOworfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfYnRsYXp5Ml9leHREaWN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCVpTVERfY29tcHJlc3NCbG9ja19sYXp5X2V4dERpY3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgMSwgMik7Cit9CisKKy8qIFRoZSBvcHRpbWFsIHBhcnNlciAqLworI2luY2x1ZGUgInpzdGRfb3B0LmgiCisKK3N0YXRpYyB2b2lkIFpTVERfY29tcHJlc3NCbG9ja19idG9wdChaU1REX0NDdHggKmN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKyNpZmRlZiBaU1REX09QVF9IXzkxODQyMzk4NzQzCisJWlNURF9jb21wcmVzc0Jsb2NrX29wdF9nZW5lcmljKGN0eCwgc3JjLCBzcmNTaXplLCAwKTsKKyNlbHNlCisJKHZvaWQpY3R4OworCSh2b2lkKXNyYzsKKwkodm9pZClzcmNTaXplOworCXJldHVybjsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBaU1REX2NvbXByZXNzQmxvY2tfYnRvcHQyKFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworI2lmZGVmIFpTVERfT1BUX0hfOTE4NDIzOTg3NDMKKwlaU1REX2NvbXByZXNzQmxvY2tfb3B0X2dlbmVyaWMoY3R4LCBzcmMsIHNyY1NpemUsIDEpOworI2Vsc2UKKwkodm9pZCljdHg7CisJKHZvaWQpc3JjOworCSh2b2lkKXNyY1NpemU7CisJcmV0dXJuOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIFpTVERfY29tcHJlc3NCbG9ja19idG9wdF9leHREaWN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworI2lmZGVmIFpTVERfT1BUX0hfOTE4NDIzOTg3NDMKKwlaU1REX2NvbXByZXNzQmxvY2tfb3B0X2V4dERpY3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgMCk7CisjZWxzZQorCSh2b2lkKWN0eDsKKwkodm9pZClzcmM7CisJKHZvaWQpc3JjU2l6ZTsKKwlyZXR1cm47CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgWlNURF9jb21wcmVzc0Jsb2NrX2J0b3B0Ml9leHREaWN0KFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworI2lmZGVmIFpTVERfT1BUX0hfOTE4NDIzOTg3NDMKKwlaU1REX2NvbXByZXNzQmxvY2tfb3B0X2V4dERpY3RfZ2VuZXJpYyhjdHgsIHNyYywgc3JjU2l6ZSwgMSk7CisjZWxzZQorCSh2b2lkKWN0eDsKKwkodm9pZClzcmM7CisJKHZvaWQpc3JjU2l6ZTsKKwlyZXR1cm47CisjZW5kaWYKK30KKwordHlwZWRlZiB2b2lkICgqWlNURF9ibG9ja0NvbXByZXNzb3IpKFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKTsKKworc3RhdGljIFpTVERfYmxvY2tDb21wcmVzc29yIFpTVERfc2VsZWN0QmxvY2tDb21wcmVzc29yKFpTVERfc3RyYXRlZ3kgc3RyYXQsIGludCBleHREaWN0KQoreworCXN0YXRpYyBjb25zdCBaU1REX2Jsb2NrQ29tcHJlc3NvciBibG9ja0NvbXByZXNzb3JbMl1bOF0gPSB7CisJICAgIHtaU1REX2NvbXByZXNzQmxvY2tfZmFzdCwgWlNURF9jb21wcmVzc0Jsb2NrX2RvdWJsZUZhc3QsIFpTVERfY29tcHJlc3NCbG9ja19ncmVlZHksIFpTVERfY29tcHJlc3NCbG9ja19sYXp5LCBaU1REX2NvbXByZXNzQmxvY2tfbGF6eTIsCisJICAgICBaU1REX2NvbXByZXNzQmxvY2tfYnRsYXp5MiwgWlNURF9jb21wcmVzc0Jsb2NrX2J0b3B0LCBaU1REX2NvbXByZXNzQmxvY2tfYnRvcHQyfSwKKwkgICAge1pTVERfY29tcHJlc3NCbG9ja19mYXN0X2V4dERpY3QsIFpTVERfY29tcHJlc3NCbG9ja19kb3VibGVGYXN0X2V4dERpY3QsIFpTVERfY29tcHJlc3NCbG9ja19ncmVlZHlfZXh0RGljdCwgWlNURF9jb21wcmVzc0Jsb2NrX2xhenlfZXh0RGljdCwKKwkgICAgIFpTVERfY29tcHJlc3NCbG9ja19sYXp5Ml9leHREaWN0LCBaU1REX2NvbXByZXNzQmxvY2tfYnRsYXp5Ml9leHREaWN0LCBaU1REX2NvbXByZXNzQmxvY2tfYnRvcHRfZXh0RGljdCwgWlNURF9jb21wcmVzc0Jsb2NrX2J0b3B0Ml9leHREaWN0fX07CisKKwlyZXR1cm4gYmxvY2tDb21wcmVzc29yW2V4dERpY3RdWyhVMzIpc3RyYXRdOworfQorCitzdGF0aWMgc2l6ZV90IFpTVERfY29tcHJlc3NCbG9ja19pbnRlcm5hbChaU1REX0NDdHggKnpjLCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlaU1REX2Jsb2NrQ29tcHJlc3NvciBjb25zdCBibG9ja0NvbXByZXNzb3IgPSBaU1REX3NlbGVjdEJsb2NrQ29tcHJlc3Nvcih6Yy0+cGFyYW1zLmNQYXJhbXMuc3RyYXRlZ3ksIHpjLT5sb3dMaW1pdCA8IHpjLT5kaWN0TGltaXQpOworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSB6Yy0+YmFzZTsKKwljb25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAqKXNyYzsKKwljb25zdCBVMzIgY3VyciA9IChVMzIpKGlzdGFydCAtIGJhc2UpOworCWlmIChzcmNTaXplIDwgTUlOX0NCTE9DS19TSVpFICsgWlNURF9ibG9ja0hlYWRlclNpemUgKyAxKQorCQlyZXR1cm4gMDsgLyogZG9uJ3QgZXZlbiBhdHRlbXB0IGNvbXByZXNzaW9uIGJlbG93IGEgY2VydGFpbiBzcmNTaXplICovCisJWlNURF9yZXNldFNlcVN0b3JlKCYoemMtPnNlcVN0b3JlKSk7CisJaWYgKGN1cnIgPiB6Yy0+bmV4dFRvVXBkYXRlICsgMzg0KQorCQl6Yy0+bmV4dFRvVXBkYXRlID0gY3VyciAtIE1JTigxOTIsIChVMzIpKGN1cnIgLSB6Yy0+bmV4dFRvVXBkYXRlIC0gMzg0KSk7IC8qIHVwZGF0ZSB0cmVlIG5vdCB1cGRhdGVkIGFmdGVyIGZpbmRpbmcgdmVyeSBsb25nIHJlcCBtYXRjaGVzICovCisJYmxvY2tDb21wcmVzc29yKHpjLCBzcmMsIHNyY1NpemUpOworCXJldHVybiBaU1REX2NvbXByZXNzU2VxdWVuY2VzKHpjLCBkc3QsIGRzdENhcGFjaXR5LCBzcmNTaXplKTsKK30KKworLyohIFpTVERfY29tcHJlc3NfZ2VuZXJpYygpIDoKKyogICBDb21wcmVzcyBhIGNodW5rIG9mIGRhdGEgaW50byBvbmUgb3IgbXVsdGlwbGUgYmxvY2tzLgorKiAgIEFsbCBibG9ja3Mgd2lsbCBiZSB0ZXJtaW5hdGVkLCBhbGwgaW5wdXQgd2lsbCBiZSBjb25zdW1lZC4KKyogICBGdW5jdGlvbiB3aWxsIGlzc3VlIGFuIGVycm9yIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggYGRzdENhcGFjaXR5YCB0byBob2xkIHRoZSBjb21wcmVzc2VkIGNvbnRlbnQuCisqICAgRnJhbWUgaXMgc3VwcG9zZWQgYWxyZWFkeSBzdGFydGVkIChoZWFkZXIgYWxyZWFkeSBwcm9kdWNlZCkKKyogICBAcmV0dXJuIDogY29tcHJlc3NlZCBzaXplLCBvciBhbiBlcnJvciBjb2RlCisqLworc3RhdGljIHNpemVfdCBaU1REX2NvbXByZXNzX2dlbmVyaWMoWlNURF9DQ3R4ICpjY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgVTMyIGxhc3RGcmFtZUNodW5rKQoreworCXNpemVfdCBibG9ja1NpemUgPSBjY3R4LT5ibG9ja1NpemU7CisJc2l6ZV90IHJlbWFpbmluZyA9IHNyY1NpemU7CisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKXNyYzsKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWRzdDsKKwlCWVRFICpvcCA9IG9zdGFydDsKKwlVMzIgY29uc3QgbWF4RGlzdCA9IDEgPDwgY2N0eC0+cGFyYW1zLmNQYXJhbXMud2luZG93TG9nOworCisJaWYgKGNjdHgtPnBhcmFtcy5mUGFyYW1zLmNoZWNrc3VtRmxhZyAmJiBzcmNTaXplKQorCQl4eGg2NF91cGRhdGUoJmNjdHgtPnh4aFN0YXRlLCBzcmMsIHNyY1NpemUpOworCisJd2hpbGUgKHJlbWFpbmluZykgeworCQlVMzIgY29uc3QgbGFzdEJsb2NrID0gbGFzdEZyYW1lQ2h1bmsgJiAoYmxvY2tTaXplID49IHJlbWFpbmluZyk7CisJCXNpemVfdCBjU2l6ZTsKKworCQlpZiAoZHN0Q2FwYWNpdHkgPCBaU1REX2Jsb2NrSGVhZGVyU2l6ZSArIE1JTl9DQkxPQ0tfU0laRSkKKwkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogbm90IGVub3VnaCBzcGFjZSB0byBzdG9yZSBjb21wcmVzc2VkIGJsb2NrICovCisJCWlmIChyZW1haW5pbmcgPCBibG9ja1NpemUpCisJCQlibG9ja1NpemUgPSByZW1haW5pbmc7CisKKwkJLyogcHJlZW1wdGl2ZSBvdmVyZmxvdyBjb3JyZWN0aW9uICovCisJCWlmIChjY3R4LT5sb3dMaW1pdCA+ICgzVSA8PCAyOSkpIHsKKwkJCVUzMiBjb25zdCBjeWNsZU1hc2sgPSAoMSA8PCBaU1REX2N5Y2xlTG9nKGNjdHgtPnBhcmFtcy5jUGFyYW1zLmhhc2hMb2csIGNjdHgtPnBhcmFtcy5jUGFyYW1zLnN0cmF0ZWd5KSkgLSAxOworCQkJVTMyIGNvbnN0IGN1cnIgPSAoVTMyKShpcCAtIGNjdHgtPmJhc2UpOworCQkJVTMyIGNvbnN0IG5ld0N1cnIgPSAoY3VyciAmIGN5Y2xlTWFzaykgKyAoMSA8PCBjY3R4LT5wYXJhbXMuY1BhcmFtcy53aW5kb3dMb2cpOworCQkJVTMyIGNvbnN0IGNvcnJlY3Rpb24gPSBjdXJyIC0gbmV3Q3VycjsKKwkJCVpTVERfU1RBVElDX0FTU0VSVChaU1REX1dJTkRPV0xPR19NQVhfNjQgPD0gMzApOworCQkJWlNURF9yZWR1Y2VJbmRleChjY3R4LCBjb3JyZWN0aW9uKTsKKwkJCWNjdHgtPmJhc2UgKz0gY29ycmVjdGlvbjsKKwkJCWNjdHgtPmRpY3RCYXNlICs9IGNvcnJlY3Rpb247CisJCQljY3R4LT5sb3dMaW1pdCAtPSBjb3JyZWN0aW9uOworCQkJY2N0eC0+ZGljdExpbWl0IC09IGNvcnJlY3Rpb247CisJCQlpZiAoY2N0eC0+bmV4dFRvVXBkYXRlIDwgY29ycmVjdGlvbikKKwkJCQljY3R4LT5uZXh0VG9VcGRhdGUgPSAwOworCQkJZWxzZQorCQkJCWNjdHgtPm5leHRUb1VwZGF0ZSAtPSBjb3JyZWN0aW9uOworCQl9CisKKwkJaWYgKChVMzIpKGlwICsgYmxvY2tTaXplIC0gY2N0eC0+YmFzZSkgPiBjY3R4LT5sb2FkZWREaWN0RW5kICsgbWF4RGlzdCkgeworCQkJLyogZW5mb3JjZSBtYXhEaXN0ICovCisJCQlVMzIgY29uc3QgbmV3TG93TGltaXQgPSAoVTMyKShpcCArIGJsb2NrU2l6ZSAtIGNjdHgtPmJhc2UpIC0gbWF4RGlzdDsKKwkJCWlmIChjY3R4LT5sb3dMaW1pdCA8IG5ld0xvd0xpbWl0KQorCQkJCWNjdHgtPmxvd0xpbWl0ID0gbmV3TG93TGltaXQ7CisJCQlpZiAoY2N0eC0+ZGljdExpbWl0IDwgY2N0eC0+bG93TGltaXQpCisJCQkJY2N0eC0+ZGljdExpbWl0ID0gY2N0eC0+bG93TGltaXQ7CisJCX0KKworCQljU2l6ZSA9IFpTVERfY29tcHJlc3NCbG9ja19pbnRlcm5hbChjY3R4LCBvcCArIFpTVERfYmxvY2tIZWFkZXJTaXplLCBkc3RDYXBhY2l0eSAtIFpTVERfYmxvY2tIZWFkZXJTaXplLCBpcCwgYmxvY2tTaXplKTsKKwkJaWYgKFpTVERfaXNFcnJvcihjU2l6ZSkpCisJCQlyZXR1cm4gY1NpemU7CisKKwkJaWYgKGNTaXplID09IDApIHsgLyogYmxvY2sgaXMgbm90IGNvbXByZXNzaWJsZSAqLworCQkJVTMyIGNvbnN0IGNCbG9ja0hlYWRlcjI0ID0gbGFzdEJsb2NrICsgKCgoVTMyKWJ0X3JhdykgPDwgMSkgKyAoVTMyKShibG9ja1NpemUgPDwgMyk7CisJCQlpZiAoYmxvY2tTaXplICsgWlNURF9ibG9ja0hlYWRlclNpemUgPiBkc3RDYXBhY2l0eSkKKwkJCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7CisJCQlaU1REX3dyaXRlTEUzMihvcCwgY0Jsb2NrSGVhZGVyMjQpOyAvKiBubyBwYiwgNHRoIGJ5dGUgd2lsbCBiZSBvdmVyd3JpdHRlbiAqLworCQkJbWVtY3B5KG9wICsgWlNURF9ibG9ja0hlYWRlclNpemUsIGlwLCBibG9ja1NpemUpOworCQkJY1NpemUgPSBaU1REX2Jsb2NrSGVhZGVyU2l6ZSArIGJsb2NrU2l6ZTsKKwkJfSBlbHNlIHsKKwkJCVUzMiBjb25zdCBjQmxvY2tIZWFkZXIyNCA9IGxhc3RCbG9jayArICgoKFUzMilidF9jb21wcmVzc2VkKSA8PCAxKSArIChVMzIpKGNTaXplIDw8IDMpOworCQkJWlNURF93cml0ZUxFMjQob3AsIGNCbG9ja0hlYWRlcjI0KTsKKwkJCWNTaXplICs9IFpTVERfYmxvY2tIZWFkZXJTaXplOworCQl9CisKKwkJcmVtYWluaW5nIC09IGJsb2NrU2l6ZTsKKwkJZHN0Q2FwYWNpdHkgLT0gY1NpemU7CisJCWlwICs9IGJsb2NrU2l6ZTsKKwkJb3AgKz0gY1NpemU7CisJfQorCisJaWYgKGxhc3RGcmFtZUNodW5rICYmIChvcCA+IG9zdGFydCkpCisJCWNjdHgtPnN0YWdlID0gWlNURGNzX2VuZGluZzsKKwlyZXR1cm4gb3AgLSBvc3RhcnQ7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF93cml0ZUZyYW1lSGVhZGVyKHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBaU1REX3BhcmFtZXRlcnMgcGFyYW1zLCBVNjQgcGxlZGdlZFNyY1NpemUsIFUzMiBkaWN0SUQpCit7CisJQllURSAqY29uc3Qgb3AgPSAoQllURSAqKWRzdDsKKwlVMzIgY29uc3QgZGljdElEU2l6ZUNvZGUgPSAoZGljdElEID4gMCkgKyAoZGljdElEID49IDI1NikgKyAoZGljdElEID49IDY1NTM2KTsgLyogMC0zICovCisJVTMyIGNvbnN0IGNoZWNrc3VtRmxhZyA9IHBhcmFtcy5mUGFyYW1zLmNoZWNrc3VtRmxhZyA+IDA7CisJVTMyIGNvbnN0IHdpbmRvd1NpemUgPSAxVSA8PCBwYXJhbXMuY1BhcmFtcy53aW5kb3dMb2c7CisJVTMyIGNvbnN0IHNpbmdsZVNlZ21lbnQgPSBwYXJhbXMuZlBhcmFtcy5jb250ZW50U2l6ZUZsYWcgJiYgKHdpbmRvd1NpemUgPj0gcGxlZGdlZFNyY1NpemUpOworCUJZVEUgY29uc3Qgd2luZG93TG9nQnl0ZSA9IChCWVRFKSgocGFyYW1zLmNQYXJhbXMud2luZG93TG9nIC0gWlNURF9XSU5ET1dMT0dfQUJTT0xVVEVNSU4pIDw8IDMpOworCVUzMiBjb25zdCBmY3NDb2RlID0KKwkgICAgcGFyYW1zLmZQYXJhbXMuY29udGVudFNpemVGbGFnID8gKHBsZWRnZWRTcmNTaXplID49IDI1NikgKyAocGxlZGdlZFNyY1NpemUgPj0gNjU1MzYgKyAyNTYpICsgKHBsZWRnZWRTcmNTaXplID49IDB4RkZGRkZGRkZVKSA6IDA7IC8qIDAtMyAqLworCUJZVEUgY29uc3QgZnJhbWVIZWFkZXJEZWNyaXB0aW9uQnl0ZSA9IChCWVRFKShkaWN0SURTaXplQ29kZSArIChjaGVja3N1bUZsYWcgPDwgMikgKyAoc2luZ2xlU2VnbWVudCA8PCA1KSArIChmY3NDb2RlIDw8IDYpKTsKKwlzaXplX3QgcG9zOworCisJaWYgKGRzdENhcGFjaXR5IDwgWlNURF9mcmFtZUhlYWRlclNpemVfbWF4KQorCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7CisKKwlaU1REX3dyaXRlTEUzMihkc3QsIFpTVERfTUFHSUNOVU1CRVIpOworCW9wWzRdID0gZnJhbWVIZWFkZXJEZWNyaXB0aW9uQnl0ZTsKKwlwb3MgPSA1OworCWlmICghc2luZ2xlU2VnbWVudCkKKwkJb3BbcG9zKytdID0gd2luZG93TG9nQnl0ZTsKKwlzd2l0Y2ggKGRpY3RJRFNpemVDb2RlKSB7CisJZGVmYXVsdDogLyogaW1wb3NzaWJsZSAqLworCWNhc2UgMDogYnJlYWs7CisJY2FzZSAxOgorCQlvcFtwb3NdID0gKEJZVEUpKGRpY3RJRCk7CisJCXBvcysrOworCQlicmVhazsKKwljYXNlIDI6CisJCVpTVERfd3JpdGVMRTE2KG9wICsgcG9zLCAoVTE2KWRpY3RJRCk7CisJCXBvcyArPSAyOworCQlicmVhazsKKwljYXNlIDM6CisJCVpTVERfd3JpdGVMRTMyKG9wICsgcG9zLCBkaWN0SUQpOworCQlwb3MgKz0gNDsKKwkJYnJlYWs7CisJfQorCXN3aXRjaCAoZmNzQ29kZSkgeworCWRlZmF1bHQ6IC8qIGltcG9zc2libGUgKi8KKwljYXNlIDA6CisJCWlmIChzaW5nbGVTZWdtZW50KQorCQkJb3BbcG9zKytdID0gKEJZVEUpKHBsZWRnZWRTcmNTaXplKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlaU1REX3dyaXRlTEUxNihvcCArIHBvcywgKFUxNikocGxlZGdlZFNyY1NpemUgLSAyNTYpKTsKKwkJcG9zICs9IDI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJWlNURF93cml0ZUxFMzIob3AgKyBwb3MsIChVMzIpKHBsZWRnZWRTcmNTaXplKSk7CisJCXBvcyArPSA0OworCQlicmVhazsKKwljYXNlIDM6CisJCVpTVERfd3JpdGVMRTY0KG9wICsgcG9zLCAoVTY0KShwbGVkZ2VkU3JjU2l6ZSkpOworCQlwb3MgKz0gODsKKwkJYnJlYWs7CisJfQorCXJldHVybiBwb3M7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9jb21wcmVzc0NvbnRpbnVlX2ludGVybmFsKFpTVERfQ0N0eCAqY2N0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIFUzMiBmcmFtZSwgVTMyIGxhc3RGcmFtZUNodW5rKQoreworCWNvbnN0IEJZVEUgKmNvbnN0IGlwID0gKGNvbnN0IEJZVEUgKilzcmM7CisJc2l6ZV90IGZoU2l6ZSA9IDA7CisKKwlpZiAoY2N0eC0+c3RhZ2UgPT0gWlNURGNzX2NyZWF0ZWQpCisJCXJldHVybiBFUlJPUihzdGFnZV93cm9uZyk7IC8qIG1pc3NpbmcgaW5pdCAoWlNURF9jb21wcmVzc0JlZ2luKSAqLworCisJaWYgKGZyYW1lICYmIChjY3R4LT5zdGFnZSA9PSBaU1REY3NfaW5pdCkpIHsKKwkJZmhTaXplID0gWlNURF93cml0ZUZyYW1lSGVhZGVyKGRzdCwgZHN0Q2FwYWNpdHksIGNjdHgtPnBhcmFtcywgY2N0eC0+ZnJhbWVDb250ZW50U2l6ZSwgY2N0eC0+ZGljdElEKTsKKwkJaWYgKFpTVERfaXNFcnJvcihmaFNpemUpKQorCQkJcmV0dXJuIGZoU2l6ZTsKKwkJZHN0Q2FwYWNpdHkgLT0gZmhTaXplOworCQlkc3QgPSAoY2hhciAqKWRzdCArIGZoU2l6ZTsKKwkJY2N0eC0+c3RhZ2UgPSBaU1REY3Nfb25nb2luZzsKKwl9CisKKwkvKiBDaGVjayBpZiBibG9ja3MgZm9sbG93IGVhY2ggb3RoZXIgKi8KKwlpZiAoc3JjICE9IGNjdHgtPm5leHRTcmMpIHsKKwkJLyogbm90IGNvbnRpZ3VvdXMgKi8KKwkJcHRyZGlmZl90IGNvbnN0IGRlbHRhID0gY2N0eC0+bmV4dFNyYyAtIGlwOworCQljY3R4LT5sb3dMaW1pdCA9IGNjdHgtPmRpY3RMaW1pdDsKKwkJY2N0eC0+ZGljdExpbWl0ID0gKFUzMikoY2N0eC0+bmV4dFNyYyAtIGNjdHgtPmJhc2UpOworCQljY3R4LT5kaWN0QmFzZSA9IGNjdHgtPmJhc2U7CisJCWNjdHgtPmJhc2UgLT0gZGVsdGE7CisJCWNjdHgtPm5leHRUb1VwZGF0ZSA9IGNjdHgtPmRpY3RMaW1pdDsKKwkJaWYgKGNjdHgtPmRpY3RMaW1pdCAtIGNjdHgtPmxvd0xpbWl0IDwgSEFTSF9SRUFEX1NJWkUpCisJCQljY3R4LT5sb3dMaW1pdCA9IGNjdHgtPmRpY3RMaW1pdDsgLyogdG9vIHNtYWxsIGV4dERpY3QgKi8KKwl9CisKKwkvKiBpZiBpbnB1dCBhbmQgZGljdGlvbmFyeSBvdmVybGFwIDogcmVkdWNlIGRpY3Rpb25hcnkgKGFyZWEgcHJlc3VtZWQgbW9kaWZpZWQgYnkgaW5wdXQpICovCisJaWYgKChpcCArIHNyY1NpemUgPiBjY3R4LT5kaWN0QmFzZSArIGNjdHgtPmxvd0xpbWl0KSAmIChpcCA8IGNjdHgtPmRpY3RCYXNlICsgY2N0eC0+ZGljdExpbWl0KSkgeworCQlwdHJkaWZmX3QgY29uc3QgaGlnaElucHV0SWR4ID0gKGlwICsgc3JjU2l6ZSkgLSBjY3R4LT5kaWN0QmFzZTsKKwkJVTMyIGNvbnN0IGxvd0xpbWl0TWF4ID0gKGhpZ2hJbnB1dElkeCA+IChwdHJkaWZmX3QpY2N0eC0+ZGljdExpbWl0KSA/IGNjdHgtPmRpY3RMaW1pdCA6IChVMzIpaGlnaElucHV0SWR4OworCQljY3R4LT5sb3dMaW1pdCA9IGxvd0xpbWl0TWF4OworCX0KKworCWNjdHgtPm5leHRTcmMgPSBpcCArIHNyY1NpemU7CisKKwlpZiAoc3JjU2l6ZSkgeworCQlzaXplX3QgY29uc3QgY1NpemUgPSBmcmFtZSA/IFpTVERfY29tcHJlc3NfZ2VuZXJpYyhjY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIGxhc3RGcmFtZUNodW5rKQorCQkJCQkgICA6IFpTVERfY29tcHJlc3NCbG9ja19pbnRlcm5hbChjY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUpOworCQlpZiAoWlNURF9pc0Vycm9yKGNTaXplKSkKKwkJCXJldHVybiBjU2l6ZTsKKwkJcmV0dXJuIGNTaXplICsgZmhTaXplOworCX0gZWxzZQorCQlyZXR1cm4gZmhTaXplOworfQorCitzaXplX3QgWlNURF9jb21wcmVzc0NvbnRpbnVlKFpTVERfQ0N0eCAqY2N0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJcmV0dXJuIFpTVERfY29tcHJlc3NDb250aW51ZV9pbnRlcm5hbChjY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIDEsIDApOworfQorCitzaXplX3QgWlNURF9nZXRCbG9ja1NpemVNYXgoWlNURF9DQ3R4ICpjY3R4KSB7IHJldHVybiBNSU4oWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgsIDEgPDwgY2N0eC0+cGFyYW1zLmNQYXJhbXMud2luZG93TG9nKTsgfQorCitzaXplX3QgWlNURF9jb21wcmVzc0Jsb2NrKFpTVERfQ0N0eCAqY2N0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJc2l6ZV90IGNvbnN0IGJsb2NrU2l6ZU1heCA9IFpTVERfZ2V0QmxvY2tTaXplTWF4KGNjdHgpOworCWlmIChzcmNTaXplID4gYmxvY2tTaXplTWF4KQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJcmV0dXJuIFpTVERfY29tcHJlc3NDb250aW51ZV9pbnRlcm5hbChjY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIDAsIDApOworfQorCisvKiEgWlNURF9sb2FkRGljdGlvbmFyeUNvbnRlbnQoKSA6CisgKiAgQHJldHVybiA6IDAsIG9yIGFuIGVycm9yIGNvZGUKKyAqLworc3RhdGljIHNpemVfdCBaU1REX2xvYWREaWN0aW9uYXJ5Q29udGVudChaU1REX0NDdHggKnpjLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCWNvbnN0IEJZVEUgKmNvbnN0IGlwID0gKGNvbnN0IEJZVEUgKilzcmM7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlwICsgc3JjU2l6ZTsKKworCS8qIGlucHV0IGJlY29tZXMgY3VyciBwcmVmaXggKi8KKwl6Yy0+bG93TGltaXQgPSB6Yy0+ZGljdExpbWl0OworCXpjLT5kaWN0TGltaXQgPSAoVTMyKSh6Yy0+bmV4dFNyYyAtIHpjLT5iYXNlKTsKKwl6Yy0+ZGljdEJhc2UgPSB6Yy0+YmFzZTsKKwl6Yy0+YmFzZSArPSBpcCAtIHpjLT5uZXh0U3JjOworCXpjLT5uZXh0VG9VcGRhdGUgPSB6Yy0+ZGljdExpbWl0OworCXpjLT5sb2FkZWREaWN0RW5kID0gemMtPmZvcmNlV2luZG93ID8gMCA6IChVMzIpKGllbmQgLSB6Yy0+YmFzZSk7CisKKwl6Yy0+bmV4dFNyYyA9IGllbmQ7CisJaWYgKHNyY1NpemUgPD0gSEFTSF9SRUFEX1NJWkUpCisJCXJldHVybiAwOworCisJc3dpdGNoICh6Yy0+cGFyYW1zLmNQYXJhbXMuc3RyYXRlZ3kpIHsKKwljYXNlIFpTVERfZmFzdDogWlNURF9maWxsSGFzaFRhYmxlKHpjLCBpZW5kLCB6Yy0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoKTsgYnJlYWs7CisKKwljYXNlIFpTVERfZGZhc3Q6IFpTVERfZmlsbERvdWJsZUhhc2hUYWJsZSh6YywgaWVuZCwgemMtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExlbmd0aCk7IGJyZWFrOworCisJY2FzZSBaU1REX2dyZWVkeToKKwljYXNlIFpTVERfbGF6eToKKwljYXNlIFpTVERfbGF6eTI6CisJCWlmIChzcmNTaXplID49IEhBU0hfUkVBRF9TSVpFKQorCQkJWlNURF9pbnNlcnRBbmRGaW5kRmlyc3RJbmRleCh6YywgaWVuZCAtIEhBU0hfUkVBRF9TSVpFLCB6Yy0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoKTsKKwkJYnJlYWs7CisKKwljYXNlIFpTVERfYnRsYXp5MjoKKwljYXNlIFpTVERfYnRvcHQ6CisJY2FzZSBaU1REX2J0b3B0MjoKKwkJaWYgKHNyY1NpemUgPj0gSEFTSF9SRUFEX1NJWkUpCisJCQlaU1REX3VwZGF0ZVRyZWUoemMsIGllbmQgLSBIQVNIX1JFQURfU0laRSwgaWVuZCwgMSA8PCB6Yy0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTG9nLCB6Yy0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIHN0cmF0ZWd5IGRvZXNuJ3QgZXhpc3Q7IGltcG9zc2libGUgKi8KKwl9CisKKwl6Yy0+bmV4dFRvVXBkYXRlID0gKFUzMikoaWVuZCAtIHpjLT5iYXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyogRGljdGlvbmFyaWVzIHRoYXQgYXNzaWduIHplcm8gcHJvYmFiaWxpdHkgdG8gc3ltYm9scyB0aGF0IHNob3cgdXAgY2F1c2VzIHByb2JsZW1zCisgICB3aGVuIEZTRSBlbmNvZGluZy4gIFJlZnVzZSBkaWN0aW9uYXJpZXMgdGhhdCBhc3NpZ24gemVybyBwcm9iYWJpbGl0eSB0byBzeW1ib2xzCisgICB0aGF0IHdlIG1heSBlbmNvdW50ZXIgZHVyaW5nIGNvbXByZXNzaW9uLgorICAgTk9URTogVGhpcyBiZWhhdmlvciBpcyBub3Qgc3RhbmRhcmQgYW5kIGNvdWxkIGJlIGltcHJvdmVkIGluIHRoZSBmdXR1cmUuICovCitzdGF0aWMgc2l6ZV90IFpTVERfY2hlY2tEaWN0TkNvdW50KHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgZGljdE1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSkKK3sKKwlVMzIgczsKKwlpZiAoZGljdE1heFN5bWJvbFZhbHVlIDwgbWF4U3ltYm9sVmFsdWUpCisJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJZm9yIChzID0gMDsgcyA8PSBtYXhTeW1ib2xWYWx1ZTsgKytzKSB7CisJCWlmIChub3JtYWxpemVkQ291bnRlcltzXSA9PSAwKQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIERpY3Rpb25hcnkgZm9ybWF0IDoKKyAqIFNlZSA6CisgKiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svenN0ZC9ibG9iL21hc3Rlci9kb2MvenN0ZF9jb21wcmVzc2lvbl9mb3JtYXQubWQjZGljdGlvbmFyeS1mb3JtYXQKKyAqLworLyohIFpTVERfbG9hZFpzdGREaWN0aW9uYXJ5KCkgOgorICogQHJldHVybiA6IDAsIG9yIGFuIGVycm9yIGNvZGUKKyAqICBhc3N1bXB0aW9ucyA6IG1hZ2ljIG51bWJlciBzdXBwb3NlZCBhbHJlYWR5IGNoZWNrZWQKKyAqICAgICAgICAgICAgICAgIGRpY3RTaXplIHN1cHBvc2VkID4gOAorICovCitzdGF0aWMgc2l6ZV90IFpTVERfbG9hZFpzdGREaWN0aW9uYXJ5KFpTVERfQ0N0eCAqY2N0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQoreworCWNvbnN0IEJZVEUgKmRpY3RQdHIgPSAoY29uc3QgQllURSAqKWRpY3Q7CisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RQdHIgKyBkaWN0U2l6ZTsKKwlzaG9ydCBvZmZjb2RlTkNvdW50W01heE9mZiArIDFdOworCXVuc2lnbmVkIG9mZmNvZGVNYXhWYWx1ZSA9IE1heE9mZjsKKworCWRpY3RQdHIgKz0gNDsgLyogc2tpcCBtYWdpYyBudW1iZXIgKi8KKwljY3R4LT5kaWN0SUQgPSBjY3R4LT5wYXJhbXMuZlBhcmFtcy5ub0RpY3RJREZsYWcgPyAwIDogWlNURF9yZWFkTEUzMihkaWN0UHRyKTsKKwlkaWN0UHRyICs9IDQ7CisKKwl7CisJCXNpemVfdCBjb25zdCBodWZIZWFkZXJTaXplID0gSFVGX3JlYWRDVGFibGVfd2tzcChjY3R4LT5odWZUYWJsZSwgMjU1LCBkaWN0UHRyLCBkaWN0RW5kIC0gZGljdFB0ciwgY2N0eC0+dG1wQ291bnRlcnMsIHNpemVvZihjY3R4LT50bXBDb3VudGVycykpOworCQlpZiAoSFVGX2lzRXJyb3IoaHVmSGVhZGVyU2l6ZSkpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlkaWN0UHRyICs9IGh1ZkhlYWRlclNpemU7CisJfQorCisJeworCQl1bnNpZ25lZCBvZmZjb2RlTG9nOworCQlzaXplX3QgY29uc3Qgb2ZmY29kZUhlYWRlclNpemUgPSBGU0VfcmVhZE5Db3VudChvZmZjb2RlTkNvdW50LCAmb2ZmY29kZU1heFZhbHVlLCAmb2ZmY29kZUxvZywgZGljdFB0ciwgZGljdEVuZCAtIGRpY3RQdHIpOworCQlpZiAoRlNFX2lzRXJyb3Iob2ZmY29kZUhlYWRlclNpemUpKQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJaWYgKG9mZmNvZGVMb2cgPiBPZmZGU0VMb2cpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQkvKiBEZWZlciBjaGVja2luZyBvZmZjb2RlTWF4VmFsdWUgYmVjYXVzZSB3ZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIGRpY3Rpb25hcnkgY29udGVudCAqLworCQlDSEVDS19FKEZTRV9idWlsZENUYWJsZV93a3NwKGNjdHgtPm9mZmNvZGVDVGFibGUsIG9mZmNvZGVOQ291bnQsIG9mZmNvZGVNYXhWYWx1ZSwgb2ZmY29kZUxvZywgY2N0eC0+dG1wQ291bnRlcnMsIHNpemVvZihjY3R4LT50bXBDb3VudGVycykpLAorCQkJZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlkaWN0UHRyICs9IG9mZmNvZGVIZWFkZXJTaXplOworCX0KKworCXsKKwkJc2hvcnQgbWF0Y2hsZW5ndGhOQ291bnRbTWF4TUwgKyAxXTsKKwkJdW5zaWduZWQgbWF0Y2hsZW5ndGhNYXhWYWx1ZSA9IE1heE1MLCBtYXRjaGxlbmd0aExvZzsKKwkJc2l6ZV90IGNvbnN0IG1hdGNobGVuZ3RoSGVhZGVyU2l6ZSA9IEZTRV9yZWFkTkNvdW50KG1hdGNobGVuZ3RoTkNvdW50LCAmbWF0Y2hsZW5ndGhNYXhWYWx1ZSwgJm1hdGNobGVuZ3RoTG9nLCBkaWN0UHRyLCBkaWN0RW5kIC0gZGljdFB0cik7CisJCWlmIChGU0VfaXNFcnJvcihtYXRjaGxlbmd0aEhlYWRlclNpemUpKQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJaWYgKG1hdGNobGVuZ3RoTG9nID4gTUxGU0VMb2cpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQkvKiBFdmVyeSBtYXRjaCBsZW5ndGggY29kZSBtdXN0IGhhdmUgbm9uLXplcm8gcHJvYmFiaWxpdHkgKi8KKwkJQ0hFQ0tfRihaU1REX2NoZWNrRGljdE5Db3VudChtYXRjaGxlbmd0aE5Db3VudCwgbWF0Y2hsZW5ndGhNYXhWYWx1ZSwgTWF4TUwpKTsKKwkJQ0hFQ0tfRSgKKwkJICAgIEZTRV9idWlsZENUYWJsZV93a3NwKGNjdHgtPm1hdGNobGVuZ3RoQ1RhYmxlLCBtYXRjaGxlbmd0aE5Db3VudCwgbWF0Y2hsZW5ndGhNYXhWYWx1ZSwgbWF0Y2hsZW5ndGhMb2csIGNjdHgtPnRtcENvdW50ZXJzLCBzaXplb2YoY2N0eC0+dG1wQ291bnRlcnMpKSwKKwkJICAgIGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJZGljdFB0ciArPSBtYXRjaGxlbmd0aEhlYWRlclNpemU7CisJfQorCisJeworCQlzaG9ydCBsaXRsZW5ndGhOQ291bnRbTWF4TEwgKyAxXTsKKwkJdW5zaWduZWQgbGl0bGVuZ3RoTWF4VmFsdWUgPSBNYXhMTCwgbGl0bGVuZ3RoTG9nOworCQlzaXplX3QgY29uc3QgbGl0bGVuZ3RoSGVhZGVyU2l6ZSA9IEZTRV9yZWFkTkNvdW50KGxpdGxlbmd0aE5Db3VudCwgJmxpdGxlbmd0aE1heFZhbHVlLCAmbGl0bGVuZ3RoTG9nLCBkaWN0UHRyLCBkaWN0RW5kIC0gZGljdFB0cik7CisJCWlmIChGU0VfaXNFcnJvcihsaXRsZW5ndGhIZWFkZXJTaXplKSkKKwkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJCWlmIChsaXRsZW5ndGhMb2cgPiBMTEZTRUxvZykKKwkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJCS8qIEV2ZXJ5IGxpdGVyYWwgbGVuZ3RoIGNvZGUgbXVzdCBoYXZlIG5vbi16ZXJvIHByb2JhYmlsaXR5ICovCisJCUNIRUNLX0YoWlNURF9jaGVja0RpY3ROQ291bnQobGl0bGVuZ3RoTkNvdW50LCBsaXRsZW5ndGhNYXhWYWx1ZSwgTWF4TEwpKTsKKwkJQ0hFQ0tfRShGU0VfYnVpbGRDVGFibGVfd2tzcChjY3R4LT5saXRsZW5ndGhDVGFibGUsIGxpdGxlbmd0aE5Db3VudCwgbGl0bGVuZ3RoTWF4VmFsdWUsIGxpdGxlbmd0aExvZywgY2N0eC0+dG1wQ291bnRlcnMsIHNpemVvZihjY3R4LT50bXBDb3VudGVycykpLAorCQkJZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlkaWN0UHRyICs9IGxpdGxlbmd0aEhlYWRlclNpemU7CisJfQorCisJaWYgKGRpY3RQdHIgKyAxMiA+IGRpY3RFbmQpCisJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJY2N0eC0+cmVwWzBdID0gWlNURF9yZWFkTEUzMihkaWN0UHRyICsgMCk7CisJY2N0eC0+cmVwWzFdID0gWlNURF9yZWFkTEUzMihkaWN0UHRyICsgNCk7CisJY2N0eC0+cmVwWzJdID0gWlNURF9yZWFkTEUzMihkaWN0UHRyICsgOCk7CisJZGljdFB0ciArPSAxMjsKKworCXsKKwkJc2l6ZV90IGNvbnN0IGRpY3RDb250ZW50U2l6ZSA9IChzaXplX3QpKGRpY3RFbmQgLSBkaWN0UHRyKTsKKwkJVTMyIG9mZmNvZGVNYXggPSBNYXhPZmY7CisJCWlmIChkaWN0Q29udGVudFNpemUgPD0gKChVMzIpLTEpIC0gMTI4IEtCKSB7CisJCQlVMzIgY29uc3QgbWF4T2Zmc2V0ID0gKFUzMilkaWN0Q29udGVudFNpemUgKyAxMjggS0I7IC8qIFRoZSBtYXhpbXVtIG9mZnNldCB0aGF0IG11c3QgYmUgc3VwcG9ydGVkICovCisJCQlvZmZjb2RlTWF4ID0gWlNURF9oaWdoYml0MzIobWF4T2Zmc2V0KTsJCSAgICAgLyogQ2FsY3VsYXRlIG1pbmltdW0gb2Zmc2V0IGNvZGUgcmVxdWlyZWQgdG8gcmVwcmVzZW50IG1heE9mZnNldCAqLworCQl9CisJCS8qIEFsbCBvZmZzZXQgdmFsdWVzIDw9IGRpY3RDb250ZW50U2l6ZSArIDEyOCBLQiBtdXN0IGJlIHJlcHJlc2VudGFibGUgKi8KKwkJQ0hFQ0tfRihaU1REX2NoZWNrRGljdE5Db3VudChvZmZjb2RlTkNvdW50LCBvZmZjb2RlTWF4VmFsdWUsIE1JTihvZmZjb2RlTWF4LCBNYXhPZmYpKSk7CisJCS8qIEFsbCByZXBDb2RlcyBtdXN0IGJlIDw9IGRpY3RDb250ZW50U2l6ZSBhbmQgIT0gMCovCisJCXsKKwkJCVUzMiB1OworCQkJZm9yICh1ID0gMDsgdSA8IDM7IHUrKykgeworCQkJCWlmIChjY3R4LT5yZXBbdV0gPT0gMCkKKwkJCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJCQlpZiAoY2N0eC0+cmVwW3VdID4gZGljdENvbnRlbnRTaXplKQorCQkJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQkJfQorCQl9CisKKwkJY2N0eC0+ZmxhZ1N0YXRpY1RhYmxlcyA9IDE7CisJCWNjdHgtPmZsYWdTdGF0aWNIdWZUYWJsZSA9IEhVRl9yZXBlYXRfdmFsaWQ7CisJCXJldHVybiBaU1REX2xvYWREaWN0aW9uYXJ5Q29udGVudChjY3R4LCBkaWN0UHRyLCBkaWN0Q29udGVudFNpemUpOworCX0KK30KKworLyoqIFpTVERfY29tcHJlc3NfaW5zZXJ0RGljdGlvbmFyeSgpIDoKKyogICBAcmV0dXJuIDogMCwgb3IgYW4gZXJyb3IgY29kZSAqLworc3RhdGljIHNpemVfdCBaU1REX2NvbXByZXNzX2luc2VydERpY3Rpb25hcnkoWlNURF9DQ3R4ICpjY3R4LCBjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUpCit7CisJaWYgKChkaWN0ID09IE5VTEwpIHx8IChkaWN0U2l6ZSA8PSA4KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBkaWN0IGFzIHB1cmUgY29udGVudCAqLworCWlmICgoWlNURF9yZWFkTEUzMihkaWN0KSAhPSBaU1REX0RJQ1RfTUFHSUMpIHx8IChjY3R4LT5mb3JjZVJhd0RpY3QpKQorCQlyZXR1cm4gWlNURF9sb2FkRGljdGlvbmFyeUNvbnRlbnQoY2N0eCwgZGljdCwgZGljdFNpemUpOworCisJLyogZGljdCBhcyB6c3RkIGRpY3Rpb25hcnkgKi8KKwlyZXR1cm4gWlNURF9sb2FkWnN0ZERpY3Rpb25hcnkoY2N0eCwgZGljdCwgZGljdFNpemUpOworfQorCisvKiEgWlNURF9jb21wcmVzc0JlZ2luX2ludGVybmFsKCkgOgorKiAgIEByZXR1cm4gOiAwLCBvciBhbiBlcnJvciBjb2RlICovCitzdGF0aWMgc2l6ZV90IFpTVERfY29tcHJlc3NCZWdpbl9pbnRlcm5hbChaU1REX0NDdHggKmNjdHgsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcywgVTY0IHBsZWRnZWRTcmNTaXplKQoreworCVpTVERfY29tcFJlc2V0UG9saWN5X2UgY29uc3QgY3JwID0gZGljdFNpemUgPyBaU1REY3JwX2Z1bGxSZXNldCA6IFpTVERjcnBfY29udGludWU7CisJQ0hFQ0tfRihaU1REX3Jlc2V0Q0N0eF9hZHZhbmNlZChjY3R4LCBwYXJhbXMsIHBsZWRnZWRTcmNTaXplLCBjcnApKTsKKwlyZXR1cm4gWlNURF9jb21wcmVzc19pbnNlcnREaWN0aW9uYXJ5KGNjdHgsIGRpY3QsIGRpY3RTaXplKTsKK30KKworLyohIFpTVERfY29tcHJlc3NCZWdpbl9hZHZhbmNlZCgpIDoKKyogICBAcmV0dXJuIDogMCwgb3IgYW4gZXJyb3IgY29kZSAqLworc2l6ZV90IFpTVERfY29tcHJlc3NCZWdpbl9hZHZhbmNlZChaU1REX0NDdHggKmNjdHgsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcywgdW5zaWduZWQgbG9uZyBsb25nIHBsZWRnZWRTcmNTaXplKQoreworCS8qIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdmVyaWZpY2F0aW9uIGFuZCBvcHRpbWl6YXRpb24gKi8KKwlDSEVDS19GKFpTVERfY2hlY2tDUGFyYW1zKHBhcmFtcy5jUGFyYW1zKSk7CisJcmV0dXJuIFpTVERfY29tcHJlc3NCZWdpbl9pbnRlcm5hbChjY3R4LCBkaWN0LCBkaWN0U2l6ZSwgcGFyYW1zLCBwbGVkZ2VkU3JjU2l6ZSk7Cit9CisKK3NpemVfdCBaU1REX2NvbXByZXNzQmVnaW5fdXNpbmdEaWN0KFpTVERfQ0N0eCAqY2N0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplLCBpbnQgY29tcHJlc3Npb25MZXZlbCkKK3sKKwlaU1REX3BhcmFtZXRlcnMgY29uc3QgcGFyYW1zID0gWlNURF9nZXRQYXJhbXMoY29tcHJlc3Npb25MZXZlbCwgMCwgZGljdFNpemUpOworCXJldHVybiBaU1REX2NvbXByZXNzQmVnaW5faW50ZXJuYWwoY2N0eCwgZGljdCwgZGljdFNpemUsIHBhcmFtcywgMCk7Cit9CisKK3NpemVfdCBaU1REX2NvbXByZXNzQmVnaW4oWlNURF9DQ3R4ICpjY3R4LCBpbnQgY29tcHJlc3Npb25MZXZlbCkgeyByZXR1cm4gWlNURF9jb21wcmVzc0JlZ2luX3VzaW5nRGljdChjY3R4LCBOVUxMLCAwLCBjb21wcmVzc2lvbkxldmVsKTsgfQorCisvKiEgWlNURF93cml0ZUVwaWxvZ3VlKCkgOgorKiAgIEVuZHMgYSBmcmFtZS4KKyogICBAcmV0dXJuIDogbmIgb2YgYnl0ZXMgd3JpdHRlbiBpbnRvIGRzdCAob3IgYW4gZXJyb3IgY29kZSkgKi8KK3N0YXRpYyBzaXplX3QgWlNURF93cml0ZUVwaWxvZ3VlKFpTVERfQ0N0eCAqY2N0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHkpCit7CisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7CisJQllURSAqb3AgPSBvc3RhcnQ7CisJc2l6ZV90IGZoU2l6ZSA9IDA7CisKKwlpZiAoY2N0eC0+c3RhZ2UgPT0gWlNURGNzX2NyZWF0ZWQpCisJCXJldHVybiBFUlJPUihzdGFnZV93cm9uZyk7IC8qIGluaXQgbWlzc2luZyAqLworCisJLyogc3BlY2lhbCBjYXNlIDogZW1wdHkgZnJhbWUgKi8KKwlpZiAoY2N0eC0+c3RhZ2UgPT0gWlNURGNzX2luaXQpIHsKKwkJZmhTaXplID0gWlNURF93cml0ZUZyYW1lSGVhZGVyKGRzdCwgZHN0Q2FwYWNpdHksIGNjdHgtPnBhcmFtcywgMCwgMCk7CisJCWlmIChaU1REX2lzRXJyb3IoZmhTaXplKSkKKwkJCXJldHVybiBmaFNpemU7CisJCWRzdENhcGFjaXR5IC09IGZoU2l6ZTsKKwkJb3AgKz0gZmhTaXplOworCQljY3R4LT5zdGFnZSA9IFpTVERjc19vbmdvaW5nOworCX0KKworCWlmIChjY3R4LT5zdGFnZSAhPSBaU1REY3NfZW5kaW5nKSB7CisJCS8qIHdyaXRlIG9uZSBsYXN0IGVtcHR5IGJsb2NrLCBtYWtlIGl0IHRoZSAibGFzdCIgYmxvY2sgKi8KKwkJVTMyIGNvbnN0IGNCbG9ja0hlYWRlcjI0ID0gMSAvKiBsYXN0IGJsb2NrICovICsgKCgoVTMyKWJ0X3JhdykgPDwgMSkgKyAwOworCQlpZiAoZHN0Q2FwYWNpdHkgPCA0KQorCQkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOworCQlaU1REX3dyaXRlTEUzMihvcCwgY0Jsb2NrSGVhZGVyMjQpOworCQlvcCArPSBaU1REX2Jsb2NrSGVhZGVyU2l6ZTsKKwkJZHN0Q2FwYWNpdHkgLT0gWlNURF9ibG9ja0hlYWRlclNpemU7CisJfQorCisJaWYgKGNjdHgtPnBhcmFtcy5mUGFyYW1zLmNoZWNrc3VtRmxhZykgeworCQlVMzIgY29uc3QgY2hlY2tzdW0gPSAoVTMyKXh4aDY0X2RpZ2VzdCgmY2N0eC0+eHhoU3RhdGUpOworCQlpZiAoZHN0Q2FwYWNpdHkgPCA0KQorCQkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOworCQlaU1REX3dyaXRlTEUzMihvcCwgY2hlY2tzdW0pOworCQlvcCArPSA0OworCX0KKworCWNjdHgtPnN0YWdlID0gWlNURGNzX2NyZWF0ZWQ7IC8qIHJldHVybiB0byAiY3JlYXRlZCBidXQgbm8gaW5pdCIgc3RhdHVzICovCisJcmV0dXJuIG9wIC0gb3N0YXJ0OworfQorCitzaXplX3QgWlNURF9jb21wcmVzc0VuZChaU1REX0NDdHggKmNjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCXNpemVfdCBlbmRSZXN1bHQ7CisJc2l6ZV90IGNvbnN0IGNTaXplID0gWlNURF9jb21wcmVzc0NvbnRpbnVlX2ludGVybmFsKGNjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSwgMSwgMSk7CisJaWYgKFpTVERfaXNFcnJvcihjU2l6ZSkpCisJCXJldHVybiBjU2l6ZTsKKwllbmRSZXN1bHQgPSBaU1REX3dyaXRlRXBpbG9ndWUoY2N0eCwgKGNoYXIgKilkc3QgKyBjU2l6ZSwgZHN0Q2FwYWNpdHkgLSBjU2l6ZSk7CisJaWYgKFpTVERfaXNFcnJvcihlbmRSZXN1bHQpKQorCQlyZXR1cm4gZW5kUmVzdWx0OworCXJldHVybiBjU2l6ZSArIGVuZFJlc3VsdDsKK30KKworc3RhdGljIHNpemVfdCBaU1REX2NvbXByZXNzX2ludGVybmFsKFpTVERfQ0N0eCAqY2N0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwKKwkJCQkgICAgIFpTVERfcGFyYW1ldGVycyBwYXJhbXMpCit7CisJQ0hFQ0tfRihaU1REX2NvbXByZXNzQmVnaW5faW50ZXJuYWwoY2N0eCwgZGljdCwgZGljdFNpemUsIHBhcmFtcywgc3JjU2l6ZSkpOworCXJldHVybiBaU1REX2NvbXByZXNzRW5kKGNjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSk7Cit9CisKK3NpemVfdCBaU1REX2NvbXByZXNzX3VzaW5nRGljdChaU1REX0NDdHggKmN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwKKwkJCSAgICAgICBaU1REX3BhcmFtZXRlcnMgcGFyYW1zKQoreworCXJldHVybiBaU1REX2NvbXByZXNzX2ludGVybmFsKGN0eCwgZHN0LCBkc3RDYXBhY2l0eSwgc3JjLCBzcmNTaXplLCBkaWN0LCBkaWN0U2l6ZSwgcGFyYW1zKTsKK30KKworc2l6ZV90IFpTVERfY29tcHJlc3NDQ3R4KFpTVERfQ0N0eCAqY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcykKK3sKKwlyZXR1cm4gWlNURF9jb21wcmVzc19pbnRlcm5hbChjdHgsIGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSwgTlVMTCwgMCwgcGFyYW1zKTsKK30KKworLyogPT09PT0gIERpY3Rpb25hcnkgQVBJICA9PT09PSAqLworCitzdHJ1Y3QgWlNURF9DRGljdF9zIHsKKwl2b2lkICpkaWN0QnVmZmVyOworCWNvbnN0IHZvaWQgKmRpY3RDb250ZW50OworCXNpemVfdCBkaWN0Q29udGVudFNpemU7CisJWlNURF9DQ3R4ICpyZWZDb250ZXh0OworfTsgLyogdHlwZWRlZidkIHRwIFpTVERfQ0RpY3Qgd2l0aGluICJ6c3RkLmgiICovCisKK3NpemVfdCBaU1REX0NEaWN0V29ya3NwYWNlQm91bmQoWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgY1BhcmFtcykgeyByZXR1cm4gWlNURF9DQ3R4V29ya3NwYWNlQm91bmQoY1BhcmFtcykgKyBaU1REX0FMSUdOKHNpemVvZihaU1REX0NEaWN0KSk7IH0KKworc3RhdGljIFpTVERfQ0RpY3QgKlpTVERfY3JlYXRlQ0RpY3RfYWR2YW5jZWQoY29uc3Qgdm9pZCAqZGljdEJ1ZmZlciwgc2l6ZV90IGRpY3RTaXplLCB1bnNpZ25lZCBieVJlZmVyZW5jZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcywgWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKQoreworCWlmICghY3VzdG9tTWVtLmN1c3RvbUFsbG9jIHx8ICFjdXN0b21NZW0uY3VzdG9tRnJlZSkKKwkJcmV0dXJuIE5VTEw7CisKKwl7CisJCVpTVERfQ0RpY3QgKmNvbnN0IGNkaWN0ID0gKFpTVERfQ0RpY3QgKilaU1REX21hbGxvYyhzaXplb2YoWlNURF9DRGljdCksIGN1c3RvbU1lbSk7CisJCVpTVERfQ0N0eCAqY29uc3QgY2N0eCA9IFpTVERfY3JlYXRlQ0N0eF9hZHZhbmNlZChjdXN0b21NZW0pOworCisJCWlmICghY2RpY3QgfHwgIWNjdHgpIHsKKwkJCVpTVERfZnJlZShjZGljdCwgY3VzdG9tTWVtKTsKKwkJCVpTVERfZnJlZUNDdHgoY2N0eCk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICgoYnlSZWZlcmVuY2UpIHx8ICghZGljdEJ1ZmZlcikgfHwgKCFkaWN0U2l6ZSkpIHsKKwkJCWNkaWN0LT5kaWN0QnVmZmVyID0gTlVMTDsKKwkJCWNkaWN0LT5kaWN0Q29udGVudCA9IGRpY3RCdWZmZXI7CisJCX0gZWxzZSB7CisJCQl2b2lkICpjb25zdCBpbnRlcm5hbEJ1ZmZlciA9IFpTVERfbWFsbG9jKGRpY3RTaXplLCBjdXN0b21NZW0pOworCQkJaWYgKCFpbnRlcm5hbEJ1ZmZlcikgeworCQkJCVpTVERfZnJlZShjY3R4LCBjdXN0b21NZW0pOworCQkJCVpTVERfZnJlZShjZGljdCwgY3VzdG9tTWVtKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW1lbWNweShpbnRlcm5hbEJ1ZmZlciwgZGljdEJ1ZmZlciwgZGljdFNpemUpOworCQkJY2RpY3QtPmRpY3RCdWZmZXIgPSBpbnRlcm5hbEJ1ZmZlcjsKKwkJCWNkaWN0LT5kaWN0Q29udGVudCA9IGludGVybmFsQnVmZmVyOworCQl9CisKKwkJeworCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IFpTVERfY29tcHJlc3NCZWdpbl9hZHZhbmNlZChjY3R4LCBjZGljdC0+ZGljdENvbnRlbnQsIGRpY3RTaXplLCBwYXJhbXMsIDApOworCQkJaWYgKFpTVERfaXNFcnJvcihlcnJvckNvZGUpKSB7CisJCQkJWlNURF9mcmVlKGNkaWN0LT5kaWN0QnVmZmVyLCBjdXN0b21NZW0pOworCQkJCVpTVERfZnJlZShjZGljdCwgY3VzdG9tTWVtKTsKKwkJCQlaU1REX2ZyZWVDQ3R4KGNjdHgpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkJY2RpY3QtPnJlZkNvbnRleHQgPSBjY3R4OworCQljZGljdC0+ZGljdENvbnRlbnRTaXplID0gZGljdFNpemU7CisJCXJldHVybiBjZGljdDsKKwl9Cit9CisKK1pTVERfQ0RpY3QgKlpTVERfaW5pdENEaWN0KGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwgWlNURF9wYXJhbWV0ZXJzIHBhcmFtcywgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkKK3sKKwlaU1REX2N1c3RvbU1lbSBjb25zdCBzdGFja01lbSA9IFpTVERfaW5pdFN0YWNrKHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJcmV0dXJuIFpTVERfY3JlYXRlQ0RpY3RfYWR2YW5jZWQoZGljdCwgZGljdFNpemUsIDEsIHBhcmFtcywgc3RhY2tNZW0pOworfQorCitzaXplX3QgWlNURF9mcmVlQ0RpY3QoWlNURF9DRGljdCAqY2RpY3QpCit7CisJaWYgKGNkaWN0ID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBzdXBwb3J0IGZyZWUgb24gTlVMTCAqLworCXsKKwkJWlNURF9jdXN0b21NZW0gY29uc3QgY01lbSA9IGNkaWN0LT5yZWZDb250ZXh0LT5jdXN0b21NZW07CisJCVpTVERfZnJlZUNDdHgoY2RpY3QtPnJlZkNvbnRleHQpOworCQlaU1REX2ZyZWUoY2RpY3QtPmRpY3RCdWZmZXIsIGNNZW0pOworCQlaU1REX2ZyZWUoY2RpY3QsIGNNZW0pOworCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBaU1REX3BhcmFtZXRlcnMgWlNURF9nZXRQYXJhbXNGcm9tQ0RpY3QoY29uc3QgWlNURF9DRGljdCAqY2RpY3QpIHsgcmV0dXJuIFpTVERfZ2V0UGFyYW1zRnJvbUNDdHgoY2RpY3QtPnJlZkNvbnRleHQpOyB9CisKK3NpemVfdCBaU1REX2NvbXByZXNzQmVnaW5fdXNpbmdDRGljdChaU1REX0NDdHggKmNjdHgsIGNvbnN0IFpTVERfQ0RpY3QgKmNkaWN0LCB1bnNpZ25lZCBsb25nIGxvbmcgcGxlZGdlZFNyY1NpemUpCit7CisJaWYgKGNkaWN0LT5kaWN0Q29udGVudFNpemUpCisJCUNIRUNLX0YoWlNURF9jb3B5Q0N0eChjY3R4LCBjZGljdC0+cmVmQ29udGV4dCwgcGxlZGdlZFNyY1NpemUpKQorCWVsc2UgeworCQlaU1REX3BhcmFtZXRlcnMgcGFyYW1zID0gY2RpY3QtPnJlZkNvbnRleHQtPnBhcmFtczsKKwkJcGFyYW1zLmZQYXJhbXMuY29udGVudFNpemVGbGFnID0gKHBsZWRnZWRTcmNTaXplID4gMCk7CisJCUNIRUNLX0YoWlNURF9jb21wcmVzc0JlZ2luX2FkdmFuY2VkKGNjdHgsIE5VTEwsIDAsIHBhcmFtcywgcGxlZGdlZFNyY1NpemUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qISBaU1REX2NvbXByZXNzX3VzaW5nQ0RpY3QoKSA6CisqICAgQ29tcHJlc3Npb24gdXNpbmcgYSBkaWdlc3RlZCBEaWN0aW9uYXJ5LgorKiAgIEZhc3RlciBzdGFydHVwIHRoYW4gWlNURF9jb21wcmVzc191c2luZ0RpY3QoKSwgcmVjb21tZW5kZWQgd2hlbiBzYW1lIGRpY3Rpb25hcnkgaXMgdXNlZCBtdWx0aXBsZSB0aW1lcy4KKyogICBOb3RlIHRoYXQgY29tcHJlc3Npb24gbGV2ZWwgaXMgZGVjaWRlZCBkdXJpbmcgZGljdGlvbmFyeSBjcmVhdGlvbiAqLworc2l6ZV90IFpTVERfY29tcHJlc3NfdXNpbmdDRGljdChaU1REX0NDdHggKmNjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBaU1REX0NEaWN0ICpjZGljdCkKK3sKKwlDSEVDS19GKFpTVERfY29tcHJlc3NCZWdpbl91c2luZ0NEaWN0KGNjdHgsIGNkaWN0LCBzcmNTaXplKSk7CisKKwlpZiAoY2RpY3QtPnJlZkNvbnRleHQtPnBhcmFtcy5mUGFyYW1zLmNvbnRlbnRTaXplRmxhZyA9PSAxKSB7CisJCWNjdHgtPnBhcmFtcy5mUGFyYW1zLmNvbnRlbnRTaXplRmxhZyA9IDE7CisJCWNjdHgtPmZyYW1lQ29udGVudFNpemUgPSBzcmNTaXplOworCX0gZWxzZSB7CisJCWNjdHgtPnBhcmFtcy5mUGFyYW1zLmNvbnRlbnRTaXplRmxhZyA9IDA7CisJfQorCisJcmV0dXJuIFpTVERfY29tcHJlc3NFbmQoY2N0eCwgZHN0LCBkc3RDYXBhY2l0eSwgc3JjLCBzcmNTaXplKTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBTdHJlYW1pbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0geyB6Y3NzX2luaXQsIHpjc3NfbG9hZCwgemNzc19mbHVzaCwgemNzc19maW5hbCB9IFpTVERfY1N0cmVhbVN0YWdlOworCitzdHJ1Y3QgWlNURF9DU3RyZWFtX3MgeworCVpTVERfQ0N0eCAqY2N0eDsKKwlaU1REX0NEaWN0ICpjZGljdExvY2FsOworCWNvbnN0IFpTVERfQ0RpY3QgKmNkaWN0OworCWNoYXIgKmluQnVmZjsKKwlzaXplX3QgaW5CdWZmU2l6ZTsKKwlzaXplX3QgaW5Ub0NvbXByZXNzOworCXNpemVfdCBpbkJ1ZmZQb3M7CisJc2l6ZV90IGluQnVmZlRhcmdldDsKKwlzaXplX3QgYmxvY2tTaXplOworCWNoYXIgKm91dEJ1ZmY7CisJc2l6ZV90IG91dEJ1ZmZTaXplOworCXNpemVfdCBvdXRCdWZmQ29udGVudFNpemU7CisJc2l6ZV90IG91dEJ1ZmZGbHVzaGVkU2l6ZTsKKwlaU1REX2NTdHJlYW1TdGFnZSBzdGFnZTsKKwlVMzIgY2hlY2tzdW07CisJVTMyIGZyYW1lRW5kZWQ7CisJVTY0IHBsZWRnZWRTcmNTaXplOworCVU2NCBpbnB1dFByb2Nlc3NlZDsKKwlaU1REX3BhcmFtZXRlcnMgcGFyYW1zOworCVpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbTsKK307IC8qIHR5cGVkZWYnZCB0byBaU1REX0NTdHJlYW0gd2l0aGluICJ6c3RkLmgiICovCisKK3NpemVfdCBaU1REX0NTdHJlYW1Xb3Jrc3BhY2VCb3VuZChaU1REX2NvbXByZXNzaW9uUGFyYW1ldGVycyBjUGFyYW1zKQoreworCXNpemVfdCBjb25zdCBpbkJ1ZmZTaXplID0gKHNpemVfdCkxIDw8IGNQYXJhbXMud2luZG93TG9nOworCXNpemVfdCBjb25zdCBibG9ja1NpemUgPSBNSU4oWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgsIGluQnVmZlNpemUpOworCXNpemVfdCBjb25zdCBvdXRCdWZmU2l6ZSA9IFpTVERfY29tcHJlc3NCb3VuZChibG9ja1NpemUpICsgMTsKKworCXJldHVybiBaU1REX0NDdHhXb3Jrc3BhY2VCb3VuZChjUGFyYW1zKSArIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfQ1N0cmVhbSkpICsgWlNURF9BTElHTihpbkJ1ZmZTaXplKSArIFpTVERfQUxJR04ob3V0QnVmZlNpemUpOworfQorCitaU1REX0NTdHJlYW0gKlpTVERfY3JlYXRlQ1N0cmVhbV9hZHZhbmNlZChaU1REX2N1c3RvbU1lbSBjdXN0b21NZW0pCit7CisJWlNURF9DU3RyZWFtICp6Y3M7CisKKwlpZiAoIWN1c3RvbU1lbS5jdXN0b21BbGxvYyB8fCAhY3VzdG9tTWVtLmN1c3RvbUZyZWUpCisJCXJldHVybiBOVUxMOworCisJemNzID0gKFpTVERfQ1N0cmVhbSAqKVpTVERfbWFsbG9jKHNpemVvZihaU1REX0NTdHJlYW0pLCBjdXN0b21NZW0pOworCWlmICh6Y3MgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KHpjcywgMCwgc2l6ZW9mKFpTVERfQ1N0cmVhbSkpOworCW1lbWNweSgmemNzLT5jdXN0b21NZW0sICZjdXN0b21NZW0sIHNpemVvZihaU1REX2N1c3RvbU1lbSkpOworCXpjcy0+Y2N0eCA9IFpTVERfY3JlYXRlQ0N0eF9hZHZhbmNlZChjdXN0b21NZW0pOworCWlmICh6Y3MtPmNjdHggPT0gTlVMTCkgeworCQlaU1REX2ZyZWVDU3RyZWFtKHpjcyk7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gemNzOworfQorCitzaXplX3QgWlNURF9mcmVlQ1N0cmVhbShaU1REX0NTdHJlYW0gKnpjcykKK3sKKwlpZiAoemNzID09IE5VTEwpCisJCXJldHVybiAwOyAvKiBzdXBwb3J0IGZyZWUgb24gTlVMTCAqLworCXsKKwkJWlNURF9jdXN0b21NZW0gY29uc3QgY01lbSA9IHpjcy0+Y3VzdG9tTWVtOworCQlaU1REX2ZyZWVDQ3R4KHpjcy0+Y2N0eCk7CisJCXpjcy0+Y2N0eCA9IE5VTEw7CisJCVpTVERfZnJlZUNEaWN0KHpjcy0+Y2RpY3RMb2NhbCk7CisJCXpjcy0+Y2RpY3RMb2NhbCA9IE5VTEw7CisJCVpTVERfZnJlZSh6Y3MtPmluQnVmZiwgY01lbSk7CisJCXpjcy0+aW5CdWZmID0gTlVMTDsKKwkJWlNURF9mcmVlKHpjcy0+b3V0QnVmZiwgY01lbSk7CisJCXpjcy0+b3V0QnVmZiA9IE5VTEw7CisJCVpTVERfZnJlZSh6Y3MsIGNNZW0pOworCQlyZXR1cm4gMDsKKwl9Cit9CisKKy8qPT09PT09ICAgSW5pdGlhbGl6YXRpb24gICA9PT09PT0qLworCitzaXplX3QgWlNURF9DU3RyZWFtSW5TaXplKHZvaWQpIHsgcmV0dXJuIFpTVERfQkxPQ0tTSVpFX0FCU09MVVRFTUFYOyB9CitzaXplX3QgWlNURF9DU3RyZWFtT3V0U2l6ZSh2b2lkKSB7IHJldHVybiBaU1REX2NvbXByZXNzQm91bmQoWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgpICsgWlNURF9ibG9ja0hlYWRlclNpemUgKyA0IC8qIDMyLWJpdHMgaGFzaCAqLzsgfQorCitzdGF0aWMgc2l6ZV90IFpTVERfcmVzZXRDU3RyZWFtX2ludGVybmFsKFpTVERfQ1N0cmVhbSAqemNzLCB1bnNpZ25lZCBsb25nIGxvbmcgcGxlZGdlZFNyY1NpemUpCit7CisJaWYgKHpjcy0+aW5CdWZmU2l6ZSA9PSAwKQorCQlyZXR1cm4gRVJST1Ioc3RhZ2Vfd3JvbmcpOyAvKiB6Y3MgaGFzIG5vdCBiZWVuIGluaXQgYXQgbGVhc3Qgb25jZSA9PiBjYW4ndCByZXNldCAqLworCisJaWYgKHpjcy0+Y2RpY3QpCisJCUNIRUNLX0YoWlNURF9jb21wcmVzc0JlZ2luX3VzaW5nQ0RpY3QoemNzLT5jY3R4LCB6Y3MtPmNkaWN0LCBwbGVkZ2VkU3JjU2l6ZSkpCisJZWxzZQorCQlDSEVDS19GKFpTVERfY29tcHJlc3NCZWdpbl9hZHZhbmNlZCh6Y3MtPmNjdHgsIE5VTEwsIDAsIHpjcy0+cGFyYW1zLCBwbGVkZ2VkU3JjU2l6ZSkpOworCisJemNzLT5pblRvQ29tcHJlc3MgPSAwOworCXpjcy0+aW5CdWZmUG9zID0gMDsKKwl6Y3MtPmluQnVmZlRhcmdldCA9IHpjcy0+YmxvY2tTaXplOworCXpjcy0+b3V0QnVmZkNvbnRlbnRTaXplID0gemNzLT5vdXRCdWZmRmx1c2hlZFNpemUgPSAwOworCXpjcy0+c3RhZ2UgPSB6Y3NzX2xvYWQ7CisJemNzLT5mcmFtZUVuZGVkID0gMDsKKwl6Y3MtPnBsZWRnZWRTcmNTaXplID0gcGxlZGdlZFNyY1NpemU7CisJemNzLT5pbnB1dFByb2Nlc3NlZCA9IDA7CisJcmV0dXJuIDA7IC8qIHJlYWR5IHRvIGdvICovCit9CisKK3NpemVfdCBaU1REX3Jlc2V0Q1N0cmVhbShaU1REX0NTdHJlYW0gKnpjcywgdW5zaWduZWQgbG9uZyBsb25nIHBsZWRnZWRTcmNTaXplKQoreworCisJemNzLT5wYXJhbXMuZlBhcmFtcy5jb250ZW50U2l6ZUZsYWcgPSAocGxlZGdlZFNyY1NpemUgPiAwKTsKKworCXJldHVybiBaU1REX3Jlc2V0Q1N0cmVhbV9pbnRlcm5hbCh6Y3MsIHBsZWRnZWRTcmNTaXplKTsKK30KKworc3RhdGljIHNpemVfdCBaU1REX2luaXRDU3RyZWFtX2FkdmFuY2VkKFpTVERfQ1N0cmVhbSAqemNzLCBjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUsIFpTVERfcGFyYW1ldGVycyBwYXJhbXMsIHVuc2lnbmVkIGxvbmcgbG9uZyBwbGVkZ2VkU3JjU2l6ZSkKK3sKKwkvKiBhbGxvY2F0ZSBidWZmZXJzICovCisJeworCQlzaXplX3QgY29uc3QgbmVlZGVkSW5CdWZmU2l6ZSA9IChzaXplX3QpMSA8PCBwYXJhbXMuY1BhcmFtcy53aW5kb3dMb2c7CisJCWlmICh6Y3MtPmluQnVmZlNpemUgPCBuZWVkZWRJbkJ1ZmZTaXplKSB7CisJCQl6Y3MtPmluQnVmZlNpemUgPSBuZWVkZWRJbkJ1ZmZTaXplOworCQkJWlNURF9mcmVlKHpjcy0+aW5CdWZmLCB6Y3MtPmN1c3RvbU1lbSk7CisJCQl6Y3MtPmluQnVmZiA9IChjaGFyICopWlNURF9tYWxsb2MobmVlZGVkSW5CdWZmU2l6ZSwgemNzLT5jdXN0b21NZW0pOworCQkJaWYgKHpjcy0+aW5CdWZmID09IE5VTEwpCisJCQkJcmV0dXJuIEVSUk9SKG1lbW9yeV9hbGxvY2F0aW9uKTsKKwkJfQorCQl6Y3MtPmJsb2NrU2l6ZSA9IE1JTihaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCwgbmVlZGVkSW5CdWZmU2l6ZSk7CisJfQorCWlmICh6Y3MtPm91dEJ1ZmZTaXplIDwgWlNURF9jb21wcmVzc0JvdW5kKHpjcy0+YmxvY2tTaXplKSArIDEpIHsKKwkJemNzLT5vdXRCdWZmU2l6ZSA9IFpTVERfY29tcHJlc3NCb3VuZCh6Y3MtPmJsb2NrU2l6ZSkgKyAxOworCQlaU1REX2ZyZWUoemNzLT5vdXRCdWZmLCB6Y3MtPmN1c3RvbU1lbSk7CisJCXpjcy0+b3V0QnVmZiA9IChjaGFyICopWlNURF9tYWxsb2MoemNzLT5vdXRCdWZmU2l6ZSwgemNzLT5jdXN0b21NZW0pOworCQlpZiAoemNzLT5vdXRCdWZmID09IE5VTEwpCisJCQlyZXR1cm4gRVJST1IobWVtb3J5X2FsbG9jYXRpb24pOworCX0KKworCWlmIChkaWN0ICYmIGRpY3RTaXplID49IDgpIHsKKwkJWlNURF9mcmVlQ0RpY3QoemNzLT5jZGljdExvY2FsKTsKKwkJemNzLT5jZGljdExvY2FsID0gWlNURF9jcmVhdGVDRGljdF9hZHZhbmNlZChkaWN0LCBkaWN0U2l6ZSwgMCwgcGFyYW1zLCB6Y3MtPmN1c3RvbU1lbSk7CisJCWlmICh6Y3MtPmNkaWN0TG9jYWwgPT0gTlVMTCkKKwkJCXJldHVybiBFUlJPUihtZW1vcnlfYWxsb2NhdGlvbik7CisJCXpjcy0+Y2RpY3QgPSB6Y3MtPmNkaWN0TG9jYWw7CisJfSBlbHNlCisJCXpjcy0+Y2RpY3QgPSBOVUxMOworCisJemNzLT5jaGVja3N1bSA9IHBhcmFtcy5mUGFyYW1zLmNoZWNrc3VtRmxhZyA+IDA7CisJemNzLT5wYXJhbXMgPSBwYXJhbXM7CisKKwlyZXR1cm4gWlNURF9yZXNldENTdHJlYW1faW50ZXJuYWwoemNzLCBwbGVkZ2VkU3JjU2l6ZSk7Cit9CisKK1pTVERfQ1N0cmVhbSAqWlNURF9pbml0Q1N0cmVhbShaU1REX3BhcmFtZXRlcnMgcGFyYW1zLCB1bnNpZ25lZCBsb25nIGxvbmcgcGxlZGdlZFNyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJWlNURF9jdXN0b21NZW0gY29uc3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCVpTVERfQ1N0cmVhbSAqY29uc3QgemNzID0gWlNURF9jcmVhdGVDU3RyZWFtX2FkdmFuY2VkKHN0YWNrTWVtKTsKKwlpZiAoemNzKSB7CisJCXNpemVfdCBjb25zdCBjb2RlID0gWlNURF9pbml0Q1N0cmVhbV9hZHZhbmNlZCh6Y3MsIE5VTEwsIDAsIHBhcmFtcywgcGxlZGdlZFNyY1NpemUpOworCQlpZiAoWlNURF9pc0Vycm9yKGNvZGUpKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gemNzOworfQorCitaU1REX0NTdHJlYW0gKlpTVERfaW5pdENTdHJlYW1fdXNpbmdDRGljdChjb25zdCBaU1REX0NEaWN0ICpjZGljdCwgdW5zaWduZWQgbG9uZyBsb25nIHBsZWRnZWRTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCVpTVERfcGFyYW1ldGVycyBjb25zdCBwYXJhbXMgPSBaU1REX2dldFBhcmFtc0Zyb21DRGljdChjZGljdCk7CisJWlNURF9DU3RyZWFtICpjb25zdCB6Y3MgPSBaU1REX2luaXRDU3RyZWFtKHBhcmFtcywgcGxlZGdlZFNyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJaWYgKHpjcykgeworCQl6Y3MtPmNkaWN0ID0gY2RpY3Q7CisJCWlmIChaU1REX2lzRXJyb3IoWlNURF9yZXNldENTdHJlYW1faW50ZXJuYWwoemNzLCBwbGVkZ2VkU3JjU2l6ZSkpKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gemNzOworfQorCisvKj09PT09PSAgIENvbXByZXNzaW9uICAgPT09PT09Ki8KKwordHlwZWRlZiBlbnVtIHsgenNmX2dhdGhlciwgenNmX2ZsdXNoLCB6c2ZfZW5kIH0gWlNURF9mbHVzaF9lOworCitaU1REX1NUQVRJQyBzaXplX3QgWlNURF9saW1pdENvcHkodm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJc2l6ZV90IGNvbnN0IGxlbmd0aCA9IE1JTihkc3RDYXBhY2l0eSwgc3JjU2l6ZSk7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworCXJldHVybiBsZW5ndGg7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9jb21wcmVzc1N0cmVhbV9nZW5lcmljKFpTVERfQ1N0cmVhbSAqemNzLCB2b2lkICpkc3QsIHNpemVfdCAqZHN0Q2FwYWNpdHlQdHIsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90ICpzcmNTaXplUHRyLCBaU1REX2ZsdXNoX2UgY29uc3QgZmx1c2gpCit7CisJVTMyIHNvbWVNb3JlV29yayA9IDE7CisJY29uc3QgY2hhciAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IGNoYXIgKilzcmM7CisJY29uc3QgY2hhciAqY29uc3QgaWVuZCA9IGlzdGFydCArICpzcmNTaXplUHRyOworCWNvbnN0IGNoYXIgKmlwID0gaXN0YXJ0OworCWNoYXIgKmNvbnN0IG9zdGFydCA9IChjaGFyICopZHN0OworCWNoYXIgKmNvbnN0IG9lbmQgPSBvc3RhcnQgKyAqZHN0Q2FwYWNpdHlQdHI7CisJY2hhciAqb3AgPSBvc3RhcnQ7CisKKwl3aGlsZSAoc29tZU1vcmVXb3JrKSB7CisJCXN3aXRjaCAoemNzLT5zdGFnZSkgeworCQljYXNlIHpjc3NfaW5pdDoKKwkJCXJldHVybiBFUlJPUihpbml0X21pc3NpbmcpOyAvKiBjYWxsIFpCVUZGX2NvbXByZXNzSW5pdCgpIGZpcnN0ICEgKi8KKworCQljYXNlIHpjc3NfbG9hZDoKKwkJCS8qIGNvbXBsZXRlIGluQnVmZmVyICovCisJCQl7CisJCQkJc2l6ZV90IGNvbnN0IHRvTG9hZCA9IHpjcy0+aW5CdWZmVGFyZ2V0IC0gemNzLT5pbkJ1ZmZQb3M7CisJCQkJc2l6ZV90IGNvbnN0IGxvYWRlZCA9IFpTVERfbGltaXRDb3B5KHpjcy0+aW5CdWZmICsgemNzLT5pbkJ1ZmZQb3MsIHRvTG9hZCwgaXAsIGllbmQgLSBpcCk7CisJCQkJemNzLT5pbkJ1ZmZQb3MgKz0gbG9hZGVkOworCQkJCWlwICs9IGxvYWRlZDsKKwkJCQlpZiAoKHpjcy0+aW5CdWZmUG9zID09IHpjcy0+aW5Ub0NvbXByZXNzKSB8fCAoIWZsdXNoICYmICh0b0xvYWQgIT0gbG9hZGVkKSkpIHsKKwkJCQkJc29tZU1vcmVXb3JrID0gMDsKKwkJCQkJYnJlYWs7IC8qIG5vdCBlbm91Z2ggaW5wdXQgdG8gZ2V0IGEgZnVsbCBibG9jayA6IHN0b3AgdGhlcmUsIHdhaXQgZm9yIG1vcmUgKi8KKwkJCQl9CisJCQl9CisJCQkvKiBjb21wcmVzcyBjdXJyIGJsb2NrIChub3RlIDogdGhpcyBzdGFnZSBjYW5ub3QgYmUgc3RvcHBlZCBpbiB0aGUgbWlkZGxlKSAqLworCQkJeworCQkJCXZvaWQgKmNEc3Q7CisJCQkJc2l6ZV90IGNTaXplOworCQkJCXNpemVfdCBjb25zdCBpU2l6ZSA9IHpjcy0+aW5CdWZmUG9zIC0gemNzLT5pblRvQ29tcHJlc3M7CisJCQkJc2l6ZV90IG9TaXplID0gb2VuZCAtIG9wOworCQkJCWlmIChvU2l6ZSA+PSBaU1REX2NvbXByZXNzQm91bmQoaVNpemUpKQorCQkJCQljRHN0ID0gb3A7IC8qIGNvbXByZXNzIGRpcmVjdGx5IGludG8gb3V0cHV0IGJ1ZmZlciAoYXZvaWQgZmx1c2ggc3RhZ2UpICovCisJCQkJZWxzZQorCQkJCQljRHN0ID0gemNzLT5vdXRCdWZmLCBvU2l6ZSA9IHpjcy0+b3V0QnVmZlNpemU7CisJCQkJY1NpemUgPSAoZmx1c2ggPT0genNmX2VuZCkgPyBaU1REX2NvbXByZXNzRW5kKHpjcy0+Y2N0eCwgY0RzdCwgb1NpemUsIHpjcy0+aW5CdWZmICsgemNzLT5pblRvQ29tcHJlc3MsIGlTaXplKQorCQkJCQkJCSAgIDogWlNURF9jb21wcmVzc0NvbnRpbnVlKHpjcy0+Y2N0eCwgY0RzdCwgb1NpemUsIHpjcy0+aW5CdWZmICsgemNzLT5pblRvQ29tcHJlc3MsIGlTaXplKTsKKwkJCQlpZiAoWlNURF9pc0Vycm9yKGNTaXplKSkKKwkJCQkJcmV0dXJuIGNTaXplOworCQkJCWlmIChmbHVzaCA9PSB6c2ZfZW5kKQorCQkJCQl6Y3MtPmZyYW1lRW5kZWQgPSAxOworCQkJCS8qIHByZXBhcmUgbmV4dCBibG9jayAqLworCQkJCXpjcy0+aW5CdWZmVGFyZ2V0ID0gemNzLT5pbkJ1ZmZQb3MgKyB6Y3MtPmJsb2NrU2l6ZTsKKwkJCQlpZiAoemNzLT5pbkJ1ZmZUYXJnZXQgPiB6Y3MtPmluQnVmZlNpemUpCisJCQkJCXpjcy0+aW5CdWZmUG9zID0gMCwgemNzLT5pbkJ1ZmZUYXJnZXQgPSB6Y3MtPmJsb2NrU2l6ZTsgLyogbm90ZSA6IGluQnVmZlNpemUgPj0gYmxvY2tTaXplICovCisJCQkJemNzLT5pblRvQ29tcHJlc3MgPSB6Y3MtPmluQnVmZlBvczsKKwkJCQlpZiAoY0RzdCA9PSBvcCkgeworCQkJCQlvcCArPSBjU2l6ZTsKKwkJCQkJYnJlYWs7CisJCQkJfSAvKiBubyBuZWVkIHRvIGZsdXNoICovCisJCQkJemNzLT5vdXRCdWZmQ29udGVudFNpemUgPSBjU2l6ZTsKKwkJCQl6Y3MtPm91dEJ1ZmZGbHVzaGVkU2l6ZSA9IDA7CisJCQkJemNzLT5zdGFnZSA9IHpjc3NfZmx1c2g7IC8qIHBhc3MtdGhyb3VnaCB0byBmbHVzaCBzdGFnZSAqLworCQkJfQorCisJCWNhc2UgemNzc19mbHVzaDogeworCQkJc2l6ZV90IGNvbnN0IHRvRmx1c2ggPSB6Y3MtPm91dEJ1ZmZDb250ZW50U2l6ZSAtIHpjcy0+b3V0QnVmZkZsdXNoZWRTaXplOworCQkJc2l6ZV90IGNvbnN0IGZsdXNoZWQgPSBaU1REX2xpbWl0Q29weShvcCwgb2VuZCAtIG9wLCB6Y3MtPm91dEJ1ZmYgKyB6Y3MtPm91dEJ1ZmZGbHVzaGVkU2l6ZSwgdG9GbHVzaCk7CisJCQlvcCArPSBmbHVzaGVkOworCQkJemNzLT5vdXRCdWZmRmx1c2hlZFNpemUgKz0gZmx1c2hlZDsKKwkJCWlmICh0b0ZsdXNoICE9IGZsdXNoZWQpIHsKKwkJCQlzb21lTW9yZVdvcmsgPSAwOworCQkJCWJyZWFrOworCQkJfSAvKiBkc3QgdG9vIHNtYWxsIHRvIHN0b3JlIGZsdXNoZWQgZGF0YSA6IHN0b3AgdGhlcmUgKi8KKwkJCXpjcy0+b3V0QnVmZkNvbnRlbnRTaXplID0gemNzLT5vdXRCdWZmRmx1c2hlZFNpemUgPSAwOworCQkJemNzLT5zdGFnZSA9IHpjc3NfbG9hZDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSB6Y3NzX2ZpbmFsOgorCQkJc29tZU1vcmVXb3JrID0gMDsgLyogZG8gbm90aGluZyAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogaW1wb3NzaWJsZSAqLworCQl9CisJfQorCisJKnNyY1NpemVQdHIgPSBpcCAtIGlzdGFydDsKKwkqZHN0Q2FwYWNpdHlQdHIgPSBvcCAtIG9zdGFydDsKKwl6Y3MtPmlucHV0UHJvY2Vzc2VkICs9ICpzcmNTaXplUHRyOworCWlmICh6Y3MtPmZyYW1lRW5kZWQpCisJCXJldHVybiAwOworCXsKKwkJc2l6ZV90IGhpbnRJblNpemUgPSB6Y3MtPmluQnVmZlRhcmdldCAtIHpjcy0+aW5CdWZmUG9zOworCQlpZiAoaGludEluU2l6ZSA9PSAwKQorCQkJaGludEluU2l6ZSA9IHpjcy0+YmxvY2tTaXplOworCQlyZXR1cm4gaGludEluU2l6ZTsKKwl9Cit9CisKK3NpemVfdCBaU1REX2NvbXByZXNzU3RyZWFtKFpTVERfQ1N0cmVhbSAqemNzLCBaU1REX291dEJ1ZmZlciAqb3V0cHV0LCBaU1REX2luQnVmZmVyICppbnB1dCkKK3sKKwlzaXplX3Qgc2l6ZVJlYWQgPSBpbnB1dC0+c2l6ZSAtIGlucHV0LT5wb3M7CisJc2l6ZV90IHNpemVXcml0dGVuID0gb3V0cHV0LT5zaXplIC0gb3V0cHV0LT5wb3M7CisJc2l6ZV90IGNvbnN0IHJlc3VsdCA9CisJICAgIFpTVERfY29tcHJlc3NTdHJlYW1fZ2VuZXJpYyh6Y3MsIChjaGFyICopKG91dHB1dC0+ZHN0KSArIG91dHB1dC0+cG9zLCAmc2l6ZVdyaXR0ZW4sIChjb25zdCBjaGFyICopKGlucHV0LT5zcmMpICsgaW5wdXQtPnBvcywgJnNpemVSZWFkLCB6c2ZfZ2F0aGVyKTsKKwlpbnB1dC0+cG9zICs9IHNpemVSZWFkOworCW91dHB1dC0+cG9zICs9IHNpemVXcml0dGVuOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qPT09PT09ICAgRmluYWxpemUgICA9PT09PT0qLworCisvKiEgWlNURF9mbHVzaFN0cmVhbSgpIDoKKyogICBAcmV0dXJuIDogYW1vdW50IG9mIGRhdGEgcmVtYWluaW5nIHRvIGZsdXNoICovCitzaXplX3QgWlNURF9mbHVzaFN0cmVhbShaU1REX0NTdHJlYW0gKnpjcywgWlNURF9vdXRCdWZmZXIgKm91dHB1dCkKK3sKKwlzaXplX3Qgc3JjU2l6ZSA9IDA7CisJc2l6ZV90IHNpemVXcml0dGVuID0gb3V0cHV0LT5zaXplIC0gb3V0cHV0LT5wb3M7CisJc2l6ZV90IGNvbnN0IHJlc3VsdCA9IFpTVERfY29tcHJlc3NTdHJlYW1fZ2VuZXJpYyh6Y3MsIChjaGFyICopKG91dHB1dC0+ZHN0KSArIG91dHB1dC0+cG9zLCAmc2l6ZVdyaXR0ZW4sICZzcmNTaXplLAorCQkJCQkJCSAgJnNyY1NpemUsIC8qIHVzZSBhIHZhbGlkIHNyYyBhZGRyZXNzIGluc3RlYWQgb2YgTlVMTCAqLworCQkJCQkJCSAgenNmX2ZsdXNoKTsKKwlvdXRwdXQtPnBvcyArPSBzaXplV3JpdHRlbjsKKwlpZiAoWlNURF9pc0Vycm9yKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisJcmV0dXJuIHpjcy0+b3V0QnVmZkNvbnRlbnRTaXplIC0gemNzLT5vdXRCdWZmRmx1c2hlZFNpemU7IC8qIHJlbWFpbmluZyB0byBmbHVzaCAqLworfQorCitzaXplX3QgWlNURF9lbmRTdHJlYW0oWlNURF9DU3RyZWFtICp6Y3MsIFpTVERfb3V0QnVmZmVyICpvdXRwdXQpCit7CisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKikob3V0cHV0LT5kc3QpICsgb3V0cHV0LT5wb3M7CisJQllURSAqY29uc3Qgb2VuZCA9IChCWVRFICopKG91dHB1dC0+ZHN0KSArIG91dHB1dC0+c2l6ZTsKKwlCWVRFICpvcCA9IG9zdGFydDsKKworCWlmICgoemNzLT5wbGVkZ2VkU3JjU2l6ZSkgJiYgKHpjcy0+aW5wdXRQcm9jZXNzZWQgIT0gemNzLT5wbGVkZ2VkU3JjU2l6ZSkpCisJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsgLyogcGxlZGdlZFNyY1NpemUgbm90IHJlc3BlY3RlZCAqLworCisJaWYgKHpjcy0+c3RhZ2UgIT0gemNzc19maW5hbCkgeworCQkvKiBmbHVzaCB3aGF0ZXZlciByZW1haW5zICovCisJCXNpemVfdCBzcmNTaXplID0gMDsKKwkJc2l6ZV90IHNpemVXcml0dGVuID0gb3V0cHV0LT5zaXplIC0gb3V0cHV0LT5wb3M7CisJCXNpemVfdCBjb25zdCBub3RFbmRlZCA9CisJCSAgICBaU1REX2NvbXByZXNzU3RyZWFtX2dlbmVyaWMoemNzLCBvc3RhcnQsICZzaXplV3JpdHRlbiwgJnNyY1NpemUsICZzcmNTaXplLCB6c2ZfZW5kKTsgLyogdXNlIGEgdmFsaWQgc3JjIGFkZHJlc3MgaW5zdGVhZCBvZiBOVUxMICovCisJCXNpemVfdCBjb25zdCByZW1haW5pbmdUb0ZsdXNoID0gemNzLT5vdXRCdWZmQ29udGVudFNpemUgLSB6Y3MtPm91dEJ1ZmZGbHVzaGVkU2l6ZTsKKwkJb3AgKz0gc2l6ZVdyaXR0ZW47CisJCWlmIChyZW1haW5pbmdUb0ZsdXNoKSB7CisJCQlvdXRwdXQtPnBvcyArPSBzaXplV3JpdHRlbjsKKwkJCXJldHVybiByZW1haW5pbmdUb0ZsdXNoICsgWlNURF9CTE9DS0hFQURFUlNJWkUgLyogZmluYWwgZW1wdHkgYmxvY2sgKi8gKyAoemNzLT5jaGVja3N1bSAqIDQpOworCQl9CisJCS8qIGNyZWF0ZSBlcGlsb2d1ZSAqLworCQl6Y3MtPnN0YWdlID0gemNzc19maW5hbDsKKwkJemNzLT5vdXRCdWZmQ29udGVudFNpemUgPSAhbm90RW5kZWQgPyAwIDogWlNURF9jb21wcmVzc0VuZCh6Y3MtPmNjdHgsIHpjcy0+b3V0QnVmZiwgemNzLT5vdXRCdWZmU2l6ZSwgTlVMTCwKKwkJCQkJCQkJCSAgIDApOyAvKiB3cml0ZSBlcGlsb2d1ZSwgaW5jbHVkaW5nIGZpbmFsIGVtcHR5IGJsb2NrLCBpbnRvIG91dEJ1ZmYgKi8KKwl9CisKKwkvKiBmbHVzaCBlcGlsb2d1ZSAqLworCXsKKwkJc2l6ZV90IGNvbnN0IHRvRmx1c2ggPSB6Y3MtPm91dEJ1ZmZDb250ZW50U2l6ZSAtIHpjcy0+b3V0QnVmZkZsdXNoZWRTaXplOworCQlzaXplX3QgY29uc3QgZmx1c2hlZCA9IFpTVERfbGltaXRDb3B5KG9wLCBvZW5kIC0gb3AsIHpjcy0+b3V0QnVmZiArIHpjcy0+b3V0QnVmZkZsdXNoZWRTaXplLCB0b0ZsdXNoKTsKKwkJb3AgKz0gZmx1c2hlZDsKKwkJemNzLT5vdXRCdWZmRmx1c2hlZFNpemUgKz0gZmx1c2hlZDsKKwkJb3V0cHV0LT5wb3MgKz0gb3AgLSBvc3RhcnQ7CisJCWlmICh0b0ZsdXNoID09IGZsdXNoZWQpCisJCQl6Y3MtPnN0YWdlID0gemNzc19pbml0OyAvKiBlbmQgcmVhY2hlZCAqLworCQlyZXR1cm4gdG9GbHVzaCAtIGZsdXNoZWQ7CisJfQorfQorCisvKi09PT09PSAgUHJlLWRlZmluZWQgY29tcHJlc3Npb24gbGV2ZWxzICA9PT09PS0qLworCisjZGVmaW5lIFpTVERfREVGQVVMVF9DTEVWRUwgMQorI2RlZmluZSBaU1REX01BWF9DTEVWRUwgMjIKK2ludCBaU1REX21heENMZXZlbCh2b2lkKSB7IHJldHVybiBaU1REX01BWF9DTEVWRUw7IH0KKworc3RhdGljIGNvbnN0IFpTVERfY29tcHJlc3Npb25QYXJhbWV0ZXJzIFpTVERfZGVmYXVsdENQYXJhbWV0ZXJzWzRdW1pTVERfTUFYX0NMRVZFTCArIDFdID0geworICAgIHsKKwkvKiAiZGVmYXVsdCIgKi8KKwkvKiBXLCAgQywgIEgsICBTLCAgTCwgVEwsIHN0cmF0ICovCisJezE4LCAxMiwgMTIsIDEsIDcsIDE2LCBaU1REX2Zhc3R9LCAgICAvKiBsZXZlbCAgMCAtIG5ldmVyIHVzZWQgKi8KKwl7MTksIDEzLCAxNCwgMSwgNywgMTYsIFpTVERfZmFzdH0sICAgIC8qIGxldmVsICAxICovCisJezE5LCAxNSwgMTYsIDEsIDYsIDE2LCBaU1REX2Zhc3R9LCAgICAvKiBsZXZlbCAgMiAqLworCXsyMCwgMTYsIDE3LCAxLCA1LCAxNiwgWlNURF9kZmFzdH0sICAgLyogbGV2ZWwgIDMuKi8KKwl7MjAsIDE4LCAxOCwgMSwgNSwgMTYsIFpTVERfZGZhc3R9LCAgIC8qIGxldmVsICA0LiovCisJezIwLCAxNSwgMTgsIDMsIDUsIDE2LCBaU1REX2dyZWVkeX0sICAvKiBsZXZlbCAgNSAqLworCXsyMSwgMTYsIDE5LCAyLCA1LCAxNiwgWlNURF9sYXp5fSwgICAgLyogbGV2ZWwgIDYgKi8KKwl7MjEsIDE3LCAyMCwgMywgNSwgMTYsIFpTVERfbGF6eX0sICAgIC8qIGxldmVsICA3ICovCisJezIxLCAxOCwgMjAsIDMsIDUsIDE2LCBaU1REX2xhenkyfSwgICAvKiBsZXZlbCAgOCAqLworCXsyMSwgMjAsIDIwLCAzLCA1LCAxNiwgWlNURF9sYXp5Mn0sICAgLyogbGV2ZWwgIDkgKi8KKwl7MjEsIDE5LCAyMSwgNCwgNSwgMTYsIFpTVERfbGF6eTJ9LCAgIC8qIGxldmVsIDEwICovCisJezIyLCAyMCwgMjIsIDQsIDUsIDE2LCBaU1REX2xhenkyfSwgICAvKiBsZXZlbCAxMSAqLworCXsyMiwgMjAsIDIyLCA1LCA1LCAxNiwgWlNURF9sYXp5Mn0sICAgLyogbGV2ZWwgMTIgKi8KKwl7MjIsIDIxLCAyMiwgNSwgNSwgMTYsIFpTVERfbGF6eTJ9LCAgIC8qIGxldmVsIDEzICovCisJezIyLCAyMSwgMjIsIDYsIDUsIDE2LCBaU1REX2xhenkyfSwgICAvKiBsZXZlbCAxNCAqLworCXsyMiwgMjEsIDIxLCA1LCA1LCAxNiwgWlNURF9idGxhenkyfSwgLyogbGV2ZWwgMTUgKi8KKwl7MjMsIDIyLCAyMiwgNSwgNSwgMTYsIFpTVERfYnRsYXp5Mn0sIC8qIGxldmVsIDE2ICovCisJezIzLCAyMSwgMjIsIDQsIDUsIDI0LCBaU1REX2J0b3B0fSwgICAvKiBsZXZlbCAxNyAqLworCXsyMywgMjMsIDIyLCA2LCA1LCAzMiwgWlNURF9idG9wdH0sICAgLyogbGV2ZWwgMTggKi8KKwl7MjMsIDIzLCAyMiwgNiwgMywgNDgsIFpTVERfYnRvcHR9LCAgIC8qIGxldmVsIDE5ICovCisJezI1LCAyNSwgMjMsIDcsIDMsIDY0LCBaU1REX2J0b3B0Mn0sICAvKiBsZXZlbCAyMCAqLworCXsyNiwgMjYsIDIzLCA3LCAzLCAyNTYsIFpTVERfYnRvcHQyfSwgLyogbGV2ZWwgMjEgKi8KKwl7MjcsIDI3LCAyNSwgOSwgMywgNTEyLCBaU1REX2J0b3B0Mn0sIC8qIGxldmVsIDIyICovCisgICAgfSwKKyAgICB7CisJLyogZm9yIHNyY1NpemUgPD0gMjU2IEtCICovCisJLyogVywgIEMsICBILCAgUywgIEwsICBULCBzdHJhdCAqLworCXswLCAwLCAwLCAwLCAwLCAwLCBaU1REX2Zhc3R9LAkgLyogbGV2ZWwgIDAgLSBub3QgdXNlZCAqLworCXsxOCwgMTMsIDE0LCAxLCA2LCA4LCBaU1REX2Zhc3R9LCAgICAgIC8qIGxldmVsICAxICovCisJezE4LCAxNCwgMTMsIDEsIDUsIDgsIFpTVERfZGZhc3R9LCAgICAgLyogbGV2ZWwgIDIgKi8KKwl7MTgsIDE2LCAxNSwgMSwgNSwgOCwgWlNURF9kZmFzdH0sICAgICAvKiBsZXZlbCAgMyAqLworCXsxOCwgMTUsIDE3LCAxLCA1LCA4LCBaU1REX2dyZWVkeX0sICAgIC8qIGxldmVsICA0LiovCisJezE4LCAxNiwgMTcsIDQsIDUsIDgsIFpTVERfZ3JlZWR5fSwgICAgLyogbGV2ZWwgIDUuKi8KKwl7MTgsIDE2LCAxNywgMywgNSwgOCwgWlNURF9sYXp5fSwgICAgICAvKiBsZXZlbCAgNi4qLworCXsxOCwgMTcsIDE3LCA0LCA0LCA4LCBaU1REX2xhenl9LCAgICAgIC8qIGxldmVsICA3ICovCisJezE4LCAxNywgMTcsIDQsIDQsIDgsIFpTVERfbGF6eTJ9LCAgICAgLyogbGV2ZWwgIDggKi8KKwl7MTgsIDE3LCAxNywgNSwgNCwgOCwgWlNURF9sYXp5Mn0sICAgICAvKiBsZXZlbCAgOSAqLworCXsxOCwgMTcsIDE3LCA2LCA0LCA4LCBaU1REX2xhenkyfSwgICAgIC8qIGxldmVsIDEwICovCisJezE4LCAxOCwgMTcsIDYsIDQsIDgsIFpTVERfbGF6eTJ9LCAgICAgLyogbGV2ZWwgMTEuKi8KKwl7MTgsIDE4LCAxNywgNywgNCwgOCwgWlNURF9sYXp5Mn0sICAgICAvKiBsZXZlbCAxMi4qLworCXsxOCwgMTksIDE3LCA2LCA0LCA4LCBaU1REX2J0bGF6eTJ9LCAgIC8qIGxldmVsIDEzICovCisJezE4LCAxOCwgMTgsIDQsIDQsIDE2LCBaU1REX2J0b3B0fSwgICAgLyogbGV2ZWwgMTQuKi8KKwl7MTgsIDE4LCAxOCwgNCwgMywgMTYsIFpTVERfYnRvcHR9LCAgICAvKiBsZXZlbCAxNS4qLworCXsxOCwgMTksIDE4LCA2LCAzLCAzMiwgWlNURF9idG9wdH0sICAgIC8qIGxldmVsIDE2LiovCisJezE4LCAxOSwgMTgsIDgsIDMsIDY0LCBaU1REX2J0b3B0fSwgICAgLyogbGV2ZWwgMTcuKi8KKwl7MTgsIDE5LCAxOCwgOSwgMywgMTI4LCBaU1REX2J0b3B0fSwgICAvKiBsZXZlbCAxOC4qLworCXsxOCwgMTksIDE4LCAxMCwgMywgMjU2LCBaU1REX2J0b3B0fSwgIC8qIGxldmVsIDE5LiovCisJezE4LCAxOSwgMTgsIDExLCAzLCA1MTIsIFpTVERfYnRvcHQyfSwgLyogbGV2ZWwgMjAuKi8KKwl7MTgsIDE5LCAxOCwgMTIsIDMsIDUxMiwgWlNURF9idG9wdDJ9LCAvKiBsZXZlbCAyMS4qLworCXsxOCwgMTksIDE4LCAxMywgMywgNTEyLCBaU1REX2J0b3B0Mn0sIC8qIGxldmVsIDIyLiovCisgICAgfSwKKyAgICB7CisJLyogZm9yIHNyY1NpemUgPD0gMTI4IEtCICovCisJLyogVywgIEMsICBILCAgUywgIEwsICBULCBzdHJhdCAqLworCXsxNywgMTIsIDEyLCAxLCA3LCA4LCBaU1REX2Zhc3R9LCAgICAgIC8qIGxldmVsICAwIC0gbm90IHVzZWQgKi8KKwl7MTcsIDEyLCAxMywgMSwgNiwgOCwgWlNURF9mYXN0fSwgICAgICAvKiBsZXZlbCAgMSAqLworCXsxNywgMTMsIDE2LCAxLCA1LCA4LCBaU1REX2Zhc3R9LCAgICAgIC8qIGxldmVsICAyICovCisJezE3LCAxNiwgMTYsIDIsIDUsIDgsIFpTVERfZGZhc3R9LCAgICAgLyogbGV2ZWwgIDMgKi8KKwl7MTcsIDEzLCAxNSwgMywgNCwgOCwgWlNURF9ncmVlZHl9LCAgICAvKiBsZXZlbCAgNCAqLworCXsxNywgMTUsIDE3LCA0LCA0LCA4LCBaU1REX2dyZWVkeX0sICAgIC8qIGxldmVsICA1ICovCisJezE3LCAxNiwgMTcsIDMsIDQsIDgsIFpTVERfbGF6eX0sICAgICAgLyogbGV2ZWwgIDYgKi8KKwl7MTcsIDE1LCAxNywgNCwgNCwgOCwgWlNURF9sYXp5Mn0sICAgICAvKiBsZXZlbCAgNyAqLworCXsxNywgMTcsIDE3LCA0LCA0LCA4LCBaU1REX2xhenkyfSwgICAgIC8qIGxldmVsICA4ICovCisJezE3LCAxNywgMTcsIDUsIDQsIDgsIFpTVERfbGF6eTJ9LCAgICAgLyogbGV2ZWwgIDkgKi8KKwl7MTcsIDE3LCAxNywgNiwgNCwgOCwgWlNURF9sYXp5Mn0sICAgICAvKiBsZXZlbCAxMCAqLworCXsxNywgMTcsIDE3LCA3LCA0LCA4LCBaU1REX2xhenkyfSwgICAgIC8qIGxldmVsIDExICovCisJezE3LCAxNywgMTcsIDgsIDQsIDgsIFpTVERfbGF6eTJ9LCAgICAgLyogbGV2ZWwgMTIgKi8KKwl7MTcsIDE4LCAxNywgNiwgNCwgOCwgWlNURF9idGxhenkyfSwgICAvKiBsZXZlbCAxMy4qLworCXsxNywgMTcsIDE3LCA3LCAzLCA4LCBaU1REX2J0b3B0fSwgICAgIC8qIGxldmVsIDE0LiovCisJezE3LCAxNywgMTcsIDcsIDMsIDE2LCBaU1REX2J0b3B0fSwgICAgLyogbGV2ZWwgMTUuKi8KKwl7MTcsIDE4LCAxNywgNywgMywgMzIsIFpTVERfYnRvcHR9LCAgICAvKiBsZXZlbCAxNi4qLworCXsxNywgMTgsIDE3LCA3LCAzLCA2NCwgWlNURF9idG9wdH0sICAgIC8qIGxldmVsIDE3LiovCisJezE3LCAxOCwgMTcsIDcsIDMsIDI1NiwgWlNURF9idG9wdH0sICAgLyogbGV2ZWwgMTguKi8KKwl7MTcsIDE4LCAxNywgOCwgMywgMjU2LCBaU1REX2J0b3B0fSwgICAvKiBsZXZlbCAxOS4qLworCXsxNywgMTgsIDE3LCA5LCAzLCAyNTYsIFpTVERfYnRvcHQyfSwgIC8qIGxldmVsIDIwLiovCisJezE3LCAxOCwgMTcsIDEwLCAzLCAyNTYsIFpTVERfYnRvcHQyfSwgLyogbGV2ZWwgMjEuKi8KKwl7MTcsIDE4LCAxNywgMTEsIDMsIDUxMiwgWlNURF9idG9wdDJ9LCAvKiBsZXZlbCAyMi4qLworICAgIH0sCisgICAgeworCS8qIGZvciBzcmNTaXplIDw9IDE2IEtCICovCisJLyogVywgIEMsICBILCAgUywgIEwsICBULCBzdHJhdCAqLworCXsxNCwgMTIsIDEyLCAxLCA3LCA2LCBaU1REX2Zhc3R9LCAgICAgIC8qIGxldmVsICAwIC0gbm90IHVzZWQgKi8KKwl7MTQsIDE0LCAxNCwgMSwgNiwgNiwgWlNURF9mYXN0fSwgICAgICAvKiBsZXZlbCAgMSAqLworCXsxNCwgMTQsIDE0LCAxLCA0LCA2LCBaU1REX2Zhc3R9LCAgICAgIC8qIGxldmVsICAyICovCisJezE0LCAxNCwgMTQsIDEsIDQsIDYsIFpTVERfZGZhc3R9LCAgICAgLyogbGV2ZWwgIDMuKi8KKwl7MTQsIDE0LCAxNCwgNCwgNCwgNiwgWlNURF9ncmVlZHl9LCAgICAvKiBsZXZlbCAgNC4qLworCXsxNCwgMTQsIDE0LCAzLCA0LCA2LCBaU1REX2xhenl9LCAgICAgIC8qIGxldmVsICA1LiovCisJezE0LCAxNCwgMTQsIDQsIDQsIDYsIFpTVERfbGF6eTJ9LCAgICAgLyogbGV2ZWwgIDYgKi8KKwl7MTQsIDE0LCAxNCwgNSwgNCwgNiwgWlNURF9sYXp5Mn0sICAgICAvKiBsZXZlbCAgNyAqLworCXsxNCwgMTQsIDE0LCA2LCA0LCA2LCBaU1REX2xhenkyfSwgICAgIC8qIGxldmVsICA4LiovCisJezE0LCAxNSwgMTQsIDYsIDQsIDYsIFpTVERfYnRsYXp5Mn0sICAgLyogbGV2ZWwgIDkuKi8KKwl7MTQsIDE1LCAxNCwgMywgMywgNiwgWlNURF9idG9wdH0sICAgICAvKiBsZXZlbCAxMC4qLworCXsxNCwgMTUsIDE0LCA2LCAzLCA4LCBaU1REX2J0b3B0fSwgICAgIC8qIGxldmVsIDExLiovCisJezE0LCAxNSwgMTQsIDYsIDMsIDE2LCBaU1REX2J0b3B0fSwgICAgLyogbGV2ZWwgMTIuKi8KKwl7MTQsIDE1LCAxNCwgNiwgMywgMjQsIFpTVERfYnRvcHR9LCAgICAvKiBsZXZlbCAxMy4qLworCXsxNCwgMTUsIDE1LCA2LCAzLCA0OCwgWlNURF9idG9wdH0sICAgIC8qIGxldmVsIDE0LiovCisJezE0LCAxNSwgMTUsIDYsIDMsIDY0LCBaU1REX2J0b3B0fSwgICAgLyogbGV2ZWwgMTUuKi8KKwl7MTQsIDE1LCAxNSwgNiwgMywgOTYsIFpTVERfYnRvcHR9LCAgICAvKiBsZXZlbCAxNi4qLworCXsxNCwgMTUsIDE1LCA2LCAzLCAxMjgsIFpTVERfYnRvcHR9LCAgIC8qIGxldmVsIDE3LiovCisJezE0LCAxNSwgMTUsIDYsIDMsIDI1NiwgWlNURF9idG9wdH0sICAgLyogbGV2ZWwgMTguKi8KKwl7MTQsIDE1LCAxNSwgNywgMywgMjU2LCBaU1REX2J0b3B0fSwgICAvKiBsZXZlbCAxOS4qLworCXsxNCwgMTUsIDE1LCA4LCAzLCAyNTYsIFpTVERfYnRvcHQyfSwgIC8qIGxldmVsIDIwLiovCisJezE0LCAxNSwgMTUsIDksIDMsIDI1NiwgWlNURF9idG9wdDJ9LCAgLyogbGV2ZWwgMjEuKi8KKwl7MTQsIDE1LCAxNSwgMTAsIDMsIDI1NiwgWlNURF9idG9wdDJ9LCAvKiBsZXZlbCAyMi4qLworICAgIH0sCit9OworCisvKiEgWlNURF9nZXRDUGFyYW1zKCkgOgorKiAgIEByZXR1cm4gWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgc3RydWN0dXJlIGZvciBhIHNlbGVjdGVkIGNvbXByZXNzaW9uIGxldmVsLCBgc3JjU2l6ZWAgYW5kIGBkaWN0U2l6ZWAuCisqICAgU2l6ZSB2YWx1ZXMgYXJlIG9wdGlvbmFsLCBwcm92aWRlIDAgaWYgbm90IGtub3duIG9yIHVudXNlZCAqLworWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgWlNURF9nZXRDUGFyYW1zKGludCBjb21wcmVzc2lvbkxldmVsLCB1bnNpZ25lZCBsb25nIGxvbmcgc3JjU2l6ZSwgc2l6ZV90IGRpY3RTaXplKQoreworCVpTVERfY29tcHJlc3Npb25QYXJhbWV0ZXJzIGNwOworCXNpemVfdCBjb25zdCBhZGRlZFNpemUgPSBzcmNTaXplID8gMCA6IDUwMDsKKwlVNjQgY29uc3QgclNpemUgPSBzcmNTaXplICsgZGljdFNpemUgPyBzcmNTaXplICsgZGljdFNpemUgKyBhZGRlZFNpemUgOiAoVTY0KS0xOworCVUzMiBjb25zdCB0YWJsZUlEID0gKHJTaXplIDw9IDI1NiBLQikgKyAoclNpemUgPD0gMTI4IEtCKSArIChyU2l6ZSA8PSAxNiBLQik7IC8qIGludGVudGlvbmFsIHVuZGVyZmxvdyBmb3Igc3JjU2l6ZUhpbnQgPT0gMCAqLworCWlmIChjb21wcmVzc2lvbkxldmVsIDw9IDApCisJCWNvbXByZXNzaW9uTGV2ZWwgPSBaU1REX0RFRkFVTFRfQ0xFVkVMOyAvKiAwID09IGRlZmF1bHQ7IG5vIG5lZ2F0aXZlIGNvbXByZXNzaW9uTGV2ZWwgeWV0ICovCisJaWYgKGNvbXByZXNzaW9uTGV2ZWwgPiBaU1REX01BWF9DTEVWRUwpCisJCWNvbXByZXNzaW9uTGV2ZWwgPSBaU1REX01BWF9DTEVWRUw7CisJY3AgPSBaU1REX2RlZmF1bHRDUGFyYW1ldGVyc1t0YWJsZUlEXVtjb21wcmVzc2lvbkxldmVsXTsKKwlpZiAoWlNURF8zMmJpdHMoKSkgeyAvKiBhdXRvLWNvcnJlY3Rpb24sIGZvciAzMi1iaXRzIG1vZGUgKi8KKwkJaWYgKGNwLndpbmRvd0xvZyA+IFpTVERfV0lORE9XTE9HX01BWCkKKwkJCWNwLndpbmRvd0xvZyA9IFpTVERfV0lORE9XTE9HX01BWDsKKwkJaWYgKGNwLmNoYWluTG9nID4gWlNURF9DSEFJTkxPR19NQVgpCisJCQljcC5jaGFpbkxvZyA9IFpTVERfQ0hBSU5MT0dfTUFYOworCQlpZiAoY3AuaGFzaExvZyA+IFpTVERfSEFTSExPR19NQVgpCisJCQljcC5oYXNoTG9nID0gWlNURF9IQVNITE9HX01BWDsKKwl9CisJY3AgPSBaU1REX2FkanVzdENQYXJhbXMoY3AsIHNyY1NpemUsIGRpY3RTaXplKTsKKwlyZXR1cm4gY3A7Cit9CisKKy8qISBaU1REX2dldFBhcmFtcygpIDoKKyogICBzYW1lIGFzIFpTVERfZ2V0Q1BhcmFtcygpLCBidXQgQHJldHVybiBhIGBaU1REX3BhcmFtZXRlcnNgIG9iamVjdCAoaW5zdGVhZCBvZiBgWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnNgKS4KKyogICBBbGwgZmllbGRzIG9mIGBaU1REX2ZyYW1lUGFyYW1ldGVyc2AgYXJlIHNldCB0byBkZWZhdWx0ICgwKSAqLworWlNURF9wYXJhbWV0ZXJzIFpTVERfZ2V0UGFyYW1zKGludCBjb21wcmVzc2lvbkxldmVsLCB1bnNpZ25lZCBsb25nIGxvbmcgc3JjU2l6ZSwgc2l6ZV90IGRpY3RTaXplKQoreworCVpTVERfcGFyYW1ldGVycyBwYXJhbXM7CisJWlNURF9jb21wcmVzc2lvblBhcmFtZXRlcnMgY29uc3QgY1BhcmFtcyA9IFpTVERfZ2V0Q1BhcmFtcyhjb21wcmVzc2lvbkxldmVsLCBzcmNTaXplLCBkaWN0U2l6ZSk7CisJbWVtc2V0KCZwYXJhbXMsIDAsIHNpemVvZihwYXJhbXMpKTsKKwlwYXJhbXMuY1BhcmFtcyA9IGNQYXJhbXM7CisJcmV0dXJuIHBhcmFtczsKK30KKworRVhQT1JUX1NZTUJPTChaU1REX21heENMZXZlbCk7CitFWFBPUlRfU1lNQk9MKFpTVERfY29tcHJlc3NCb3VuZCk7CisKK0VYUE9SVF9TWU1CT0woWlNURF9DQ3R4V29ya3NwYWNlQm91bmQpOworRVhQT1JUX1NZTUJPTChaU1REX2luaXRDQ3R4KTsKK0VYUE9SVF9TWU1CT0woWlNURF9jb21wcmVzc0NDdHgpOworRVhQT1JUX1NZTUJPTChaU1REX2NvbXByZXNzX3VzaW5nRGljdCk7CisKK0VYUE9SVF9TWU1CT0woWlNURF9DRGljdFdvcmtzcGFjZUJvdW5kKTsKK0VYUE9SVF9TWU1CT0woWlNURF9pbml0Q0RpY3QpOworRVhQT1JUX1NZTUJPTChaU1REX2NvbXByZXNzX3VzaW5nQ0RpY3QpOworCitFWFBPUlRfU1lNQk9MKFpTVERfQ1N0cmVhbVdvcmtzcGFjZUJvdW5kKTsKK0VYUE9SVF9TWU1CT0woWlNURF9pbml0Q1N0cmVhbSk7CitFWFBPUlRfU1lNQk9MKFpTVERfaW5pdENTdHJlYW1fdXNpbmdDRGljdCk7CitFWFBPUlRfU1lNQk9MKFpTVERfcmVzZXRDU3RyZWFtKTsKK0VYUE9SVF9TWU1CT0woWlNURF9jb21wcmVzc1N0cmVhbSk7CitFWFBPUlRfU1lNQk9MKFpTVERfZmx1c2hTdHJlYW0pOworRVhQT1JUX1NZTUJPTChaU1REX2VuZFN0cmVhbSk7CitFWFBPUlRfU1lNQk9MKFpTVERfQ1N0cmVhbUluU2l6ZSk7CitFWFBPUlRfU1lNQk9MKFpTVERfQ1N0cmVhbU91dFNpemUpOworCitFWFBPUlRfU1lNQk9MKFpTVERfZ2V0Q1BhcmFtcyk7CitFWFBPUlRfU1lNQk9MKFpTVERfZ2V0UGFyYW1zKTsKK0VYUE9SVF9TWU1CT0woWlNURF9jaGVja0NQYXJhbXMpOworRVhQT1JUX1NZTUJPTChaU1REX2FkanVzdENQYXJhbXMpOworCitFWFBPUlRfU1lNQk9MKFpTVERfY29tcHJlc3NCZWdpbik7CitFWFBPUlRfU1lNQk9MKFpTVERfY29tcHJlc3NCZWdpbl91c2luZ0RpY3QpOworRVhQT1JUX1NZTUJPTChaU1REX2NvbXByZXNzQmVnaW5fYWR2YW5jZWQpOworRVhQT1JUX1NZTUJPTChaU1REX2NvcHlDQ3R4KTsKK0VYUE9SVF9TWU1CT0woWlNURF9jb21wcmVzc0JlZ2luX3VzaW5nQ0RpY3QpOworRVhQT1JUX1NZTUJPTChaU1REX2NvbXByZXNzQ29udGludWUpOworRVhQT1JUX1NZTUJPTChaU1REX2NvbXByZXNzRW5kKTsKKworRVhQT1JUX1NZTUJPTChaU1REX2dldEJsb2NrU2l6ZU1heCk7CitFWFBPUlRfU1lNQk9MKFpTVERfY29tcHJlc3NCbG9jayk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWnN0ZCBDb21wcmVzc29yIik7CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2RlY29tcHJlc3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZGVjb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNzg0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2RlY29tcHJlc3MuYwpAQCAtMCwwICsxLDI1MjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIFlhbm4gQ29sbGV0LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3pzdGQuCisgKiBBbiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlCisgKiBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QKKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UKKyAqICgiQlNEIikuCisgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBUdW5pbmcgcGFyYW1ldGVycworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKKyogIE1BWFdJTkRPV1NJWkVfREVGQVVMVCA6CisqICBtYXhpbXVtIHdpbmRvdyBzaXplIGFjY2VwdGVkIGJ5IERTdHJlYW0sIGJ5IGRlZmF1bHQuCisqICBGcmFtZXMgcmVxdWlyaW5nIG1vcmUgbWVtb3J5IHdpbGwgYmUgcmVqZWN0ZWQuCisqLworI2lmbmRlZiBaU1REX01BWFdJTkRPV1NJWkVfREVGQVVMVAorI2RlZmluZSBaU1REX01BWFdJTkRPV1NJWkVfREVGQVVMVCAoKDEgPDwgWlNURF9XSU5ET1dMT0dfTUFYKSArIDEpIC8qIGRlZmluZWQgd2l0aGluIHpzdGQuaCAqLworI2VuZGlmCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIERlcGVuZGVuY2llcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImZzZS5oIgorI2luY2x1ZGUgImh1Zi5oIgorI2luY2x1ZGUgIm1lbS5oIiAvKiBsb3cgbGV2ZWwgbWVtb3J5IHJvdXRpbmVzICovCisjaW5jbHVkZSAienN0ZF9pbnRlcm5hbC5oIgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1jcHksIG1lbW1vdmUsIG1lbXNldCAqLworCisjZGVmaW5lIFpTVERfUFJFRkVUQ0gocHRyKSBfX2J1aWx0aW5fcHJlZmV0Y2gocHRyLCAwLCAwKQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBNYWNyb3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgWlNURF9pc0Vycm9yIEVSUl9pc0Vycm9yIC8qIGZvciBpbmxpbmluZyAqLworI2RlZmluZSBGU0VfaXNFcnJvciBFUlJfaXNFcnJvcgorI2RlZmluZSBIVUZfaXNFcnJvciBFUlJfaXNFcnJvcgorCisvKl8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBNZW1vcnkgb3BlcmF0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIFpTVERfY29weTQodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMpIHsgbWVtY3B5KGRzdCwgc3JjLCA0KTsgfQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgQ29udGV4dCBtYW5hZ2VtZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIGVudW0geworCVpTVERkc19nZXRGcmFtZUhlYWRlclNpemUsCisJWlNURGRzX2RlY29kZUZyYW1lSGVhZGVyLAorCVpTVERkc19kZWNvZGVCbG9ja0hlYWRlciwKKwlaU1REZHNfZGVjb21wcmVzc0Jsb2NrLAorCVpTVERkc19kZWNvbXByZXNzTGFzdEJsb2NrLAorCVpTVERkc19jaGVja0NoZWNrc3VtLAorCVpTVERkc19kZWNvZGVTa2lwcGFibGVIZWFkZXIsCisJWlNURGRzX3NraXBGcmFtZQorfSBaU1REX2RTdGFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUZTRV9EVGFibGUgTExUYWJsZVtGU0VfRFRBQkxFX1NJWkVfVTMyKExMRlNFTG9nKV07CisJRlNFX0RUYWJsZSBPRlRhYmxlW0ZTRV9EVEFCTEVfU0laRV9VMzIoT2ZmRlNFTG9nKV07CisJRlNFX0RUYWJsZSBNTFRhYmxlW0ZTRV9EVEFCTEVfU0laRV9VMzIoTUxGU0VMb2cpXTsKKwlIVUZfRFRhYmxlIGh1ZlRhYmxlW0hVRl9EVEFCTEVfU0laRShIdWZMb2cpXTsgLyogY2FuIGFjY29tbW9kYXRlIEhVRl9kZWNvbXByZXNzNFggKi8KKwlVNjQgd29ya3NwYWNlW0hVRl9ERUNPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiAvIDJdOworCVUzMiByZXBbWlNURF9SRVBfTlVNXTsKK30gWlNURF9lbnRyb3B5VGFibGVzX3Q7CisKK3N0cnVjdCBaU1REX0RDdHhfcyB7CisJY29uc3QgRlNFX0RUYWJsZSAqTExUcHRyOworCWNvbnN0IEZTRV9EVGFibGUgKk1MVHB0cjsKKwljb25zdCBGU0VfRFRhYmxlICpPRlRwdHI7CisJY29uc3QgSFVGX0RUYWJsZSAqSFVGcHRyOworCVpTVERfZW50cm9weVRhYmxlc190IGVudHJvcHk7CisJY29uc3Qgdm9pZCAqcHJldmlvdXNEc3RFbmQ7IC8qIGRldGVjdCBjb250aW51aXR5ICovCisJY29uc3Qgdm9pZCAqYmFzZTsJICAgLyogc3RhcnQgb2YgY3VyciBzZWdtZW50ICovCisJY29uc3Qgdm9pZCAqdkJhc2U7CSAgLyogdmlydHVhbCBzdGFydCBvZiBwcmV2aW91cyBzZWdtZW50IGlmIGl0IHdhcyBqdXN0IGJlZm9yZSBjdXJyIG9uZSAqLworCWNvbnN0IHZvaWQgKmRpY3RFbmQ7CS8qIGVuZCBvZiBwcmV2aW91cyBzZWdtZW50ICovCisJc2l6ZV90IGV4cGVjdGVkOworCVpTVERfZnJhbWVQYXJhbXMgZlBhcmFtczsKKwlibG9ja1R5cGVfZSBiVHlwZTsgLyogdXNlZCBpbiBaU1REX2RlY29tcHJlc3NDb250aW51ZSgpLCB0byB0cmFuc2ZlciBibG9ja1R5cGUgYmV0d2VlbiBoZWFkZXIgZGVjb2RpbmcgYW5kIGJsb2NrIGRlY29kaW5nIHN0YWdlcyAqLworCVpTVERfZFN0YWdlIHN0YWdlOworCVUzMiBsaXRFbnRyb3B5OworCVUzMiBmc2VFbnRyb3B5OworCXN0cnVjdCB4eGg2NF9zdGF0ZSB4eGhTdGF0ZTsKKwlzaXplX3QgaGVhZGVyU2l6ZTsKKwlVMzIgZGljdElEOworCWNvbnN0IEJZVEUgKmxpdFB0cjsKKwlaU1REX2N1c3RvbU1lbSBjdXN0b21NZW07CisJc2l6ZV90IGxpdFNpemU7CisJc2l6ZV90IHJsZVNpemU7CisJQllURSBsaXRCdWZmZXJbWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVggKyBXSUxEQ09QWV9PVkVSTEVOR1RIXTsKKwlCWVRFIGhlYWRlckJ1ZmZlcltaU1REX0ZSQU1FSEVBREVSU0laRV9NQVhdOworfTsgLyogdHlwZWRlZidkIHRvIFpTVERfREN0eCB3aXRoaW4gInpzdGQuaCIgKi8KKworc2l6ZV90IFpTVERfREN0eFdvcmtzcGFjZUJvdW5kKHZvaWQpIHsgcmV0dXJuIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfc3RhY2spKSArIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfREN0eCkpOyB9CisKK3NpemVfdCBaU1REX2RlY29tcHJlc3NCZWdpbihaU1REX0RDdHggKmRjdHgpCit7CisJZGN0eC0+ZXhwZWN0ZWQgPSBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXg7CisJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZ2V0RnJhbWVIZWFkZXJTaXplOworCWRjdHgtPnByZXZpb3VzRHN0RW5kID0gTlVMTDsKKwlkY3R4LT5iYXNlID0gTlVMTDsKKwlkY3R4LT52QmFzZSA9IE5VTEw7CisJZGN0eC0+ZGljdEVuZCA9IE5VTEw7CisJZGN0eC0+ZW50cm9weS5odWZUYWJsZVswXSA9IChIVUZfRFRhYmxlKSgoSHVmTG9nKSoweDEwMDAwMDEpOyAvKiBjb3ZlciBib3RoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbiAqLworCWRjdHgtPmxpdEVudHJvcHkgPSBkY3R4LT5mc2VFbnRyb3B5ID0gMDsKKwlkY3R4LT5kaWN0SUQgPSAwOworCVpTVERfU1RBVElDX0FTU0VSVChzaXplb2YoZGN0eC0+ZW50cm9weS5yZXApID09IHNpemVvZihyZXBTdGFydFZhbHVlKSk7CisJbWVtY3B5KGRjdHgtPmVudHJvcHkucmVwLCByZXBTdGFydFZhbHVlLCBzaXplb2YocmVwU3RhcnRWYWx1ZSkpOyAvKiBpbml0aWFsIHJlcGNvZGVzICovCisJZGN0eC0+TExUcHRyID0gZGN0eC0+ZW50cm9weS5MTFRhYmxlOworCWRjdHgtPk1MVHB0ciA9IGRjdHgtPmVudHJvcHkuTUxUYWJsZTsKKwlkY3R4LT5PRlRwdHIgPSBkY3R4LT5lbnRyb3B5Lk9GVGFibGU7CisJZGN0eC0+SFVGcHRyID0gZGN0eC0+ZW50cm9weS5odWZUYWJsZTsKKwlyZXR1cm4gMDsKK30KKworWlNURF9EQ3R4ICpaU1REX2NyZWF0ZURDdHhfYWR2YW5jZWQoWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKQoreworCVpTVERfREN0eCAqZGN0eDsKKworCWlmICghY3VzdG9tTWVtLmN1c3RvbUFsbG9jIHx8ICFjdXN0b21NZW0uY3VzdG9tRnJlZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlkY3R4ID0gKFpTVERfREN0eCAqKVpTVERfbWFsbG9jKHNpemVvZihaU1REX0RDdHgpLCBjdXN0b21NZW0pOworCWlmICghZGN0eCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KCZkY3R4LT5jdXN0b21NZW0sICZjdXN0b21NZW0sIHNpemVvZihjdXN0b21NZW0pKTsKKwlaU1REX2RlY29tcHJlc3NCZWdpbihkY3R4KTsKKwlyZXR1cm4gZGN0eDsKK30KKworWlNURF9EQ3R4ICpaU1REX2luaXREQ3R4KHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJWlNURF9jdXN0b21NZW0gY29uc3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCXJldHVybiBaU1REX2NyZWF0ZURDdHhfYWR2YW5jZWQoc3RhY2tNZW0pOworfQorCitzaXplX3QgWlNURF9mcmVlREN0eChaU1REX0RDdHggKmRjdHgpCit7CisJaWYgKGRjdHggPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIHN1cHBvcnQgZnJlZSBvbiBOVUxMICovCisJWlNURF9mcmVlKGRjdHgsIGRjdHgtPmN1c3RvbU1lbSk7CisJcmV0dXJuIDA7IC8qIHJlc2VydmVkIGFzIGEgcG90ZW50aWFsIGVycm9yIGNvZGUgaW4gdGhlIGZ1dHVyZSAqLworfQorCit2b2lkIFpTVERfY29weURDdHgoWlNURF9EQ3R4ICpkc3REQ3R4LCBjb25zdCBaU1REX0RDdHggKnNyY0RDdHgpCit7CisJc2l6ZV90IGNvbnN0IHdvcmtTcGFjZVNpemUgPSAoWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVggKyBXSUxEQ09QWV9PVkVSTEVOR1RIKSArIFpTVERfZnJhbWVIZWFkZXJTaXplX21heDsKKwltZW1jcHkoZHN0REN0eCwgc3JjREN0eCwgc2l6ZW9mKFpTVERfREN0eCkgLSB3b3JrU3BhY2VTaXplKTsgLyogbm8gbmVlZCB0byBjb3B5IHdvcmtzcGFjZSAqLworfQorCitzdGF0aWMgdm9pZCBaU1REX3JlZkREaWN0KFpTVERfREN0eCAqZHN0REN0eCwgY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICAgRGVjb21wcmVzc2lvbiBzZWN0aW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qISBaU1REX2lzRnJhbWUoKSA6CisgKiAgVGVsbHMgaWYgdGhlIGNvbnRlbnQgb2YgYGJ1ZmZlcmAgc3RhcnRzIHdpdGggYSB2YWxpZCBGcmFtZSBJZGVudGlmaWVyLgorICogIE5vdGUgOiBGcmFtZSBJZGVudGlmaWVyIGlzIDQgYnl0ZXMuIElmIGBzaXplIDwgNGAsIEByZXR1cm4gd2lsbCBhbHdheXMgYmUgMC4KKyAqICBOb3RlIDIgOiBMZWdhY3kgRnJhbWUgSWRlbnRpZmllcnMgYXJlIGNvbnNpZGVyZWQgdmFsaWQgb25seSBpZiBMZWdhY3kgU3VwcG9ydCBpcyBlbmFibGVkLgorICogIE5vdGUgMyA6IFNraXBwYWJsZSBGcmFtZSBJZGVudGlmaWVycyBhcmUgY29uc2lkZXJlZCB2YWxpZC4gKi8KK3Vuc2lnbmVkIFpTVERfaXNGcmFtZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQoreworCWlmIChzaXplIDwgNCkKKwkJcmV0dXJuIDA7CisJeworCQlVMzIgY29uc3QgbWFnaWMgPSBaU1REX3JlYWRMRTMyKGJ1ZmZlcik7CisJCWlmIChtYWdpYyA9PSBaU1REX01BR0lDTlVNQkVSKQorCQkJcmV0dXJuIDE7CisJCWlmICgobWFnaWMgJiAweEZGRkZGRkYwVSkgPT0gWlNURF9NQUdJQ19TS0lQUEFCTEVfU1RBUlQpCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKiBaU1REX2ZyYW1lSGVhZGVyU2l6ZSgpIDoKKyogICBzcmNTaXplIG11c3QgYmUgPj0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4LgorKiAgIEByZXR1cm4gOiBzaXplIG9mIHRoZSBGcmFtZSBIZWFkZXIgKi8KK3N0YXRpYyBzaXplX3QgWlNURF9mcmFtZUhlYWRlclNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlpZiAoc3JjU2l6ZSA8IFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeCkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCXsKKwkJQllURSBjb25zdCBmaGQgPSAoKGNvbnN0IEJZVEUgKilzcmMpWzRdOworCQlVMzIgY29uc3QgZGljdElEID0gZmhkICYgMzsKKwkJVTMyIGNvbnN0IHNpbmdsZVNlZ21lbnQgPSAoZmhkID4+IDUpICYgMTsKKwkJVTMyIGNvbnN0IGZjc0lkID0gZmhkID4+IDY7CisJCXJldHVybiBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXggKyAhc2luZ2xlU2VnbWVudCArIFpTVERfZGlkX2ZpZWxkU2l6ZVtkaWN0SURdICsgWlNURF9mY3NfZmllbGRTaXplW2Zjc0lkXSArIChzaW5nbGVTZWdtZW50ICYmICFmY3NJZCk7CisJfQorfQorCisvKiogWlNURF9nZXRGcmFtZVBhcmFtcygpIDoKKyogICBkZWNvZGUgRnJhbWUgSGVhZGVyLCBvciByZXF1aXJlIGxhcmdlciBgc3JjU2l6ZWAuCisqICAgQHJldHVybiA6IDAsIGBmcGFyYW1zUHRyYCBpcyBjb3JyZWN0bHkgZmlsbGVkLAorKiAgICAgICAgICAgID4wLCBgc3JjU2l6ZWAgaXMgdG9vIHNtYWxsLCByZXN1bHQgaXMgZXhwZWN0ZWQgYHNyY1NpemVgLAorKiAgICAgICAgICAgICBvciBhbiBlcnJvciBjb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIFpTVERfaXNFcnJvcigpICovCitzaXplX3QgWlNURF9nZXRGcmFtZVBhcmFtcyhaU1REX2ZyYW1lUGFyYW1zICpmcGFyYW1zUHRyLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKilzcmM7CisKKwlpZiAoc3JjU2l6ZSA8IFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeCkKKwkJcmV0dXJuIFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeDsKKwlpZiAoWlNURF9yZWFkTEUzMihzcmMpICE9IFpTVERfTUFHSUNOVU1CRVIpIHsKKwkJaWYgKChaU1REX3JlYWRMRTMyKHNyYykgJiAweEZGRkZGRkYwVSkgPT0gWlNURF9NQUdJQ19TS0lQUEFCTEVfU1RBUlQpIHsKKwkJCWlmIChzcmNTaXplIDwgWlNURF9za2lwcGFibGVIZWFkZXJTaXplKQorCQkJCXJldHVybiBaU1REX3NraXBwYWJsZUhlYWRlclNpemU7IC8qIG1hZ2ljIG51bWJlciArIHNraXBwYWJsZSBmcmFtZSBsZW5ndGggKi8KKwkJCW1lbXNldChmcGFyYW1zUHRyLCAwLCBzaXplb2YoKmZwYXJhbXNQdHIpKTsKKwkJCWZwYXJhbXNQdHItPmZyYW1lQ29udGVudFNpemUgPSBaU1REX3JlYWRMRTMyKChjb25zdCBjaGFyICopc3JjICsgNCk7CisJCQlmcGFyYW1zUHRyLT53aW5kb3dTaXplID0gMDsgLyogd2luZG93U2l6ZT09MCBtZWFucyBhIGZyYW1lIGlzIHNraXBwYWJsZSAqLworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIEVSUk9SKHByZWZpeF91bmtub3duKTsKKwl9CisKKwkvKiBlbnN1cmUgdGhlcmUgaXMgZW5vdWdoIGBzcmNTaXplYCB0byBmdWxseSByZWFkL2RlY29kZSBmcmFtZSBoZWFkZXIgKi8KKwl7CisJCXNpemVfdCBjb25zdCBmaHNpemUgPSBaU1REX2ZyYW1lSGVhZGVyU2l6ZShzcmMsIHNyY1NpemUpOworCQlpZiAoc3JjU2l6ZSA8IGZoc2l6ZSkKKwkJCXJldHVybiBmaHNpemU7CisJfQorCisJeworCQlCWVRFIGNvbnN0IGZoZEJ5dGUgPSBpcFs0XTsKKwkJc2l6ZV90IHBvcyA9IDU7CisJCVUzMiBjb25zdCBkaWN0SURTaXplQ29kZSA9IGZoZEJ5dGUgJiAzOworCQlVMzIgY29uc3QgY2hlY2tzdW1GbGFnID0gKGZoZEJ5dGUgPj4gMikgJiAxOworCQlVMzIgY29uc3Qgc2luZ2xlU2VnbWVudCA9IChmaGRCeXRlID4+IDUpICYgMTsKKwkJVTMyIGNvbnN0IGZjc0lEID0gZmhkQnl0ZSA+PiA2OworCQlVMzIgY29uc3Qgd2luZG93U2l6ZU1heCA9IDFVIDw8IFpTVERfV0lORE9XTE9HX01BWDsKKwkJVTMyIHdpbmRvd1NpemUgPSAwOworCQlVMzIgZGljdElEID0gMDsKKwkJVTY0IGZyYW1lQ29udGVudFNpemUgPSAwOworCQlpZiAoKGZoZEJ5dGUgJiAweDA4KSAhPSAwKQorCQkJcmV0dXJuIEVSUk9SKGZyYW1lUGFyYW1ldGVyX3Vuc3VwcG9ydGVkKTsgLyogcmVzZXJ2ZWQgYml0cywgd2hpY2ggbXVzdCBiZSB6ZXJvICovCisJCWlmICghc2luZ2xlU2VnbWVudCkgeworCQkJQllURSBjb25zdCB3bEJ5dGUgPSBpcFtwb3MrK107CisJCQlVMzIgY29uc3Qgd2luZG93TG9nID0gKHdsQnl0ZSA+PiAzKSArIFpTVERfV0lORE9XTE9HX0FCU09MVVRFTUlOOworCQkJaWYgKHdpbmRvd0xvZyA+IFpTVERfV0lORE9XTE9HX01BWCkKKwkJCQlyZXR1cm4gRVJST1IoZnJhbWVQYXJhbWV0ZXJfd2luZG93VG9vTGFyZ2UpOyAvKiBhdm9pZHMgaXNzdWUgd2l0aCAxIDw8IHdpbmRvd0xvZyAqLworCQkJd2luZG93U2l6ZSA9ICgxVSA8PCB3aW5kb3dMb2cpOworCQkJd2luZG93U2l6ZSArPSAod2luZG93U2l6ZSA+PiAzKSAqICh3bEJ5dGUgJiA3KTsKKwkJfQorCisJCXN3aXRjaCAoZGljdElEU2l6ZUNvZGUpIHsKKwkJZGVmYXVsdDogLyogaW1wb3NzaWJsZSAqLworCQljYXNlIDA6IGJyZWFrOworCQljYXNlIDE6CisJCQlkaWN0SUQgPSBpcFtwb3NdOworCQkJcG9zKys7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJZGljdElEID0gWlNURF9yZWFkTEUxNihpcCArIHBvcyk7CisJCQlwb3MgKz0gMjsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlkaWN0SUQgPSBaU1REX3JlYWRMRTMyKGlwICsgcG9zKTsKKwkJCXBvcyArPSA0OworCQkJYnJlYWs7CisJCX0KKwkJc3dpdGNoIChmY3NJRCkgeworCQlkZWZhdWx0OiAvKiBpbXBvc3NpYmxlICovCisJCWNhc2UgMDoKKwkJCWlmIChzaW5nbGVTZWdtZW50KQorCQkJCWZyYW1lQ29udGVudFNpemUgPSBpcFtwb3NdOworCQkJYnJlYWs7CisJCWNhc2UgMTogZnJhbWVDb250ZW50U2l6ZSA9IFpTVERfcmVhZExFMTYoaXAgKyBwb3MpICsgMjU2OyBicmVhazsKKwkJY2FzZSAyOiBmcmFtZUNvbnRlbnRTaXplID0gWlNURF9yZWFkTEUzMihpcCArIHBvcyk7IGJyZWFrOworCQljYXNlIDM6IGZyYW1lQ29udGVudFNpemUgPSBaU1REX3JlYWRMRTY0KGlwICsgcG9zKTsgYnJlYWs7CisJCX0KKwkJaWYgKCF3aW5kb3dTaXplKQorCQkJd2luZG93U2l6ZSA9IChVMzIpZnJhbWVDb250ZW50U2l6ZTsKKwkJaWYgKHdpbmRvd1NpemUgPiB3aW5kb3dTaXplTWF4KQorCQkJcmV0dXJuIEVSUk9SKGZyYW1lUGFyYW1ldGVyX3dpbmRvd1Rvb0xhcmdlKTsKKwkJZnBhcmFtc1B0ci0+ZnJhbWVDb250ZW50U2l6ZSA9IGZyYW1lQ29udGVudFNpemU7CisJCWZwYXJhbXNQdHItPndpbmRvd1NpemUgPSB3aW5kb3dTaXplOworCQlmcGFyYW1zUHRyLT5kaWN0SUQgPSBkaWN0SUQ7CisJCWZwYXJhbXNQdHItPmNoZWNrc3VtRmxhZyA9IGNoZWNrc3VtRmxhZzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qKiBaU1REX2dldEZyYW1lQ29udGVudFNpemUoKSA6CisqICAgY29tcGF0aWJsZSB3aXRoIGxlZ2FjeSBtb2RlCisqICAgQHJldHVybiA6IGRlY29tcHJlc3NlZCBzaXplIG9mIHRoZSBzaW5nbGUgZnJhbWUgcG9pbnRlZCB0byBiZSBgc3JjYCBpZiBrbm93biwgb3RoZXJ3aXNlCisqICAgICAgICAgICAgIC0gWlNURF9DT05URU5UU0laRV9VTktOT1dOIGlmIHRoZSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkCisqICAgICAgICAgICAgIC0gWlNURF9DT05URU5UU0laRV9FUlJPUiBpZiBhbiBlcnJvciBvY2N1cnJlZCAoZS5nLiBpbnZhbGlkIG1hZ2ljIG51bWJlciwgc3JjU2l6ZSB0b28gc21hbGwpICovCit1bnNpZ25lZCBsb25nIGxvbmcgWlNURF9nZXRGcmFtZUNvbnRlbnRTaXplKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJeworCQlaU1REX2ZyYW1lUGFyYW1zIGZQYXJhbXM7CisJCWlmIChaU1REX2dldEZyYW1lUGFyYW1zKCZmUGFyYW1zLCBzcmMsIHNyY1NpemUpICE9IDApCisJCQlyZXR1cm4gWlNURF9DT05URU5UU0laRV9FUlJPUjsKKwkJaWYgKGZQYXJhbXMud2luZG93U2l6ZSA9PSAwKSB7CisJCQkvKiBFaXRoZXIgc2tpcHBhYmxlIG9yIGVtcHR5IGZyYW1lLCBzaXplID09IDAgZWl0aGVyIHdheSAqLworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAoZlBhcmFtcy5mcmFtZUNvbnRlbnRTaXplICE9IDApIHsKKwkJCXJldHVybiBmUGFyYW1zLmZyYW1lQ29udGVudFNpemU7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gWlNURF9DT05URU5UU0laRV9VTktOT1dOOworCQl9CisJfQorfQorCisvKiogWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZSgpIDoKKyAqICBjb21wYXRpYmxlIHdpdGggbGVnYWN5IG1vZGUKKyAqICBgc3JjU2l6ZWAgbXVzdCBiZSB0aGUgZXhhY3QgbGVuZ3RoIG9mIHNvbWUgbnVtYmVyIG9mIFpTVEQgY29tcHJlc3NlZCBhbmQvb3IKKyAqICAgICAgc2tpcHBhYmxlIGZyYW1lcworICogIEByZXR1cm4gOiBkZWNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZnJhbWVzIGNvbnRhaW5lZCAqLwordW5zaWduZWQgbG9uZyBsb25nIFpTVERfZmluZERlY29tcHJlc3NlZFNpemUoY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwl7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbERzdFNpemUgPSAwOworCQl3aGlsZSAoc3JjU2l6ZSA+PSBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXgpIHsKKwkJCWNvbnN0IFUzMiBtYWdpY051bWJlciA9IFpTVERfcmVhZExFMzIoc3JjKTsKKworCQkJaWYgKChtYWdpY051bWJlciAmIDB4RkZGRkZGRjBVKSA9PSBaU1REX01BR0lDX1NLSVBQQUJMRV9TVEFSVCkgeworCQkJCXNpemVfdCBza2lwcGFibGVTaXplOworCQkJCWlmIChzcmNTaXplIDwgWlNURF9za2lwcGFibGVIZWFkZXJTaXplKQorCQkJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJCQkJc2tpcHBhYmxlU2l6ZSA9IFpTVERfcmVhZExFMzIoKGNvbnN0IEJZVEUgKilzcmMgKyA0KSArIFpTVERfc2tpcHBhYmxlSGVhZGVyU2l6ZTsKKwkJCQlpZiAoc3JjU2l6ZSA8IHNraXBwYWJsZVNpemUpIHsKKwkJCQkJcmV0dXJuIFpTVERfQ09OVEVOVFNJWkVfRVJST1I7CisJCQkJfQorCisJCQkJc3JjID0gKGNvbnN0IEJZVEUgKilzcmMgKyBza2lwcGFibGVTaXplOworCQkJCXNyY1NpemUgLT0gc2tpcHBhYmxlU2l6ZTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJeworCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyBjb25zdCByZXQgPSBaU1REX2dldEZyYW1lQ29udGVudFNpemUoc3JjLCBzcmNTaXplKTsKKwkJCQlpZiAocmV0ID49IFpTVERfQ09OVEVOVFNJWkVfRVJST1IpCisJCQkJCXJldHVybiByZXQ7CisKKwkJCQkvKiBjaGVjayBmb3Igb3ZlcmZsb3cgKi8KKwkJCQlpZiAodG90YWxEc3RTaXplICsgcmV0IDwgdG90YWxEc3RTaXplKQorCQkJCQlyZXR1cm4gWlNURF9DT05URU5UU0laRV9FUlJPUjsKKwkJCQl0b3RhbERzdFNpemUgKz0gcmV0OworCQkJfQorCQkJeworCQkJCXNpemVfdCBjb25zdCBmcmFtZVNyY1NpemUgPSBaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKHNyYywgc3JjU2l6ZSk7CisJCQkJaWYgKFpTVERfaXNFcnJvcihmcmFtZVNyY1NpemUpKSB7CisJCQkJCXJldHVybiBaU1REX0NPTlRFTlRTSVpFX0VSUk9SOworCQkJCX0KKworCQkJCXNyYyA9IChjb25zdCBCWVRFICopc3JjICsgZnJhbWVTcmNTaXplOworCQkJCXNyY1NpemUgLT0gZnJhbWVTcmNTaXplOworCQkJfQorCQl9CisKKwkJaWYgKHNyY1NpemUpIHsKKwkJCXJldHVybiBaU1REX0NPTlRFTlRTSVpFX0VSUk9SOworCQl9CisKKwkJcmV0dXJuIHRvdGFsRHN0U2l6ZTsKKwl9Cit9CisKKy8qKiBaU1REX2RlY29kZUZyYW1lSGVhZGVyKCkgOgorKiAgIGBoZWFkZXJTaXplYCBtdXN0IGJlIHRoZSBzaXplIHByb3ZpZGVkIGJ5IFpTVERfZnJhbWVIZWFkZXJTaXplKCkuCisqICAgQHJldHVybiA6IDAgaWYgc3VjY2Vzcywgb3IgYW4gZXJyb3IgY29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBaU1REX2lzRXJyb3IoKSAqLworc3RhdGljIHNpemVfdCBaU1REX2RlY29kZUZyYW1lSGVhZGVyKFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgaGVhZGVyU2l6ZSkKK3sKKwlzaXplX3QgY29uc3QgcmVzdWx0ID0gWlNURF9nZXRGcmFtZVBhcmFtcygmKGRjdHgtPmZQYXJhbXMpLCBzcmMsIGhlYWRlclNpemUpOworCWlmIChaU1REX2lzRXJyb3IocmVzdWx0KSkKKwkJcmV0dXJuIHJlc3VsdDsgLyogaW52YWxpZCBoZWFkZXIgKi8KKwlpZiAocmVzdWx0ID4gMCkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOyAvKiBoZWFkZXJTaXplIHRvbyBzbWFsbCAqLworCWlmIChkY3R4LT5mUGFyYW1zLmRpY3RJRCAmJiAoZGN0eC0+ZGljdElEICE9IGRjdHgtPmZQYXJhbXMuZGljdElEKSkKKwkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfd3JvbmcpOworCWlmIChkY3R4LT5mUGFyYW1zLmNoZWNrc3VtRmxhZykKKwkJeHhoNjRfcmVzZXQoJmRjdHgtPnh4aFN0YXRlLCAwKTsKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworCWJsb2NrVHlwZV9lIGJsb2NrVHlwZTsKKwlVMzIgbGFzdEJsb2NrOworCVUzMiBvcmlnU2l6ZTsKK30gYmxvY2tQcm9wZXJ0aWVzX3Q7CisKKy8qISBaU1REX2dldGNCbG9ja1NpemUoKSA6CisqICAgUHJvdmlkZXMgdGhlIHNpemUgb2YgY29tcHJlc3NlZCBibG9jayBmcm9tIGJsb2NrIGhlYWRlciBgc3JjYCAqLworc2l6ZV90IFpTVERfZ2V0Y0Jsb2NrU2l6ZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBibG9ja1Byb3BlcnRpZXNfdCAqYnBQdHIpCit7CisJaWYgKHNyY1NpemUgPCBaU1REX2Jsb2NrSGVhZGVyU2l6ZSkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCXsKKwkJVTMyIGNvbnN0IGNCbG9ja0hlYWRlciA9IFpTVERfcmVhZExFMjQoc3JjKTsKKwkJVTMyIGNvbnN0IGNTaXplID0gY0Jsb2NrSGVhZGVyID4+IDM7CisJCWJwUHRyLT5sYXN0QmxvY2sgPSBjQmxvY2tIZWFkZXIgJiAxOworCQlicFB0ci0+YmxvY2tUeXBlID0gKGJsb2NrVHlwZV9lKSgoY0Jsb2NrSGVhZGVyID4+IDEpICYgMyk7CisJCWJwUHRyLT5vcmlnU2l6ZSA9IGNTaXplOyAvKiBvbmx5IHVzZWZ1bCBmb3IgUkxFICovCisJCWlmIChicFB0ci0+YmxvY2tUeXBlID09IGJ0X3JsZSkKKwkJCXJldHVybiAxOworCQlpZiAoYnBQdHItPmJsb2NrVHlwZSA9PSBidF9yZXNlcnZlZCkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJcmV0dXJuIGNTaXplOworCX0KK30KKworc3RhdGljIHNpemVfdCBaU1REX2NvcHlSYXdCbG9jayh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlpZiAoc3JjU2l6ZSA+IGRzdENhcGFjaXR5KQorCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7CisJbWVtY3B5KGRzdCwgc3JjLCBzcmNTaXplKTsKKwlyZXR1cm4gc3JjU2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBaU1REX3NldFJsZUJsb2NrKHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBzaXplX3QgcmVnZW5TaXplKQoreworCWlmIChzcmNTaXplICE9IDEpCisJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwlpZiAocmVnZW5TaXplID4gZHN0Q2FwYWNpdHkpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwltZW1zZXQoZHN0LCAqKGNvbnN0IEJZVEUgKilzcmMsIHJlZ2VuU2l6ZSk7CisJcmV0dXJuIHJlZ2VuU2l6ZTsKK30KKworLyohIFpTVERfZGVjb2RlTGl0ZXJhbHNCbG9jaygpIDoKKwlAcmV0dXJuIDogbmIgb2YgYnl0ZXMgcmVhZCBmcm9tIHNyYyAoPCBzcmNTaXplICkgKi8KK3NpemVfdCBaU1REX2RlY29kZUxpdGVyYWxzQmxvY2soWlNURF9EQ3R4ICpkY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKSAvKiBub3RlIDogc3JjU2l6ZSA8IEJMT0NLU0laRSAqLworeworCWlmIChzcmNTaXplIDwgTUlOX0NCTE9DS19TSVpFKQorCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisKKwl7CisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICopc3JjOworCQlzeW1ib2xFbmNvZGluZ1R5cGVfZSBjb25zdCBsaXRFbmNUeXBlID0gKHN5bWJvbEVuY29kaW5nVHlwZV9lKShpc3RhcnRbMF0gJiAzKTsKKworCQlzd2l0Y2ggKGxpdEVuY1R5cGUpIHsKKwkJY2FzZSBzZXRfcmVwZWF0OgorCQkJaWYgKGRjdHgtPmxpdEVudHJvcHkgPT0gMCkKKwkJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQkvKiBmYWxsLXRocm91Z2ggKi8KKwkJY2FzZSBzZXRfY29tcHJlc3NlZDoKKwkJCWlmIChzcmNTaXplIDwgNSkKKwkJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIHNyY1NpemUgPj0gTUlOX0NCTE9DS19TSVpFID09IDM7IGhlcmUgd2UgbmVlZCB1cCB0byA1IGZvciBjYXNlIDMgKi8KKwkJCXsKKwkJCQlzaXplX3QgbGhTaXplLCBsaXRTaXplLCBsaXRDU2l6ZTsKKwkJCQlVMzIgc2luZ2xlU3RyZWFtID0gMDsKKwkJCQlVMzIgY29uc3QgbGhsQ29kZSA9IChpc3RhcnRbMF0gPj4gMikgJiAzOworCQkJCVUzMiBjb25zdCBsaGMgPSBaU1REX3JlYWRMRTMyKGlzdGFydCk7CisJCQkJc3dpdGNoIChsaGxDb2RlKSB7CisJCQkJY2FzZSAwOgorCQkJCWNhc2UgMToKKwkJCQlkZWZhdWx0OiAvKiBub3RlIDogZGVmYXVsdCBpcyBpbXBvc3NpYmxlLCBzaW5jZSBsaGxDb2RlIGludG8gWzAuLjNdICovCisJCQkJCS8qIDIgLSAyIC0gMTAgLSAxMCAqLworCQkJCQlzaW5nbGVTdHJlYW0gPSAhbGhsQ29kZTsKKwkJCQkJbGhTaXplID0gMzsKKwkJCQkJbGl0U2l6ZSA9IChsaGMgPj4gNCkgJiAweDNGRjsKKwkJCQkJbGl0Q1NpemUgPSAobGhjID4+IDE0KSAmIDB4M0ZGOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCS8qIDIgLSAyIC0gMTQgLSAxNCAqLworCQkJCQlsaFNpemUgPSA0OworCQkJCQlsaXRTaXplID0gKGxoYyA+PiA0KSAmIDB4M0ZGRjsKKwkJCQkJbGl0Q1NpemUgPSBsaGMgPj4gMTg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzoKKwkJCQkJLyogMiAtIDIgLSAxOCAtIDE4ICovCisJCQkJCWxoU2l6ZSA9IDU7CisJCQkJCWxpdFNpemUgPSAobGhjID4+IDQpICYgMHgzRkZGRjsKKwkJCQkJbGl0Q1NpemUgPSAobGhjID4+IDIyKSArIChpc3RhcnRbNF0gPDwgMTApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJaWYgKGxpdFNpemUgPiBaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCkKKwkJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQkJCWlmIChsaXRDU2l6ZSArIGxoU2l6ZSA+IHNyY1NpemUpCisJCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKworCQkJCWlmIChIVUZfaXNFcnJvcigKKwkJCQkJKGxpdEVuY1R5cGUgPT0gc2V0X3JlcGVhdCkKKwkJCQkJICAgID8gKHNpbmdsZVN0cmVhbSA/IEhVRl9kZWNvbXByZXNzMVhfdXNpbmdEVGFibGUoZGN0eC0+bGl0QnVmZmVyLCBsaXRTaXplLCBpc3RhcnQgKyBsaFNpemUsIGxpdENTaXplLCBkY3R4LT5IVUZwdHIpCisJCQkJCQkJICAgIDogSFVGX2RlY29tcHJlc3M0WF91c2luZ0RUYWJsZShkY3R4LT5saXRCdWZmZXIsIGxpdFNpemUsIGlzdGFydCArIGxoU2l6ZSwgbGl0Q1NpemUsIGRjdHgtPkhVRnB0cikpCisJCQkJCSAgICA6IChzaW5nbGVTdHJlYW0KKwkJCQkJCSAgID8gSFVGX2RlY29tcHJlc3MxWDJfREN0eF93a3NwKGRjdHgtPmVudHJvcHkuaHVmVGFibGUsIGRjdHgtPmxpdEJ1ZmZlciwgbGl0U2l6ZSwgaXN0YXJ0ICsgbGhTaXplLCBsaXRDU2l6ZSwKKwkJCQkJCQkJCQkgZGN0eC0+ZW50cm9weS53b3Jrc3BhY2UsIHNpemVvZihkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSkpCisJCQkJCQkgICA6IEhVRl9kZWNvbXByZXNzNFhfaHVmT25seV93a3NwKGRjdHgtPmVudHJvcHkuaHVmVGFibGUsIGRjdHgtPmxpdEJ1ZmZlciwgbGl0U2l6ZSwgaXN0YXJ0ICsgbGhTaXplLCBsaXRDU2l6ZSwKKwkJCQkJCQkJCQkgICBkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSwgc2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSkpKSkKKwkJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCisJCQkJZGN0eC0+bGl0UHRyID0gZGN0eC0+bGl0QnVmZmVyOworCQkJCWRjdHgtPmxpdFNpemUgPSBsaXRTaXplOworCQkJCWRjdHgtPmxpdEVudHJvcHkgPSAxOworCQkJCWlmIChsaXRFbmNUeXBlID09IHNldF9jb21wcmVzc2VkKQorCQkJCQlkY3R4LT5IVUZwdHIgPSBkY3R4LT5lbnRyb3B5Lmh1ZlRhYmxlOworCQkJCW1lbXNldChkY3R4LT5saXRCdWZmZXIgKyBkY3R4LT5saXRTaXplLCAwLCBXSUxEQ09QWV9PVkVSTEVOR1RIKTsKKwkJCQlyZXR1cm4gbGl0Q1NpemUgKyBsaFNpemU7CisJCQl9CisKKwkJY2FzZSBzZXRfYmFzaWM6IHsKKwkJCXNpemVfdCBsaXRTaXplLCBsaFNpemU7CisJCQlVMzIgY29uc3QgbGhsQ29kZSA9ICgoaXN0YXJ0WzBdKSA+PiAyKSAmIDM7CisJCQlzd2l0Y2ggKGxobENvZGUpIHsKKwkJCWNhc2UgMDoKKwkJCWNhc2UgMjoKKwkJCWRlZmF1bHQ6IC8qIG5vdGUgOiBkZWZhdWx0IGlzIGltcG9zc2libGUsIHNpbmNlIGxobENvZGUgaW50byBbMC4uM10gKi8KKwkJCQlsaFNpemUgPSAxOworCQkJCWxpdFNpemUgPSBpc3RhcnRbMF0gPj4gMzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlsaFNpemUgPSAyOworCQkJCWxpdFNpemUgPSBaU1REX3JlYWRMRTE2KGlzdGFydCkgPj4gNDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQlsaFNpemUgPSAzOworCQkJCWxpdFNpemUgPSBaU1REX3JlYWRMRTI0KGlzdGFydCkgPj4gNDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGxoU2l6ZSArIGxpdFNpemUgKyBXSUxEQ09QWV9PVkVSTEVOR1RIID4gc3JjU2l6ZSkgeyAvKiByaXNrIHJlYWRpbmcgYmV5b25kIHNyYyBidWZmZXIgd2l0aCB3aWxkY29weSAqLworCQkJCWlmIChsaXRTaXplICsgbGhTaXplID4gc3JjU2l6ZSkKKwkJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQkJCW1lbWNweShkY3R4LT5saXRCdWZmZXIsIGlzdGFydCArIGxoU2l6ZSwgbGl0U2l6ZSk7CisJCQkJZGN0eC0+bGl0UHRyID0gZGN0eC0+bGl0QnVmZmVyOworCQkJCWRjdHgtPmxpdFNpemUgPSBsaXRTaXplOworCQkJCW1lbXNldChkY3R4LT5saXRCdWZmZXIgKyBkY3R4LT5saXRTaXplLCAwLCBXSUxEQ09QWV9PVkVSTEVOR1RIKTsKKwkJCQlyZXR1cm4gbGhTaXplICsgbGl0U2l6ZTsKKwkJCX0KKwkJCS8qIGRpcmVjdCByZWZlcmVuY2UgaW50byBjb21wcmVzc2VkIHN0cmVhbSAqLworCQkJZGN0eC0+bGl0UHRyID0gaXN0YXJ0ICsgbGhTaXplOworCQkJZGN0eC0+bGl0U2l6ZSA9IGxpdFNpemU7CisJCQlyZXR1cm4gbGhTaXplICsgbGl0U2l6ZTsKKwkJfQorCisJCWNhc2Ugc2V0X3JsZTogeworCQkJVTMyIGNvbnN0IGxobENvZGUgPSAoKGlzdGFydFswXSkgPj4gMikgJiAzOworCQkJc2l6ZV90IGxpdFNpemUsIGxoU2l6ZTsKKwkJCXN3aXRjaCAobGhsQ29kZSkgeworCQkJY2FzZSAwOgorCQkJY2FzZSAyOgorCQkJZGVmYXVsdDogLyogbm90ZSA6IGRlZmF1bHQgaXMgaW1wb3NzaWJsZSwgc2luY2UgbGhsQ29kZSBpbnRvIFswLi4zXSAqLworCQkJCWxoU2l6ZSA9IDE7CisJCQkJbGl0U2l6ZSA9IGlzdGFydFswXSA+PiAzOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCWxoU2l6ZSA9IDI7CisJCQkJbGl0U2l6ZSA9IFpTVERfcmVhZExFMTYoaXN0YXJ0KSA+PiA0OworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWxoU2l6ZSA9IDM7CisJCQkJbGl0U2l6ZSA9IFpTVERfcmVhZExFMjQoaXN0YXJ0KSA+PiA0OworCQkJCWlmIChzcmNTaXplIDwgNCkKKwkJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBzcmNTaXplID49IE1JTl9DQkxPQ0tfU0laRSA9PSAzOyBoZXJlIHdlIG5lZWQgbGhTaXplKzEgPSA0ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAobGl0U2l6ZSA+IFpTVERfQkxPQ0tTSVpFX0FCU09MVVRFTUFYKQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJCW1lbXNldChkY3R4LT5saXRCdWZmZXIsIGlzdGFydFtsaFNpemVdLCBsaXRTaXplICsgV0lMRENPUFlfT1ZFUkxFTkdUSCk7CisJCQlkY3R4LT5saXRQdHIgPSBkY3R4LT5saXRCdWZmZXI7CisJCQlkY3R4LT5saXRTaXplID0gbGl0U2l6ZTsKKwkJCXJldHVybiBsaFNpemUgKyAxOworCQl9CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIGltcG9zc2libGUgKi8KKwkJfQorCX0KK30KKwordHlwZWRlZiB1bmlvbiB7CisJRlNFX2RlY29kZV90IHJlYWxEYXRhOworCVUzMiBhbGlnbmVkQnk0OworfSBGU0VfZGVjb2RlX3Q0OworCitzdGF0aWMgY29uc3QgRlNFX2RlY29kZV90NCBMTF9kZWZhdWx0RFRhYmxlWygxIDw8IExMX0RFRkFVTFROT1JNTE9HKSArIDFdID0geworICAgIHt7TExfREVGQVVMVE5PUk1MT0csIDEsIDF9fSwgLyogaGVhZGVyIDogdGFibGVMb2csIGZhc3RNb2RlLCBmYXN0TW9kZSAqLworICAgIHt7MCwgMCwgNH19LAkJIC8qIDAgOiBiYXNlLCBzeW1ib2wsIGJpdHMgKi8KKyAgICB7ezE2LCAwLCA0fX0sCisgICAge3szMiwgMSwgNX19LAorICAgIHt7MCwgMywgNX19LAorICAgIHt7MCwgNCwgNX19LAorICAgIHt7MCwgNiwgNX19LAorICAgIHt7MCwgNywgNX19LAorICAgIHt7MCwgOSwgNX19LAorICAgIHt7MCwgMTAsIDV9fSwKKyAgICB7ezAsIDEyLCA1fX0sCisgICAge3swLCAxNCwgNn19LAorICAgIHt7MCwgMTYsIDV9fSwKKyAgICB7ezAsIDE4LCA1fX0sCisgICAge3swLCAxOSwgNX19LAorICAgIHt7MCwgMjEsIDV9fSwKKyAgICB7ezAsIDIyLCA1fX0sCisgICAge3swLCAyNCwgNX19LAorICAgIHt7MzIsIDI1LCA1fX0sCisgICAge3swLCAyNiwgNX19LAorICAgIHt7MCwgMjcsIDZ9fSwKKyAgICB7ezAsIDI5LCA2fX0sCisgICAge3swLCAzMSwgNn19LAorICAgIHt7MzIsIDAsIDR9fSwKKyAgICB7ezAsIDEsIDR9fSwKKyAgICB7ezAsIDIsIDV9fSwKKyAgICB7ezMyLCA0LCA1fX0sCisgICAge3swLCA1LCA1fX0sCisgICAge3szMiwgNywgNX19LAorICAgIHt7MCwgOCwgNX19LAorICAgIHt7MzIsIDEwLCA1fX0sCisgICAge3swLCAxMSwgNX19LAorICAgIHt7MCwgMTMsIDZ9fSwKKyAgICB7ezMyLCAxNiwgNX19LAorICAgIHt7MCwgMTcsIDV9fSwKKyAgICB7ezMyLCAxOSwgNX19LAorICAgIHt7MCwgMjAsIDV9fSwKKyAgICB7ezMyLCAyMiwgNX19LAorICAgIHt7MCwgMjMsIDV9fSwKKyAgICB7ezAsIDI1LCA0fX0sCisgICAge3sxNiwgMjUsIDR9fSwKKyAgICB7ezMyLCAyNiwgNX19LAorICAgIHt7MCwgMjgsIDZ9fSwKKyAgICB7ezAsIDMwLCA2fX0sCisgICAge3s0OCwgMCwgNH19LAorICAgIHt7MTYsIDEsIDR9fSwKKyAgICB7ezMyLCAyLCA1fX0sCisgICAge3szMiwgMywgNX19LAorICAgIHt7MzIsIDUsIDV9fSwKKyAgICB7ezMyLCA2LCA1fX0sCisgICAge3szMiwgOCwgNX19LAorICAgIHt7MzIsIDksIDV9fSwKKyAgICB7ezMyLCAxMSwgNX19LAorICAgIHt7MzIsIDEyLCA1fX0sCisgICAge3swLCAxNSwgNn19LAorICAgIHt7MzIsIDE3LCA1fX0sCisgICAge3szMiwgMTgsIDV9fSwKKyAgICB7ezMyLCAyMCwgNX19LAorICAgIHt7MzIsIDIxLCA1fX0sCisgICAge3szMiwgMjMsIDV9fSwKKyAgICB7ezMyLCAyNCwgNX19LAorICAgIHt7MCwgMzUsIDZ9fSwKKyAgICB7ezAsIDM0LCA2fX0sCisgICAge3swLCAzMywgNn19LAorICAgIHt7MCwgMzIsIDZ9fSwKK307IC8qIExMX2RlZmF1bHREVGFibGUgKi8KKworc3RhdGljIGNvbnN0IEZTRV9kZWNvZGVfdDQgTUxfZGVmYXVsdERUYWJsZVsoMSA8PCBNTF9ERUZBVUxUTk9STUxPRykgKyAxXSA9IHsKKyAgICB7e01MX0RFRkFVTFROT1JNTE9HLCAxLCAxfX0sIC8qIGhlYWRlciA6IHRhYmxlTG9nLCBmYXN0TW9kZSwgZmFzdE1vZGUgKi8KKyAgICB7ezAsIDAsIDZ9fSwJCSAvKiAwIDogYmFzZSwgc3ltYm9sLCBiaXRzICovCisgICAge3swLCAxLCA0fX0sCisgICAge3szMiwgMiwgNX19LAorICAgIHt7MCwgMywgNX19LAorICAgIHt7MCwgNSwgNX19LAorICAgIHt7MCwgNiwgNX19LAorICAgIHt7MCwgOCwgNX19LAorICAgIHt7MCwgMTAsIDZ9fSwKKyAgICB7ezAsIDEzLCA2fX0sCisgICAge3swLCAxNiwgNn19LAorICAgIHt7MCwgMTksIDZ9fSwKKyAgICB7ezAsIDIyLCA2fX0sCisgICAge3swLCAyNSwgNn19LAorICAgIHt7MCwgMjgsIDZ9fSwKKyAgICB7ezAsIDMxLCA2fX0sCisgICAge3swLCAzMywgNn19LAorICAgIHt7MCwgMzUsIDZ9fSwKKyAgICB7ezAsIDM3LCA2fX0sCisgICAge3swLCAzOSwgNn19LAorICAgIHt7MCwgNDEsIDZ9fSwKKyAgICB7ezAsIDQzLCA2fX0sCisgICAge3swLCA0NSwgNn19LAorICAgIHt7MTYsIDEsIDR9fSwKKyAgICB7ezAsIDIsIDR9fSwKKyAgICB7ezMyLCAzLCA1fX0sCisgICAge3swLCA0LCA1fX0sCisgICAge3szMiwgNiwgNX19LAorICAgIHt7MCwgNywgNX19LAorICAgIHt7MCwgOSwgNn19LAorICAgIHt7MCwgMTIsIDZ9fSwKKyAgICB7ezAsIDE1LCA2fX0sCisgICAge3swLCAxOCwgNn19LAorICAgIHt7MCwgMjEsIDZ9fSwKKyAgICB7ezAsIDI0LCA2fX0sCisgICAge3swLCAyNywgNn19LAorICAgIHt7MCwgMzAsIDZ9fSwKKyAgICB7ezAsIDMyLCA2fX0sCisgICAge3swLCAzNCwgNn19LAorICAgIHt7MCwgMzYsIDZ9fSwKKyAgICB7ezAsIDM4LCA2fX0sCisgICAge3swLCA0MCwgNn19LAorICAgIHt7MCwgNDIsIDZ9fSwKKyAgICB7ezAsIDQ0LCA2fX0sCisgICAge3szMiwgMSwgNH19LAorICAgIHt7NDgsIDEsIDR9fSwKKyAgICB7ezE2LCAyLCA0fX0sCisgICAge3szMiwgNCwgNX19LAorICAgIHt7MzIsIDUsIDV9fSwKKyAgICB7ezMyLCA3LCA1fX0sCisgICAge3szMiwgOCwgNX19LAorICAgIHt7MCwgMTEsIDZ9fSwKKyAgICB7ezAsIDE0LCA2fX0sCisgICAge3swLCAxNywgNn19LAorICAgIHt7MCwgMjAsIDZ9fSwKKyAgICB7ezAsIDIzLCA2fX0sCisgICAge3swLCAyNiwgNn19LAorICAgIHt7MCwgMjksIDZ9fSwKKyAgICB7ezAsIDUyLCA2fX0sCisgICAge3swLCA1MSwgNn19LAorICAgIHt7MCwgNTAsIDZ9fSwKKyAgICB7ezAsIDQ5LCA2fX0sCisgICAge3swLCA0OCwgNn19LAorICAgIHt7MCwgNDcsIDZ9fSwKKyAgICB7ezAsIDQ2LCA2fX0sCit9OyAvKiBNTF9kZWZhdWx0RFRhYmxlICovCisKK3N0YXRpYyBjb25zdCBGU0VfZGVjb2RlX3Q0IE9GX2RlZmF1bHREVGFibGVbKDEgPDwgT0ZfREVGQVVMVE5PUk1MT0cpICsgMV0gPSB7CisgICAge3tPRl9ERUZBVUxUTk9STUxPRywgMSwgMX19LCAvKiBoZWFkZXIgOiB0YWJsZUxvZywgZmFzdE1vZGUsIGZhc3RNb2RlICovCisgICAge3swLCAwLCA1fX0sCQkgLyogMCA6IGJhc2UsIHN5bWJvbCwgYml0cyAqLworICAgIHt7MCwgNiwgNH19LAorICAgIHt7MCwgOSwgNX19LAorICAgIHt7MCwgMTUsIDV9fSwKKyAgICB7ezAsIDIxLCA1fX0sCisgICAge3swLCAzLCA1fX0sCisgICAge3swLCA3LCA0fX0sCisgICAge3swLCAxMiwgNX19LAorICAgIHt7MCwgMTgsIDV9fSwKKyAgICB7ezAsIDIzLCA1fX0sCisgICAge3swLCA1LCA1fX0sCisgICAge3swLCA4LCA0fX0sCisgICAge3swLCAxNCwgNX19LAorICAgIHt7MCwgMjAsIDV9fSwKKyAgICB7ezAsIDIsIDV9fSwKKyAgICB7ezE2LCA3LCA0fX0sCisgICAge3swLCAxMSwgNX19LAorICAgIHt7MCwgMTcsIDV9fSwKKyAgICB7ezAsIDIyLCA1fX0sCisgICAge3swLCA0LCA1fX0sCisgICAge3sxNiwgOCwgNH19LAorICAgIHt7MCwgMTMsIDV9fSwKKyAgICB7ezAsIDE5LCA1fX0sCisgICAge3swLCAxLCA1fX0sCisgICAge3sxNiwgNiwgNH19LAorICAgIHt7MCwgMTAsIDV9fSwKKyAgICB7ezAsIDE2LCA1fX0sCisgICAge3swLCAyOCwgNX19LAorICAgIHt7MCwgMjcsIDV9fSwKKyAgICB7ezAsIDI2LCA1fX0sCisgICAge3swLCAyNSwgNX19LAorICAgIHt7MCwgMjQsIDV9fSwKK307IC8qIE9GX2RlZmF1bHREVGFibGUgKi8KKworLyohIFpTVERfYnVpbGRTZXFUYWJsZSgpIDoKKwlAcmV0dXJuIDogbmIgYnl0ZXMgcmVhZCBmcm9tIHNyYywKKwkJCSAgb3IgYW4gZXJyb3IgY29kZSBpZiBpdCBmYWlscywgdGVzdGFibGUgd2l0aCBaU1REX2lzRXJyb3IoKQorKi8KK3N0YXRpYyBzaXplX3QgWlNURF9idWlsZFNlcVRhYmxlKEZTRV9EVGFibGUgKkRUYWJsZVNwYWNlLCBjb25zdCBGU0VfRFRhYmxlICoqRFRhYmxlUHRyLCBzeW1ib2xFbmNvZGluZ1R5cGVfZSB0eXBlLCBVMzIgbWF4LCBVMzIgbWF4TG9nLCBjb25zdCB2b2lkICpzcmMsCisJCQkJIHNpemVfdCBzcmNTaXplLCBjb25zdCBGU0VfZGVjb2RlX3Q0ICpkZWZhdWx0VGFibGUsIFUzMiBmbGFnUmVwZWF0VGFibGUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJY29uc3Qgdm9pZCAqY29uc3QgdG1wUHRyID0gZGVmYXVsdFRhYmxlOyAvKiBieXBhc3Mgc3RyaWN0IGFsaWFzaW5nICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBzZXRfcmxlOgorCQlpZiAoIXNyY1NpemUpCisJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJCWlmICgoKihjb25zdCBCWVRFICopc3JjKSA+IG1heCkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJRlNFX2J1aWxkRFRhYmxlX3JsZShEVGFibGVTcGFjZSwgKihjb25zdCBCWVRFICopc3JjKTsKKwkJKkRUYWJsZVB0ciA9IERUYWJsZVNwYWNlOworCQlyZXR1cm4gMTsKKwljYXNlIHNldF9iYXNpYzogKkRUYWJsZVB0ciA9IChjb25zdCBGU0VfRFRhYmxlICopdG1wUHRyOyByZXR1cm4gMDsKKwljYXNlIHNldF9yZXBlYXQ6CisJCWlmICghZmxhZ1JlcGVhdFRhYmxlKQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQlyZXR1cm4gMDsKKwlkZWZhdWx0OiAvKiBpbXBvc3NpYmxlICovCisJY2FzZSBzZXRfY29tcHJlc3NlZDogeworCQlVMzIgdGFibGVMb2c7CisJCVMxNiAqbm9ybSA9IChTMTYgKil3b3Jrc3BhY2U7CisJCXNpemVfdCBjb25zdCBzcGFjZVVzZWQzMiA9IEFMSUdOKHNpemVvZihTMTYpICogKE1heFNlcSArIDEpLCBzaXplb2YoVTMyKSkgPj4gMjsKKworCQlpZiAoKHNwYWNlVXNlZDMyIDw8IDIpID4gd29ya3NwYWNlU2l6ZSkKKwkJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwkJd29ya3NwYWNlID0gKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOworCQl3b3Jrc3BhY2VTaXplIC09IChzcGFjZVVzZWQzMiA8PCAyKTsKKwkJeworCQkJc2l6ZV90IGNvbnN0IGhlYWRlclNpemUgPSBGU0VfcmVhZE5Db3VudChub3JtLCAmbWF4LCAmdGFibGVMb2csIHNyYywgc3JjU2l6ZSk7CisJCQlpZiAoRlNFX2lzRXJyb3IoaGVhZGVyU2l6ZSkpCisJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQkJaWYgKHRhYmxlTG9nID4gbWF4TG9nKQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJCUZTRV9idWlsZERUYWJsZV93a3NwKERUYWJsZVNwYWNlLCBub3JtLCBtYXgsIHRhYmxlTG9nLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCQkJKkRUYWJsZVB0ciA9IERUYWJsZVNwYWNlOworCQkJcmV0dXJuIGhlYWRlclNpemU7CisJCX0KKwl9CisJfQorfQorCitzaXplX3QgWlNURF9kZWNvZGVTZXFIZWFkZXJzKFpTVERfREN0eCAqZGN0eCwgaW50ICpuYlNlcVB0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwljb25zdCBCWVRFICpjb25zdCBpc3RhcnQgPSAoY29uc3QgQllURSAqY29uc3Qpc3JjOworCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOworCWNvbnN0IEJZVEUgKmlwID0gaXN0YXJ0OworCisJLyogY2hlY2sgKi8KKwlpZiAoc3JjU2l6ZSA8IE1JTl9TRVFVRU5DRVNfU0laRSkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCisJLyogU2VxSGVhZCAqLworCXsKKwkJaW50IG5iU2VxID0gKmlwKys7CisJCWlmICghbmJTZXEpIHsKKwkJCSpuYlNlcVB0ciA9IDA7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAobmJTZXEgPiAweDdGKSB7CisJCQlpZiAobmJTZXEgPT0gMHhGRikgeworCQkJCWlmIChpcCArIDIgPiBpZW5kKQorCQkJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJCQkJbmJTZXEgPSBaU1REX3JlYWRMRTE2KGlwKSArIExPTkdOQlNFUSwgaXAgKz0gMjsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGlwID49IGllbmQpCisJCQkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwkJCQluYlNlcSA9ICgobmJTZXEgLSAweDgwKSA8PCA4KSArICppcCsrOworCQkJfQorCQl9CisJCSpuYlNlcVB0ciA9IG5iU2VxOworCX0KKworCS8qIEZTRSB0YWJsZSBkZXNjcmlwdG9ycyAqLworCWlmIChpcCArIDQgPiBpZW5kKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7IC8qIG1pbmltdW0gcG9zc2libGUgc2l6ZSAqLworCXsKKwkJc3ltYm9sRW5jb2RpbmdUeXBlX2UgY29uc3QgTEx0eXBlID0gKHN5bWJvbEVuY29kaW5nVHlwZV9lKSgqaXAgPj4gNik7CisJCXN5bWJvbEVuY29kaW5nVHlwZV9lIGNvbnN0IE9GdHlwZSA9IChzeW1ib2xFbmNvZGluZ1R5cGVfZSkoKCppcCA+PiA0KSAmIDMpOworCQlzeW1ib2xFbmNvZGluZ1R5cGVfZSBjb25zdCBNTHR5cGUgPSAoc3ltYm9sRW5jb2RpbmdUeXBlX2UpKCgqaXAgPj4gMikgJiAzKTsKKwkJaXArKzsKKworCQkvKiBCdWlsZCBEVGFibGVzICovCisJCXsKKwkJCXNpemVfdCBjb25zdCBsbGhTaXplID0gWlNURF9idWlsZFNlcVRhYmxlKGRjdHgtPmVudHJvcHkuTExUYWJsZSwgJmRjdHgtPkxMVHB0ciwgTEx0eXBlLCBNYXhMTCwgTExGU0VMb2csIGlwLCBpZW5kIC0gaXAsCisJCQkJCQkJCSAgTExfZGVmYXVsdERUYWJsZSwgZGN0eC0+ZnNlRW50cm9weSwgZGN0eC0+ZW50cm9weS53b3Jrc3BhY2UsIHNpemVvZihkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSkpOworCQkJaWYgKFpTVERfaXNFcnJvcihsbGhTaXplKSkKKwkJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisJCQlpcCArPSBsbGhTaXplOworCQl9CisJCXsKKwkJCXNpemVfdCBjb25zdCBvZmhTaXplID0gWlNURF9idWlsZFNlcVRhYmxlKGRjdHgtPmVudHJvcHkuT0ZUYWJsZSwgJmRjdHgtPk9GVHB0ciwgT0Z0eXBlLCBNYXhPZmYsIE9mZkZTRUxvZywgaXAsIGllbmQgLSBpcCwKKwkJCQkJCQkJICBPRl9kZWZhdWx0RFRhYmxlLCBkY3R4LT5mc2VFbnRyb3B5LCBkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSwgc2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSk7CisJCQlpZiAoWlNURF9pc0Vycm9yKG9maFNpemUpKQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJCWlwICs9IG9maFNpemU7CisJCX0KKwkJeworCQkJc2l6ZV90IGNvbnN0IG1saFNpemUgPSBaU1REX2J1aWxkU2VxVGFibGUoZGN0eC0+ZW50cm9weS5NTFRhYmxlLCAmZGN0eC0+TUxUcHRyLCBNTHR5cGUsIE1heE1MLCBNTEZTRUxvZywgaXAsIGllbmQgLSBpcCwKKwkJCQkJCQkJICBNTF9kZWZhdWx0RFRhYmxlLCBkY3R4LT5mc2VFbnRyb3B5LCBkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSwgc2l6ZW9mKGRjdHgtPmVudHJvcHkud29ya3NwYWNlKSk7CisJCQlpZiAoWlNURF9pc0Vycm9yKG1saFNpemUpKQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJCWlwICs9IG1saFNpemU7CisJCX0KKwl9CisKKwlyZXR1cm4gaXAgLSBpc3RhcnQ7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwlzaXplX3QgbGl0TGVuZ3RoOworCXNpemVfdCBtYXRjaExlbmd0aDsKKwlzaXplX3Qgb2Zmc2V0OworCWNvbnN0IEJZVEUgKm1hdGNoOworfSBzZXFfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCUJJVF9EU3RyZWFtX3QgRFN0cmVhbTsKKwlGU0VfRFN0YXRlX3Qgc3RhdGVMTDsKKwlGU0VfRFN0YXRlX3Qgc3RhdGVPZmZiOworCUZTRV9EU3RhdGVfdCBzdGF0ZU1MOworCXNpemVfdCBwcmV2T2Zmc2V0W1pTVERfUkVQX05VTV07CisJY29uc3QgQllURSAqYmFzZTsKKwlzaXplX3QgcG9zOworCXVQdHJEaWZmIGdvdG9EaWN0OworfSBzZXFTdGF0ZV90OworCitGT1JDRV9OT0lOTElORQorc2l6ZV90IFpTVERfZXhlY1NlcXVlbmNlTGFzdDcoQllURSAqb3AsIEJZVEUgKmNvbnN0IG9lbmQsIHNlcV90IHNlcXVlbmNlLCBjb25zdCBCWVRFICoqbGl0UHRyLCBjb25zdCBCWVRFICpjb25zdCBsaXRMaW1pdCwgY29uc3QgQllURSAqY29uc3QgYmFzZSwKKwkJCSAgICAgIGNvbnN0IEJZVEUgKmNvbnN0IHZCYXNlLCBjb25zdCBCWVRFICpjb25zdCBkaWN0RW5kKQoreworCUJZVEUgKmNvbnN0IG9MaXRFbmQgPSBvcCArIHNlcXVlbmNlLmxpdExlbmd0aDsKKwlzaXplX3QgY29uc3Qgc2VxdWVuY2VMZW5ndGggPSBzZXF1ZW5jZS5saXRMZW5ndGggKyBzZXF1ZW5jZS5tYXRjaExlbmd0aDsKKwlCWVRFICpjb25zdCBvTWF0Y2hFbmQgPSBvcCArIHNlcXVlbmNlTGVuZ3RoOyAvKiByaXNrIDogYWRkcmVzcyBzcGFjZSBvdmVyZmxvdyAoMzItYml0cykgKi8KKwlCWVRFICpjb25zdCBvZW5kX3cgPSBvZW5kIC0gV0lMRENPUFlfT1ZFUkxFTkdUSDsKKwljb25zdCBCWVRFICpjb25zdCBpTGl0RW5kID0gKmxpdFB0ciArIHNlcXVlbmNlLmxpdExlbmd0aDsKKwljb25zdCBCWVRFICptYXRjaCA9IG9MaXRFbmQgLSBzZXF1ZW5jZS5vZmZzZXQ7CisKKwkvKiBjaGVjayAqLworCWlmIChvTWF0Y2hFbmQgPiBvZW5kKQorCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7IC8qIGxhc3QgbWF0Y2ggbXVzdCBzdGFydCBhdCBhIG1pbmltdW0gZGlzdGFuY2Ugb2YgV0lMRENPUFlfT1ZFUkxFTkdUSCBmcm9tIG9lbmQgKi8KKwlpZiAoaUxpdEVuZCA+IGxpdExpbWl0KQorCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIG92ZXItcmVhZCBiZXlvbmQgbGl0IGJ1ZmZlciAqLworCWlmIChvTGl0RW5kIDw9IG9lbmRfdykKKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOyAvKiBQcmVjb25kaXRpb24gKi8KKworCS8qIGNvcHkgbGl0ZXJhbHMgKi8KKwlpZiAob3AgPCBvZW5kX3cpIHsKKwkJWlNURF93aWxkY29weShvcCwgKmxpdFB0ciwgb2VuZF93IC0gb3ApOworCQkqbGl0UHRyICs9IG9lbmRfdyAtIG9wOworCQlvcCA9IG9lbmRfdzsKKwl9CisJd2hpbGUgKG9wIDwgb0xpdEVuZCkKKwkJKm9wKysgPSAqKCpsaXRQdHIpKys7CisKKwkvKiBjb3B5IE1hdGNoICovCisJaWYgKHNlcXVlbmNlLm9mZnNldCA+IChzaXplX3QpKG9MaXRFbmQgLSBiYXNlKSkgeworCQkvKiBvZmZzZXQgYmV5b25kIHByZWZpeCAqLworCQlpZiAoc2VxdWVuY2Uub2Zmc2V0ID4gKHNpemVfdCkob0xpdEVuZCAtIHZCYXNlKSkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJbWF0Y2ggPSBkaWN0RW5kIC0gKGJhc2UgLSBtYXRjaCk7CisJCWlmIChtYXRjaCArIHNlcXVlbmNlLm1hdGNoTGVuZ3RoIDw9IGRpY3RFbmQpIHsKKwkJCW1lbW1vdmUob0xpdEVuZCwgbWF0Y2gsIHNlcXVlbmNlLm1hdGNoTGVuZ3RoKTsKKwkJCXJldHVybiBzZXF1ZW5jZUxlbmd0aDsKKwkJfQorCQkvKiBzcGFuIGV4dERpY3QgJiBjdXJyUHJlZml4U2VnbWVudCAqLworCQl7CisJCQlzaXplX3QgY29uc3QgbGVuZ3RoMSA9IGRpY3RFbmQgLSBtYXRjaDsKKwkJCW1lbW1vdmUob0xpdEVuZCwgbWF0Y2gsIGxlbmd0aDEpOworCQkJb3AgPSBvTGl0RW5kICsgbGVuZ3RoMTsKKwkJCXNlcXVlbmNlLm1hdGNoTGVuZ3RoIC09IGxlbmd0aDE7CisJCQltYXRjaCA9IGJhc2U7CisJCX0KKwl9CisJd2hpbGUgKG9wIDwgb01hdGNoRW5kKQorCQkqb3ArKyA9ICptYXRjaCsrOworCXJldHVybiBzZXF1ZW5jZUxlbmd0aDsKK30KKworc3RhdGljIHNlcV90IFpTVERfZGVjb2RlU2VxdWVuY2Uoc2VxU3RhdGVfdCAqc2VxU3RhdGUpCit7CisJc2VxX3Qgc2VxOworCisJVTMyIGNvbnN0IGxsQ29kZSA9IEZTRV9wZWVrU3ltYm9sKCZzZXFTdGF0ZS0+c3RhdGVMTCk7CisJVTMyIGNvbnN0IG1sQ29kZSA9IEZTRV9wZWVrU3ltYm9sKCZzZXFTdGF0ZS0+c3RhdGVNTCk7CisJVTMyIGNvbnN0IG9mQ29kZSA9IEZTRV9wZWVrU3ltYm9sKCZzZXFTdGF0ZS0+c3RhdGVPZmZiKTsgLyogPD0gbWF4T2ZmLCBieSB0YWJsZSBjb25zdHJ1Y3Rpb24gKi8KKworCVUzMiBjb25zdCBsbEJpdHMgPSBMTF9iaXRzW2xsQ29kZV07CisJVTMyIGNvbnN0IG1sQml0cyA9IE1MX2JpdHNbbWxDb2RlXTsKKwlVMzIgY29uc3Qgb2ZCaXRzID0gb2ZDb2RlOworCVUzMiBjb25zdCB0b3RhbEJpdHMgPSBsbEJpdHMgKyBtbEJpdHMgKyBvZkJpdHM7CisKKwlzdGF0aWMgY29uc3QgVTMyIExMX2Jhc2VbTWF4TEwgKyAxXSA9IHswLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICAgIDksICAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgIDE0LCAgICAgMTUsICAgICAxNiwgICAgIDE4LAorCQkJCQkgICAgICAgMjAsIDIyLCAyNCwgMjgsIDMyLCA0MCwgNDgsIDY0LCAweDgwLCAweDEwMCwgMHgyMDAsIDB4NDAwLCAweDgwMCwgMHgxMDAwLCAweDIwMDAsIDB4NDAwMCwgMHg4MDAwLCAweDEwMDAwfTsKKworCXN0YXRpYyBjb25zdCBVMzIgTUxfYmFzZVtNYXhNTCArIDFdID0gezMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICAxMCwgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgICAxNiwgICAgIDE3LCAgICAgMTgsICAgICAxOSwgICAgIDIwLAorCQkJCQkgICAgICAgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgIDM0LCAgICAgMzUsICAgICAzNywgICAgIDM5LCAgICAgNDEsCisJCQkJCSAgICAgICA0MywgNDcsIDUxLCA1OSwgNjcsIDgzLCA5OSwgMHg4MywgMHgxMDMsIDB4MjAzLCAweDQwMywgMHg4MDMsIDB4MTAwMywgMHgyMDAzLCAweDQwMDMsIDB4ODAwMywgMHgxMDAwM307CisKKwlzdGF0aWMgY29uc3QgVTMyIE9GX2Jhc2VbTWF4T2ZmICsgMV0gPSB7MCwgICAgICAgMSwJMSwJNSwJMHhELCAgICAgIDB4MUQsICAgICAgMHgzRCwgICAgICAweDdELCAgICAgIDB4RkQsICAgICAweDFGRCwKKwkJCQkJCTB4M0ZELCAgIDB4N0ZELCAgICAweEZGRCwgICAgMHgxRkZELCAgIDB4M0ZGRCwgICAweDdGRkQsICAgIDB4RkZGRCwgICAgMHgxRkZGRCwgICAweDNGRkZELCAgMHg3RkZGRCwKKwkJCQkJCTB4RkZGRkQsIDB4MUZGRkZELCAweDNGRkZGRCwgMHg3RkZGRkQsIDB4RkZGRkZELCAweDFGRkZGRkQsIDB4M0ZGRkZGRCwgMHg3RkZGRkZELCAweEZGRkZGRkR9OworCisJLyogc2VxdWVuY2UgKi8KKwl7CisJCXNpemVfdCBvZmZzZXQ7CisJCWlmICghb2ZDb2RlKQorCQkJb2Zmc2V0ID0gMDsKKwkJZWxzZSB7CisJCQlvZmZzZXQgPSBPRl9iYXNlW29mQ29kZV0gKyBCSVRfcmVhZEJpdHNGYXN0KCZzZXFTdGF0ZS0+RFN0cmVhbSwgb2ZCaXRzKTsgLyogPD0gIChaU1REX1dJTkRPV0xPR19NQVgtMSkgYml0cyAqLworCQkJaWYgKFpTVERfMzJiaXRzKCkpCisJCQkJQklUX3JlbG9hZERTdHJlYW0oJnNlcVN0YXRlLT5EU3RyZWFtKTsKKwkJfQorCisJCWlmIChvZkNvZGUgPD0gMSkgeworCQkJb2Zmc2V0ICs9IChsbENvZGUgPT0gMCk7CisJCQlpZiAob2Zmc2V0KSB7CisJCQkJc2l6ZV90IHRlbXAgPSAob2Zmc2V0ID09IDMpID8gc2VxU3RhdGUtPnByZXZPZmZzZXRbMF0gLSAxIDogc2VxU3RhdGUtPnByZXZPZmZzZXRbb2Zmc2V0XTsKKwkJCQl0ZW1wICs9ICF0ZW1wOyAvKiAwIGlzIG5vdCB2YWxpZDsgaW5wdXQgaXMgY29ycnVwdGVkOyBmb3JjZSBvZmZzZXQgdG8gMSAqLworCQkJCWlmIChvZmZzZXQgIT0gMSkKKwkJCQkJc2VxU3RhdGUtPnByZXZPZmZzZXRbMl0gPSBzZXFTdGF0ZS0+cHJldk9mZnNldFsxXTsKKwkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsxXSA9IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzBdOworCQkJCXNlcVN0YXRlLT5wcmV2T2Zmc2V0WzBdID0gb2Zmc2V0ID0gdGVtcDsKKwkJCX0gZWxzZSB7CisJCQkJb2Zmc2V0ID0gc2VxU3RhdGUtPnByZXZPZmZzZXRbMF07CisJCQl9CisJCX0gZWxzZSB7CisJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsyXSA9IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFdOworCQkJc2VxU3RhdGUtPnByZXZPZmZzZXRbMV0gPSBzZXFTdGF0ZS0+cHJldk9mZnNldFswXTsKKwkJCXNlcVN0YXRlLT5wcmV2T2Zmc2V0WzBdID0gb2Zmc2V0OworCQl9CisJCXNlcS5vZmZzZXQgPSBvZmZzZXQ7CisJfQorCisJc2VxLm1hdGNoTGVuZ3RoID0gTUxfYmFzZVttbENvZGVdICsgKChtbENvZGUgPiAzMSkgPyBCSVRfcmVhZEJpdHNGYXN0KCZzZXFTdGF0ZS0+RFN0cmVhbSwgbWxCaXRzKSA6IDApOyAvKiA8PSAgMTYgYml0cyAqLworCWlmIChaU1REXzMyYml0cygpICYmIChtbEJpdHMgKyBsbEJpdHMgPiAyNCkpCisJCUJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS0+RFN0cmVhbSk7CisKKwlzZXEubGl0TGVuZ3RoID0gTExfYmFzZVtsbENvZGVdICsgKChsbENvZGUgPiAxNSkgPyBCSVRfcmVhZEJpdHNGYXN0KCZzZXFTdGF0ZS0+RFN0cmVhbSwgbGxCaXRzKSA6IDApOyAvKiA8PSAgMTYgYml0cyAqLworCWlmIChaU1REXzMyYml0cygpIHx8ICh0b3RhbEJpdHMgPiA2NCAtIDcgLSAoTExGU0VMb2cgKyBNTEZTRUxvZyArIE9mZkZTRUxvZykpKQorCQlCSVRfcmVsb2FkRFN0cmVhbSgmc2VxU3RhdGUtPkRTdHJlYW0pOworCisJLyogQU5TIHN0YXRlIHVwZGF0ZSAqLworCUZTRV91cGRhdGVTdGF0ZSgmc2VxU3RhdGUtPnN0YXRlTEwsICZzZXFTdGF0ZS0+RFN0cmVhbSk7IC8qIDw9ICA5IGJpdHMgKi8KKwlGU0VfdXBkYXRlU3RhdGUoJnNlcVN0YXRlLT5zdGF0ZU1MLCAmc2VxU3RhdGUtPkRTdHJlYW0pOyAvKiA8PSAgOSBiaXRzICovCisJaWYgKFpTVERfMzJiaXRzKCkpCisJCUJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS0+RFN0cmVhbSk7CQkgICAvKiA8PSAxOCBiaXRzICovCisJRlNFX3VwZGF0ZVN0YXRlKCZzZXFTdGF0ZS0+c3RhdGVPZmZiLCAmc2VxU3RhdGUtPkRTdHJlYW0pOyAvKiA8PSAgOCBiaXRzICovCisKKwlzZXEubWF0Y2ggPSBOVUxMOworCisJcmV0dXJuIHNlcTsKK30KKworRk9SQ0VfSU5MSU5FCitzaXplX3QgWlNURF9leGVjU2VxdWVuY2UoQllURSAqb3AsIEJZVEUgKmNvbnN0IG9lbmQsIHNlcV90IHNlcXVlbmNlLCBjb25zdCBCWVRFICoqbGl0UHRyLCBjb25zdCBCWVRFICpjb25zdCBsaXRMaW1pdCwgY29uc3QgQllURSAqY29uc3QgYmFzZSwKKwkJCSBjb25zdCBCWVRFICpjb25zdCB2QmFzZSwgY29uc3QgQllURSAqY29uc3QgZGljdEVuZCkKK3sKKwlCWVRFICpjb25zdCBvTGl0RW5kID0gb3AgKyBzZXF1ZW5jZS5saXRMZW5ndGg7CisJc2l6ZV90IGNvbnN0IHNlcXVlbmNlTGVuZ3RoID0gc2VxdWVuY2UubGl0TGVuZ3RoICsgc2VxdWVuY2UubWF0Y2hMZW5ndGg7CisJQllURSAqY29uc3Qgb01hdGNoRW5kID0gb3AgKyBzZXF1ZW5jZUxlbmd0aDsgLyogcmlzayA6IGFkZHJlc3Mgc3BhY2Ugb3ZlcmZsb3cgKDMyLWJpdHMpICovCisJQllURSAqY29uc3Qgb2VuZF93ID0gb2VuZCAtIFdJTERDT1BZX09WRVJMRU5HVEg7CisJY29uc3QgQllURSAqY29uc3QgaUxpdEVuZCA9ICpsaXRQdHIgKyBzZXF1ZW5jZS5saXRMZW5ndGg7CisJY29uc3QgQllURSAqbWF0Y2ggPSBvTGl0RW5kIC0gc2VxdWVuY2Uub2Zmc2V0OworCisJLyogY2hlY2sgKi8KKwlpZiAob01hdGNoRW5kID4gb2VuZCkKKwkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOyAvKiBsYXN0IG1hdGNoIG11c3Qgc3RhcnQgYXQgYSBtaW5pbXVtIGRpc3RhbmNlIG9mIFdJTERDT1BZX09WRVJMRU5HVEggZnJvbSBvZW5kICovCisJaWYgKGlMaXRFbmQgPiBsaXRMaW1pdCkKKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBvdmVyLXJlYWQgYmV5b25kIGxpdCBidWZmZXIgKi8KKwlpZiAob0xpdEVuZCA+IG9lbmRfdykKKwkJcmV0dXJuIFpTVERfZXhlY1NlcXVlbmNlTGFzdDcob3AsIG9lbmQsIHNlcXVlbmNlLCBsaXRQdHIsIGxpdExpbWl0LCBiYXNlLCB2QmFzZSwgZGljdEVuZCk7CisKKwkvKiBjb3B5IExpdGVyYWxzICovCisJWlNURF9jb3B5OChvcCwgKmxpdFB0cik7CisJaWYgKHNlcXVlbmNlLmxpdExlbmd0aCA+IDgpCisJCVpTVERfd2lsZGNvcHkob3AgKyA4LCAoKmxpdFB0cikgKyA4LAorCQkJICAgICAgc2VxdWVuY2UubGl0TGVuZ3RoIC0gOCk7IC8qIG5vdGUgOiBzaW5jZSBvTGl0RW5kIDw9IG9lbmQtV0lMRENPUFlfT1ZFUkxFTkdUSCwgbm8gcmlzayBvZiBvdmVyd3JpdGUgYmV5b25kIG9lbmQgKi8KKwlvcCA9IG9MaXRFbmQ7CisJKmxpdFB0ciA9IGlMaXRFbmQ7IC8qIHVwZGF0ZSBmb3IgbmV4dCBzZXF1ZW5jZSAqLworCisJLyogY29weSBNYXRjaCAqLworCWlmIChzZXF1ZW5jZS5vZmZzZXQgPiAoc2l6ZV90KShvTGl0RW5kIC0gYmFzZSkpIHsKKwkJLyogb2Zmc2V0IGJleW9uZCBwcmVmaXggKi8KKwkJaWYgKHNlcXVlbmNlLm9mZnNldCA+IChzaXplX3QpKG9MaXRFbmQgLSB2QmFzZSkpCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisJCW1hdGNoID0gZGljdEVuZCArIChtYXRjaCAtIGJhc2UpOworCQlpZiAobWF0Y2ggKyBzZXF1ZW5jZS5tYXRjaExlbmd0aCA8PSBkaWN0RW5kKSB7CisJCQltZW1tb3ZlKG9MaXRFbmQsIG1hdGNoLCBzZXF1ZW5jZS5tYXRjaExlbmd0aCk7CisJCQlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7CisJCX0KKwkJLyogc3BhbiBleHREaWN0ICYgY3VyclByZWZpeFNlZ21lbnQgKi8KKwkJeworCQkJc2l6ZV90IGNvbnN0IGxlbmd0aDEgPSBkaWN0RW5kIC0gbWF0Y2g7CisJCQltZW1tb3ZlKG9MaXRFbmQsIG1hdGNoLCBsZW5ndGgxKTsKKwkJCW9wID0gb0xpdEVuZCArIGxlbmd0aDE7CisJCQlzZXF1ZW5jZS5tYXRjaExlbmd0aCAtPSBsZW5ndGgxOworCQkJbWF0Y2ggPSBiYXNlOworCQkJaWYgKG9wID4gb2VuZF93IHx8IHNlcXVlbmNlLm1hdGNoTGVuZ3RoIDwgTUlOTUFUQ0gpIHsKKwkJCQlVMzIgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc2VxdWVuY2UubWF0Y2hMZW5ndGg7ICsraSkKKwkJCQkJb3BbaV0gPSBtYXRjaFtpXTsKKwkJCQlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7CisJCQl9CisJCX0KKwl9CisJLyogUmVxdWlyZW1lbnQ6IG9wIDw9IG9lbmRfdyAmJiBzZXF1ZW5jZS5tYXRjaExlbmd0aCA+PSBNSU5NQVRDSCAqLworCisJLyogbWF0Y2ggd2l0aGluIHByZWZpeCAqLworCWlmIChzZXF1ZW5jZS5vZmZzZXQgPCA4KSB7CisJCS8qIGNsb3NlIHJhbmdlIG1hdGNoLCBvdmVybGFwICovCisJCXN0YXRpYyBjb25zdCBVMzIgZGVjMzJ0YWJsZVtdID0gezAsIDEsIDIsIDEsIDQsIDQsIDQsIDR9OyAgIC8qIGFkZGVkICovCisJCXN0YXRpYyBjb25zdCBpbnQgZGVjNjR0YWJsZVtdID0gezgsIDgsIDgsIDcsIDgsIDksIDEwLCAxMX07IC8qIHN1YnRyYWN0ZWQgKi8KKwkJaW50IGNvbnN0IHN1YjIgPSBkZWM2NHRhYmxlW3NlcXVlbmNlLm9mZnNldF07CisJCW9wWzBdID0gbWF0Y2hbMF07CisJCW9wWzFdID0gbWF0Y2hbMV07CisJCW9wWzJdID0gbWF0Y2hbMl07CisJCW9wWzNdID0gbWF0Y2hbM107CisJCW1hdGNoICs9IGRlYzMydGFibGVbc2VxdWVuY2Uub2Zmc2V0XTsKKwkJWlNURF9jb3B5NChvcCArIDQsIG1hdGNoKTsKKwkJbWF0Y2ggLT0gc3ViMjsKKwl9IGVsc2UgeworCQlaU1REX2NvcHk4KG9wLCBtYXRjaCk7CisJfQorCW9wICs9IDg7CisJbWF0Y2ggKz0gODsKKworCWlmIChvTWF0Y2hFbmQgPiBvZW5kIC0gKDE2IC0gTUlOTUFUQ0gpKSB7CisJCWlmIChvcCA8IG9lbmRfdykgeworCQkJWlNURF93aWxkY29weShvcCwgbWF0Y2gsIG9lbmRfdyAtIG9wKTsKKwkJCW1hdGNoICs9IG9lbmRfdyAtIG9wOworCQkJb3AgPSBvZW5kX3c7CisJCX0KKwkJd2hpbGUgKG9wIDwgb01hdGNoRW5kKQorCQkJKm9wKysgPSAqbWF0Y2grKzsKKwl9IGVsc2UgeworCQlaU1REX3dpbGRjb3B5KG9wLCBtYXRjaCwgKHB0cmRpZmZfdClzZXF1ZW5jZS5tYXRjaExlbmd0aCAtIDgpOyAvKiB3b3JrcyBldmVuIGlmIG1hdGNoTGVuZ3RoIDwgOCAqLworCX0KKwlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9kZWNvbXByZXNzU2VxdWVuY2VzKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqc2VxU3RhcnQsIHNpemVfdCBzZXFTaXplKQoreworCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKilzZXFTdGFydDsKKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXAgKyBzZXFTaXplOworCUJZVEUgKmNvbnN0IG9zdGFydCA9IChCWVRFICogY29uc3QpZHN0OworCUJZVEUgKmNvbnN0IG9lbmQgPSBvc3RhcnQgKyBtYXhEc3RTaXplOworCUJZVEUgKm9wID0gb3N0YXJ0OworCWNvbnN0IEJZVEUgKmxpdFB0ciA9IGRjdHgtPmxpdFB0cjsKKwljb25zdCBCWVRFICpjb25zdCBsaXRFbmQgPSBsaXRQdHIgKyBkY3R4LT5saXRTaXplOworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSAoY29uc3QgQllURSAqKShkY3R4LT5iYXNlKTsKKwljb25zdCBCWVRFICpjb25zdCB2QmFzZSA9IChjb25zdCBCWVRFICopKGRjdHgtPnZCYXNlKTsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0RW5kID0gKGNvbnN0IEJZVEUgKikoZGN0eC0+ZGljdEVuZCk7CisJaW50IG5iU2VxOworCisJLyogQnVpbGQgRGVjb2RpbmcgVGFibGVzICovCisJeworCQlzaXplX3QgY29uc3Qgc2VxSFNpemUgPSBaU1REX2RlY29kZVNlcUhlYWRlcnMoZGN0eCwgJm5iU2VxLCBpcCwgc2VxU2l6ZSk7CisJCWlmIChaU1REX2lzRXJyb3Ioc2VxSFNpemUpKQorCQkJcmV0dXJuIHNlcUhTaXplOworCQlpcCArPSBzZXFIU2l6ZTsKKwl9CisKKwkvKiBSZWdlbiBzZXF1ZW5jZXMgKi8KKwlpZiAobmJTZXEpIHsKKwkJc2VxU3RhdGVfdCBzZXFTdGF0ZTsKKwkJZGN0eC0+ZnNlRW50cm9weSA9IDE7CisJCXsKKwkJCVUzMiBpOworCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJCXNlcVN0YXRlLnByZXZPZmZzZXRbaV0gPSBkY3R4LT5lbnRyb3B5LnJlcFtpXTsKKwkJfQorCQlDSEVDS19FKEJJVF9pbml0RFN0cmVhbSgmc2VxU3RhdGUuRFN0cmVhbSwgaXAsIGllbmQgLSBpcCksIGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQlGU0VfaW5pdERTdGF0ZSgmc2VxU3RhdGUuc3RhdGVMTCwgJnNlcVN0YXRlLkRTdHJlYW0sIGRjdHgtPkxMVHB0cik7CisJCUZTRV9pbml0RFN0YXRlKCZzZXFTdGF0ZS5zdGF0ZU9mZmIsICZzZXFTdGF0ZS5EU3RyZWFtLCBkY3R4LT5PRlRwdHIpOworCQlGU0VfaW5pdERTdGF0ZSgmc2VxU3RhdGUuc3RhdGVNTCwgJnNlcVN0YXRlLkRTdHJlYW0sIGRjdHgtPk1MVHB0cik7CisKKwkJZm9yICg7IChCSVRfcmVsb2FkRFN0cmVhbSgmKHNlcVN0YXRlLkRTdHJlYW0pKSA8PSBCSVRfRFN0cmVhbV9jb21wbGV0ZWQpICYmIG5iU2VxOykgeworCQkJbmJTZXEtLTsKKwkJCXsKKwkJCQlzZXFfdCBjb25zdCBzZXF1ZW5jZSA9IFpTVERfZGVjb2RlU2VxdWVuY2UoJnNlcVN0YXRlKTsKKwkJCQlzaXplX3QgY29uc3Qgb25lU2VxU2l6ZSA9IFpTVERfZXhlY1NlcXVlbmNlKG9wLCBvZW5kLCBzZXF1ZW5jZSwgJmxpdFB0ciwgbGl0RW5kLCBiYXNlLCB2QmFzZSwgZGljdEVuZCk7CisJCQkJaWYgKFpTVERfaXNFcnJvcihvbmVTZXFTaXplKSkKKwkJCQkJcmV0dXJuIG9uZVNlcVNpemU7CisJCQkJb3AgKz0gb25lU2VxU2l6ZTsKKwkJCX0KKwkJfQorCisJCS8qIGNoZWNrIGlmIHJlYWNoZWQgZXhhY3QgZW5kICovCisJCWlmIChuYlNlcSkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJLyogc2F2ZSByZXBzIGZvciBuZXh0IGJsb2NrICovCisJCXsKKwkJCVUzMiBpOworCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJCWRjdHgtPmVudHJvcHkucmVwW2ldID0gKFUzMikoc2VxU3RhdGUucHJldk9mZnNldFtpXSk7CisJCX0KKwl9CisKKwkvKiBsYXN0IGxpdGVyYWwgc2VnbWVudCAqLworCXsKKwkJc2l6ZV90IGNvbnN0IGxhc3RMTFNpemUgPSBsaXRFbmQgLSBsaXRQdHI7CisJCWlmIChsYXN0TExTaXplID4gKHNpemVfdCkob2VuZCAtIG9wKSkKKwkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwkJbWVtY3B5KG9wLCBsaXRQdHIsIGxhc3RMTFNpemUpOworCQlvcCArPSBsYXN0TExTaXplOworCX0KKworCXJldHVybiBvcCAtIG9zdGFydDsKK30KKworRk9SQ0VfSU5MSU5FIHNlcV90IFpTVERfZGVjb2RlU2VxdWVuY2VMb25nX2dlbmVyaWMoc2VxU3RhdGVfdCAqc2VxU3RhdGUsIGludCBjb25zdCBsb25nT2Zmc2V0cykKK3sKKwlzZXFfdCBzZXE7CisKKwlVMzIgY29uc3QgbGxDb2RlID0gRlNFX3BlZWtTeW1ib2woJnNlcVN0YXRlLT5zdGF0ZUxMKTsKKwlVMzIgY29uc3QgbWxDb2RlID0gRlNFX3BlZWtTeW1ib2woJnNlcVN0YXRlLT5zdGF0ZU1MKTsKKwlVMzIgY29uc3Qgb2ZDb2RlID0gRlNFX3BlZWtTeW1ib2woJnNlcVN0YXRlLT5zdGF0ZU9mZmIpOyAvKiA8PSBtYXhPZmYsIGJ5IHRhYmxlIGNvbnN0cnVjdGlvbiAqLworCisJVTMyIGNvbnN0IGxsQml0cyA9IExMX2JpdHNbbGxDb2RlXTsKKwlVMzIgY29uc3QgbWxCaXRzID0gTUxfYml0c1ttbENvZGVdOworCVUzMiBjb25zdCBvZkJpdHMgPSBvZkNvZGU7CisJVTMyIGNvbnN0IHRvdGFsQml0cyA9IGxsQml0cyArIG1sQml0cyArIG9mQml0czsKKworCXN0YXRpYyBjb25zdCBVMzIgTExfYmFzZVtNYXhMTCArIDFdID0gezAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgICAgOSwgICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAgMTQsICAgICAxNSwgICAgIDE2LCAgICAgMTgsCisJCQkJCSAgICAgICAyMCwgMjIsIDI0LCAyOCwgMzIsIDQwLCA0OCwgNjQsIDB4ODAsIDB4MTAwLCAweDIwMCwgMHg0MDAsIDB4ODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwLCAweDgwMDAsIDB4MTAwMDB9OworCisJc3RhdGljIGNvbnN0IFUzMiBNTF9iYXNlW01heE1MICsgMV0gPSB7MywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgIDEwLCAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgIDE2LCAgICAgMTcsICAgICAxOCwgICAgIDE5LCAgICAgMjAsCisJCQkJCSAgICAgICAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAgMzQsICAgICAzNSwgICAgIDM3LCAgICAgMzksICAgICA0MSwKKwkJCQkJICAgICAgIDQzLCA0NywgNTEsIDU5LCA2NywgODMsIDk5LCAweDgzLCAweDEwMywgMHgyMDMsIDB4NDAzLCAweDgwMywgMHgxMDAzLCAweDIwMDMsIDB4NDAwMywgMHg4MDAzLCAweDEwMDAzfTsKKworCXN0YXRpYyBjb25zdCBVMzIgT0ZfYmFzZVtNYXhPZmYgKyAxXSA9IHswLCAgICAgICAxLAkxLAk1LAkweEQsICAgICAgMHgxRCwgICAgICAweDNELCAgICAgIDB4N0QsICAgICAgMHhGRCwgICAgIDB4MUZELAorCQkJCQkJMHgzRkQsICAgMHg3RkQsICAgIDB4RkZELCAgICAweDFGRkQsICAgMHgzRkZELCAgIDB4N0ZGRCwgICAgMHhGRkZELCAgICAweDFGRkZELCAgIDB4M0ZGRkQsICAweDdGRkZELAorCQkJCQkJMHhGRkZGRCwgMHgxRkZGRkQsIDB4M0ZGRkZELCAweDdGRkZGRCwgMHhGRkZGRkQsIDB4MUZGRkZGRCwgMHgzRkZGRkZELCAweDdGRkZGRkQsIDB4RkZGRkZGRH07CisKKwkvKiBzZXF1ZW5jZSAqLworCXsKKwkJc2l6ZV90IG9mZnNldDsKKwkJaWYgKCFvZkNvZGUpCisJCQlvZmZzZXQgPSAwOworCQllbHNlIHsKKwkJCWlmIChsb25nT2Zmc2V0cykgeworCQkJCWludCBjb25zdCBleHRyYUJpdHMgPSBvZkJpdHMgLSBNSU4ob2ZCaXRzLCBTVFJFQU1fQUNDVU1VTEFUT1JfTUlOKTsKKwkJCQlvZmZzZXQgPSBPRl9iYXNlW29mQ29kZV0gKyAoQklUX3JlYWRCaXRzRmFzdCgmc2VxU3RhdGUtPkRTdHJlYW0sIG9mQml0cyAtIGV4dHJhQml0cykgPDwgZXh0cmFCaXRzKTsKKwkJCQlpZiAoWlNURF8zMmJpdHMoKSB8fCBleHRyYUJpdHMpCisJCQkJCUJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS0+RFN0cmVhbSk7CisJCQkJaWYgKGV4dHJhQml0cykKKwkJCQkJb2Zmc2V0ICs9IEJJVF9yZWFkQml0c0Zhc3QoJnNlcVN0YXRlLT5EU3RyZWFtLCBleHRyYUJpdHMpOworCQkJfSBlbHNlIHsKKwkJCQlvZmZzZXQgPSBPRl9iYXNlW29mQ29kZV0gKyBCSVRfcmVhZEJpdHNGYXN0KCZzZXFTdGF0ZS0+RFN0cmVhbSwgb2ZCaXRzKTsgLyogPD0gIChaU1REX1dJTkRPV0xPR19NQVgtMSkgYml0cyAqLworCQkJCWlmIChaU1REXzMyYml0cygpKQorCQkJCQlCSVRfcmVsb2FkRFN0cmVhbSgmc2VxU3RhdGUtPkRTdHJlYW0pOworCQkJfQorCQl9CisKKwkJaWYgKG9mQ29kZSA8PSAxKSB7CisJCQlvZmZzZXQgKz0gKGxsQ29kZSA9PSAwKTsKKwkJCWlmIChvZmZzZXQpIHsKKwkJCQlzaXplX3QgdGVtcCA9IChvZmZzZXQgPT0gMykgPyBzZXFTdGF0ZS0+cHJldk9mZnNldFswXSAtIDEgOiBzZXFTdGF0ZS0+cHJldk9mZnNldFtvZmZzZXRdOworCQkJCXRlbXAgKz0gIXRlbXA7IC8qIDAgaXMgbm90IHZhbGlkOyBpbnB1dCBpcyBjb3JydXB0ZWQ7IGZvcmNlIG9mZnNldCB0byAxICovCisJCQkJaWYgKG9mZnNldCAhPSAxKQorCQkJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsyXSA9IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFdOworCQkJCXNlcVN0YXRlLT5wcmV2T2Zmc2V0WzFdID0gc2VxU3RhdGUtPnByZXZPZmZzZXRbMF07CisJCQkJc2VxU3RhdGUtPnByZXZPZmZzZXRbMF0gPSBvZmZzZXQgPSB0ZW1wOworCQkJfSBlbHNlIHsKKwkJCQlvZmZzZXQgPSBzZXFTdGF0ZS0+cHJldk9mZnNldFswXTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXNlcVN0YXRlLT5wcmV2T2Zmc2V0WzJdID0gc2VxU3RhdGUtPnByZXZPZmZzZXRbMV07CisJCQlzZXFTdGF0ZS0+cHJldk9mZnNldFsxXSA9IHNlcVN0YXRlLT5wcmV2T2Zmc2V0WzBdOworCQkJc2VxU3RhdGUtPnByZXZPZmZzZXRbMF0gPSBvZmZzZXQ7CisJCX0KKwkJc2VxLm9mZnNldCA9IG9mZnNldDsKKwl9CisKKwlzZXEubWF0Y2hMZW5ndGggPSBNTF9iYXNlW21sQ29kZV0gKyAoKG1sQ29kZSA+IDMxKSA/IEJJVF9yZWFkQml0c0Zhc3QoJnNlcVN0YXRlLT5EU3RyZWFtLCBtbEJpdHMpIDogMCk7IC8qIDw9ICAxNiBiaXRzICovCisJaWYgKFpTVERfMzJiaXRzKCkgJiYgKG1sQml0cyArIGxsQml0cyA+IDI0KSkKKwkJQklUX3JlbG9hZERTdHJlYW0oJnNlcVN0YXRlLT5EU3RyZWFtKTsKKworCXNlcS5saXRMZW5ndGggPSBMTF9iYXNlW2xsQ29kZV0gKyAoKGxsQ29kZSA+IDE1KSA/IEJJVF9yZWFkQml0c0Zhc3QoJnNlcVN0YXRlLT5EU3RyZWFtLCBsbEJpdHMpIDogMCk7IC8qIDw9ICAxNiBiaXRzICovCisJaWYgKFpTVERfMzJiaXRzKCkgfHwgKHRvdGFsQml0cyA+IDY0IC0gNyAtIChMTEZTRUxvZyArIE1MRlNFTG9nICsgT2ZmRlNFTG9nKSkpCisJCUJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS0+RFN0cmVhbSk7CisKKwl7CisJCXNpemVfdCBjb25zdCBwb3MgPSBzZXFTdGF0ZS0+cG9zICsgc2VxLmxpdExlbmd0aDsKKwkJc2VxLm1hdGNoID0gc2VxU3RhdGUtPmJhc2UgKyBwb3MgLSBzZXEub2Zmc2V0OyAvKiBzaW5nbGUgbWVtb3J5IHNlZ21lbnQgKi8KKwkJaWYgKHNlcS5vZmZzZXQgPiBwb3MpCisJCQlzZXEubWF0Y2ggKz0gc2VxU3RhdGUtPmdvdG9EaWN0OyAvKiBzZXBhcmF0ZSBtZW1vcnkgc2VnbWVudCAqLworCQlzZXFTdGF0ZS0+cG9zID0gcG9zICsgc2VxLm1hdGNoTGVuZ3RoOworCX0KKworCS8qIEFOUyBzdGF0ZSB1cGRhdGUgKi8KKwlGU0VfdXBkYXRlU3RhdGUoJnNlcVN0YXRlLT5zdGF0ZUxMLCAmc2VxU3RhdGUtPkRTdHJlYW0pOyAvKiA8PSAgOSBiaXRzICovCisJRlNFX3VwZGF0ZVN0YXRlKCZzZXFTdGF0ZS0+c3RhdGVNTCwgJnNlcVN0YXRlLT5EU3RyZWFtKTsgLyogPD0gIDkgYml0cyAqLworCWlmIChaU1REXzMyYml0cygpKQorCQlCSVRfcmVsb2FkRFN0cmVhbSgmc2VxU3RhdGUtPkRTdHJlYW0pOwkJICAgLyogPD0gMTggYml0cyAqLworCUZTRV91cGRhdGVTdGF0ZSgmc2VxU3RhdGUtPnN0YXRlT2ZmYiwgJnNlcVN0YXRlLT5EU3RyZWFtKTsgLyogPD0gIDggYml0cyAqLworCisJcmV0dXJuIHNlcTsKK30KKworc3RhdGljIHNlcV90IFpTVERfZGVjb2RlU2VxdWVuY2VMb25nKHNlcVN0YXRlX3QgKnNlcVN0YXRlLCB1bnNpZ25lZCBjb25zdCB3aW5kb3dTaXplKQoreworCWlmIChaU1REX2hpZ2hiaXQzMih3aW5kb3dTaXplKSA+IFNUUkVBTV9BQ0NVTVVMQVRPUl9NSU4pIHsKKwkJcmV0dXJuIFpTVERfZGVjb2RlU2VxdWVuY2VMb25nX2dlbmVyaWMoc2VxU3RhdGUsIDEpOworCX0gZWxzZSB7CisJCXJldHVybiBaU1REX2RlY29kZVNlcXVlbmNlTG9uZ19nZW5lcmljKHNlcVN0YXRlLCAwKTsKKwl9Cit9CisKK0ZPUkNFX0lOTElORQorc2l6ZV90IFpTVERfZXhlY1NlcXVlbmNlTG9uZyhCWVRFICpvcCwgQllURSAqY29uc3Qgb2VuZCwgc2VxX3Qgc2VxdWVuY2UsIGNvbnN0IEJZVEUgKipsaXRQdHIsIGNvbnN0IEJZVEUgKmNvbnN0IGxpdExpbWl0LCBjb25zdCBCWVRFICpjb25zdCBiYXNlLAorCQkJICAgICBjb25zdCBCWVRFICpjb25zdCB2QmFzZSwgY29uc3QgQllURSAqY29uc3QgZGljdEVuZCkKK3sKKwlCWVRFICpjb25zdCBvTGl0RW5kID0gb3AgKyBzZXF1ZW5jZS5saXRMZW5ndGg7CisJc2l6ZV90IGNvbnN0IHNlcXVlbmNlTGVuZ3RoID0gc2VxdWVuY2UubGl0TGVuZ3RoICsgc2VxdWVuY2UubWF0Y2hMZW5ndGg7CisJQllURSAqY29uc3Qgb01hdGNoRW5kID0gb3AgKyBzZXF1ZW5jZUxlbmd0aDsgLyogcmlzayA6IGFkZHJlc3Mgc3BhY2Ugb3ZlcmZsb3cgKDMyLWJpdHMpICovCisJQllURSAqY29uc3Qgb2VuZF93ID0gb2VuZCAtIFdJTERDT1BZX09WRVJMRU5HVEg7CisJY29uc3QgQllURSAqY29uc3QgaUxpdEVuZCA9ICpsaXRQdHIgKyBzZXF1ZW5jZS5saXRMZW5ndGg7CisJY29uc3QgQllURSAqbWF0Y2ggPSBzZXF1ZW5jZS5tYXRjaDsKKworCS8qIGNoZWNrICovCisJaWYgKG9NYXRjaEVuZCA+IG9lbmQpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogbGFzdCBtYXRjaCBtdXN0IHN0YXJ0IGF0IGEgbWluaW11bSBkaXN0YW5jZSBvZiBXSUxEQ09QWV9PVkVSTEVOR1RIIGZyb20gb2VuZCAqLworCWlmIChpTGl0RW5kID4gbGl0TGltaXQpCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogb3Zlci1yZWFkIGJleW9uZCBsaXQgYnVmZmVyICovCisJaWYgKG9MaXRFbmQgPiBvZW5kX3cpCisJCXJldHVybiBaU1REX2V4ZWNTZXF1ZW5jZUxhc3Q3KG9wLCBvZW5kLCBzZXF1ZW5jZSwgbGl0UHRyLCBsaXRMaW1pdCwgYmFzZSwgdkJhc2UsIGRpY3RFbmQpOworCisJLyogY29weSBMaXRlcmFscyAqLworCVpTVERfY29weTgob3AsICpsaXRQdHIpOworCWlmIChzZXF1ZW5jZS5saXRMZW5ndGggPiA4KQorCQlaU1REX3dpbGRjb3B5KG9wICsgOCwgKCpsaXRQdHIpICsgOCwKKwkJCSAgICAgIHNlcXVlbmNlLmxpdExlbmd0aCAtIDgpOyAvKiBub3RlIDogc2luY2Ugb0xpdEVuZCA8PSBvZW5kLVdJTERDT1BZX09WRVJMRU5HVEgsIG5vIHJpc2sgb2Ygb3ZlcndyaXRlIGJleW9uZCBvZW5kICovCisJb3AgPSBvTGl0RW5kOworCSpsaXRQdHIgPSBpTGl0RW5kOyAvKiB1cGRhdGUgZm9yIG5leHQgc2VxdWVuY2UgKi8KKworCS8qIGNvcHkgTWF0Y2ggKi8KKwlpZiAoc2VxdWVuY2Uub2Zmc2V0ID4gKHNpemVfdCkob0xpdEVuZCAtIGJhc2UpKSB7CisJCS8qIG9mZnNldCBiZXlvbmQgcHJlZml4ICovCisJCWlmIChzZXF1ZW5jZS5vZmZzZXQgPiAoc2l6ZV90KShvTGl0RW5kIC0gdkJhc2UpKQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQlpZiAobWF0Y2ggKyBzZXF1ZW5jZS5tYXRjaExlbmd0aCA8PSBkaWN0RW5kKSB7CisJCQltZW1tb3ZlKG9MaXRFbmQsIG1hdGNoLCBzZXF1ZW5jZS5tYXRjaExlbmd0aCk7CisJCQlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7CisJCX0KKwkJLyogc3BhbiBleHREaWN0ICYgY3VyclByZWZpeFNlZ21lbnQgKi8KKwkJeworCQkJc2l6ZV90IGNvbnN0IGxlbmd0aDEgPSBkaWN0RW5kIC0gbWF0Y2g7CisJCQltZW1tb3ZlKG9MaXRFbmQsIG1hdGNoLCBsZW5ndGgxKTsKKwkJCW9wID0gb0xpdEVuZCArIGxlbmd0aDE7CisJCQlzZXF1ZW5jZS5tYXRjaExlbmd0aCAtPSBsZW5ndGgxOworCQkJbWF0Y2ggPSBiYXNlOworCQkJaWYgKG9wID4gb2VuZF93IHx8IHNlcXVlbmNlLm1hdGNoTGVuZ3RoIDwgTUlOTUFUQ0gpIHsKKwkJCQlVMzIgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc2VxdWVuY2UubWF0Y2hMZW5ndGg7ICsraSkKKwkJCQkJb3BbaV0gPSBtYXRjaFtpXTsKKwkJCQlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7CisJCQl9CisJCX0KKwl9CisJLyogUmVxdWlyZW1lbnQ6IG9wIDw9IG9lbmRfdyAmJiBzZXF1ZW5jZS5tYXRjaExlbmd0aCA+PSBNSU5NQVRDSCAqLworCisJLyogbWF0Y2ggd2l0aGluIHByZWZpeCAqLworCWlmIChzZXF1ZW5jZS5vZmZzZXQgPCA4KSB7CisJCS8qIGNsb3NlIHJhbmdlIG1hdGNoLCBvdmVybGFwICovCisJCXN0YXRpYyBjb25zdCBVMzIgZGVjMzJ0YWJsZVtdID0gezAsIDEsIDIsIDEsIDQsIDQsIDQsIDR9OyAgIC8qIGFkZGVkICovCisJCXN0YXRpYyBjb25zdCBpbnQgZGVjNjR0YWJsZVtdID0gezgsIDgsIDgsIDcsIDgsIDksIDEwLCAxMX07IC8qIHN1YnRyYWN0ZWQgKi8KKwkJaW50IGNvbnN0IHN1YjIgPSBkZWM2NHRhYmxlW3NlcXVlbmNlLm9mZnNldF07CisJCW9wWzBdID0gbWF0Y2hbMF07CisJCW9wWzFdID0gbWF0Y2hbMV07CisJCW9wWzJdID0gbWF0Y2hbMl07CisJCW9wWzNdID0gbWF0Y2hbM107CisJCW1hdGNoICs9IGRlYzMydGFibGVbc2VxdWVuY2Uub2Zmc2V0XTsKKwkJWlNURF9jb3B5NChvcCArIDQsIG1hdGNoKTsKKwkJbWF0Y2ggLT0gc3ViMjsKKwl9IGVsc2UgeworCQlaU1REX2NvcHk4KG9wLCBtYXRjaCk7CisJfQorCW9wICs9IDg7CisJbWF0Y2ggKz0gODsKKworCWlmIChvTWF0Y2hFbmQgPiBvZW5kIC0gKDE2IC0gTUlOTUFUQ0gpKSB7CisJCWlmIChvcCA8IG9lbmRfdykgeworCQkJWlNURF93aWxkY29weShvcCwgbWF0Y2gsIG9lbmRfdyAtIG9wKTsKKwkJCW1hdGNoICs9IG9lbmRfdyAtIG9wOworCQkJb3AgPSBvZW5kX3c7CisJCX0KKwkJd2hpbGUgKG9wIDwgb01hdGNoRW5kKQorCQkJKm9wKysgPSAqbWF0Y2grKzsKKwl9IGVsc2UgeworCQlaU1REX3dpbGRjb3B5KG9wLCBtYXRjaCwgKHB0cmRpZmZfdClzZXF1ZW5jZS5tYXRjaExlbmd0aCAtIDgpOyAvKiB3b3JrcyBldmVuIGlmIG1hdGNoTGVuZ3RoIDwgOCAqLworCX0KKwlyZXR1cm4gc2VxdWVuY2VMZW5ndGg7Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9kZWNvbXByZXNzU2VxdWVuY2VzTG9uZyhaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKnNlcVN0YXJ0LCBzaXplX3Qgc2VxU2l6ZSkKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc2VxU3RhcnQ7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlwICsgc2VxU2l6ZTsKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqIGNvbnN0KWRzdDsKKwlCWVRFICpjb25zdCBvZW5kID0gb3N0YXJ0ICsgbWF4RHN0U2l6ZTsKKwlCWVRFICpvcCA9IG9zdGFydDsKKwljb25zdCBCWVRFICpsaXRQdHIgPSBkY3R4LT5saXRQdHI7CisJY29uc3QgQllURSAqY29uc3QgbGl0RW5kID0gbGl0UHRyICsgZGN0eC0+bGl0U2l6ZTsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gKGNvbnN0IEJZVEUgKikoZGN0eC0+YmFzZSk7CisJY29uc3QgQllURSAqY29uc3QgdkJhc2UgPSAoY29uc3QgQllURSAqKShkY3R4LT52QmFzZSk7CisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IChjb25zdCBCWVRFICopKGRjdHgtPmRpY3RFbmQpOworCXVuc2lnbmVkIGNvbnN0IHdpbmRvd1NpemUgPSBkY3R4LT5mUGFyYW1zLndpbmRvd1NpemU7CisJaW50IG5iU2VxOworCisJLyogQnVpbGQgRGVjb2RpbmcgVGFibGVzICovCisJeworCQlzaXplX3QgY29uc3Qgc2VxSFNpemUgPSBaU1REX2RlY29kZVNlcUhlYWRlcnMoZGN0eCwgJm5iU2VxLCBpcCwgc2VxU2l6ZSk7CisJCWlmIChaU1REX2lzRXJyb3Ioc2VxSFNpemUpKQorCQkJcmV0dXJuIHNlcUhTaXplOworCQlpcCArPSBzZXFIU2l6ZTsKKwl9CisKKwkvKiBSZWdlbiBzZXF1ZW5jZXMgKi8KKwlpZiAobmJTZXEpIHsKKyNkZWZpbmUgU1RPUkVEX1NFUVMgNAorI2RlZmluZSBTVE9TRVFfTUFTSyAoU1RPUkVEX1NFUVMgLSAxKQorI2RlZmluZSBBRFZBTkNFRF9TRVFTIDQKKwkJc2VxX3QgKnNlcXVlbmNlcyA9IChzZXFfdCAqKWRjdHgtPmVudHJvcHkud29ya3NwYWNlOworCQlpbnQgY29uc3Qgc2VxQWR2YW5jZSA9IE1JTihuYlNlcSwgQURWQU5DRURfU0VRUyk7CisJCXNlcVN0YXRlX3Qgc2VxU3RhdGU7CisJCWludCBzZXFOYjsKKwkJWlNURF9TVEFUSUNfQVNTRVJUKHNpemVvZihkY3R4LT5lbnRyb3B5LndvcmtzcGFjZSkgPj0gc2l6ZW9mKHNlcV90KSAqIFNUT1JFRF9TRVFTKTsKKwkJZGN0eC0+ZnNlRW50cm9weSA9IDE7CisJCXsKKwkJCVUzMiBpOworCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJCXNlcVN0YXRlLnByZXZPZmZzZXRbaV0gPSBkY3R4LT5lbnRyb3B5LnJlcFtpXTsKKwkJfQorCQlzZXFTdGF0ZS5iYXNlID0gYmFzZTsKKwkJc2VxU3RhdGUucG9zID0gKHNpemVfdCkob3AgLSBiYXNlKTsKKwkJc2VxU3RhdGUuZ290b0RpY3QgPSAodVB0ckRpZmYpZGljdEVuZCAtICh1UHRyRGlmZiliYXNlOyAvKiBjYXN0IHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgKi8KKwkJQ0hFQ0tfRShCSVRfaW5pdERTdHJlYW0oJnNlcVN0YXRlLkRTdHJlYW0sIGlwLCBpZW5kIC0gaXApLCBjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJRlNFX2luaXREU3RhdGUoJnNlcVN0YXRlLnN0YXRlTEwsICZzZXFTdGF0ZS5EU3RyZWFtLCBkY3R4LT5MTFRwdHIpOworCQlGU0VfaW5pdERTdGF0ZSgmc2VxU3RhdGUuc3RhdGVPZmZiLCAmc2VxU3RhdGUuRFN0cmVhbSwgZGN0eC0+T0ZUcHRyKTsKKwkJRlNFX2luaXREU3RhdGUoJnNlcVN0YXRlLnN0YXRlTUwsICZzZXFTdGF0ZS5EU3RyZWFtLCBkY3R4LT5NTFRwdHIpOworCisJCS8qIHByZXBhcmUgaW4gYWR2YW5jZSAqLworCQlmb3IgKHNlcU5iID0gMDsgKEJJVF9yZWxvYWREU3RyZWFtKCZzZXFTdGF0ZS5EU3RyZWFtKSA8PSBCSVRfRFN0cmVhbV9jb21wbGV0ZWQpICYmIHNlcU5iIDwgc2VxQWR2YW5jZTsgc2VxTmIrKykgeworCQkJc2VxdWVuY2VzW3NlcU5iXSA9IFpTVERfZGVjb2RlU2VxdWVuY2VMb25nKCZzZXFTdGF0ZSwgd2luZG93U2l6ZSk7CisJCX0KKwkJaWYgKHNlcU5iIDwgc2VxQWR2YW5jZSkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKworCQkvKiBkZWNvZGUgYW5kIGRlY29tcHJlc3MgKi8KKwkJZm9yICg7IChCSVRfcmVsb2FkRFN0cmVhbSgmKHNlcVN0YXRlLkRTdHJlYW0pKSA8PSBCSVRfRFN0cmVhbV9jb21wbGV0ZWQpICYmIHNlcU5iIDwgbmJTZXE7IHNlcU5iKyspIHsKKwkJCXNlcV90IGNvbnN0IHNlcXVlbmNlID0gWlNURF9kZWNvZGVTZXF1ZW5jZUxvbmcoJnNlcVN0YXRlLCB3aW5kb3dTaXplKTsKKwkJCXNpemVfdCBjb25zdCBvbmVTZXFTaXplID0KKwkJCSAgICBaU1REX2V4ZWNTZXF1ZW5jZUxvbmcob3AsIG9lbmQsIHNlcXVlbmNlc1soc2VxTmIgLSBBRFZBTkNFRF9TRVFTKSAmIFNUT1NFUV9NQVNLXSwgJmxpdFB0ciwgbGl0RW5kLCBiYXNlLCB2QmFzZSwgZGljdEVuZCk7CisJCQlpZiAoWlNURF9pc0Vycm9yKG9uZVNlcVNpemUpKQorCQkJCXJldHVybiBvbmVTZXFTaXplOworCQkJWlNURF9QUkVGRVRDSChzZXF1ZW5jZS5tYXRjaCk7CisJCQlzZXF1ZW5jZXNbc2VxTmIgJiBTVE9TRVFfTUFTS10gPSBzZXF1ZW5jZTsKKwkJCW9wICs9IG9uZVNlcVNpemU7CisJCX0KKwkJaWYgKHNlcU5iIDwgbmJTZXEpCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisKKwkJLyogZmluaXNoIHF1ZXVlICovCisJCXNlcU5iIC09IHNlcUFkdmFuY2U7CisJCWZvciAoOyBzZXFOYiA8IG5iU2VxOyBzZXFOYisrKSB7CisJCQlzaXplX3QgY29uc3Qgb25lU2VxU2l6ZSA9IFpTVERfZXhlY1NlcXVlbmNlTG9uZyhvcCwgb2VuZCwgc2VxdWVuY2VzW3NlcU5iICYgU1RPU0VRX01BU0tdLCAmbGl0UHRyLCBsaXRFbmQsIGJhc2UsIHZCYXNlLCBkaWN0RW5kKTsKKwkJCWlmIChaU1REX2lzRXJyb3Iob25lU2VxU2l6ZSkpCisJCQkJcmV0dXJuIG9uZVNlcVNpemU7CisJCQlvcCArPSBvbmVTZXFTaXplOworCQl9CisKKwkJLyogc2F2ZSByZXBzIGZvciBuZXh0IGJsb2NrICovCisJCXsKKwkJCVUzMiBpOworCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJCWRjdHgtPmVudHJvcHkucmVwW2ldID0gKFUzMikoc2VxU3RhdGUucHJldk9mZnNldFtpXSk7CisJCX0KKwl9CisKKwkvKiBsYXN0IGxpdGVyYWwgc2VnbWVudCAqLworCXsKKwkJc2l6ZV90IGNvbnN0IGxhc3RMTFNpemUgPSBsaXRFbmQgLSBsaXRQdHI7CisJCWlmIChsYXN0TExTaXplID4gKHNpemVfdCkob2VuZCAtIG9wKSkKKwkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwkJbWVtY3B5KG9wLCBsaXRQdHIsIGxhc3RMTFNpemUpOworCQlvcCArPSBsYXN0TExTaXplOworCX0KKworCXJldHVybiBvcCAtIG9zdGFydDsKK30KKworc3RhdGljIHNpemVfdCBaU1REX2RlY29tcHJlc3NCbG9ja19pbnRlcm5hbChaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreyAvKiBibG9ja1R5cGUgPT0gYmxvY2tDb21wcmVzc2VkICovCisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKXNyYzsKKworCWlmIChzcmNTaXplID49IFpTVERfQkxPQ0tTSVpFX0FCU09MVVRFTUFYKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisKKwkvKiBEZWNvZGUgbGl0ZXJhbHMgc2VjdGlvbiAqLworCXsKKwkJc2l6ZV90IGNvbnN0IGxpdENTaXplID0gWlNURF9kZWNvZGVMaXRlcmFsc0Jsb2NrKGRjdHgsIHNyYywgc3JjU2l6ZSk7CisJCWlmIChaU1REX2lzRXJyb3IobGl0Q1NpemUpKQorCQkJcmV0dXJuIGxpdENTaXplOworCQlpcCArPSBsaXRDU2l6ZTsKKwkJc3JjU2l6ZSAtPSBsaXRDU2l6ZTsKKwl9CisJaWYgKHNpemVvZihzaXplX3QpID4gNCkgLyogZG8gbm90IGVuYWJsZSBwcmVmZXRjaGluZyBvbiAzMi1iaXRzIHg4NiwgYXMgaXQncyBwZXJmb3JtYW5jZSBkZXRyaW1lbnRhbCAqLworCQkJCS8qIGxpa2VseSBiZWNhdXNlIG9mIHJlZ2lzdGVyIHByZXNzdXJlICovCisJCQkJLyogaWYgdGhhdCdzIHRoZSBjb3JyZWN0IGNhdXNlLCB0aGVuIDMyLWJpdHMgQVJNIHNob3VsZCBiZSBhZmZlY3RlZCBkaWZmZXJlbnRseSAqLworCQkJCS8qIGl0IHdvdWxkIGJlIGdvb2QgdG8gdGVzdCB0aGlzIG9uIEFSTSByZWFsIGhhcmR3YXJlLCB0byBzZWUgaWYgcHJlZmV0Y2ggdmVyc2lvbiBpbXByb3ZlcyBzcGVlZCAqLworCQlpZiAoZGN0eC0+ZlBhcmFtcy53aW5kb3dTaXplID4gKDEgPDwgMjMpKQorCQkJcmV0dXJuIFpTVERfZGVjb21wcmVzc1NlcXVlbmNlc0xvbmcoZGN0eCwgZHN0LCBkc3RDYXBhY2l0eSwgaXAsIHNyY1NpemUpOworCXJldHVybiBaU1REX2RlY29tcHJlc3NTZXF1ZW5jZXMoZGN0eCwgZHN0LCBkc3RDYXBhY2l0eSwgaXAsIHNyY1NpemUpOworfQorCitzdGF0aWMgdm9pZCBaU1REX2NoZWNrQ29udGludWl0eShaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKmRzdCkKK3sKKwlpZiAoZHN0ICE9IGRjdHgtPnByZXZpb3VzRHN0RW5kKSB7IC8qIG5vdCBjb250aWd1b3VzICovCisJCWRjdHgtPmRpY3RFbmQgPSBkY3R4LT5wcmV2aW91c0RzdEVuZDsKKwkJZGN0eC0+dkJhc2UgPSAoY29uc3QgY2hhciAqKWRzdCAtICgoY29uc3QgY2hhciAqKShkY3R4LT5wcmV2aW91c0RzdEVuZCkgLSAoY29uc3QgY2hhciAqKShkY3R4LT5iYXNlKSk7CisJCWRjdHgtPmJhc2UgPSBkc3Q7CisJCWRjdHgtPnByZXZpb3VzRHN0RW5kID0gZHN0OworCX0KK30KKworc2l6ZV90IFpTVERfZGVjb21wcmVzc0Jsb2NrKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJc2l6ZV90IGRTaXplOworCVpTVERfY2hlY2tDb250aW51aXR5KGRjdHgsIGRzdCk7CisJZFNpemUgPSBaU1REX2RlY29tcHJlc3NCbG9ja19pbnRlcm5hbChkY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUpOworCWRjdHgtPnByZXZpb3VzRHN0RW5kID0gKGNoYXIgKilkc3QgKyBkU2l6ZTsKKwlyZXR1cm4gZFNpemU7Cit9CisKKy8qKiBaU1REX2luc2VydEJsb2NrKCkgOgorCWluc2VydCBgc3JjYCBibG9jayBpbnRvIGBkY3R4YCBoaXN0b3J5LiBVc2VmdWwgdG8gdHJhY2sgdW5jb21wcmVzc2VkIGJsb2Nrcy4gKi8KK3NpemVfdCBaU1REX2luc2VydEJsb2NrKFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqYmxvY2tTdGFydCwgc2l6ZV90IGJsb2NrU2l6ZSkKK3sKKwlaU1REX2NoZWNrQ29udGludWl0eShkY3R4LCBibG9ja1N0YXJ0KTsKKwlkY3R4LT5wcmV2aW91c0RzdEVuZCA9IChjb25zdCBjaGFyICopYmxvY2tTdGFydCArIGJsb2NrU2l6ZTsKKwlyZXR1cm4gYmxvY2tTaXplOworfQorCitzaXplX3QgWlNURF9nZW5lcmF0ZU54Qnl0ZXModm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIEJZVEUgYnl0ZSwgc2l6ZV90IGxlbmd0aCkKK3sKKwlpZiAobGVuZ3RoID4gZHN0Q2FwYWNpdHkpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwltZW1zZXQoZHN0LCBieXRlLCBsZW5ndGgpOworCXJldHVybiBsZW5ndGg7Cit9CisKKy8qKiBaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKCkgOgorICogIGNvbXBhdGlibGUgd2l0aCBsZWdhY3kgbW9kZQorICogIGBzcmNgIG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIGEgWlNURCBmcmFtZSwgWlNURCBsZWdhY3kgZnJhbWUsIG9yIHNraXBwYWJsZSBmcmFtZQorICogIGBzcmNTaXplYCBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBmcmFtZSBjb250YWluZWQKKyAqICBAcmV0dXJuIDogdGhlIGNvbXByZXNzZWQgc2l6ZSBvZiB0aGUgZnJhbWUgc3RhcnRpbmcgYXQgYHNyY2AgKi8KK3NpemVfdCBaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJaWYgKHNyY1NpemUgPj0gWlNURF9za2lwcGFibGVIZWFkZXJTaXplICYmIChaU1REX3JlYWRMRTMyKHNyYykgJiAweEZGRkZGRkYwVSkgPT0gWlNURF9NQUdJQ19TS0lQUEFCTEVfU1RBUlQpIHsKKwkJcmV0dXJuIFpTVERfc2tpcHBhYmxlSGVhZGVyU2l6ZSArIFpTVERfcmVhZExFMzIoKGNvbnN0IEJZVEUgKilzcmMgKyA0KTsKKwl9IGVsc2UgeworCQljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc3JjOworCQljb25zdCBCWVRFICpjb25zdCBpcHN0YXJ0ID0gaXA7CisJCXNpemVfdCByZW1haW5pbmdTaXplID0gc3JjU2l6ZTsKKwkJWlNURF9mcmFtZVBhcmFtcyBmUGFyYW1zOworCisJCXNpemVfdCBjb25zdCBoZWFkZXJTaXplID0gWlNURF9mcmFtZUhlYWRlclNpemUoaXAsIHJlbWFpbmluZ1NpemUpOworCQlpZiAoWlNURF9pc0Vycm9yKGhlYWRlclNpemUpKQorCQkJcmV0dXJuIGhlYWRlclNpemU7CisKKwkJLyogRnJhbWUgSGVhZGVyICovCisJCXsKKwkJCXNpemVfdCBjb25zdCByZXQgPSBaU1REX2dldEZyYW1lUGFyYW1zKCZmUGFyYW1zLCBpcCwgcmVtYWluaW5nU2l6ZSk7CisJCQlpZiAoWlNURF9pc0Vycm9yKHJldCkpCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChyZXQgPiAwKQorCQkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwkJfQorCisJCWlwICs9IGhlYWRlclNpemU7CisJCXJlbWFpbmluZ1NpemUgLT0gaGVhZGVyU2l6ZTsKKworCQkvKiBMb29wIG9uIGVhY2ggYmxvY2sgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCWJsb2NrUHJvcGVydGllc190IGJsb2NrUHJvcGVydGllczsKKwkJCXNpemVfdCBjb25zdCBjQmxvY2tTaXplID0gWlNURF9nZXRjQmxvY2tTaXplKGlwLCByZW1haW5pbmdTaXplLCAmYmxvY2tQcm9wZXJ0aWVzKTsKKwkJCWlmIChaU1REX2lzRXJyb3IoY0Jsb2NrU2l6ZSkpCisJCQkJcmV0dXJuIGNCbG9ja1NpemU7CisKKwkJCWlmIChaU1REX2Jsb2NrSGVhZGVyU2l6ZSArIGNCbG9ja1NpemUgPiByZW1haW5pbmdTaXplKQorCQkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKworCQkJaXAgKz0gWlNURF9ibG9ja0hlYWRlclNpemUgKyBjQmxvY2tTaXplOworCQkJcmVtYWluaW5nU2l6ZSAtPSBaU1REX2Jsb2NrSGVhZGVyU2l6ZSArIGNCbG9ja1NpemU7CisKKwkJCWlmIChibG9ja1Byb3BlcnRpZXMubGFzdEJsb2NrKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGZQYXJhbXMuY2hlY2tzdW1GbGFnKSB7IC8qIEZyYW1lIGNvbnRlbnQgY2hlY2tzdW0gKi8KKwkJCWlmIChyZW1haW5pbmdTaXplIDwgNCkKKwkJCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJCQlpcCArPSA0OworCQkJcmVtYWluaW5nU2l6ZSAtPSA0OworCQl9CisKKwkJcmV0dXJuIGlwIC0gaXBzdGFydDsKKwl9Cit9CisKKy8qISBaU1REX2RlY29tcHJlc3NGcmFtZSgpIDoKKyogICBAZGN0eCBtdXN0IGJlIHByb3Blcmx5IGluaXRpYWxpemVkICovCitzdGF0aWMgc2l6ZV90IFpTVERfZGVjb21wcmVzc0ZyYW1lKFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKipzcmNQdHIsIHNpemVfdCAqc3JjU2l6ZVB0cikKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopKCpzcmNQdHIpOworCUJZVEUgKmNvbnN0IG9zdGFydCA9IChCWVRFICogY29uc3QpZHN0OworCUJZVEUgKmNvbnN0IG9lbmQgPSBvc3RhcnQgKyBkc3RDYXBhY2l0eTsKKwlCWVRFICpvcCA9IG9zdGFydDsKKwlzaXplX3QgcmVtYWluaW5nU2l6ZSA9ICpzcmNTaXplUHRyOworCisJLyogY2hlY2sgKi8KKwlpZiAocmVtYWluaW5nU2l6ZSA8IFpTVERfZnJhbWVIZWFkZXJTaXplX21pbiArIFpTVERfYmxvY2tIZWFkZXJTaXplKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisKKwkvKiBGcmFtZSBIZWFkZXIgKi8KKwl7CisJCXNpemVfdCBjb25zdCBmcmFtZUhlYWRlclNpemUgPSBaU1REX2ZyYW1lSGVhZGVyU2l6ZShpcCwgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KTsKKwkJaWYgKFpTVERfaXNFcnJvcihmcmFtZUhlYWRlclNpemUpKQorCQkJcmV0dXJuIGZyYW1lSGVhZGVyU2l6ZTsKKwkJaWYgKHJlbWFpbmluZ1NpemUgPCBmcmFtZUhlYWRlclNpemUgKyBaU1REX2Jsb2NrSGVhZGVyU2l6ZSkKKwkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwkJQ0hFQ0tfRihaU1REX2RlY29kZUZyYW1lSGVhZGVyKGRjdHgsIGlwLCBmcmFtZUhlYWRlclNpemUpKTsKKwkJaXAgKz0gZnJhbWVIZWFkZXJTaXplOworCQlyZW1haW5pbmdTaXplIC09IGZyYW1lSGVhZGVyU2l6ZTsKKwl9CisKKwkvKiBMb29wIG9uIGVhY2ggYmxvY2sgKi8KKwl3aGlsZSAoMSkgeworCQlzaXplX3QgZGVjb2RlZFNpemU7CisJCWJsb2NrUHJvcGVydGllc190IGJsb2NrUHJvcGVydGllczsKKwkJc2l6ZV90IGNvbnN0IGNCbG9ja1NpemUgPSBaU1REX2dldGNCbG9ja1NpemUoaXAsIHJlbWFpbmluZ1NpemUsICZibG9ja1Byb3BlcnRpZXMpOworCQlpZiAoWlNURF9pc0Vycm9yKGNCbG9ja1NpemUpKQorCQkJcmV0dXJuIGNCbG9ja1NpemU7CisKKwkJaXAgKz0gWlNURF9ibG9ja0hlYWRlclNpemU7CisJCXJlbWFpbmluZ1NpemUgLT0gWlNURF9ibG9ja0hlYWRlclNpemU7CisJCWlmIChjQmxvY2tTaXplID4gcmVtYWluaW5nU2l6ZSkKKwkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKworCQlzd2l0Y2ggKGJsb2NrUHJvcGVydGllcy5ibG9ja1R5cGUpIHsKKwkJY2FzZSBidF9jb21wcmVzc2VkOiBkZWNvZGVkU2l6ZSA9IFpTVERfZGVjb21wcmVzc0Jsb2NrX2ludGVybmFsKGRjdHgsIG9wLCBvZW5kIC0gb3AsIGlwLCBjQmxvY2tTaXplKTsgYnJlYWs7CisJCWNhc2UgYnRfcmF3OiBkZWNvZGVkU2l6ZSA9IFpTVERfY29weVJhd0Jsb2NrKG9wLCBvZW5kIC0gb3AsIGlwLCBjQmxvY2tTaXplKTsgYnJlYWs7CisJCWNhc2UgYnRfcmxlOiBkZWNvZGVkU2l6ZSA9IFpTVERfZ2VuZXJhdGVOeEJ5dGVzKG9wLCBvZW5kIC0gb3AsICppcCwgYmxvY2tQcm9wZXJ0aWVzLm9yaWdTaXplKTsgYnJlYWs7CisJCWNhc2UgYnRfcmVzZXJ2ZWQ6CisJCWRlZmF1bHQ6IHJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJfQorCisJCWlmIChaU1REX2lzRXJyb3IoZGVjb2RlZFNpemUpKQorCQkJcmV0dXJuIGRlY29kZWRTaXplOworCQlpZiAoZGN0eC0+ZlBhcmFtcy5jaGVja3N1bUZsYWcpCisJCQl4eGg2NF91cGRhdGUoJmRjdHgtPnh4aFN0YXRlLCBvcCwgZGVjb2RlZFNpemUpOworCQlvcCArPSBkZWNvZGVkU2l6ZTsKKwkJaXAgKz0gY0Jsb2NrU2l6ZTsKKwkJcmVtYWluaW5nU2l6ZSAtPSBjQmxvY2tTaXplOworCQlpZiAoYmxvY2tQcm9wZXJ0aWVzLmxhc3RCbG9jaykKKwkJCWJyZWFrOworCX0KKworCWlmIChkY3R4LT5mUGFyYW1zLmNoZWNrc3VtRmxhZykgeyAvKiBGcmFtZSBjb250ZW50IGNoZWNrc3VtIHZlcmlmaWNhdGlvbiAqLworCQlVMzIgY29uc3QgY2hlY2tDYWxjID0gKFUzMil4eGg2NF9kaWdlc3QoJmRjdHgtPnh4aFN0YXRlKTsKKwkJVTMyIGNoZWNrUmVhZDsKKwkJaWYgKHJlbWFpbmluZ1NpemUgPCA0KQorCQkJcmV0dXJuIEVSUk9SKGNoZWNrc3VtX3dyb25nKTsKKwkJY2hlY2tSZWFkID0gWlNURF9yZWFkTEUzMihpcCk7CisJCWlmIChjaGVja1JlYWQgIT0gY2hlY2tDYWxjKQorCQkJcmV0dXJuIEVSUk9SKGNoZWNrc3VtX3dyb25nKTsKKwkJaXAgKz0gNDsKKwkJcmVtYWluaW5nU2l6ZSAtPSA0OworCX0KKworCS8qIEFsbG93IGNhbGxlciB0byBnZXQgc2l6ZSByZWFkICovCisJKnNyY1B0ciA9IGlwOworCSpzcmNTaXplUHRyID0gcmVtYWluaW5nU2l6ZTsKKwlyZXR1cm4gb3AgLSBvc3RhcnQ7Cit9CisKK3N0YXRpYyBjb25zdCB2b2lkICpaU1REX0REaWN0RGljdENvbnRlbnQoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOworc3RhdGljIHNpemVfdCBaU1REX0REaWN0RGljdFNpemUoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpOworCitzdGF0aWMgc2l6ZV90IFpTVERfZGVjb21wcmVzc011bHRpRnJhbWUoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplLAorCQkJCQljb25zdCBaU1REX0REaWN0ICpkZGljdCkKK3sKKwl2b2lkICpjb25zdCBkc3RzdGFydCA9IGRzdDsKKworCWlmIChkZGljdCkgeworCQlpZiAoZGljdCkgeworCQkJLyogcHJvZ3JhbW1lciBlcnJvciwgdGhlc2UgdHdvIGNhc2VzIHNob3VsZCBiZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwkJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwkJfQorCisJCWRpY3QgPSBaU1REX0REaWN0RGljdENvbnRlbnQoZGRpY3QpOworCQlkaWN0U2l6ZSA9IFpTVERfRERpY3REaWN0U2l6ZShkZGljdCk7CisJfQorCisJd2hpbGUgKHNyY1NpemUgPj0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KSB7CisJCVUzMiBtYWdpY051bWJlcjsKKworCQltYWdpY051bWJlciA9IFpTVERfcmVhZExFMzIoc3JjKTsKKwkJaWYgKG1hZ2ljTnVtYmVyICE9IFpTVERfTUFHSUNOVU1CRVIpIHsKKwkJCWlmICgobWFnaWNOdW1iZXIgJiAweEZGRkZGRkYwVSkgPT0gWlNURF9NQUdJQ19TS0lQUEFCTEVfU1RBUlQpIHsKKwkJCQlzaXplX3Qgc2tpcHBhYmxlU2l6ZTsKKwkJCQlpZiAoc3JjU2l6ZSA8IFpTVERfc2tpcHBhYmxlSGVhZGVyU2l6ZSkKKwkJCQkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCQkJCXNraXBwYWJsZVNpemUgPSBaU1REX3JlYWRMRTMyKChjb25zdCBCWVRFICopc3JjICsgNCkgKyBaU1REX3NraXBwYWJsZUhlYWRlclNpemU7CisJCQkJaWYgKHNyY1NpemUgPCBza2lwcGFibGVTaXplKSB7CisJCQkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwkJCQl9CisKKwkJCQlzcmMgPSAoY29uc3QgQllURSAqKXNyYyArIHNraXBwYWJsZVNpemU7CisJCQkJc3JjU2l6ZSAtPSBza2lwcGFibGVTaXplOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gRVJST1IocHJlZml4X3Vua25vd24pOworCQkJfQorCQl9CisKKwkJaWYgKGRkaWN0KSB7CisJCQkvKiB3ZSB3ZXJlIGNhbGxlZCBmcm9tIFpTVERfZGVjb21wcmVzc191c2luZ0REaWN0ICovCisJCQlaU1REX3JlZkREaWN0KGRjdHgsIGRkaWN0KTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoaXMgd2lsbCBpbml0aWFsaXplIGNvcnJlY3RseSB3aXRoIG5vIGRpY3QgaWYgZGljdCA9PSBOVUxMLCBzbworCQkJICogdXNlIHRoaXMgaW4gYWxsIGNhc2VzIGJ1dCBkZGljdCAqLworCQkJQ0hFQ0tfRihaU1REX2RlY29tcHJlc3NCZWdpbl91c2luZ0RpY3QoZGN0eCwgZGljdCwgZGljdFNpemUpKTsKKwkJfQorCQlaU1REX2NoZWNrQ29udGludWl0eShkY3R4LCBkc3QpOworCisJCXsKKwkJCWNvbnN0IHNpemVfdCByZXMgPSBaU1REX2RlY29tcHJlc3NGcmFtZShkY3R4LCBkc3QsIGRzdENhcGFjaXR5LCAmc3JjLCAmc3JjU2l6ZSk7CisJCQlpZiAoWlNURF9pc0Vycm9yKHJlcykpCisJCQkJcmV0dXJuIHJlczsKKwkJCS8qIGRvbid0IG5lZWQgdG8gYm91bmRzIGNoZWNrIHRoaXMsIFpTVERfZGVjb21wcmVzc0ZyYW1lIHdpbGwgaGF2ZQorCQkJICogYWxyZWFkeSAqLworCQkJZHN0ID0gKEJZVEUgKilkc3QgKyByZXM7CisJCQlkc3RDYXBhY2l0eSAtPSByZXM7CisJCX0KKwl9CisKKwlpZiAoc3JjU2l6ZSkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOyAvKiBpbnB1dCBub3QgZW50aXJlbHkgY29uc3VtZWQgKi8KKworCXJldHVybiAoQllURSAqKWRzdCAtIChCWVRFICopZHN0c3RhcnQ7Cit9CisKK3NpemVfdCBaU1REX2RlY29tcHJlc3NfdXNpbmdEaWN0KFpTVERfREN0eCAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkKK3sKKwlyZXR1cm4gWlNURF9kZWNvbXByZXNzTXVsdGlGcmFtZShkY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIGRpY3QsIGRpY3RTaXplLCBOVUxMKTsKK30KKworc2l6ZV90IFpTVERfZGVjb21wcmVzc0RDdHgoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwlyZXR1cm4gWlNURF9kZWNvbXByZXNzX3VzaW5nRGljdChkY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIE5VTEwsIDApOworfQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgIEFkdmFuY2VkIFN0cmVhbWluZyBEZWNvbXByZXNzaW9uIEFQSQorKiAgIEJ1ZmZlcmxlc3MgYW5kIHN5bmNocm9ub3VzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc2l6ZV90IFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoWlNURF9EQ3R4ICpkY3R4KSB7IHJldHVybiBkY3R4LT5leHBlY3RlZDsgfQorCitaU1REX25leHRJbnB1dFR5cGVfZSBaU1REX25leHRJbnB1dFR5cGUoWlNURF9EQ3R4ICpkY3R4KQoreworCXN3aXRjaCAoZGN0eC0+c3RhZ2UpIHsKKwlkZWZhdWx0OiAvKiBzaG91bGQgbm90IGhhcHBlbiAqLworCWNhc2UgWlNURGRzX2dldEZyYW1lSGVhZGVyU2l6ZToKKwljYXNlIFpTVERkc19kZWNvZGVGcmFtZUhlYWRlcjogcmV0dXJuIFpTVERuaXRfZnJhbWVIZWFkZXI7CisJY2FzZSBaU1REZHNfZGVjb2RlQmxvY2tIZWFkZXI6IHJldHVybiBaU1REbml0X2Jsb2NrSGVhZGVyOworCWNhc2UgWlNURGRzX2RlY29tcHJlc3NCbG9jazogcmV0dXJuIFpTVERuaXRfYmxvY2s7CisJY2FzZSBaU1REZHNfZGVjb21wcmVzc0xhc3RCbG9jazogcmV0dXJuIFpTVERuaXRfbGFzdEJsb2NrOworCWNhc2UgWlNURGRzX2NoZWNrQ2hlY2tzdW06IHJldHVybiBaU1REbml0X2NoZWNrc3VtOworCWNhc2UgWlNURGRzX2RlY29kZVNraXBwYWJsZUhlYWRlcjoKKwljYXNlIFpTVERkc19za2lwRnJhbWU6IHJldHVybiBaU1REbml0X3NraXBwYWJsZUZyYW1lOworCX0KK30KKworaW50IFpTVERfaXNTa2lwRnJhbWUoWlNURF9EQ3R4ICpkY3R4KSB7IHJldHVybiBkY3R4LT5zdGFnZSA9PSBaU1REZHNfc2tpcEZyYW1lOyB9IC8qIGZvciB6YnVmZiAqLworCisvKiogWlNURF9kZWNvbXByZXNzQ29udGludWUoKSA6CisqICAgQHJldHVybiA6IG5iIG9mIGJ5dGVzIGdlbmVyYXRlZCBpbnRvIGBkc3RgIChuZWNlc3NhcmlseSA8PSBgZHN0Q2FwYWNpdHkpCisqICAgICAgICAgICAgIG9yIGFuIGVycm9yIGNvZGUsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgWlNURF9pc0Vycm9yKCkgKi8KK3NpemVfdCBaU1REX2RlY29tcHJlc3NDb250aW51ZShaU1REX0RDdHggKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdENhcGFjaXR5LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCS8qIFNhbml0eSBjaGVjayAqLworCWlmIChzcmNTaXplICE9IGRjdHgtPmV4cGVjdGVkKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJaWYgKGRzdENhcGFjaXR5KQorCQlaU1REX2NoZWNrQ29udGludWl0eShkY3R4LCBkc3QpOworCisJc3dpdGNoIChkY3R4LT5zdGFnZSkgeworCWNhc2UgWlNURGRzX2dldEZyYW1lSGVhZGVyU2l6ZToKKwkJaWYgKHNyY1NpemUgIT0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KQorCQkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOwkJCQkJLyogaW1wb3NzaWJsZSAqLworCQlpZiAoKFpTVERfcmVhZExFMzIoc3JjKSAmIDB4RkZGRkZGRjBVKSA9PSBaU1REX01BR0lDX1NLSVBQQUJMRV9TVEFSVCkgeyAvKiBza2lwcGFibGUgZnJhbWUgKi8KKwkJCW1lbWNweShkY3R4LT5oZWFkZXJCdWZmZXIsIHNyYywgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KTsKKwkJCWRjdHgtPmV4cGVjdGVkID0gWlNURF9za2lwcGFibGVIZWFkZXJTaXplIC0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4OyAvKiBtYWdpYyBudW1iZXIgKyBza2lwcGFibGUgZnJhbWUgbGVuZ3RoICovCisJCQlkY3R4LT5zdGFnZSA9IFpTVERkc19kZWNvZGVTa2lwcGFibGVIZWFkZXI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkY3R4LT5oZWFkZXJTaXplID0gWlNURF9mcmFtZUhlYWRlclNpemUoc3JjLCBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXgpOworCQlpZiAoWlNURF9pc0Vycm9yKGRjdHgtPmhlYWRlclNpemUpKQorCQkJcmV0dXJuIGRjdHgtPmhlYWRlclNpemU7CisJCW1lbWNweShkY3R4LT5oZWFkZXJCdWZmZXIsIHNyYywgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4KTsKKwkJaWYgKGRjdHgtPmhlYWRlclNpemUgPiBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXgpIHsKKwkJCWRjdHgtPmV4cGVjdGVkID0gZGN0eC0+aGVhZGVyU2l6ZSAtIFpTVERfZnJhbWVIZWFkZXJTaXplX3ByZWZpeDsKKwkJCWRjdHgtPnN0YWdlID0gWlNURGRzX2RlY29kZUZyYW1lSGVhZGVyOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZGN0eC0+ZXhwZWN0ZWQgPSAwOyAvKiBub3QgbmVjZXNzYXJ5IHRvIGNvcHkgbW9yZSAqLworCisJY2FzZSBaU1REZHNfZGVjb2RlRnJhbWVIZWFkZXI6CisJCW1lbWNweShkY3R4LT5oZWFkZXJCdWZmZXIgKyBaU1REX2ZyYW1lSGVhZGVyU2l6ZV9wcmVmaXgsIHNyYywgZGN0eC0+ZXhwZWN0ZWQpOworCQlDSEVDS19GKFpTVERfZGVjb2RlRnJhbWVIZWFkZXIoZGN0eCwgZGN0eC0+aGVhZGVyQnVmZmVyLCBkY3R4LT5oZWFkZXJTaXplKSk7CisJCWRjdHgtPmV4cGVjdGVkID0gWlNURF9ibG9ja0hlYWRlclNpemU7CisJCWRjdHgtPnN0YWdlID0gWlNURGRzX2RlY29kZUJsb2NrSGVhZGVyOworCQlyZXR1cm4gMDsKKworCWNhc2UgWlNURGRzX2RlY29kZUJsb2NrSGVhZGVyOiB7CisJCWJsb2NrUHJvcGVydGllc190IGJwOworCQlzaXplX3QgY29uc3QgY0Jsb2NrU2l6ZSA9IFpTVERfZ2V0Y0Jsb2NrU2l6ZShzcmMsIFpTVERfYmxvY2tIZWFkZXJTaXplLCAmYnApOworCQlpZiAoWlNURF9pc0Vycm9yKGNCbG9ja1NpemUpKQorCQkJcmV0dXJuIGNCbG9ja1NpemU7CisJCWRjdHgtPmV4cGVjdGVkID0gY0Jsb2NrU2l6ZTsKKwkJZGN0eC0+YlR5cGUgPSBicC5ibG9ja1R5cGU7CisJCWRjdHgtPnJsZVNpemUgPSBicC5vcmlnU2l6ZTsKKwkJaWYgKGNCbG9ja1NpemUpIHsKKwkJCWRjdHgtPnN0YWdlID0gYnAubGFzdEJsb2NrID8gWlNURGRzX2RlY29tcHJlc3NMYXN0QmxvY2sgOiBaU1REZHNfZGVjb21wcmVzc0Jsb2NrOworCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogZW1wdHkgYmxvY2sgKi8KKwkJaWYgKGJwLmxhc3RCbG9jaykgeworCQkJaWYgKGRjdHgtPmZQYXJhbXMuY2hlY2tzdW1GbGFnKSB7CisJCQkJZGN0eC0+ZXhwZWN0ZWQgPSA0OworCQkJCWRjdHgtPnN0YWdlID0gWlNURGRzX2NoZWNrQ2hlY2tzdW07CisJCQl9IGVsc2UgeworCQkJCWRjdHgtPmV4cGVjdGVkID0gMDsgLyogZW5kIG9mIGZyYW1lICovCisJCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZ2V0RnJhbWVIZWFkZXJTaXplOworCQkJfQorCQl9IGVsc2UgeworCQkJZGN0eC0+ZXhwZWN0ZWQgPSAzOyAvKiBnbyBkaXJlY3RseSB0byBuZXh0IGhlYWRlciAqLworCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZGVjb2RlQmxvY2tIZWFkZXI7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgWlNURGRzX2RlY29tcHJlc3NMYXN0QmxvY2s6CisJY2FzZSBaU1REZHNfZGVjb21wcmVzc0Jsb2NrOiB7CisJCXNpemVfdCByU2l6ZTsKKwkJc3dpdGNoIChkY3R4LT5iVHlwZSkgeworCQljYXNlIGJ0X2NvbXByZXNzZWQ6IHJTaXplID0gWlNURF9kZWNvbXByZXNzQmxvY2tfaW50ZXJuYWwoZGN0eCwgZHN0LCBkc3RDYXBhY2l0eSwgc3JjLCBzcmNTaXplKTsgYnJlYWs7CisJCWNhc2UgYnRfcmF3OiByU2l6ZSA9IFpTVERfY29weVJhd0Jsb2NrKGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSk7IGJyZWFrOworCQljYXNlIGJ0X3JsZTogclNpemUgPSBaU1REX3NldFJsZUJsb2NrKGRzdCwgZHN0Q2FwYWNpdHksIHNyYywgc3JjU2l6ZSwgZGN0eC0+cmxlU2l6ZSk7IGJyZWFrOworCQljYXNlIGJ0X3Jlc2VydmVkOiAvKiBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJCWRlZmF1bHQ6IHJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJfQorCQlpZiAoWlNURF9pc0Vycm9yKHJTaXplKSkKKwkJCXJldHVybiByU2l6ZTsKKwkJaWYgKGRjdHgtPmZQYXJhbXMuY2hlY2tzdW1GbGFnKQorCQkJeHhoNjRfdXBkYXRlKCZkY3R4LT54eGhTdGF0ZSwgZHN0LCByU2l6ZSk7CisKKwkJaWYgKGRjdHgtPnN0YWdlID09IFpTVERkc19kZWNvbXByZXNzTGFzdEJsb2NrKSB7IC8qIGVuZCBvZiBmcmFtZSAqLworCQkJaWYgKGRjdHgtPmZQYXJhbXMuY2hlY2tzdW1GbGFnKSB7CS8qIGFub3RoZXIgcm91bmQgZm9yIGZyYW1lIGNoZWNrc3VtICovCisJCQkJZGN0eC0+ZXhwZWN0ZWQgPSA0OworCQkJCWRjdHgtPnN0YWdlID0gWlNURGRzX2NoZWNrQ2hlY2tzdW07CisJCQl9IGVsc2UgeworCQkJCWRjdHgtPmV4cGVjdGVkID0gMDsgLyogZW5kcyBoZXJlICovCisJCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZ2V0RnJhbWVIZWFkZXJTaXplOworCQkJfQorCQl9IGVsc2UgeworCQkJZGN0eC0+c3RhZ2UgPSBaU1REZHNfZGVjb2RlQmxvY2tIZWFkZXI7CisJCQlkY3R4LT5leHBlY3RlZCA9IFpTVERfYmxvY2tIZWFkZXJTaXplOworCQkJZGN0eC0+cHJldmlvdXNEc3RFbmQgPSAoY2hhciAqKWRzdCArIHJTaXplOworCQl9CisJCXJldHVybiByU2l6ZTsKKwl9CisJY2FzZSBaU1REZHNfY2hlY2tDaGVja3N1bTogeworCQlVMzIgY29uc3QgaDMyID0gKFUzMil4eGg2NF9kaWdlc3QoJmRjdHgtPnh4aFN0YXRlKTsKKwkJVTMyIGNvbnN0IGNoZWNrMzIgPSBaU1REX3JlYWRMRTMyKHNyYyk7IC8qIHNyY1NpemUgPT0gNCwgZ3VhcmFudGVlZCBieSBkY3R4LT5leHBlY3RlZCAqLworCQlpZiAoY2hlY2szMiAhPSBoMzIpCisJCQlyZXR1cm4gRVJST1IoY2hlY2tzdW1fd3JvbmcpOworCQlkY3R4LT5leHBlY3RlZCA9IDA7CisJCWRjdHgtPnN0YWdlID0gWlNURGRzX2dldEZyYW1lSGVhZGVyU2l6ZTsKKwkJcmV0dXJuIDA7CisJfQorCWNhc2UgWlNURGRzX2RlY29kZVNraXBwYWJsZUhlYWRlcjogeworCQltZW1jcHkoZGN0eC0+aGVhZGVyQnVmZmVyICsgWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4LCBzcmMsIGRjdHgtPmV4cGVjdGVkKTsKKwkJZGN0eC0+ZXhwZWN0ZWQgPSBaU1REX3JlYWRMRTMyKGRjdHgtPmhlYWRlckJ1ZmZlciArIDQpOworCQlkY3R4LT5zdGFnZSA9IFpTVERkc19za2lwRnJhbWU7CisJCXJldHVybiAwOworCX0KKwljYXNlIFpTVERkc19za2lwRnJhbWU6IHsKKwkJZGN0eC0+ZXhwZWN0ZWQgPSAwOworCQlkY3R4LT5zdGFnZSA9IFpTVERkc19nZXRGcmFtZUhlYWRlclNpemU7CisJCXJldHVybiAwOworCX0KKwlkZWZhdWx0OgorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIGltcG9zc2libGUgKi8KKwl9Cit9CisKK3N0YXRpYyBzaXplX3QgWlNURF9yZWZEaWN0Q29udGVudChaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkKK3sKKwlkY3R4LT5kaWN0RW5kID0gZGN0eC0+cHJldmlvdXNEc3RFbmQ7CisJZGN0eC0+dkJhc2UgPSAoY29uc3QgY2hhciAqKWRpY3QgLSAoKGNvbnN0IGNoYXIgKikoZGN0eC0+cHJldmlvdXNEc3RFbmQpIC0gKGNvbnN0IGNoYXIgKikoZGN0eC0+YmFzZSkpOworCWRjdHgtPmJhc2UgPSBkaWN0OworCWRjdHgtPnByZXZpb3VzRHN0RW5kID0gKGNvbnN0IGNoYXIgKilkaWN0ICsgZGljdFNpemU7CisJcmV0dXJuIDA7Cit9CisKKy8qIFpTVERfbG9hZEVudHJvcHkoKSA6CisgKiBkaWN0IDogbXVzdCBwb2ludCBhdCBiZWdpbm5pbmcgb2YgYSB2YWxpZCB6c3RkIGRpY3Rpb25hcnkKKyAqIEByZXR1cm4gOiBzaXplIG9mIGVudHJvcHkgdGFibGVzIHJlYWQgKi8KK3N0YXRpYyBzaXplX3QgWlNURF9sb2FkRW50cm9weShaU1REX2VudHJvcHlUYWJsZXNfdCAqZW50cm9weSwgY29uc3Qgdm9pZCAqY29uc3QgZGljdCwgc2l6ZV90IGNvbnN0IGRpY3RTaXplKQoreworCWNvbnN0IEJZVEUgKmRpY3RQdHIgPSAoY29uc3QgQllURSAqKWRpY3Q7CisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RQdHIgKyBkaWN0U2l6ZTsKKworCWlmIChkaWN0U2l6ZSA8PSA4KQorCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCWRpY3RQdHIgKz0gODsgLyogc2tpcCBoZWFkZXIgPSBtYWdpYyArIGRpY3RJRCAqLworCisJeworCQlzaXplX3QgY29uc3QgaFNpemUgPSBIVUZfcmVhZERUYWJsZVg0X3drc3AoZW50cm9weS0+aHVmVGFibGUsIGRpY3RQdHIsIGRpY3RFbmQgLSBkaWN0UHRyLCBlbnRyb3B5LT53b3Jrc3BhY2UsIHNpemVvZihlbnRyb3B5LT53b3Jrc3BhY2UpKTsKKwkJaWYgKEhVRl9pc0Vycm9yKGhTaXplKSkKKwkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJCWRpY3RQdHIgKz0gaFNpemU7CisJfQorCisJeworCQlzaG9ydCBvZmZjb2RlTkNvdW50W01heE9mZiArIDFdOworCQlVMzIgb2ZmY29kZU1heFZhbHVlID0gTWF4T2ZmLCBvZmZjb2RlTG9nOworCQlzaXplX3QgY29uc3Qgb2ZmY29kZUhlYWRlclNpemUgPSBGU0VfcmVhZE5Db3VudChvZmZjb2RlTkNvdW50LCAmb2ZmY29kZU1heFZhbHVlLCAmb2ZmY29kZUxvZywgZGljdFB0ciwgZGljdEVuZCAtIGRpY3RQdHIpOworCQlpZiAoRlNFX2lzRXJyb3Iob2ZmY29kZUhlYWRlclNpemUpKQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJaWYgKG9mZmNvZGVMb2cgPiBPZmZGU0VMb2cpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlDSEVDS19FKEZTRV9idWlsZERUYWJsZV93a3NwKGVudHJvcHktPk9GVGFibGUsIG9mZmNvZGVOQ291bnQsIG9mZmNvZGVNYXhWYWx1ZSwgb2ZmY29kZUxvZywgZW50cm9weS0+d29ya3NwYWNlLCBzaXplb2YoZW50cm9weS0+d29ya3NwYWNlKSksIGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJZGljdFB0ciArPSBvZmZjb2RlSGVhZGVyU2l6ZTsKKwl9CisKKwl7CisJCXNob3J0IG1hdGNobGVuZ3RoTkNvdW50W01heE1MICsgMV07CisJCXVuc2lnbmVkIG1hdGNobGVuZ3RoTWF4VmFsdWUgPSBNYXhNTCwgbWF0Y2hsZW5ndGhMb2c7CisJCXNpemVfdCBjb25zdCBtYXRjaGxlbmd0aEhlYWRlclNpemUgPSBGU0VfcmVhZE5Db3VudChtYXRjaGxlbmd0aE5Db3VudCwgJm1hdGNobGVuZ3RoTWF4VmFsdWUsICZtYXRjaGxlbmd0aExvZywgZGljdFB0ciwgZGljdEVuZCAtIGRpY3RQdHIpOworCQlpZiAoRlNFX2lzRXJyb3IobWF0Y2hsZW5ndGhIZWFkZXJTaXplKSkKKwkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJCWlmIChtYXRjaGxlbmd0aExvZyA+IE1MRlNFTG9nKQorCQkJcmV0dXJuIEVSUk9SKGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJQ0hFQ0tfRShGU0VfYnVpbGREVGFibGVfd2tzcChlbnRyb3B5LT5NTFRhYmxlLCBtYXRjaGxlbmd0aE5Db3VudCwgbWF0Y2hsZW5ndGhNYXhWYWx1ZSwgbWF0Y2hsZW5ndGhMb2csIGVudHJvcHktPndvcmtzcGFjZSwgc2l6ZW9mKGVudHJvcHktPndvcmtzcGFjZSkpLCBkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJCWRpY3RQdHIgKz0gbWF0Y2hsZW5ndGhIZWFkZXJTaXplOworCX0KKworCXsKKwkJc2hvcnQgbGl0bGVuZ3RoTkNvdW50W01heExMICsgMV07CisJCXVuc2lnbmVkIGxpdGxlbmd0aE1heFZhbHVlID0gTWF4TEwsIGxpdGxlbmd0aExvZzsKKwkJc2l6ZV90IGNvbnN0IGxpdGxlbmd0aEhlYWRlclNpemUgPSBGU0VfcmVhZE5Db3VudChsaXRsZW5ndGhOQ291bnQsICZsaXRsZW5ndGhNYXhWYWx1ZSwgJmxpdGxlbmd0aExvZywgZGljdFB0ciwgZGljdEVuZCAtIGRpY3RQdHIpOworCQlpZiAoRlNFX2lzRXJyb3IobGl0bGVuZ3RoSGVhZGVyU2l6ZSkpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlpZiAobGl0bGVuZ3RoTG9nID4gTExGU0VMb2cpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlDSEVDS19FKEZTRV9idWlsZERUYWJsZV93a3NwKGVudHJvcHktPkxMVGFibGUsIGxpdGxlbmd0aE5Db3VudCwgbGl0bGVuZ3RoTWF4VmFsdWUsIGxpdGxlbmd0aExvZywgZW50cm9weS0+d29ya3NwYWNlLCBzaXplb2YoZW50cm9weS0+d29ya3NwYWNlKSksIGRpY3Rpb25hcnlfY29ycnVwdGVkKTsKKwkJZGljdFB0ciArPSBsaXRsZW5ndGhIZWFkZXJTaXplOworCX0KKworCWlmIChkaWN0UHRyICsgMTIgPiBkaWN0RW5kKQorCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCXsKKwkJaW50IGk7CisJCXNpemVfdCBjb25zdCBkaWN0Q29udGVudFNpemUgPSAoc2l6ZV90KShkaWN0RW5kIC0gKGRpY3RQdHIgKyAxMikpOworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlVMzIgY29uc3QgcmVwID0gWlNURF9yZWFkTEUzMihkaWN0UHRyKTsKKwkJCWRpY3RQdHIgKz0gNDsKKwkJCWlmIChyZXAgPT0gMCB8fCByZXAgPj0gZGljdENvbnRlbnRTaXplKQorCQkJCXJldHVybiBFUlJPUihkaWN0aW9uYXJ5X2NvcnJ1cHRlZCk7CisJCQllbnRyb3B5LT5yZXBbaV0gPSByZXA7CisJCX0KKwl9CisKKwlyZXR1cm4gZGljdFB0ciAtIChjb25zdCBCWVRFICopZGljdDsKK30KKworc3RhdGljIHNpemVfdCBaU1REX2RlY29tcHJlc3NfaW5zZXJ0RGljdGlvbmFyeShaU1REX0RDdHggKmRjdHgsIGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkKK3sKKwlpZiAoZGljdFNpemUgPCA4KQorCQlyZXR1cm4gWlNURF9yZWZEaWN0Q29udGVudChkY3R4LCBkaWN0LCBkaWN0U2l6ZSk7CisJeworCQlVMzIgY29uc3QgbWFnaWMgPSBaU1REX3JlYWRMRTMyKGRpY3QpOworCQlpZiAobWFnaWMgIT0gWlNURF9ESUNUX01BR0lDKSB7CisJCQlyZXR1cm4gWlNURF9yZWZEaWN0Q29udGVudChkY3R4LCBkaWN0LCBkaWN0U2l6ZSk7IC8qIHB1cmUgY29udGVudCBtb2RlICovCisJCX0KKwl9CisJZGN0eC0+ZGljdElEID0gWlNURF9yZWFkTEUzMigoY29uc3QgY2hhciAqKWRpY3QgKyA0KTsKKworCS8qIGxvYWQgZW50cm9weSB0YWJsZXMgKi8KKwl7CisJCXNpemVfdCBjb25zdCBlU2l6ZSA9IFpTVERfbG9hZEVudHJvcHkoJmRjdHgtPmVudHJvcHksIGRpY3QsIGRpY3RTaXplKTsKKwkJaWYgKFpTVERfaXNFcnJvcihlU2l6ZSkpCisJCQlyZXR1cm4gRVJST1IoZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCQlkaWN0ID0gKGNvbnN0IGNoYXIgKilkaWN0ICsgZVNpemU7CisJCWRpY3RTaXplIC09IGVTaXplOworCX0KKwlkY3R4LT5saXRFbnRyb3B5ID0gZGN0eC0+ZnNlRW50cm9weSA9IDE7CisKKwkvKiByZWZlcmVuY2UgZGljdGlvbmFyeSBjb250ZW50ICovCisJcmV0dXJuIFpTVERfcmVmRGljdENvbnRlbnQoZGN0eCwgZGljdCwgZGljdFNpemUpOworfQorCitzaXplX3QgWlNURF9kZWNvbXByZXNzQmVnaW5fdXNpbmdEaWN0KFpTVERfREN0eCAqZGN0eCwgY29uc3Qgdm9pZCAqZGljdCwgc2l6ZV90IGRpY3RTaXplKQoreworCUNIRUNLX0YoWlNURF9kZWNvbXByZXNzQmVnaW4oZGN0eCkpOworCWlmIChkaWN0ICYmIGRpY3RTaXplKQorCQlDSEVDS19FKFpTVERfZGVjb21wcmVzc19pbnNlcnREaWN0aW9uYXJ5KGRjdHgsIGRpY3QsIGRpY3RTaXplKSwgZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCXJldHVybiAwOworfQorCisvKiA9PT09PT0gICBaU1REX0REaWN0ICAgPT09PT09ICovCisKK3N0cnVjdCBaU1REX0REaWN0X3MgeworCXZvaWQgKmRpY3RCdWZmZXI7CisJY29uc3Qgdm9pZCAqZGljdENvbnRlbnQ7CisJc2l6ZV90IGRpY3RTaXplOworCVpTVERfZW50cm9weVRhYmxlc190IGVudHJvcHk7CisJVTMyIGRpY3RJRDsKKwlVMzIgZW50cm9weVByZXNlbnQ7CisJWlNURF9jdXN0b21NZW0gY01lbTsKK307IC8qIHR5cGVkZWYnZCB0byBaU1REX0REaWN0IHdpdGhpbiAienN0ZC5oIiAqLworCitzaXplX3QgWlNURF9ERGljdFdvcmtzcGFjZUJvdW5kKHZvaWQpIHsgcmV0dXJuIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfc3RhY2spKSArIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfRERpY3QpKTsgfQorCitzdGF0aWMgY29uc3Qgdm9pZCAqWlNURF9ERGljdERpY3RDb250ZW50KGNvbnN0IFpTVERfRERpY3QgKmRkaWN0KSB7IHJldHVybiBkZGljdC0+ZGljdENvbnRlbnQ7IH0KKworc3RhdGljIHNpemVfdCBaU1REX0REaWN0RGljdFNpemUoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpIHsgcmV0dXJuIGRkaWN0LT5kaWN0U2l6ZTsgfQorCitzdGF0aWMgdm9pZCBaU1REX3JlZkREaWN0KFpTVERfREN0eCAqZHN0REN0eCwgY29uc3QgWlNURF9ERGljdCAqZGRpY3QpCit7CisJWlNURF9kZWNvbXByZXNzQmVnaW4oZHN0REN0eCk7IC8qIGluaXQgKi8KKwlpZiAoZGRpY3QpIHsJCSAgICAgICAvKiBzdXBwb3J0IHJlZkREaWN0IG9uIE5VTEwgKi8KKwkJZHN0REN0eC0+ZGljdElEID0gZGRpY3QtPmRpY3RJRDsKKwkJZHN0REN0eC0+YmFzZSA9IGRkaWN0LT5kaWN0Q29udGVudDsKKwkJZHN0REN0eC0+dkJhc2UgPSBkZGljdC0+ZGljdENvbnRlbnQ7CisJCWRzdERDdHgtPmRpY3RFbmQgPSAoY29uc3QgQllURSAqKWRkaWN0LT5kaWN0Q29udGVudCArIGRkaWN0LT5kaWN0U2l6ZTsKKwkJZHN0REN0eC0+cHJldmlvdXNEc3RFbmQgPSBkc3REQ3R4LT5kaWN0RW5kOworCQlpZiAoZGRpY3QtPmVudHJvcHlQcmVzZW50KSB7CisJCQlkc3REQ3R4LT5saXRFbnRyb3B5ID0gMTsKKwkJCWRzdERDdHgtPmZzZUVudHJvcHkgPSAxOworCQkJZHN0REN0eC0+TExUcHRyID0gZGRpY3QtPmVudHJvcHkuTExUYWJsZTsKKwkJCWRzdERDdHgtPk1MVHB0ciA9IGRkaWN0LT5lbnRyb3B5Lk1MVGFibGU7CisJCQlkc3REQ3R4LT5PRlRwdHIgPSBkZGljdC0+ZW50cm9weS5PRlRhYmxlOworCQkJZHN0REN0eC0+SFVGcHRyID0gZGRpY3QtPmVudHJvcHkuaHVmVGFibGU7CisJCQlkc3REQ3R4LT5lbnRyb3B5LnJlcFswXSA9IGRkaWN0LT5lbnRyb3B5LnJlcFswXTsKKwkJCWRzdERDdHgtPmVudHJvcHkucmVwWzFdID0gZGRpY3QtPmVudHJvcHkucmVwWzFdOworCQkJZHN0REN0eC0+ZW50cm9weS5yZXBbMl0gPSBkZGljdC0+ZW50cm9weS5yZXBbMl07CisJCX0gZWxzZSB7CisJCQlkc3REQ3R4LT5saXRFbnRyb3B5ID0gMDsKKwkJCWRzdERDdHgtPmZzZUVudHJvcHkgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgc2l6ZV90IFpTVERfbG9hZEVudHJvcHlfaW5ERGljdChaU1REX0REaWN0ICpkZGljdCkKK3sKKwlkZGljdC0+ZGljdElEID0gMDsKKwlkZGljdC0+ZW50cm9weVByZXNlbnQgPSAwOworCWlmIChkZGljdC0+ZGljdFNpemUgPCA4KQorCQlyZXR1cm4gMDsKKwl7CisJCVUzMiBjb25zdCBtYWdpYyA9IFpTVERfcmVhZExFMzIoZGRpY3QtPmRpY3RDb250ZW50KTsKKwkJaWYgKG1hZ2ljICE9IFpTVERfRElDVF9NQUdJQykKKwkJCXJldHVybiAwOyAvKiBwdXJlIGNvbnRlbnQgbW9kZSAqLworCX0KKwlkZGljdC0+ZGljdElEID0gWlNURF9yZWFkTEUzMigoY29uc3QgY2hhciAqKWRkaWN0LT5kaWN0Q29udGVudCArIDQpOworCisJLyogbG9hZCBlbnRyb3B5IHRhYmxlcyAqLworCUNIRUNLX0UoWlNURF9sb2FkRW50cm9weSgmZGRpY3QtPmVudHJvcHksIGRkaWN0LT5kaWN0Q29udGVudCwgZGRpY3QtPmRpY3RTaXplKSwgZGljdGlvbmFyeV9jb3JydXB0ZWQpOworCWRkaWN0LT5lbnRyb3B5UHJlc2VudCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBaU1REX0REaWN0ICpaU1REX2NyZWF0ZUREaWN0X2FkdmFuY2VkKGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSwgdW5zaWduZWQgYnlSZWZlcmVuY2UsIFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkKK3sKKwlpZiAoIWN1c3RvbU1lbS5jdXN0b21BbGxvYyB8fCAhY3VzdG9tTWVtLmN1c3RvbUZyZWUpCisJCXJldHVybiBOVUxMOworCisJeworCQlaU1REX0REaWN0ICpjb25zdCBkZGljdCA9IChaU1REX0REaWN0ICopWlNURF9tYWxsb2Moc2l6ZW9mKFpTVERfRERpY3QpLCBjdXN0b21NZW0pOworCQlpZiAoIWRkaWN0KQorCQkJcmV0dXJuIE5VTEw7CisJCWRkaWN0LT5jTWVtID0gY3VzdG9tTWVtOworCisJCWlmICgoYnlSZWZlcmVuY2UpIHx8ICghZGljdCkgfHwgKCFkaWN0U2l6ZSkpIHsKKwkJCWRkaWN0LT5kaWN0QnVmZmVyID0gTlVMTDsKKwkJCWRkaWN0LT5kaWN0Q29udGVudCA9IGRpY3Q7CisJCX0gZWxzZSB7CisJCQl2b2lkICpjb25zdCBpbnRlcm5hbEJ1ZmZlciA9IFpTVERfbWFsbG9jKGRpY3RTaXplLCBjdXN0b21NZW0pOworCQkJaWYgKCFpbnRlcm5hbEJ1ZmZlcikgeworCQkJCVpTVERfZnJlZUREaWN0KGRkaWN0KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCW1lbWNweShpbnRlcm5hbEJ1ZmZlciwgZGljdCwgZGljdFNpemUpOworCQkJZGRpY3QtPmRpY3RCdWZmZXIgPSBpbnRlcm5hbEJ1ZmZlcjsKKwkJCWRkaWN0LT5kaWN0Q29udGVudCA9IGludGVybmFsQnVmZmVyOworCQl9CisJCWRkaWN0LT5kaWN0U2l6ZSA9IGRpY3RTaXplOworCQlkZGljdC0+ZW50cm9weS5odWZUYWJsZVswXSA9IChIVUZfRFRhYmxlKSgoSHVmTG9nKSoweDEwMDAwMDEpOyAvKiBjb3ZlciBib3RoIGxpdHRsZSBhbmQgYmlnIGVuZGlhbiAqLworCQkvKiBwYXJzZSBkaWN0aW9uYXJ5IGNvbnRlbnQgKi8KKwkJeworCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IFpTVERfbG9hZEVudHJvcHlfaW5ERGljdChkZGljdCk7CisJCQlpZiAoWlNURF9pc0Vycm9yKGVycm9yQ29kZSkpIHsKKwkJCQlaU1REX2ZyZWVERGljdChkZGljdCk7CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKworCQlyZXR1cm4gZGRpY3Q7CisJfQorfQorCisvKiEgWlNURF9pbml0RERpY3QoKSA6CisqICAgQ3JlYXRlIGEgZGlnZXN0ZWQgZGljdGlvbmFyeSwgdG8gc3RhcnQgZGVjb21wcmVzc2lvbiB3aXRob3V0IHN0YXJ0dXAgZGVsYXkuCisqICAgYGRpY3RgIGNvbnRlbnQgaXMgY29waWVkIGluc2lkZSBERGljdC4KKyogICBDb25zZXF1ZW50bHksIGBkaWN0YCBjYW4gYmUgcmVsZWFzZWQgYWZ0ZXIgYFpTVERfRERpY3RgIGNyZWF0aW9uICovCitaU1REX0REaWN0ICpaU1REX2luaXRERGljdChjb25zdCB2b2lkICpkaWN0LCBzaXplX3QgZGljdFNpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJWlNURF9jdXN0b21NZW0gY29uc3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCXJldHVybiBaU1REX2NyZWF0ZUREaWN0X2FkdmFuY2VkKGRpY3QsIGRpY3RTaXplLCAxLCBzdGFja01lbSk7Cit9CisKK3NpemVfdCBaU1REX2ZyZWVERGljdChaU1REX0REaWN0ICpkZGljdCkKK3sKKwlpZiAoZGRpY3QgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIHN1cHBvcnQgZnJlZSBvbiBOVUxMICovCisJeworCQlaU1REX2N1c3RvbU1lbSBjb25zdCBjTWVtID0gZGRpY3QtPmNNZW07CisJCVpTVERfZnJlZShkZGljdC0+ZGljdEJ1ZmZlciwgY01lbSk7CisJCVpTVERfZnJlZShkZGljdCwgY01lbSk7CisJCXJldHVybiAwOworCX0KK30KKworLyohIFpTVERfZ2V0RGljdElEX2Zyb21EaWN0KCkgOgorICogIFByb3ZpZGVzIHRoZSBkaWN0SUQgc3RvcmVkIHdpdGhpbiBkaWN0aW9uYXJ5LgorICogIGlmIEByZXR1cm4gPT0gMCwgdGhlIGRpY3Rpb25hcnkgaXMgbm90IGNvbmZvcm1hbnQgd2l0aCBac3RhbmRhcmQgc3BlY2lmaWNhdGlvbi4KKyAqICBJdCBjYW4gc3RpbGwgYmUgbG9hZGVkLCBidXQgYXMgYSBjb250ZW50LW9ubHkgZGljdGlvbmFyeS4gKi8KK3Vuc2lnbmVkIFpTVERfZ2V0RGljdElEX2Zyb21EaWN0KGNvbnN0IHZvaWQgKmRpY3QsIHNpemVfdCBkaWN0U2l6ZSkKK3sKKwlpZiAoZGljdFNpemUgPCA4KQorCQlyZXR1cm4gMDsKKwlpZiAoWlNURF9yZWFkTEUzMihkaWN0KSAhPSBaU1REX0RJQ1RfTUFHSUMpCisJCXJldHVybiAwOworCXJldHVybiBaU1REX3JlYWRMRTMyKChjb25zdCBjaGFyICopZGljdCArIDQpOworfQorCisvKiEgWlNURF9nZXREaWN0SURfZnJvbUREaWN0KCkgOgorICogIFByb3ZpZGVzIHRoZSBkaWN0SUQgb2YgdGhlIGRpY3Rpb25hcnkgbG9hZGVkIGludG8gYGRkaWN0YC4KKyAqICBJZiBAcmV0dXJuID09IDAsIHRoZSBkaWN0aW9uYXJ5IGlzIG5vdCBjb25mb3JtYW50IHRvIFpzdGFuZGFyZCBzcGVjaWZpY2F0aW9uLCBvciBlbXB0eS4KKyAqICBOb24tY29uZm9ybWFudCBkaWN0aW9uYXJpZXMgY2FuIHN0aWxsIGJlIGxvYWRlZCwgYnV0IGFzIGNvbnRlbnQtb25seSBkaWN0aW9uYXJpZXMuICovCit1bnNpZ25lZCBaU1REX2dldERpY3RJRF9mcm9tRERpY3QoY29uc3QgWlNURF9ERGljdCAqZGRpY3QpCit7CisJaWYgKGRkaWN0ID09IE5VTEwpCisJCXJldHVybiAwOworCXJldHVybiBaU1REX2dldERpY3RJRF9mcm9tRGljdChkZGljdC0+ZGljdENvbnRlbnQsIGRkaWN0LT5kaWN0U2l6ZSk7Cit9CisKKy8qISBaU1REX2dldERpY3RJRF9mcm9tRnJhbWUoKSA6CisgKiAgUHJvdmlkZXMgdGhlIGRpY3RJRCByZXF1aXJlZCB0byBkZWNvbXByZXNzZWQgdGhlIGZyYW1lIHN0b3JlZCB3aXRoaW4gYHNyY2AuCisgKiAgSWYgQHJldHVybiA9PSAwLCB0aGUgZGljdElEIGNvdWxkIG5vdCBiZSBkZWNvZGVkLgorICogIFRoaXMgY291bGQgZm9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnMgOgorICogIC0gVGhlIGZyYW1lIGRvZXMgbm90IHJlcXVpcmUgYSBkaWN0aW9uYXJ5IHRvIGJlIGRlY29kZWQgKG1vc3QgY29tbW9uIGNhc2UpLgorICogIC0gVGhlIGZyYW1lIHdhcyBidWlsdCB3aXRoIGRpY3RJRCBpbnRlbnRpb25hbGx5IHJlbW92ZWQuIFdoYXRldmVyIGRpY3Rpb25hcnkgaXMgbmVjZXNzYXJ5IGlzIGEgaGlkZGVuIGluZm9ybWF0aW9uLgorICogICAgTm90ZSA6IHRoaXMgdXNlIGNhc2UgYWxzbyBoYXBwZW5zIHdoZW4gdXNpbmcgYSBub24tY29uZm9ybWFudCBkaWN0aW9uYXJ5LgorICogIC0gYHNyY1NpemVgIGlzIHRvbyBzbWFsbCwgYW5kIGFzIGEgcmVzdWx0LCB0aGUgZnJhbWUgaGVhZGVyIGNvdWxkIG5vdCBiZSBkZWNvZGVkIChvbmx5IHBvc3NpYmxlIGlmIGBzcmNTaXplIDwgWlNURF9GUkFNRUhFQURFUlNJWkVfTUFYYCkuCisgKiAgLSBUaGlzIGlzIG5vdCBhIFpzdGFuZGFyZCBmcmFtZS4KKyAqICBXaGVuIGlkZW50aWZ5aW5nIHRoZSBleGFjdCBmYWlsdXJlIGNhdXNlLCBpdCdzIHBvc3NpYmxlIHRvIHVzZWQgWlNURF9nZXRGcmFtZVBhcmFtcygpLCB3aGljaCB3aWxsIHByb3ZpZGUgYSBtb3JlIHByZWNpc2UgZXJyb3IgY29kZS4gKi8KK3Vuc2lnbmVkIFpTVERfZ2V0RGljdElEX2Zyb21GcmFtZShjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKQoreworCVpTVERfZnJhbWVQYXJhbXMgemZwID0gezAsIDAsIDAsIDB9OworCXNpemVfdCBjb25zdCBoRXJyb3IgPSBaU1REX2dldEZyYW1lUGFyYW1zKCZ6ZnAsIHNyYywgc3JjU2l6ZSk7CisJaWYgKFpTVERfaXNFcnJvcihoRXJyb3IpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gemZwLmRpY3RJRDsKK30KKworLyohIFpTVERfZGVjb21wcmVzc191c2luZ0REaWN0KCkgOgorKiAgIERlY29tcHJlc3Npb24gdXNpbmcgYSBwcmUtZGlnZXN0ZWQgRGljdGlvbmFyeQorKiAgIFVzZSBkaWN0aW9uYXJ5IHdpdGhvdXQgc2lnbmlmaWNhbnQgb3ZlcmhlYWQuICovCitzaXplX3QgWlNURF9kZWNvbXByZXNzX3VzaW5nRERpY3QoWlNURF9EQ3R4ICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3QgWlNURF9ERGljdCAqZGRpY3QpCit7CisJLyogcGFzcyBjb250ZW50IGFuZCBzaXplIGluIGNhc2UgbGVnYWN5IGZyYW1lcyBhcmUgZW5jb3VudGVyZWQgKi8KKwlyZXR1cm4gWlNURF9kZWNvbXByZXNzTXVsdGlGcmFtZShkY3R4LCBkc3QsIGRzdENhcGFjaXR5LCBzcmMsIHNyY1NpemUsIE5VTEwsIDAsIGRkaWN0KTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqICAgU3RyZWFtaW5nIGRlY29tcHJlc3Npb24KKyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit0eXBlZGVmIGVudW0geyB6ZHNzX2luaXQsIHpkc3NfbG9hZEhlYWRlciwgemRzc19yZWFkLCB6ZHNzX2xvYWQsIHpkc3NfZmx1c2ggfSBaU1REX2RTdHJlYW1TdGFnZTsKKworLyogKioqIFJlc291cmNlIG1hbmFnZW1lbnQgKioqICovCitzdHJ1Y3QgWlNURF9EU3RyZWFtX3MgeworCVpTVERfREN0eCAqZGN0eDsKKwlaU1REX0REaWN0ICpkZGljdExvY2FsOworCWNvbnN0IFpTVERfRERpY3QgKmRkaWN0OworCVpTVERfZnJhbWVQYXJhbXMgZlBhcmFtczsKKwlaU1REX2RTdHJlYW1TdGFnZSBzdGFnZTsKKwljaGFyICppbkJ1ZmY7CisJc2l6ZV90IGluQnVmZlNpemU7CisJc2l6ZV90IGluUG9zOworCXNpemVfdCBtYXhXaW5kb3dTaXplOworCWNoYXIgKm91dEJ1ZmY7CisJc2l6ZV90IG91dEJ1ZmZTaXplOworCXNpemVfdCBvdXRTdGFydDsKKwlzaXplX3Qgb3V0RW5kOworCXNpemVfdCBibG9ja1NpemU7CisJQllURSBoZWFkZXJCdWZmZXJbWlNURF9GUkFNRUhFQURFUlNJWkVfTUFYXTsgLyogdG1wIGJ1ZmZlciB0byBzdG9yZSBmcmFtZSBoZWFkZXIgKi8KKwlzaXplX3QgbGhTaXplOworCVpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbTsKKwl2b2lkICpsZWdhY3lDb250ZXh0OworCVUzMiBwcmV2aW91c0xlZ2FjeVZlcnNpb247CisJVTMyIGxlZ2FjeVZlcnNpb247CisJVTMyIGhvc3RhZ2VCeXRlOworfTsgLyogdHlwZWRlZidkIHRvIFpTVERfRFN0cmVhbSB3aXRoaW4gInpzdGQuaCIgKi8KKworc2l6ZV90IFpTVERfRFN0cmVhbVdvcmtzcGFjZUJvdW5kKHNpemVfdCBtYXhXaW5kb3dTaXplKQoreworCXNpemVfdCBjb25zdCBibG9ja1NpemUgPSBNSU4obWF4V2luZG93U2l6ZSwgWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgpOworCXNpemVfdCBjb25zdCBpbkJ1ZmZTaXplID0gYmxvY2tTaXplOworCXNpemVfdCBjb25zdCBvdXRCdWZmU2l6ZSA9IG1heFdpbmRvd1NpemUgKyBibG9ja1NpemUgKyBXSUxEQ09QWV9PVkVSTEVOR1RIICogMjsKKwlyZXR1cm4gWlNURF9EQ3R4V29ya3NwYWNlQm91bmQoKSArIFpTVERfQUxJR04oc2l6ZW9mKFpTVERfRFN0cmVhbSkpICsgWlNURF9BTElHTihpbkJ1ZmZTaXplKSArIFpTVERfQUxJR04ob3V0QnVmZlNpemUpOworfQorCitzdGF0aWMgWlNURF9EU3RyZWFtICpaU1REX2NyZWF0ZURTdHJlYW1fYWR2YW5jZWQoWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKQoreworCVpTVERfRFN0cmVhbSAqemRzOworCisJaWYgKCFjdXN0b21NZW0uY3VzdG9tQWxsb2MgfHwgIWN1c3RvbU1lbS5jdXN0b21GcmVlKQorCQlyZXR1cm4gTlVMTDsKKworCXpkcyA9IChaU1REX0RTdHJlYW0gKilaU1REX21hbGxvYyhzaXplb2YoWlNURF9EU3RyZWFtKSwgY3VzdG9tTWVtKTsKKwlpZiAoemRzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCW1lbXNldCh6ZHMsIDAsIHNpemVvZihaU1REX0RTdHJlYW0pKTsKKwltZW1jcHkoJnpkcy0+Y3VzdG9tTWVtLCAmY3VzdG9tTWVtLCBzaXplb2YoWlNURF9jdXN0b21NZW0pKTsKKwl6ZHMtPmRjdHggPSBaU1REX2NyZWF0ZURDdHhfYWR2YW5jZWQoY3VzdG9tTWVtKTsKKwlpZiAoemRzLT5kY3R4ID09IE5VTEwpIHsKKwkJWlNURF9mcmVlRFN0cmVhbSh6ZHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJemRzLT5zdGFnZSA9IHpkc3NfaW5pdDsKKwl6ZHMtPm1heFdpbmRvd1NpemUgPSBaU1REX01BWFdJTkRPV1NJWkVfREVGQVVMVDsKKwlyZXR1cm4gemRzOworfQorCitaU1REX0RTdHJlYW0gKlpTVERfaW5pdERTdHJlYW0oc2l6ZV90IG1heFdpbmRvd1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJWlNURF9jdXN0b21NZW0gY29uc3Qgc3RhY2tNZW0gPSBaU1REX2luaXRTdGFjayh3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCVpTVERfRFN0cmVhbSAqemRzID0gWlNURF9jcmVhdGVEU3RyZWFtX2FkdmFuY2VkKHN0YWNrTWVtKTsKKwlpZiAoIXpkcykgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl6ZHMtPm1heFdpbmRvd1NpemUgPSBtYXhXaW5kb3dTaXplOworCXpkcy0+c3RhZ2UgPSB6ZHNzX2xvYWRIZWFkZXI7CisJemRzLT5saFNpemUgPSB6ZHMtPmluUG9zID0gemRzLT5vdXRTdGFydCA9IHpkcy0+b3V0RW5kID0gMDsKKwlaU1REX2ZyZWVERGljdCh6ZHMtPmRkaWN0TG9jYWwpOworCXpkcy0+ZGRpY3RMb2NhbCA9IE5VTEw7CisJemRzLT5kZGljdCA9IHpkcy0+ZGRpY3RMb2NhbDsKKwl6ZHMtPmxlZ2FjeVZlcnNpb24gPSAwOworCXpkcy0+aG9zdGFnZUJ5dGUgPSAwOworCisJeworCQlzaXplX3QgY29uc3QgYmxvY2tTaXplID0gTUlOKHpkcy0+bWF4V2luZG93U2l6ZSwgWlNURF9CTE9DS1NJWkVfQUJTT0xVVEVNQVgpOworCQlzaXplX3QgY29uc3QgbmVlZGVkT3V0U2l6ZSA9IHpkcy0+bWF4V2luZG93U2l6ZSArIGJsb2NrU2l6ZSArIFdJTERDT1BZX09WRVJMRU5HVEggKiAyOworCisJCXpkcy0+aW5CdWZmID0gKGNoYXIgKilaU1REX21hbGxvYyhibG9ja1NpemUsIHpkcy0+Y3VzdG9tTWVtKTsKKwkJemRzLT5pbkJ1ZmZTaXplID0gYmxvY2tTaXplOworCQl6ZHMtPm91dEJ1ZmYgPSAoY2hhciAqKVpTVERfbWFsbG9jKG5lZWRlZE91dFNpemUsIHpkcy0+Y3VzdG9tTWVtKTsKKwkJemRzLT5vdXRCdWZmU2l6ZSA9IG5lZWRlZE91dFNpemU7CisJCWlmICh6ZHMtPmluQnVmZiA9PSBOVUxMIHx8IHpkcy0+b3V0QnVmZiA9PSBOVUxMKSB7CisJCQlaU1REX2ZyZWVEU3RyZWFtKHpkcyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlyZXR1cm4gemRzOworfQorCitaU1REX0RTdHJlYW0gKlpTVERfaW5pdERTdHJlYW1fdXNpbmdERGljdChzaXplX3QgbWF4V2luZG93U2l6ZSwgY29uc3QgWlNURF9ERGljdCAqZGRpY3QsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJWlNURF9EU3RyZWFtICp6ZHMgPSBaU1REX2luaXREU3RyZWFtKG1heFdpbmRvd1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJaWYgKHpkcykgeworCQl6ZHMtPmRkaWN0ID0gZGRpY3Q7CisJfQorCXJldHVybiB6ZHM7Cit9CisKK3NpemVfdCBaU1REX2ZyZWVEU3RyZWFtKFpTVERfRFN0cmVhbSAqemRzKQoreworCWlmICh6ZHMgPT0gTlVMTCkKKwkJcmV0dXJuIDA7IC8qIHN1cHBvcnQgZnJlZSBvbiBudWxsICovCisJeworCQlaU1REX2N1c3RvbU1lbSBjb25zdCBjTWVtID0gemRzLT5jdXN0b21NZW07CisJCVpTVERfZnJlZURDdHgoemRzLT5kY3R4KTsKKwkJemRzLT5kY3R4ID0gTlVMTDsKKwkJWlNURF9mcmVlRERpY3QoemRzLT5kZGljdExvY2FsKTsKKwkJemRzLT5kZGljdExvY2FsID0gTlVMTDsKKwkJWlNURF9mcmVlKHpkcy0+aW5CdWZmLCBjTWVtKTsKKwkJemRzLT5pbkJ1ZmYgPSBOVUxMOworCQlaU1REX2ZyZWUoemRzLT5vdXRCdWZmLCBjTWVtKTsKKwkJemRzLT5vdXRCdWZmID0gTlVMTDsKKwkJWlNURF9mcmVlKHpkcywgY01lbSk7CisJCXJldHVybiAwOworCX0KK30KKworLyogKioqIEluaXRpYWxpemF0aW9uICoqKiAqLworCitzaXplX3QgWlNURF9EU3RyZWFtSW5TaXplKHZvaWQpIHsgcmV0dXJuIFpTVERfQkxPQ0tTSVpFX0FCU09MVVRFTUFYICsgWlNURF9ibG9ja0hlYWRlclNpemU7IH0KK3NpemVfdCBaU1REX0RTdHJlYW1PdXRTaXplKHZvaWQpIHsgcmV0dXJuIFpTVERfQkxPQ0tTSVpFX0FCU09MVVRFTUFYOyB9CisKK3NpemVfdCBaU1REX3Jlc2V0RFN0cmVhbShaU1REX0RTdHJlYW0gKnpkcykKK3sKKwl6ZHMtPnN0YWdlID0gemRzc19sb2FkSGVhZGVyOworCXpkcy0+bGhTaXplID0gemRzLT5pblBvcyA9IHpkcy0+b3V0U3RhcnQgPSB6ZHMtPm91dEVuZCA9IDA7CisJemRzLT5sZWdhY3lWZXJzaW9uID0gMDsKKwl6ZHMtPmhvc3RhZ2VCeXRlID0gMDsKKwlyZXR1cm4gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4OworfQorCisvKiAqKioqKiAgIERlY29tcHJlc3Npb24gICAqKioqKiAqLworCitaU1REX1NUQVRJQyBzaXplX3QgWlNURF9saW1pdENvcHkodm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJc2l6ZV90IGNvbnN0IGxlbmd0aCA9IE1JTihkc3RDYXBhY2l0eSwgc3JjU2l6ZSk7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOworCXJldHVybiBsZW5ndGg7Cit9CisKK3NpemVfdCBaU1REX2RlY29tcHJlc3NTdHJlYW0oWlNURF9EU3RyZWFtICp6ZHMsIFpTVERfb3V0QnVmZmVyICpvdXRwdXQsIFpTVERfaW5CdWZmZXIgKmlucHV0KQoreworCWNvbnN0IGNoYXIgKmNvbnN0IGlzdGFydCA9IChjb25zdCBjaGFyICopKGlucHV0LT5zcmMpICsgaW5wdXQtPnBvczsKKwljb25zdCBjaGFyICpjb25zdCBpZW5kID0gKGNvbnN0IGNoYXIgKikoaW5wdXQtPnNyYykgKyBpbnB1dC0+c2l6ZTsKKwljb25zdCBjaGFyICppcCA9IGlzdGFydDsKKwljaGFyICpjb25zdCBvc3RhcnQgPSAoY2hhciAqKShvdXRwdXQtPmRzdCkgKyBvdXRwdXQtPnBvczsKKwljaGFyICpjb25zdCBvZW5kID0gKGNoYXIgKikob3V0cHV0LT5kc3QpICsgb3V0cHV0LT5zaXplOworCWNoYXIgKm9wID0gb3N0YXJ0OworCVUzMiBzb21lTW9yZVdvcmsgPSAxOworCisJd2hpbGUgKHNvbWVNb3JlV29yaykgeworCQlzd2l0Y2ggKHpkcy0+c3RhZ2UpIHsKKwkJY2FzZSB6ZHNzX2luaXQ6CisJCQlaU1REX3Jlc2V0RFN0cmVhbSh6ZHMpOyAvKiB0cmFuc3BhcmVudCByZXNldCBvbiBzdGFydGluZyBkZWNvZGluZyBhIG5ldyBmcmFtZSAqLworCQkJCQkJLyogZmFsbC10aHJvdWdoICovCisKKwkJY2FzZSB6ZHNzX2xvYWRIZWFkZXI6IHsKKwkJCXNpemVfdCBjb25zdCBoU2l6ZSA9IFpTVERfZ2V0RnJhbWVQYXJhbXMoJnpkcy0+ZlBhcmFtcywgemRzLT5oZWFkZXJCdWZmZXIsIHpkcy0+bGhTaXplKTsKKwkJCWlmIChaU1REX2lzRXJyb3IoaFNpemUpKQorCQkJCXJldHVybiBoU2l6ZTsKKwkJCWlmIChoU2l6ZSAhPSAwKSB7CQkJCSAgIC8qIG5lZWQgbW9yZSBpbnB1dCAqLworCQkJCXNpemVfdCBjb25zdCB0b0xvYWQgPSBoU2l6ZSAtIHpkcy0+bGhTaXplOyAvKiBpZiBoU2l6ZSE9MCwgaFNpemUgPiB6ZHMtPmxoU2l6ZSAqLworCQkJCWlmICh0b0xvYWQgPiAoc2l6ZV90KShpZW5kIC0gaXApKSB7CS8qIG5vdCBlbm91Z2ggaW5wdXQgdG8gbG9hZCBmdWxsIGhlYWRlciAqLworCQkJCQltZW1jcHkoemRzLT5oZWFkZXJCdWZmZXIgKyB6ZHMtPmxoU2l6ZSwgaXAsIGllbmQgLSBpcCk7CisJCQkJCXpkcy0+bGhTaXplICs9IGllbmQgLSBpcDsKKwkJCQkJaW5wdXQtPnBvcyA9IGlucHV0LT5zaXplOworCQkJCQlyZXR1cm4gKE1BWChaU1REX2ZyYW1lSGVhZGVyU2l6ZV9taW4sIGhTaXplKSAtIHpkcy0+bGhTaXplKSArCisJCQkJCSAgICAgICBaU1REX2Jsb2NrSGVhZGVyU2l6ZTsgLyogcmVtYWluaW5nIGhlYWRlciBieXRlcyArIG5leHQgYmxvY2sgaGVhZGVyICovCisJCQkJfQorCQkJCW1lbWNweSh6ZHMtPmhlYWRlckJ1ZmZlciArIHpkcy0+bGhTaXplLCBpcCwgdG9Mb2FkKTsKKwkJCQl6ZHMtPmxoU2l6ZSA9IGhTaXplOworCQkJCWlwICs9IHRvTG9hZDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogY2hlY2sgZm9yIHNpbmdsZS1wYXNzIG1vZGUgb3Bwb3J0dW5pdHkgKi8KKwkJCWlmICh6ZHMtPmZQYXJhbXMuZnJhbWVDb250ZW50U2l6ZSAmJiB6ZHMtPmZQYXJhbXMud2luZG93U2l6ZSAvKiBza2lwcGFibGUgZnJhbWUgaWYgPT0gMCAqLworCQkJICAgICYmIChVNjQpKHNpemVfdCkob2VuZCAtIG9wKSA+PSB6ZHMtPmZQYXJhbXMuZnJhbWVDb250ZW50U2l6ZSkgeworCQkJCXNpemVfdCBjb25zdCBjU2l6ZSA9IFpTVERfZmluZEZyYW1lQ29tcHJlc3NlZFNpemUoaXN0YXJ0LCBpZW5kIC0gaXN0YXJ0KTsKKwkJCQlpZiAoY1NpemUgPD0gKHNpemVfdCkoaWVuZCAtIGlzdGFydCkpIHsKKwkJCQkJc2l6ZV90IGNvbnN0IGRlY29tcHJlc3NlZFNpemUgPSBaU1REX2RlY29tcHJlc3NfdXNpbmdERGljdCh6ZHMtPmRjdHgsIG9wLCBvZW5kIC0gb3AsIGlzdGFydCwgY1NpemUsIHpkcy0+ZGRpY3QpOworCQkJCQlpZiAoWlNURF9pc0Vycm9yKGRlY29tcHJlc3NlZFNpemUpKQorCQkJCQkJcmV0dXJuIGRlY29tcHJlc3NlZFNpemU7CisJCQkJCWlwID0gaXN0YXJ0ICsgY1NpemU7CisJCQkJCW9wICs9IGRlY29tcHJlc3NlZFNpemU7CisJCQkJCXpkcy0+ZGN0eC0+ZXhwZWN0ZWQgPSAwOworCQkJCQl6ZHMtPnN0YWdlID0gemRzc19pbml0OworCQkJCQlzb21lTW9yZVdvcmsgPSAwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisKKwkJCS8qIENvbnN1bWUgaGVhZGVyICovCisJCQlaU1REX3JlZkREaWN0KHpkcy0+ZGN0eCwgemRzLT5kZGljdCk7CisJCQl7CisJCQkJc2l6ZV90IGNvbnN0IGgxU2l6ZSA9IFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoemRzLT5kY3R4KTsgLyogPT0gWlNURF9mcmFtZUhlYWRlclNpemVfcHJlZml4ICovCisJCQkJQ0hFQ0tfRihaU1REX2RlY29tcHJlc3NDb250aW51ZSh6ZHMtPmRjdHgsIE5VTEwsIDAsIHpkcy0+aGVhZGVyQnVmZmVyLCBoMVNpemUpKTsKKwkJCQl7CisJCQkJCXNpemVfdCBjb25zdCBoMlNpemUgPSBaU1REX25leHRTcmNTaXplVG9EZWNvbXByZXNzKHpkcy0+ZGN0eCk7CisJCQkJCUNIRUNLX0YoWlNURF9kZWNvbXByZXNzQ29udGludWUoemRzLT5kY3R4LCBOVUxMLCAwLCB6ZHMtPmhlYWRlckJ1ZmZlciArIGgxU2l6ZSwgaDJTaXplKSk7CisJCQkJfQorCQkJfQorCisJCQl6ZHMtPmZQYXJhbXMud2luZG93U2l6ZSA9IE1BWCh6ZHMtPmZQYXJhbXMud2luZG93U2l6ZSwgMVUgPDwgWlNURF9XSU5ET1dMT0dfQUJTT0xVVEVNSU4pOworCQkJaWYgKHpkcy0+ZlBhcmFtcy53aW5kb3dTaXplID4gemRzLT5tYXhXaW5kb3dTaXplKQorCQkJCXJldHVybiBFUlJPUihmcmFtZVBhcmFtZXRlcl93aW5kb3dUb29MYXJnZSk7CisKKwkJCS8qIEJ1ZmZlcnMgYXJlIHByZWFsbG9jYXRlZCwgYnV0IGRvdWJsZSBjaGVjayAqLworCQkJeworCQkJCXNpemVfdCBjb25zdCBibG9ja1NpemUgPSBNSU4oemRzLT5tYXhXaW5kb3dTaXplLCBaU1REX0JMT0NLU0laRV9BQlNPTFVURU1BWCk7CisJCQkJc2l6ZV90IGNvbnN0IG5lZWRlZE91dFNpemUgPSB6ZHMtPm1heFdpbmRvd1NpemUgKyBibG9ja1NpemUgKyBXSUxEQ09QWV9PVkVSTEVOR1RIICogMjsKKwkJCQlpZiAoemRzLT5pbkJ1ZmZTaXplIDwgYmxvY2tTaXplKSB7CisJCQkJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwkJCQl9CisJCQkJaWYgKHpkcy0+b3V0QnVmZlNpemUgPCBuZWVkZWRPdXRTaXplKSB7CisJCQkJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwkJCQl9CisJCQkJemRzLT5ibG9ja1NpemUgPSBibG9ja1NpemU7CisJCQl9CisJCQl6ZHMtPnN0YWdlID0gemRzc19yZWFkOworCQl9CisJCS8qIHBhc3MtdGhyb3VnaCAqLworCisJCWNhc2UgemRzc19yZWFkOiB7CisJCQlzaXplX3QgY29uc3QgbmVlZGVkSW5TaXplID0gWlNURF9uZXh0U3JjU2l6ZVRvRGVjb21wcmVzcyh6ZHMtPmRjdHgpOworCQkJaWYgKG5lZWRlZEluU2l6ZSA9PSAwKSB7IC8qIGVuZCBvZiBmcmFtZSAqLworCQkJCXpkcy0+c3RhZ2UgPSB6ZHNzX2luaXQ7CisJCQkJc29tZU1vcmVXb3JrID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgoc2l6ZV90KShpZW5kIC0gaXApID49IG5lZWRlZEluU2l6ZSkgeyAvKiBkZWNvZGUgZGlyZWN0bHkgZnJvbSBzcmMgKi8KKwkJCQljb25zdCBpbnQgaXNTa2lwRnJhbWUgPSBaU1REX2lzU2tpcEZyYW1lKHpkcy0+ZGN0eCk7CisJCQkJc2l6ZV90IGNvbnN0IGRlY29kZWRTaXplID0gWlNURF9kZWNvbXByZXNzQ29udGludWUoemRzLT5kY3R4LCB6ZHMtPm91dEJ1ZmYgKyB6ZHMtPm91dFN0YXJ0LAorCQkJCQkJCQkJCSAgIChpc1NraXBGcmFtZSA/IDAgOiB6ZHMtPm91dEJ1ZmZTaXplIC0gemRzLT5vdXRTdGFydCksIGlwLCBuZWVkZWRJblNpemUpOworCQkJCWlmIChaU1REX2lzRXJyb3IoZGVjb2RlZFNpemUpKQorCQkJCQlyZXR1cm4gZGVjb2RlZFNpemU7CisJCQkJaXAgKz0gbmVlZGVkSW5TaXplOworCQkJCWlmICghZGVjb2RlZFNpemUgJiYgIWlzU2tpcEZyYW1lKQorCQkJCQlicmVhazsgLyogdGhpcyB3YXMganVzdCBhIGhlYWRlciAqLworCQkJCXpkcy0+b3V0RW5kID0gemRzLT5vdXRTdGFydCArIGRlY29kZWRTaXplOworCQkJCXpkcy0+c3RhZ2UgPSB6ZHNzX2ZsdXNoOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGlwID09IGllbmQpIHsKKwkJCQlzb21lTW9yZVdvcmsgPSAwOworCQkJCWJyZWFrOworCQkJfSAvKiBubyBtb3JlIGlucHV0ICovCisJCQl6ZHMtPnN0YWdlID0gemRzc19sb2FkOworCQkJLyogcGFzcy10aHJvdWdoICovCisJCX0KKworCQljYXNlIHpkc3NfbG9hZDogeworCQkJc2l6ZV90IGNvbnN0IG5lZWRlZEluU2l6ZSA9IFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoemRzLT5kY3R4KTsKKwkJCXNpemVfdCBjb25zdCB0b0xvYWQgPSBuZWVkZWRJblNpemUgLSB6ZHMtPmluUG9zOyAvKiBzaG91bGQgYWx3YXlzIGJlIDw9IHJlbWFpbmluZyBzcGFjZSB3aXRoaW4gaW5CdWZmICovCisJCQlzaXplX3QgbG9hZGVkU2l6ZTsKKwkJCWlmICh0b0xvYWQgPiB6ZHMtPmluQnVmZlNpemUgLSB6ZHMtPmluUG9zKQorCQkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJbG9hZGVkU2l6ZSA9IFpTVERfbGltaXRDb3B5KHpkcy0+aW5CdWZmICsgemRzLT5pblBvcywgdG9Mb2FkLCBpcCwgaWVuZCAtIGlwKTsKKwkJCWlwICs9IGxvYWRlZFNpemU7CisJCQl6ZHMtPmluUG9zICs9IGxvYWRlZFNpemU7CisJCQlpZiAobG9hZGVkU2l6ZSA8IHRvTG9hZCkgeworCQkJCXNvbWVNb3JlV29yayA9IDA7CisJCQkJYnJlYWs7CisJCQl9IC8qIG5vdCBlbm91Z2ggaW5wdXQsIHdhaXQgZm9yIG1vcmUgKi8KKworCQkJLyogZGVjb2RlIGxvYWRlZCBpbnB1dCAqLworCQkJeworCQkJCWNvbnN0IGludCBpc1NraXBGcmFtZSA9IFpTVERfaXNTa2lwRnJhbWUoemRzLT5kY3R4KTsKKwkJCQlzaXplX3QgY29uc3QgZGVjb2RlZFNpemUgPSBaU1REX2RlY29tcHJlc3NDb250aW51ZSh6ZHMtPmRjdHgsIHpkcy0+b3V0QnVmZiArIHpkcy0+b3V0U3RhcnQsIHpkcy0+b3V0QnVmZlNpemUgLSB6ZHMtPm91dFN0YXJ0LAorCQkJCQkJCQkJCSAgIHpkcy0+aW5CdWZmLCBuZWVkZWRJblNpemUpOworCQkJCWlmIChaU1REX2lzRXJyb3IoZGVjb2RlZFNpemUpKQorCQkJCQlyZXR1cm4gZGVjb2RlZFNpemU7CisJCQkJemRzLT5pblBvcyA9IDA7IC8qIGlucHV0IGlzIGNvbnN1bWVkICovCisJCQkJaWYgKCFkZWNvZGVkU2l6ZSAmJiAhaXNTa2lwRnJhbWUpIHsKKwkJCQkJemRzLT5zdGFnZSA9IHpkc3NfcmVhZDsKKwkJCQkJYnJlYWs7CisJCQkJfSAvKiB0aGlzIHdhcyBqdXN0IGEgaGVhZGVyICovCisJCQkJemRzLT5vdXRFbmQgPSB6ZHMtPm91dFN0YXJ0ICsgZGVjb2RlZFNpemU7CisJCQkJemRzLT5zdGFnZSA9IHpkc3NfZmx1c2g7CisJCQkJLyogcGFzcy10aHJvdWdoICovCisJCQl9CisJCX0KKworCQljYXNlIHpkc3NfZmx1c2g6IHsKKwkJCXNpemVfdCBjb25zdCB0b0ZsdXNoU2l6ZSA9IHpkcy0+b3V0RW5kIC0gemRzLT5vdXRTdGFydDsKKwkJCXNpemVfdCBjb25zdCBmbHVzaGVkU2l6ZSA9IFpTVERfbGltaXRDb3B5KG9wLCBvZW5kIC0gb3AsIHpkcy0+b3V0QnVmZiArIHpkcy0+b3V0U3RhcnQsIHRvRmx1c2hTaXplKTsKKwkJCW9wICs9IGZsdXNoZWRTaXplOworCQkJemRzLT5vdXRTdGFydCArPSBmbHVzaGVkU2l6ZTsKKwkJCWlmIChmbHVzaGVkU2l6ZSA9PSB0b0ZsdXNoU2l6ZSkgeyAvKiBmbHVzaCBjb21wbGV0ZWQgKi8KKwkJCQl6ZHMtPnN0YWdlID0gemRzc19yZWFkOworCQkJCWlmICh6ZHMtPm91dFN0YXJ0ICsgemRzLT5ibG9ja1NpemUgPiB6ZHMtPm91dEJ1ZmZTaXplKQorCQkJCQl6ZHMtPm91dFN0YXJ0ID0gemRzLT5vdXRFbmQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogY2Fubm90IGNvbXBsZXRlIGZsdXNoICovCisJCQlzb21lTW9yZVdvcmsgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogaW1wb3NzaWJsZSAqLworCQl9CisJfQorCisJLyogcmVzdWx0ICovCisJaW5wdXQtPnBvcyArPSAoc2l6ZV90KShpcCAtIGlzdGFydCk7CisJb3V0cHV0LT5wb3MgKz0gKHNpemVfdCkob3AgLSBvc3RhcnQpOworCXsKKwkJc2l6ZV90IG5leHRTcmNTaXplSGludCA9IFpTVERfbmV4dFNyY1NpemVUb0RlY29tcHJlc3MoemRzLT5kY3R4KTsKKwkJaWYgKCFuZXh0U3JjU2l6ZUhpbnQpIHsJCQkgICAgLyogZnJhbWUgZnVsbHkgZGVjb2RlZCAqLworCQkJaWYgKHpkcy0+b3V0RW5kID09IHpkcy0+b3V0U3RhcnQpIHsgLyogb3V0cHV0IGZ1bGx5IGZsdXNoZWQgKi8KKwkJCQlpZiAoemRzLT5ob3N0YWdlQnl0ZSkgeworCQkJCQlpZiAoaW5wdXQtPnBvcyA+PSBpbnB1dC0+c2l6ZSkgeworCQkJCQkJemRzLT5zdGFnZSA9IHpkc3NfcmVhZDsKKwkJCQkJCXJldHVybiAxOworCQkJCQl9CSAgICAgLyogY2FuJ3QgcmVsZWFzZSBob3N0YWdlIChub3QgcHJlc2VudCkgKi8KKwkJCQkJaW5wdXQtPnBvcysrOyAvKiByZWxlYXNlIGhvc3RhZ2UgKi8KKwkJCQl9CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAoIXpkcy0+aG9zdGFnZUJ5dGUpIHsgLyogb3V0cHV0IG5vdCBmdWxseSBmbHVzaGVkOyBrZWVwIGxhc3QgYnl0ZSBhcyBob3N0YWdlOyB3aWxsIGJlIHJlbGVhc2VkIHdoZW4gYWxsIG91dHB1dCBpcyBmbHVzaGVkICovCisJCQkJaW5wdXQtPnBvcy0tOyAgICAvKiBub3RlIDogcG9zID4gMCwgb3RoZXJ3aXNlLCBpbXBvc3NpYmxlIHRvIGZpbmlzaCByZWFkaW5nIGxhc3QgYmxvY2sgKi8KKwkJCQl6ZHMtPmhvc3RhZ2VCeXRlID0gMTsKKwkJCX0KKwkJCXJldHVybiAxOworCQl9CisJCW5leHRTcmNTaXplSGludCArPSBaU1REX2Jsb2NrSGVhZGVyU2l6ZSAqIChaU1REX25leHRJbnB1dFR5cGUoemRzLT5kY3R4KSA9PSBaU1REbml0X2Jsb2NrKTsgLyogcHJlbG9hZCBoZWFkZXIgb2YgbmV4dCBibG9jayAqLworCQlpZiAoemRzLT5pblBvcyA+IG5leHRTcmNTaXplSGludCkKKwkJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworCQluZXh0U3JjU2l6ZUhpbnQgLT0gemRzLT5pblBvczsgLyogYWxyZWFkeSBsb2FkZWQqLworCQlyZXR1cm4gbmV4dFNyY1NpemVIaW50OworCX0KK30KKworRVhQT1JUX1NZTUJPTChaU1REX0RDdHhXb3Jrc3BhY2VCb3VuZCk7CitFWFBPUlRfU1lNQk9MKFpTVERfaW5pdERDdHgpOworRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NEQ3R4KTsKK0VYUE9SVF9TWU1CT0woWlNURF9kZWNvbXByZXNzX3VzaW5nRGljdCk7CisKK0VYUE9SVF9TWU1CT0woWlNURF9ERGljdFdvcmtzcGFjZUJvdW5kKTsKK0VYUE9SVF9TWU1CT0woWlNURF9pbml0RERpY3QpOworRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NfdXNpbmdERGljdCk7CisKK0VYUE9SVF9TWU1CT0woWlNURF9EU3RyZWFtV29ya3NwYWNlQm91bmQpOworRVhQT1JUX1NZTUJPTChaU1REX2luaXREU3RyZWFtKTsKK0VYUE9SVF9TWU1CT0woWlNURF9pbml0RFN0cmVhbV91c2luZ0REaWN0KTsKK0VYUE9SVF9TWU1CT0woWlNURF9yZXNldERTdHJlYW0pOworRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NTdHJlYW0pOworRVhQT1JUX1NZTUJPTChaU1REX0RTdHJlYW1JblNpemUpOworRVhQT1JUX1NZTUJPTChaU1REX0RTdHJlYW1PdXRTaXplKTsKKworRVhQT1JUX1NZTUJPTChaU1REX2ZpbmRGcmFtZUNvbXByZXNzZWRTaXplKTsKK0VYUE9SVF9TWU1CT0woWlNURF9nZXRGcmFtZUNvbnRlbnRTaXplKTsKK0VYUE9SVF9TWU1CT0woWlNURF9maW5kRGVjb21wcmVzc2VkU2l6ZSk7CisKK0VYUE9SVF9TWU1CT0woWlNURF9pc0ZyYW1lKTsKK0VYUE9SVF9TWU1CT0woWlNURF9nZXREaWN0SURfZnJvbURpY3QpOworRVhQT1JUX1NZTUJPTChaU1REX2dldERpY3RJRF9mcm9tRERpY3QpOworRVhQT1JUX1NZTUJPTChaU1REX2dldERpY3RJRF9mcm9tRnJhbWUpOworCitFWFBPUlRfU1lNQk9MKFpTVERfZ2V0RnJhbWVQYXJhbXMpOworRVhQT1JUX1NZTUJPTChaU1REX2RlY29tcHJlc3NCZWdpbik7CitFWFBPUlRfU1lNQk9MKFpTVERfZGVjb21wcmVzc0JlZ2luX3VzaW5nRGljdCk7CitFWFBPUlRfU1lNQk9MKFpTVERfY29weURDdHgpOworRVhQT1JUX1NZTUJPTChaU1REX25leHRTcmNTaXplVG9EZWNvbXByZXNzKTsKK0VYUE9SVF9TWU1CT0woWlNURF9kZWNvbXByZXNzQ29udGludWUpOworRVhQT1JUX1NZTUJPTChaU1REX25leHRJbnB1dFR5cGUpOworCitFWFBPUlRfU1lNQk9MKFpTVERfZGVjb21wcmVzc0Jsb2NrKTsKK0VYUE9SVF9TWU1CT0woWlNURF9pbnNlcnRCbG9jayk7CisKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWnN0ZCBEZWNvbXByZXNzb3IiKTsKZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZW50cm9weV9jb21tb24uYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZW50cm9weV9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjBhNjQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9lbnRyb3B5X2NvbW1vbi5jCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29tbW9uIGZ1bmN0aW9ucyBvZiBOZXcgR2VuZXJhdGlvbiBFbnRyb3B5IGxpYnJhcnkKKyAqIENvcHlyaWdodCAoQykgMjAxNiwgWWFubiBDb2xsZXQuCisgKgorICogQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKiAtIFNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL0N5YW40OTczL0Zpbml0ZVN0YXRlRW50cm9weQorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIERlcGVuZGVuY2llcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImVycm9yX3ByaXZhdGUuaCIgLyogRVJSXyosIEVSUk9SICovCisjaW5jbHVkZSAiZnNlLmgiCisjaW5jbHVkZSAiaHVmLmgiCisjaW5jbHVkZSAibWVtLmgiCisKKy8qPT09ICAgVmVyc2lvbiAgID09PSovCit1bnNpZ25lZCBGU0VfdmVyc2lvbk51bWJlcih2b2lkKSB7IHJldHVybiBGU0VfVkVSU0lPTl9OVU1CRVI7IH0KKworLyo9PT0gICBFcnJvciBNYW5hZ2VtZW50ICAgPT09Ki8KK3Vuc2lnbmVkIEZTRV9pc0Vycm9yKHNpemVfdCBjb2RlKSB7IHJldHVybiBFUlJfaXNFcnJvcihjb2RlKTsgfQorCit1bnNpZ25lZCBIVUZfaXNFcnJvcihzaXplX3QgY29kZSkgeyByZXR1cm4gRVJSX2lzRXJyb3IoY29kZSk7IH0KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEZTRSBOQ291bnQgZW5jb2RpbmctZGVjb2RpbmcKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgRlNFX3JlYWROQ291bnQoc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCAqbWF4U1ZQdHIsIHVuc2lnbmVkICp0YWJsZUxvZ1B0ciwgY29uc3Qgdm9pZCAqaGVhZGVyQnVmZmVyLCBzaXplX3QgaGJTaXplKQoreworCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICopaGVhZGVyQnVmZmVyOworCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBoYlNpemU7CisJY29uc3QgQllURSAqaXAgPSBpc3RhcnQ7CisJaW50IG5iQml0czsKKwlpbnQgcmVtYWluaW5nOworCWludCB0aHJlc2hvbGQ7CisJVTMyIGJpdFN0cmVhbTsKKwlpbnQgYml0Q291bnQ7CisJdW5zaWduZWQgY2hhcm51bSA9IDA7CisJaW50IHByZXZpb3VzMCA9IDA7CisKKwlpZiAoaGJTaXplIDwgNCkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCWJpdFN0cmVhbSA9IFpTVERfcmVhZExFMzIoaXApOworCW5iQml0cyA9IChiaXRTdHJlYW0gJiAweEYpICsgRlNFX01JTl9UQUJMRUxPRzsgLyogZXh0cmFjdCB0YWJsZUxvZyAqLworCWlmIChuYkJpdHMgPiBGU0VfVEFCTEVMT0dfQUJTT0xVVEVfTUFYKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCWJpdFN0cmVhbSA+Pj0gNDsKKwliaXRDb3VudCA9IDQ7CisJKnRhYmxlTG9nUHRyID0gbmJCaXRzOworCXJlbWFpbmluZyA9ICgxIDw8IG5iQml0cykgKyAxOworCXRocmVzaG9sZCA9IDEgPDwgbmJCaXRzOworCW5iQml0cysrOworCisJd2hpbGUgKChyZW1haW5pbmcgPiAxKSAmIChjaGFybnVtIDw9ICptYXhTVlB0cikpIHsKKwkJaWYgKHByZXZpb3VzMCkgeworCQkJdW5zaWduZWQgbjAgPSBjaGFybnVtOworCQkJd2hpbGUgKChiaXRTdHJlYW0gJiAweEZGRkYpID09IDB4RkZGRikgeworCQkJCW4wICs9IDI0OworCQkJCWlmIChpcCA8IGllbmQgLSA1KSB7CisJCQkJCWlwICs9IDI7CisJCQkJCWJpdFN0cmVhbSA9IFpTVERfcmVhZExFMzIoaXApID4+IGJpdENvdW50OworCQkJCX0gZWxzZSB7CisJCQkJCWJpdFN0cmVhbSA+Pj0gMTY7CisJCQkJCWJpdENvdW50ICs9IDE2OworCQkJCX0KKwkJCX0KKwkJCXdoaWxlICgoYml0U3RyZWFtICYgMykgPT0gMykgeworCQkJCW4wICs9IDM7CisJCQkJYml0U3RyZWFtID4+PSAyOworCQkJCWJpdENvdW50ICs9IDI7CisJCQl9CisJCQluMCArPSBiaXRTdHJlYW0gJiAzOworCQkJYml0Q291bnQgKz0gMjsKKwkJCWlmIChuMCA+ICptYXhTVlB0cikKKwkJCQlyZXR1cm4gRVJST1IobWF4U3ltYm9sVmFsdWVfdG9vU21hbGwpOworCQkJd2hpbGUgKGNoYXJudW0gPCBuMCkKKwkJCQlub3JtYWxpemVkQ291bnRlcltjaGFybnVtKytdID0gMDsKKwkJCWlmICgoaXAgPD0gaWVuZCAtIDcpIHx8IChpcCArIChiaXRDb3VudCA+PiAzKSA8PSBpZW5kIC0gNCkpIHsKKwkJCQlpcCArPSBiaXRDb3VudCA+PiAzOworCQkJCWJpdENvdW50ICY9IDc7CisJCQkJYml0U3RyZWFtID0gWlNURF9yZWFkTEUzMihpcCkgPj4gYml0Q291bnQ7CisJCQl9IGVsc2UgeworCQkJCWJpdFN0cmVhbSA+Pj0gMjsKKwkJCX0KKwkJfQorCQl7CisJCQlpbnQgY29uc3QgbWF4ID0gKDIgKiB0aHJlc2hvbGQgLSAxKSAtIHJlbWFpbmluZzsKKwkJCWludCBjb3VudDsKKworCQkJaWYgKChiaXRTdHJlYW0gJiAodGhyZXNob2xkIC0gMSkpIDwgKFUzMiltYXgpIHsKKwkJCQljb3VudCA9IGJpdFN0cmVhbSAmICh0aHJlc2hvbGQgLSAxKTsKKwkJCQliaXRDb3VudCArPSBuYkJpdHMgLSAxOworCQkJfSBlbHNlIHsKKwkJCQljb3VudCA9IGJpdFN0cmVhbSAmICgyICogdGhyZXNob2xkIC0gMSk7CisJCQkJaWYgKGNvdW50ID49IHRocmVzaG9sZCkKKwkJCQkJY291bnQgLT0gbWF4OworCQkJCWJpdENvdW50ICs9IG5iQml0czsKKwkJCX0KKworCQkJY291bnQtLTsJCQkJIC8qIGV4dHJhIGFjY3VyYWN5ICovCisJCQlyZW1haW5pbmcgLT0gY291bnQgPCAwID8gLWNvdW50IDogY291bnQ7IC8qIC0xIG1lYW5zICsxICovCisJCQlub3JtYWxpemVkQ291bnRlcltjaGFybnVtKytdID0gKHNob3J0KWNvdW50OworCQkJcHJldmlvdXMwID0gIWNvdW50OworCQkJd2hpbGUgKHJlbWFpbmluZyA8IHRocmVzaG9sZCkgeworCQkJCW5iQml0cy0tOworCQkJCXRocmVzaG9sZCA+Pj0gMTsKKwkJCX0KKworCQkJaWYgKChpcCA8PSBpZW5kIC0gNykgfHwgKGlwICsgKGJpdENvdW50ID4+IDMpIDw9IGllbmQgLSA0KSkgeworCQkJCWlwICs9IGJpdENvdW50ID4+IDM7CisJCQkJYml0Q291bnQgJj0gNzsKKwkJCX0gZWxzZSB7CisJCQkJYml0Q291bnQgLT0gKGludCkoOCAqIChpZW5kIC0gNCAtIGlwKSk7CisJCQkJaXAgPSBpZW5kIC0gNDsKKwkJCX0KKwkJCWJpdFN0cmVhbSA9IFpTVERfcmVhZExFMzIoaXApID4+IChiaXRDb3VudCAmIDMxKTsKKwkJfQorCX0gLyogd2hpbGUgKChyZW1haW5pbmc+MSkgJiAoY2hhcm51bTw9Km1heFNWUHRyKSkgKi8KKwlpZiAocmVtYWluaW5nICE9IDEpCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwlpZiAoYml0Q291bnQgPiAzMikKKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCSptYXhTVlB0ciA9IGNoYXJudW0gLSAxOworCisJaXAgKz0gKGJpdENvdW50ICsgNykgPj4gMzsKKwlyZXR1cm4gaXAgLSBpc3RhcnQ7Cit9CisKKy8qISBIVUZfcmVhZFN0YXRzKCkgOgorCVJlYWQgY29tcGFjdCBIdWZmbWFuIHRyZWUsIHNhdmVkIGJ5IEhVRl93cml0ZUNUYWJsZSgpLgorCWBodWZmV2VpZ2h0YCBpcyBkZXN0aW5hdGlvbiBidWZmZXIuCisJYHJhbmtTdGF0c2AgaXMgYXNzdW1lZCB0byBiZSBhIHRhYmxlIG9mIGF0IGxlYXN0IEhVRl9UQUJMRUxPR19NQVggVTMyLgorCUByZXR1cm4gOiBzaXplIHJlYWQgZnJvbSBgc3JjYCAsIG9yIGFuIGVycm9yIENvZGUgLgorCU5vdGUgOiBOZWVkZWQgYnkgSFVGX3JlYWRDVGFibGUoKSBhbmQgSFVGX3JlYWREVGFibGVYPygpIC4KKyovCitzaXplX3QgSFVGX3JlYWRTdGF0c193a3NwKEJZVEUgKmh1ZmZXZWlnaHQsIHNpemVfdCBod1NpemUsIFUzMiAqcmFua1N0YXRzLCBVMzIgKm5iU3ltYm9sc1B0ciwgVTMyICp0YWJsZUxvZ1B0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkKK3sKKwlVMzIgd2VpZ2h0VG90YWw7CisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKXNyYzsKKwlzaXplX3QgaVNpemU7CisJc2l6ZV90IG9TaXplOworCisJaWYgKCFzcmNTaXplKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJaVNpemUgPSBpcFswXTsKKwkvKiBtZW1zZXQoaHVmZldlaWdodCwgMCwgaHdTaXplKTsgICAqLyAvKiBpcyBub3QgbmVjZXNzYXJ5LCBldmVuIHRob3VnaCBzb21lIGFuYWx5emVyIGNvbXBsYWluIC4uLiAqLworCisJaWYgKGlTaXplID49IDEyOCkgeyAvKiBzcGVjaWFsIGhlYWRlciAqLworCQlvU2l6ZSA9IGlTaXplIC0gMTI3OworCQlpU2l6ZSA9ICgob1NpemUgKyAxKSAvIDIpOworCQlpZiAoaVNpemUgKyAxID4gc3JjU2l6ZSkKKwkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwkJaWYgKG9TaXplID49IGh3U2l6ZSkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJaXAgKz0gMTsKKwkJeworCQkJVTMyIG47CisJCQlmb3IgKG4gPSAwOyBuIDwgb1NpemU7IG4gKz0gMikgeworCQkJCWh1ZmZXZWlnaHRbbl0gPSBpcFtuIC8gMl0gPj4gNDsKKwkJCQlodWZmV2VpZ2h0W24gKyAxXSA9IGlwW24gLyAyXSAmIDE1OworCQkJfQorCQl9CisJfSBlbHNlIHsJCQkJCQkgLyogaGVhZGVyIGNvbXByZXNzZWQgd2l0aCBGU0UgKG5vcm1hbCBjYXNlKSAqLworCQlpZiAoaVNpemUgKyAxID4gc3JjU2l6ZSkKKwkJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsKKwkJb1NpemUgPSBGU0VfZGVjb21wcmVzc193a3NwKGh1ZmZXZWlnaHQsIGh3U2l6ZSAtIDEsIGlwICsgMSwgaVNpemUsIDYsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7IC8qIG1heCAoaHdTaXplLTEpIHZhbHVlcyBkZWNvZGVkLCBhcyBsYXN0IG9uZSBpcyBpbXBsaWVkICovCisJCWlmIChGU0VfaXNFcnJvcihvU2l6ZSkpCisJCQlyZXR1cm4gb1NpemU7CisJfQorCisJLyogY29sbGVjdCB3ZWlnaHQgc3RhdHMgKi8KKwltZW1zZXQocmFua1N0YXRzLCAwLCAoSFVGX1RBQkxFTE9HX01BWCArIDEpICogc2l6ZW9mKFUzMikpOworCXdlaWdodFRvdGFsID0gMDsKKwl7CisJCVUzMiBuOworCQlmb3IgKG4gPSAwOyBuIDwgb1NpemU7IG4rKykgeworCQkJaWYgKGh1ZmZXZWlnaHRbbl0gPj0gSFVGX1RBQkxFTE9HX01BWCkKKwkJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisJCQlyYW5rU3RhdHNbaHVmZldlaWdodFtuXV0rKzsKKwkJCXdlaWdodFRvdGFsICs9ICgxIDw8IGh1ZmZXZWlnaHRbbl0pID4+IDE7CisJCX0KKwl9CisJaWYgKHdlaWdodFRvdGFsID09IDApCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKworCS8qIGdldCBsYXN0IG5vbi1udWxsIHN5bWJvbCB3ZWlnaHQgKGltcGxpZWQsIHRvdGFsIG11c3QgYmUgMl5uKSAqLworCXsKKwkJVTMyIGNvbnN0IHRhYmxlTG9nID0gQklUX2hpZ2hiaXQzMih3ZWlnaHRUb3RhbCkgKyAxOworCQlpZiAodGFibGVMb2cgPiBIVUZfVEFCTEVMT0dfTUFYKQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQkqdGFibGVMb2dQdHIgPSB0YWJsZUxvZzsKKwkJLyogZGV0ZXJtaW5lIGxhc3Qgd2VpZ2h0ICovCisJCXsKKwkJCVUzMiBjb25zdCB0b3RhbCA9IDEgPDwgdGFibGVMb2c7CisJCQlVMzIgY29uc3QgcmVzdCA9IHRvdGFsIC0gd2VpZ2h0VG90YWw7CisJCQlVMzIgY29uc3QgdmVyaWYgPSAxIDw8IEJJVF9oaWdoYml0MzIocmVzdCk7CisJCQlVMzIgY29uc3QgbGFzdFdlaWdodCA9IEJJVF9oaWdoYml0MzIocmVzdCkgKyAxOworCQkJaWYgKHZlcmlmICE9IHJlc3QpCisJCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBsYXN0IHZhbHVlIG11c3QgYmUgYSBjbGVhbiBwb3dlciBvZiAyICovCisJCQlodWZmV2VpZ2h0W29TaXplXSA9IChCWVRFKWxhc3RXZWlnaHQ7CisJCQlyYW5rU3RhdHNbbGFzdFdlaWdodF0rKzsKKwkJfQorCX0KKworCS8qIGNoZWNrIHRyZWUgY29uc3RydWN0aW9uIHZhbGlkaXR5ICovCisJaWYgKChyYW5rU3RhdHNbMV0gPCAyKSB8fCAocmFua1N0YXRzWzFdICYgMSkpCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogYnkgY29uc3RydWN0aW9uIDogYXQgbGVhc3QgMiBlbHRzIG9mIHJhbmsgMSwgbXVzdCBiZSBldmVuICovCisKKwkvKiByZXN1bHRzICovCisJKm5iU3ltYm9sc1B0ciA9IChVMzIpKG9TaXplICsgMSk7CisJcmV0dXJuIGlTaXplICsgMTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZXJyb3JfcHJpdmF0ZS5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9lcnJvcl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2MGIzMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZXJyb3JfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDE2LXByZXNlbnQsIFlhbm4gQ29sbGV0LCBGYWNlYm9vaywgSW5jLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBCU0Qtc3R5bGUgbGljZW5zZSBmb3VuZCBpbiB0aGUKKyAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3pzdGQuCisgKiBBbiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW4gdGhlCisgKiBzYW1lIGRpcmVjdG9yeS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QKKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UKKyAqICgiQlNEIikuCisgKi8KKworLyogTm90ZSA6IHRoaXMgbW9kdWxlIGlzIGV4cGVjdGVkIHRvIHJlbWFpbiBwcml2YXRlLCBkbyBub3QgZXhwb3NlIGl0ICovCisKKyNpZm5kZWYgRVJST1JfSF9NT0RVTEUKKyNkZWZpbmUgRVJST1JfSF9NT0RVTEUKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVwZW5kZW5jaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gLyogc2l6ZV90ICovCisjaW5jbHVkZSA8bGludXgvenN0ZC5oPiAgLyogZW51bSBsaXN0ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIENvbXBpbGVyLXNwZWNpZmljCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVSUl9TVEFUSUMgc3RhdGljIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEN1c3RvbWl6YXRpb24gKGVycm9yX3B1YmxpYy5oKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBaU1REX0Vycm9yQ29kZSBFUlJfZW51bTsKKyNkZWZpbmUgUFJFRklYKG5hbWUpIFpTVERfZXJyb3JfIyNuYW1lCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEVycm9yIGNvZGVzIGhhbmRsaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEVSUk9SKG5hbWUpICgoc2l6ZV90KS1QUkVGSVgobmFtZSkpCisKK0VSUl9TVEFUSUMgdW5zaWduZWQgRVJSX2lzRXJyb3Ioc2l6ZV90IGNvZGUpIHsgcmV0dXJuIChjb2RlID4gRVJST1IobWF4Q29kZSkpOyB9CisKK0VSUl9TVEFUSUMgRVJSX2VudW0gRVJSX2dldEVycm9yQ29kZShzaXplX3QgY29kZSkKK3sKKwlpZiAoIUVSUl9pc0Vycm9yKGNvZGUpKQorCQlyZXR1cm4gKEVSUl9lbnVtKTA7CisJcmV0dXJuIChFUlJfZW51bSkoMCAtIGNvZGUpOworfQorCisjZW5kaWYgLyogRVJST1JfSF9NT0RVTEUgKi8KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZnNlLmggYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2ZzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjBhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2ZzZS5oCkBAIC0wLDAgKzEsNTc1IEBACisvKgorICogRlNFIDogRmluaXRlIFN0YXRlIEVudHJvcHkgY29kZWMKKyAqIFB1YmxpYyBQcm90b3R5cGVzIGRlY2xhcmF0aW9uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiwgWWFubiBDb2xsZXQuCisgKgorICogQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKiAtIFNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL0N5YW40OTczL0Zpbml0ZVN0YXRlRW50cm9weQorICovCisjaWZuZGVmIEZTRV9ICisjZGVmaW5lIEZTRV9ICisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBEZXBlbmRlbmNpZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAvKiBzaXplX3QsIHB0cmRpZmZfdCAqLworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRlNFX1BVQkxJQ19BUEkgOiBjb250cm9sIGxpYnJhcnkgc3ltYm9scyB2aXNpYmlsaXR5CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZTRV9QVUJMSUNfQVBJCisKKy8qLS0tLS0tICAgVmVyc2lvbiAgIC0tLS0tLSovCisjZGVmaW5lIEZTRV9WRVJTSU9OX01BSk9SIDAKKyNkZWZpbmUgRlNFX1ZFUlNJT05fTUlOT1IgOQorI2RlZmluZSBGU0VfVkVSU0lPTl9SRUxFQVNFIDAKKworI2RlZmluZSBGU0VfTElCX1ZFUlNJT04gRlNFX1ZFUlNJT05fTUFKT1IuRlNFX1ZFUlNJT05fTUlOT1IuRlNFX1ZFUlNJT05fUkVMRUFTRQorI2RlZmluZSBGU0VfUVVPVEUoc3RyKSAjc3RyCisjZGVmaW5lIEZTRV9FWFBBTkRfQU5EX1FVT1RFKHN0cikgRlNFX1FVT1RFKHN0cikKKyNkZWZpbmUgRlNFX1ZFUlNJT05fU1RSSU5HIEZTRV9FWFBBTkRfQU5EX1FVT1RFKEZTRV9MSUJfVkVSU0lPTikKKworI2RlZmluZSBGU0VfVkVSU0lPTl9OVU1CRVIgKEZTRV9WRVJTSU9OX01BSk9SICogMTAwICogMTAwICsgRlNFX1ZFUlNJT05fTUlOT1IgKiAxMDAgKyBGU0VfVkVSU0lPTl9SRUxFQVNFKQorRlNFX1BVQkxJQ19BUEkgdW5zaWduZWQgRlNFX3ZlcnNpb25OdW1iZXIodm9pZCk7IC8qKjwgbGlicmFyeSB2ZXJzaW9uIG51bWJlcjsgdG8gYmUgdXNlZCB3aGVuIGNoZWNraW5nIGRsbCB2ZXJzaW9uICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBUb29sIGZ1bmN0aW9ucworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworRlNFX1BVQkxJQ19BUEkgc2l6ZV90IEZTRV9jb21wcmVzc0JvdW5kKHNpemVfdCBzaXplKTsgLyogbWF4aW11bSBjb21wcmVzc2VkIHNpemUgKi8KKworLyogRXJyb3IgTWFuYWdlbWVudCAqLworRlNFX1BVQkxJQ19BUEkgdW5zaWduZWQgRlNFX2lzRXJyb3Ioc2l6ZV90IGNvZGUpOyAvKiB0ZWxscyBpZiBhIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBGU0UgZGV0YWlsZWQgQVBJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEKK0ZTRV9jb21wcmVzcygpIGRvZXMgdGhlIGZvbGxvd2luZzoKKzEuIGNvdW50IHN5bWJvbCBvY2N1cnJlbmNlIGZyb20gc291cmNlW10gaW50byB0YWJsZSBjb3VudFtdCisyLiBub3JtYWxpemUgY291bnRlcnMgc28gdGhhdCBzdW0oY291bnRbXSkgPT0gUG93ZXJfb2ZfMiAoMl50YWJsZUxvZykKKzMuIHNhdmUgbm9ybWFsaXplZCBjb3VudGVycyB0byBtZW1vcnkgYnVmZmVyIHVzaW5nIHdyaXRlTkNvdW50KCkKKzQuIGJ1aWxkIGVuY29kaW5nIHRhYmxlICdDVGFibGUnIGZyb20gbm9ybWFsaXplZCBjb3VudGVycworNS4gZW5jb2RlIHRoZSBkYXRhIHN0cmVhbSB1c2luZyBlbmNvZGluZyB0YWJsZSAnQ1RhYmxlJworCitGU0VfZGVjb21wcmVzcygpIGRvZXMgdGhlIGZvbGxvd2luZzoKKzEuIHJlYWQgbm9ybWFsaXplZCBjb3VudGVycyB3aXRoIHJlYWROQ291bnQoKQorMi4gYnVpbGQgZGVjb2RpbmcgdGFibGUgJ0RUYWJsZScgZnJvbSBub3JtYWxpemVkIGNvdW50ZXJzCiszLiBkZWNvZGUgdGhlIGRhdGEgc3RyZWFtIHVzaW5nIGRlY29kaW5nIHRhYmxlICdEVGFibGUnCisKK1RoZSBmb2xsb3dpbmcgQVBJIGFsbG93cyB0YXJnZXRpbmcgc3BlY2lmaWMgc3ViLWZ1bmN0aW9ucyBmb3IgYWR2YW5jZWQgdGFza3MuCitGb3IgZXhhbXBsZSwgaXQncyBwb3NzaWJsZSB0byBjb21wcmVzcyBzZXZlcmFsIGJsb2NrcyB1c2luZyB0aGUgc2FtZSAnQ1RhYmxlJywKK29yIHRvIHNhdmUgYW5kIHByb3ZpZGUgbm9ybWFsaXplZCBkaXN0cmlidXRpb24gdXNpbmcgZXh0ZXJuYWwgbWV0aG9kLgorKi8KKworLyogKioqIENPTVBSRVNTSU9OICoqKiAqLworLyohIEZTRV9vcHRpbWFsVGFibGVMb2coKToKKwlkeW5hbWljYWxseSBkb3duc2l6ZSAndGFibGVMb2cnIHdoZW4gY29uZGl0aW9ucyBhcmUgbWV0LgorCUl0IHNhdmVzIENQVSB0aW1lLCBieSB1c2luZyBzbWFsbGVyIHRhYmxlcywgd2hpbGUgcHJlc2VydmluZyBvciBldmVuIGltcHJvdmluZyBjb21wcmVzc2lvbiByYXRpby4KKwlAcmV0dXJuIDogcmVjb21tZW5kZWQgdGFibGVMb2cgKG5lY2Vzc2FyaWx5IDw9ICdtYXhUYWJsZUxvZycpICovCitGU0VfUFVCTElDX0FQSSB1bnNpZ25lZCBGU0Vfb3B0aW1hbFRhYmxlTG9nKHVuc2lnbmVkIG1heFRhYmxlTG9nLCBzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUpOworCisvKiEgRlNFX25vcm1hbGl6ZUNvdW50KCk6CisJbm9ybWFsaXplIGNvdW50cyBzbyB0aGF0IHN1bShjb3VudFtdKSA9PSBQb3dlcl9vZl8yICgyXnRhYmxlTG9nKQorCSdub3JtYWxpemVkQ291bnRlcicgaXMgYSB0YWJsZSBvZiBzaG9ydCwgb2YgbWluaW11bSBzaXplIChtYXhTeW1ib2xWYWx1ZSsxKS4KKwlAcmV0dXJuIDogdGFibGVMb2csCisJCQkgIG9yIGFuIGVycm9yQ29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpICovCitGU0VfUFVCTElDX0FQSSBzaXplX3QgRlNFX25vcm1hbGl6ZUNvdW50KHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgdGFibGVMb2csIGNvbnN0IHVuc2lnbmVkICpjb3VudCwgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlKTsKKworLyohIEZTRV9OQ291bnRXcml0ZUJvdW5kKCk6CisJUHJvdmlkZXMgdGhlIG1heGltdW0gcG9zc2libGUgc2l6ZSBvZiBhbiBGU0Ugbm9ybWFsaXplZCB0YWJsZSwgZ2l2ZW4gJ21heFN5bWJvbFZhbHVlJyBhbmQgJ3RhYmxlTG9nJy4KKwlUeXBpY2FsbHkgdXNlZnVsIGZvciBhbGxvY2F0aW9uIHB1cnBvc2UuICovCitGU0VfUFVCTElDX0FQSSBzaXplX3QgRlNFX05Db3VudFdyaXRlQm91bmQodW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nKTsKKworLyohIEZTRV93cml0ZU5Db3VudCgpOgorCUNvbXBhY3RseSBzYXZlICdub3JtYWxpemVkQ291bnRlcicgaW50byAnYnVmZmVyJy4KKwlAcmV0dXJuIDogc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCB0YWJsZSwKKwkJCSAgb3IgYW4gZXJyb3JDb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCkuICovCitGU0VfUFVCTElDX0FQSSBzaXplX3QgRlNFX3dyaXRlTkNvdW50KHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ1ZmZlclNpemUsIGNvbnN0IHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nKTsKKworLyohIENvbnN0cnVjdG9yIGFuZCBEZXN0cnVjdG9yIG9mIEZTRV9DVGFibGUuCisJTm90ZSB0aGF0IEZTRV9DVGFibGUgc2l6ZSBkZXBlbmRzIG9uICd0YWJsZUxvZycgYW5kICdtYXhTeW1ib2xWYWx1ZScgKi8KK3R5cGVkZWYgdW5zaWduZWQgRlNFX0NUYWJsZTsgLyogZG9uJ3QgYWxsb2NhdGUgdGhhdC4gSXQncyBvbmx5IG1lYW50IHRvIGJlIG1vcmUgcmVzdHJpY3RpdmUgdGhhbiB2b2lkKiAqLworCisvKiEgRlNFX2NvbXByZXNzX3VzaW5nQ1RhYmxlKCk6CisJQ29tcHJlc3MgYHNyY2AgdXNpbmcgYGN0YCBpbnRvIGBkc3RgIHdoaWNoIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQuCisJQHJldHVybiA6IHNpemUgb2YgY29tcHJlc3NlZCBkYXRhICg8PSBgZHN0Q2FwYWNpdHlgKSwKKwkJCSAgb3IgMCBpZiBjb21wcmVzc2VkIGRhdGEgY291bGQgbm90IGZpdCBpbnRvIGBkc3RgLAorCQkJICBvciBhbiBlcnJvckNvZGUsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSAqLworRlNFX1BVQkxJQ19BUEkgc2l6ZV90IEZTRV9jb21wcmVzc191c2luZ0NUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3QgRlNFX0NUYWJsZSAqY3QpOworCisvKiEKK1R1dG9yaWFsIDoKKy0tLS0tLS0tLS0KK1RoZSBmaXJzdCBzdGVwIGlzIHRvIGNvdW50IGFsbCBzeW1ib2xzLiBGU0VfY291bnQoKSBkb2VzIHRoaXMgam9iIHZlcnkgZmFzdC4KK1Jlc3VsdCB3aWxsIGJlIHNhdmVkIGludG8gJ2NvdW50JywgYSB0YWJsZSBvZiB1bnNpZ25lZCBpbnQsIHdoaWNoIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBoYXZlICdtYXhTeW1ib2xWYWx1ZVB0clswXSsxJyBjZWxscy4KKydzcmMnIGlzIGEgdGFibGUgb2YgYnl0ZXMgb2Ygc2l6ZSAnc3JjU2l6ZScuIEFsbCB2YWx1ZXMgd2l0aGluICdzcmMnIE1VU1QgYmUgPD0gbWF4U3ltYm9sVmFsdWVQdHJbMF0KK21heFN5bWJvbFZhbHVlUHRyWzBdIHdpbGwgYmUgdXBkYXRlZCwgd2l0aCBpdHMgcmVhbCB2YWx1ZSAobmVjZXNzYXJpbHkgPD0gb3JpZ2luYWwgdmFsdWUpCitGU0VfY291bnQoKSB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2Ugb2YgdGhlIG1vc3QgZnJlcXVlbnQgc3ltYm9sLgorVGhpcyBjYW4gYmUgdXNlZCB0byBrbm93IGlmIHRoZXJlIGlzIGEgc2luZ2xlIHN5bWJvbCB3aXRoaW4gJ3NyYycsIGFuZCB0byBxdWlja2x5IGV2YWx1YXRlIGl0cyBjb21wcmVzc2liaWxpdHkuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIEVycm9yQ29kZSAod2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpKS4KKworVGhlIG5leHQgc3RlcCBpcyB0byBub3JtYWxpemUgdGhlIGZyZXF1ZW5jaWVzLgorRlNFX25vcm1hbGl6ZUNvdW50KCkgd2lsbCBlbnN1cmUgdGhhdCBzdW0gb2YgZnJlcXVlbmNpZXMgaXMgPT0gMiBeJ3RhYmxlTG9nJy4KK0l0IGFsc28gZ3VhcmFudGVlcyBhIG1pbmltdW0gb2YgMSB0byBhbnkgU3ltYm9sIHdpdGggZnJlcXVlbmN5ID49IDEuCitZb3UgY2FuIHVzZSAndGFibGVMb2cnPT0wIHRvIG1lYW4gInVzZSBkZWZhdWx0IHRhYmxlTG9nIHZhbHVlIi4KK0lmIHlvdSBhcmUgdW5zdXJlIG9mIHdoaWNoIHRhYmxlTG9nIHZhbHVlIHRvIHVzZSwgeW91IGNhbiBhc2sgRlNFX29wdGltYWxUYWJsZUxvZygpLAord2hpY2ggd2lsbCBwcm92aWRlIHRoZSBvcHRpbWFsIHZhbGlkIHRhYmxlTG9nIGdpdmVuIHNvdXJjZVNpemUsIG1heFN5bWJvbFZhbHVlLCBhbmQgYSB1c2VyLWRlZmluZWQgbWF4aW11bSAoMCBtZWFucyAiZGVmYXVsdCIpLgorCitUaGUgcmVzdWx0IG9mIEZTRV9ub3JtYWxpemVDb3VudCgpIHdpbGwgYmUgc2F2ZWQgaW50byBhIHRhYmxlLAorY2FsbGVkICdub3JtYWxpemVkQ291bnRlcicsIHdoaWNoIGlzIGEgdGFibGUgb2Ygc2lnbmVkIHNob3J0LgorJ25vcm1hbGl6ZWRDb3VudGVyJyBtdXN0IGJlIGFscmVhZHkgYWxsb2NhdGVkLCBhbmQgaGF2ZSBhdCBsZWFzdCAnbWF4U3ltYm9sVmFsdWUrMScgY2VsbHMuCitUaGUgcmV0dXJuIHZhbHVlIGlzIHRhYmxlTG9nIGlmIGV2ZXJ5dGhpbmcgcHJvY2VlZGVkIGFzIGV4cGVjdGVkLgorSXQgaXMgMCBpZiB0aGVyZSBpcyBhIHNpbmdsZSBzeW1ib2wgd2l0aGluIGRpc3RyaWJ1dGlvbi4KK0lmIHRoZXJlIGlzIGFuIGVycm9yIChleDogaW52YWxpZCB0YWJsZUxvZyB2YWx1ZSksIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBFcnJvckNvZGUgKHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSkuCisKKydub3JtYWxpemVkQ291bnRlcicgY2FuIGJlIHNhdmVkIGluIGEgY29tcGFjdCBtYW5uZXIgdG8gYSBtZW1vcnkgYXJlYSB1c2luZyBGU0Vfd3JpdGVOQ291bnQoKS4KKydidWZmZXInIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQuCitGb3IgZ3VhcmFudGVlZCBzdWNjZXNzLCBidWZmZXIgc2l6ZSBtdXN0IGJlIGF0IGxlYXN0IEZTRV9oZWFkZXJCb3VuZCgpLgorVGhlIHJlc3VsdCBvZiB0aGUgZnVuY3Rpb24gaXMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gJ2J1ZmZlcicuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIEVycm9yQ29kZSAod2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpOyBleCA6IGJ1ZmZlciBzaXplIHRvbyBzbWFsbCkuCisKKydub3JtYWxpemVkQ291bnRlcicgY2FuIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIGNvbXByZXNzaW9uIHRhYmxlICdDVGFibGUnLgorVGhlIHNwYWNlIHJlcXVpcmVkIGJ5ICdDVGFibGUnIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIHVzaW5nIEZTRV9jcmVhdGVDVGFibGUoKS4KK1lvdSBjYW4gdGhlbiB1c2UgRlNFX2J1aWxkQ1RhYmxlKCkgdG8gZmlsbCAnQ1RhYmxlJy4KK0lmIHRoZXJlIGlzIGFuIGVycm9yLCBib3RoIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhbiBFcnJvckNvZGUgKHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSkuCisKKydDVGFibGUnIGNhbiB0aGVuIGJlIHVzZWQgdG8gY29tcHJlc3MgJ3NyYycsIHdpdGggRlNFX2NvbXByZXNzX3VzaW5nQ1RhYmxlKCkuCitTaW1pbGFyIHRvIEZTRV9jb3VudCgpLCB0aGUgY29udmVudGlvbiBpcyB0aGF0ICdzcmMnIGlzIGFzc3VtZWQgdG8gYmUgYSB0YWJsZSBvZiBjaGFyIG9mIHNpemUgJ3NyY1NpemUnCitUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2l6ZSBvZiBjb21wcmVzc2VkIGRhdGEgKHdpdGhvdXQgaGVhZGVyKSwgbmVjZXNzYXJpbHkgPD0gYGRzdENhcGFjaXR5YC4KK0lmIGl0IHJldHVybnMgJzAnLCBjb21wcmVzc2VkIGRhdGEgY291bGQgbm90IGZpdCBpbnRvICdkc3QnLgorSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBFcnJvckNvZGUgKHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKSkuCisqLworCisvKiAqKiogREVDT01QUkVTU0lPTiAqKiogKi8KKworLyohIEZTRV9yZWFkTkNvdW50KCk6CisJUmVhZCBjb21wYWN0bHkgc2F2ZWQgJ25vcm1hbGl6ZWRDb3VudGVyJyBmcm9tICdyQnVmZmVyJy4KKwlAcmV0dXJuIDogc2l6ZSByZWFkIGZyb20gJ3JCdWZmZXInLAorCQkJICBvciBhbiBlcnJvckNvZGUsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKS4KKwkJCSAgbWF4U3ltYm9sVmFsdWVQdHJbMF0gYW5kIHRhYmxlTG9nUHRyWzBdIHdpbGwgYWxzbyBiZSB1cGRhdGVkIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSB2YWx1ZXMgKi8KK0ZTRV9QVUJMSUNfQVBJIHNpemVfdCBGU0VfcmVhZE5Db3VudChzaG9ydCAqbm9ybWFsaXplZENvdW50ZXIsIHVuc2lnbmVkICptYXhTeW1ib2xWYWx1ZVB0ciwgdW5zaWduZWQgKnRhYmxlTG9nUHRyLCBjb25zdCB2b2lkICpyQnVmZmVyLCBzaXplX3QgckJ1ZmZTaXplKTsKKworLyohIENvbnN0cnVjdG9yIGFuZCBEZXN0cnVjdG9yIG9mIEZTRV9EVGFibGUuCisJTm90ZSB0aGF0IGl0cyBzaXplIGRlcGVuZHMgb24gJ3RhYmxlTG9nJyAqLwordHlwZWRlZiB1bnNpZ25lZCBGU0VfRFRhYmxlOyAvKiBkb24ndCBhbGxvY2F0ZSB0aGF0LiBJdCdzIGp1c3QgYSB3YXkgdG8gYmUgbW9yZSByZXN0cmljdGl2ZSB0aGFuIHZvaWQqICovCisKKy8qISBGU0VfYnVpbGREVGFibGUoKToKKwlCdWlsZHMgJ2R0Jywgd2hpY2ggbXVzdCBiZSBhbHJlYWR5IGFsbG9jYXRlZCwgdXNpbmcgRlNFX2NyZWF0ZURUYWJsZSgpLgorCXJldHVybiA6IDAsIG9yIGFuIGVycm9yQ29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpICovCitGU0VfUFVCTElDX0FQSSBzaXplX3QgRlNFX2J1aWxkRFRhYmxlX3drc3AoRlNFX0RUYWJsZSAqZHQsIGNvbnN0IHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsKKworLyohIEZTRV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlKCk6CisJRGVjb21wcmVzcyBjb21wcmVzc2VkIHNvdXJjZSBgY1NyY2Agb2Ygc2l6ZSBgY1NyY1NpemVgIHVzaW5nIGBkdGAKKwlpbnRvIGBkc3RgIHdoaWNoIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQuCisJQHJldHVybiA6IHNpemUgb2YgcmVnZW5lcmF0ZWQgZGF0YSAobmVjZXNzYXJpbHkgPD0gYGRzdENhcGFjaXR5YCksCisJCQkgIG9yIGFuIGVycm9yQ29kZSwgd2hpY2ggY2FuIGJlIHRlc3RlZCB1c2luZyBGU0VfaXNFcnJvcigpICovCitGU0VfUFVCTElDX0FQSSBzaXplX3QgRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgRlNFX0RUYWJsZSAqZHQpOworCisvKiEKK1R1dG9yaWFsIDoKKy0tLS0tLS0tLS0KKyhOb3RlIDogdGhlc2UgZnVuY3Rpb25zIG9ubHkgZGVjb21wcmVzcyBGU0UtY29tcHJlc3NlZCBibG9ja3MuCisgSWYgYmxvY2sgaXMgdW5jb21wcmVzc2VkLCB1c2UgbWVtY3B5KCkgaW5zdGVhZAorIElmIGJsb2NrIGlzIGEgc2luZ2xlIHJlcGVhdGVkIGJ5dGUsIHVzZSBtZW1zZXQoKSBpbnN0ZWFkICkKKworVGhlIGZpcnN0IHN0ZXAgaXMgdG8gb2J0YWluIHRoZSBub3JtYWxpemVkIGZyZXF1ZW5jaWVzIG9mIHN5bWJvbHMuCitUaGlzIGNhbiBiZSBwZXJmb3JtZWQgYnkgRlNFX3JlYWROQ291bnQoKSBpZiBpdCB3YXMgc2F2ZWQgdXNpbmcgRlNFX3dyaXRlTkNvdW50KCkuCisnbm9ybWFsaXplZENvdW50ZXInIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQsIGFuZCBoYXZlIGF0IGxlYXN0ICdtYXhTeW1ib2xWYWx1ZVB0clswXSsxJyBjZWxscyBvZiBzaWduZWQgc2hvcnQuCitJbiBwcmFjdGljZSwgdGhhdCBtZWFucyBpdCdzIG5lY2Vzc2FyeSB0byBrbm93ICdtYXhTeW1ib2xWYWx1ZScgYmVmb3JlaGFuZCwKK29yIHNpemUgdGhlIHRhYmxlIHRvIGhhbmRsZSB3b3JzdCBjYXNlIHNpdHVhdGlvbnMgKHR5cGljYWxseSAyNTYpLgorRlNFX3JlYWROQ291bnQoKSB3aWxsIHByb3ZpZGUgJ3RhYmxlTG9nJyBhbmQgJ21heFN5bWJvbFZhbHVlJy4KK1RoZSByZXN1bHQgb2YgRlNFX3JlYWROQ291bnQoKSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSAnckJ1ZmZlcicuCitOb3RlIHRoYXQgJ3JCdWZmZXJTaXplJyBtdXN0IGJlIGF0IGxlYXN0IDQgYnl0ZXMsIGV2ZW4gaWYgdXNlZnVsIGluZm9ybWF0aW9uIGlzIGxlc3MgdGhhbiB0aGF0LgorSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlcnJvciBjb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCkuCisKK1RoZSBuZXh0IHN0ZXAgaXMgdG8gYnVpbGQgdGhlIGRlY29tcHJlc3Npb24gdGFibGVzICdGU0VfRFRhYmxlJyBmcm9tICdub3JtYWxpemVkQ291bnRlcicuCitUaGlzIGlzIHBlcmZvcm1lZCBieSB0aGUgZnVuY3Rpb24gRlNFX2J1aWxkRFRhYmxlKCkuCitUaGUgc3BhY2UgcmVxdWlyZWQgYnkgJ0ZTRV9EVGFibGUnIG11c3QgYmUgYWxyZWFkeSBhbGxvY2F0ZWQgdXNpbmcgRlNFX2NyZWF0ZURUYWJsZSgpLgorSWYgdGhlcmUgaXMgYW4gZXJyb3IsIHRoZSBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBlcnJvciBjb2RlLCB3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCkuCisKK2BGU0VfRFRhYmxlYCBjYW4gdGhlbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgYGNTcmNgLCB3aXRoIEZTRV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlKCkuCitgY1NyY1NpemVgIG11c3QgYmUgc3RyaWN0bHkgY29ycmVjdCwgb3RoZXJ3aXNlIGRlY29tcHJlc3Npb24gd2lsbCBmYWlsLgorRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGUoKSByZXN1bHQgd2lsbCB0ZWxsIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVnZW5lcmF0ZWQgKDw9YGRzdENhcGFjaXR5YCkuCitJZiB0aGVyZSBpcyBhbiBlcnJvciwgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yIGNvZGUsIHdoaWNoIGNhbiBiZSB0ZXN0ZWQgdXNpbmcgRlNFX2lzRXJyb3IoKS4gKGV4OiBkc3QgYnVmZmVyIHRvbyBzbWFsbCkKKyovCisKKy8qICoqKiBEZXBlbmRlbmN5ICoqKiAqLworI2luY2x1ZGUgImJpdHN0cmVhbS5oIgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU3RhdGljIGFsbG9jYXRpb24KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGU0UgYnVmZmVyIGJvdW5kcyAqLworI2RlZmluZSBGU0VfTkNPVU5UQk9VTkQgNTEyCisjZGVmaW5lIEZTRV9CTE9DS0JPVU5EKHNpemUpIChzaXplICsgKHNpemUgPj4gNykpCisjZGVmaW5lIEZTRV9DT01QUkVTU0JPVU5EKHNpemUpIChGU0VfTkNPVU5UQk9VTkQgKyBGU0VfQkxPQ0tCT1VORChzaXplKSkgLyogTWFjcm8gdmVyc2lvbiwgdXNlZnVsIGZvciBzdGF0aWMgYWxsb2NhdGlvbiAqLworCisvKiBJdCBpcyBwb3NzaWJsZSB0byBzdGF0aWNhbGx5IGFsbG9jYXRlIEZTRSBDVGFibGUvRFRhYmxlIGFzIGEgdGFibGUgb2YgRlNFX0NUYWJsZS9GU0VfRFRhYmxlIHVzaW5nIGJlbG93IG1hY3JvcyAqLworI2RlZmluZSBGU0VfQ1RBQkxFX1NJWkVfVTMyKG1heFRhYmxlTG9nLCBtYXhTeW1ib2xWYWx1ZSkgKDEgKyAoMSA8PCAobWF4VGFibGVMb2cgLSAxKSkgKyAoKG1heFN5bWJvbFZhbHVlICsgMSkgKiAyKSkKKyNkZWZpbmUgRlNFX0RUQUJMRV9TSVpFX1UzMihtYXhUYWJsZUxvZykgKDEgKyAoMSA8PCBtYXhUYWJsZUxvZykpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBGU0UgYWR2YW5jZWQgQVBJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlNFX2NvdW50X3drc3AoKSA6CisgKiBTYW1lIGFzIEZTRV9jb3VudCgpLCBidXQgdXNpbmcgYW4gZXh0ZXJuYWxseSBwcm92aWRlZCBzY3JhdGNoIGJ1ZmZlci4KKyAqIGB3b3JrU3BhY2VgIHNpemUgbXVzdCBiZSB0YWJsZSBvZiA+PSBgMTAyNGAgdW5zaWduZWQKKyAqLworc2l6ZV90IEZTRV9jb3VudF93a3NwKHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgKm1heFN5bWJvbFZhbHVlUHRyLCBjb25zdCB2b2lkICpzb3VyY2UsIHNpemVfdCBzb3VyY2VTaXplLCB1bnNpZ25lZCAqd29ya1NwYWNlKTsKKworLyogRlNFX2NvdW50RmFzdF93a3NwKCkgOgorICogU2FtZSBhcyBGU0VfY291bnRGYXN0KCksIGJ1dCB1c2luZyBhbiBleHRlcm5hbGx5IHByb3ZpZGVkIHNjcmF0Y2ggYnVmZmVyLgorICogYHdvcmtTcGFjZWAgbXVzdCBiZSBhIHRhYmxlIG9mIG1pbmltdW0gYDEwMjRgIHVuc2lnbmVkCisgKi8KK3NpemVfdCBGU0VfY291bnRGYXN0X3drc3AodW5zaWduZWQgKmNvdW50LCB1bnNpZ25lZCAqbWF4U3ltYm9sVmFsdWVQdHIsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkICp3b3JrU3BhY2UpOworCisvKiEgRlNFX2NvdW50X3NpbXBsZQorICogU2FtZSBhcyBGU0VfY291bnRGYXN0KCksIGJ1dCBkb2VzIG5vdCB1c2UgYW55IGFkZGl0aW9uYWwgbWVtb3J5IChub3QgZXZlbiBvbiBzdGFjaykuCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVuc2FmZSwgYW5kIHdpbGwgc2VnZmF1bHQgaWYgYW55IHZhbHVlIHdpdGhpbiBgc3JjYCBpcyBgPiAqbWF4U3ltYm9sVmFsdWVQdHJgIChwcmVzdW1pbmcgaXQncyBhbHNvIHRoZSBzaXplIG9mIGBjb3VudGApLgorKi8KK3NpemVfdCBGU0VfY291bnRfc2ltcGxlKHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgKm1heFN5bWJvbFZhbHVlUHRyLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplKTsKKwordW5zaWduZWQgRlNFX29wdGltYWxUYWJsZUxvZ19pbnRlcm5hbCh1bnNpZ25lZCBtYXhUYWJsZUxvZywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCBtaW51cyk7CisvKio8IHNhbWUgYXMgRlNFX29wdGltYWxUYWJsZUxvZygpLCB3aGljaCB1c2VkIGBtaW51cz09MmAgKi8KKworc2l6ZV90IEZTRV9idWlsZENUYWJsZV9yYXcoRlNFX0NUYWJsZSAqY3QsIHVuc2lnbmVkIG5iQml0cyk7CisvKio8IGJ1aWxkIGEgZmFrZSBGU0VfQ1RhYmxlLCBkZXNpZ25lZCBmb3IgYSBmbGF0IGRpc3RyaWJ1dGlvbiwgd2hlcmUgZWFjaCBzeW1ib2wgdXNlcyBuYkJpdHMgKi8KKworc2l6ZV90IEZTRV9idWlsZENUYWJsZV9ybGUoRlNFX0NUYWJsZSAqY3QsIHVuc2lnbmVkIGNoYXIgc3ltYm9sVmFsdWUpOworLyoqPCBidWlsZCBhIGZha2UgRlNFX0NUYWJsZSwgZGVzaWduZWQgdG8gY29tcHJlc3MgYWx3YXlzIHRoZSBzYW1lIHN5bWJvbFZhbHVlICovCisKKy8qIEZTRV9idWlsZENUYWJsZV93a3NwKCkgOgorICogU2FtZSBhcyBGU0VfYnVpbGRDVGFibGUoKSwgYnV0IHVzaW5nIGFuIGV4dGVybmFsbHkgYWxsb2NhdGVkIHNjcmF0Y2ggYnVmZmVyIChgd29ya1NwYWNlYCkuCisgKiBgd2tzcFNpemVgIG11c3QgYmUgPj0gYCgxPDx0YWJsZUxvZylgLgorICovCitzaXplX3QgRlNFX2J1aWxkQ1RhYmxlX3drc3AoRlNFX0NUYWJsZSAqY3QsIGNvbnN0IHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nLCB2b2lkICp3b3JrU3BhY2UsIHNpemVfdCB3a3NwU2l6ZSk7CisKK3NpemVfdCBGU0VfYnVpbGREVGFibGVfcmF3KEZTRV9EVGFibGUgKmR0LCB1bnNpZ25lZCBuYkJpdHMpOworLyoqPCBidWlsZCBhIGZha2UgRlNFX0RUYWJsZSwgZGVzaWduZWQgdG8gcmVhZCBhIGZsYXQgZGlzdHJpYnV0aW9uIHdoZXJlIGVhY2ggc3ltYm9sIHVzZXMgbmJCaXRzICovCisKK3NpemVfdCBGU0VfYnVpbGREVGFibGVfcmxlKEZTRV9EVGFibGUgKmR0LCB1bnNpZ25lZCBjaGFyIHN5bWJvbFZhbHVlKTsKKy8qKjwgYnVpbGQgYSBmYWtlIEZTRV9EVGFibGUsIGRlc2lnbmVkIHRvIGFsd2F5cyBnZW5lcmF0ZSB0aGUgc2FtZSBzeW1ib2xWYWx1ZSAqLworCitzaXplX3QgRlNFX2RlY29tcHJlc3Nfd2tzcCh2b2lkICpkc3QsIHNpemVfdCBkc3RDYXBhY2l0eSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB1bnNpZ25lZCBtYXhMb2csIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpOworLyoqPCBzYW1lIGFzIEZTRV9kZWNvbXByZXNzKCksIHVzaW5nIGFuIGV4dGVybmFsbHkgYWxsb2NhdGVkIGB3b3JrU3BhY2VgIHByb2R1Y2VkIHdpdGggYEZTRV9EVEFCTEVfU0laRV9VMzIobWF4TG9nKWAgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEZTRSBzeW1ib2wgY29tcHJlc3Npb24gQVBJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCisgICBUaGlzIEFQSSBjb25zaXN0cyBvZiBzbWFsbCB1bml0YXJ5IGZ1bmN0aW9ucywgd2hpY2ggaGlnaGx5IGJlbmVmaXQgZnJvbSBiZWluZyBpbmxpbmVkLgorICAgSGVuY2UgdGhlaXIgYm9keSBhcmUgaW5jbHVkZWQgaW4gbmV4dCBzZWN0aW9uLgorKi8KK3R5cGVkZWYgc3RydWN0IHsKKwlwdHJkaWZmX3QgdmFsdWU7CisJY29uc3Qgdm9pZCAqc3RhdGVUYWJsZTsKKwljb25zdCB2b2lkICpzeW1ib2xUVDsKKwl1bnNpZ25lZCBzdGF0ZUxvZzsKK30gRlNFX0NTdGF0ZV90OworCitzdGF0aWMgdm9pZCBGU0VfaW5pdENTdGF0ZShGU0VfQ1N0YXRlX3QgKkNTdGF0ZVB0ciwgY29uc3QgRlNFX0NUYWJsZSAqY3QpOworCitzdGF0aWMgdm9pZCBGU0VfZW5jb2RlU3ltYm9sKEJJVF9DU3RyZWFtX3QgKmJpdEMsIEZTRV9DU3RhdGVfdCAqQ1N0YXRlUHRyLCB1bnNpZ25lZCBzeW1ib2wpOworCitzdGF0aWMgdm9pZCBGU0VfZmx1c2hDU3RhdGUoQklUX0NTdHJlYW1fdCAqYml0QywgY29uc3QgRlNFX0NTdGF0ZV90ICpDU3RhdGVQdHIpOworCisvKio8CitUaGVzZSBmdW5jdGlvbnMgYXJlIGlubmVyIGNvbXBvbmVudHMgb2YgRlNFX2NvbXByZXNzX3VzaW5nQ1RhYmxlKCkuCitUaGV5IGFsbG93IHRoZSBjcmVhdGlvbiBvZiBjdXN0b20gc3RyZWFtcywgbWl4aW5nIG11bHRpcGxlIHRhYmxlcyBhbmQgYml0IHNvdXJjZXMuCisKK0Ega2V5IHByb3BlcnR5IHRvIGtlZXAgaW4gbWluZCBpcyB0aGF0IGVuY29kaW5nIGFuZCBkZWNvZGluZyBhcmUgZG9uZSAqKmluIHJldmVyc2UgZGlyZWN0aW9uKiouCitTbyB0aGUgZmlyc3Qgc3ltYm9sIHlvdSB3aWxsIGVuY29kZSBpcyB0aGUgbGFzdCB5b3Ugd2lsbCBkZWNvZGUsIGxpa2UgYSBMSUZPIHN0YWNrLgorCitZb3Ugd2lsbCBuZWVkIGEgZmV3IHZhcmlhYmxlcyB0byB0cmFjayB5b3VyIENTdHJlYW0uIFRoZXkgYXJlIDoKKworRlNFX0NUYWJsZSAgICBjdDsgICAgICAgICAvLyBQcm92aWRlZCBieSBGU0VfYnVpbGRDVGFibGUoKQorQklUX0NTdHJlYW1fdCBiaXRTdHJlYW07ICAvLyBiaXRTdHJlYW0gdHJhY2tpbmcgc3RydWN0dXJlCitGU0VfQ1N0YXRlX3QgIHN0YXRlOyAgICAgIC8vIFN0YXRlIHRyYWNraW5nIHN0cnVjdHVyZSAoY2FuIGhhdmUgc2V2ZXJhbCkKKworCitUaGUgZmlyc3QgdGhpbmcgdG8gZG8gaXMgdG8gaW5pdCBiaXRTdHJlYW0gYW5kIHN0YXRlLgorCXNpemVfdCBlcnJvckNvZGUgPSBCSVRfaW5pdENTdHJlYW0oJmJpdFN0cmVhbSwgZHN0QnVmZmVyLCBtYXhEc3RTaXplKTsKKwlGU0VfaW5pdENTdGF0ZSgmc3RhdGUsIGN0KTsKKworTm90ZSB0aGF0IEJJVF9pbml0Q1N0cmVhbSgpIGNhbiBwcm9kdWNlIGFuIGVycm9yIGNvZGUsIHNvIGl0cyByZXN1bHQgc2hvdWxkIGJlIHRlc3RlZCwgdXNpbmcgRlNFX2lzRXJyb3IoKTsKK1lvdSBjYW4gdGhlbiBlbmNvZGUgeW91ciBpbnB1dCBkYXRhLCBieXRlIGFmdGVyIGJ5dGUuCitGU0VfZW5jb2RlU3ltYm9sKCkgb3V0cHV0cyBhIG1heGltdW0gb2YgJ3RhYmxlTG9nJyBiaXRzIGF0IGEgdGltZS4KK1JlbWVtYmVyIGRlY29kaW5nIHdpbGwgYmUgZG9uZSBpbiByZXZlcnNlIGRpcmVjdGlvbi4KKwlGU0VfZW5jb2RlQnl0ZSgmYml0U3RyZWFtLCAmc3RhdGUsIHN5bWJvbCk7CisKK0F0IGFueSB0aW1lLCB5b3UgY2FuIGFsc28gYWRkIGFueSBiaXQgc2VxdWVuY2UuCitOb3RlIDogbWF4aW11bSBhbGxvd2VkIG5iQml0cyBpcyAyNSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAzMi1iaXRzIGRlY29kZXJzCisJQklUX2FkZEJpdHMoJmJpdFN0cmVhbSwgYml0RmllbGQsIG5iQml0cyk7CisKK1RoZSBhYm92ZSBtZXRob2RzIGRvbid0IGNvbW1pdCBkYXRhIHRvIG1lbW9yeSwgdGhleSBqdXN0IHN0b3JlIGl0IGludG8gbG9jYWwgcmVnaXN0ZXIsIGZvciBzcGVlZC4KK0xvY2FsIHJlZ2lzdGVyIHNpemUgaXMgNjQtYml0cyBvbiA2NC1iaXRzIHN5c3RlbXMsIDMyLWJpdHMgb24gMzItYml0cyBzeXN0ZW1zIChzaXplX3QpLgorV3JpdGluZyBkYXRhIHRvIG1lbW9yeSBpcyBhIG1hbnVhbCBvcGVyYXRpb24sIHBlcmZvcm1lZCBieSB0aGUgZmx1c2hCaXRzIGZ1bmN0aW9uLgorCUJJVF9mbHVzaEJpdHMoJmJpdFN0cmVhbSk7CisKK1lvdXIgbGFzdCBGU0UgZW5jb2Rpbmcgb3BlcmF0aW9uIHNoYWxsIGJlIHRvIGZsdXNoIHlvdXIgbGFzdCBzdGF0ZSB2YWx1ZShzKS4KKwlGU0VfZmx1c2hTdGF0ZSgmYml0U3RyZWFtLCAmc3RhdGUpOworCitGaW5hbGx5LCB5b3UgbXVzdCBjbG9zZSB0aGUgYml0U3RyZWFtLgorVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNpemUgb2YgQ1N0cmVhbSBpbiBieXRlcy4KK0lmIGRhdGEgY291bGRuJ3QgZml0IGludG8gZHN0QnVmZmVyLCBpdCB3aWxsIHJldHVybiBhIDAgKCA9PSBub3QgY29tcHJlc3NpYmxlKQorSWYgdGhlcmUgaXMgYW4gZXJyb3IsIGl0IHJldHVybnMgYW4gZXJyb3JDb2RlICh3aGljaCBjYW4gYmUgdGVzdGVkIHVzaW5nIEZTRV9pc0Vycm9yKCkpLgorCXNpemVfdCBzaXplID0gQklUX2Nsb3NlQ1N0cmVhbSgmYml0U3RyZWFtKTsKKyovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBGU0Ugc3ltYm9sIGRlY29tcHJlc3Npb24gQVBJCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCXNpemVfdCBzdGF0ZTsKKwljb25zdCB2b2lkICp0YWJsZTsgLyogcHJlY2lzZSB0YWJsZSBtYXkgdmFyeSwgZGVwZW5kaW5nIG9uIFUxNiAqLworfSBGU0VfRFN0YXRlX3Q7CisKK3N0YXRpYyB2b2lkIEZTRV9pbml0RFN0YXRlKEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRyLCBCSVRfRFN0cmVhbV90ICpiaXRELCBjb25zdCBGU0VfRFRhYmxlICpkdCk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEZTRV9kZWNvZGVTeW1ib2woRlNFX0RTdGF0ZV90ICpEU3RhdGVQdHIsIEJJVF9EU3RyZWFtX3QgKmJpdEQpOworCitzdGF0aWMgdW5zaWduZWQgRlNFX2VuZE9mRFN0YXRlKGNvbnN0IEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRyKTsKKworLyoqPAorTGV0J3Mgbm93IGRlY29tcG9zZSBGU0VfZGVjb21wcmVzc191c2luZ0RUYWJsZSgpIGludG8gaXRzIHVuaXRhcnkgY29tcG9uZW50cy4KK1lvdSB3aWxsIGRlY29kZSBGU0UtZW5jb2RlZCBzeW1ib2xzIGZyb20gdGhlIGJpdFN0cmVhbSwKK2FuZCBhbHNvIGFueSBvdGhlciBiaXRGaWVsZHMgeW91IHB1dCBpbiwgKippbiByZXZlcnNlIG9yZGVyKiouCisKK1lvdSB3aWxsIG5lZWQgYSBmZXcgdmFyaWFibGVzIHRvIHRyYWNrIHlvdXIgYml0U3RyZWFtLiBUaGV5IGFyZSA6CisKK0JJVF9EU3RyZWFtX3QgRFN0cmVhbTsgICAgLy8gU3RyZWFtIGNvbnRleHQKK0ZTRV9EU3RhdGVfdCAgRFN0YXRlOyAgICAgLy8gU3RhdGUgY29udGV4dC4gTXVsdGlwbGUgb25lcyBhcmUgcG9zc2libGUKK0ZTRV9EVGFibGUqICAgRFRhYmxlUHRyOyAgLy8gRGVjb2RpbmcgdGFibGUsIHByb3ZpZGVkIGJ5IEZTRV9idWlsZERUYWJsZSgpCisKK1RoZSBmaXJzdCB0aGluZyB0byBkbyBpcyB0byBpbml0IHRoZSBiaXRTdHJlYW0uCisJZXJyb3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZEU3RyZWFtLCBzcmNCdWZmZXIsIHNyY1NpemUpOworCitZb3Ugc2hvdWxkIHRoZW4gcmV0cmlldmUgeW91ciBpbml0aWFsIHN0YXRlKHMpCisoaW4gcmV2ZXJzZSBmbHVzaGluZyBvcmRlciBpZiB5b3UgaGF2ZSBzZXZlcmFsIG9uZXMpIDoKKwllcnJvckNvZGUgPSBGU0VfaW5pdERTdGF0ZSgmRFN0YXRlLCAmRFN0cmVhbSwgRFRhYmxlUHRyKTsKKworWW91IGNhbiB0aGVuIGRlY29kZSB5b3VyIGRhdGEsIHN5bWJvbCBhZnRlciBzeW1ib2wuCitGb3IgaW5mb3JtYXRpb24gdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgcmVhZCBieSBGU0VfZGVjb2RlU3ltYm9sKCkgaXMgJ3RhYmxlTG9nJy4KK0tlZXAgaW4gbWluZCB0aGF0IHN5bWJvbHMgYXJlIGRlY29kZWQgaW4gcmV2ZXJzZSBvcmRlciwgbGlrZSBhIExJRk8gc3RhY2sgKGxhc3QgaW4sIGZpcnN0IG91dCkuCisJdW5zaWduZWQgY2hhciBzeW1ib2wgPSBGU0VfZGVjb2RlU3ltYm9sKCZEU3RhdGUsICZEU3RyZWFtKTsKKworWW91IGNhbiByZXRyaWV2ZSBhbnkgYml0ZmllbGQgeW91IGV2ZW50dWFsbHkgc3RvcmVkIGludG8gdGhlIGJpdFN0cmVhbSAoaW4gcmV2ZXJzZSBvcmRlcikKK05vdGUgOiBtYXhpbXVtIGFsbG93ZWQgbmJCaXRzIGlzIDI1LCBmb3IgMzItYml0cyBjb21wYXRpYmlsaXR5CisJc2l6ZV90IGJpdEZpZWxkID0gQklUX3JlYWRCaXRzKCZEU3RyZWFtLCBuYkJpdHMpOworCitBbGwgYWJvdmUgb3BlcmF0aW9ucyBvbmx5IHJlYWQgZnJvbSBsb2NhbCByZWdpc3RlciAod2hpY2ggc2l6ZSBkZXBlbmRzIG9uIHNpemVfdCkuCitSZWZ1ZWxpbmcgdGhlIHJlZ2lzdGVyIGZyb20gbWVtb3J5IGlzIG1hbnVhbGx5IHBlcmZvcm1lZCBieSB0aGUgcmVsb2FkIG1ldGhvZC4KKwllbmRTaWduYWwgPSBGU0VfcmVsb2FkRFN0cmVhbSgmRFN0cmVhbSk7CisKK0JJVF9yZWxvYWREU3RyZWFtKCkgcmVzdWx0IHRlbGxzIGlmIHRoZXJlIGlzIHN0aWxsIHNvbWUgbW9yZSBkYXRhIHRvIHJlYWQgZnJvbSBEU3RyZWFtLgorQklUX0RTdHJlYW1fdW5maW5pc2hlZCA6IHRoZXJlIGlzIHN0aWxsIHNvbWUgZGF0YSBsZWZ0IGludG8gdGhlIERTdHJlYW0uCitCSVRfRFN0cmVhbV9lbmRPZkJ1ZmZlciA6IERzdHJlYW0gcmVhY2hlZCBlbmQgb2YgYnVmZmVyLiBJdHMgY29udGFpbmVyIG1heSBubyBsb25nZXIgYmUgY29tcGxldGVseSBmaWxsZWQuCitCSVRfRFN0cmVhbV9jb21wbGV0ZWQgOiBEc3RyZWFtIHJlYWNoZWQgaXRzIGV4YWN0IGVuZCwgY29ycmVzcG9uZGluZyBpbiBnZW5lcmFsIHRvIGRlY29tcHJlc3Npb24gY29tcGxldGVkLgorQklUX0RTdHJlYW1fdG9vRmFyIDogRHN0cmVhbSB3ZW50IHRvbyBmYXIuIERlY29tcHJlc3Npb24gcmVzdWx0IGlzIGNvcnJ1cHRlZC4KKworV2hlbiByZWFjaGluZyBlbmQgb2YgYnVmZmVyIChCSVRfRFN0cmVhbV9lbmRPZkJ1ZmZlciksIHByb2dyZXNzIHNsb3dseSwgbm90YWJseSBpZiB5b3UgZGVjb2RlIG11bHRpcGxlIHN5bWJvbHMgcGVyIGxvb3AsCit0byBwcm9wZXJseSBkZXRlY3QgdGhlIGV4YWN0IGVuZCBvZiBzdHJlYW0uCitBZnRlciBlYWNoIGRlY29kZWQgc3ltYm9sLCBjaGVjayBpZiBEU3RyZWFtIGlzIGZ1bGx5IGNvbnN1bWVkIHVzaW5nIHRoaXMgc2ltcGxlIHRlc3QgOgorCUJJVF9yZWxvYWREU3RyZWFtKCZEU3RyZWFtKSA+PSBCSVRfRFN0cmVhbV9jb21wbGV0ZWQKKworV2hlbiBpdCdzIGRvbmUsIHZlcmlmeSBkZWNvbXByZXNzaW9uIGlzIGZ1bGx5IGNvbXBsZXRlZCwgYnkgY2hlY2tpbmcgYm90aCBEU3RyZWFtIGFuZCB0aGUgcmVsZXZhbnQgc3RhdGVzLgorQ2hlY2tpbmcgaWYgRFN0cmVhbSBoYXMgcmVhY2hlZCBpdHMgZW5kIGlzIHBlcmZvcm1lZCBieSA6CisJQklUX2VuZE9mRFN0cmVhbSgmRFN0cmVhbSk7CitDaGVjayBhbHNvIHRoZSBzdGF0ZXMuIFRoZXJlIG1pZ2h0IGJlIHNvbWUgc3ltYm9scyBsZWZ0IHRoZXJlLCBpZiBzb21lIGhpZ2ggcHJvYmFiaWxpdHkgb25lcyAoPjUwJSkgYXJlIHBvc3NpYmxlLgorCUZTRV9lbmRPZkRTdGF0ZSgmRFN0YXRlKTsKKyovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBGU0UgdW5zYWZlIEFQSQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIEZTRV9kZWNvZGVTeW1ib2xGYXN0KEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRyLCBCSVRfRFN0cmVhbV90ICpiaXREKTsKKy8qIGZhc3RlciwgYnV0IHdvcmtzIG9ubHkgaWYgbmJCaXRzIGlzIGFsd2F5cyA+PSAxIChvdGhlcndpc2UsIHJlc3VsdCB3aWxsIGJlIGNvcnJ1cHRlZCkgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEltcGxlbWVudGF0aW9uIG9mIGlubGluZWQgZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBkZWx0YUZpbmRTdGF0ZTsKKwlVMzIgZGVsdGFOYkJpdHM7Cit9IEZTRV9zeW1ib2xDb21wcmVzc2lvblRyYW5zZm9ybTsgLyogdG90YWwgOCBieXRlcyAqLworCitaU1REX1NUQVRJQyB2b2lkIEZTRV9pbml0Q1N0YXRlKEZTRV9DU3RhdGVfdCAqc3RhdGVQdHIsIGNvbnN0IEZTRV9DVGFibGUgKmN0KQoreworCWNvbnN0IHZvaWQgKnB0ciA9IGN0OworCWNvbnN0IFUxNiAqdTE2cHRyID0gKGNvbnN0IFUxNiAqKXB0cjsKKwljb25zdCBVMzIgdGFibGVMb2cgPSBaU1REX3JlYWQxNihwdHIpOworCXN0YXRlUHRyLT52YWx1ZSA9IChwdHJkaWZmX3QpMSA8PCB0YWJsZUxvZzsKKwlzdGF0ZVB0ci0+c3RhdGVUYWJsZSA9IHUxNnB0ciArIDI7CisJc3RhdGVQdHItPnN5bWJvbFRUID0gKChjb25zdCBVMzIgKiljdCArIDEgKyAodGFibGVMb2cgPyAoMSA8PCAodGFibGVMb2cgLSAxKSkgOiAxKSk7CisJc3RhdGVQdHItPnN0YXRlTG9nID0gdGFibGVMb2c7Cit9CisKKy8qISBGU0VfaW5pdENTdGF0ZTIoKSA6CisqICAgU2FtZSBhcyBGU0VfaW5pdENTdGF0ZSgpLCBidXQgdGhlIGZpcnN0IHN5bWJvbCB0byBpbmNsdWRlICh3aGljaCB3aWxsIGJlIHRoZSBsYXN0IHRvIGJlIHJlYWQpCisqICAgdXNlcyB0aGUgc21hbGxlc3Qgc3RhdGUgdmFsdWUgcG9zc2libGUsIHNhdmluZyB0aGUgY29zdCBvZiB0aGlzIHN5bWJvbCAqLworWlNURF9TVEFUSUMgdm9pZCBGU0VfaW5pdENTdGF0ZTIoRlNFX0NTdGF0ZV90ICpzdGF0ZVB0ciwgY29uc3QgRlNFX0NUYWJsZSAqY3QsIFUzMiBzeW1ib2wpCit7CisJRlNFX2luaXRDU3RhdGUoc3RhdGVQdHIsIGN0KTsKKwl7CisJCWNvbnN0IEZTRV9zeW1ib2xDb21wcmVzc2lvblRyYW5zZm9ybSBzeW1ib2xUVCA9ICgoY29uc3QgRlNFX3N5bWJvbENvbXByZXNzaW9uVHJhbnNmb3JtICopKHN0YXRlUHRyLT5zeW1ib2xUVCkpW3N5bWJvbF07CisJCWNvbnN0IFUxNiAqc3RhdGVUYWJsZSA9IChjb25zdCBVMTYgKikoc3RhdGVQdHItPnN0YXRlVGFibGUpOworCQlVMzIgbmJCaXRzT3V0ID0gKFUzMikoKHN5bWJvbFRULmRlbHRhTmJCaXRzICsgKDEgPDwgMTUpKSA+PiAxNik7CisJCXN0YXRlUHRyLT52YWx1ZSA9IChuYkJpdHNPdXQgPDwgMTYpIC0gc3ltYm9sVFQuZGVsdGFOYkJpdHM7CisJCXN0YXRlUHRyLT52YWx1ZSA9IHN0YXRlVGFibGVbKHN0YXRlUHRyLT52YWx1ZSA+PiBuYkJpdHNPdXQpICsgc3ltYm9sVFQuZGVsdGFGaW5kU3RhdGVdOworCX0KK30KKworWlNURF9TVEFUSUMgdm9pZCBGU0VfZW5jb2RlU3ltYm9sKEJJVF9DU3RyZWFtX3QgKmJpdEMsIEZTRV9DU3RhdGVfdCAqc3RhdGVQdHIsIFUzMiBzeW1ib2wpCit7CisJY29uc3QgRlNFX3N5bWJvbENvbXByZXNzaW9uVHJhbnNmb3JtIHN5bWJvbFRUID0gKChjb25zdCBGU0Vfc3ltYm9sQ29tcHJlc3Npb25UcmFuc2Zvcm0gKikoc3RhdGVQdHItPnN5bWJvbFRUKSlbc3ltYm9sXTsKKwljb25zdCBVMTYgKmNvbnN0IHN0YXRlVGFibGUgPSAoY29uc3QgVTE2ICopKHN0YXRlUHRyLT5zdGF0ZVRhYmxlKTsKKwlVMzIgbmJCaXRzT3V0ID0gKFUzMikoKHN0YXRlUHRyLT52YWx1ZSArIHN5bWJvbFRULmRlbHRhTmJCaXRzKSA+PiAxNik7CisJQklUX2FkZEJpdHMoYml0Qywgc3RhdGVQdHItPnZhbHVlLCBuYkJpdHNPdXQpOworCXN0YXRlUHRyLT52YWx1ZSA9IHN0YXRlVGFibGVbKHN0YXRlUHRyLT52YWx1ZSA+PiBuYkJpdHNPdXQpICsgc3ltYm9sVFQuZGVsdGFGaW5kU3RhdGVdOworfQorCitaU1REX1NUQVRJQyB2b2lkIEZTRV9mbHVzaENTdGF0ZShCSVRfQ1N0cmVhbV90ICpiaXRDLCBjb25zdCBGU0VfQ1N0YXRlX3QgKnN0YXRlUHRyKQoreworCUJJVF9hZGRCaXRzKGJpdEMsIHN0YXRlUHRyLT52YWx1ZSwgc3RhdGVQdHItPnN0YXRlTG9nKTsKKwlCSVRfZmx1c2hCaXRzKGJpdEMpOworfQorCisvKiA9PT09PT0gICAgRGVjb21wcmVzc2lvbiAgICA9PT09PT0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCVUxNiB0YWJsZUxvZzsKKwlVMTYgZmFzdE1vZGU7Cit9IEZTRV9EVGFibGVIZWFkZXI7IC8qIHNpemVvZiBVMzIgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IG5ld1N0YXRlOworCXVuc2lnbmVkIGNoYXIgc3ltYm9sOworCXVuc2lnbmVkIGNoYXIgbmJCaXRzOworfSBGU0VfZGVjb2RlX3Q7IC8qIHNpemUgPT0gVTMyICovCisKK1pTVERfU1RBVElDIHZvaWQgRlNFX2luaXREU3RhdGUoRlNFX0RTdGF0ZV90ICpEU3RhdGVQdHIsIEJJVF9EU3RyZWFtX3QgKmJpdEQsIGNvbnN0IEZTRV9EVGFibGUgKmR0KQoreworCWNvbnN0IHZvaWQgKnB0ciA9IGR0OworCWNvbnN0IEZTRV9EVGFibGVIZWFkZXIgKmNvbnN0IERUYWJsZUggPSAoY29uc3QgRlNFX0RUYWJsZUhlYWRlciAqKXB0cjsKKwlEU3RhdGVQdHItPnN0YXRlID0gQklUX3JlYWRCaXRzKGJpdEQsIERUYWJsZUgtPnRhYmxlTG9nKTsKKwlCSVRfcmVsb2FkRFN0cmVhbShiaXREKTsKKwlEU3RhdGVQdHItPnRhYmxlID0gZHQgKyAxOworfQorCitaU1REX1NUQVRJQyBCWVRFIEZTRV9wZWVrU3ltYm9sKGNvbnN0IEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRyKQoreworCUZTRV9kZWNvZGVfdCBjb25zdCBESW5mbyA9ICgoY29uc3QgRlNFX2RlY29kZV90ICopKERTdGF0ZVB0ci0+dGFibGUpKVtEU3RhdGVQdHItPnN0YXRlXTsKKwlyZXR1cm4gREluZm8uc3ltYm9sOworfQorCitaU1REX1NUQVRJQyB2b2lkIEZTRV91cGRhdGVTdGF0ZShGU0VfRFN0YXRlX3QgKkRTdGF0ZVB0ciwgQklUX0RTdHJlYW1fdCAqYml0RCkKK3sKKwlGU0VfZGVjb2RlX3QgY29uc3QgREluZm8gPSAoKGNvbnN0IEZTRV9kZWNvZGVfdCAqKShEU3RhdGVQdHItPnRhYmxlKSlbRFN0YXRlUHRyLT5zdGF0ZV07CisJVTMyIGNvbnN0IG5iQml0cyA9IERJbmZvLm5iQml0czsKKwlzaXplX3QgY29uc3QgbG93Qml0cyA9IEJJVF9yZWFkQml0cyhiaXRELCBuYkJpdHMpOworCURTdGF0ZVB0ci0+c3RhdGUgPSBESW5mby5uZXdTdGF0ZSArIGxvd0JpdHM7Cit9CisKK1pTVERfU1RBVElDIEJZVEUgRlNFX2RlY29kZVN5bWJvbChGU0VfRFN0YXRlX3QgKkRTdGF0ZVB0ciwgQklUX0RTdHJlYW1fdCAqYml0RCkKK3sKKwlGU0VfZGVjb2RlX3QgY29uc3QgREluZm8gPSAoKGNvbnN0IEZTRV9kZWNvZGVfdCAqKShEU3RhdGVQdHItPnRhYmxlKSlbRFN0YXRlUHRyLT5zdGF0ZV07CisJVTMyIGNvbnN0IG5iQml0cyA9IERJbmZvLm5iQml0czsKKwlCWVRFIGNvbnN0IHN5bWJvbCA9IERJbmZvLnN5bWJvbDsKKwlzaXplX3QgY29uc3QgbG93Qml0cyA9IEJJVF9yZWFkQml0cyhiaXRELCBuYkJpdHMpOworCisJRFN0YXRlUHRyLT5zdGF0ZSA9IERJbmZvLm5ld1N0YXRlICsgbG93Qml0czsKKwlyZXR1cm4gc3ltYm9sOworfQorCisvKiEgRlNFX2RlY29kZVN5bWJvbEZhc3QoKSA6CisJdW5zYWZlLCBvbmx5IHdvcmtzIGlmIG5vIHN5bWJvbCBoYXMgYSBwcm9iYWJpbGl0eSA+IDUwJSAqLworWlNURF9TVEFUSUMgQllURSBGU0VfZGVjb2RlU3ltYm9sRmFzdChGU0VfRFN0YXRlX3QgKkRTdGF0ZVB0ciwgQklUX0RTdHJlYW1fdCAqYml0RCkKK3sKKwlGU0VfZGVjb2RlX3QgY29uc3QgREluZm8gPSAoKGNvbnN0IEZTRV9kZWNvZGVfdCAqKShEU3RhdGVQdHItPnRhYmxlKSlbRFN0YXRlUHRyLT5zdGF0ZV07CisJVTMyIGNvbnN0IG5iQml0cyA9IERJbmZvLm5iQml0czsKKwlCWVRFIGNvbnN0IHN5bWJvbCA9IERJbmZvLnN5bWJvbDsKKwlzaXplX3QgY29uc3QgbG93Qml0cyA9IEJJVF9yZWFkQml0c0Zhc3QoYml0RCwgbmJCaXRzKTsKKworCURTdGF0ZVB0ci0+c3RhdGUgPSBESW5mby5uZXdTdGF0ZSArIGxvd0JpdHM7CisJcmV0dXJuIHN5bWJvbDsKK30KKworWlNURF9TVEFUSUMgdW5zaWduZWQgRlNFX2VuZE9mRFN0YXRlKGNvbnN0IEZTRV9EU3RhdGVfdCAqRFN0YXRlUHRyKSB7IHJldHVybiBEU3RhdGVQdHItPnN0YXRlID09IDA7IH0KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFR1bmluZyBwYXJhbWV0ZXJzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohTUVNT1JZX1VTQUdFIDoKKyogIE1lbW9yeSB1c2FnZSBmb3JtdWxhIDogTi0+Ml5OIEJ5dGVzIChleGFtcGxlcyA6IDEwIC0+IDFLQjsgMTIgLT4gNEtCIDsgMTYgLT4gNjRLQjsgMjAgLT4gMU1COyBldGMuKQorKiAgSW5jcmVhc2luZyBtZW1vcnkgdXNhZ2UgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8KKyogIFJlZHVjZWQgbWVtb3J5IHVzYWdlIGNhbiBpbXByb3ZlIHNwZWVkLCBkdWUgdG8gY2FjaGUgZWZmZWN0CisqICBSZWNvbW1lbmRlZCBtYXggdmFsdWUgaXMgMTQsIGZvciAxNktCLCB3aGljaCBuaWNlbHkgZml0cyBpbnRvIEludGVsIHg4NiBMMSBjYWNoZSAqLworI2lmbmRlZiBGU0VfTUFYX01FTU9SWV9VU0FHRQorI2RlZmluZSBGU0VfTUFYX01FTU9SWV9VU0FHRSAxNAorI2VuZGlmCisjaWZuZGVmIEZTRV9ERUZBVUxUX01FTU9SWV9VU0FHRQorI2RlZmluZSBGU0VfREVGQVVMVF9NRU1PUllfVVNBR0UgMTMKKyNlbmRpZgorCisvKiFGU0VfTUFYX1NZTUJPTF9WQUxVRSA6CisqICBNYXhpbXVtIHN5bWJvbCB2YWx1ZSBhdXRob3JpemVkLgorKiAgUmVxdWlyZWQgZm9yIHByb3BlciBzdGFjayBhbGxvY2F0aW9uICovCisjaWZuZGVmIEZTRV9NQVhfU1lNQk9MX1ZBTFVFCisjZGVmaW5lIEZTRV9NQVhfU1lNQk9MX1ZBTFVFIDI1NQorI2VuZGlmCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICB0ZW1wbGF0ZSBmdW5jdGlvbnMgdHlwZSAmIHN1ZmZpeAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRlNFX0ZVTkNUSU9OX1RZUEUgQllURQorI2RlZmluZSBGU0VfRlVOQ1RJT05fRVhURU5TSU9OCisjZGVmaW5lIEZTRV9ERUNPREVfVFlQRSBGU0VfZGVjb2RlX3QKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBDb25zdGFudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGU0VfTUFYX1RBQkxFTE9HIChGU0VfTUFYX01FTU9SWV9VU0FHRSAtIDIpCisjZGVmaW5lIEZTRV9NQVhfVEFCTEVTSVpFICgxVSA8PCBGU0VfTUFYX1RBQkxFTE9HKQorI2RlZmluZSBGU0VfTUFYVEFCTEVTSVpFX01BU0sgKEZTRV9NQVhfVEFCTEVTSVpFIC0gMSkKKyNkZWZpbmUgRlNFX0RFRkFVTFRfVEFCTEVMT0cgKEZTRV9ERUZBVUxUX01FTU9SWV9VU0FHRSAtIDIpCisjZGVmaW5lIEZTRV9NSU5fVEFCTEVMT0cgNQorCisjZGVmaW5lIEZTRV9UQUJMRUxPR19BQlNPTFVURV9NQVggMTUKKyNpZiBGU0VfTUFYX1RBQkxFTE9HID4gRlNFX1RBQkxFTE9HX0FCU09MVVRFX01BWAorI2Vycm9yICJGU0VfTUFYX1RBQkxFTE9HID4gRlNFX1RBQkxFTE9HX0FCU09MVVRFX01BWCBpcyBub3Qgc3VwcG9ydGVkIgorI2VuZGlmCisKKyNkZWZpbmUgRlNFX1RBQkxFU1RFUCh0YWJsZVNpemUpICgodGFibGVTaXplID4+IDEpICsgKHRhYmxlU2l6ZSA+PiAzKSArIDMpCisKKyNlbmRpZiAvKiBGU0VfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9mc2VfY29tcHJlc3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZnNlX2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzZDE3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZnNlX2NvbXByZXNzLmMKQEAgLTAsMCArMSw3OTUgQEAKKy8qCisgKiBGU0UgOiBGaW5pdGUgU3RhdGUgRW50cm9weSBlbmNvZGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNSwgWWFubiBDb2xsZXQuCisgKgorICogQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKiAtIFNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL0N5YW40OTczL0Zpbml0ZVN0YXRlRW50cm9weQorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBDb21waWxlciBzcGVjaWZpY3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZPUkNFX0lOTElORSBzdGF0aWMgX19hbHdheXNfaW5saW5lCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJbmNsdWRlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJmc2UuaCIKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1jcHksIG1lbXNldCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXJyb3IgTWFuYWdlbWVudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRlNFX1NUQVRJQ19BU1NFUlQoYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQllbnVtIHsgRlNFX3N0YXRpY19hc3NlcnQgPSAxIC8gKGludCkoISEoYykpIH07IFwKKwl9IC8qIHVzZSBvbmx5ICphZnRlciogdmFyaWFibGUgZGVjbGFyYXRpb25zICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBUZW1wbGF0ZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICBkZXNpZ25lZCB0byBiZSBpbmNsdWRlZAorICBmb3IgdHlwZS1zcGVjaWZpYyBmdW5jdGlvbnMgKHRlbXBsYXRlIGVtdWxhdGlvbiBpbiBDKQorICBPYmplY3RpdmUgaXMgdG8gd3JpdGUgdGhlc2UgZnVuY3Rpb25zIG9ubHkgb25jZSwgZm9yIGltcHJvdmVkIG1haW50ZW5hbmNlCisqLworCisvKiBzYWZldHkgY2hlY2tzICovCisjaWZuZGVmIEZTRV9GVU5DVElPTl9FWFRFTlNJT04KKyNlcnJvciAiRlNFX0ZVTkNUSU9OX0VYVEVOU0lPTiBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKyNpZm5kZWYgRlNFX0ZVTkNUSU9OX1RZUEUKKyNlcnJvciAiRlNFX0ZVTkNUSU9OX1RZUEUgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8qIEZ1bmN0aW9uIG5hbWVzICovCisjZGVmaW5lIEZTRV9DQVQoWCwgWSkgWCMjWQorI2RlZmluZSBGU0VfRlVOQ1RJT05fTkFNRShYLCBZKSBGU0VfQ0FUKFgsIFkpCisjZGVmaW5lIEZTRV9UWVBFX05BTUUoWCwgWSkgRlNFX0NBVChYLCBZKQorCisvKiBGdW5jdGlvbiB0ZW1wbGF0ZXMgKi8KKworLyogRlNFX2J1aWxkQ1RhYmxlX3drc3AoKSA6CisgKiBTYW1lIGFzIEZTRV9idWlsZENUYWJsZSgpLCBidXQgdXNpbmcgYW4gZXh0ZXJuYWxseSBhbGxvY2F0ZWQgc2NyYXRjaCBidWZmZXIgKGB3b3JrU3BhY2VgKS4KKyAqIHdrc3BTaXplIHNob3VsZCBiZSBzaXplZCB0byBoYW5kbGUgd29yc3QgY2FzZSBzaXR1YXRpb24sIHdoaWNoIGlzIGAxPDxtYXhfdGFibGVMb2cgKiBzaXplb2YoRlNFX0ZVTkNUSU9OX1RZUEUpYAorICogd29ya1NwYWNlIG11c3QgYWxzbyBiZSBwcm9wZXJseSBhbGlnbmVkIHdpdGggRlNFX0ZVTkNUSU9OX1RZUEUgcmVxdWlyZW1lbnRzCisgKi8KK3NpemVfdCBGU0VfYnVpbGRDVGFibGVfd2tzcChGU0VfQ1RhYmxlICpjdCwgY29uc3Qgc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwgdW5zaWduZWQgdGFibGVMb2csIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJVTMyIGNvbnN0IHRhYmxlU2l6ZSA9IDEgPDwgdGFibGVMb2c7CisJVTMyIGNvbnN0IHRhYmxlTWFzayA9IHRhYmxlU2l6ZSAtIDE7CisJdm9pZCAqY29uc3QgcHRyID0gY3Q7CisJVTE2ICpjb25zdCB0YWJsZVUxNiA9ICgoVTE2ICopcHRyKSArIDI7CisJdm9pZCAqY29uc3QgRlNDVCA9ICgoVTMyICopcHRyKSArIDEgLyogaGVhZGVyICovICsgKHRhYmxlTG9nID8gdGFibGVTaXplID4+IDEgOiAxKTsKKwlGU0Vfc3ltYm9sQ29tcHJlc3Npb25UcmFuc2Zvcm0gKmNvbnN0IHN5bWJvbFRUID0gKEZTRV9zeW1ib2xDb21wcmVzc2lvblRyYW5zZm9ybSAqKShGU0NUKTsKKwlVMzIgY29uc3Qgc3RlcCA9IEZTRV9UQUJMRVNURVAodGFibGVTaXplKTsKKwlVMzIgaGlnaFRocmVzaG9sZCA9IHRhYmxlU2l6ZSAtIDE7CisKKwlVMzIgKmN1bXVsOworCUZTRV9GVU5DVElPTl9UWVBFICp0YWJsZVN5bWJvbDsKKwlzaXplX3Qgc3BhY2VVc2VkMzIgPSAwOworCisJY3VtdWwgPSAoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzI7CisJc3BhY2VVc2VkMzIgKz0gRlNFX01BWF9TWU1CT0xfVkFMVUUgKyAyOworCXRhYmxlU3ltYm9sID0gKEZTRV9GVU5DVElPTl9UWVBFICopKChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMik7CisJc3BhY2VVc2VkMzIgKz0gQUxJR04oc2l6ZW9mKEZTRV9GVU5DVElPTl9UWVBFKSAqICgoc2l6ZV90KTEgPDwgdGFibGVMb2cpLCBzaXplb2YoVTMyKSkgPj4gMjsKKworCWlmICgoc3BhY2VVc2VkMzIgPDwgMikgPiB3b3Jrc3BhY2VTaXplKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCXdvcmtzcGFjZSA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwl3b3Jrc3BhY2VTaXplIC09IChzcGFjZVVzZWQzMiA8PCAyKTsKKworCS8qIENUYWJsZSBoZWFkZXIgKi8KKwl0YWJsZVUxNlstMl0gPSAoVTE2KXRhYmxlTG9nOworCXRhYmxlVTE2Wy0xXSA9IChVMTYpbWF4U3ltYm9sVmFsdWU7CisKKwkvKiBGb3IgZXhwbGFuYXRpb25zIG9uIGhvdyB0byBkaXN0cmlidXRlIHN5bWJvbCB2YWx1ZXMgb3ZlciB0aGUgdGFibGUgOgorCSogIGh0dHA6Ly9mYXN0Y29tcHJlc3Npb24uYmxvZ3Nwb3QuZnIvMjAxNC8wMi9mc2UtZGlzdHJpYnV0aW5nLXN5bWJvbC12YWx1ZXMuaHRtbCAqLworCisJLyogc3ltYm9sIHN0YXJ0IHBvc2l0aW9ucyAqLworCXsKKwkJVTMyIHU7CisJCWN1bXVsWzBdID0gMDsKKwkJZm9yICh1ID0gMTsgdSA8PSBtYXhTeW1ib2xWYWx1ZSArIDE7IHUrKykgeworCQkJaWYgKG5vcm1hbGl6ZWRDb3VudGVyW3UgLSAxXSA9PSAtMSkgeyAvKiBMb3cgcHJvYmEgc3ltYm9sICovCisJCQkJY3VtdWxbdV0gPSBjdW11bFt1IC0gMV0gKyAxOworCQkJCXRhYmxlU3ltYm9sW2hpZ2hUaHJlc2hvbGQtLV0gPSAoRlNFX0ZVTkNUSU9OX1RZUEUpKHUgLSAxKTsKKwkJCX0gZWxzZSB7CisJCQkJY3VtdWxbdV0gPSBjdW11bFt1IC0gMV0gKyBub3JtYWxpemVkQ291bnRlclt1IC0gMV07CisJCQl9CisJCX0KKwkJY3VtdWxbbWF4U3ltYm9sVmFsdWUgKyAxXSA9IHRhYmxlU2l6ZSArIDE7CisJfQorCisJLyogU3ByZWFkIHN5bWJvbHMgKi8KKwl7CisJCVUzMiBwb3NpdGlvbiA9IDA7CisJCVUzMiBzeW1ib2w7CisJCWZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDw9IG1heFN5bWJvbFZhbHVlOyBzeW1ib2wrKykgeworCQkJaW50IG5iT2NjdXJlbmNlczsKKwkJCWZvciAobmJPY2N1cmVuY2VzID0gMDsgbmJPY2N1cmVuY2VzIDwgbm9ybWFsaXplZENvdW50ZXJbc3ltYm9sXTsgbmJPY2N1cmVuY2VzKyspIHsKKwkJCQl0YWJsZVN5bWJvbFtwb3NpdGlvbl0gPSAoRlNFX0ZVTkNUSU9OX1RZUEUpc3ltYm9sOworCQkJCXBvc2l0aW9uID0gKHBvc2l0aW9uICsgc3RlcCkgJiB0YWJsZU1hc2s7CisJCQkJd2hpbGUgKHBvc2l0aW9uID4gaGlnaFRocmVzaG9sZCkKKwkJCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyBzdGVwKSAmIHRhYmxlTWFzazsgLyogTG93IHByb2JhIGFyZWEgKi8KKwkJCX0KKwkJfQorCisJCWlmIChwb3NpdGlvbiAhPSAwKQorCQkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOyAvKiBNdXN0IGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NpdGlvbnMgKi8KKwl9CisKKwkvKiBCdWlsZCB0YWJsZSAqLworCXsKKwkJVTMyIHU7CisJCWZvciAodSA9IDA7IHUgPCB0YWJsZVNpemU7IHUrKykgeworCQkJRlNFX0ZVTkNUSU9OX1RZUEUgcyA9IHRhYmxlU3ltYm9sW3VdOwkvKiBub3RlIDogc3RhdGljIGFuYWx5emVyIG1heSBub3QgdW5kZXJzdGFuZCB0YWJsZVN5bWJvbCBpcyBwcm9wZXJseSBpbml0aWFsaXplZCAqLworCQkJdGFibGVVMTZbY3VtdWxbc10rK10gPSAoVTE2KSh0YWJsZVNpemUgKyB1KTsgLyogVGFibGVVMTYgOiBzb3J0ZWQgYnkgc3ltYm9sIG9yZGVyOyBnaXZlcyBuZXh0IHN0YXRlIHZhbHVlICovCisJCX0KKwl9CisKKwkvKiBCdWlsZCBTeW1ib2wgVHJhbnNmb3JtYXRpb24gVGFibGUgKi8KKwl7CisJCXVuc2lnbmVkIHRvdGFsID0gMDsKKwkJdW5zaWduZWQgczsKKwkJZm9yIChzID0gMDsgcyA8PSBtYXhTeW1ib2xWYWx1ZTsgcysrKSB7CisJCQlzd2l0Y2ggKG5vcm1hbGl6ZWRDb3VudGVyW3NdKSB7CisJCQljYXNlIDA6IGJyZWFrOworCisJCQljYXNlIC0xOgorCQkJY2FzZSAxOgorCQkJCXN5bWJvbFRUW3NdLmRlbHRhTmJCaXRzID0gKHRhYmxlTG9nIDw8IDE2KSAtICgxIDw8IHRhYmxlTG9nKTsKKwkJCQlzeW1ib2xUVFtzXS5kZWx0YUZpbmRTdGF0ZSA9IHRvdGFsIC0gMTsKKwkJCQl0b3RhbCsrOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDogeworCQkJCVUzMiBjb25zdCBtYXhCaXRzT3V0ID0gdGFibGVMb2cgLSBCSVRfaGlnaGJpdDMyKG5vcm1hbGl6ZWRDb3VudGVyW3NdIC0gMSk7CisJCQkJVTMyIGNvbnN0IG1pblN0YXRlUGx1cyA9IG5vcm1hbGl6ZWRDb3VudGVyW3NdIDw8IG1heEJpdHNPdXQ7CisJCQkJc3ltYm9sVFRbc10uZGVsdGFOYkJpdHMgPSAobWF4Qml0c091dCA8PCAxNikgLSBtaW5TdGF0ZVBsdXM7CisJCQkJc3ltYm9sVFRbc10uZGVsdGFGaW5kU3RhdGUgPSB0b3RhbCAtIG5vcm1hbGl6ZWRDb3VudGVyW3NdOworCQkJCXRvdGFsICs9IG5vcm1hbGl6ZWRDb3VudGVyW3NdOworCQkJfQorCQkJfQorCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBGU0UgTkNvdW50IGVuY29kaW5nLWRlY29kaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc2l6ZV90IEZTRV9OQ291bnRXcml0ZUJvdW5kKHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZykKK3sKKwlzaXplX3QgY29uc3QgbWF4SGVhZGVyU2l6ZSA9ICgoKG1heFN5bWJvbFZhbHVlICsgMSkgKiB0YWJsZUxvZykgPj4gMykgKyAzOworCXJldHVybiBtYXhTeW1ib2xWYWx1ZSA/IG1heEhlYWRlclNpemUgOiBGU0VfTkNPVU5UQk9VTkQ7IC8qIG1heFN5bWJvbFZhbHVlPT0wID8gdXNlIGRlZmF1bHQgKi8KK30KKworc3RhdGljIHNpemVfdCBGU0Vfd3JpdGVOQ291bnRfZ2VuZXJpYyh2b2lkICpoZWFkZXIsIHNpemVfdCBoZWFkZXJCdWZmZXJTaXplLCBjb25zdCBzaG9ydCAqbm9ybWFsaXplZENvdW50ZXIsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywKKwkJCQkgICAgICB1bnNpZ25lZCB3cml0ZUlzU2FmZSkKK3sKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWhlYWRlcjsKKwlCWVRFICpvdXQgPSBvc3RhcnQ7CisJQllURSAqY29uc3Qgb2VuZCA9IG9zdGFydCArIGhlYWRlckJ1ZmZlclNpemU7CisJaW50IG5iQml0czsKKwljb25zdCBpbnQgdGFibGVTaXplID0gMSA8PCB0YWJsZUxvZzsKKwlpbnQgcmVtYWluaW5nOworCWludCB0aHJlc2hvbGQ7CisJVTMyIGJpdFN0cmVhbTsKKwlpbnQgYml0Q291bnQ7CisJdW5zaWduZWQgY2hhcm51bSA9IDA7CisJaW50IHByZXZpb3VzMCA9IDA7CisKKwliaXRTdHJlYW0gPSAwOworCWJpdENvdW50ID0gMDsKKwkvKiBUYWJsZSBTaXplICovCisJYml0U3RyZWFtICs9ICh0YWJsZUxvZyAtIEZTRV9NSU5fVEFCTEVMT0cpIDw8IGJpdENvdW50OworCWJpdENvdW50ICs9IDQ7CisKKwkvKiBJbml0ICovCisJcmVtYWluaW5nID0gdGFibGVTaXplICsgMTsgLyogKzEgZm9yIGV4dHJhIGFjY3VyYWN5ICovCisJdGhyZXNob2xkID0gdGFibGVTaXplOworCW5iQml0cyA9IHRhYmxlTG9nICsgMTsKKworCXdoaWxlIChyZW1haW5pbmcgPiAxKSB7IC8qIHN0b3BzIGF0IDEgKi8KKwkJaWYgKHByZXZpb3VzMCkgeworCQkJdW5zaWduZWQgc3RhcnQgPSBjaGFybnVtOworCQkJd2hpbGUgKCFub3JtYWxpemVkQ291bnRlcltjaGFybnVtXSkKKwkJCQljaGFybnVtKys7CisJCQl3aGlsZSAoY2hhcm51bSA+PSBzdGFydCArIDI0KSB7CisJCQkJc3RhcnQgKz0gMjQ7CisJCQkJYml0U3RyZWFtICs9IDB4RkZGRlUgPDwgYml0Q291bnQ7CisJCQkJaWYgKCghd3JpdGVJc1NhZmUpICYmIChvdXQgPiBvZW5kIC0gMikpCisJCQkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogQnVmZmVyIG92ZXJmbG93ICovCisJCQkJb3V0WzBdID0gKEJZVEUpYml0U3RyZWFtOworCQkJCW91dFsxXSA9IChCWVRFKShiaXRTdHJlYW0gPj4gOCk7CisJCQkJb3V0ICs9IDI7CisJCQkJYml0U3RyZWFtID4+PSAxNjsKKwkJCX0KKwkJCXdoaWxlIChjaGFybnVtID49IHN0YXJ0ICsgMykgeworCQkJCXN0YXJ0ICs9IDM7CisJCQkJYml0U3RyZWFtICs9IDMgPDwgYml0Q291bnQ7CisJCQkJYml0Q291bnQgKz0gMjsKKwkJCX0KKwkJCWJpdFN0cmVhbSArPSAoY2hhcm51bSAtIHN0YXJ0KSA8PCBiaXRDb3VudDsKKwkJCWJpdENvdW50ICs9IDI7CisJCQlpZiAoYml0Q291bnQgPiAxNikgeworCQkJCWlmICgoIXdyaXRlSXNTYWZlKSAmJiAob3V0ID4gb2VuZCAtIDIpKQorCQkJCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7IC8qIEJ1ZmZlciBvdmVyZmxvdyAqLworCQkJCW91dFswXSA9IChCWVRFKWJpdFN0cmVhbTsKKwkJCQlvdXRbMV0gPSAoQllURSkoYml0U3RyZWFtID4+IDgpOworCQkJCW91dCArPSAyOworCQkJCWJpdFN0cmVhbSA+Pj0gMTY7CisJCQkJYml0Q291bnQgLT0gMTY7CisJCQl9CisJCX0KKwkJeworCQkJaW50IGNvdW50ID0gbm9ybWFsaXplZENvdW50ZXJbY2hhcm51bSsrXTsKKwkJCWludCBjb25zdCBtYXggPSAoMiAqIHRocmVzaG9sZCAtIDEpIC0gcmVtYWluaW5nOworCQkJcmVtYWluaW5nIC09IGNvdW50IDwgMCA/IC1jb3VudCA6IGNvdW50OworCQkJY291bnQrKzsgLyogKzEgZm9yIGV4dHJhIGFjY3VyYWN5ICovCisJCQlpZiAoY291bnQgPj0gdGhyZXNob2xkKQorCQkJCWNvdW50ICs9IG1heDsgLyogWzAuLm1heFsgW21heC4udGhyZXNob2xkWyAoLi4uKSBbdGhyZXNob2xkK21heCAyKnRocmVzaG9sZFsgKi8KKwkJCWJpdFN0cmVhbSArPSBjb3VudCA8PCBiaXRDb3VudDsKKwkJCWJpdENvdW50ICs9IG5iQml0czsKKwkJCWJpdENvdW50IC09IChjb3VudCA8IG1heCk7CisJCQlwcmV2aW91czAgPSAoY291bnQgPT0gMSk7CisJCQlpZiAocmVtYWluaW5nIDwgMSkKKwkJCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7CisJCQl3aGlsZSAocmVtYWluaW5nIDwgdGhyZXNob2xkKQorCQkJCW5iQml0cy0tLCB0aHJlc2hvbGQgPj49IDE7CisJCX0KKwkJaWYgKGJpdENvdW50ID4gMTYpIHsKKwkJCWlmICgoIXdyaXRlSXNTYWZlKSAmJiAob3V0ID4gb2VuZCAtIDIpKQorCQkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogQnVmZmVyIG92ZXJmbG93ICovCisJCQlvdXRbMF0gPSAoQllURSliaXRTdHJlYW07CisJCQlvdXRbMV0gPSAoQllURSkoYml0U3RyZWFtID4+IDgpOworCQkJb3V0ICs9IDI7CisJCQliaXRTdHJlYW0gPj49IDE2OworCQkJYml0Q291bnQgLT0gMTY7CisJCX0KKwl9CisKKwkvKiBmbHVzaCByZW1haW5pbmcgYml0U3RyZWFtICovCisJaWYgKCghd3JpdGVJc1NhZmUpICYmIChvdXQgPiBvZW5kIC0gMikpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogQnVmZmVyIG92ZXJmbG93ICovCisJb3V0WzBdID0gKEJZVEUpYml0U3RyZWFtOworCW91dFsxXSA9IChCWVRFKShiaXRTdHJlYW0gPj4gOCk7CisJb3V0ICs9IChiaXRDb3VudCArIDcpIC8gODsKKworCWlmIChjaGFybnVtID4gbWF4U3ltYm9sVmFsdWUgKyAxKQorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7CisKKwlyZXR1cm4gKG91dCAtIG9zdGFydCk7Cit9CisKK3NpemVfdCBGU0Vfd3JpdGVOQ291bnQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnVmZmVyU2l6ZSwgY29uc3Qgc2hvcnQgKm5vcm1hbGl6ZWRDb3VudGVyLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwgdW5zaWduZWQgdGFibGVMb2cpCit7CisJaWYgKHRhYmxlTG9nID4gRlNFX01BWF9UQUJMRUxPRykKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsgLyogVW5zdXBwb3J0ZWQgKi8KKwlpZiAodGFibGVMb2cgPCBGU0VfTUlOX1RBQkxFTE9HKQorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIFVuc3VwcG9ydGVkICovCisKKwlpZiAoYnVmZmVyU2l6ZSA8IEZTRV9OQ291bnRXcml0ZUJvdW5kKG1heFN5bWJvbFZhbHVlLCB0YWJsZUxvZykpCisJCXJldHVybiBGU0Vfd3JpdGVOQ291bnRfZ2VuZXJpYyhidWZmZXIsIGJ1ZmZlclNpemUsIG5vcm1hbGl6ZWRDb3VudGVyLCBtYXhTeW1ib2xWYWx1ZSwgdGFibGVMb2csIDApOworCisJcmV0dXJuIEZTRV93cml0ZU5Db3VudF9nZW5lcmljKGJ1ZmZlciwgYnVmZmVyU2l6ZSwgbm9ybWFsaXplZENvdW50ZXIsIG1heFN5bWJvbFZhbHVlLCB0YWJsZUxvZywgMSk7Cit9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBDb3VudGluZyBoaXN0b2dyYW0KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiEgRlNFX2NvdW50X3NpbXBsZQorCVRoaXMgZnVuY3Rpb24gY291bnRzIGJ5dGUgdmFsdWVzIHdpdGhpbiBgc3JjYCwgYW5kIHN0b3JlIHRoZSBoaXN0b2dyYW0gaW50byB0YWJsZSBgY291bnRgLgorCUl0IGRvZXNuJ3QgdXNlIGFueSBhZGRpdGlvbmFsIG1lbW9yeS4KKwlCdXQgdGhpcyBmdW5jdGlvbiBpcyB1bnNhZmUgOiBpdCBkb2Vzbid0IGNoZWNrIHRoYXQgYWxsIHZhbHVlcyB3aXRoaW4gYHNyY2AgY2FuIGZpdCBpbnRvIGBjb3VudGAuCisJRm9yIHRoaXMgcmVhc29uLCBwcmVmZXIgdXNpbmcgYSB0YWJsZSBgY291bnRgIHdpdGggMjU2IGVsZW1lbnRzLgorCUByZXR1cm4gOiBjb3VudCBvZiBtb3N0IG51bWVyb3VzIGVsZW1lbnQKKyovCitzaXplX3QgRlNFX2NvdW50X3NpbXBsZSh1bnNpZ25lZCAqY291bnQsIHVuc2lnbmVkICptYXhTeW1ib2xWYWx1ZVB0ciwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSkKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc3JjOworCWNvbnN0IEJZVEUgKmNvbnN0IGVuZCA9IGlwICsgc3JjU2l6ZTsKKwl1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSA9ICptYXhTeW1ib2xWYWx1ZVB0cjsKKwl1bnNpZ25lZCBtYXggPSAwOworCisJbWVtc2V0KGNvdW50LCAwLCAobWF4U3ltYm9sVmFsdWUgKyAxKSAqIHNpemVvZigqY291bnQpKTsKKwlpZiAoc3JjU2l6ZSA9PSAwKSB7CisJCSptYXhTeW1ib2xWYWx1ZVB0ciA9IDA7CisJCXJldHVybiAwOworCX0KKworCXdoaWxlIChpcCA8IGVuZCkKKwkJY291bnRbKmlwKytdKys7CisKKwl3aGlsZSAoIWNvdW50W21heFN5bWJvbFZhbHVlXSkKKwkJbWF4U3ltYm9sVmFsdWUtLTsKKwkqbWF4U3ltYm9sVmFsdWVQdHIgPSBtYXhTeW1ib2xWYWx1ZTsKKworCXsKKwkJVTMyIHM7CisJCWZvciAocyA9IDA7IHMgPD0gbWF4U3ltYm9sVmFsdWU7IHMrKykKKwkJCWlmIChjb3VudFtzXSA+IG1heCkKKwkJCQltYXggPSBjb3VudFtzXTsKKwl9CisKKwlyZXR1cm4gKHNpemVfdCltYXg7Cit9CisKKy8qIEZTRV9jb3VudF9wYXJhbGxlbF93a3NwKCkgOgorICogU2FtZSBhcyBGU0VfY291bnRfcGFyYWxsZWwoKSwgYnV0IHVzaW5nIGFuIGV4dGVybmFsbHkgcHJvdmlkZWQgc2NyYXRjaCBidWZmZXIuCisgKiBgd29ya1NwYWNlYCBzaXplIG11c3QgYmUgYSBtaW5pbXVtIG9mIGAxMDI0ICogc2l6ZW9mKHVuc2lnbmVkKWBgICovCitzdGF0aWMgc2l6ZV90IEZTRV9jb3VudF9wYXJhbGxlbF93a3NwKHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgKm1heFN5bWJvbFZhbHVlUHRyLCBjb25zdCB2b2lkICpzb3VyY2UsIHNpemVfdCBzb3VyY2VTaXplLCB1bnNpZ25lZCBjaGVja01heCwKKwkJCQkgICAgICB1bnNpZ25lZCAqY29uc3Qgd29ya1NwYWNlKQoreworCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKilzb3VyY2U7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlwICsgc291cmNlU2l6ZTsKKwl1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSA9ICptYXhTeW1ib2xWYWx1ZVB0cjsKKwl1bnNpZ25lZCBtYXggPSAwOworCVUzMiAqY29uc3QgQ291bnRpbmcxID0gd29ya1NwYWNlOworCVUzMiAqY29uc3QgQ291bnRpbmcyID0gQ291bnRpbmcxICsgMjU2OworCVUzMiAqY29uc3QgQ291bnRpbmczID0gQ291bnRpbmcyICsgMjU2OworCVUzMiAqY29uc3QgQ291bnRpbmc0ID0gQ291bnRpbmczICsgMjU2OworCisJbWVtc2V0KENvdW50aW5nMSwgMCwgNCAqIDI1NiAqIHNpemVvZih1bnNpZ25lZCkpOworCisJLyogc2FmZXR5IGNoZWNrcyAqLworCWlmICghc291cmNlU2l6ZSkgeworCQltZW1zZXQoY291bnQsIDAsIG1heFN5bWJvbFZhbHVlICsgMSk7CisJCSptYXhTeW1ib2xWYWx1ZVB0ciA9IDA7CisJCXJldHVybiAwOworCX0KKwlpZiAoIW1heFN5bWJvbFZhbHVlKQorCQltYXhTeW1ib2xWYWx1ZSA9IDI1NTsgLyogMCA9PSBkZWZhdWx0ICovCisKKwkvKiBieSBzdHJpcGVzIG9mIDE2IGJ5dGVzICovCisJeworCQlVMzIgY2FjaGVkID0gWlNURF9yZWFkMzIoaXApOworCQlpcCArPSA0OworCQl3aGlsZSAoaXAgPCBpZW5kIC0gMTUpIHsKKwkJCVUzMiBjID0gY2FjaGVkOworCQkJY2FjaGVkID0gWlNURF9yZWFkMzIoaXApOworCQkJaXAgKz0gNDsKKwkJCUNvdW50aW5nMVsoQllURSljXSsrOworCQkJQ291bnRpbmcyWyhCWVRFKShjID4+IDgpXSsrOworCQkJQ291bnRpbmczWyhCWVRFKShjID4+IDE2KV0rKzsKKwkJCUNvdW50aW5nNFtjID4+IDI0XSsrOworCQkJYyA9IGNhY2hlZDsKKwkJCWNhY2hlZCA9IFpTVERfcmVhZDMyKGlwKTsKKwkJCWlwICs9IDQ7CisJCQlDb3VudGluZzFbKEJZVEUpY10rKzsKKwkJCUNvdW50aW5nMlsoQllURSkoYyA+PiA4KV0rKzsKKwkJCUNvdW50aW5nM1soQllURSkoYyA+PiAxNildKys7CisJCQlDb3VudGluZzRbYyA+PiAyNF0rKzsKKwkJCWMgPSBjYWNoZWQ7CisJCQljYWNoZWQgPSBaU1REX3JlYWQzMihpcCk7CisJCQlpcCArPSA0OworCQkJQ291bnRpbmcxWyhCWVRFKWNdKys7CisJCQlDb3VudGluZzJbKEJZVEUpKGMgPj4gOCldKys7CisJCQlDb3VudGluZzNbKEJZVEUpKGMgPj4gMTYpXSsrOworCQkJQ291bnRpbmc0W2MgPj4gMjRdKys7CisJCQljID0gY2FjaGVkOworCQkJY2FjaGVkID0gWlNURF9yZWFkMzIoaXApOworCQkJaXAgKz0gNDsKKwkJCUNvdW50aW5nMVsoQllURSljXSsrOworCQkJQ291bnRpbmcyWyhCWVRFKShjID4+IDgpXSsrOworCQkJQ291bnRpbmczWyhCWVRFKShjID4+IDE2KV0rKzsKKwkJCUNvdW50aW5nNFtjID4+IDI0XSsrOworCQl9CisJCWlwIC09IDQ7CisJfQorCisJLyogZmluaXNoIGxhc3Qgc3ltYm9scyAqLworCXdoaWxlIChpcCA8IGllbmQpCisJCUNvdW50aW5nMVsqaXArK10rKzsKKworCWlmIChjaGVja01heCkgeyAvKiB2ZXJpZnkgc3RhdHMgd2lsbCBmaXQgaW50byBkZXN0aW5hdGlvbiB0YWJsZSAqLworCQlVMzIgczsKKwkJZm9yIChzID0gMjU1OyBzID4gbWF4U3ltYm9sVmFsdWU7IHMtLSkgeworCQkJQ291bnRpbmcxW3NdICs9IENvdW50aW5nMltzXSArIENvdW50aW5nM1tzXSArIENvdW50aW5nNFtzXTsKKwkJCWlmIChDb3VudGluZzFbc10pCisJCQkJcmV0dXJuIEVSUk9SKG1heFN5bWJvbFZhbHVlX3Rvb1NtYWxsKTsKKwkJfQorCX0KKworCXsKKwkJVTMyIHM7CisJCWZvciAocyA9IDA7IHMgPD0gbWF4U3ltYm9sVmFsdWU7IHMrKykgeworCQkJY291bnRbc10gPSBDb3VudGluZzFbc10gKyBDb3VudGluZzJbc10gKyBDb3VudGluZzNbc10gKyBDb3VudGluZzRbc107CisJCQlpZiAoY291bnRbc10gPiBtYXgpCisJCQkJbWF4ID0gY291bnRbc107CisJCX0KKwl9CisKKwl3aGlsZSAoIWNvdW50W21heFN5bWJvbFZhbHVlXSkKKwkJbWF4U3ltYm9sVmFsdWUtLTsKKwkqbWF4U3ltYm9sVmFsdWVQdHIgPSBtYXhTeW1ib2xWYWx1ZTsKKwlyZXR1cm4gKHNpemVfdCltYXg7Cit9CisKKy8qIEZTRV9jb3VudEZhc3Rfd2tzcCgpIDoKKyAqIFNhbWUgYXMgRlNFX2NvdW50RmFzdCgpLCBidXQgdXNpbmcgYW4gZXh0ZXJuYWxseSBwcm92aWRlZCBzY3JhdGNoIGJ1ZmZlci4KKyAqIGB3b3JrU3BhY2VgIHNpemUgbXVzdCBiZSB0YWJsZSBvZiA+PSBgMTAyNGAgdW5zaWduZWQgKi8KK3NpemVfdCBGU0VfY291bnRGYXN0X3drc3AodW5zaWduZWQgKmNvdW50LCB1bnNpZ25lZCAqbWF4U3ltYm9sVmFsdWVQdHIsIGNvbnN0IHZvaWQgKnNvdXJjZSwgc2l6ZV90IHNvdXJjZVNpemUsIHVuc2lnbmVkICp3b3JrU3BhY2UpCit7CisJaWYgKHNvdXJjZVNpemUgPCAxNTAwKQorCQlyZXR1cm4gRlNFX2NvdW50X3NpbXBsZShjb3VudCwgbWF4U3ltYm9sVmFsdWVQdHIsIHNvdXJjZSwgc291cmNlU2l6ZSk7CisJcmV0dXJuIEZTRV9jb3VudF9wYXJhbGxlbF93a3NwKGNvdW50LCBtYXhTeW1ib2xWYWx1ZVB0ciwgc291cmNlLCBzb3VyY2VTaXplLCAwLCB3b3JrU3BhY2UpOworfQorCisvKiBGU0VfY291bnRfd2tzcCgpIDoKKyAqIFNhbWUgYXMgRlNFX2NvdW50KCksIGJ1dCB1c2luZyBhbiBleHRlcm5hbGx5IHByb3ZpZGVkIHNjcmF0Y2ggYnVmZmVyLgorICogYHdvcmtTcGFjZWAgc2l6ZSBtdXN0IGJlIHRhYmxlIG9mID49IGAxMDI0YCB1bnNpZ25lZCAqLworc2l6ZV90IEZTRV9jb3VudF93a3NwKHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgKm1heFN5bWJvbFZhbHVlUHRyLCBjb25zdCB2b2lkICpzb3VyY2UsIHNpemVfdCBzb3VyY2VTaXplLCB1bnNpZ25lZCAqd29ya1NwYWNlKQoreworCWlmICgqbWF4U3ltYm9sVmFsdWVQdHIgPCAyNTUpCisJCXJldHVybiBGU0VfY291bnRfcGFyYWxsZWxfd2tzcChjb3VudCwgbWF4U3ltYm9sVmFsdWVQdHIsIHNvdXJjZSwgc291cmNlU2l6ZSwgMSwgd29ya1NwYWNlKTsKKwkqbWF4U3ltYm9sVmFsdWVQdHIgPSAyNTU7CisJcmV0dXJuIEZTRV9jb3VudEZhc3Rfd2tzcChjb3VudCwgbWF4U3ltYm9sVmFsdWVQdHIsIHNvdXJjZSwgc291cmNlU2l6ZSwgd29ya1NwYWNlKTsKK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEZTRSBDb21wcmVzc2lvbiBDb2RlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohIEZTRV9zaXplb2ZfQ1RhYmxlKCkgOgorCUZTRV9DVGFibGUgaXMgYSB2YXJpYWJsZSBzaXplIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyA6CisJYFUxNiB0YWJsZUxvZztgCisJYFUxNiBtYXhTeW1ib2xWYWx1ZTtgCisJYFUxNiBuZXh0U3RhdGVOdW1iZXJbMSA8PCB0YWJsZUxvZ107YCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNpemUgaXMgdmFyaWFibGUKKwlgRlNFX3N5bWJvbENvbXByZXNzaW9uVHJhbnNmb3JtIHN5bWJvbFRUW21heFN5bWJvbFZhbHVlKzFdO2AgIC8vIFRoaXMgc2l6ZSBpcyB2YXJpYWJsZQorQWxsb2NhdGlvbiBpcyBtYW51YWwgKEMgc3RhbmRhcmQgZG9lcyBub3Qgc3VwcG9ydCB2YXJpYWJsZS1zaXplIHN0cnVjdHVyZXMpLgorKi8KK3NpemVfdCBGU0Vfc2l6ZW9mX0NUYWJsZSh1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwgdW5zaWduZWQgdGFibGVMb2cpCit7CisJaWYgKHRhYmxlTG9nID4gRlNFX01BWF9UQUJMRUxPRykKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsKKwlyZXR1cm4gRlNFX0NUQUJMRV9TSVpFX1UzMih0YWJsZUxvZywgbWF4U3ltYm9sVmFsdWUpICogc2l6ZW9mKFUzMik7Cit9CisKKy8qIHByb3ZpZGVzIHRoZSBtaW5pbXVtIGxvZ1NpemUgdG8gc2FmZWx5IHJlcHJlc2VudCBhIGRpc3RyaWJ1dGlvbiAqLworc3RhdGljIHVuc2lnbmVkIEZTRV9taW5UYWJsZUxvZyhzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUpCit7CisJVTMyIG1pbkJpdHNTcmMgPSBCSVRfaGlnaGJpdDMyKChVMzIpKHNyY1NpemUgLSAxKSkgKyAxOworCVUzMiBtaW5CaXRzU3ltYm9scyA9IEJJVF9oaWdoYml0MzIobWF4U3ltYm9sVmFsdWUpICsgMjsKKwlVMzIgbWluQml0cyA9IG1pbkJpdHNTcmMgPCBtaW5CaXRzU3ltYm9scyA/IG1pbkJpdHNTcmMgOiBtaW5CaXRzU3ltYm9sczsKKwlyZXR1cm4gbWluQml0czsKK30KKwordW5zaWduZWQgRlNFX29wdGltYWxUYWJsZUxvZ19pbnRlcm5hbCh1bnNpZ25lZCBtYXhUYWJsZUxvZywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCBtaW51cykKK3sKKwlVMzIgbWF4Qml0c1NyYyA9IEJJVF9oaWdoYml0MzIoKFUzMikoc3JjU2l6ZSAtIDEpKSAtIG1pbnVzOworCVUzMiB0YWJsZUxvZyA9IG1heFRhYmxlTG9nOworCVUzMiBtaW5CaXRzID0gRlNFX21pblRhYmxlTG9nKHNyY1NpemUsIG1heFN5bWJvbFZhbHVlKTsKKwlpZiAodGFibGVMb2cgPT0gMCkKKwkJdGFibGVMb2cgPSBGU0VfREVGQVVMVF9UQUJMRUxPRzsKKwlpZiAobWF4Qml0c1NyYyA8IHRhYmxlTG9nKQorCQl0YWJsZUxvZyA9IG1heEJpdHNTcmM7IC8qIEFjY3VyYWN5IGNhbiBiZSByZWR1Y2VkICovCisJaWYgKG1pbkJpdHMgPiB0YWJsZUxvZykKKwkJdGFibGVMb2cgPSBtaW5CaXRzOyAvKiBOZWVkIGEgbWluaW11bSB0byBzYWZlbHkgcmVwcmVzZW50IGFsbCBzeW1ib2wgdmFsdWVzICovCisJaWYgKHRhYmxlTG9nIDwgRlNFX01JTl9UQUJMRUxPRykKKwkJdGFibGVMb2cgPSBGU0VfTUlOX1RBQkxFTE9HOworCWlmICh0YWJsZUxvZyA+IEZTRV9NQVhfVEFCTEVMT0cpCisJCXRhYmxlTG9nID0gRlNFX01BWF9UQUJMRUxPRzsKKwlyZXR1cm4gdGFibGVMb2c7Cit9CisKK3Vuc2lnbmVkIEZTRV9vcHRpbWFsVGFibGVMb2codW5zaWduZWQgbWF4VGFibGVMb2csIHNpemVfdCBzcmNTaXplLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSkKK3sKKwlyZXR1cm4gRlNFX29wdGltYWxUYWJsZUxvZ19pbnRlcm5hbChtYXhUYWJsZUxvZywgc3JjU2l6ZSwgbWF4U3ltYm9sVmFsdWUsIDIpOworfQorCisvKiBTZWNvbmRhcnkgbm9ybWFsaXphdGlvbiBtZXRob2QuCisgICBUbyBiZSB1c2VkIHdoZW4gcHJpbWFyeSBtZXRob2QgZmFpbHMuICovCisKK3N0YXRpYyBzaXplX3QgRlNFX25vcm1hbGl6ZU0yKHNob3J0ICpub3JtLCBVMzIgdGFibGVMb2csIGNvbnN0IHVuc2lnbmVkICpjb3VudCwgc2l6ZV90IHRvdGFsLCBVMzIgbWF4U3ltYm9sVmFsdWUpCit7CisJc2hvcnQgY29uc3QgTk9UX1lFVF9BU1NJR05FRCA9IC0yOworCVUzMiBzOworCVUzMiBkaXN0cmlidXRlZCA9IDA7CisJVTMyIFRvRGlzdHJpYnV0ZTsKKworCS8qIEluaXQgKi8KKwlVMzIgY29uc3QgbG93VGhyZXNob2xkID0gKFUzMikodG90YWwgPj4gdGFibGVMb2cpOworCVUzMiBsb3dPbmUgPSAoVTMyKSgodG90YWwgKiAzKSA+PiAodGFibGVMb2cgKyAxKSk7CisKKwlmb3IgKHMgPSAwOyBzIDw9IG1heFN5bWJvbFZhbHVlOyBzKyspIHsKKwkJaWYgKGNvdW50W3NdID09IDApIHsKKwkJCW5vcm1bc10gPSAwOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvdW50W3NdIDw9IGxvd1RocmVzaG9sZCkgeworCQkJbm9ybVtzXSA9IC0xOworCQkJZGlzdHJpYnV0ZWQrKzsKKwkJCXRvdGFsIC09IGNvdW50W3NdOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvdW50W3NdIDw9IGxvd09uZSkgeworCQkJbm9ybVtzXSA9IDE7CisJCQlkaXN0cmlidXRlZCsrOworCQkJdG90YWwgLT0gY291bnRbc107CisJCQljb250aW51ZTsKKwkJfQorCisJCW5vcm1bc10gPSBOT1RfWUVUX0FTU0lHTkVEOworCX0KKwlUb0Rpc3RyaWJ1dGUgPSAoMSA8PCB0YWJsZUxvZykgLSBkaXN0cmlidXRlZDsKKworCWlmICgodG90YWwgLyBUb0Rpc3RyaWJ1dGUpID4gbG93T25lKSB7CisJCS8qIHJpc2sgb2Ygcm91bmRpbmcgdG8gemVybyAqLworCQlsb3dPbmUgPSAoVTMyKSgodG90YWwgKiAzKSAvIChUb0Rpc3RyaWJ1dGUgKiAyKSk7CisJCWZvciAocyA9IDA7IHMgPD0gbWF4U3ltYm9sVmFsdWU7IHMrKykgeworCQkJaWYgKChub3JtW3NdID09IE5PVF9ZRVRfQVNTSUdORUQpICYmIChjb3VudFtzXSA8PSBsb3dPbmUpKSB7CisJCQkJbm9ybVtzXSA9IDE7CisJCQkJZGlzdHJpYnV0ZWQrKzsKKwkJCQl0b3RhbCAtPSBjb3VudFtzXTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCQlUb0Rpc3RyaWJ1dGUgPSAoMSA8PCB0YWJsZUxvZykgLSBkaXN0cmlidXRlZDsKKwl9CisKKwlpZiAoZGlzdHJpYnV0ZWQgPT0gbWF4U3ltYm9sVmFsdWUgKyAxKSB7CisJCS8qIGFsbCB2YWx1ZXMgYXJlIHByZXR0eSBwb29yOworCQkgICBwcm9iYWJseSBpbmNvbXByZXNzaWJsZSBkYXRhIChzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gZGV0ZWN0ZWQpOworCQkgICBmaW5kIG1heCwgdGhlbiBnaXZlIGFsbCByZW1haW5pbmcgcG9pbnRzIHRvIG1heCAqLworCQlVMzIgbWF4ViA9IDAsIG1heEMgPSAwOworCQlmb3IgKHMgPSAwOyBzIDw9IG1heFN5bWJvbFZhbHVlOyBzKyspCisJCQlpZiAoY291bnRbc10gPiBtYXhDKQorCQkJCW1heFYgPSBzLCBtYXhDID0gY291bnRbc107CisJCW5vcm1bbWF4Vl0gKz0gKHNob3J0KVRvRGlzdHJpYnV0ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHRvdGFsID09IDApIHsKKwkJLyogYWxsIG9mIHRoZSBzeW1ib2xzIHdlcmUgbG93IGVub3VnaCBmb3IgdGhlIGxvd09uZSBvciBsb3dUaHJlc2hvbGQgKi8KKwkJZm9yIChzID0gMDsgVG9EaXN0cmlidXRlID4gMDsgcyA9IChzICsgMSkgJSAobWF4U3ltYm9sVmFsdWUgKyAxKSkKKwkJCWlmIChub3JtW3NdID4gMCkKKwkJCQlUb0Rpc3RyaWJ1dGUtLSwgbm9ybVtzXSsrOworCQlyZXR1cm4gMDsKKwl9CisKKwl7CisJCVU2NCBjb25zdCB2U3RlcExvZyA9IDYyIC0gdGFibGVMb2c7CisJCVU2NCBjb25zdCBtaWQgPSAoMVVMTCA8PCAodlN0ZXBMb2cgLSAxKSkgLSAxOworCQlVNjQgY29uc3QgclN0ZXAgPSBkaXZfdTY0KCgoKFU2NCkxIDw8IHZTdGVwTG9nKSAqIFRvRGlzdHJpYnV0ZSkgKyBtaWQsIChVMzIpdG90YWwpOyAvKiBzY2FsZSBvbiByZW1haW5pbmcgKi8KKwkJVTY0IHRtcFRvdGFsID0gbWlkOworCQlmb3IgKHMgPSAwOyBzIDw9IG1heFN5bWJvbFZhbHVlOyBzKyspIHsKKwkJCWlmIChub3JtW3NdID09IE5PVF9ZRVRfQVNTSUdORUQpIHsKKwkJCQlVNjQgY29uc3QgZW5kID0gdG1wVG90YWwgKyAoY291bnRbc10gKiByU3RlcCk7CisJCQkJVTMyIGNvbnN0IHNTdGFydCA9IChVMzIpKHRtcFRvdGFsID4+IHZTdGVwTG9nKTsKKwkJCQlVMzIgY29uc3Qgc0VuZCA9IChVMzIpKGVuZCA+PiB2U3RlcExvZyk7CisJCQkJVTMyIGNvbnN0IHdlaWdodCA9IHNFbmQgLSBzU3RhcnQ7CisJCQkJaWYgKHdlaWdodCA8IDEpCisJCQkJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwkJCQlub3JtW3NdID0gKHNob3J0KXdlaWdodDsKKwkJCQl0bXBUb3RhbCA9IGVuZDsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzaXplX3QgRlNFX25vcm1hbGl6ZUNvdW50KHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgdGFibGVMb2csIGNvbnN0IHVuc2lnbmVkICpjb3VudCwgc2l6ZV90IHRvdGFsLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSkKK3sKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKHRhYmxlTG9nID09IDApCisJCXRhYmxlTG9nID0gRlNFX0RFRkFVTFRfVEFCTEVMT0c7CisJaWYgKHRhYmxlTG9nIDwgRlNFX01JTl9UQUJMRUxPRykKKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOyAvKiBVbnN1cHBvcnRlZCBzaXplICovCisJaWYgKHRhYmxlTG9nID4gRlNFX01BWF9UQUJMRUxPRykKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsgLyogVW5zdXBwb3J0ZWQgc2l6ZSAqLworCWlmICh0YWJsZUxvZyA8IEZTRV9taW5UYWJsZUxvZyh0b3RhbCwgbWF4U3ltYm9sVmFsdWUpKQorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIFRvbyBzbWFsbCB0YWJsZUxvZywgY29tcHJlc3Npb24gcG90ZW50aWFsbHkgaW1wb3NzaWJsZSAqLworCisJeworCQlVMzIgY29uc3QgcnRiVGFibGVbXSA9IHswLCA0NzMxOTUsIDUwNDMzMywgNTIwODYwLCA1NTAwMDAsIDcwMDAwMCwgNzUwMDAwLCA4MzAwMDB9OworCQlVNjQgY29uc3Qgc2NhbGUgPSA2MiAtIHRhYmxlTG9nOworCQlVNjQgY29uc3Qgc3RlcCA9IGRpdl91NjQoKFU2NCkxIDw8IDYyLCAoVTMyKXRvdGFsKTsgLyogPD09IGhlcmUsIG9uZSBkaXZpc2lvbiAhICovCisJCVU2NCBjb25zdCB2U3RlcCA9IDFVTEwgPDwgKHNjYWxlIC0gMjApOworCQlpbnQgc3RpbGxUb0Rpc3RyaWJ1dGUgPSAxIDw8IHRhYmxlTG9nOworCQl1bnNpZ25lZCBzOworCQl1bnNpZ25lZCBsYXJnZXN0ID0gMDsKKwkJc2hvcnQgbGFyZ2VzdFAgPSAwOworCQlVMzIgbG93VGhyZXNob2xkID0gKFUzMikodG90YWwgPj4gdGFibGVMb2cpOworCisJCWZvciAocyA9IDA7IHMgPD0gbWF4U3ltYm9sVmFsdWU7IHMrKykgeworCQkJaWYgKGNvdW50W3NdID09IHRvdGFsKQorCQkJCXJldHVybiAwOyAvKiBybGUgc3BlY2lhbCBjYXNlICovCisJCQlpZiAoY291bnRbc10gPT0gMCkgeworCQkJCW5vcm1hbGl6ZWRDb3VudGVyW3NdID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjb3VudFtzXSA8PSBsb3dUaHJlc2hvbGQpIHsKKwkJCQlub3JtYWxpemVkQ291bnRlcltzXSA9IC0xOworCQkJCXN0aWxsVG9EaXN0cmlidXRlLS07CisJCQl9IGVsc2UgeworCQkJCXNob3J0IHByb2JhID0gKHNob3J0KSgoY291bnRbc10gKiBzdGVwKSA+PiBzY2FsZSk7CisJCQkJaWYgKHByb2JhIDwgOCkgeworCQkJCQlVNjQgcmVzdFRvQmVhdCA9IHZTdGVwICogcnRiVGFibGVbcHJvYmFdOworCQkJCQlwcm9iYSArPSAoY291bnRbc10gKiBzdGVwKSAtICgoVTY0KXByb2JhIDw8IHNjYWxlKSA+IHJlc3RUb0JlYXQ7CisJCQkJfQorCQkJCWlmIChwcm9iYSA+IGxhcmdlc3RQKQorCQkJCQlsYXJnZXN0UCA9IHByb2JhLCBsYXJnZXN0ID0gczsKKwkJCQlub3JtYWxpemVkQ291bnRlcltzXSA9IHByb2JhOworCQkJCXN0aWxsVG9EaXN0cmlidXRlIC09IHByb2JhOworCQkJfQorCQl9CisJCWlmICgtc3RpbGxUb0Rpc3RyaWJ1dGUgPj0gKG5vcm1hbGl6ZWRDb3VudGVyW2xhcmdlc3RdID4+IDEpKSB7CisJCQkvKiBjb3JuZXIgY2FzZSwgbmVlZCBhbm90aGVyIG5vcm1hbGl6YXRpb24gbWV0aG9kICovCisJCQlzaXplX3QgY29uc3QgZXJyb3JDb2RlID0gRlNFX25vcm1hbGl6ZU0yKG5vcm1hbGl6ZWRDb3VudGVyLCB0YWJsZUxvZywgY291bnQsIHRvdGFsLCBtYXhTeW1ib2xWYWx1ZSk7CisJCQlpZiAoRlNFX2lzRXJyb3IoZXJyb3JDb2RlKSkKKwkJCQlyZXR1cm4gZXJyb3JDb2RlOworCQl9IGVsc2UKKwkJCW5vcm1hbGl6ZWRDb3VudGVyW2xhcmdlc3RdICs9IChzaG9ydClzdGlsbFRvRGlzdHJpYnV0ZTsKKwl9CisKKwlyZXR1cm4gdGFibGVMb2c7Cit9CisKKy8qIGZha2UgRlNFX0NUYWJsZSwgZm9yIHJhdyAodW5jb21wcmVzc2VkKSBpbnB1dCAqLworc2l6ZV90IEZTRV9idWlsZENUYWJsZV9yYXcoRlNFX0NUYWJsZSAqY3QsIHVuc2lnbmVkIG5iQml0cykKK3sKKwljb25zdCB1bnNpZ25lZCB0YWJsZVNpemUgPSAxIDw8IG5iQml0czsKKwljb25zdCB1bnNpZ25lZCB0YWJsZU1hc2sgPSB0YWJsZVNpemUgLSAxOworCWNvbnN0IHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlID0gdGFibGVNYXNrOworCXZvaWQgKmNvbnN0IHB0ciA9IGN0OworCVUxNiAqY29uc3QgdGFibGVVMTYgPSAoKFUxNiAqKXB0cikgKyAyOworCXZvaWQgKmNvbnN0IEZTQ1QgPSAoKFUzMiAqKXB0cikgKyAxIC8qIGhlYWRlciAqLyArICh0YWJsZVNpemUgPj4gMSk7IC8qIGFzc3VtcHRpb24gOiB0YWJsZUxvZyA+PSAxICovCisJRlNFX3N5bWJvbENvbXByZXNzaW9uVHJhbnNmb3JtICpjb25zdCBzeW1ib2xUVCA9IChGU0Vfc3ltYm9sQ29tcHJlc3Npb25UcmFuc2Zvcm0gKikoRlNDVCk7CisJdW5zaWduZWQgczsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAobmJCaXRzIDwgMSkKKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOyAvKiBtaW4gc2l6ZSAqLworCisJLyogaGVhZGVyICovCisJdGFibGVVMTZbLTJdID0gKFUxNiluYkJpdHM7CisJdGFibGVVMTZbLTFdID0gKFUxNiltYXhTeW1ib2xWYWx1ZTsKKworCS8qIEJ1aWxkIHRhYmxlICovCisJZm9yIChzID0gMDsgcyA8IHRhYmxlU2l6ZTsgcysrKQorCQl0YWJsZVUxNltzXSA9IChVMTYpKHRhYmxlU2l6ZSArIHMpOworCisJLyogQnVpbGQgU3ltYm9sIFRyYW5zZm9ybWF0aW9uIFRhYmxlICovCisJeworCQljb25zdCBVMzIgZGVsdGFOYkJpdHMgPSAobmJCaXRzIDw8IDE2KSAtICgxIDw8IG5iQml0cyk7CisJCWZvciAocyA9IDA7IHMgPD0gbWF4U3ltYm9sVmFsdWU7IHMrKykgeworCQkJc3ltYm9sVFRbc10uZGVsdGFOYkJpdHMgPSBkZWx0YU5iQml0czsKKwkJCXN5bWJvbFRUW3NdLmRlbHRhRmluZFN0YXRlID0gcyAtIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogZmFrZSBGU0VfQ1RhYmxlLCBmb3IgcmxlIGlucHV0IChhbHdheXMgc2FtZSBzeW1ib2wpICovCitzaXplX3QgRlNFX2J1aWxkQ1RhYmxlX3JsZShGU0VfQ1RhYmxlICpjdCwgQllURSBzeW1ib2xWYWx1ZSkKK3sKKwl2b2lkICpwdHIgPSBjdDsKKwlVMTYgKnRhYmxlVTE2ID0gKChVMTYgKilwdHIpICsgMjsKKwl2b2lkICpGU0NUcHRyID0gKFUzMiAqKXB0ciArIDI7CisJRlNFX3N5bWJvbENvbXByZXNzaW9uVHJhbnNmb3JtICpzeW1ib2xUVCA9IChGU0Vfc3ltYm9sQ29tcHJlc3Npb25UcmFuc2Zvcm0gKilGU0NUcHRyOworCisJLyogaGVhZGVyICovCisJdGFibGVVMTZbLTJdID0gKFUxNikwOworCXRhYmxlVTE2Wy0xXSA9IChVMTYpc3ltYm9sVmFsdWU7CisKKwkvKiBCdWlsZCB0YWJsZSAqLworCXRhYmxlVTE2WzBdID0gMDsKKwl0YWJsZVUxNlsxXSA9IDA7IC8qIGp1c3QgaW4gY2FzZSAqLworCisJLyogQnVpbGQgU3ltYm9sIFRyYW5zZm9ybWF0aW9uIFRhYmxlICovCisJc3ltYm9sVFRbc3ltYm9sVmFsdWVdLmRlbHRhTmJCaXRzID0gMDsKKwlzeW1ib2xUVFtzeW1ib2xWYWx1ZV0uZGVsdGFGaW5kU3RhdGUgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzaXplX3QgRlNFX2NvbXByZXNzX3VzaW5nQ1RhYmxlX2dlbmVyaWModm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgY29uc3QgRlNFX0NUYWJsZSAqY3QsIGNvbnN0IHVuc2lnbmVkIGZhc3QpCit7CisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7CisJY29uc3QgQllURSAqY29uc3QgaWVuZCA9IGlzdGFydCArIHNyY1NpemU7CisJY29uc3QgQllURSAqaXAgPSBpZW5kOworCisJQklUX0NTdHJlYW1fdCBiaXRDOworCUZTRV9DU3RhdGVfdCBDU3RhdGUxLCBDU3RhdGUyOworCisJLyogaW5pdCAqLworCWlmIChzcmNTaXplIDw9IDIpCisJCXJldHVybiAwOworCXsKKwkJc2l6ZV90IGNvbnN0IGluaXRFcnJvciA9IEJJVF9pbml0Q1N0cmVhbSgmYml0QywgZHN0LCBkc3RTaXplKTsKKwkJaWYgKEZTRV9pc0Vycm9yKGluaXRFcnJvcikpCisJCQlyZXR1cm4gMDsgLyogbm90IGVub3VnaCBzcGFjZSBhdmFpbGFibGUgdG8gd3JpdGUgYSBiaXRzdHJlYW0gKi8KKwl9CisKKyNkZWZpbmUgRlNFX0ZMVVNIQklUUyhzKSAoZmFzdCA/IEJJVF9mbHVzaEJpdHNGYXN0KHMpIDogQklUX2ZsdXNoQml0cyhzKSkKKworCWlmIChzcmNTaXplICYgMSkgeworCQlGU0VfaW5pdENTdGF0ZTIoJkNTdGF0ZTEsIGN0LCAqLS1pcCk7CisJCUZTRV9pbml0Q1N0YXRlMigmQ1N0YXRlMiwgY3QsICotLWlwKTsKKwkJRlNFX2VuY29kZVN5bWJvbCgmYml0QywgJkNTdGF0ZTEsICotLWlwKTsKKwkJRlNFX0ZMVVNIQklUUygmYml0Qyk7CisJfSBlbHNlIHsKKwkJRlNFX2luaXRDU3RhdGUyKCZDU3RhdGUyLCBjdCwgKi0taXApOworCQlGU0VfaW5pdENTdGF0ZTIoJkNTdGF0ZTEsIGN0LCAqLS1pcCk7CisJfQorCisJLyogam9pbiB0byBtb2QgNCAqLworCXNyY1NpemUgLT0gMjsKKwlpZiAoKHNpemVvZihiaXRDLmJpdENvbnRhaW5lcikgKiA4ID4gRlNFX01BWF9UQUJMRUxPRyAqIDQgKyA3KSAmJiAoc3JjU2l6ZSAmIDIpKSB7IC8qIHRlc3QgYml0IDIgKi8KKwkJRlNFX2VuY29kZVN5bWJvbCgmYml0QywgJkNTdGF0ZTIsICotLWlwKTsKKwkJRlNFX2VuY29kZVN5bWJvbCgmYml0QywgJkNTdGF0ZTEsICotLWlwKTsKKwkJRlNFX0ZMVVNIQklUUygmYml0Qyk7CisJfQorCisJLyogMiBvciA0IGVuY29kaW5nIHBlciBsb29wICovCisJd2hpbGUgKGlwID4gaXN0YXJ0KSB7CisKKwkJRlNFX2VuY29kZVN5bWJvbCgmYml0QywgJkNTdGF0ZTIsICotLWlwKTsKKworCQlpZiAoc2l6ZW9mKGJpdEMuYml0Q29udGFpbmVyKSAqIDggPCBGU0VfTUFYX1RBQkxFTE9HICogMiArIDcpIC8qIHRoaXMgdGVzdCBtdXN0IGJlIHN0YXRpYyAqLworCQkJRlNFX0ZMVVNIQklUUygmYml0Qyk7CisKKwkJRlNFX2VuY29kZVN5bWJvbCgmYml0QywgJkNTdGF0ZTEsICotLWlwKTsKKworCQlpZiAoc2l6ZW9mKGJpdEMuYml0Q29udGFpbmVyKSAqIDggPiBGU0VfTUFYX1RBQkxFTE9HICogNCArIDcpIHsgLyogdGhpcyB0ZXN0IG11c3QgYmUgc3RhdGljICovCisJCQlGU0VfZW5jb2RlU3ltYm9sKCZiaXRDLCAmQ1N0YXRlMiwgKi0taXApOworCQkJRlNFX2VuY29kZVN5bWJvbCgmYml0QywgJkNTdGF0ZTEsICotLWlwKTsKKwkJfQorCisJCUZTRV9GTFVTSEJJVFMoJmJpdEMpOworCX0KKworCUZTRV9mbHVzaENTdGF0ZSgmYml0QywgJkNTdGF0ZTIpOworCUZTRV9mbHVzaENTdGF0ZSgmYml0QywgJkNTdGF0ZTEpOworCXJldHVybiBCSVRfY2xvc2VDU3RyZWFtKCZiaXRDKTsKK30KKworc2l6ZV90IEZTRV9jb21wcmVzc191c2luZ0NUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBGU0VfQ1RhYmxlICpjdCkKK3sKKwl1bnNpZ25lZCBjb25zdCBmYXN0ID0gKGRzdFNpemUgPj0gRlNFX0JMT0NLQk9VTkQoc3JjU2l6ZSkpOworCisJaWYgKGZhc3QpCisJCXJldHVybiBGU0VfY29tcHJlc3NfdXNpbmdDVGFibGVfZ2VuZXJpYyhkc3QsIGRzdFNpemUsIHNyYywgc3JjU2l6ZSwgY3QsIDEpOworCWVsc2UKKwkJcmV0dXJuIEZTRV9jb21wcmVzc191c2luZ0NUYWJsZV9nZW5lcmljKGRzdCwgZHN0U2l6ZSwgc3JjLCBzcmNTaXplLCBjdCwgMCk7Cit9CisKK3NpemVfdCBGU0VfY29tcHJlc3NCb3VuZChzaXplX3Qgc2l6ZSkgeyByZXR1cm4gRlNFX0NPTVBSRVNTQk9VTkQoc2l6ZSk7IH0KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZnNlX2RlY29tcHJlc3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvZnNlX2RlY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQzMDBlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9mc2VfZGVjb21wcmVzcy5jCkBAIC0wLDAgKzEsMzMyIEBACisvKgorICogRlNFIDogRmluaXRlIFN0YXRlIEVudHJvcHkgZGVjb2RlcgorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTUsIFlhbm4gQ29sbGV0LgorICoKKyAqIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QKKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UKKyAqICgiQlNEIikuCisgKgorICogWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICogLSBTb3VyY2UgcmVwb3NpdG9yeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9DeWFuNDk3My9GaW5pdGVTdGF0ZUVudHJvcHkKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQ29tcGlsZXIgc3BlY2lmaWNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGT1JDRV9JTkxJTkUgc3RhdGljIF9fYWx3YXlzX2lubGluZQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSW5jbHVkZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiYml0c3RyZWFtLmgiCisjaW5jbHVkZSAiZnNlLmgiCisjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4gLyogbWVtY3B5LCBtZW1zZXQgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEVycm9yIE1hbmFnZW1lbnQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZTRV9pc0Vycm9yIEVSUl9pc0Vycm9yCisjZGVmaW5lIEZTRV9TVEFUSUNfQVNTRVJUKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZW51bSB7IEZTRV9zdGF0aWNfYXNzZXJ0ID0gMSAvIChpbnQpKCEhKGMpKSB9OyBcCisJfSAvKiB1c2Ugb25seSAqYWZ0ZXIqIHZhcmlhYmxlIGRlY2xhcmF0aW9ucyAqLworCisvKiBjaGVjayBhbmQgZm9yd2FyZCBlcnJvciBjb2RlICovCisjZGVmaW5lIENIRUNLX0YoZikgICAgICAgICAgICAgICAgICBcCisJeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJc2l6ZV90IGNvbnN0IGUgPSBmOyBcCisJCWlmIChGU0VfaXNFcnJvcihlKSkgXAorCQkJcmV0dXJuIGU7ICAgXAorCX0KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFRlbXBsYXRlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgIGRlc2lnbmVkIHRvIGJlIGluY2x1ZGVkCisgIGZvciB0eXBlLXNwZWNpZmljIGZ1bmN0aW9ucyAodGVtcGxhdGUgZW11bGF0aW9uIGluIEMpCisgIE9iamVjdGl2ZSBpcyB0byB3cml0ZSB0aGVzZSBmdW5jdGlvbnMgb25seSBvbmNlLCBmb3IgaW1wcm92ZWQgbWFpbnRlbmFuY2UKKyovCisKKy8qIHNhZmV0eSBjaGVja3MgKi8KKyNpZm5kZWYgRlNFX0ZVTkNUSU9OX0VYVEVOU0lPTgorI2Vycm9yICJGU0VfRlVOQ1RJT05fRVhURU5TSU9OIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorI2lmbmRlZiBGU0VfRlVOQ1RJT05fVFlQRQorI2Vycm9yICJGU0VfRlVOQ1RJT05fVFlQRSBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworLyogRnVuY3Rpb24gbmFtZXMgKi8KKyNkZWZpbmUgRlNFX0NBVChYLCBZKSBYIyNZCisjZGVmaW5lIEZTRV9GVU5DVElPTl9OQU1FKFgsIFkpIEZTRV9DQVQoWCwgWSkKKyNkZWZpbmUgRlNFX1RZUEVfTkFNRShYLCBZKSBGU0VfQ0FUKFgsIFkpCisKKy8qIEZ1bmN0aW9uIHRlbXBsYXRlcyAqLworCitzaXplX3QgRlNFX2J1aWxkRFRhYmxlX3drc3AoRlNFX0RUYWJsZSAqZHQsIGNvbnN0IHNob3J0ICpub3JtYWxpemVkQ291bnRlciwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIHRhYmxlTG9nLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCXZvaWQgKmNvbnN0IHRkUHRyID0gZHQgKyAxOyAvKiBiZWNhdXNlICpkdCBpcyB1bnNpZ25lZCwgMzItYml0cyBhbGlnbmVkIG9uIDMyLWJpdHMgKi8KKwlGU0VfREVDT0RFX1RZUEUgKmNvbnN0IHRhYmxlRGVjb2RlID0gKEZTRV9ERUNPREVfVFlQRSAqKSh0ZFB0cik7CisJVTE2ICpzeW1ib2xOZXh0ID0gKFUxNiAqKXdvcmtzcGFjZTsKKworCVUzMiBjb25zdCBtYXhTVjEgPSBtYXhTeW1ib2xWYWx1ZSArIDE7CisJVTMyIGNvbnN0IHRhYmxlU2l6ZSA9IDEgPDwgdGFibGVMb2c7CisJVTMyIGhpZ2hUaHJlc2hvbGQgPSB0YWJsZVNpemUgLSAxOworCisJLyogU2FuaXR5IENoZWNrcyAqLworCWlmICh3b3Jrc3BhY2VTaXplIDwgc2l6ZW9mKFUxNikgKiAoRlNFX01BWF9TWU1CT0xfVkFMVUUgKyAxKSkKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsKKwlpZiAobWF4U3ltYm9sVmFsdWUgPiBGU0VfTUFYX1NZTUJPTF9WQUxVRSkKKwkJcmV0dXJuIEVSUk9SKG1heFN5bWJvbFZhbHVlX3Rvb0xhcmdlKTsKKwlpZiAodGFibGVMb2cgPiBGU0VfTUFYX1RBQkxFTE9HKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCisJLyogSW5pdCwgbGF5IGRvd24gbG93cHJvYiBzeW1ib2xzICovCisJeworCQlGU0VfRFRhYmxlSGVhZGVyIERUYWJsZUg7CisJCURUYWJsZUgudGFibGVMb2cgPSAoVTE2KXRhYmxlTG9nOworCQlEVGFibGVILmZhc3RNb2RlID0gMTsKKwkJeworCQkJUzE2IGNvbnN0IGxhcmdlTGltaXQgPSAoUzE2KSgxIDw8ICh0YWJsZUxvZyAtIDEpKTsKKwkJCVUzMiBzOworCQkJZm9yIChzID0gMDsgcyA8IG1heFNWMTsgcysrKSB7CisJCQkJaWYgKG5vcm1hbGl6ZWRDb3VudGVyW3NdID09IC0xKSB7CisJCQkJCXRhYmxlRGVjb2RlW2hpZ2hUaHJlc2hvbGQtLV0uc3ltYm9sID0gKEZTRV9GVU5DVElPTl9UWVBFKXM7CisJCQkJCXN5bWJvbE5leHRbc10gPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChub3JtYWxpemVkQ291bnRlcltzXSA+PSBsYXJnZUxpbWl0KQorCQkJCQkJRFRhYmxlSC5mYXN0TW9kZSA9IDA7CisJCQkJCXN5bWJvbE5leHRbc10gPSBub3JtYWxpemVkQ291bnRlcltzXTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbWVtY3B5KGR0LCAmRFRhYmxlSCwgc2l6ZW9mKERUYWJsZUgpKTsKKwl9CisKKwkvKiBTcHJlYWQgc3ltYm9scyAqLworCXsKKwkJVTMyIGNvbnN0IHRhYmxlTWFzayA9IHRhYmxlU2l6ZSAtIDE7CisJCVUzMiBjb25zdCBzdGVwID0gRlNFX1RBQkxFU1RFUCh0YWJsZVNpemUpOworCQlVMzIgcywgcG9zaXRpb24gPSAwOworCQlmb3IgKHMgPSAwOyBzIDwgbWF4U1YxOyBzKyspIHsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IG5vcm1hbGl6ZWRDb3VudGVyW3NdOyBpKyspIHsKKwkJCQl0YWJsZURlY29kZVtwb3NpdGlvbl0uc3ltYm9sID0gKEZTRV9GVU5DVElPTl9UWVBFKXM7CisJCQkJcG9zaXRpb24gPSAocG9zaXRpb24gKyBzdGVwKSAmIHRhYmxlTWFzazsKKwkJCQl3aGlsZSAocG9zaXRpb24gPiBoaWdoVGhyZXNob2xkKQorCQkJCQlwb3NpdGlvbiA9IChwb3NpdGlvbiArIHN0ZXApICYgdGFibGVNYXNrOyAvKiBsb3dwcm9iIGFyZWEgKi8KKwkJCX0KKwkJfQorCQlpZiAocG9zaXRpb24gIT0gMCkKKwkJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogcG9zaXRpb24gbXVzdCByZWFjaCBhbGwgY2VsbHMgb25jZSwgb3RoZXJ3aXNlIG5vcm1hbGl6ZWRDb3VudGVyIGlzIGluY29ycmVjdCAqLworCX0KKworCS8qIEJ1aWxkIERlY29kaW5nIHRhYmxlICovCisJeworCQlVMzIgdTsKKwkJZm9yICh1ID0gMDsgdSA8IHRhYmxlU2l6ZTsgdSsrKSB7CisJCQlGU0VfRlVOQ1RJT05fVFlQRSBjb25zdCBzeW1ib2wgPSAoRlNFX0ZVTkNUSU9OX1RZUEUpKHRhYmxlRGVjb2RlW3VdLnN5bWJvbCk7CisJCQlVMTYgbmV4dFN0YXRlID0gc3ltYm9sTmV4dFtzeW1ib2xdKys7CisJCQl0YWJsZURlY29kZVt1XS5uYkJpdHMgPSAoQllURSkodGFibGVMb2cgLSBCSVRfaGlnaGJpdDMyKChVMzIpbmV4dFN0YXRlKSk7CisJCQl0YWJsZURlY29kZVt1XS5uZXdTdGF0ZSA9IChVMTYpKChuZXh0U3RhdGUgPDwgdGFibGVEZWNvZGVbdV0ubmJCaXRzKSAtIHRhYmxlU2l6ZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVjb21wcmVzc2lvbiAoQnl0ZSBzeW1ib2xzKQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc2l6ZV90IEZTRV9idWlsZERUYWJsZV9ybGUoRlNFX0RUYWJsZSAqZHQsIEJZVEUgc3ltYm9sVmFsdWUpCit7CisJdm9pZCAqcHRyID0gZHQ7CisJRlNFX0RUYWJsZUhlYWRlciAqY29uc3QgRFRhYmxlSCA9IChGU0VfRFRhYmxlSGVhZGVyICopcHRyOworCXZvaWQgKmRQdHIgPSBkdCArIDE7CisJRlNFX2RlY29kZV90ICpjb25zdCBjZWxsID0gKEZTRV9kZWNvZGVfdCAqKWRQdHI7CisKKwlEVGFibGVILT50YWJsZUxvZyA9IDA7CisJRFRhYmxlSC0+ZmFzdE1vZGUgPSAwOworCisJY2VsbC0+bmV3U3RhdGUgPSAwOworCWNlbGwtPnN5bWJvbCA9IHN5bWJvbFZhbHVlOworCWNlbGwtPm5iQml0cyA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc2l6ZV90IEZTRV9idWlsZERUYWJsZV9yYXcoRlNFX0RUYWJsZSAqZHQsIHVuc2lnbmVkIG5iQml0cykKK3sKKwl2b2lkICpwdHIgPSBkdDsKKwlGU0VfRFRhYmxlSGVhZGVyICpjb25zdCBEVGFibGVIID0gKEZTRV9EVGFibGVIZWFkZXIgKilwdHI7CisJdm9pZCAqZFB0ciA9IGR0ICsgMTsKKwlGU0VfZGVjb2RlX3QgKmNvbnN0IGRpbmZvID0gKEZTRV9kZWNvZGVfdCAqKWRQdHI7CisJY29uc3QgdW5zaWduZWQgdGFibGVTaXplID0gMSA8PCBuYkJpdHM7CisJY29uc3QgdW5zaWduZWQgdGFibGVNYXNrID0gdGFibGVTaXplIC0gMTsKKwljb25zdCB1bnNpZ25lZCBtYXhTVjEgPSB0YWJsZU1hc2sgKyAxOworCXVuc2lnbmVkIHM7CisKKwkvKiBTYW5pdHkgY2hlY2tzICovCisJaWYgKG5iQml0cyA8IDEpCisJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogbWluIHNpemUgKi8KKworCS8qIEJ1aWxkIERlY29kaW5nIFRhYmxlICovCisJRFRhYmxlSC0+dGFibGVMb2cgPSAoVTE2KW5iQml0czsKKwlEVGFibGVILT5mYXN0TW9kZSA9IDE7CisJZm9yIChzID0gMDsgcyA8IG1heFNWMTsgcysrKSB7CisJCWRpbmZvW3NdLm5ld1N0YXRlID0gMDsKKwkJZGluZm9bc10uc3ltYm9sID0gKEJZVEUpczsKKwkJZGluZm9bc10ubmJCaXRzID0gKEJZVEUpbmJCaXRzOworCX0KKworCXJldHVybiAwOworfQorCitGT1JDRV9JTkxJTkUgc2l6ZV90IEZTRV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlX2dlbmVyaWModm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBGU0VfRFRhYmxlICpkdCwKKwkJCQkJCSAgICAgICBjb25zdCB1bnNpZ25lZCBmYXN0KQoreworCUJZVEUgKmNvbnN0IG9zdGFydCA9IChCWVRFICopZHN0OworCUJZVEUgKm9wID0gb3N0YXJ0OworCUJZVEUgKmNvbnN0IG9tYXggPSBvcCArIG1heERzdFNpemU7CisJQllURSAqY29uc3Qgb2xpbWl0ID0gb21heCAtIDM7CisKKwlCSVRfRFN0cmVhbV90IGJpdEQ7CisJRlNFX0RTdGF0ZV90IHN0YXRlMTsKKwlGU0VfRFN0YXRlX3Qgc3RhdGUyOworCisJLyogSW5pdCAqLworCUNIRUNLX0YoQklUX2luaXREU3RyZWFtKCZiaXRELCBjU3JjLCBjU3JjU2l6ZSkpOworCisJRlNFX2luaXREU3RhdGUoJnN0YXRlMSwgJmJpdEQsIGR0KTsKKwlGU0VfaW5pdERTdGF0ZSgmc3RhdGUyLCAmYml0RCwgZHQpOworCisjZGVmaW5lIEZTRV9HRVRTWU1CT0woc3RhdGVQdHIpIGZhc3QgPyBGU0VfZGVjb2RlU3ltYm9sRmFzdChzdGF0ZVB0ciwgJmJpdEQpIDogRlNFX2RlY29kZVN5bWJvbChzdGF0ZVB0ciwgJmJpdEQpCisKKwkvKiA0IHN5bWJvbHMgcGVyIGxvb3AgKi8KKwlmb3IgKDsgKEJJVF9yZWxvYWREU3RyZWFtKCZiaXREKSA9PSBCSVRfRFN0cmVhbV91bmZpbmlzaGVkKSAmIChvcCA8IG9saW1pdCk7IG9wICs9IDQpIHsKKwkJb3BbMF0gPSBGU0VfR0VUU1lNQk9MKCZzdGF0ZTEpOworCisJCWlmIChGU0VfTUFYX1RBQkxFTE9HICogMiArIDcgPiBzaXplb2YoYml0RC5iaXRDb250YWluZXIpICogOCkgLyogVGhpcyB0ZXN0IG11c3QgYmUgc3RhdGljICovCisJCQlCSVRfcmVsb2FkRFN0cmVhbSgmYml0RCk7CisKKwkJb3BbMV0gPSBGU0VfR0VUU1lNQk9MKCZzdGF0ZTIpOworCisJCWlmIChGU0VfTUFYX1RBQkxFTE9HICogNCArIDcgPiBzaXplb2YoYml0RC5iaXRDb250YWluZXIpICogOCkgLyogVGhpcyB0ZXN0IG11c3QgYmUgc3RhdGljICovCisJCXsKKwkJCWlmIChCSVRfcmVsb2FkRFN0cmVhbSgmYml0RCkgPiBCSVRfRFN0cmVhbV91bmZpbmlzaGVkKSB7CisJCQkJb3AgKz0gMjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCW9wWzJdID0gRlNFX0dFVFNZTUJPTCgmc3RhdGUxKTsKKworCQlpZiAoRlNFX01BWF9UQUJMRUxPRyAqIDIgKyA3ID4gc2l6ZW9mKGJpdEQuYml0Q29udGFpbmVyKSAqIDgpIC8qIFRoaXMgdGVzdCBtdXN0IGJlIHN0YXRpYyAqLworCQkJQklUX3JlbG9hZERTdHJlYW0oJmJpdEQpOworCisJCW9wWzNdID0gRlNFX0dFVFNZTUJPTCgmc3RhdGUyKTsKKwl9CisKKwkvKiB0YWlsICovCisJLyogbm90ZSA6IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREKSA+PSBGU0VfRFN0cmVhbV9wYXJ0aWFsbHlGaWxsZWQ7IEVuZHMgYXQgZXhhY3RseSBCSVRfRFN0cmVhbV9jb21wbGV0ZWQgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAob3AgPiAob21heCAtIDIpKQorCQkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOworCQkqb3ArKyA9IEZTRV9HRVRTWU1CT0woJnN0YXRlMSk7CisJCWlmIChCSVRfcmVsb2FkRFN0cmVhbSgmYml0RCkgPT0gQklUX0RTdHJlYW1fb3ZlcmZsb3cpIHsKKwkJCSpvcCsrID0gRlNFX0dFVFNZTUJPTCgmc3RhdGUyKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG9wID4gKG9tYXggLSAyKSkKKwkJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsKKwkJKm9wKysgPSBGU0VfR0VUU1lNQk9MKCZzdGF0ZTIpOworCQlpZiAoQklUX3JlbG9hZERTdHJlYW0oJmJpdEQpID09IEJJVF9EU3RyZWFtX292ZXJmbG93KSB7CisJCQkqb3ArKyA9IEZTRV9HRVRTWU1CT0woJnN0YXRlMSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBvcCAtIG9zdGFydDsKK30KKworc2l6ZV90IEZTRV9kZWNvbXByZXNzX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IG9yaWdpbmFsU2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBGU0VfRFRhYmxlICpkdCkKK3sKKwljb25zdCB2b2lkICpwdHIgPSBkdDsKKwljb25zdCBGU0VfRFRhYmxlSGVhZGVyICpEVGFibGVIID0gKGNvbnN0IEZTRV9EVGFibGVIZWFkZXIgKilwdHI7CisJY29uc3QgVTMyIGZhc3RNb2RlID0gRFRhYmxlSC0+ZmFzdE1vZGU7CisKKwkvKiBzZWxlY3QgZmFzdCBtb2RlIChzdGF0aWMpICovCisJaWYgKGZhc3RNb2RlKQorCQlyZXR1cm4gRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGVfZ2VuZXJpYyhkc3QsIG9yaWdpbmFsU2l6ZSwgY1NyYywgY1NyY1NpemUsIGR0LCAxKTsKKwlyZXR1cm4gRlNFX2RlY29tcHJlc3NfdXNpbmdEVGFibGVfZ2VuZXJpYyhkc3QsIG9yaWdpbmFsU2l6ZSwgY1NyYywgY1NyY1NpemUsIGR0LCAwKTsKK30KKworc2l6ZV90IEZTRV9kZWNvbXByZXNzX3drc3Aodm9pZCAqZHN0LCBzaXplX3QgZHN0Q2FwYWNpdHksIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdW5zaWduZWQgbWF4TG9nLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICopY1NyYzsKKwljb25zdCBCWVRFICppcCA9IGlzdGFydDsKKwl1bnNpZ25lZCB0YWJsZUxvZzsKKwl1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSA9IEZTRV9NQVhfU1lNQk9MX1ZBTFVFOworCXNpemVfdCBOQ291bnRMZW5ndGg7CisKKwlGU0VfRFRhYmxlICpkdDsKKwlzaG9ydCAqY291bnRpbmc7CisJc2l6ZV90IHNwYWNlVXNlZDMyID0gMDsKKworCUZTRV9TVEFUSUNfQVNTRVJUKHNpemVvZihGU0VfRFRhYmxlKSA9PSBzaXplb2YoVTMyKSk7CisKKwlkdCA9IChGU0VfRFRhYmxlICopKChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMik7CisJc3BhY2VVc2VkMzIgKz0gRlNFX0RUQUJMRV9TSVpFX1UzMihtYXhMb2cpOworCWNvdW50aW5nID0gKHNob3J0ICopKChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMik7CisJc3BhY2VVc2VkMzIgKz0gQUxJR04oc2l6ZW9mKHNob3J0KSAqIChGU0VfTUFYX1NZTUJPTF9WQUxVRSArIDEpLCBzaXplb2YoVTMyKSkgPj4gMjsKKworCWlmICgoc3BhY2VVc2VkMzIgPDwgMikgPiB3b3Jrc3BhY2VTaXplKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCXdvcmtzcGFjZSA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwl3b3Jrc3BhY2VTaXplIC09IChzcGFjZVVzZWQzMiA8PCAyKTsKKworCS8qIG5vcm1hbCBGU0UgZGVjb2RpbmcgbW9kZSAqLworCU5Db3VudExlbmd0aCA9IEZTRV9yZWFkTkNvdW50KGNvdW50aW5nLCAmbWF4U3ltYm9sVmFsdWUsICZ0YWJsZUxvZywgaXN0YXJ0LCBjU3JjU2l6ZSk7CisJaWYgKEZTRV9pc0Vycm9yKE5Db3VudExlbmd0aCkpCisJCXJldHVybiBOQ291bnRMZW5ndGg7CisJLy8gaWYgKE5Db3VudExlbmd0aCA+PSBjU3JjU2l6ZSkgcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOyAgIC8qIHRvbyBzbWFsbCBpbnB1dCBzaXplOyBzdXBwb3NlZCB0byBiZSBhbHJlYWR5IGNoZWNrZWQgaW4gTkNvdW50TGVuZ3RoLCBvbmx5IHJlbWFpbmluZworCS8vIGNhc2UgOiBOQ291bnRMZW5ndGg9PWNTcmNTaXplICovCisJaWYgKHRhYmxlTG9nID4gbWF4TG9nKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCWlwICs9IE5Db3VudExlbmd0aDsKKwljU3JjU2l6ZSAtPSBOQ291bnRMZW5ndGg7CisKKwlDSEVDS19GKEZTRV9idWlsZERUYWJsZV93a3NwKGR0LCBjb3VudGluZywgbWF4U3ltYm9sVmFsdWUsIHRhYmxlTG9nLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpKTsKKworCXJldHVybiBGU0VfZGVjb21wcmVzc191c2luZ0RUYWJsZShkc3QsIGRzdENhcGFjaXR5LCBpcCwgY1NyY1NpemUsIGR0KTsgLyogYWx3YXlzIHJldHVybiwgZXZlbiBpZiBpdCBpcyBhbiBlcnJvciBjb2RlICovCit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL2h1Zi5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9odWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQzZGEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9odWYuaApAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIEh1ZmZtYW4gY29kZXIsIHBhcnQgb2YgTmV3IEdlbmVyYXRpb24gRW50cm9weSBsaWJyYXJ5CisgKiBoZWFkZXIgZmlsZQorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYsIFlhbm4gQ29sbGV0LgorICoKKyAqIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QKKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UKKyAqICgiQlNEIikuCisgKgorICogWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICogLSBTb3VyY2UgcmVwb3NpdG9yeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9DeWFuNDk3My9GaW5pdGVTdGF0ZUVudHJvcHkKKyAqLworI2lmbmRlZiBIVUZfSF8yOTg3MzQyMzQKKyNkZWZpbmUgSFVGX0hfMjk4NzM0MjM0CisKKy8qICoqKiBEZXBlbmRlbmNpZXMgKioqICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4gLyogc2l6ZV90ICovCisKKy8qICoqKiAgIFRvb2wgZnVuY3Rpb25zICoqKiAqLworI2RlZmluZSBIVUZfQkxPQ0tTSVpFX01BWCAoMTI4ICogMTAyNCkgLyoqPCBtYXhpbXVtIGlucHV0IHNpemUgZm9yIGEgc2luZ2xlIGJsb2NrIGNvbXByZXNzZWQgd2l0aCBIVUZfY29tcHJlc3MgKi8KK3NpemVfdCBIVUZfY29tcHJlc3NCb3VuZChzaXplX3Qgc2l6ZSk7IC8qKjwgbWF4aW11bSBjb21wcmVzc2VkIHNpemUgKHdvcnN0IGNhc2UpICovCisKKy8qIEVycm9yIE1hbmFnZW1lbnQgKi8KK3Vuc2lnbmVkIEhVRl9pc0Vycm9yKHNpemVfdCBjb2RlKTsgLyoqPCB0ZWxscyBpZiBhIHJldHVybiB2YWx1ZSBpcyBhbiBlcnJvciBjb2RlICovCisKKy8qICoqKiAgIEFkdmFuY2VkIGZ1bmN0aW9uICAgKioqICovCisKKy8qKiBIVUZfY29tcHJlc3M0WF93a3NwKCkgOgorKiAgIFNhbWUgYXMgSFVGX2NvbXByZXNzMigpLCBidXQgdXNlcyBleHRlcm5hbGx5IGFsbG9jYXRlZCBgd29ya1NwYWNlYCwgd2hpY2ggbXVzdCBiZSBhIHRhYmxlIG9mID49IDEwMjQgdW5zaWduZWQgKi8KK3NpemVfdCBIVUZfY29tcHJlc3M0WF93a3NwKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywgdm9pZCAqd29ya1NwYWNlLAorCQkJICAgc2l6ZV90IHdrc3BTaXplKTsgLyoqPCBgd29ya1NwYWNlYCBtdXN0IGJlIGEgdGFibGUgb2YgYXQgbGVhc3QgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiB1bnNpZ25lZCAqLworCisvKiAqKiogRGVwZW5kZW5jaWVzICoqKiAqLworI2luY2x1ZGUgIm1lbS5oIiAvKiBVMzIgKi8KKworLyogKioqIENvbnN0YW50cyAqKiogKi8KKyNkZWZpbmUgSFVGX1RBQkxFTE9HX01BWCAxMiAgICAgLyogbWF4IGNvbmZpZ3VyZWQgdGFibGVMb2cgKGZvciBzdGF0aWMgYWxsb2NhdGlvbik7IGNhbiBiZSBtb2RpZmllZCB1cCB0byBIVUZfQUJTT0xVVEVNQVhfVEFCTEVMT0cgKi8KKyNkZWZpbmUgSFVGX1RBQkxFTE9HX0RFRkFVTFQgMTEgLyogdGFibGVMb2cgYnkgZGVmYXVsdCwgd2hlbiBub3Qgc3BlY2lmaWVkICovCisjZGVmaW5lIEhVRl9TWU1CT0xWQUxVRV9NQVggMjU1CisKKyNkZWZpbmUgSFVGX1RBQkxFTE9HX0FCU09MVVRFTUFYIDE1IC8qIGFic29sdXRlIGxpbWl0IG9mIEhVRl9NQVhfVEFCTEVMT0cuIEJleW9uZCB0aGF0IHZhbHVlLCBjb2RlIGRvZXMgbm90IHdvcmsgKi8KKyNpZiAoSFVGX1RBQkxFTE9HX01BWCA+IEhVRl9UQUJMRUxPR19BQlNPTFVURU1BWCkKKyNlcnJvciAiSFVGX1RBQkxFTE9HX01BWCBpcyB0b28gbGFyZ2UgISIKKyNlbmRpZgorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBTdGF0aWMgYWxsb2NhdGlvbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogSFVGIGJ1ZmZlciBib3VuZHMgKi8KKyNkZWZpbmUgSFVGX0NUQUJMRUJPVU5EIDEyOQorI2RlZmluZSBIVUZfQkxPQ0tCT1VORChzaXplKSAoc2l6ZSArIChzaXplID4+IDgpICsgOCkJCQkgLyogb25seSB0cnVlIGlmIGluY29tcHJlc3NpYmxlIHByZS1maWx0ZXJlZCB3aXRoIGZhc3QgaGV1cmlzdGljICovCisjZGVmaW5lIEhVRl9DT01QUkVTU0JPVU5EKHNpemUpIChIVUZfQ1RBQkxFQk9VTkQgKyBIVUZfQkxPQ0tCT1VORChzaXplKSkgLyogTWFjcm8gdmVyc2lvbiwgdXNlZnVsIGZvciBzdGF0aWMgYWxsb2NhdGlvbiAqLworCisvKiBzdGF0aWMgYWxsb2NhdGlvbiBvZiBIVUYncyBDb21wcmVzc2lvbiBUYWJsZSAqLworI2RlZmluZSBIVUZfQ1JFQVRFX1NUQVRJQ19DVEFCTEUobmFtZSwgbWF4U3ltYm9sVmFsdWUpIFwKKwlVMzIgbmFtZSMjaGJbbWF4U3ltYm9sVmFsdWUgKyAxXTsgICAgICAgICAgICAgIFwKKwl2b2lkICpuYW1lIyNodiA9ICYobmFtZSMjaGIpOyAgICAgICAgICAgICAgICAgIFwKKwlIVUZfQ0VsdCAqbmFtZSA9IChIVUZfQ0VsdCAqKShuYW1lIyNodikgLyogbm8gZmluYWwgOyAqLworCisvKiBzdGF0aWMgYWxsb2NhdGlvbiBvZiBIVUYncyBEVGFibGUgKi8KK3R5cGVkZWYgVTMyIEhVRl9EVGFibGU7CisjZGVmaW5lIEhVRl9EVEFCTEVfU0laRShtYXhUYWJsZUxvZykgKDEgKyAoMSA8PCAobWF4VGFibGVMb2cpKSkKKyNkZWZpbmUgSFVGX0NSRUFURV9TVEFUSUNfRFRBQkxFWDIoRFRhYmxlLCBtYXhUYWJsZUxvZykgSFVGX0RUYWJsZSBEVGFibGVbSFVGX0RUQUJMRV9TSVpFKChtYXhUYWJsZUxvZyktMSldID0geygoVTMyKSgobWF4VGFibGVMb2cpLTEpICogMHgwMTAwMDAwMSl9CisjZGVmaW5lIEhVRl9DUkVBVEVfU1RBVElDX0RUQUJMRVg0KERUYWJsZSwgbWF4VGFibGVMb2cpIEhVRl9EVGFibGUgRFRhYmxlW0hVRl9EVEFCTEVfU0laRShtYXhUYWJsZUxvZyldID0geygoVTMyKShtYXhUYWJsZUxvZykqMHgwMTAwMDAwMSl9CisKKy8qIFRoZSB3b3Jrc3BhY2UgbXVzdCBoYXZlIGFsaWdubWVudCBhdCBsZWFzdCA0IGFuZCBiZSBhdCBsZWFzdCB0aGlzIGxhcmdlICovCisjZGVmaW5lIEhVRl9DT01QUkVTU19XT1JLU1BBQ0VfU0laRSAoNiA8PCAxMCkKKyNkZWZpbmUgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiAoSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFIC8gc2l6ZW9mKFUzMikpCisKKy8qIFRoZSB3b3Jrc3BhY2UgbXVzdCBoYXZlIGFsaWdubWVudCBhdCBsZWFzdCA0IGFuZCBiZSBhdCBsZWFzdCB0aGlzIGxhcmdlICovCisjZGVmaW5lIEhVRl9ERUNPTVBSRVNTX1dPUktTUEFDRV9TSVpFICgzIDw8IDEwKQorI2RlZmluZSBIVUZfREVDT01QUkVTU19XT1JLU1BBQ0VfU0laRV9VMzIgKEhVRl9ERUNPTVBSRVNTX1dPUktTUEFDRV9TSVpFIC8gc2l6ZW9mKFUzMikpCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEFkdmFuY2VkIGRlY29tcHJlc3Npb24gZnVuY3Rpb25zCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsgLyoqPCBkZWNvZGVzIFJMRSBhbmQgdW5jb21wcmVzc2VkICovCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WF9odWZPbmx5X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsCisJCQkJc2l6ZV90IHdvcmtzcGFjZVNpemUpOwkJCQkJCQkgICAgICAgLyoqPCBjb25zaWRlcnMgUkxFIGFuZCB1bmNvbXByZXNzZWQgYXMgZXJyb3JzICovCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WDJfREN0eF93a3NwKEhVRl9EVGFibGUgKmRjdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLAorCQkJCSAgIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsgLyoqPCBzaW5nbGUtc3ltYm9sIGRlY29kZXIgKi8KK3NpemVfdCBIVUZfZGVjb21wcmVzczRYNF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsCisJCQkJICAgc2l6ZV90IHdvcmtzcGFjZVNpemUpOyAvKio8IGRvdWJsZS1zeW1ib2xzIGRlY29kZXIgKi8KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgSFVGIGRldGFpbGVkIEFQSQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyohCitIVUZfY29tcHJlc3MoKSBkb2VzIHRoZSBmb2xsb3dpbmc6CisxLiBjb3VudCBzeW1ib2wgb2NjdXJyZW5jZSBmcm9tIHNvdXJjZVtdIGludG8gdGFibGUgY291bnRbXSB1c2luZyBGU0VfY291bnQoKQorMi4gKG9wdGlvbmFsKSByZWZpbmUgdGFibGVMb2cgdXNpbmcgSFVGX29wdGltYWxUYWJsZUxvZygpCiszLiBidWlsZCBIdWZmbWFuIHRhYmxlIGZyb20gY291bnQgdXNpbmcgSFVGX2J1aWxkQ1RhYmxlKCkKKzQuIHNhdmUgSHVmZm1hbiB0YWJsZSB0byBtZW1vcnkgYnVmZmVyIHVzaW5nIEhVRl93cml0ZUNUYWJsZV93a3NwKCkKKzUuIGVuY29kZSB0aGUgZGF0YSBzdHJlYW0gdXNpbmcgSFVGX2NvbXByZXNzNFhfdXNpbmdDVGFibGUoKQorCitUaGUgZm9sbG93aW5nIEFQSSBhbGxvd3MgdGFyZ2V0aW5nIHNwZWNpZmljIHN1Yi1mdW5jdGlvbnMgZm9yIGFkdmFuY2VkIHRhc2tzLgorRm9yIGV4YW1wbGUsIGl0J3MgcG9zc2libGUgdG8gY29tcHJlc3Mgc2V2ZXJhbCBibG9ja3MgdXNpbmcgdGhlIHNhbWUgJ0NUYWJsZScsCitvciB0byBzYXZlIGFuZCByZWdlbmVyYXRlICdDVGFibGUnIHVzaW5nIGV4dGVybmFsIG1ldGhvZHMuCisqLworLyogRlNFX2NvdW50KCkgOiBmaW5kIGl0IHdpdGhpbiAiZnNlLmgiICovCit1bnNpZ25lZCBIVUZfb3B0aW1hbFRhYmxlTG9nKHVuc2lnbmVkIG1heFRhYmxlTG9nLCBzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUpOwordHlwZWRlZiBzdHJ1Y3QgSFVGX0NFbHRfcyBIVUZfQ0VsdDsgLyogaW5jb21wbGV0ZSB0eXBlICovCitzaXplX3QgSFVGX3dyaXRlQ1RhYmxlX3drc3Aodm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3QgSFVGX0NFbHQgKkNUYWJsZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIGh1ZmZMb2csIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpOworc2l6ZV90IEhVRl9jb21wcmVzczRYX3VzaW5nQ1RhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IEhVRl9DRWx0ICpDVGFibGUpOworCit0eXBlZGVmIGVudW0geworCUhVRl9yZXBlYXRfbm9uZSwgIC8qKjwgQ2Fubm90IHVzZSB0aGUgcHJldmlvdXMgdGFibGUgKi8KKwlIVUZfcmVwZWF0X2NoZWNrLCAvKio8IENhbiB1c2UgdGhlIHByZXZpb3VzIHRhYmxlIGJ1dCBpdCBtdXN0IGJlIGNoZWNrZWQuIE5vdGUgOiBUaGUgcHJldmlvdXMgdGFibGUgbXVzdCBoYXZlIGJlZW4gY29uc3RydWN0ZWQgYnkgSFVGX2NvbXByZXNzezEsCisJCQkgICAgIDR9WF9yZXBlYXQgKi8KKwlIVUZfcmVwZWF0X3ZhbGlkICAvKio8IENhbiB1c2UgdGhlIHByZXZpb3VzIHRhYmxlIGFuZCBpdCBpcyBhc3VtZWQgdG8gYmUgdmFsaWQgKi8KK30gSFVGX3JlcGVhdDsKKy8qKiBIVUZfY29tcHJlc3M0WF9yZXBlYXQoKSA6CisqICAgU2FtZSBhcyBIVUZfY29tcHJlc3M0WF93a3NwKCksIGJ1dCBjb25zaWRlcnMgdXNpbmcgaHVmVGFibGUgaWYgKnJlcGVhdCAhPSBIVUZfcmVwZWF0X25vbmUuCisqICAgSWYgaXQgdXNlcyBodWZUYWJsZSBpdCBkb2VzIG5vdCBtb2RpZnkgaHVmVGFibGUgb3IgcmVwZWF0LgorKiAgIElmIGl0IGRvZXNuJ3QsIGl0IHNldHMgKnJlcGVhdCA9IEhVRl9yZXBlYXRfbm9uZSwgYW5kIGl0IHNldHMgaHVmVGFibGUgdG8gdGhlIHRhYmxlIHVzZWQuCisqICAgSWYgcHJlZmVyUmVwZWF0IHRoZW4gdGhlIG9sZCB0YWJsZSB3aWxsIGFsd2F5cyBiZSB1c2VkIGlmIHZhbGlkLiAqLworc2l6ZV90IEhVRl9jb21wcmVzczRYX3JlcGVhdCh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSwgdW5zaWduZWQgdGFibGVMb2csIHZvaWQgKndvcmtTcGFjZSwKKwkJCSAgICAgc2l6ZV90IHdrc3BTaXplLCBIVUZfQ0VsdCAqaHVmVGFibGUsIEhVRl9yZXBlYXQgKnJlcGVhdCwKKwkJCSAgICAgaW50IHByZWZlclJlcGVhdCk7IC8qKjwgYHdvcmtTcGFjZWAgbXVzdCBiZSBhIHRhYmxlIG9mIGF0IGxlYXN0IEhVRl9DT01QUkVTU19XT1JLU1BBQ0VfU0laRV9VMzIgdW5zaWduZWQgKi8KKworLyoqIEhVRl9idWlsZENUYWJsZV93a3NwKCkgOgorICogIFNhbWUgYXMgSFVGX2J1aWxkQ1RhYmxlKCksIGJ1dCB1c2luZyBleHRlcm5hbGx5IGFsbG9jYXRlZCBzY3JhdGNoIGJ1ZmZlci4KKyAqICBgd29ya1NwYWNlYCBtdXN0IGJlIGFsaWduZWQgb24gNC1ieXRlcyBib3VuZGFyaWVzLCBhbmQgYmUgYXQgbGVhc3QgYXMgbGFyZ2UgYXMgYSB0YWJsZSBvZiAxMDI0IHVuc2lnbmVkLgorICovCitzaXplX3QgSFVGX2J1aWxkQ1RhYmxlX3drc3AoSFVGX0NFbHQgKnRyZWUsIGNvbnN0IFUzMiAqY291bnQsIFUzMiBtYXhTeW1ib2xWYWx1ZSwgVTMyIG1heE5iQml0cywgdm9pZCAqd29ya1NwYWNlLCBzaXplX3Qgd2tzcFNpemUpOworCisvKiEgSFVGX3JlYWRTdGF0cygpIDoKKwlSZWFkIGNvbXBhY3QgSHVmZm1hbiB0cmVlLCBzYXZlZCBieSBIVUZfd3JpdGVDVGFibGUoKS4KKwlgaHVmZldlaWdodGAgaXMgZGVzdGluYXRpb24gYnVmZmVyLgorCUByZXR1cm4gOiBzaXplIHJlYWQgZnJvbSBgc3JjYCAsIG9yIGFuIGVycm9yIENvZGUgLgorCU5vdGUgOiBOZWVkZWQgYnkgSFVGX3JlYWRDVGFibGUoKSBhbmQgSFVGX3JlYWREVGFibGVYbigpIC4gKi8KK3NpemVfdCBIVUZfcmVhZFN0YXRzX3drc3AoQllURSAqaHVmZldlaWdodCwgc2l6ZV90IGh3U2l6ZSwgVTMyICpyYW5rU3RhdHMsIFUzMiAqbmJTeW1ib2xzUHRyLCBVMzIgKnRhYmxlTG9nUHRyLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLAorCQkJICB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsKKworLyoqIEhVRl9yZWFkQ1RhYmxlKCkgOgorKiAgIExvYWRpbmcgYSBDVGFibGUgc2F2ZWQgd2l0aCBIVUZfd3JpdGVDVGFibGUoKSAqLworc2l6ZV90IEhVRl9yZWFkQ1RhYmxlX3drc3AoSFVGX0NFbHQgKkNUYWJsZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpOworCisvKgorSFVGX2RlY29tcHJlc3MoKSBkb2VzIHRoZSBmb2xsb3dpbmc6CisxLiBzZWxlY3QgdGhlIGRlY29tcHJlc3Npb24gYWxnb3JpdGhtIChYMiwgWDQpIGJhc2VkIG9uIHByZS1jb21wdXRlZCBoZXVyaXN0aWNzCisyLiBidWlsZCBIdWZmbWFuIHRhYmxlIGZyb20gc2F2ZSwgdXNpbmcgSFVGX3JlYWREVGFibGVYbigpCiszLiBkZWNvZGUgMSBvciA0IHNlZ21lbnRzIGluIHBhcmFsbGVsIHVzaW5nIEhVRl9kZWNvbXByZXNzU1huX3VzaW5nRFRhYmxlCisqLworCisvKiogSFVGX3NlbGVjdERlY29kZXIoKSA6CisqICAgVGVsbHMgd2hpY2ggZGVjb2RlciBpcyBsaWtlbHkgdG8gZGVjb2RlIGZhc3RlciwKKyogICBiYXNlZCBvbiBhIHNldCBvZiBwcmUtZGV0ZXJtaW5lZCBtZXRyaWNzLgorKiAgIEByZXR1cm4gOiAwPT1IVUZfZGVjb21wcmVzczRYMiwgMT09SFVGX2RlY29tcHJlc3M0WDQgLgorKiAgIEFzc3VtcHRpb24gOiAwIDwgY1NyY1NpemUgPCBkc3RTaXplIDw9IDEyOCBLQiAqLworVTMyIEhVRl9zZWxlY3REZWNvZGVyKHNpemVfdCBkc3RTaXplLCBzaXplX3QgY1NyY1NpemUpOworCitzaXplX3QgSFVGX3JlYWREVGFibGVYMl93a3NwKEhVRl9EVGFibGUgKkRUYWJsZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7CitzaXplX3QgSFVGX3JlYWREVGFibGVYNF93a3NwKEhVRl9EVGFibGUgKkRUYWJsZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7CisKK3NpemVfdCBIVUZfZGVjb21wcmVzczRYX3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKTsKK3NpemVfdCBIVUZfZGVjb21wcmVzczRYMl91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBtYXhEc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSk7CitzaXplX3QgSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpOworCisvKiBzaW5nbGUgc3RyZWFtIHZhcmlhbnRzICovCisKK3NpemVfdCBIVUZfY29tcHJlc3MxWF93a3NwKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywgdm9pZCAqd29ya1NwYWNlLAorCQkJICAgc2l6ZV90IHdrc3BTaXplKTsgLyoqPCBgd29ya1NwYWNlYCBtdXN0IGJlIGEgdGFibGUgb2YgYXQgbGVhc3QgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiB1bnNpZ25lZCAqLworc2l6ZV90IEhVRl9jb21wcmVzczFYX3VzaW5nQ1RhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IEhVRl9DRWx0ICpDVGFibGUpOworLyoqIEhVRl9jb21wcmVzczFYX3JlcGVhdCgpIDoKKyogICBTYW1lIGFzIEhVRl9jb21wcmVzczFYX3drc3AoKSwgYnV0IGNvbnNpZGVycyB1c2luZyBodWZUYWJsZSBpZiAqcmVwZWF0ICE9IEhVRl9yZXBlYXRfbm9uZS4KKyogICBJZiBpdCB1c2VzIGh1ZlRhYmxlIGl0IGRvZXMgbm90IG1vZGlmeSBodWZUYWJsZSBvciByZXBlYXQuCisqICAgSWYgaXQgZG9lc24ndCwgaXQgc2V0cyAqcmVwZWF0ID0gSFVGX3JlcGVhdF9ub25lLCBhbmQgaXQgc2V0cyBodWZUYWJsZSB0byB0aGUgdGFibGUgdXNlZC4KKyogICBJZiBwcmVmZXJSZXBlYXQgdGhlbiB0aGUgb2xkIHRhYmxlIHdpbGwgYWx3YXlzIGJlIHVzZWQgaWYgdmFsaWQuICovCitzaXplX3QgSFVGX2NvbXByZXNzMVhfcmVwZWF0KHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCB0YWJsZUxvZywgdm9pZCAqd29ya1NwYWNlLAorCQkJICAgICBzaXplX3Qgd2tzcFNpemUsIEhVRl9DRWx0ICpodWZUYWJsZSwgSFVGX3JlcGVhdCAqcmVwZWF0LAorCQkJICAgICBpbnQgcHJlZmVyUmVwZWF0KTsgLyoqPCBgd29ya1NwYWNlYCBtdXN0IGJlIGEgdGFibGUgb2YgYXQgbGVhc3QgSFVGX0NPTVBSRVNTX1dPUktTUEFDRV9TSVpFX1UzMiB1bnNpZ25lZCAqLworCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsKK3NpemVfdCBIVUZfZGVjb21wcmVzczFYMl9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsCisJCQkJICAgc2l6ZV90IHdvcmtzcGFjZVNpemUpOyAvKio8IHNpbmdsZS1zeW1ib2wgZGVjb2RlciAqLworc2l6ZV90IEhVRl9kZWNvbXByZXNzMVg0X0RDdHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwKKwkJCQkgICBzaXplX3Qgd29ya3NwYWNlU2l6ZSk7IC8qKjwgZG91YmxlLXN5bWJvbHMgZGVjb2RlciAqLworCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBtYXhEc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsCisJCQkJICAgIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSk7IC8qKjwgYXV0b21hdGljIHNlbGVjdGlvbiBvZiBzaW5nIG9yIGRvdWJsZSBzeW1ib2wgZGVjb2RlciwgYmFzZWQgb24gRFRhYmxlICovCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpOworc2l6ZV90IEhVRl9kZWNvbXByZXNzMVg0X3VzaW5nRFRhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKTsKKworI2VuZGlmIC8qIEhVRl9IXzI5ODczNDIzNCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9odWZfY29tcHJlc3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvaHVmX2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAwNTVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvaHVmX2NvbXByZXNzLmMKQEAgLTAsMCArMSw3NzAgQEAKKy8qCisgKiBIdWZmbWFuIGVuY29kZXIsIHBhcnQgb2YgTmV3IEdlbmVyYXRpb24gRW50cm9weSBsaWJyYXJ5CisgKiBDb3B5cmlnaHQgKEMpIDIwMTMtMjAxNiwgWWFubiBDb2xsZXQuCisgKgorICogQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqCisgKiBZb3UgY2FuIGNvbnRhY3QgdGhlIGF1dGhvciBhdCA6CisgKiAtIFNvdXJjZSByZXBvc2l0b3J5IDogaHR0cHM6Ly9naXRodWIuY29tL0N5YW40OTczL0Zpbml0ZVN0YXRlRW50cm9weQorICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBJbmNsdWRlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJiaXRzdHJlYW0uaCIKKyNpbmNsdWRlICJmc2UuaCIgLyogaGVhZGVyIGNvbXByZXNzaW9uICovCisjaW5jbHVkZSAiaHVmLmgiCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+IC8qIG1lbWNweSwgbWVtc2V0ICovCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBFcnJvciBNYW5hZ2VtZW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBIVUZfU1RBVElDX0FTU0VSVChjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWVudW0geyBIVUZfc3RhdGljX2Fzc2VydCA9IDEgLyAoaW50KSghIShjKSkgfTsgXAorCX0gLyogdXNlIG9ubHkgKmFmdGVyKiB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgKi8KKyNkZWZpbmUgQ0hFQ0tfVl9GKGUsIGYpICAgICBcCisJc2l6ZV90IGNvbnN0IGUgPSBmOyBcCisJaWYgKEVSUl9pc0Vycm9yKGUpKSBcCisJcmV0dXJuIGYKKyNkZWZpbmUgQ0hFQ0tfRihmKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlDSEVDS19WX0YoX3Zhcl9lcnJfXywgZik7IFwKKwl9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBVdGlscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3Vuc2lnbmVkIEhVRl9vcHRpbWFsVGFibGVMb2codW5zaWduZWQgbWF4VGFibGVMb2csIHNpemVfdCBzcmNTaXplLCB1bnNpZ25lZCBtYXhTeW1ib2xWYWx1ZSkKK3sKKwlyZXR1cm4gRlNFX29wdGltYWxUYWJsZUxvZ19pbnRlcm5hbChtYXhUYWJsZUxvZywgc3JjU2l6ZSwgbWF4U3ltYm9sVmFsdWUsIDEpOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBIVUYgOiBIdWZmbWFuIGJsb2NrIGNvbXByZXNzaW9uCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIVUZfY29tcHJlc3NXZWlnaHRzKCkgOgorICogU2FtZSBhcyBGU0VfY29tcHJlc3MoKSwgYnV0IGRlZGljYXRlZCB0byBodWZmMCdzIHdlaWdodHMgY29tcHJlc3Npb24uCisgKiBUaGUgdXNlIGNhc2UgbmVlZHMgbXVjaCBsZXNzIHN0YWNrIG1lbW9yeS4KKyAqIE5vdGUgOiBhbGwgZWxlbWVudHMgd2l0aGluIHdlaWdodFRhYmxlIGFyZSBzdXBwb3NlZCB0byBiZSA8PSBIVUZfVEFCTEVMT0dfTUFYLgorICovCisjZGVmaW5lIE1BWF9GU0VfVEFCTEVMT0dfRk9SX0hVRkZfSEVBREVSIDYKK3NpemVfdCBIVUZfY29tcHJlc3NXZWlnaHRzX3drc3Aodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqd2VpZ2h0VGFibGUsIHNpemVfdCB3dFNpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7CisJQllURSAqb3AgPSBvc3RhcnQ7CisJQllURSAqY29uc3Qgb2VuZCA9IG9zdGFydCArIGRzdFNpemU7CisKKwlVMzIgbWF4U3ltYm9sVmFsdWUgPSBIVUZfVEFCTEVMT0dfTUFYOworCVUzMiB0YWJsZUxvZyA9IE1BWF9GU0VfVEFCTEVMT0dfRk9SX0hVRkZfSEVBREVSOworCisJRlNFX0NUYWJsZSAqQ1RhYmxlOworCVUzMiAqY291bnQ7CisJUzE2ICpub3JtOworCXNpemVfdCBzcGFjZVVzZWQzMiA9IDA7CisKKwlIVUZfU1RBVElDX0FTU0VSVChzaXplb2YoRlNFX0NUYWJsZSkgPT0gc2l6ZW9mKFUzMikpOworCisJQ1RhYmxlID0gKEZTRV9DVGFibGUgKikoKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyKTsKKwlzcGFjZVVzZWQzMiArPSBGU0VfQ1RBQkxFX1NJWkVfVTMyKE1BWF9GU0VfVEFCTEVMT0dfRk9SX0hVRkZfSEVBREVSLCBIVUZfVEFCTEVMT0dfTUFYKTsKKwljb3VudCA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwlzcGFjZVVzZWQzMiArPSBIVUZfVEFCTEVMT0dfTUFYICsgMTsKKwlub3JtID0gKFMxNiAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIpOworCXNwYWNlVXNlZDMyICs9IEFMSUdOKHNpemVvZihTMTYpICogKEhVRl9UQUJMRUxPR19NQVggKyAxKSwgc2l6ZW9mKFUzMikpID4+IDI7CisKKwlpZiAoKHNwYWNlVXNlZDMyIDw8IDIpID4gd29ya3NwYWNlU2l6ZSkKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsKKwl3b3Jrc3BhY2UgPSAoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzI7CisJd29ya3NwYWNlU2l6ZSAtPSAoc3BhY2VVc2VkMzIgPDwgMik7CisKKwkvKiBpbml0IGNvbmRpdGlvbnMgKi8KKwlpZiAod3RTaXplIDw9IDEpCisJCXJldHVybiAwOyAvKiBOb3QgY29tcHJlc3NpYmxlICovCisKKwkvKiBTY2FuIGlucHV0IGFuZCBidWlsZCBzeW1ib2wgc3RhdHMgKi8KKwl7CisJCUNIRUNLX1ZfRihtYXhDb3VudCwgRlNFX2NvdW50X3NpbXBsZShjb3VudCwgJm1heFN5bWJvbFZhbHVlLCB3ZWlnaHRUYWJsZSwgd3RTaXplKSk7CisJCWlmIChtYXhDb3VudCA9PSB3dFNpemUpCisJCQlyZXR1cm4gMTsgLyogb25seSBhIHNpbmdsZSBzeW1ib2wgaW4gc3JjIDogcmxlICovCisJCWlmIChtYXhDb3VudCA9PSAxKQorCQkJcmV0dXJuIDA7IC8qIGVhY2ggc3ltYm9sIHByZXNlbnQgbWF4aW11bSBvbmNlID0+IG5vdCBjb21wcmVzc2libGUgKi8KKwl9CisKKwl0YWJsZUxvZyA9IEZTRV9vcHRpbWFsVGFibGVMb2codGFibGVMb2csIHd0U2l6ZSwgbWF4U3ltYm9sVmFsdWUpOworCUNIRUNLX0YoRlNFX25vcm1hbGl6ZUNvdW50KG5vcm0sIHRhYmxlTG9nLCBjb3VudCwgd3RTaXplLCBtYXhTeW1ib2xWYWx1ZSkpOworCisJLyogV3JpdGUgdGFibGUgZGVzY3JpcHRpb24gaGVhZGVyICovCisJeworCQlDSEVDS19WX0YoaFNpemUsIEZTRV93cml0ZU5Db3VudChvcCwgb2VuZCAtIG9wLCBub3JtLCBtYXhTeW1ib2xWYWx1ZSwgdGFibGVMb2cpKTsKKwkJb3AgKz0gaFNpemU7CisJfQorCisJLyogQ29tcHJlc3MgKi8KKwlDSEVDS19GKEZTRV9idWlsZENUYWJsZV93a3NwKENUYWJsZSwgbm9ybSwgbWF4U3ltYm9sVmFsdWUsIHRhYmxlTG9nLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpKTsKKwl7CisJCUNIRUNLX1ZfRihjU2l6ZSwgRlNFX2NvbXByZXNzX3VzaW5nQ1RhYmxlKG9wLCBvZW5kIC0gb3AsIHdlaWdodFRhYmxlLCB3dFNpemUsIENUYWJsZSkpOworCQlpZiAoY1NpemUgPT0gMCkKKwkJCXJldHVybiAwOyAvKiBub3QgZW5vdWdoIHNwYWNlIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KKwkJb3AgKz0gY1NpemU7CisJfQorCisJcmV0dXJuIG9wIC0gb3N0YXJ0OworfQorCitzdHJ1Y3QgSFVGX0NFbHRfcyB7CisJVTE2IHZhbDsKKwlCWVRFIG5iQml0czsKK307IC8qIHR5cGVkZWYnZCB0byBIVUZfQ0VsdCB3aXRoaW4gImh1Zi5oIiAqLworCisvKiEgSFVGX3dyaXRlQ1RhYmxlX3drc3AoKSA6CisJYENUYWJsZWAgOiBIdWZmbWFuIHRyZWUgdG8gc2F2ZSwgdXNpbmcgaHVmIHJlcHJlc2VudGF0aW9uLgorCUByZXR1cm4gOiBzaXplIG9mIHNhdmVkIENUYWJsZSAqLworc2l6ZV90IEhVRl93cml0ZUNUYWJsZV93a3NwKHZvaWQgKmRzdCwgc2l6ZV90IG1heERzdFNpemUsIGNvbnN0IEhVRl9DRWx0ICpDVGFibGUsIFUzMiBtYXhTeW1ib2xWYWx1ZSwgVTMyIGh1ZmZMb2csIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJQllURSAqb3AgPSAoQllURSAqKWRzdDsKKwlVMzIgbjsKKworCUJZVEUgKmJpdHNUb1dlaWdodDsKKwlCWVRFICpodWZmV2VpZ2h0OworCXNpemVfdCBzcGFjZVVzZWQzMiA9IDA7CisKKwliaXRzVG9XZWlnaHQgPSAoQllURSAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIpOworCXNwYWNlVXNlZDMyICs9IEFMSUdOKEhVRl9UQUJMRUxPR19NQVggKyAxLCBzaXplb2YoVTMyKSkgPj4gMjsKKwlodWZmV2VpZ2h0ID0gKEJZVEUgKikoKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyKTsKKwlzcGFjZVVzZWQzMiArPSBBTElHTihIVUZfU1lNQk9MVkFMVUVfTUFYLCBzaXplb2YoVTMyKSkgPj4gMjsKKworCWlmICgoc3BhY2VVc2VkMzIgPDwgMikgPiB3b3Jrc3BhY2VTaXplKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCXdvcmtzcGFjZSA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwl3b3Jrc3BhY2VTaXplIC09IChzcGFjZVVzZWQzMiA8PCAyKTsKKworCS8qIGNoZWNrIGNvbmRpdGlvbnMgKi8KKwlpZiAobWF4U3ltYm9sVmFsdWUgPiBIVUZfU1lNQk9MVkFMVUVfTUFYKQorCQlyZXR1cm4gRVJST1IobWF4U3ltYm9sVmFsdWVfdG9vTGFyZ2UpOworCisJLyogY29udmVydCB0byB3ZWlnaHQgKi8KKwliaXRzVG9XZWlnaHRbMF0gPSAwOworCWZvciAobiA9IDE7IG4gPCBodWZmTG9nICsgMTsgbisrKQorCQliaXRzVG9XZWlnaHRbbl0gPSAoQllURSkoaHVmZkxvZyArIDEgLSBuKTsKKwlmb3IgKG4gPSAwOyBuIDwgbWF4U3ltYm9sVmFsdWU7IG4rKykKKwkJaHVmZldlaWdodFtuXSA9IGJpdHNUb1dlaWdodFtDVGFibGVbbl0ubmJCaXRzXTsKKworCS8qIGF0dGVtcHQgd2VpZ2h0cyBjb21wcmVzc2lvbiBieSBGU0UgKi8KKwl7CisJCUNIRUNLX1ZfRihoU2l6ZSwgSFVGX2NvbXByZXNzV2VpZ2h0c193a3NwKG9wICsgMSwgbWF4RHN0U2l6ZSAtIDEsIGh1ZmZXZWlnaHQsIG1heFN5bWJvbFZhbHVlLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpKTsKKwkJaWYgKChoU2l6ZSA+IDEpICYgKGhTaXplIDwgbWF4U3ltYm9sVmFsdWUgLyAyKSkgeyAvKiBGU0UgY29tcHJlc3NlZCAqLworCQkJb3BbMF0gPSAoQllURSloU2l6ZTsKKwkJCXJldHVybiBoU2l6ZSArIDE7CisJCX0KKwl9CisKKwkvKiB3cml0ZSByYXcgdmFsdWVzIGFzIDQtYml0cyAobWF4IDogMTUpICovCisJaWYgKG1heFN5bWJvbFZhbHVlID4gKDI1NiAtIDEyOCkpCisJCXJldHVybiBFUlJPUihHRU5FUklDKTsgLyogc2hvdWxkIG5vdCBoYXBwZW4gOiBsaWtlbHkgbWVhbnMgc291cmNlIGNhbm5vdCBiZSBjb21wcmVzc2VkICovCisJaWYgKCgobWF4U3ltYm9sVmFsdWUgKyAxKSAvIDIpICsgMSA+IG1heERzdFNpemUpCisJCXJldHVybiBFUlJPUihkc3RTaXplX3Rvb1NtYWxsKTsgLyogbm90IGVub3VnaCBzcGFjZSB3aXRoaW4gZHN0IGJ1ZmZlciAqLworCW9wWzBdID0gKEJZVEUpKDEyOCAvKnNwZWNpYWwgY2FzZSovICsgKG1heFN5bWJvbFZhbHVlIC0gMSkpOworCWh1ZmZXZWlnaHRbbWF4U3ltYm9sVmFsdWVdID0gMDsgLyogdG8gYmUgc3VyZSBpdCBkb2Vzbid0IGNhdXNlIG1zYW4gaXNzdWUgaW4gZmluYWwgY29tYmluYXRpb24gKi8KKwlmb3IgKG4gPSAwOyBuIDwgbWF4U3ltYm9sVmFsdWU7IG4gKz0gMikKKwkJb3BbKG4gLyAyKSArIDFdID0gKEJZVEUpKChodWZmV2VpZ2h0W25dIDw8IDQpICsgaHVmZldlaWdodFtuICsgMV0pOworCXJldHVybiAoKG1heFN5bWJvbFZhbHVlICsgMSkgLyAyKSArIDE7Cit9CisKK3NpemVfdCBIVUZfcmVhZENUYWJsZV93a3NwKEhVRl9DRWx0ICpDVGFibGUsIFUzMiBtYXhTeW1ib2xWYWx1ZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkKK3sKKwlVMzIgKnJhbmtWYWw7CisJQllURSAqaHVmZldlaWdodDsKKwlVMzIgdGFibGVMb2cgPSAwOworCVUzMiBuYlN5bWJvbHMgPSAwOworCXNpemVfdCByZWFkU2l6ZTsKKwlzaXplX3Qgc3BhY2VVc2VkMzIgPSAwOworCisJcmFua1ZhbCA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwlzcGFjZVVzZWQzMiArPSBIVUZfVEFCTEVMT0dfQUJTT0xVVEVNQVggKyAxOworCWh1ZmZXZWlnaHQgPSAoQllURSAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIpOworCXNwYWNlVXNlZDMyICs9IEFMSUdOKEhVRl9TWU1CT0xWQUxVRV9NQVggKyAxLCBzaXplb2YoVTMyKSkgPj4gMjsKKworCWlmICgoc3BhY2VVc2VkMzIgPDwgMikgPiB3b3Jrc3BhY2VTaXplKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCXdvcmtzcGFjZSA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwl3b3Jrc3BhY2VTaXplIC09IChzcGFjZVVzZWQzMiA8PCAyKTsKKworCS8qIGdldCBzeW1ib2wgd2VpZ2h0cyAqLworCXJlYWRTaXplID0gSFVGX3JlYWRTdGF0c193a3NwKGh1ZmZXZWlnaHQsIEhVRl9TWU1CT0xWQUxVRV9NQVggKyAxLCByYW5rVmFsLCAmbmJTeW1ib2xzLCAmdGFibGVMb2csIHNyYywgc3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwlpZiAoRVJSX2lzRXJyb3IocmVhZFNpemUpKQorCQlyZXR1cm4gcmVhZFNpemU7CisKKwkvKiBjaGVjayByZXN1bHQgKi8KKwlpZiAodGFibGVMb2cgPiBIVUZfVEFCTEVMT0dfTUFYKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCWlmIChuYlN5bWJvbHMgPiBtYXhTeW1ib2xWYWx1ZSArIDEpCisJCXJldHVybiBFUlJPUihtYXhTeW1ib2xWYWx1ZV90b29TbWFsbCk7CisKKwkvKiBQcmVwYXJlIGJhc2UgdmFsdWUgcGVyIHJhbmsgKi8KKwl7CisJCVUzMiBuLCBuZXh0UmFua1N0YXJ0ID0gMDsKKwkJZm9yIChuID0gMTsgbiA8PSB0YWJsZUxvZzsgbisrKSB7CisJCQlVMzIgY3VyciA9IG5leHRSYW5rU3RhcnQ7CisJCQluZXh0UmFua1N0YXJ0ICs9IChyYW5rVmFsW25dIDw8IChuIC0gMSkpOworCQkJcmFua1ZhbFtuXSA9IGN1cnI7CisJCX0KKwl9CisKKwkvKiBmaWxsIG5iQml0cyAqLworCXsKKwkJVTMyIG47CisJCWZvciAobiA9IDA7IG4gPCBuYlN5bWJvbHM7IG4rKykgeworCQkJY29uc3QgVTMyIHcgPSBodWZmV2VpZ2h0W25dOworCQkJQ1RhYmxlW25dLm5iQml0cyA9IChCWVRFKSh0YWJsZUxvZyArIDEgLSB3KTsKKwkJfQorCX0KKworCS8qIGZpbGwgdmFsICovCisJeworCQlVMTYgbmJQZXJSYW5rW0hVRl9UQUJMRUxPR19NQVggKyAyXSA9IHswfTsgLyogc3VwcG9ydCB3PTA9Pm49dGFibGVMb2crMSAqLworCQlVMTYgdmFsUGVyUmFua1tIVUZfVEFCTEVMT0dfTUFYICsgMl0gPSB7MH07CisJCXsKKwkJCVUzMiBuOworCQkJZm9yIChuID0gMDsgbiA8IG5iU3ltYm9sczsgbisrKQorCQkJCW5iUGVyUmFua1tDVGFibGVbbl0ubmJCaXRzXSsrOworCQl9CisJCS8qIGRldGVybWluZSBzdGF0aW5nIHZhbHVlIHBlciByYW5rICovCisJCXZhbFBlclJhbmtbdGFibGVMb2cgKyAxXSA9IDA7IC8qIGZvciB3PT0wICovCisJCXsKKwkJCVUxNiBtaW4gPSAwOworCQkJVTMyIG47CisJCQlmb3IgKG4gPSB0YWJsZUxvZzsgbiA+IDA7IG4tLSkgeyAvKiBzdGFydCBhdCBuPXRhYmxlbG9nIDwtPiB3PTEgKi8KKwkJCQl2YWxQZXJSYW5rW25dID0gbWluOyAgICAgLyogZ2V0IHN0YXJ0aW5nIHZhbHVlIHdpdGhpbiBlYWNoIHJhbmsgKi8KKwkJCQltaW4gKz0gbmJQZXJSYW5rW25dOworCQkJCW1pbiA+Pj0gMTsKKwkJCX0KKwkJfQorCQkvKiBhc3NpZ24gdmFsdWUgd2l0aGluIHJhbmssIHN5bWJvbCBvcmRlciAqLworCQl7CisJCQlVMzIgbjsKKwkJCWZvciAobiA9IDA7IG4gPD0gbWF4U3ltYm9sVmFsdWU7IG4rKykKKwkJCQlDVGFibGVbbl0udmFsID0gdmFsUGVyUmFua1tDVGFibGVbbl0ubmJCaXRzXSsrOworCQl9CisJfQorCisJcmV0dXJuIHJlYWRTaXplOworfQorCit0eXBlZGVmIHN0cnVjdCBub2RlRWx0X3MgeworCVUzMiBjb3VudDsKKwlVMTYgcGFyZW50OworCUJZVEUgYnl0ZTsKKwlCWVRFIG5iQml0czsKK30gbm9kZUVsdDsKKworc3RhdGljIFUzMiBIVUZfc2V0TWF4SGVpZ2h0KG5vZGVFbHQgKmh1ZmZOb2RlLCBVMzIgbGFzdE5vbk51bGwsIFUzMiBtYXhOYkJpdHMpCit7CisJY29uc3QgVTMyIGxhcmdlc3RCaXRzID0gaHVmZk5vZGVbbGFzdE5vbk51bGxdLm5iQml0czsKKwlpZiAobGFyZ2VzdEJpdHMgPD0gbWF4TmJCaXRzKQorCQlyZXR1cm4gbGFyZ2VzdEJpdHM7IC8qIGVhcmx5IGV4aXQgOiBubyBlbHQgPiBtYXhOYkJpdHMgKi8KKworCS8qIHRoZXJlIGFyZSBzZXZlcmFsIHRvbyBsYXJnZSBlbGVtZW50cyAoYXQgbGVhc3QgPj0gMikgKi8KKwl7CisJCWludCB0b3RhbENvc3QgPSAwOworCQljb25zdCBVMzIgYmFzZUNvc3QgPSAxIDw8IChsYXJnZXN0Qml0cyAtIG1heE5iQml0cyk7CisJCVUzMiBuID0gbGFzdE5vbk51bGw7CisKKwkJd2hpbGUgKGh1ZmZOb2RlW25dLm5iQml0cyA+IG1heE5iQml0cykgeworCQkJdG90YWxDb3N0ICs9IGJhc2VDb3N0IC0gKDEgPDwgKGxhcmdlc3RCaXRzIC0gaHVmZk5vZGVbbl0ubmJCaXRzKSk7CisJCQlodWZmTm9kZVtuXS5uYkJpdHMgPSAoQllURSltYXhOYkJpdHM7CisJCQluLS07CisJCX0gLyogbiBzdG9wcyBhdCBodWZmTm9kZVtuXS5uYkJpdHMgPD0gbWF4TmJCaXRzICovCisJCXdoaWxlIChodWZmTm9kZVtuXS5uYkJpdHMgPT0gbWF4TmJCaXRzKQorCQkJbi0tOyAvKiBuIGVuZCBhdCBpbmRleCBvZiBzbWFsbGVzdCBzeW1ib2wgdXNpbmcgPCBtYXhOYkJpdHMgKi8KKworCQkvKiByZW5vcm0gdG90YWxDb3N0ICovCisJCXRvdGFsQ29zdCA+Pj0gKGxhcmdlc3RCaXRzIC0gbWF4TmJCaXRzKTsgLyogbm90ZSA6IHRvdGFsQ29zdCBpcyBuZWNlc3NhcmlseSBhIG11bHRpcGxlIG9mIGJhc2VDb3N0ICovCisKKwkJLyogcmVwYXkgbm9ybWFsaXplZCBjb3N0ICovCisJCXsKKwkJCVUzMiBjb25zdCBub1N5bWJvbCA9IDB4RjBGMEYwRjA7CisJCQlVMzIgcmFua0xhc3RbSFVGX1RBQkxFTE9HX01BWCArIDJdOworCQkJaW50IHBvczsKKworCQkJLyogR2V0IHBvcyBvZiBsYXN0IChzbWFsbGVzdCkgc3ltYm9sIHBlciByYW5rICovCisJCQltZW1zZXQocmFua0xhc3QsIDB4RjAsIHNpemVvZihyYW5rTGFzdCkpOworCQkJeworCQkJCVUzMiBjdXJyTmJCaXRzID0gbWF4TmJCaXRzOworCQkJCWZvciAocG9zID0gbjsgcG9zID49IDA7IHBvcy0tKSB7CisJCQkJCWlmIChodWZmTm9kZVtwb3NdLm5iQml0cyA+PSBjdXJyTmJCaXRzKQorCQkJCQkJY29udGludWU7CisJCQkJCWN1cnJOYkJpdHMgPSBodWZmTm9kZVtwb3NdLm5iQml0czsgLyogPCBtYXhOYkJpdHMgKi8KKwkJCQkJcmFua0xhc3RbbWF4TmJCaXRzIC0gY3Vyck5iQml0c10gPSBwb3M7CisJCQkJfQorCQkJfQorCisJCQl3aGlsZSAodG90YWxDb3N0ID4gMCkgeworCQkJCVUzMiBuQml0c1RvRGVjcmVhc2UgPSBCSVRfaGlnaGJpdDMyKHRvdGFsQ29zdCkgKyAxOworCQkJCWZvciAoOyBuQml0c1RvRGVjcmVhc2UgPiAxOyBuQml0c1RvRGVjcmVhc2UtLSkgeworCQkJCQlVMzIgaGlnaFBvcyA9IHJhbmtMYXN0W25CaXRzVG9EZWNyZWFzZV07CisJCQkJCVUzMiBsb3dQb3MgPSByYW5rTGFzdFtuQml0c1RvRGVjcmVhc2UgLSAxXTsKKwkJCQkJaWYgKGhpZ2hQb3MgPT0gbm9TeW1ib2wpCisJCQkJCQljb250aW51ZTsKKwkJCQkJaWYgKGxvd1BvcyA9PSBub1N5bWJvbCkKKwkJCQkJCWJyZWFrOworCQkJCQl7CisJCQkJCQlVMzIgY29uc3QgaGlnaFRvdGFsID0gaHVmZk5vZGVbaGlnaFBvc10uY291bnQ7CisJCQkJCQlVMzIgY29uc3QgbG93VG90YWwgPSAyICogaHVmZk5vZGVbbG93UG9zXS5jb3VudDsKKwkJCQkJCWlmIChoaWdoVG90YWwgPD0gbG93VG90YWwpCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogb25seSB0cmlnZ2VyZWQgd2hlbiBubyBtb3JlIHJhbmsgMSBzeW1ib2wgbGVmdCA9PiBmaW5kIGNsb3Nlc3Qgb25lIChub3RlIDogdGhlcmUgaXMgbmVjZXNzYXJpbHkgYXQgbGVhc3Qgb25lICEpICovCisJCQkJLyogSFVGX01BWF9UQUJMRUxPRyB0ZXN0IGp1c3QgdG8gcGxlYXNlIGdjYyA1KzsgYnV0IGl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5ICovCisJCQkJd2hpbGUgKChuQml0c1RvRGVjcmVhc2UgPD0gSFVGX1RBQkxFTE9HX01BWCkgJiYgKHJhbmtMYXN0W25CaXRzVG9EZWNyZWFzZV0gPT0gbm9TeW1ib2wpKQorCQkJCQluQml0c1RvRGVjcmVhc2UrKzsKKwkJCQl0b3RhbENvc3QgLT0gMSA8PCAobkJpdHNUb0RlY3JlYXNlIC0gMSk7CisJCQkJaWYgKHJhbmtMYXN0W25CaXRzVG9EZWNyZWFzZSAtIDFdID09IG5vU3ltYm9sKQorCQkJCQlyYW5rTGFzdFtuQml0c1RvRGVjcmVhc2UgLSAxXSA9IHJhbmtMYXN0W25CaXRzVG9EZWNyZWFzZV07IC8qIHRoaXMgcmFuayBpcyBubyBsb25nZXIgZW1wdHkgKi8KKwkJCQlodWZmTm9kZVtyYW5rTGFzdFtuQml0c1RvRGVjcmVhc2VdXS5uYkJpdHMrKzsKKwkJCQlpZiAocmFua0xhc3RbbkJpdHNUb0RlY3JlYXNlXSA9PSAwKSAvKiBzcGVjaWFsIGNhc2UsIHJlYWNoZWQgbGFyZ2VzdCBzeW1ib2wgKi8KKwkJCQkJcmFua0xhc3RbbkJpdHNUb0RlY3JlYXNlXSA9IG5vU3ltYm9sOworCQkJCWVsc2UgeworCQkJCQlyYW5rTGFzdFtuQml0c1RvRGVjcmVhc2VdLS07CisJCQkJCWlmIChodWZmTm9kZVtyYW5rTGFzdFtuQml0c1RvRGVjcmVhc2VdXS5uYkJpdHMgIT0gbWF4TmJCaXRzIC0gbkJpdHNUb0RlY3JlYXNlKQorCQkJCQkJcmFua0xhc3RbbkJpdHNUb0RlY3JlYXNlXSA9IG5vU3ltYm9sOyAvKiB0aGlzIHJhbmsgaXMgbm93IGVtcHR5ICovCisJCQkJfQorCQkJfSAvKiB3aGlsZSAodG90YWxDb3N0ID4gMCkgKi8KKworCQkJd2hpbGUgKHRvdGFsQ29zdCA8IDApIHsJCSAgICAgICAvKiBTb21ldGltZXMsIGNvc3QgY29ycmVjdGlvbiBvdmVyc2hvb3QgKi8KKwkJCQlpZiAocmFua0xhc3RbMV0gPT0gbm9TeW1ib2wpIHsgLyogc3BlY2lhbCBjYXNlIDogbm8gcmFuayAxIHN5bWJvbCAodXNpbmcgbWF4TmJCaXRzLTEpOyBsZXQncyBjcmVhdGUgb25lIGZyb20gbGFyZ2VzdCByYW5rIDAKKwkJCQkJCQkJICAodXNpbmcgbWF4TmJCaXRzKSAqLworCQkJCQl3aGlsZSAoaHVmZk5vZGVbbl0ubmJCaXRzID09IG1heE5iQml0cykKKwkJCQkJCW4tLTsKKwkJCQkJaHVmZk5vZGVbbiArIDFdLm5iQml0cy0tOworCQkJCQlyYW5rTGFzdFsxXSA9IG4gKyAxOworCQkJCQl0b3RhbENvc3QrKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWh1ZmZOb2RlW3JhbmtMYXN0WzFdICsgMV0ubmJCaXRzLS07CisJCQkJcmFua0xhc3RbMV0rKzsKKwkJCQl0b3RhbENvc3QrKzsKKwkJCX0KKwkJfQorCX0gLyogdGhlcmUgYXJlIHNldmVyYWwgdG9vIGxhcmdlIGVsZW1lbnRzIChhdCBsZWFzdCA+PSAyKSAqLworCisJcmV0dXJuIG1heE5iQml0czsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworCVUzMiBiYXNlOworCVUzMiBjdXJyOworfSByYW5rUG9zOworCitzdGF0aWMgdm9pZCBIVUZfc29ydChub2RlRWx0ICpodWZmTm9kZSwgY29uc3QgVTMyICpjb3VudCwgVTMyIG1heFN5bWJvbFZhbHVlKQoreworCXJhbmtQb3MgcmFua1szMl07CisJVTMyIG47CisKKwltZW1zZXQocmFuaywgMCwgc2l6ZW9mKHJhbmspKTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heFN5bWJvbFZhbHVlOyBuKyspIHsKKwkJVTMyIHIgPSBCSVRfaGlnaGJpdDMyKGNvdW50W25dICsgMSk7CisJCXJhbmtbcl0uYmFzZSsrOworCX0KKwlmb3IgKG4gPSAzMDsgbiA+IDA7IG4tLSkKKwkJcmFua1tuIC0gMV0uYmFzZSArPSByYW5rW25dLmJhc2U7CisJZm9yIChuID0gMDsgbiA8IDMyOyBuKyspCisJCXJhbmtbbl0uY3VyciA9IHJhbmtbbl0uYmFzZTsKKwlmb3IgKG4gPSAwOyBuIDw9IG1heFN5bWJvbFZhbHVlOyBuKyspIHsKKwkJVTMyIGNvbnN0IGMgPSBjb3VudFtuXTsKKwkJVTMyIGNvbnN0IHIgPSBCSVRfaGlnaGJpdDMyKGMgKyAxKSArIDE7CisJCVUzMiBwb3MgPSByYW5rW3JdLmN1cnIrKzsKKwkJd2hpbGUgKChwb3MgPiByYW5rW3JdLmJhc2UpICYmIChjID4gaHVmZk5vZGVbcG9zIC0gMV0uY291bnQpKQorCQkJaHVmZk5vZGVbcG9zXSA9IGh1ZmZOb2RlW3BvcyAtIDFdLCBwb3MtLTsKKwkJaHVmZk5vZGVbcG9zXS5jb3VudCA9IGM7CisJCWh1ZmZOb2RlW3Bvc10uYnl0ZSA9IChCWVRFKW47CisJfQorfQorCisvKiogSFVGX2J1aWxkQ1RhYmxlX3drc3AoKSA6CisgKiAgU2FtZSBhcyBIVUZfYnVpbGRDVGFibGUoKSwgYnV0IHVzaW5nIGV4dGVybmFsbHkgYWxsb2NhdGVkIHNjcmF0Y2ggYnVmZmVyLgorICogIGB3b3JrU3BhY2VgIG11c3QgYmUgYWxpZ25lZCBvbiA0LWJ5dGVzIGJvdW5kYXJpZXMsIGFuZCBiZSBhdCBsZWFzdCBhcyBsYXJnZSBhcyBhIHRhYmxlIG9mIDEwMjQgdW5zaWduZWQuCisgKi8KKyNkZWZpbmUgU1RBUlROT0RFIChIVUZfU1lNQk9MVkFMVUVfTUFYICsgMSkKK3R5cGVkZWYgbm9kZUVsdCBodWZmTm9kZVRhYmxlWzIgKiBIVUZfU1lNQk9MVkFMVUVfTUFYICsgMSArIDFdOworc2l6ZV90IEhVRl9idWlsZENUYWJsZV93a3NwKEhVRl9DRWx0ICp0cmVlLCBjb25zdCBVMzIgKmNvdW50LCBVMzIgbWF4U3ltYm9sVmFsdWUsIFUzMiBtYXhOYkJpdHMsIHZvaWQgKndvcmtTcGFjZSwgc2l6ZV90IHdrc3BTaXplKQoreworCW5vZGVFbHQgKmNvbnN0IGh1ZmZOb2RlMCA9IChub2RlRWx0ICopd29ya1NwYWNlOworCW5vZGVFbHQgKmNvbnN0IGh1ZmZOb2RlID0gaHVmZk5vZGUwICsgMTsKKwlVMzIgbiwgbm9uTnVsbFJhbms7CisJaW50IGxvd1MsIGxvd047CisJVTE2IG5vZGVOYiA9IFNUQVJUTk9ERTsKKwlVMzIgbm9kZVJvb3Q7CisKKwkvKiBzYWZldHkgY2hlY2tzICovCisJaWYgKHdrc3BTaXplIDwgc2l6ZW9mKGh1ZmZOb2RlVGFibGUpKQorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIHdvcmtTcGFjZSBpcyBub3QgbGFyZ2UgZW5vdWdoICovCisJaWYgKG1heE5iQml0cyA9PSAwKQorCQltYXhOYkJpdHMgPSBIVUZfVEFCTEVMT0dfREVGQVVMVDsKKwlpZiAobWF4U3ltYm9sVmFsdWUgPiBIVUZfU1lNQk9MVkFMVUVfTUFYKQorCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7CisJbWVtc2V0KGh1ZmZOb2RlMCwgMCwgc2l6ZW9mKGh1ZmZOb2RlVGFibGUpKTsKKworCS8qIHNvcnQsIGRlY3JlYXNpbmcgb3JkZXIgKi8KKwlIVUZfc29ydChodWZmTm9kZSwgY291bnQsIG1heFN5bWJvbFZhbHVlKTsKKworCS8qIGluaXQgZm9yIHBhcmVudHMgKi8KKwlub25OdWxsUmFuayA9IG1heFN5bWJvbFZhbHVlOworCXdoaWxlIChodWZmTm9kZVtub25OdWxsUmFua10uY291bnQgPT0gMCkKKwkJbm9uTnVsbFJhbmstLTsKKwlsb3dTID0gbm9uTnVsbFJhbms7CisJbm9kZVJvb3QgPSBub2RlTmIgKyBsb3dTIC0gMTsKKwlsb3dOID0gbm9kZU5iOworCWh1ZmZOb2RlW25vZGVOYl0uY291bnQgPSBodWZmTm9kZVtsb3dTXS5jb3VudCArIGh1ZmZOb2RlW2xvd1MgLSAxXS5jb3VudDsKKwlodWZmTm9kZVtsb3dTXS5wYXJlbnQgPSBodWZmTm9kZVtsb3dTIC0gMV0ucGFyZW50ID0gbm9kZU5iOworCW5vZGVOYisrOworCWxvd1MgLT0gMjsKKwlmb3IgKG4gPSBub2RlTmI7IG4gPD0gbm9kZVJvb3Q7IG4rKykKKwkJaHVmZk5vZGVbbl0uY291bnQgPSAoVTMyKSgxVSA8PCAzMCk7CisJaHVmZk5vZGUwWzBdLmNvdW50ID0gKFUzMikoMVUgPDwgMzEpOyAvKiBmYWtlIGVudHJ5LCBzdHJvbmcgYmFycmllciAqLworCisJLyogY3JlYXRlIHBhcmVudHMgKi8KKwl3aGlsZSAobm9kZU5iIDw9IG5vZGVSb290KSB7CisJCVUzMiBuMSA9IChodWZmTm9kZVtsb3dTXS5jb3VudCA8IGh1ZmZOb2RlW2xvd05dLmNvdW50KSA/IGxvd1MtLSA6IGxvd04rKzsKKwkJVTMyIG4yID0gKGh1ZmZOb2RlW2xvd1NdLmNvdW50IDwgaHVmZk5vZGVbbG93Tl0uY291bnQpID8gbG93Uy0tIDogbG93TisrOworCQlodWZmTm9kZVtub2RlTmJdLmNvdW50ID0gaHVmZk5vZGVbbjFdLmNvdW50ICsgaHVmZk5vZGVbbjJdLmNvdW50OworCQlodWZmTm9kZVtuMV0ucGFyZW50ID0gaHVmZk5vZGVbbjJdLnBhcmVudCA9IG5vZGVOYjsKKwkJbm9kZU5iKys7CisJfQorCisJLyogZGlzdHJpYnV0ZSB3ZWlnaHRzICh1bmxpbWl0ZWQgdHJlZSBoZWlnaHQpICovCisJaHVmZk5vZGVbbm9kZVJvb3RdLm5iQml0cyA9IDA7CisJZm9yIChuID0gbm9kZVJvb3QgLSAxOyBuID49IFNUQVJUTk9ERTsgbi0tKQorCQlodWZmTm9kZVtuXS5uYkJpdHMgPSBodWZmTm9kZVtodWZmTm9kZVtuXS5wYXJlbnRdLm5iQml0cyArIDE7CisJZm9yIChuID0gMDsgbiA8PSBub25OdWxsUmFuazsgbisrKQorCQlodWZmTm9kZVtuXS5uYkJpdHMgPSBodWZmTm9kZVtodWZmTm9kZVtuXS5wYXJlbnRdLm5iQml0cyArIDE7CisKKwkvKiBlbmZvcmNlIG1heFRhYmxlTG9nICovCisJbWF4TmJCaXRzID0gSFVGX3NldE1heEhlaWdodChodWZmTm9kZSwgbm9uTnVsbFJhbmssIG1heE5iQml0cyk7CisKKwkvKiBmaWxsIHJlc3VsdCBpbnRvIHRyZWUgKHZhbCwgbmJCaXRzKSAqLworCXsKKwkJVTE2IG5iUGVyUmFua1tIVUZfVEFCTEVMT0dfTUFYICsgMV0gPSB7MH07CisJCVUxNiB2YWxQZXJSYW5rW0hVRl9UQUJMRUxPR19NQVggKyAxXSA9IHswfTsKKwkJaWYgKG1heE5iQml0cyA+IEhVRl9UQUJMRUxPR19NQVgpCisJCQlyZXR1cm4gRVJST1IoR0VORVJJQyk7IC8qIGNoZWNrIGZpdCBpbnRvIHRhYmxlICovCisJCWZvciAobiA9IDA7IG4gPD0gbm9uTnVsbFJhbms7IG4rKykKKwkJCW5iUGVyUmFua1todWZmTm9kZVtuXS5uYkJpdHNdKys7CisJCS8qIGRldGVybWluZSBzdGF0aW5nIHZhbHVlIHBlciByYW5rICovCisJCXsKKwkJCVUxNiBtaW4gPSAwOworCQkJZm9yIChuID0gbWF4TmJCaXRzOyBuID4gMDsgbi0tKSB7CisJCQkJdmFsUGVyUmFua1tuXSA9IG1pbjsgLyogZ2V0IHN0YXJ0aW5nIHZhbHVlIHdpdGhpbiBlYWNoIHJhbmsgKi8KKwkJCQltaW4gKz0gbmJQZXJSYW5rW25dOworCQkJCW1pbiA+Pj0gMTsKKwkJCX0KKwkJfQorCQlmb3IgKG4gPSAwOyBuIDw9IG1heFN5bWJvbFZhbHVlOyBuKyspCisJCQl0cmVlW2h1ZmZOb2RlW25dLmJ5dGVdLm5iQml0cyA9IGh1ZmZOb2RlW25dLm5iQml0czsgLyogcHVzaCBuYkJpdHMgcGVyIHN5bWJvbCwgc3ltYm9sIG9yZGVyICovCisJCWZvciAobiA9IDA7IG4gPD0gbWF4U3ltYm9sVmFsdWU7IG4rKykKKwkJCXRyZWVbbl0udmFsID0gdmFsUGVyUmFua1t0cmVlW25dLm5iQml0c10rKzsgLyogYXNzaWduIHZhbHVlIHdpdGhpbiByYW5rLCBzeW1ib2wgb3JkZXIgKi8KKwl9CisKKwlyZXR1cm4gbWF4TmJCaXRzOworfQorCitzdGF0aWMgc2l6ZV90IEhVRl9lc3RpbWF0ZUNvbXByZXNzZWRTaXplKEhVRl9DRWx0ICpDVGFibGUsIGNvbnN0IHVuc2lnbmVkICpjb3VudCwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUpCit7CisJc2l6ZV90IG5iQml0cyA9IDA7CisJaW50IHM7CisJZm9yIChzID0gMDsgcyA8PSAoaW50KW1heFN5bWJvbFZhbHVlOyArK3MpIHsKKwkJbmJCaXRzICs9IENUYWJsZVtzXS5uYkJpdHMgKiBjb3VudFtzXTsKKwl9CisJcmV0dXJuIG5iQml0cyA+PiAzOworfQorCitzdGF0aWMgaW50IEhVRl92YWxpZGF0ZUNUYWJsZShjb25zdCBIVUZfQ0VsdCAqQ1RhYmxlLCBjb25zdCB1bnNpZ25lZCAqY291bnQsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlKQoreworCWludCBiYWQgPSAwOworCWludCBzOworCWZvciAocyA9IDA7IHMgPD0gKGludCltYXhTeW1ib2xWYWx1ZTsgKytzKSB7CisJCWJhZCB8PSAoY291bnRbc10gIT0gMCkgJiAoQ1RhYmxlW3NdLm5iQml0cyA9PSAwKTsKKwl9CisJcmV0dXJuICFiYWQ7Cit9CisKK3N0YXRpYyB2b2lkIEhVRl9lbmNvZGVTeW1ib2woQklUX0NTdHJlYW1fdCAqYml0Q1B0ciwgVTMyIHN5bWJvbCwgY29uc3QgSFVGX0NFbHQgKkNUYWJsZSkKK3sKKwlCSVRfYWRkQml0c0Zhc3QoYml0Q1B0ciwgQ1RhYmxlW3N5bWJvbF0udmFsLCBDVGFibGVbc3ltYm9sXS5uYkJpdHMpOworfQorCitzaXplX3QgSFVGX2NvbXByZXNzQm91bmQoc2l6ZV90IHNpemUpIHsgcmV0dXJuIEhVRl9DT01QUkVTU0JPVU5EKHNpemUpOyB9CisKKyNkZWZpbmUgSFVGX0ZMVVNIQklUUyhzKSAgQklUX2ZsdXNoQml0cyhzKQorCisjZGVmaW5lIEhVRl9GTFVTSEJJVFNfMShzdHJlYW0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKHNpemVvZigoc3RyZWFtKS0+Yml0Q29udGFpbmVyKSAqIDggPCBIVUZfVEFCTEVMT0dfTUFYICogMiArIDcpIFwKKwlIVUZfRkxVU0hCSVRTKHN0cmVhbSkKKworI2RlZmluZSBIVUZfRkxVU0hCSVRTXzIoc3RyZWFtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmIChzaXplb2YoKHN0cmVhbSktPmJpdENvbnRhaW5lcikgKiA4IDwgSFVGX1RBQkxFTE9HX01BWCAqIDQgKyA3KSBcCisJSFVGX0ZMVVNIQklUUyhzdHJlYW0pCisKK3NpemVfdCBIVUZfY29tcHJlc3MxWF91c2luZ0NUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBIVUZfQ0VsdCAqQ1RhYmxlKQoreworCWNvbnN0IEJZVEUgKmlwID0gKGNvbnN0IEJZVEUgKilzcmM7CisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7CisJQllURSAqY29uc3Qgb2VuZCA9IG9zdGFydCArIGRzdFNpemU7CisJQllURSAqb3AgPSBvc3RhcnQ7CisJc2l6ZV90IG47CisJQklUX0NTdHJlYW1fdCBiaXRDOworCisJLyogaW5pdCAqLworCWlmIChkc3RTaXplIDwgOCkKKwkJcmV0dXJuIDA7IC8qIG5vdCBlbm91Z2ggc3BhY2UgdG8gY29tcHJlc3MgKi8KKwl7CisJCXNpemVfdCBjb25zdCBpbml0RXJyID0gQklUX2luaXRDU3RyZWFtKCZiaXRDLCBvcCwgb2VuZCAtIG9wKTsKKwkJaWYgKEhVRl9pc0Vycm9yKGluaXRFcnIpKQorCQkJcmV0dXJuIDA7CisJfQorCisJbiA9IHNyY1NpemUgJiB+MzsgLyogam9pbiB0byBtb2QgNCAqLworCXN3aXRjaCAoc3JjU2l6ZSAmIDMpIHsKKwljYXNlIDM6IEhVRl9lbmNvZGVTeW1ib2woJmJpdEMsIGlwW24gKyAyXSwgQ1RhYmxlKTsgSFVGX0ZMVVNIQklUU18yKCZiaXRDKTsKKwljYXNlIDI6IEhVRl9lbmNvZGVTeW1ib2woJmJpdEMsIGlwW24gKyAxXSwgQ1RhYmxlKTsgSFVGX0ZMVVNIQklUU18xKCZiaXRDKTsKKwljYXNlIDE6IEhVRl9lbmNvZGVTeW1ib2woJmJpdEMsIGlwW24gKyAwXSwgQ1RhYmxlKTsgSFVGX0ZMVVNIQklUUygmYml0Qyk7CisJY2FzZSAwOgorCWRlZmF1bHQ6OworCX0KKworCWZvciAoOyBuID4gMDsgbiAtPSA0KSB7IC8qIG5vdGUgOiBuJjM9PTAgYXQgdGhpcyBzdGFnZSAqLworCQlIVUZfZW5jb2RlU3ltYm9sKCZiaXRDLCBpcFtuIC0gMV0sIENUYWJsZSk7CisJCUhVRl9GTFVTSEJJVFNfMSgmYml0Qyk7CisJCUhVRl9lbmNvZGVTeW1ib2woJmJpdEMsIGlwW24gLSAyXSwgQ1RhYmxlKTsKKwkJSFVGX0ZMVVNIQklUU18yKCZiaXRDKTsKKwkJSFVGX2VuY29kZVN5bWJvbCgmYml0QywgaXBbbiAtIDNdLCBDVGFibGUpOworCQlIVUZfRkxVU0hCSVRTXzEoJmJpdEMpOworCQlIVUZfZW5jb2RlU3ltYm9sKCZiaXRDLCBpcFtuIC0gNF0sIENUYWJsZSk7CisJCUhVRl9GTFVTSEJJVFMoJmJpdEMpOworCX0KKworCXJldHVybiBCSVRfY2xvc2VDU3RyZWFtKCZiaXRDKTsKK30KKworc2l6ZV90IEhVRl9jb21wcmVzczRYX3VzaW5nQ1RhYmxlKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IEhVRl9DRWx0ICpDVGFibGUpCit7CisJc2l6ZV90IGNvbnN0IHNlZ21lbnRTaXplID0gKHNyY1NpemUgKyAzKSAvIDQ7IC8qIGZpcnN0IDMgc2VnbWVudHMgKi8KKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopc3JjOworCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpcCArIHNyY1NpemU7CisJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7CisJQllURSAqY29uc3Qgb2VuZCA9IG9zdGFydCArIGRzdFNpemU7CisJQllURSAqb3AgPSBvc3RhcnQ7CisKKwlpZiAoZHN0U2l6ZSA8IDYgKyAxICsgMSArIDEgKyA4KQorCQlyZXR1cm4gMDsgLyogbWluaW11bSBzcGFjZSB0byBjb21wcmVzcyBzdWNjZXNzZnVsbHkgKi8KKwlpZiAoc3JjU2l6ZSA8IDEyKQorCQlyZXR1cm4gMDsgLyogbm8gc2F2aW5nIHBvc3NpYmxlIDogdG9vIHNtYWxsIGlucHV0ICovCisJb3AgKz0gNjsJICAvKiBqdW1wVGFibGUgKi8KKworCXsKKwkJQ0hFQ0tfVl9GKGNTaXplLCBIVUZfY29tcHJlc3MxWF91c2luZ0NUYWJsZShvcCwgb2VuZCAtIG9wLCBpcCwgc2VnbWVudFNpemUsIENUYWJsZSkpOworCQlpZiAoY1NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCQlaU1REX3dyaXRlTEUxNihvc3RhcnQsIChVMTYpY1NpemUpOworCQlvcCArPSBjU2l6ZTsKKwl9CisKKwlpcCArPSBzZWdtZW50U2l6ZTsKKwl7CisJCUNIRUNLX1ZfRihjU2l6ZSwgSFVGX2NvbXByZXNzMVhfdXNpbmdDVGFibGUob3AsIG9lbmQgLSBvcCwgaXAsIHNlZ21lbnRTaXplLCBDVGFibGUpKTsKKwkJaWYgKGNTaXplID09IDApCisJCQlyZXR1cm4gMDsKKwkJWlNURF93cml0ZUxFMTYob3N0YXJ0ICsgMiwgKFUxNiljU2l6ZSk7CisJCW9wICs9IGNTaXplOworCX0KKworCWlwICs9IHNlZ21lbnRTaXplOworCXsKKwkJQ0hFQ0tfVl9GKGNTaXplLCBIVUZfY29tcHJlc3MxWF91c2luZ0NUYWJsZShvcCwgb2VuZCAtIG9wLCBpcCwgc2VnbWVudFNpemUsIENUYWJsZSkpOworCQlpZiAoY1NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCQlaU1REX3dyaXRlTEUxNihvc3RhcnQgKyA0LCAoVTE2KWNTaXplKTsKKwkJb3AgKz0gY1NpemU7CisJfQorCisJaXAgKz0gc2VnbWVudFNpemU7CisJeworCQlDSEVDS19WX0YoY1NpemUsIEhVRl9jb21wcmVzczFYX3VzaW5nQ1RhYmxlKG9wLCBvZW5kIC0gb3AsIGlwLCBpZW5kIC0gaXAsIENUYWJsZSkpOworCQlpZiAoY1NpemUgPT0gMCkKKwkJCXJldHVybiAwOworCQlvcCArPSBjU2l6ZTsKKwl9CisKKwlyZXR1cm4gb3AgLSBvc3RhcnQ7Cit9CisKK3N0YXRpYyBzaXplX3QgSFVGX2NvbXByZXNzQ1RhYmxlX2ludGVybmFsKEJZVEUgKmNvbnN0IG9zdGFydCwgQllURSAqb3AsIEJZVEUgKmNvbnN0IG9lbmQsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIHNpbmdsZVN0cmVhbSwKKwkJCQkJICBjb25zdCBIVUZfQ0VsdCAqQ1RhYmxlKQoreworCXNpemVfdCBjb25zdCBjU2l6ZSA9CisJICAgIHNpbmdsZVN0cmVhbSA/IEhVRl9jb21wcmVzczFYX3VzaW5nQ1RhYmxlKG9wLCBvZW5kIC0gb3AsIHNyYywgc3JjU2l6ZSwgQ1RhYmxlKSA6IEhVRl9jb21wcmVzczRYX3VzaW5nQ1RhYmxlKG9wLCBvZW5kIC0gb3AsIHNyYywgc3JjU2l6ZSwgQ1RhYmxlKTsKKwlpZiAoSFVGX2lzRXJyb3IoY1NpemUpKSB7CisJCXJldHVybiBjU2l6ZTsKKwl9CisJaWYgKGNTaXplID09IDApIHsKKwkJcmV0dXJuIDA7CisJfSAvKiB1bmNvbXByZXNzaWJsZSAqLworCW9wICs9IGNTaXplOworCS8qIGNoZWNrIGNvbXByZXNzaWJpbGl0eSAqLworCWlmICgoc2l6ZV90KShvcCAtIG9zdGFydCkgPj0gc3JjU2l6ZSAtIDEpIHsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBvcCAtIG9zdGFydDsKK30KKworLyogYHdvcmtTcGFjZWAgbXVzdCBhIHRhYmxlIG9mIGF0IGxlYXN0IDEwMjQgdW5zaWduZWQgKi8KK3N0YXRpYyBzaXplX3QgSFVGX2NvbXByZXNzX2ludGVybmFsKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCBodWZmTG9nLAorCQkJCSAgICB1bnNpZ25lZCBzaW5nbGVTdHJlYW0sIHZvaWQgKndvcmtTcGFjZSwgc2l6ZV90IHdrc3BTaXplLCBIVUZfQ0VsdCAqb2xkSHVmVGFibGUsIEhVRl9yZXBlYXQgKnJlcGVhdCwgaW50IHByZWZlclJlcGVhdCkKK3sKKwlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWRzdDsKKwlCWVRFICpjb25zdCBvZW5kID0gb3N0YXJ0ICsgZHN0U2l6ZTsKKwlCWVRFICpvcCA9IG9zdGFydDsKKworCVUzMiAqY291bnQ7CisJc2l6ZV90IGNvbnN0IGNvdW50U2l6ZSA9IHNpemVvZihVMzIpICogKEhVRl9TWU1CT0xWQUxVRV9NQVggKyAxKTsKKwlIVUZfQ0VsdCAqQ1RhYmxlOworCXNpemVfdCBjb25zdCBDVGFibGVTaXplID0gc2l6ZW9mKEhVRl9DRWx0KSAqIChIVUZfU1lNQk9MVkFMVUVfTUFYICsgMSk7CisKKwkvKiBjaGVja3MgJiBpbml0cyAqLworCWlmICh3a3NwU2l6ZSA8IHNpemVvZihodWZmTm9kZVRhYmxlKSArIGNvdW50U2l6ZSArIENUYWJsZVNpemUpCisJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwlpZiAoIXNyY1NpemUpCisJCXJldHVybiAwOyAvKiBVbmNvbXByZXNzZWQgKG5vdGUgOiAxIG1lYW5zIHJsZSwgc28gZmlyc3QgYnl0ZSBtdXN0IGJlIGNvcnJlY3QpICovCisJaWYgKCFkc3RTaXplKQorCQlyZXR1cm4gMDsgLyogY2Fubm90IGZpdCB3aXRoaW4gZHN0IGJ1ZGdldCAqLworCWlmIChzcmNTaXplID4gSFVGX0JMT0NLU0laRV9NQVgpCisJCXJldHVybiBFUlJPUihzcmNTaXplX3dyb25nKTsgLyogY3VyciBibG9jayBzaXplIGxpbWl0ICovCisJaWYgKGh1ZmZMb2cgPiBIVUZfVEFCTEVMT0dfTUFYKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOworCWlmICghbWF4U3ltYm9sVmFsdWUpCisJCW1heFN5bWJvbFZhbHVlID0gSFVGX1NZTUJPTFZBTFVFX01BWDsKKwlpZiAoIWh1ZmZMb2cpCisJCWh1ZmZMb2cgPSBIVUZfVEFCTEVMT0dfREVGQVVMVDsKKworCWNvdW50ID0gKFUzMiAqKXdvcmtTcGFjZTsKKwl3b3JrU3BhY2UgPSAoQllURSAqKXdvcmtTcGFjZSArIGNvdW50U2l6ZTsKKwl3a3NwU2l6ZSAtPSBjb3VudFNpemU7CisJQ1RhYmxlID0gKEhVRl9DRWx0ICopd29ya1NwYWNlOworCXdvcmtTcGFjZSA9IChCWVRFICopd29ya1NwYWNlICsgQ1RhYmxlU2l6ZTsKKwl3a3NwU2l6ZSAtPSBDVGFibGVTaXplOworCisJLyogSGV1cmlzdGljIDogSWYgd2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIG9sZCB0YWJsZSB1c2UgdGhlIG9sZCB0YWJsZSBmb3Igc21hbGwgaW5wdXRzICovCisJaWYgKHByZWZlclJlcGVhdCAmJiByZXBlYXQgJiYgKnJlcGVhdCA9PSBIVUZfcmVwZWF0X3ZhbGlkKSB7CisJCXJldHVybiBIVUZfY29tcHJlc3NDVGFibGVfaW50ZXJuYWwob3N0YXJ0LCBvcCwgb2VuZCwgc3JjLCBzcmNTaXplLCBzaW5nbGVTdHJlYW0sIG9sZEh1ZlRhYmxlKTsKKwl9CisKKwkvKiBTY2FuIGlucHV0IGFuZCBidWlsZCBzeW1ib2wgc3RhdHMgKi8KKwl7CisJCUNIRUNLX1ZfRihsYXJnZXN0LCBGU0VfY291bnRfd2tzcChjb3VudCwgJm1heFN5bWJvbFZhbHVlLCAoY29uc3QgQllURSAqKXNyYywgc3JjU2l6ZSwgKFUzMiAqKXdvcmtTcGFjZSkpOworCQlpZiAobGFyZ2VzdCA9PSBzcmNTaXplKSB7CisJCQkqb3N0YXJ0ID0gKChjb25zdCBCWVRFICopc3JjKVswXTsKKwkJCXJldHVybiAxOworCQl9IC8qIHNpbmdsZSBzeW1ib2wsIHJsZSAqLworCQlpZiAobGFyZ2VzdCA8PSAoc3JjU2l6ZSA+PiA3KSArIDEpCisJCQlyZXR1cm4gMDsgLyogRmFzdCBoZXVyaXN0aWMgOiBub3QgY29tcHJlc3NpYmxlIGVub3VnaCAqLworCX0KKworCS8qIENoZWNrIHZhbGlkaXR5IG9mIHByZXZpb3VzIHRhYmxlICovCisJaWYgKHJlcGVhdCAmJiAqcmVwZWF0ID09IEhVRl9yZXBlYXRfY2hlY2sgJiYgIUhVRl92YWxpZGF0ZUNUYWJsZShvbGRIdWZUYWJsZSwgY291bnQsIG1heFN5bWJvbFZhbHVlKSkgeworCQkqcmVwZWF0ID0gSFVGX3JlcGVhdF9ub25lOworCX0KKwkvKiBIZXVyaXN0aWMgOiB1c2UgZXhpc3RpbmcgdGFibGUgZm9yIHNtYWxsIGlucHV0cyAqLworCWlmIChwcmVmZXJSZXBlYXQgJiYgcmVwZWF0ICYmICpyZXBlYXQgIT0gSFVGX3JlcGVhdF9ub25lKSB7CisJCXJldHVybiBIVUZfY29tcHJlc3NDVGFibGVfaW50ZXJuYWwob3N0YXJ0LCBvcCwgb2VuZCwgc3JjLCBzcmNTaXplLCBzaW5nbGVTdHJlYW0sIG9sZEh1ZlRhYmxlKTsKKwl9CisKKwkvKiBCdWlsZCBIdWZmbWFuIFRyZWUgKi8KKwlodWZmTG9nID0gSFVGX29wdGltYWxUYWJsZUxvZyhodWZmTG9nLCBzcmNTaXplLCBtYXhTeW1ib2xWYWx1ZSk7CisJeworCQlDSEVDS19WX0YobWF4Qml0cywgSFVGX2J1aWxkQ1RhYmxlX3drc3AoQ1RhYmxlLCBjb3VudCwgbWF4U3ltYm9sVmFsdWUsIGh1ZmZMb2csIHdvcmtTcGFjZSwgd2tzcFNpemUpKTsKKwkJaHVmZkxvZyA9IChVMzIpbWF4Qml0czsKKwkJLyogWmVybyB0aGUgdW51c2VkIHN5bWJvbHMgc28gd2UgY2FuIGNoZWNrIGl0IGZvciB2YWxpZGl0eSAqLworCQltZW1zZXQoQ1RhYmxlICsgbWF4U3ltYm9sVmFsdWUgKyAxLCAwLCBDVGFibGVTaXplIC0gKG1heFN5bWJvbFZhbHVlICsgMSkgKiBzaXplb2YoSFVGX0NFbHQpKTsKKwl9CisKKwkvKiBXcml0ZSB0YWJsZSBkZXNjcmlwdGlvbiBoZWFkZXIgKi8KKwl7CisJCUNIRUNLX1ZfRihoU2l6ZSwgSFVGX3dyaXRlQ1RhYmxlX3drc3Aob3AsIGRzdFNpemUsIENUYWJsZSwgbWF4U3ltYm9sVmFsdWUsIGh1ZmZMb2csIHdvcmtTcGFjZSwgd2tzcFNpemUpKTsKKwkJLyogQ2hlY2sgaWYgdXNpbmcgdGhlIHByZXZpb3VzIHRhYmxlIHdpbGwgYmUgYmVuZWZpY2lhbCAqLworCQlpZiAocmVwZWF0ICYmICpyZXBlYXQgIT0gSFVGX3JlcGVhdF9ub25lKSB7CisJCQlzaXplX3QgY29uc3Qgb2xkU2l6ZSA9IEhVRl9lc3RpbWF0ZUNvbXByZXNzZWRTaXplKG9sZEh1ZlRhYmxlLCBjb3VudCwgbWF4U3ltYm9sVmFsdWUpOworCQkJc2l6ZV90IGNvbnN0IG5ld1NpemUgPSBIVUZfZXN0aW1hdGVDb21wcmVzc2VkU2l6ZShDVGFibGUsIGNvdW50LCBtYXhTeW1ib2xWYWx1ZSk7CisJCQlpZiAob2xkU2l6ZSA8PSBoU2l6ZSArIG5ld1NpemUgfHwgaFNpemUgKyAxMiA+PSBzcmNTaXplKSB7CisJCQkJcmV0dXJuIEhVRl9jb21wcmVzc0NUYWJsZV9pbnRlcm5hbChvc3RhcnQsIG9wLCBvZW5kLCBzcmMsIHNyY1NpemUsIHNpbmdsZVN0cmVhbSwgb2xkSHVmVGFibGUpOworCQkJfQorCQl9CisJCS8qIFVzZSB0aGUgbmV3IHRhYmxlICovCisJCWlmIChoU2l6ZSArIDEydWwgPj0gc3JjU2l6ZSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJb3AgKz0gaFNpemU7CisJCWlmIChyZXBlYXQpIHsKKwkJCSpyZXBlYXQgPSBIVUZfcmVwZWF0X25vbmU7CisJCX0KKwkJaWYgKG9sZEh1ZlRhYmxlKSB7CisJCQltZW1jcHkob2xkSHVmVGFibGUsIENUYWJsZSwgQ1RhYmxlU2l6ZSk7CisJCX0gLyogU2F2ZSB0aGUgbmV3IHRhYmxlICovCisJfQorCXJldHVybiBIVUZfY29tcHJlc3NDVGFibGVfaW50ZXJuYWwob3N0YXJ0LCBvcCwgb2VuZCwgc3JjLCBzcmNTaXplLCBzaW5nbGVTdHJlYW0sIENUYWJsZSk7Cit9CisKK3NpemVfdCBIVUZfY29tcHJlc3MxWF93a3NwKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCBodWZmTG9nLCB2b2lkICp3b3JrU3BhY2UsCisJCQkgICBzaXplX3Qgd2tzcFNpemUpCit7CisJcmV0dXJuIEhVRl9jb21wcmVzc19pbnRlcm5hbChkc3QsIGRzdFNpemUsIHNyYywgc3JjU2l6ZSwgbWF4U3ltYm9sVmFsdWUsIGh1ZmZMb2csIDEgLyogc2luZ2xlIHN0cmVhbSAqLywgd29ya1NwYWNlLCB3a3NwU2l6ZSwgTlVMTCwgTlVMTCwgMCk7Cit9CisKK3NpemVfdCBIVUZfY29tcHJlc3MxWF9yZXBlYXQodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIGh1ZmZMb2csIHZvaWQgKndvcmtTcGFjZSwKKwkJCSAgICAgc2l6ZV90IHdrc3BTaXplLCBIVUZfQ0VsdCAqaHVmVGFibGUsIEhVRl9yZXBlYXQgKnJlcGVhdCwgaW50IHByZWZlclJlcGVhdCkKK3sKKwlyZXR1cm4gSFVGX2NvbXByZXNzX2ludGVybmFsKGRzdCwgZHN0U2l6ZSwgc3JjLCBzcmNTaXplLCBtYXhTeW1ib2xWYWx1ZSwgaHVmZkxvZywgMSAvKiBzaW5nbGUgc3RyZWFtICovLCB3b3JrU3BhY2UsIHdrc3BTaXplLCBodWZUYWJsZSwgcmVwZWF0LAorCQkJCSAgICAgcHJlZmVyUmVwZWF0KTsKK30KKworc2l6ZV90IEhVRl9jb21wcmVzczRYX3drc3Aodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3Qgc3JjU2l6ZSwgdW5zaWduZWQgbWF4U3ltYm9sVmFsdWUsIHVuc2lnbmVkIGh1ZmZMb2csIHZvaWQgKndvcmtTcGFjZSwKKwkJCSAgIHNpemVfdCB3a3NwU2l6ZSkKK3sKKwlyZXR1cm4gSFVGX2NvbXByZXNzX2ludGVybmFsKGRzdCwgZHN0U2l6ZSwgc3JjLCBzcmNTaXplLCBtYXhTeW1ib2xWYWx1ZSwgaHVmZkxvZywgMCAvKiA0IHN0cmVhbXMgKi8sIHdvcmtTcGFjZSwgd2tzcFNpemUsIE5VTEwsIE5VTEwsIDApOworfQorCitzaXplX3QgSFVGX2NvbXByZXNzNFhfcmVwZWF0KHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHVuc2lnbmVkIG1heFN5bWJvbFZhbHVlLCB1bnNpZ25lZCBodWZmTG9nLCB2b2lkICp3b3JrU3BhY2UsCisJCQkgICAgIHNpemVfdCB3a3NwU2l6ZSwgSFVGX0NFbHQgKmh1ZlRhYmxlLCBIVUZfcmVwZWF0ICpyZXBlYXQsIGludCBwcmVmZXJSZXBlYXQpCit7CisJcmV0dXJuIEhVRl9jb21wcmVzc19pbnRlcm5hbChkc3QsIGRzdFNpemUsIHNyYywgc3JjU2l6ZSwgbWF4U3ltYm9sVmFsdWUsIGh1ZmZMb2csIDAgLyogNCBzdHJlYW1zICovLCB3b3JrU3BhY2UsIHdrc3BTaXplLCBodWZUYWJsZSwgcmVwZWF0LAorCQkJCSAgICAgcHJlZmVyUmVwZWF0KTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvaHVmX2RlY29tcHJlc3MuYyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvaHVmX2RlY29tcHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI2NDgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9odWZfZGVjb21wcmVzcy5jCkBAIC0wLDAgKzEsOTYwIEBACisvKgorICogSHVmZm1hbiBkZWNvZGVyLCBwYXJ0IG9mIE5ldyBHZW5lcmF0aW9uIEVudHJvcHkgbGlicmFyeQorICogQ29weXJpZ2h0IChDKSAyMDEzLTIwMTYsIFlhbm4gQ29sbGV0LgorICoKKyAqIEJTRCAyLUNsYXVzZSBMaWNlbnNlIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCkKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICogdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBUaGlzIHByb2dyYW0gaXMgZHVhbC1saWNlbnNlZDsgeW91IG1heSBzZWxlY3QKKyAqIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgb3IgQlNEIGxpY2Vuc2UKKyAqICgiQlNEIikuCisgKgorICogWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICogLSBTb3VyY2UgcmVwb3NpdG9yeSA6IGh0dHBzOi8vZ2l0aHViLmNvbS9DeWFuNDk3My9GaW5pdGVTdGF0ZUVudHJvcHkKKyAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQ29tcGlsZXIgc3BlY2lmaWNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBGT1JDRV9JTkxJTkUgc3RhdGljIF9fYWx3YXlzX2lubGluZQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVwZW5kZW5jaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImJpdHN0cmVhbS5oIiAvKiBCSVRfKiAqLworI2luY2x1ZGUgImZzZS5oIiAgICAgICAvKiBoZWFkZXIgY29tcHJlc3Npb24gKi8KKyNpbmNsdWRlICJodWYuaCIKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1jcHksIG1lbXNldCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXJyb3IgTWFuYWdlbWVudAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSFVGX1NUQVRJQ19BU1NFUlQoYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQllbnVtIHsgSFVGX3N0YXRpY19hc3NlcnQgPSAxIC8gKGludCkoISEoYykpIH07IFwKKwl9IC8qIHVzZSBvbmx5ICphZnRlciogdmFyaWFibGUgZGVjbGFyYXRpb25zICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBnZW5lcmljIERUYWJsZURlc2MgICAgICAgKi8KKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgbWF4VGFibGVMb2c7CisJQllURSB0YWJsZVR5cGU7CisJQllURSB0YWJsZUxvZzsKKwlCWVRFIHJlc2VydmVkOworfSBEVGFibGVEZXNjOworCitzdGF0aWMgRFRhYmxlRGVzYyBIVUZfZ2V0RFRhYmxlRGVzYyhjb25zdCBIVUZfRFRhYmxlICp0YWJsZSkKK3sKKwlEVGFibGVEZXNjIGR0ZDsKKwltZW1jcHkoJmR0ZCwgdGFibGUsIHNpemVvZihkdGQpKTsKKwlyZXR1cm4gZHRkOworfQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgc2luZ2xlLXN5bWJvbCBkZWNvZGluZyAgICovCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlCWVRFIGJ5dGU7CisJQllURSBuYkJpdHM7Cit9IEhVRl9ERWx0WDI7IC8qIHNpbmdsZS1zeW1ib2wgZGVjb2RpbmcgKi8KKworc2l6ZV90IEhVRl9yZWFkRFRhYmxlWDJfd2tzcChIVUZfRFRhYmxlICpEVGFibGUsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJVTMyIHRhYmxlTG9nID0gMDsKKwlVMzIgbmJTeW1ib2xzID0gMDsKKwlzaXplX3QgaVNpemU7CisJdm9pZCAqY29uc3QgZHRQdHIgPSBEVGFibGUgKyAxOworCUhVRl9ERWx0WDIgKmNvbnN0IGR0ID0gKEhVRl9ERWx0WDIgKilkdFB0cjsKKworCVUzMiAqcmFua1ZhbDsKKwlCWVRFICpodWZmV2VpZ2h0OworCXNpemVfdCBzcGFjZVVzZWQzMiA9IDA7CisKKwlyYW5rVmFsID0gKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOworCXNwYWNlVXNlZDMyICs9IEhVRl9UQUJMRUxPR19BQlNPTFVURU1BWCArIDE7CisJaHVmZldlaWdodCA9IChCWVRFICopKChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMik7CisJc3BhY2VVc2VkMzIgKz0gQUxJR04oSFVGX1NZTUJPTFZBTFVFX01BWCArIDEsIHNpemVvZihVMzIpKSA+PiAyOworCisJaWYgKChzcGFjZVVzZWQzMiA8PCAyKSA+IHdvcmtzcGFjZVNpemUpCisJCXJldHVybiBFUlJPUih0YWJsZUxvZ190b29MYXJnZSk7CisJd29ya3NwYWNlID0gKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOworCXdvcmtzcGFjZVNpemUgLT0gKHNwYWNlVXNlZDMyIDw8IDIpOworCisJSFVGX1NUQVRJQ19BU1NFUlQoc2l6ZW9mKERUYWJsZURlc2MpID09IHNpemVvZihIVUZfRFRhYmxlKSk7CisJLyogbWVtc2V0KGh1ZmZXZWlnaHQsIDAsIHNpemVvZihodWZmV2VpZ2h0KSk7ICovIC8qIGlzIG5vdCBuZWNlc3NhcnksIGV2ZW4gdGhvdWdoIHNvbWUgYW5hbHl6ZXIgY29tcGxhaW4gLi4uICovCisKKwlpU2l6ZSA9IEhVRl9yZWFkU3RhdHNfd2tzcChodWZmV2VpZ2h0LCBIVUZfU1lNQk9MVkFMVUVfTUFYICsgMSwgcmFua1ZhbCwgJm5iU3ltYm9scywgJnRhYmxlTG9nLCBzcmMsIHNyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJaWYgKEhVRl9pc0Vycm9yKGlTaXplKSkKKwkJcmV0dXJuIGlTaXplOworCisJLyogVGFibGUgaGVhZGVyICovCisJeworCQlEVGFibGVEZXNjIGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7CisJCWlmICh0YWJsZUxvZyA+IChVMzIpKGR0ZC5tYXhUYWJsZUxvZyArIDEpKQorCQkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsgLyogRFRhYmxlIHRvbyBzbWFsbCwgSHVmZm1hbiB0cmVlIGNhbm5vdCBmaXQgaW4gKi8KKwkJZHRkLnRhYmxlVHlwZSA9IDA7CisJCWR0ZC50YWJsZUxvZyA9IChCWVRFKXRhYmxlTG9nOworCQltZW1jcHkoRFRhYmxlLCAmZHRkLCBzaXplb2YoZHRkKSk7CisJfQorCisJLyogQ2FsY3VsYXRlIHN0YXJ0aW5nIHZhbHVlIGZvciBlYWNoIHJhbmsgKi8KKwl7CisJCVUzMiBuLCBuZXh0UmFua1N0YXJ0ID0gMDsKKwkJZm9yIChuID0gMTsgbiA8IHRhYmxlTG9nICsgMTsgbisrKSB7CisJCQlVMzIgY29uc3QgY3VyciA9IG5leHRSYW5rU3RhcnQ7CisJCQluZXh0UmFua1N0YXJ0ICs9IChyYW5rVmFsW25dIDw8IChuIC0gMSkpOworCQkJcmFua1ZhbFtuXSA9IGN1cnI7CisJCX0KKwl9CisKKwkvKiBmaWxsIERUYWJsZSAqLworCXsKKwkJVTMyIG47CisJCWZvciAobiA9IDA7IG4gPCBuYlN5bWJvbHM7IG4rKykgeworCQkJVTMyIGNvbnN0IHcgPSBodWZmV2VpZ2h0W25dOworCQkJVTMyIGNvbnN0IGxlbmd0aCA9ICgxIDw8IHcpID4+IDE7CisJCQlVMzIgdTsKKwkJCUhVRl9ERWx0WDIgRDsKKwkJCUQuYnl0ZSA9IChCWVRFKW47CisJCQlELm5iQml0cyA9IChCWVRFKSh0YWJsZUxvZyArIDEgLSB3KTsKKwkJCWZvciAodSA9IHJhbmtWYWxbd107IHUgPCByYW5rVmFsW3ddICsgbGVuZ3RoOyB1KyspCisJCQkJZHRbdV0gPSBEOworCQkJcmFua1ZhbFt3XSArPSBsZW5ndGg7CisJCX0KKwl9CisKKwlyZXR1cm4gaVNpemU7Cit9CisKK3N0YXRpYyBCWVRFIEhVRl9kZWNvZGVTeW1ib2xYMihCSVRfRFN0cmVhbV90ICpEc3RyZWFtLCBjb25zdCBIVUZfREVsdFgyICpkdCwgY29uc3QgVTMyIGR0TG9nKQoreworCXNpemVfdCBjb25zdCB2YWwgPSBCSVRfbG9va0JpdHNGYXN0KERzdHJlYW0sIGR0TG9nKTsgLyogbm90ZSA6IGR0TG9nID49IDEgKi8KKwlCWVRFIGNvbnN0IGMgPSBkdFt2YWxdLmJ5dGU7CisJQklUX3NraXBCaXRzKERzdHJlYW0sIGR0W3ZhbF0ubmJCaXRzKTsKKwlyZXR1cm4gYzsKK30KKworI2RlZmluZSBIVUZfREVDT0RFX1NZTUJPTFgyXzAocHRyLCBEU3RyZWFtUHRyKSAqcHRyKysgPSBIVUZfZGVjb2RlU3ltYm9sWDIoRFN0cmVhbVB0ciwgZHQsIGR0TG9nKQorCisjZGVmaW5lIEhVRl9ERUNPREVfU1lNQk9MWDJfMShwdHIsIERTdHJlYW1QdHIpICAgICAgICAgXAorCWlmIChaU1REXzY0Yml0cygpIHx8IChIVUZfVEFCTEVMT0dfTUFYIDw9IDEyKSkgXAorCUhVRl9ERUNPREVfU1lNQk9MWDJfMChwdHIsIERTdHJlYW1QdHIpCisKKyNkZWZpbmUgSFVGX0RFQ09ERV9TWU1CT0xYMl8yKHB0ciwgRFN0cmVhbVB0cikgXAorCWlmIChaU1REXzY0Yml0cygpKSAgICAgICAgICAgICAgICAgICAgIFwKKwlIVUZfREVDT0RFX1NZTUJPTFgyXzAocHRyLCBEU3RyZWFtUHRyKQorCitGT1JDRV9JTkxJTkUgc2l6ZV90IEhVRl9kZWNvZGVTdHJlYW1YMihCWVRFICpwLCBCSVRfRFN0cmVhbV90ICpjb25zdCBiaXREUHRyLCBCWVRFICpjb25zdCBwRW5kLCBjb25zdCBIVUZfREVsdFgyICpjb25zdCBkdCwgY29uc3QgVTMyIGR0TG9nKQoreworCUJZVEUgKmNvbnN0IHBTdGFydCA9IHA7CisKKwkvKiB1cCB0byA0IHN5bWJvbHMgYXQgYSB0aW1lICovCisJd2hpbGUgKChCSVRfcmVsb2FkRFN0cmVhbShiaXREUHRyKSA9PSBCSVRfRFN0cmVhbV91bmZpbmlzaGVkKSAmJiAocCA8PSBwRW5kIC0gNCkpIHsKKwkJSFVGX0RFQ09ERV9TWU1CT0xYMl8yKHAsIGJpdERQdHIpOworCQlIVUZfREVDT0RFX1NZTUJPTFgyXzEocCwgYml0RFB0cik7CisJCUhVRl9ERUNPREVfU1lNQk9MWDJfMihwLCBiaXREUHRyKTsKKwkJSFVGX0RFQ09ERV9TWU1CT0xYMl8wKHAsIGJpdERQdHIpOworCX0KKworCS8qIGNsb3NlciB0byB0aGUgZW5kICovCisJd2hpbGUgKChCSVRfcmVsb2FkRFN0cmVhbShiaXREUHRyKSA9PSBCSVRfRFN0cmVhbV91bmZpbmlzaGVkKSAmJiAocCA8IHBFbmQpKQorCQlIVUZfREVDT0RFX1NZTUJPTFgyXzAocCwgYml0RFB0cik7CisKKwkvKiBubyBtb3JlIGRhdGEgdG8gcmV0cmlldmUgZnJvbSBiaXRzdHJlYW0sIGhlbmNlIG5vIG5lZWQgdG8gcmVsb2FkICovCisJd2hpbGUgKHAgPCBwRW5kKQorCQlIVUZfREVDT0RFX1NZTUJPTFgyXzAocCwgYml0RFB0cik7CisKKwlyZXR1cm4gcEVuZCAtIHBTdGFydDsKK30KKworc3RhdGljIHNpemVfdCBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZV9pbnRlcm5hbCh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkKK3sKKwlCWVRFICpvcCA9IChCWVRFICopZHN0OworCUJZVEUgKmNvbnN0IG9lbmQgPSBvcCArIGRzdFNpemU7CisJY29uc3Qgdm9pZCAqZHRQdHIgPSBEVGFibGUgKyAxOworCWNvbnN0IEhVRl9ERWx0WDIgKmNvbnN0IGR0ID0gKGNvbnN0IEhVRl9ERWx0WDIgKilkdFB0cjsKKwlCSVRfRFN0cmVhbV90IGJpdEQ7CisJRFRhYmxlRGVzYyBjb25zdCBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOworCVUzMiBjb25zdCBkdExvZyA9IGR0ZC50YWJsZUxvZzsKKworCXsKKwkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RCwgY1NyYywgY1NyY1NpemUpOworCQlpZiAoSFVGX2lzRXJyb3IoZXJyb3JDb2RlKSkKKwkJCXJldHVybiBlcnJvckNvZGU7CisJfQorCisJSFVGX2RlY29kZVN0cmVhbVgyKG9wLCAmYml0RCwgb2VuZCwgZHQsIGR0TG9nKTsKKworCS8qIGNoZWNrICovCisJaWYgKCFCSVRfZW5kT2ZEU3RyZWFtKCZiaXREKSkKKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCisJcmV0dXJuIGRzdFNpemU7Cit9CisKK3NpemVfdCBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkKK3sKKwlEVGFibGVEZXNjIGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7CisJaWYgKGR0ZC50YWJsZVR5cGUgIT0gMCkKKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOworCXJldHVybiBIVUZfZGVjb21wcmVzczFYMl91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIGRzdFNpemUsIGNTcmMsIGNTcmNTaXplLCBEVGFibGUpOworfQorCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWDJfREN0eF93a3NwKEhVRl9EVGFibGUgKkRDdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopY1NyYzsKKworCXNpemVfdCBjb25zdCBoU2l6ZSA9IEhVRl9yZWFkRFRhYmxlWDJfd2tzcChEQ3R4LCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwlpZiAoSFVGX2lzRXJyb3IoaFNpemUpKQorCQlyZXR1cm4gaFNpemU7CisJaWYgKGhTaXplID49IGNTcmNTaXplKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJaXAgKz0gaFNpemU7CisJY1NyY1NpemUgLT0gaFNpemU7CisKKwlyZXR1cm4gSFVGX2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RTaXplLCBpcCwgY1NyY1NpemUsIERDdHgpOworfQorCitzdGF0aWMgc2l6ZV90IEhVRl9kZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlX2ludGVybmFsKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKQoreworCS8qIENoZWNrICovCisJaWYgKGNTcmNTaXplIDwgMTApCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogc3RyaWN0IG1pbmltdW0gOiBqdW1wIHRhYmxlICsgMSBieXRlIHBlciBzdHJlYW0gKi8KKworCXsKKwkJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKiljU3JjOworCQlCWVRFICpjb25zdCBvc3RhcnQgPSAoQllURSAqKWRzdDsKKwkJQllURSAqY29uc3Qgb2VuZCA9IG9zdGFydCArIGRzdFNpemU7CisJCWNvbnN0IHZvaWQgKmNvbnN0IGR0UHRyID0gRFRhYmxlICsgMTsKKwkJY29uc3QgSFVGX0RFbHRYMiAqY29uc3QgZHQgPSAoY29uc3QgSFVGX0RFbHRYMiAqKWR0UHRyOworCisJCS8qIEluaXQgKi8KKwkJQklUX0RTdHJlYW1fdCBiaXREMTsKKwkJQklUX0RTdHJlYW1fdCBiaXREMjsKKwkJQklUX0RTdHJlYW1fdCBiaXREMzsKKwkJQklUX0RTdHJlYW1fdCBiaXRENDsKKwkJc2l6ZV90IGNvbnN0IGxlbmd0aDEgPSBaU1REX3JlYWRMRTE2KGlzdGFydCk7CisJCXNpemVfdCBjb25zdCBsZW5ndGgyID0gWlNURF9yZWFkTEUxNihpc3RhcnQgKyAyKTsKKwkJc2l6ZV90IGNvbnN0IGxlbmd0aDMgPSBaU1REX3JlYWRMRTE2KGlzdGFydCArIDQpOworCQlzaXplX3QgY29uc3QgbGVuZ3RoNCA9IGNTcmNTaXplIC0gKGxlbmd0aDEgKyBsZW5ndGgyICsgbGVuZ3RoMyArIDYpOworCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQxID0gaXN0YXJ0ICsgNjsgLyoganVtcFRhYmxlICovCisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydDIgPSBpc3RhcnQxICsgbGVuZ3RoMTsKKwkJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0MyA9IGlzdGFydDIgKyBsZW5ndGgyOworCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQ0ID0gaXN0YXJ0MyArIGxlbmd0aDM7CisJCWNvbnN0IHNpemVfdCBzZWdtZW50U2l6ZSA9IChkc3RTaXplICsgMykgLyA0OworCQlCWVRFICpjb25zdCBvcFN0YXJ0MiA9IG9zdGFydCArIHNlZ21lbnRTaXplOworCQlCWVRFICpjb25zdCBvcFN0YXJ0MyA9IG9wU3RhcnQyICsgc2VnbWVudFNpemU7CisJCUJZVEUgKmNvbnN0IG9wU3RhcnQ0ID0gb3BTdGFydDMgKyBzZWdtZW50U2l6ZTsKKwkJQllURSAqb3AxID0gb3N0YXJ0OworCQlCWVRFICpvcDIgPSBvcFN0YXJ0MjsKKwkJQllURSAqb3AzID0gb3BTdGFydDM7CisJCUJZVEUgKm9wNCA9IG9wU3RhcnQ0OworCQlVMzIgZW5kU2lnbmFsOworCQlEVGFibGVEZXNjIGNvbnN0IGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7CisJCVUzMiBjb25zdCBkdExvZyA9IGR0ZC50YWJsZUxvZzsKKworCQlpZiAobGVuZ3RoNCA+IGNTcmNTaXplKQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOyAvKiBvdmVyZmxvdyAqLworCQl7CisJCQlzaXplX3QgY29uc3QgZXJyb3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZiaXREMSwgaXN0YXJ0MSwgbGVuZ3RoMSk7CisJCQlpZiAoSFVGX2lzRXJyb3IoZXJyb3JDb2RlKSkKKwkJCQlyZXR1cm4gZXJyb3JDb2RlOworCQl9CisJCXsKKwkJCXNpemVfdCBjb25zdCBlcnJvckNvZGUgPSBCSVRfaW5pdERTdHJlYW0oJmJpdEQyLCBpc3RhcnQyLCBsZW5ndGgyKTsKKwkJCWlmIChIVUZfaXNFcnJvcihlcnJvckNvZGUpKQorCQkJCXJldHVybiBlcnJvckNvZGU7CisJCX0KKwkJeworCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RDMsIGlzdGFydDMsIGxlbmd0aDMpOworCQkJaWYgKEhVRl9pc0Vycm9yKGVycm9yQ29kZSkpCisJCQkJcmV0dXJuIGVycm9yQ29kZTsKKwkJfQorCQl7CisJCQlzaXplX3QgY29uc3QgZXJyb3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZiaXRENCwgaXN0YXJ0NCwgbGVuZ3RoNCk7CisJCQlpZiAoSFVGX2lzRXJyb3IoZXJyb3JDb2RlKSkKKwkJCQlyZXR1cm4gZXJyb3JDb2RlOworCQl9CisKKwkJLyogMTYtMzIgc3ltYm9scyBwZXIgbG9vcCAoNC04IHN5bWJvbHMgcGVyIHN0cmVhbSkgKi8KKwkJZW5kU2lnbmFsID0gQklUX3JlbG9hZERTdHJlYW0oJmJpdEQxKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMikgfCBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDMpIHwgQklUX3JlbG9hZERTdHJlYW0oJmJpdEQ0KTsKKwkJZm9yICg7IChlbmRTaWduYWwgPT0gQklUX0RTdHJlYW1fdW5maW5pc2hlZCkgJiYgKG9wNCA8IChvZW5kIC0gNykpOykgeworCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8yKG9wMSwgJmJpdEQxKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMihvcDIsICZiaXREMik7CisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzIob3AzLCAmYml0RDMpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8yKG9wNCwgJmJpdEQ0KTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMShvcDEsICZiaXREMSk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzEob3AyLCAmYml0RDIpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8xKG9wMywgJmJpdEQzKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMShvcDQsICZiaXRENCk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzIob3AxLCAmYml0RDEpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8yKG9wMiwgJmJpdEQyKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMihvcDMsICZiaXREMyk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzIob3A0LCAmYml0RDQpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8wKG9wMSwgJmJpdEQxKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDJfMChvcDIsICZiaXREMik7CisJCQlIVUZfREVDT0RFX1NZTUJPTFgyXzAob3AzLCAmYml0RDMpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYMl8wKG9wNCwgJmJpdEQ0KTsKKwkJCWVuZFNpZ25hbCA9IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMSkgfCBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDIpIHwgQklUX3JlbG9hZERTdHJlYW0oJmJpdEQzKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXRENCk7CisJCX0KKworCQkvKiBjaGVjayBjb3JydXB0aW9uICovCisJCWlmIChvcDEgPiBvcFN0YXJ0MikKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJaWYgKG9wMiA+IG9wU3RhcnQzKQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQlpZiAob3AzID4gb3BTdGFydDQpCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisJCS8qIG5vdGUgOiBvcDQgc3VwcG9zZWQgYWxyZWFkeSB2ZXJpZmllZCB3aXRoaW4gbWFpbiBsb29wICovCisKKwkJLyogZmluaXNoIGJpdFN0cmVhbXMgb25lIGJ5IG9uZSAqLworCQlIVUZfZGVjb2RlU3RyZWFtWDIob3AxLCAmYml0RDEsIG9wU3RhcnQyLCBkdCwgZHRMb2cpOworCQlIVUZfZGVjb2RlU3RyZWFtWDIob3AyLCAmYml0RDIsIG9wU3RhcnQzLCBkdCwgZHRMb2cpOworCQlIVUZfZGVjb2RlU3RyZWFtWDIob3AzLCAmYml0RDMsIG9wU3RhcnQ0LCBkdCwgZHRMb2cpOworCQlIVUZfZGVjb2RlU3RyZWFtWDIob3A0LCAmYml0RDQsIG9lbmQsIGR0LCBkdExvZyk7CisKKwkJLyogY2hlY2sgKi8KKwkJZW5kU2lnbmFsID0gQklUX2VuZE9mRFN0cmVhbSgmYml0RDEpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDIpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDMpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDQpOworCQlpZiAoIWVuZFNpZ25hbCkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKworCQkvKiBkZWNvZGVkIHNpemUgKi8KKwkJcmV0dXJuIGRzdFNpemU7CisJfQorfQorCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WDJfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpCit7CisJRFRhYmxlRGVzYyBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOworCWlmIChkdGQudGFibGVUeXBlICE9IDApCisJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwlyZXR1cm4gSFVGX2RlY29tcHJlc3M0WDJfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKTsKK30KKworc2l6ZV90IEhVRl9kZWNvbXByZXNzNFgyX0RDdHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKWNTcmM7CisKKwlzaXplX3QgY29uc3QgaFNpemUgPSBIVUZfcmVhZERUYWJsZVgyX3drc3AoZGN0eCwgY1NyYywgY1NyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJaWYgKEhVRl9pc0Vycm9yKGhTaXplKSkKKwkJcmV0dXJuIGhTaXplOworCWlmIChoU2l6ZSA+PSBjU3JjU2l6ZSkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCWlwICs9IGhTaXplOworCWNTcmNTaXplIC09IGhTaXplOworCisJcmV0dXJuIEhVRl9kZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlX2ludGVybmFsKGRzdCwgZHN0U2l6ZSwgaXAsIGNTcmNTaXplLCBkY3R4KTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGRvdWJsZS1zeW1ib2xzIGRlY29kaW5nICovCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgeworCVUxNiBzZXF1ZW5jZTsKKwlCWVRFIG5iQml0czsKKwlCWVRFIGxlbmd0aDsKK30gSFVGX0RFbHRYNDsgLyogZG91YmxlLXN5bWJvbHMgZGVjb2RpbmcgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCUJZVEUgc3ltYm9sOworCUJZVEUgd2VpZ2h0OworfSBzb3J0ZWRTeW1ib2xfdDsKKworLyogSFVGX2ZpbGxEVGFibGVYNExldmVsMigpIDoKKyAqIGByYW5rVmFsT3JpZ2luYCBtdXN0IGJlIGEgdGFibGUgb2YgYXQgbGVhc3QgKEhVRl9UQUJMRUxPR19NQVggKyAxKSBVMzIgKi8KK3N0YXRpYyB2b2lkIEhVRl9maWxsRFRhYmxlWDRMZXZlbDIoSFVGX0RFbHRYNCAqRFRhYmxlLCBVMzIgc2l6ZUxvZywgY29uc3QgVTMyIGNvbnN1bWVkLCBjb25zdCBVMzIgKnJhbmtWYWxPcmlnaW4sIGNvbnN0IGludCBtaW5XZWlnaHQsCisJCQkJICAgY29uc3Qgc29ydGVkU3ltYm9sX3QgKnNvcnRlZFN5bWJvbHMsIGNvbnN0IFUzMiBzb3J0ZWRMaXN0U2l6ZSwgVTMyIG5iQml0c0Jhc2VsaW5lLCBVMTYgYmFzZVNlcSkKK3sKKwlIVUZfREVsdFg0IERFbHQ7CisJVTMyIHJhbmtWYWxbSFVGX1RBQkxFTE9HX01BWCArIDFdOworCisJLyogZ2V0IHByZS1jYWxjdWxhdGVkIHJhbmtWYWwgKi8KKwltZW1jcHkocmFua1ZhbCwgcmFua1ZhbE9yaWdpbiwgc2l6ZW9mKHJhbmtWYWwpKTsKKworCS8qIGZpbGwgc2tpcHBlZCB2YWx1ZXMgKi8KKwlpZiAobWluV2VpZ2h0ID4gMSkgeworCQlVMzIgaSwgc2tpcFNpemUgPSByYW5rVmFsW21pbldlaWdodF07CisJCVpTVERfd3JpdGVMRTE2KCYoREVsdC5zZXF1ZW5jZSksIGJhc2VTZXEpOworCQlERWx0Lm5iQml0cyA9IChCWVRFKShjb25zdW1lZCk7CisJCURFbHQubGVuZ3RoID0gMTsKKwkJZm9yIChpID0gMDsgaSA8IHNraXBTaXplOyBpKyspCisJCQlEVGFibGVbaV0gPSBERWx0OworCX0KKworCS8qIGZpbGwgRFRhYmxlICovCisJeworCQlVMzIgczsKKwkJZm9yIChzID0gMDsgcyA8IHNvcnRlZExpc3RTaXplOyBzKyspIHsgLyogbm90ZSA6IHNvcnRlZFN5bWJvbHMgYWxyZWFkeSBza2lwcGVkICovCisJCQljb25zdCBVMzIgc3ltYm9sID0gc29ydGVkU3ltYm9sc1tzXS5zeW1ib2w7CisJCQljb25zdCBVMzIgd2VpZ2h0ID0gc29ydGVkU3ltYm9sc1tzXS53ZWlnaHQ7CisJCQljb25zdCBVMzIgbmJCaXRzID0gbmJCaXRzQmFzZWxpbmUgLSB3ZWlnaHQ7CisJCQljb25zdCBVMzIgbGVuZ3RoID0gMSA8PCAoc2l6ZUxvZyAtIG5iQml0cyk7CisJCQljb25zdCBVMzIgc3RhcnQgPSByYW5rVmFsW3dlaWdodF07CisJCQlVMzIgaSA9IHN0YXJ0OworCQkJY29uc3QgVTMyIGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOworCisJCQlaU1REX3dyaXRlTEUxNigmKERFbHQuc2VxdWVuY2UpLCAoVTE2KShiYXNlU2VxICsgKHN5bWJvbCA8PCA4KSkpOworCQkJREVsdC5uYkJpdHMgPSAoQllURSkobmJCaXRzICsgY29uc3VtZWQpOworCQkJREVsdC5sZW5ndGggPSAyOworCQkJZG8geworCQkJCURUYWJsZVtpKytdID0gREVsdDsKKwkJCX0gd2hpbGUgKGkgPCBlbmQpOyAvKiBzaW5jZSBsZW5ndGggPj0gMSAqLworCisJCQlyYW5rVmFsW3dlaWdodF0gKz0gbGVuZ3RoOworCQl9CisJfQorfQorCit0eXBlZGVmIFUzMiByYW5rVmFsX3RbSFVGX1RBQkxFTE9HX01BWF1bSFVGX1RBQkxFTE9HX01BWCArIDFdOwordHlwZWRlZiBVMzIgcmFua1ZhbENvbF90W0hVRl9UQUJMRUxPR19NQVggKyAxXTsKKworc3RhdGljIHZvaWQgSFVGX2ZpbGxEVGFibGVYNChIVUZfREVsdFg0ICpEVGFibGUsIGNvbnN0IFUzMiB0YXJnZXRMb2csIGNvbnN0IHNvcnRlZFN5bWJvbF90ICpzb3J0ZWRMaXN0LCBjb25zdCBVMzIgc29ydGVkTGlzdFNpemUsIGNvbnN0IFUzMiAqcmFua1N0YXJ0LAorCQkJICAgICByYW5rVmFsX3QgcmFua1ZhbE9yaWdpbiwgY29uc3QgVTMyIG1heFdlaWdodCwgY29uc3QgVTMyIG5iQml0c0Jhc2VsaW5lKQoreworCVUzMiByYW5rVmFsW0hVRl9UQUJMRUxPR19NQVggKyAxXTsKKwljb25zdCBpbnQgc2NhbGVMb2cgPSBuYkJpdHNCYXNlbGluZSAtIHRhcmdldExvZzsgLyogbm90ZSA6IHRhcmdldExvZyA+PSBzcmNMb2csIGhlbmNlIHNjYWxlTG9nIDw9IDEgKi8KKwljb25zdCBVMzIgbWluQml0cyA9IG5iQml0c0Jhc2VsaW5lIC0gbWF4V2VpZ2h0OworCVUzMiBzOworCisJbWVtY3B5KHJhbmtWYWwsIHJhbmtWYWxPcmlnaW4sIHNpemVvZihyYW5rVmFsKSk7CisKKwkvKiBmaWxsIERUYWJsZSAqLworCWZvciAocyA9IDA7IHMgPCBzb3J0ZWRMaXN0U2l6ZTsgcysrKSB7CisJCWNvbnN0IFUxNiBzeW1ib2wgPSBzb3J0ZWRMaXN0W3NdLnN5bWJvbDsKKwkJY29uc3QgVTMyIHdlaWdodCA9IHNvcnRlZExpc3Rbc10ud2VpZ2h0OworCQljb25zdCBVMzIgbmJCaXRzID0gbmJCaXRzQmFzZWxpbmUgLSB3ZWlnaHQ7CisJCWNvbnN0IFUzMiBzdGFydCA9IHJhbmtWYWxbd2VpZ2h0XTsKKwkJY29uc3QgVTMyIGxlbmd0aCA9IDEgPDwgKHRhcmdldExvZyAtIG5iQml0cyk7CisKKwkJaWYgKHRhcmdldExvZyAtIG5iQml0cyA+PSBtaW5CaXRzKSB7IC8qIGVub3VnaCByb29tIGZvciBhIHNlY29uZCBzeW1ib2wgKi8KKwkJCVUzMiBzb3J0ZWRSYW5rOworCQkJaW50IG1pbldlaWdodCA9IG5iQml0cyArIHNjYWxlTG9nOworCQkJaWYgKG1pbldlaWdodCA8IDEpCisJCQkJbWluV2VpZ2h0ID0gMTsKKwkJCXNvcnRlZFJhbmsgPSByYW5rU3RhcnRbbWluV2VpZ2h0XTsKKwkJCUhVRl9maWxsRFRhYmxlWDRMZXZlbDIoRFRhYmxlICsgc3RhcnQsIHRhcmdldExvZyAtIG5iQml0cywgbmJCaXRzLCByYW5rVmFsT3JpZ2luW25iQml0c10sIG1pbldlaWdodCwgc29ydGVkTGlzdCArIHNvcnRlZFJhbmssCisJCQkJCSAgICAgICBzb3J0ZWRMaXN0U2l6ZSAtIHNvcnRlZFJhbmssIG5iQml0c0Jhc2VsaW5lLCBzeW1ib2wpOworCQl9IGVsc2UgeworCQkJSFVGX0RFbHRYNCBERWx0OworCQkJWlNURF93cml0ZUxFMTYoJihERWx0LnNlcXVlbmNlKSwgc3ltYm9sKTsKKwkJCURFbHQubmJCaXRzID0gKEJZVEUpKG5iQml0cyk7CisJCQlERWx0Lmxlbmd0aCA9IDE7CisJCQl7CisJCQkJVTMyIGNvbnN0IGVuZCA9IHN0YXJ0ICsgbGVuZ3RoOworCQkJCVUzMiB1OworCQkJCWZvciAodSA9IHN0YXJ0OyB1IDwgZW5kOyB1KyspCisJCQkJCURUYWJsZVt1XSA9IERFbHQ7CisJCQl9CisJCX0KKwkJcmFua1ZhbFt3ZWlnaHRdICs9IGxlbmd0aDsKKwl9Cit9CisKK3NpemVfdCBIVUZfcmVhZERUYWJsZVg0X3drc3AoSFVGX0RUYWJsZSAqRFRhYmxlLCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCVUzMiB0YWJsZUxvZywgbWF4Vywgc2l6ZU9mU29ydCwgbmJTeW1ib2xzOworCURUYWJsZURlc2MgZHRkID0gSFVGX2dldERUYWJsZURlc2MoRFRhYmxlKTsKKwlVMzIgY29uc3QgbWF4VGFibGVMb2cgPSBkdGQubWF4VGFibGVMb2c7CisJc2l6ZV90IGlTaXplOworCXZvaWQgKmR0UHRyID0gRFRhYmxlICsgMTsgLyogZm9yY2UgY29tcGlsZXIgdG8gYXZvaWQgc3RyaWN0LWFsaWFzaW5nICovCisJSFVGX0RFbHRYNCAqY29uc3QgZHQgPSAoSFVGX0RFbHRYNCAqKWR0UHRyOworCVUzMiAqcmFua1N0YXJ0OworCisJcmFua1ZhbENvbF90ICpyYW5rVmFsOworCVUzMiAqcmFua1N0YXRzOworCVUzMiAqcmFua1N0YXJ0MDsKKwlzb3J0ZWRTeW1ib2xfdCAqc29ydGVkU3ltYm9sOworCUJZVEUgKndlaWdodExpc3Q7CisJc2l6ZV90IHNwYWNlVXNlZDMyID0gMDsKKworCUhVRl9TVEFUSUNfQVNTRVJUKChzaXplb2YocmFua1ZhbENvbF90KSAmIDMpID09IDApOworCisJcmFua1ZhbCA9IChyYW5rVmFsQ29sX3QgKikoKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyKTsKKwlzcGFjZVVzZWQzMiArPSAoc2l6ZW9mKHJhbmtWYWxDb2xfdCkgKiBIVUZfVEFCTEVMT0dfTUFYKSA+PiAyOworCXJhbmtTdGF0cyA9IChVMzIgKil3b3Jrc3BhY2UgKyBzcGFjZVVzZWQzMjsKKwlzcGFjZVVzZWQzMiArPSBIVUZfVEFCTEVMT0dfTUFYICsgMTsKKwlyYW5rU3RhcnQwID0gKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyOworCXNwYWNlVXNlZDMyICs9IEhVRl9UQUJMRUxPR19NQVggKyAyOworCXNvcnRlZFN5bWJvbCA9IChzb3J0ZWRTeW1ib2xfdCAqKSgoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzIpOworCXNwYWNlVXNlZDMyICs9IEFMSUdOKHNpemVvZihzb3J0ZWRTeW1ib2xfdCkgKiAoSFVGX1NZTUJPTFZBTFVFX01BWCArIDEpLCBzaXplb2YoVTMyKSkgPj4gMjsKKwl3ZWlnaHRMaXN0ID0gKEJZVEUgKikoKFUzMiAqKXdvcmtzcGFjZSArIHNwYWNlVXNlZDMyKTsKKwlzcGFjZVVzZWQzMiArPSBBTElHTihIVUZfU1lNQk9MVkFMVUVfTUFYICsgMSwgc2l6ZW9mKFUzMikpID4+IDI7CisKKwlpZiAoKHNwYWNlVXNlZDMyIDw8IDIpID4gd29ya3NwYWNlU2l6ZSkKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsKKwl3b3Jrc3BhY2UgPSAoVTMyICopd29ya3NwYWNlICsgc3BhY2VVc2VkMzI7CisJd29ya3NwYWNlU2l6ZSAtPSAoc3BhY2VVc2VkMzIgPDwgMik7CisKKwlyYW5rU3RhcnQgPSByYW5rU3RhcnQwICsgMTsKKwltZW1zZXQocmFua1N0YXRzLCAwLCBzaXplb2YoVTMyKSAqICgyICogSFVGX1RBQkxFTE9HX01BWCArIDIgKyAxKSk7CisKKwlIVUZfU1RBVElDX0FTU0VSVChzaXplb2YoSFVGX0RFbHRYNCkgPT0gc2l6ZW9mKEhVRl9EVGFibGUpKTsgLyogaWYgY29tcGlsZXIgZmFpbHMgaGVyZSwgYXNzZXJ0aW9uIGlzIHdyb25nICovCisJaWYgKG1heFRhYmxlTG9nID4gSFVGX1RBQkxFTE9HX01BWCkKKwkJcmV0dXJuIEVSUk9SKHRhYmxlTG9nX3Rvb0xhcmdlKTsKKwkvKiBtZW1zZXQod2VpZ2h0TGlzdCwgMCwgc2l6ZW9mKHdlaWdodExpc3QpKTsgKi8gLyogaXMgbm90IG5lY2Vzc2FyeSwgZXZlbiB0aG91Z2ggc29tZSBhbmFseXplciBjb21wbGFpbiAuLi4gKi8KKworCWlTaXplID0gSFVGX3JlYWRTdGF0c193a3NwKHdlaWdodExpc3QsIEhVRl9TWU1CT0xWQUxVRV9NQVggKyAxLCByYW5rU3RhdHMsICZuYlN5bWJvbHMsICZ0YWJsZUxvZywgc3JjLCBzcmNTaXplLCB3b3Jrc3BhY2UsIHdvcmtzcGFjZVNpemUpOworCWlmIChIVUZfaXNFcnJvcihpU2l6ZSkpCisJCXJldHVybiBpU2l6ZTsKKworCS8qIGNoZWNrIHJlc3VsdCAqLworCWlmICh0YWJsZUxvZyA+IG1heFRhYmxlTG9nKQorCQlyZXR1cm4gRVJST1IodGFibGVMb2dfdG9vTGFyZ2UpOyAvKiBEVGFibGUgY2FuJ3QgZml0IGNvZGUgZGVwdGggKi8KKworCS8qIGZpbmQgbWF4V2VpZ2h0ICovCisJZm9yIChtYXhXID0gdGFibGVMb2c7IHJhbmtTdGF0c1ttYXhXXSA9PSAwOyBtYXhXLS0pIHsKKwl9IC8qIG5lY2Vzc2FyaWx5IGZpbmRzIGEgc29sdXRpb24gYmVmb3JlIDAgKi8KKworCS8qIEdldCBzdGFydCBpbmRleCBvZiBlYWNoIHdlaWdodCAqLworCXsKKwkJVTMyIHcsIG5leHRSYW5rU3RhcnQgPSAwOworCQlmb3IgKHcgPSAxOyB3IDwgbWF4VyArIDE7IHcrKykgeworCQkJVTMyIGN1cnIgPSBuZXh0UmFua1N0YXJ0OworCQkJbmV4dFJhbmtTdGFydCArPSByYW5rU3RhdHNbd107CisJCQlyYW5rU3RhcnRbd10gPSBjdXJyOworCQl9CisJCXJhbmtTdGFydFswXSA9IG5leHRSYW5rU3RhcnQ7IC8qIHB1dCBhbGwgMHcgc3ltYm9scyBhdCB0aGUgZW5kIG9mIHNvcnRlZCBsaXN0Ki8KKwkJc2l6ZU9mU29ydCA9IG5leHRSYW5rU3RhcnQ7CisJfQorCisJLyogc29ydCBzeW1ib2xzIGJ5IHdlaWdodCAqLworCXsKKwkJVTMyIHM7CisJCWZvciAocyA9IDA7IHMgPCBuYlN5bWJvbHM7IHMrKykgeworCQkJVTMyIGNvbnN0IHcgPSB3ZWlnaHRMaXN0W3NdOworCQkJVTMyIGNvbnN0IHIgPSByYW5rU3RhcnRbd10rKzsKKwkJCXNvcnRlZFN5bWJvbFtyXS5zeW1ib2wgPSAoQllURSlzOworCQkJc29ydGVkU3ltYm9sW3JdLndlaWdodCA9IChCWVRFKXc7CisJCX0KKwkJcmFua1N0YXJ0WzBdID0gMDsgLyogZm9yZ2V0IDB3IHN5bWJvbHM7IHRoaXMgaXMgYmVnaW5uaW5nIG9mIHdlaWdodCgxKSAqLworCX0KKworCS8qIEJ1aWxkIHJhbmtWYWwgKi8KKwl7CisJCVUzMiAqY29uc3QgcmFua1ZhbDAgPSByYW5rVmFsWzBdOworCQl7CisJCQlpbnQgY29uc3QgcmVzY2FsZSA9IChtYXhUYWJsZUxvZyAtIHRhYmxlTG9nKSAtIDE7IC8qIHRhYmxlTG9nIDw9IG1heFRhYmxlTG9nICovCisJCQlVMzIgbmV4dFJhbmtWYWwgPSAwOworCQkJVTMyIHc7CisJCQlmb3IgKHcgPSAxOyB3IDwgbWF4VyArIDE7IHcrKykgeworCQkJCVUzMiBjdXJyID0gbmV4dFJhbmtWYWw7CisJCQkJbmV4dFJhbmtWYWwgKz0gcmFua1N0YXRzW3ddIDw8ICh3ICsgcmVzY2FsZSk7CisJCQkJcmFua1ZhbDBbd10gPSBjdXJyOworCQkJfQorCQl9CisJCXsKKwkJCVUzMiBjb25zdCBtaW5CaXRzID0gdGFibGVMb2cgKyAxIC0gbWF4VzsKKwkJCVUzMiBjb25zdW1lZDsKKwkJCWZvciAoY29uc3VtZWQgPSBtaW5CaXRzOyBjb25zdW1lZCA8IG1heFRhYmxlTG9nIC0gbWluQml0cyArIDE7IGNvbnN1bWVkKyspIHsKKwkJCQlVMzIgKmNvbnN0IHJhbmtWYWxQdHIgPSByYW5rVmFsW2NvbnN1bWVkXTsKKwkJCQlVMzIgdzsKKwkJCQlmb3IgKHcgPSAxOyB3IDwgbWF4VyArIDE7IHcrKykgeworCQkJCQlyYW5rVmFsUHRyW3ddID0gcmFua1ZhbDBbd10gPj4gY29uc3VtZWQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJSFVGX2ZpbGxEVGFibGVYNChkdCwgbWF4VGFibGVMb2csIHNvcnRlZFN5bWJvbCwgc2l6ZU9mU29ydCwgcmFua1N0YXJ0MCwgcmFua1ZhbCwgbWF4VywgdGFibGVMb2cgKyAxKTsKKworCWR0ZC50YWJsZUxvZyA9IChCWVRFKW1heFRhYmxlTG9nOworCWR0ZC50YWJsZVR5cGUgPSAxOworCW1lbWNweShEVGFibGUsICZkdGQsIHNpemVvZihkdGQpKTsKKwlyZXR1cm4gaVNpemU7Cit9CisKK3N0YXRpYyBVMzIgSFVGX2RlY29kZVN5bWJvbFg0KHZvaWQgKm9wLCBCSVRfRFN0cmVhbV90ICpEU3RyZWFtLCBjb25zdCBIVUZfREVsdFg0ICpkdCwgY29uc3QgVTMyIGR0TG9nKQoreworCXNpemVfdCBjb25zdCB2YWwgPSBCSVRfbG9va0JpdHNGYXN0KERTdHJlYW0sIGR0TG9nKTsgLyogbm90ZSA6IGR0TG9nID49IDEgKi8KKwltZW1jcHkob3AsIGR0ICsgdmFsLCAyKTsKKwlCSVRfc2tpcEJpdHMoRFN0cmVhbSwgZHRbdmFsXS5uYkJpdHMpOworCXJldHVybiBkdFt2YWxdLmxlbmd0aDsKK30KKworc3RhdGljIFUzMiBIVUZfZGVjb2RlTGFzdFN5bWJvbFg0KHZvaWQgKm9wLCBCSVRfRFN0cmVhbV90ICpEU3RyZWFtLCBjb25zdCBIVUZfREVsdFg0ICpkdCwgY29uc3QgVTMyIGR0TG9nKQoreworCXNpemVfdCBjb25zdCB2YWwgPSBCSVRfbG9va0JpdHNGYXN0KERTdHJlYW0sIGR0TG9nKTsgLyogbm90ZSA6IGR0TG9nID49IDEgKi8KKwltZW1jcHkob3AsIGR0ICsgdmFsLCAxKTsKKwlpZiAoZHRbdmFsXS5sZW5ndGggPT0gMSkKKwkJQklUX3NraXBCaXRzKERTdHJlYW0sIGR0W3ZhbF0ubmJCaXRzKTsKKwllbHNlIHsKKwkJaWYgKERTdHJlYW0tPmJpdHNDb25zdW1lZCA8IChzaXplb2YoRFN0cmVhbS0+Yml0Q29udGFpbmVyKSAqIDgpKSB7CisJCQlCSVRfc2tpcEJpdHMoRFN0cmVhbSwgZHRbdmFsXS5uYkJpdHMpOworCQkJaWYgKERTdHJlYW0tPmJpdHNDb25zdW1lZCA+IChzaXplb2YoRFN0cmVhbS0+Yml0Q29udGFpbmVyKSAqIDgpKQorCQkJCS8qIHVnbHkgaGFjazsgd29ya3Mgb25seSBiZWNhdXNlIGl0J3MgdGhlIGxhc3Qgc3ltYm9sLiBOb3RlIDogY2FuJ3QgZWFzaWx5IGV4dHJhY3QgbmJCaXRzIGZyb20ganVzdCB0aGlzIHN5bWJvbCAqLworCQkJCURTdHJlYW0tPmJpdHNDb25zdW1lZCA9IChzaXplb2YoRFN0cmVhbS0+Yml0Q29udGFpbmVyKSAqIDgpOworCQl9CisJfQorCXJldHVybiAxOworfQorCisjZGVmaW5lIEhVRl9ERUNPREVfU1lNQk9MWDRfMChwdHIsIERTdHJlYW1QdHIpIHB0ciArPSBIVUZfZGVjb2RlU3ltYm9sWDQocHRyLCBEU3RyZWFtUHRyLCBkdCwgZHRMb2cpCisKKyNkZWZpbmUgSFVGX0RFQ09ERV9TWU1CT0xYNF8xKHB0ciwgRFN0cmVhbVB0cikgICAgICAgICBcCisJaWYgKFpTVERfNjRiaXRzKCkgfHwgKEhVRl9UQUJMRUxPR19NQVggPD0gMTIpKSBcCisJcHRyICs9IEhVRl9kZWNvZGVTeW1ib2xYNChwdHIsIERTdHJlYW1QdHIsIGR0LCBkdExvZykKKworI2RlZmluZSBIVUZfREVDT0RFX1NZTUJPTFg0XzIocHRyLCBEU3RyZWFtUHRyKSBcCisJaWYgKFpTVERfNjRiaXRzKCkpICAgICAgICAgICAgICAgICAgICAgXAorCXB0ciArPSBIVUZfZGVjb2RlU3ltYm9sWDQocHRyLCBEU3RyZWFtUHRyLCBkdCwgZHRMb2cpCisKK0ZPUkNFX0lOTElORSBzaXplX3QgSFVGX2RlY29kZVN0cmVhbVg0KEJZVEUgKnAsIEJJVF9EU3RyZWFtX3QgKmJpdERQdHIsIEJZVEUgKmNvbnN0IHBFbmQsIGNvbnN0IEhVRl9ERWx0WDQgKmNvbnN0IGR0LCBjb25zdCBVMzIgZHRMb2cpCit7CisJQllURSAqY29uc3QgcFN0YXJ0ID0gcDsKKworCS8qIHVwIHRvIDggc3ltYm9scyBhdCBhIHRpbWUgKi8KKwl3aGlsZSAoKEJJVF9yZWxvYWREU3RyZWFtKGJpdERQdHIpID09IEJJVF9EU3RyZWFtX3VuZmluaXNoZWQpICYgKHAgPCBwRW5kIC0gKHNpemVvZihiaXREUHRyLT5iaXRDb250YWluZXIpIC0gMSkpKSB7CisJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihwLCBiaXREUHRyKTsKKwkJSFVGX0RFQ09ERV9TWU1CT0xYNF8xKHAsIGJpdERQdHIpOworCQlIVUZfREVDT0RFX1NZTUJPTFg0XzIocCwgYml0RFB0cik7CisJCUhVRl9ERUNPREVfU1lNQk9MWDRfMChwLCBiaXREUHRyKTsKKwl9CisKKwkvKiBjbG9zZXIgdG8gZW5kIDogdXAgdG8gMiBzeW1ib2xzIGF0IGEgdGltZSAqLworCXdoaWxlICgoQklUX3JlbG9hZERTdHJlYW0oYml0RFB0cikgPT0gQklUX0RTdHJlYW1fdW5maW5pc2hlZCkgJiAocCA8PSBwRW5kIC0gMikpCisJCUhVRl9ERUNPREVfU1lNQk9MWDRfMChwLCBiaXREUHRyKTsKKworCXdoaWxlIChwIDw9IHBFbmQgLSAyKQorCQlIVUZfREVDT0RFX1NZTUJPTFg0XzAocCwgYml0RFB0cik7IC8qIG5vIG5lZWQgdG8gcmVsb2FkIDogcmVhY2hlZCB0aGUgZW5kIG9mIERTdHJlYW0gKi8KKworCWlmIChwIDwgcEVuZCkKKwkJcCArPSBIVUZfZGVjb2RlTGFzdFN5bWJvbFg0KHAsIGJpdERQdHIsIGR0LCBkdExvZyk7CisKKwlyZXR1cm4gcCAtIHBTdGFydDsKK30KKworc3RhdGljIHNpemVfdCBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZV9pbnRlcm5hbCh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkKK3sKKwlCSVRfRFN0cmVhbV90IGJpdEQ7CisKKwkvKiBJbml0ICovCisJeworCQlzaXplX3QgY29uc3QgZXJyb3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZiaXRELCBjU3JjLCBjU3JjU2l6ZSk7CisJCWlmIChIVUZfaXNFcnJvcihlcnJvckNvZGUpKQorCQkJcmV0dXJuIGVycm9yQ29kZTsKKwl9CisKKwkvKiBkZWNvZGUgKi8KKwl7CisJCUJZVEUgKmNvbnN0IG9zdGFydCA9IChCWVRFICopZHN0OworCQlCWVRFICpjb25zdCBvZW5kID0gb3N0YXJ0ICsgZHN0U2l6ZTsKKwkJY29uc3Qgdm9pZCAqY29uc3QgZHRQdHIgPSBEVGFibGUgKyAxOyAvKiBmb3JjZSBjb21waWxlciB0byBub3QgdXNlIHN0cmljdC1hbGlhc2luZyAqLworCQljb25zdCBIVUZfREVsdFg0ICpjb25zdCBkdCA9IChjb25zdCBIVUZfREVsdFg0ICopZHRQdHI7CisJCURUYWJsZURlc2MgY29uc3QgZHRkID0gSFVGX2dldERUYWJsZURlc2MoRFRhYmxlKTsKKwkJSFVGX2RlY29kZVN0cmVhbVg0KG9zdGFydCwgJmJpdEQsIG9lbmQsIGR0LCBkdGQudGFibGVMb2cpOworCX0KKworCS8qIGNoZWNrICovCisJaWYgKCFCSVRfZW5kT2ZEU3RyZWFtKCZiaXREKSkKKwkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCisJLyogZGVjb2RlZCBzaXplICovCisJcmV0dXJuIGRzdFNpemU7Cit9CisKK3NpemVfdCBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkKK3sKKwlEVGFibGVEZXNjIGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7CisJaWYgKGR0ZC50YWJsZVR5cGUgIT0gMSkKKwkJcmV0dXJuIEVSUk9SKEdFTkVSSUMpOworCXJldHVybiBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIGRzdFNpemUsIGNTcmMsIGNTcmNTaXplLCBEVGFibGUpOworfQorCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWDRfREN0eF93a3NwKEhVRl9EVGFibGUgKkRDdHgsIHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgdm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkKK3sKKwljb25zdCBCWVRFICppcCA9IChjb25zdCBCWVRFICopY1NyYzsKKworCXNpemVfdCBjb25zdCBoU2l6ZSA9IEhVRl9yZWFkRFRhYmxlWDRfd2tzcChEQ3R4LCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwlpZiAoSFVGX2lzRXJyb3IoaFNpemUpKQorCQlyZXR1cm4gaFNpemU7CisJaWYgKGhTaXplID49IGNTcmNTaXplKQorCQlyZXR1cm4gRVJST1Ioc3JjU2l6ZV93cm9uZyk7CisJaXAgKz0gaFNpemU7CisJY1NyY1NpemUgLT0gaFNpemU7CisKKwlyZXR1cm4gSFVGX2RlY29tcHJlc3MxWDRfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RTaXplLCBpcCwgY1NyY1NpemUsIERDdHgpOworfQorCitzdGF0aWMgc2l6ZV90IEhVRl9kZWNvbXByZXNzNFg0X3VzaW5nRFRhYmxlX2ludGVybmFsKHZvaWQgKmRzdCwgc2l6ZV90IGRzdFNpemUsIGNvbnN0IHZvaWQgKmNTcmMsIHNpemVfdCBjU3JjU2l6ZSwgY29uc3QgSFVGX0RUYWJsZSAqRFRhYmxlKQoreworCWlmIChjU3JjU2l6ZSA8IDEwKQorCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7IC8qIHN0cmljdCBtaW5pbXVtIDoganVtcCB0YWJsZSArIDEgYnl0ZSBwZXIgc3RyZWFtICovCisKKwl7CisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICopY1NyYzsKKwkJQllURSAqY29uc3Qgb3N0YXJ0ID0gKEJZVEUgKilkc3Q7CisJCUJZVEUgKmNvbnN0IG9lbmQgPSBvc3RhcnQgKyBkc3RTaXplOworCQljb25zdCB2b2lkICpjb25zdCBkdFB0ciA9IERUYWJsZSArIDE7CisJCWNvbnN0IEhVRl9ERWx0WDQgKmNvbnN0IGR0ID0gKGNvbnN0IEhVRl9ERWx0WDQgKilkdFB0cjsKKworCQkvKiBJbml0ICovCisJCUJJVF9EU3RyZWFtX3QgYml0RDE7CisJCUJJVF9EU3RyZWFtX3QgYml0RDI7CisJCUJJVF9EU3RyZWFtX3QgYml0RDM7CisJCUJJVF9EU3RyZWFtX3QgYml0RDQ7CisJCXNpemVfdCBjb25zdCBsZW5ndGgxID0gWlNURF9yZWFkTEUxNihpc3RhcnQpOworCQlzaXplX3QgY29uc3QgbGVuZ3RoMiA9IFpTVERfcmVhZExFMTYoaXN0YXJ0ICsgMik7CisJCXNpemVfdCBjb25zdCBsZW5ndGgzID0gWlNURF9yZWFkTEUxNihpc3RhcnQgKyA0KTsKKwkJc2l6ZV90IGNvbnN0IGxlbmd0aDQgPSBjU3JjU2l6ZSAtIChsZW5ndGgxICsgbGVuZ3RoMiArIGxlbmd0aDMgKyA2KTsKKwkJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0MSA9IGlzdGFydCArIDY7IC8qIGp1bXBUYWJsZSAqLworCQljb25zdCBCWVRFICpjb25zdCBpc3RhcnQyID0gaXN0YXJ0MSArIGxlbmd0aDE7CisJCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydDMgPSBpc3RhcnQyICsgbGVuZ3RoMjsKKwkJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0NCA9IGlzdGFydDMgKyBsZW5ndGgzOworCQlzaXplX3QgY29uc3Qgc2VnbWVudFNpemUgPSAoZHN0U2l6ZSArIDMpIC8gNDsKKwkJQllURSAqY29uc3Qgb3BTdGFydDIgPSBvc3RhcnQgKyBzZWdtZW50U2l6ZTsKKwkJQllURSAqY29uc3Qgb3BTdGFydDMgPSBvcFN0YXJ0MiArIHNlZ21lbnRTaXplOworCQlCWVRFICpjb25zdCBvcFN0YXJ0NCA9IG9wU3RhcnQzICsgc2VnbWVudFNpemU7CisJCUJZVEUgKm9wMSA9IG9zdGFydDsKKwkJQllURSAqb3AyID0gb3BTdGFydDI7CisJCUJZVEUgKm9wMyA9IG9wU3RhcnQzOworCQlCWVRFICpvcDQgPSBvcFN0YXJ0NDsKKwkJVTMyIGVuZFNpZ25hbDsKKwkJRFRhYmxlRGVzYyBjb25zdCBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOworCQlVMzIgY29uc3QgZHRMb2cgPSBkdGQudGFibGVMb2c7CisKKwkJaWYgKGxlbmd0aDQgPiBjU3JjU2l6ZSkKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogb3ZlcmZsb3cgKi8KKwkJeworCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RDEsIGlzdGFydDEsIGxlbmd0aDEpOworCQkJaWYgKEhVRl9pc0Vycm9yKGVycm9yQ29kZSkpCisJCQkJcmV0dXJuIGVycm9yQ29kZTsKKwkJfQorCQl7CisJCQlzaXplX3QgY29uc3QgZXJyb3JDb2RlID0gQklUX2luaXREU3RyZWFtKCZiaXREMiwgaXN0YXJ0MiwgbGVuZ3RoMik7CisJCQlpZiAoSFVGX2lzRXJyb3IoZXJyb3JDb2RlKSkKKwkJCQlyZXR1cm4gZXJyb3JDb2RlOworCQl9CisJCXsKKwkJCXNpemVfdCBjb25zdCBlcnJvckNvZGUgPSBCSVRfaW5pdERTdHJlYW0oJmJpdEQzLCBpc3RhcnQzLCBsZW5ndGgzKTsKKwkJCWlmIChIVUZfaXNFcnJvcihlcnJvckNvZGUpKQorCQkJCXJldHVybiBlcnJvckNvZGU7CisJCX0KKwkJeworCQkJc2l6ZV90IGNvbnN0IGVycm9yQ29kZSA9IEJJVF9pbml0RFN0cmVhbSgmYml0RDQsIGlzdGFydDQsIGxlbmd0aDQpOworCQkJaWYgKEhVRl9pc0Vycm9yKGVycm9yQ29kZSkpCisJCQkJcmV0dXJuIGVycm9yQ29kZTsKKwkJfQorCisJCS8qIDE2LTMyIHN5bWJvbHMgcGVyIGxvb3AgKDQtOCBzeW1ib2xzIHBlciBzdHJlYW0pICovCisJCWVuZFNpZ25hbCA9IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMSkgfCBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDIpIHwgQklUX3JlbG9hZERTdHJlYW0oJmJpdEQzKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXRENCk7CisJCWZvciAoOyAoZW5kU2lnbmFsID09IEJJVF9EU3RyZWFtX3VuZmluaXNoZWQpICYgKG9wNCA8IChvZW5kIC0gKHNpemVvZihiaXRENC5iaXRDb250YWluZXIpIC0gMSkpKTspIHsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihvcDEsICZiaXREMSk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzIob3AyLCAmYml0RDIpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8yKG9wMywgJmJpdEQzKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihvcDQsICZiaXRENCk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzEob3AxLCAmYml0RDEpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8xKG9wMiwgJmJpdEQyKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMShvcDMsICZiaXREMyk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzEob3A0LCAmYml0RDQpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8yKG9wMSwgJmJpdEQxKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMihvcDIsICZiaXREMik7CisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzIob3AzLCAmYml0RDMpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8yKG9wNCwgJmJpdEQ0KTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMChvcDEsICZiaXREMSk7CisJCQlIVUZfREVDT0RFX1NZTUJPTFg0XzAob3AyLCAmYml0RDIpOworCQkJSFVGX0RFQ09ERV9TWU1CT0xYNF8wKG9wMywgJmJpdEQzKTsKKwkJCUhVRl9ERUNPREVfU1lNQk9MWDRfMChvcDQsICZiaXRENCk7CisKKwkJCWVuZFNpZ25hbCA9IEJJVF9yZWxvYWREU3RyZWFtKCZiaXREMSkgfCBCSVRfcmVsb2FkRFN0cmVhbSgmYml0RDIpIHwgQklUX3JlbG9hZERTdHJlYW0oJmJpdEQzKSB8IEJJVF9yZWxvYWREU3RyZWFtKCZiaXRENCk7CisJCX0KKworCQkvKiBjaGVjayBjb3JydXB0aW9uICovCisJCWlmIChvcDEgPiBvcFN0YXJ0MikKKwkJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsKKwkJaWYgKG9wMiA+IG9wU3RhcnQzKQorCQkJcmV0dXJuIEVSUk9SKGNvcnJ1cHRpb25fZGV0ZWN0ZWQpOworCQlpZiAob3AzID4gb3BTdGFydDQpCisJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisJCS8qIG5vdGUgOiBvcDQgYWxyZWFkeSB2ZXJpZmllZCB3aXRoaW4gbWFpbiBsb29wICovCisKKwkJLyogZmluaXNoIGJpdFN0cmVhbXMgb25lIGJ5IG9uZSAqLworCQlIVUZfZGVjb2RlU3RyZWFtWDQob3AxLCAmYml0RDEsIG9wU3RhcnQyLCBkdCwgZHRMb2cpOworCQlIVUZfZGVjb2RlU3RyZWFtWDQob3AyLCAmYml0RDIsIG9wU3RhcnQzLCBkdCwgZHRMb2cpOworCQlIVUZfZGVjb2RlU3RyZWFtWDQob3AzLCAmYml0RDMsIG9wU3RhcnQ0LCBkdCwgZHRMb2cpOworCQlIVUZfZGVjb2RlU3RyZWFtWDQob3A0LCAmYml0RDQsIG9lbmQsIGR0LCBkdExvZyk7CisKKwkJLyogY2hlY2sgKi8KKwkJeworCQkJVTMyIGNvbnN0IGVuZENoZWNrID0gQklUX2VuZE9mRFN0cmVhbSgmYml0RDEpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDIpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDMpICYgQklUX2VuZE9mRFN0cmVhbSgmYml0RDQpOworCQkJaWYgKCFlbmRDaGVjaykKKwkJCQlyZXR1cm4gRVJST1IoY29ycnVwdGlvbl9kZXRlY3RlZCk7CisJCX0KKworCQkvKiBkZWNvZGVkIHNpemUgKi8KKwkJcmV0dXJuIGRzdFNpemU7CisJfQorfQorCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpCit7CisJRFRhYmxlRGVzYyBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOworCWlmIChkdGQudGFibGVUeXBlICE9IDEpCisJCXJldHVybiBFUlJPUihHRU5FUklDKTsKKwlyZXR1cm4gSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKTsKK30KKworc2l6ZV90IEhVRl9kZWNvbXByZXNzNFg0X0RDdHhfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJY29uc3QgQllURSAqaXAgPSAoY29uc3QgQllURSAqKWNTcmM7CisKKwlzaXplX3QgaFNpemUgPSBIVUZfcmVhZERUYWJsZVg0X3drc3AoZGN0eCwgY1NyYywgY1NyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJaWYgKEhVRl9pc0Vycm9yKGhTaXplKSkKKwkJcmV0dXJuIGhTaXplOworCWlmIChoU2l6ZSA+PSBjU3JjU2l6ZSkKKwkJcmV0dXJuIEVSUk9SKHNyY1NpemVfd3JvbmcpOworCWlwICs9IGhTaXplOworCWNTcmNTaXplIC09IGhTaXplOworCisJcmV0dXJuIEhVRl9kZWNvbXByZXNzNFg0X3VzaW5nRFRhYmxlX2ludGVybmFsKGRzdCwgZHN0U2l6ZSwgaXAsIGNTcmNTaXplLCBkY3R4KTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBHZW5lcmljIGRlY29tcHJlc3Npb24gc2VsZWN0b3IgKi8KKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWF91c2luZ0RUYWJsZSh2b2lkICpkc3QsIHNpemVfdCBtYXhEc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIGNvbnN0IEhVRl9EVGFibGUgKkRUYWJsZSkKK3sKKwlEVGFibGVEZXNjIGNvbnN0IGR0ZCA9IEhVRl9nZXREVGFibGVEZXNjKERUYWJsZSk7CisJcmV0dXJuIGR0ZC50YWJsZVR5cGUgPyBIVUZfZGVjb21wcmVzczFYNF91c2luZ0RUYWJsZV9pbnRlcm5hbChkc3QsIG1heERzdFNpemUsIGNTcmMsIGNTcmNTaXplLCBEVGFibGUpCisJCQkgICAgIDogSFVGX2RlY29tcHJlc3MxWDJfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBtYXhEc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKTsKK30KKworc2l6ZV90IEhVRl9kZWNvbXByZXNzNFhfdXNpbmdEVGFibGUodm9pZCAqZHN0LCBzaXplX3QgbWF4RHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCBjb25zdCBIVUZfRFRhYmxlICpEVGFibGUpCit7CisJRFRhYmxlRGVzYyBjb25zdCBkdGQgPSBIVUZfZ2V0RFRhYmxlRGVzYyhEVGFibGUpOworCXJldHVybiBkdGQudGFibGVUeXBlID8gSFVGX2RlY29tcHJlc3M0WDRfdXNpbmdEVGFibGVfaW50ZXJuYWwoZHN0LCBtYXhEc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgRFRhYmxlKQorCQkJICAgICA6IEhVRl9kZWNvbXByZXNzNFgyX3VzaW5nRFRhYmxlX2ludGVybmFsKGRzdCwgbWF4RHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIERUYWJsZSk7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKwlVMzIgdGFibGVUaW1lOworCVUzMiBkZWNvZGUyNTZUaW1lOworfSBhbGdvX3RpbWVfdDsKK3N0YXRpYyBjb25zdCBhbGdvX3RpbWVfdCBhbGdvVGltZVsxNiAvKiBRdWFudGl6YXRpb24gKi9dWzMgLyogc2luZ2xlLCBkb3VibGUsIHF1YWQgKi9dID0geworICAgIC8qIHNpbmdsZSwgZG91YmxlLCBxdWFkICovCisgICAge3swLCAwfSwgezEsIDF9LCB7MiwgMn19LAkJICAgICAvKiBRPT0wIDogaW1wb3NzaWJsZSAqLworICAgIHt7MCwgMH0sIHsxLCAxfSwgezIsIDJ9fSwJCSAgICAgLyogUT09MSA6IGltcG9zc2libGUgKi8KKyAgICB7ezM4LCAxMzB9LCB7MTMxMywgNzR9LCB7MjE1MSwgMzh9fSwgICAgIC8qIFEgPT0gMiA6IDEyLTE4JSAqLworICAgIHt7NDQ4LCAxMjh9LCB7MTM1MywgNzR9LCB7MjIzOCwgNDF9fSwgICAgLyogUSA9PSAzIDogMTgtMjUlICovCisgICAge3s1NTYsIDEyOH0sIHsxMzUzLCA3NH0sIHsyMjM4LCA0N319LCAgICAvKiBRID09IDQgOiAyNS0zMiUgKi8KKyAgICB7ezcxNCwgMTI4fSwgezE0MTgsIDc0fSwgezI0MzYsIDUzfX0sICAgIC8qIFEgPT0gNSA6IDMyLTM4JSAqLworICAgIHt7ODgzLCAxMjh9LCB7MTQzNywgNzR9LCB7MjQ2NCwgNjF9fSwgICAgLyogUSA9PSA2IDogMzgtNDQlICovCisgICAge3s4OTcsIDEyOH0sIHsxNTE1LCA3NX0sIHsyNjIyLCA2OH19LCAgICAvKiBRID09IDcgOiA0NC01MCUgKi8KKyAgICB7ezkyNiwgMTI4fSwgezE2MTMsIDc1fSwgezI3MzAsIDc1fX0sICAgIC8qIFEgPT0gOCA6IDUwLTU2JSAqLworICAgIHt7OTQ3LCAxMjh9LCB7MTcyOSwgNzd9LCB7MzM1OSwgNzd9fSwgICAgLyogUSA9PSA5IDogNTYtNjIlICovCisgICAge3sxMTA3LCAxMjh9LCB7MjA4MywgODF9LCB7NDAwNiwgODR9fSwgICAvKiBRID09MTAgOiA2Mi02OSUgKi8KKyAgICB7ezExNzcsIDEyOH0sIHsyMzc5LCA4N30sIHs0Nzg1LCA4OH19LCAgIC8qIFEgPT0xMSA6IDY5LTc1JSAqLworICAgIHt7MTI0MiwgMTI4fSwgezI0MTUsIDkzfSwgezUxNTUsIDg0fX0sICAgLyogUSA9PTEyIDogNzUtODElICovCisgICAge3sxMzQ5LCAxMjh9LCB7MjY0NCwgMTA2fSwgezUyNjAsIDEwNn19LCAvKiBRID09MTMgOiA4MS04NyUgKi8KKyAgICB7ezE0NTUsIDEyOH0sIHsyNDIyLCAxMjR9LCB7NDE3NCwgMTI0fX0sIC8qIFEgPT0xNCA6IDg3LTkzJSAqLworICAgIHt7NzIyLCAxMjh9LCB7MTg5MSwgMTQ1fSwgezE5MzYsIDE0Nn19LCAgLyogUSA9PTE1IDogOTMtOTklICovCit9OworCisvKiogSFVGX3NlbGVjdERlY29kZXIoKSA6CisqICAgVGVsbHMgd2hpY2ggZGVjb2RlciBpcyBsaWtlbHkgdG8gZGVjb2RlIGZhc3RlciwKKyogICBiYXNlZCBvbiBhIHNldCBvZiBwcmUtZGV0ZXJtaW5lZCBtZXRyaWNzLgorKiAgIEByZXR1cm4gOiAwPT1IVUZfZGVjb21wcmVzczRYMiwgMT09SFVGX2RlY29tcHJlc3M0WDQgLgorKiAgIEFzc3VtcHRpb24gOiAwIDwgY1NyY1NpemUgPCBkc3RTaXplIDw9IDEyOCBLQiAqLworVTMyIEhVRl9zZWxlY3REZWNvZGVyKHNpemVfdCBkc3RTaXplLCBzaXplX3QgY1NyY1NpemUpCit7CisJLyogZGVjb2RlciB0aW1pbmcgZXZhbHVhdGlvbiAqLworCVUzMiBjb25zdCBRID0gKFUzMikoY1NyY1NpemUgKiAxNiAvIGRzdFNpemUpOyAvKiBRIDwgMTYgc2luY2UgZHN0U2l6ZSA+IGNTcmNTaXplICovCisJVTMyIGNvbnN0IEQyNTYgPSAoVTMyKShkc3RTaXplID4+IDgpOworCVUzMiBjb25zdCBEVGltZTAgPSBhbGdvVGltZVtRXVswXS50YWJsZVRpbWUgKyAoYWxnb1RpbWVbUV1bMF0uZGVjb2RlMjU2VGltZSAqIEQyNTYpOworCVUzMiBEVGltZTEgPSBhbGdvVGltZVtRXVsxXS50YWJsZVRpbWUgKyAoYWxnb1RpbWVbUV1bMV0uZGVjb2RlMjU2VGltZSAqIEQyNTYpOworCURUaW1lMSArPSBEVGltZTEgPj4gMzsgLyogYWR2YW50YWdlIHRvIGFsZ29yaXRobSB1c2luZyBsZXNzIG1lbW9yeSwgZm9yIGNhY2hlIGV2aWN0aW9uICovCisKKwlyZXR1cm4gRFRpbWUxIDwgRFRpbWUwOworfQorCit0eXBlZGVmIHNpemVfdCAoKmRlY29tcHJlc3Npb25BbGdvKSh2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUpOworCitzaXplX3QgSFVGX2RlY29tcHJlc3M0WF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCS8qIHZhbGlkYXRpb24gY2hlY2tzICovCisJaWYgKGRzdFNpemUgPT0gMCkKKwkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOworCWlmIChjU3JjU2l6ZSA+IGRzdFNpemUpCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogaW52YWxpZCAqLworCWlmIChjU3JjU2l6ZSA9PSBkc3RTaXplKSB7CisJCW1lbWNweShkc3QsIGNTcmMsIGRzdFNpemUpOworCQlyZXR1cm4gZHN0U2l6ZTsKKwl9IC8qIG5vdCBjb21wcmVzc2VkICovCisJaWYgKGNTcmNTaXplID09IDEpIHsKKwkJbWVtc2V0KGRzdCwgKihjb25zdCBCWVRFICopY1NyYywgZHN0U2l6ZSk7CisJCXJldHVybiBkc3RTaXplOworCX0gLyogUkxFICovCisKKwl7CisJCVUzMiBjb25zdCBhbGdvTmIgPSBIVUZfc2VsZWN0RGVjb2Rlcihkc3RTaXplLCBjU3JjU2l6ZSk7CisJCXJldHVybiBhbGdvTmIgPyBIVUZfZGVjb21wcmVzczRYNF9EQ3R4X3drc3AoZGN0eCwgZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKQorCQkJICAgICAgOiBIVUZfZGVjb21wcmVzczRYMl9EQ3R4X3drc3AoZGN0eCwgZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwl9Cit9CisKK3NpemVfdCBIVUZfZGVjb21wcmVzczRYX2h1Zk9ubHlfd2tzcChIVUZfRFRhYmxlICpkY3R4LCB2b2lkICpkc3QsIHNpemVfdCBkc3RTaXplLCBjb25zdCB2b2lkICpjU3JjLCBzaXplX3QgY1NyY1NpemUsIHZvaWQgKndvcmtzcGFjZSwgc2l6ZV90IHdvcmtzcGFjZVNpemUpCit7CisJLyogdmFsaWRhdGlvbiBjaGVja3MgKi8KKwlpZiAoZHN0U2l6ZSA9PSAwKQorCQlyZXR1cm4gRVJST1IoZHN0U2l6ZV90b29TbWFsbCk7CisJaWYgKChjU3JjU2l6ZSA+PSBkc3RTaXplKSB8fCAoY1NyY1NpemUgPD0gMSkpCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogaW52YWxpZCAqLworCisJeworCQlVMzIgY29uc3QgYWxnb05iID0gSFVGX3NlbGVjdERlY29kZXIoZHN0U2l6ZSwgY1NyY1NpemUpOworCQlyZXR1cm4gYWxnb05iID8gSFVGX2RlY29tcHJlc3M0WDRfREN0eF93a3NwKGRjdHgsIGRzdCwgZHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSkKKwkJCSAgICAgIDogSFVGX2RlY29tcHJlc3M0WDJfREN0eF93a3NwKGRjdHgsIGRzdCwgZHN0U2l6ZSwgY1NyYywgY1NyY1NpemUsIHdvcmtzcGFjZSwgd29ya3NwYWNlU2l6ZSk7CisJfQorfQorCitzaXplX3QgSFVGX2RlY29tcHJlc3MxWF9EQ3R4X3drc3AoSFVGX0RUYWJsZSAqZGN0eCwgdm9pZCAqZHN0LCBzaXplX3QgZHN0U2l6ZSwgY29uc3Qgdm9pZCAqY1NyYywgc2l6ZV90IGNTcmNTaXplLCB2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKQoreworCS8qIHZhbGlkYXRpb24gY2hlY2tzICovCisJaWYgKGRzdFNpemUgPT0gMCkKKwkJcmV0dXJuIEVSUk9SKGRzdFNpemVfdG9vU21hbGwpOworCWlmIChjU3JjU2l6ZSA+IGRzdFNpemUpCisJCXJldHVybiBFUlJPUihjb3JydXB0aW9uX2RldGVjdGVkKTsgLyogaW52YWxpZCAqLworCWlmIChjU3JjU2l6ZSA9PSBkc3RTaXplKSB7CisJCW1lbWNweShkc3QsIGNTcmMsIGRzdFNpemUpOworCQlyZXR1cm4gZHN0U2l6ZTsKKwl9IC8qIG5vdCBjb21wcmVzc2VkICovCisJaWYgKGNTcmNTaXplID09IDEpIHsKKwkJbWVtc2V0KGRzdCwgKihjb25zdCBCWVRFICopY1NyYywgZHN0U2l6ZSk7CisJCXJldHVybiBkc3RTaXplOworCX0gLyogUkxFICovCisKKwl7CisJCVUzMiBjb25zdCBhbGdvTmIgPSBIVUZfc2VsZWN0RGVjb2Rlcihkc3RTaXplLCBjU3JjU2l6ZSk7CisJCXJldHVybiBhbGdvTmIgPyBIVUZfZGVjb21wcmVzczFYNF9EQ3R4X3drc3AoZGN0eCwgZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKQorCQkJICAgICAgOiBIVUZfZGVjb21wcmVzczFYMl9EQ3R4X3drc3AoZGN0eCwgZHN0LCBkc3RTaXplLCBjU3JjLCBjU3JjU2l6ZSwgd29ya3NwYWNlLCB3b3Jrc3BhY2VTaXplKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL21lbS5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9tZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTBmMzRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC9tZW0uaApAQCAtMCwwICsxLDE1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYtcHJlc2VudCwgWWFubiBDb2xsZXQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svenN0ZC4KKyAqIEFuIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUKKyAqIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqLworCisjaWZuZGVmIE1FTV9IX01PRFVMRQorI2RlZmluZSBNRU1fSF9NT0RVTEUKKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRGVwZW5kZW5jaWVzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPiAvKiBtZW1jcHkgKi8KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPiAgLyogc2l6ZV90LCBwdHJkaWZmX3QgKi8KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQ29tcGlsZXIgc3BlY2lmaWNzCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFpTVERfU1RBVElDIHN0YXRpYyBfX2lubGluZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQmFzaWMgVHlwZXMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiB1aW50OF90IEJZVEU7Cit0eXBlZGVmIHVpbnQxNl90IFUxNjsKK3R5cGVkZWYgaW50MTZfdCBTMTY7Cit0eXBlZGVmIHVpbnQzMl90IFUzMjsKK3R5cGVkZWYgaW50MzJfdCBTMzI7Cit0eXBlZGVmIHVpbnQ2NF90IFU2NDsKK3R5cGVkZWYgaW50NjRfdCBTNjQ7Cit0eXBlZGVmIHB0cmRpZmZfdCBpUHRyRGlmZjsKK3R5cGVkZWYgdWludHB0cl90IHVQdHJEaWZmOworCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgTWVtb3J5IEkvTworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitaU1REX1NUQVRJQyB1bnNpZ25lZCBaU1REXzMyYml0cyh2b2lkKSB7IHJldHVybiBzaXplb2Yoc2l6ZV90KSA9PSA0OyB9CitaU1REX1NUQVRJQyB1bnNpZ25lZCBaU1REXzY0Yml0cyh2b2lkKSB7IHJldHVybiBzaXplb2Yoc2l6ZV90KSA9PSA4OyB9CisKKyNpZiBkZWZpbmVkKF9fTElUVExFX0VORElBTikKKyNkZWZpbmUgWlNURF9MSVRUTEVfRU5ESUFOIDEKKyNlbHNlCisjZGVmaW5lIFpTVERfTElUVExFX0VORElBTiAwCisjZW5kaWYKKworWlNURF9TVEFUSUMgdW5zaWduZWQgWlNURF9pc0xpdHRsZUVuZGlhbih2b2lkKSB7IHJldHVybiBaU1REX0xJVFRMRV9FTkRJQU47IH0KKworWlNURF9TVEFUSUMgVTE2IFpTVERfcmVhZDE2KGNvbnN0IHZvaWQgKm1lbVB0cikgeyByZXR1cm4gZ2V0X3VuYWxpZ25lZCgoY29uc3QgVTE2ICopbWVtUHRyKTsgfQorCitaU1REX1NUQVRJQyBVMzIgWlNURF9yZWFkMzIoY29uc3Qgdm9pZCAqbWVtUHRyKSB7IHJldHVybiBnZXRfdW5hbGlnbmVkKChjb25zdCBVMzIgKiltZW1QdHIpOyB9CisKK1pTVERfU1RBVElDIFU2NCBaU1REX3JlYWQ2NChjb25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIGdldF91bmFsaWduZWQoKGNvbnN0IFU2NCAqKW1lbVB0cik7IH0KKworWlNURF9TVEFUSUMgc2l6ZV90IFpTVERfcmVhZFNUKGNvbnN0IHZvaWQgKm1lbVB0cikgeyByZXR1cm4gZ2V0X3VuYWxpZ25lZCgoY29uc3Qgc2l6ZV90ICopbWVtUHRyKTsgfQorCitaU1REX1NUQVRJQyB2b2lkIFpTVERfd3JpdGUxNih2b2lkICptZW1QdHIsIFUxNiB2YWx1ZSkgeyBwdXRfdW5hbGlnbmVkKHZhbHVlLCAoVTE2ICopbWVtUHRyKTsgfQorCitaU1REX1NUQVRJQyB2b2lkIFpTVERfd3JpdGUzMih2b2lkICptZW1QdHIsIFUzMiB2YWx1ZSkgeyBwdXRfdW5hbGlnbmVkKHZhbHVlLCAoVTMyICopbWVtUHRyKTsgfQorCitaU1REX1NUQVRJQyB2b2lkIFpTVERfd3JpdGU2NCh2b2lkICptZW1QdHIsIFU2NCB2YWx1ZSkgeyBwdXRfdW5hbGlnbmVkKHZhbHVlLCAoVTY0ICopbWVtUHRyKTsgfQorCisvKj09PSBMaXR0bGUgZW5kaWFuIHIvdyA9PT0qLworCitaU1REX1NUQVRJQyBVMTYgWlNURF9yZWFkTEUxNihjb25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIGdldF91bmFsaWduZWRfbGUxNihtZW1QdHIpOyB9CisKK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZUxFMTYodm9pZCAqbWVtUHRyLCBVMTYgdmFsKSB7IHB1dF91bmFsaWduZWRfbGUxNih2YWwsIG1lbVB0cik7IH0KKworWlNURF9TVEFUSUMgVTMyIFpTVERfcmVhZExFMjQoY29uc3Qgdm9pZCAqbWVtUHRyKSB7IHJldHVybiBaU1REX3JlYWRMRTE2KG1lbVB0cikgKyAoKChjb25zdCBCWVRFICopbWVtUHRyKVsyXSA8PCAxNik7IH0KKworWlNURF9TVEFUSUMgdm9pZCBaU1REX3dyaXRlTEUyNCh2b2lkICptZW1QdHIsIFUzMiB2YWwpCit7CisJWlNURF93cml0ZUxFMTYobWVtUHRyLCAoVTE2KXZhbCk7CisJKChCWVRFICopbWVtUHRyKVsyXSA9IChCWVRFKSh2YWwgPj4gMTYpOworfQorCitaU1REX1NUQVRJQyBVMzIgWlNURF9yZWFkTEUzMihjb25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIGdldF91bmFsaWduZWRfbGUzMihtZW1QdHIpOyB9CisKK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZUxFMzIodm9pZCAqbWVtUHRyLCBVMzIgdmFsMzIpIHsgcHV0X3VuYWxpZ25lZF9sZTMyKHZhbDMyLCBtZW1QdHIpOyB9CisKK1pTVERfU1RBVElDIFU2NCBaU1REX3JlYWRMRTY0KGNvbnN0IHZvaWQgKm1lbVB0cikgeyByZXR1cm4gZ2V0X3VuYWxpZ25lZF9sZTY0KG1lbVB0cik7IH0KKworWlNURF9TVEFUSUMgdm9pZCBaU1REX3dyaXRlTEU2NCh2b2lkICptZW1QdHIsIFU2NCB2YWw2NCkgeyBwdXRfdW5hbGlnbmVkX2xlNjQodmFsNjQsIG1lbVB0cik7IH0KKworWlNURF9TVEFUSUMgc2l6ZV90IFpTVERfcmVhZExFU1QoY29uc3Qgdm9pZCAqbWVtUHRyKQoreworCWlmIChaU1REXzMyYml0cygpKQorCQlyZXR1cm4gKHNpemVfdClaU1REX3JlYWRMRTMyKG1lbVB0cik7CisJZWxzZQorCQlyZXR1cm4gKHNpemVfdClaU1REX3JlYWRMRTY0KG1lbVB0cik7Cit9CisKK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZUxFU1Qodm9pZCAqbWVtUHRyLCBzaXplX3QgdmFsKQoreworCWlmIChaU1REXzMyYml0cygpKQorCQlaU1REX3dyaXRlTEUzMihtZW1QdHIsIChVMzIpdmFsKTsKKwllbHNlCisJCVpTVERfd3JpdGVMRTY0KG1lbVB0ciwgKFU2NCl2YWwpOworfQorCisvKj09PSBCaWcgZW5kaWFuIHIvdyA9PT0qLworCitaU1REX1NUQVRJQyBVMzIgWlNURF9yZWFkQkUzMihjb25zdCB2b2lkICptZW1QdHIpIHsgcmV0dXJuIGdldF91bmFsaWduZWRfYmUzMihtZW1QdHIpOyB9CisKK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZUJFMzIodm9pZCAqbWVtUHRyLCBVMzIgdmFsMzIpIHsgcHV0X3VuYWxpZ25lZF9iZTMyKHZhbDMyLCBtZW1QdHIpOyB9CisKK1pTVERfU1RBVElDIFU2NCBaU1REX3JlYWRCRTY0KGNvbnN0IHZvaWQgKm1lbVB0cikgeyByZXR1cm4gZ2V0X3VuYWxpZ25lZF9iZTY0KG1lbVB0cik7IH0KKworWlNURF9TVEFUSUMgdm9pZCBaU1REX3dyaXRlQkU2NCh2b2lkICptZW1QdHIsIFU2NCB2YWw2NCkgeyBwdXRfdW5hbGlnbmVkX2JlNjQodmFsNjQsIG1lbVB0cik7IH0KKworWlNURF9TVEFUSUMgc2l6ZV90IFpTVERfcmVhZEJFU1QoY29uc3Qgdm9pZCAqbWVtUHRyKQoreworCWlmIChaU1REXzMyYml0cygpKQorCQlyZXR1cm4gKHNpemVfdClaU1REX3JlYWRCRTMyKG1lbVB0cik7CisJZWxzZQorCQlyZXR1cm4gKHNpemVfdClaU1REX3JlYWRCRTY0KG1lbVB0cik7Cit9CisKK1pTVERfU1RBVElDIHZvaWQgWlNURF93cml0ZUJFU1Qodm9pZCAqbWVtUHRyLCBzaXplX3QgdmFsKQoreworCWlmIChaU1REXzMyYml0cygpKQorCQlaU1REX3dyaXRlQkUzMihtZW1QdHIsIChVMzIpdmFsKTsKKwllbHNlCisJCVpTVERfd3JpdGVCRTY0KG1lbVB0ciwgKFU2NCl2YWwpOworfQorCisvKiBmdW5jdGlvbiBzYWZlIG9ubHkgZm9yIGNvbXBhcmlzb25zICovCitaU1REX1NUQVRJQyBVMzIgWlNURF9yZWFkTUlOTUFUQ0goY29uc3Qgdm9pZCAqbWVtUHRyLCBVMzIgbGVuZ3RoKQoreworCXN3aXRjaCAobGVuZ3RoKSB7CisJZGVmYXVsdDoKKwljYXNlIDQ6IHJldHVybiBaU1REX3JlYWQzMihtZW1QdHIpOworCWNhc2UgMzoKKwkJaWYgKFpTVERfaXNMaXR0bGVFbmRpYW4oKSkKKwkJCXJldHVybiBaU1REX3JlYWQzMihtZW1QdHIpIDw8IDg7CisJCWVsc2UKKwkJCXJldHVybiBaU1REX3JlYWQzMihtZW1QdHIpID4+IDg7CisJfQorfQorCisjZW5kaWYgLyogTUVNX0hfTU9EVUxFICovCmRpZmYgLS1naXQgYS9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL3pzdGRfY29tbW9uLmMgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL3pzdGRfY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI4MjYyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvenN0ZF9jb21tb24uYwpAQCAtMCwwICsxLDc1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBZYW5uIENvbGxldCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay96c3RkLgorICogQW4gYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZQorICogc2FtZSBkaXJlY3RvcnkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBwcm9ncmFtIGlzIGR1YWwtbGljZW5zZWQ7IHlvdSBtYXkgc2VsZWN0CisgKiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIG9yIEJTRCBsaWNlbnNlCisgKiAoIkJTRCIpLgorICovCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIERlcGVuZGVuY2llcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImVycm9yX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJ6c3RkX2ludGVybmFsLmgiIC8qIGRlY2xhcmF0aW9uIG9mIFpTVERfaXNFcnJvciwgWlNURF9nZXRFcnJvck5hbWUsIFpTVERfZ2V0RXJyb3JDb2RlLCBaU1REX2dldEVycm9yU3RyaW5nLCBaU1REX3ZlcnNpb25OdW1iZXIgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKworLyo9KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIEN1c3RvbSBhbGxvY2F0b3IKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgc3RhY2tfcHVzaChzdGFjaywgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXZvaWQgKmNvbnN0IHB0ciA9IFpTVERfUFRSX0FMSUdOKChzdGFjayktPnB0cik7IFwKKwkJKHN0YWNrKS0+cHRyID0gKGNoYXIgKilwdHIgKyAoc2l6ZSk7ICAgICAgICAgICAgXAorCQkoc3RhY2spLT5wdHIgPD0gKHN0YWNrKS0+ZW5kID8gcHRyIDogTlVMTDsgICAgICBcCisJfSkKKworWlNURF9jdXN0b21NZW0gWlNURF9pbml0U3RhY2sodm9pZCAqd29ya3NwYWNlLCBzaXplX3Qgd29ya3NwYWNlU2l6ZSkKK3sKKwlaU1REX2N1c3RvbU1lbSBzdGFja01lbSA9IHtaU1REX3N0YWNrQWxsb2MsIFpTVERfc3RhY2tGcmVlLCB3b3Jrc3BhY2V9OworCVpTVERfc3RhY2sgKnN0YWNrID0gKFpTVERfc3RhY2sgKil3b3Jrc3BhY2U7CisJLyogVmVyaWZ5IHByZWNvbmRpdGlvbnMgKi8KKwlpZiAoIXdvcmtzcGFjZSB8fCB3b3Jrc3BhY2VTaXplIDwgc2l6ZW9mKFpTVERfc3RhY2spIHx8IHdvcmtzcGFjZSAhPSBaU1REX1BUUl9BTElHTih3b3Jrc3BhY2UpKSB7CisJCVpTVERfY3VzdG9tTWVtIGVycm9yID0ge05VTEwsIE5VTEwsIE5VTEx9OworCQlyZXR1cm4gZXJyb3I7CisJfQorCS8qIEluaXRpYWxpemUgdGhlIHN0YWNrICovCisJc3RhY2stPnB0ciA9IHdvcmtzcGFjZTsKKwlzdGFjay0+ZW5kID0gKGNoYXIgKil3b3Jrc3BhY2UgKyB3b3Jrc3BhY2VTaXplOworCXN0YWNrX3B1c2goc3RhY2ssIHNpemVvZihaU1REX3N0YWNrKSk7CisJcmV0dXJuIHN0YWNrTWVtOworfQorCit2b2lkICpaU1REX3N0YWNrQWxsb2NBbGwodm9pZCAqb3BhcXVlLCBzaXplX3QgKnNpemUpCit7CisJWlNURF9zdGFjayAqc3RhY2sgPSAoWlNURF9zdGFjayAqKW9wYXF1ZTsKKwkqc2l6ZSA9IChCWVRFIGNvbnN0ICopc3RhY2stPmVuZCAtIChCWVRFICopWlNURF9QVFJfQUxJR04oc3RhY2stPnB0cik7CisJcmV0dXJuIHN0YWNrX3B1c2goc3RhY2ssICpzaXplKTsKK30KKwordm9pZCAqWlNURF9zdGFja0FsbG9jKHZvaWQgKm9wYXF1ZSwgc2l6ZV90IHNpemUpCit7CisJWlNURF9zdGFjayAqc3RhY2sgPSAoWlNURF9zdGFjayAqKW9wYXF1ZTsKKwlyZXR1cm4gc3RhY2tfcHVzaChzdGFjaywgc2l6ZSk7Cit9Cit2b2lkIFpTVERfc3RhY2tGcmVlKHZvaWQgKm9wYXF1ZSwgdm9pZCAqYWRkcmVzcykKK3sKKwkodm9pZClvcGFxdWU7CisJKHZvaWQpYWRkcmVzczsKK30KKwordm9pZCAqWlNURF9tYWxsb2Moc2l6ZV90IHNpemUsIFpTVERfY3VzdG9tTWVtIGN1c3RvbU1lbSkgeyByZXR1cm4gY3VzdG9tTWVtLmN1c3RvbUFsbG9jKGN1c3RvbU1lbS5vcGFxdWUsIHNpemUpOyB9CisKK3ZvaWQgWlNURF9mcmVlKHZvaWQgKnB0ciwgWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKQoreworCWlmIChwdHIgIT0gTlVMTCkKKwkJY3VzdG9tTWVtLmN1c3RvbUZyZWUoY3VzdG9tTWVtLm9wYXF1ZSwgcHRyKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvenN0ZF9pbnRlcm5hbC5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC96c3RkX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3OWZhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9rZXJuZWwvbGludXgvdjQuMTQvbGliL3pzdGQvenN0ZF9pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMjYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBZYW5uIENvbGxldCwgRmFjZWJvb2ssIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCisgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay96c3RkLgorICogQW4gYWRkaXRpb25hbCBncmFudCBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZQorICogc2FtZSBkaXJlY3RvcnkuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAqIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gVGhpcyBwcm9ncmFtIGlzIGR1YWwtbGljZW5zZWQ7IHlvdSBtYXkgc2VsZWN0CisgKiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIG9yIEJTRCBsaWNlbnNlCisgKiAoIkJTRCIpLgorICovCisKKyNpZm5kZWYgWlNURF9DQ09NTU9OX0hfTU9EVUxFCisjZGVmaW5lIFpTVERfQ0NPTU1PTl9IX01PRFVMRQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBDb21waWxlciBzcGVjaWZpY3MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRk9SQ0VfSU5MSU5FIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUKKyNkZWZpbmUgRk9SQ0VfTk9JTkxJTkUgc3RhdGljIG5vaW5saW5lCisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIERlcGVuZGVuY2llcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgImVycm9yX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJtZW0uaCIKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3h4aGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L3pzdGQuaD4KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgc2hhcmVkIG1hY3JvcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgTUFYKGEsIGIpICgoYSkgPiAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIENIRUNLX0YoZikgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXNpemVfdCBjb25zdCBlcnJjb2QgPSBmOyBcCisJCWlmIChFUlJfaXNFcnJvcihlcnJjb2QpKSBcCisJCQlyZXR1cm4gZXJyY29kOyAgIFwKKwl9IC8qIGNoZWNrIGFuZCBGb3J3YXJkIGVycm9yIGNvZGUgKi8KKyNkZWZpbmUgQ0hFQ0tfRShmLCBlKSAgICAgICAgICAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJc2l6ZV90IGNvbnN0IGVycmNvZCA9IGY7IFwKKwkJaWYgKEVSUl9pc0Vycm9yKGVycmNvZCkpIFwKKwkJCXJldHVybiBFUlJPUihlKTsgXAorCX0gLyogY2hlY2sgYW5kIHNlbmQgRXJyb3IgY29kZSAqLworI2RlZmluZSBaU1REX1NUQVRJQ19BU1NFUlQoYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJZW51bSB7IFpTVERfc3RhdGljX2Fzc2VydCA9IDEgLyAoaW50KSghIShjKSkgfTsgXAorCX0KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgQ29tbW9uIGNvbnN0YW50cworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBaU1REX09QVF9OVU0gKDEgPDwgMTIpCisjZGVmaW5lIFpTVERfRElDVF9NQUdJQyAweEVDMzBBNDM3IC8qIHYwLjcrICovCisKKyNkZWZpbmUgWlNURF9SRVBfTlVNIDMJCSAgICAgIC8qIG51bWJlciBvZiByZXBjb2RlcyAqLworI2RlZmluZSBaU1REX1JFUF9DSEVDSyAoWlNURF9SRVBfTlVNKSAvKiBudW1iZXIgb2YgcmVwY29kZXMgdG8gY2hlY2sgYnkgdGhlIG9wdGltYWwgcGFyc2VyICovCisjZGVmaW5lIFpTVERfUkVQX01PVkUgKFpTVERfUkVQX05VTSAtIDEpCisjZGVmaW5lIFpTVERfUkVQX01PVkVfT1BUIChaU1REX1JFUF9OVU0pCitzdGF0aWMgY29uc3QgVTMyIHJlcFN0YXJ0VmFsdWVbWlNURF9SRVBfTlVNXSA9IHsxLCA0LCA4fTsKKworI2RlZmluZSBLQiAqKDEgPDwgMTApCisjZGVmaW5lIE1CICooMSA8PCAyMCkKKyNkZWZpbmUgR0IgKigxVSA8PCAzMCkKKworI2RlZmluZSBCSVQ3IDEyOAorI2RlZmluZSBCSVQ2IDY0CisjZGVmaW5lIEJJVDUgMzIKKyNkZWZpbmUgQklUNCAxNgorI2RlZmluZSBCSVQxIDIKKyNkZWZpbmUgQklUMCAxCisKKyNkZWZpbmUgWlNURF9XSU5ET1dMT0dfQUJTT0xVVEVNSU4gMTAKK3N0YXRpYyBjb25zdCBzaXplX3QgWlNURF9mY3NfZmllbGRTaXplWzRdID0gezAsIDIsIDQsIDh9Oworc3RhdGljIGNvbnN0IHNpemVfdCBaU1REX2RpZF9maWVsZFNpemVbNF0gPSB7MCwgMSwgMiwgNH07CisKKyNkZWZpbmUgWlNURF9CTE9DS0hFQURFUlNJWkUgMyAvKiBDIHN0YW5kYXJkIGRvZXNuJ3QgYWxsb3cgYHN0YXRpYyBjb25zdGAgdmFyaWFibGUgdG8gYmUgaW5pdCB1c2luZyBhbm90aGVyIGBzdGF0aWMgY29uc3RgIHZhcmlhYmxlICovCitzdGF0aWMgY29uc3Qgc2l6ZV90IFpTVERfYmxvY2tIZWFkZXJTaXplID0gWlNURF9CTE9DS0hFQURFUlNJWkU7Cit0eXBlZGVmIGVudW0geyBidF9yYXcsIGJ0X3JsZSwgYnRfY29tcHJlc3NlZCwgYnRfcmVzZXJ2ZWQgfSBibG9ja1R5cGVfZTsKKworI2RlZmluZSBNSU5fU0VRVUVOQ0VTX1NJWkUgMQkJCQkJCQkJCSAgLyogbmJTZXE9PTAgKi8KKyNkZWZpbmUgTUlOX0NCTE9DS19TSVpFICgxIC8qbGl0Q1NpemUqLyArIDEgLyogUkxFIG9yIFJBVyAqLyArIE1JTl9TRVFVRU5DRVNfU0laRSAvKiBuYlNlcT09MCAqLykgLyogZm9yIGEgbm9uLW51bGwgYmxvY2sgKi8KKworI2RlZmluZSBIdWZMb2cgMTIKK3R5cGVkZWYgZW51bSB7IHNldF9iYXNpYywgc2V0X3JsZSwgc2V0X2NvbXByZXNzZWQsIHNldF9yZXBlYXQgfSBzeW1ib2xFbmNvZGluZ1R5cGVfZTsKKworI2RlZmluZSBMT05HTkJTRVEgMHg3RjAwCisKKyNkZWZpbmUgTUlOTUFUQ0ggMworI2RlZmluZSBFUVVBTF9SRUFEMzIgNAorCisjZGVmaW5lIExpdGJpdHMgOAorI2RlZmluZSBNYXhMaXQgKCgxIDw8IExpdGJpdHMpIC0gMSkKKyNkZWZpbmUgTWF4TUwgNTIKKyNkZWZpbmUgTWF4TEwgMzUKKyNkZWZpbmUgTWF4T2ZmIDI4CisjZGVmaW5lIE1heFNlcSBNQVgoTWF4TEwsIE1heE1MKSAvKiBBc3N1bXB0aW9uIDogTWF4T2ZmIDwgTWF4TEwsTWF4TUwgKi8KKyNkZWZpbmUgTUxGU0VMb2cgOQorI2RlZmluZSBMTEZTRUxvZyA5CisjZGVmaW5lIE9mZkZTRUxvZyA4CisKK3N0YXRpYyBjb25zdCBVMzIgTExfYml0c1tNYXhMTCArIDFdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2fTsKK3N0YXRpYyBjb25zdCBTMTYgTExfZGVmYXVsdE5vcm1bTWF4TEwgKyAxXSA9IHs0LCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAyLCAxLCAxLCAxLCAxLCAxLCAtMSwgLTEsIC0xLCAtMX07CisjZGVmaW5lIExMX0RFRkFVTFROT1JNTE9HIDYgLyogZm9yIHN0YXRpYyBhbGxvY2F0aW9uICovCitzdGF0aWMgY29uc3QgVTMyIExMX2RlZmF1bHROb3JtTG9nID0gTExfREVGQVVMVE5PUk1MT0c7CisKK3N0YXRpYyBjb25zdCBVMzIgTUxfYml0c1tNYXhNTCArIDFdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIDAsCisJCQkJICAgICAgIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2fTsKK3N0YXRpYyBjb25zdCBTMTYgTUxfZGVmYXVsdE5vcm1bTWF4TUwgKyAxXSA9IHsxLCA0LCAzLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAxLAorCQkJCQkgICAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07CisjZGVmaW5lIE1MX0RFRkFVTFROT1JNTE9HIDYgLyogZm9yIHN0YXRpYyBhbGxvY2F0aW9uICovCitzdGF0aWMgY29uc3QgVTMyIE1MX2RlZmF1bHROb3JtTG9nID0gTUxfREVGQVVMVE5PUk1MT0c7CisKK3N0YXRpYyBjb25zdCBTMTYgT0ZfZGVmYXVsdE5vcm1bTWF4T2ZmICsgMV0gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKyNkZWZpbmUgT0ZfREVGQVVMVE5PUk1MT0cgNSAvKiBmb3Igc3RhdGljIGFsbG9jYXRpb24gKi8KK3N0YXRpYyBjb25zdCBVMzIgT0ZfZGVmYXVsdE5vcm1Mb2cgPSBPRl9ERUZBVUxUTk9STUxPRzsKKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgU2hhcmVkIGZ1bmN0aW9ucyB0byBpbmNsdWRlIGZvciBpbmxpbmluZworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworWlNURF9TVEFUSUMgdm9pZCBaU1REX2NvcHk4KHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjKSB7CisJbWVtY3B5KGRzdCwgc3JjLCA4KTsKK30KKy8qISBaU1REX3dpbGRjb3B5KCkgOgorKiAgIGN1c3RvbSB2ZXJzaW9uIG9mIG1lbWNweSgpLCBjYW4gY29weSB1cCB0byA3IGJ5dGVzIHRvbyBtYW55ICg4IGJ5dGVzIGlmIGxlbmd0aD09MCkgKi8KKyNkZWZpbmUgV0lMRENPUFlfT1ZFUkxFTkdUSCA4CitaU1REX1NUQVRJQyB2b2lkIFpTVERfd2lsZGNvcHkodm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHB0cmRpZmZfdCBsZW5ndGgpCit7CisJY29uc3QgQllURSogaXAgPSAoY29uc3QgQllURSopc3JjOworCUJZVEUqIG9wID0gKEJZVEUqKWRzdDsKKwlCWVRFKiBjb25zdCBvZW5kID0gb3AgKyBsZW5ndGg7CisJLyogV29yayBhcm91bmQgaHR0cHM6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9ODEzODguCisJICogQXZvaWQgdGhlIGJhZCBjYXNlIHdoZXJlIHRoZSBsb29wIG9ubHkgcnVucyBvbmNlIGJ5IGhhbmRsaW5nIHRoZQorCSAqIHNwZWNpYWwgY2FzZSBzZXBhcmF0ZWx5LiBUaGlzIGRvZXNuJ3QgdHJpZ2dlciB0aGUgYnVnIGJlY2F1c2UgaXQKKwkgKiBkb2Vzbid0IGludm9sdmUgcG9pbnRlci9pbnRlZ2VyIG92ZXJmbG93LgorCSAqLworCWlmIChsZW5ndGggPD0gOCkKKwkJcmV0dXJuIFpTVERfY29weTgoZHN0LCBzcmMpOworCWRvIHsKKwkJWlNURF9jb3B5OChvcCwgaXApOworCQlvcCArPSA4OworCQlpcCArPSA4OworCX0gd2hpbGUgKG9wIDwgb2VuZCk7Cit9CisKKy8qLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogIFByaXZhdGUgaW50ZXJmYWNlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordHlwZWRlZiBzdHJ1Y3QgWlNURF9zdGF0c19zIFpTVERfc3RhdHNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVUzMiBvZmY7CisJVTMyIGxlbjsKK30gWlNURF9tYXRjaF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJVTMyIHByaWNlOworCVUzMiBvZmY7CisJVTMyIG1sZW47CisJVTMyIGxpdGxlbjsKKwlVMzIgcmVwW1pTVERfUkVQX05VTV07Cit9IFpTVERfb3B0aW1hbF90OworCit0eXBlZGVmIHN0cnVjdCBzZXFEZWZfcyB7CisJVTMyIG9mZnNldDsKKwlVMTYgbGl0TGVuZ3RoOworCVUxNiBtYXRjaExlbmd0aDsKK30gc2VxRGVmOworCit0eXBlZGVmIHN0cnVjdCB7CisJc2VxRGVmICpzZXF1ZW5jZXNTdGFydDsKKwlzZXFEZWYgKnNlcXVlbmNlczsKKwlCWVRFICpsaXRTdGFydDsKKwlCWVRFICpsaXQ7CisJQllURSAqbGxDb2RlOworCUJZVEUgKm1sQ29kZTsKKwlCWVRFICpvZkNvZGU7CisJVTMyIGxvbmdMZW5ndGhJRDsgLyogMCA9PSBubyBsb25nTGVuZ3RoOyAxID09IExpdC5sb25nTGVuZ3RoOyAyID09IE1hdGNoLmxvbmdMZW5ndGg7ICovCisJVTMyIGxvbmdMZW5ndGhQb3M7CisJLyogb3B0ICovCisJWlNURF9vcHRpbWFsX3QgKnByaWNlVGFibGU7CisJWlNURF9tYXRjaF90ICptYXRjaFRhYmxlOworCVUzMiAqbWF0Y2hMZW5ndGhGcmVxOworCVUzMiAqbGl0TGVuZ3RoRnJlcTsKKwlVMzIgKmxpdEZyZXE7CisJVTMyICpvZmZDb2RlRnJlcTsKKwlVMzIgbWF0Y2hMZW5ndGhTdW07CisJVTMyIG1hdGNoU3VtOworCVUzMiBsaXRMZW5ndGhTdW07CisJVTMyIGxpdFN1bTsKKwlVMzIgb2ZmQ29kZVN1bTsKKwlVMzIgbG9nMm1hdGNoTGVuZ3RoU3VtOworCVUzMiBsb2cybWF0Y2hTdW07CisJVTMyIGxvZzJsaXRMZW5ndGhTdW07CisJVTMyIGxvZzJsaXRTdW07CisJVTMyIGxvZzJvZmZDb2RlU3VtOworCVUzMiBmYWN0b3I7CisJVTMyIHN0YXRpY1ByaWNlczsKKwlVMzIgY2FjaGVkUHJpY2U7CisJVTMyIGNhY2hlZExpdExlbmd0aDsKKwljb25zdCBCWVRFICpjYWNoZWRMaXRlcmFsczsKK30gc2VxU3RvcmVfdDsKKworY29uc3Qgc2VxU3RvcmVfdCAqWlNURF9nZXRTZXFTdG9yZShjb25zdCBaU1REX0NDdHggKmN0eCk7Cit2b2lkIFpTVERfc2VxVG9Db2Rlcyhjb25zdCBzZXFTdG9yZV90ICpzZXFTdG9yZVB0cik7CitpbnQgWlNURF9pc1NraXBGcmFtZShaU1REX0RDdHggKmRjdHgpOworCisvKj0gQ3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyAqLwordHlwZWRlZiB2b2lkICooKlpTVERfYWxsb2NGdW5jdGlvbikodm9pZCAqb3BhcXVlLCBzaXplX3Qgc2l6ZSk7Cit0eXBlZGVmIHZvaWQgKCpaU1REX2ZyZWVGdW5jdGlvbikodm9pZCAqb3BhcXVlLCB2b2lkICphZGRyZXNzKTsKK3R5cGVkZWYgc3RydWN0IHsKKwlaU1REX2FsbG9jRnVuY3Rpb24gY3VzdG9tQWxsb2M7CisJWlNURF9mcmVlRnVuY3Rpb24gY3VzdG9tRnJlZTsKKwl2b2lkICpvcGFxdWU7Cit9IFpTVERfY3VzdG9tTWVtOworCit2b2lkICpaU1REX21hbGxvYyhzaXplX3Qgc2l6ZSwgWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKTsKK3ZvaWQgWlNURF9mcmVlKHZvaWQgKnB0ciwgWlNURF9jdXN0b21NZW0gY3VzdG9tTWVtKTsKKworLyo9PT09PT0gc3RhY2sgYWxsb2NhdGlvbiAgPT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXZvaWQgKnB0cjsKKwljb25zdCB2b2lkICplbmQ7Cit9IFpTVERfc3RhY2s7CisKKyNkZWZpbmUgWlNURF9BTElHTih4KSBBTElHTih4LCBzaXplb2Yoc2l6ZV90KSkKKyNkZWZpbmUgWlNURF9QVFJfQUxJR04ocCkgUFRSX0FMSUdOKHAsIHNpemVvZihzaXplX3QpKQorCitaU1REX2N1c3RvbU1lbSBaU1REX2luaXRTdGFjayh2b2lkICp3b3Jrc3BhY2UsIHNpemVfdCB3b3Jrc3BhY2VTaXplKTsKKwordm9pZCAqWlNURF9zdGFja0FsbG9jQWxsKHZvaWQgKm9wYXF1ZSwgc2l6ZV90ICpzaXplKTsKK3ZvaWQgKlpTVERfc3RhY2tBbGxvYyh2b2lkICpvcGFxdWUsIHNpemVfdCBzaXplKTsKK3ZvaWQgWlNURF9zdGFja0ZyZWUodm9pZCAqb3BhcXVlLCB2b2lkICphZGRyZXNzKTsKKworLyo9PT09PT0gIGNvbW1vbiBmdW5jdGlvbiAgPT09PT09Ki8KKworWlNURF9TVEFUSUMgVTMyIFpTVERfaGlnaGJpdDMyKFUzMiB2YWwpIHsgcmV0dXJuIDMxIC0gX19idWlsdGluX2Nseih2YWwpOyB9CisKKy8qIGhpZGRlbiBmdW5jdGlvbnMgKi8KKworLyogWlNURF9pbnZhbGlkYXRlUmVwQ29kZXMoKSA6CisgKiBlbnN1cmVzIG5leHQgY29tcHJlc3Npb24gd2lsbCBub3QgdXNlIHJlcGNvZGVzIGZyb20gcHJldmlvdXMgYmxvY2suCisgKiBOb3RlIDogb25seSB3b3JrcyB3aXRoIHJlZ3VsYXIgdmFyaWFudDsKKyAqICAgICAgICBkbyBub3QgdXNlIHdpdGggZXh0RGljdCB2YXJpYW50ICEgKi8KK3ZvaWQgWlNURF9pbnZhbGlkYXRlUmVwQ29kZXMoWlNURF9DQ3R4ICpjY3R4KTsKKworc2l6ZV90IFpTVERfZnJlZUNDdHgoWlNURF9DQ3R4ICpjY3R4KTsKK3NpemVfdCBaU1REX2ZyZWVEQ3R4KFpTVERfREN0eCAqZGN0eCk7CitzaXplX3QgWlNURF9mcmVlQ0RpY3QoWlNURF9DRGljdCAqY2RpY3QpOworc2l6ZV90IFpTVERfZnJlZUREaWN0KFpTVERfRERpY3QgKmNkaWN0KTsKK3NpemVfdCBaU1REX2ZyZWVDU3RyZWFtKFpTVERfQ1N0cmVhbSAqemNzKTsKK3NpemVfdCBaU1REX2ZyZWVEU3RyZWFtKFpTVERfRFN0cmVhbSAqemRzKTsKKworI2VuZGlmIC8qIFpTVERfQ0NPTU1PTl9IX01PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC96c3RkX29wdC5oIGIvc3JjL2tlcm5lbC9saW51eC92NC4xNC9saWIvenN0ZC96c3RkX29wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZTFiNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMva2VybmVsL2xpbnV4L3Y0LjE0L2xpYi96c3RkL3pzdGRfb3B0LmgKQEAgLTAsMCArMSwxMDE0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxNi1wcmVzZW50LCBQcnplbXlzbGF3IFNraWJpbnNraSwgWWFubiBDb2xsZXQsIEZhY2Vib29rLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEJTRC1zdHlsZSBsaWNlbnNlIGZvdW5kIGluIHRoZQorICogTElDRU5TRSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svenN0ZC4KKyAqIEFuIGFkZGl0aW9uYWwgZ3JhbnQgb2YgcGF0ZW50IHJpZ2h0cyBjYW4gYmUgZm91bmQgaW4gdGhlIFBBVEVOVFMgZmlsZSBpbiB0aGUKKyAqIHNhbWUgZGlyZWN0b3J5LgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgKiB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIFRoaXMgcHJvZ3JhbSBpcyBkdWFsLWxpY2Vuc2VkOyB5b3UgbWF5IHNlbGVjdAorICogZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBvciBCU0QgbGljZW5zZQorICogKCJCU0QiKS4KKyAqLworCisvKiBOb3RlIDogdGhpcyBmaWxlIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIHdpdGhpbiB6c3RkX2NvbXByZXNzLmMgKi8KKworI2lmbmRlZiBaU1REX09QVF9IXzkxODQyMzk4NzQzCisjZGVmaW5lIFpTVERfT1BUX0hfOTE4NDIzOTg3NDMKKworI2RlZmluZSBaU1REX0xJVEZSRVFfQUREIDIKKyNkZWZpbmUgWlNURF9GUkVRX0RJViA0CisjZGVmaW5lIFpTVERfTUFYX1BSSUNFICgxIDw8IDMwKQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBQcmljZSBmdW5jdGlvbnMgZm9yIG9wdGltYWwgcGFyc2VyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitGT1JDRV9JTkxJTkUgdm9pZCBaU1REX3NldExvZzJQcmljZXMoc2VxU3RvcmVfdCAqc3NQdHIpCit7CisJc3NQdHItPmxvZzJtYXRjaExlbmd0aFN1bSA9IFpTVERfaGlnaGJpdDMyKHNzUHRyLT5tYXRjaExlbmd0aFN1bSArIDEpOworCXNzUHRyLT5sb2cybGl0TGVuZ3RoU3VtID0gWlNURF9oaWdoYml0MzIoc3NQdHItPmxpdExlbmd0aFN1bSArIDEpOworCXNzUHRyLT5sb2cybGl0U3VtID0gWlNURF9oaWdoYml0MzIoc3NQdHItPmxpdFN1bSArIDEpOworCXNzUHRyLT5sb2cyb2ZmQ29kZVN1bSA9IFpTVERfaGlnaGJpdDMyKHNzUHRyLT5vZmZDb2RlU3VtICsgMSk7CisJc3NQdHItPmZhY3RvciA9IDEgKyAoKHNzUHRyLT5saXRTdW0gPj4gNSkgLyBzc1B0ci0+bGl0TGVuZ3RoU3VtKSArICgoc3NQdHItPmxpdFN1bSA8PCAxKSAvIChzc1B0ci0+bGl0U3VtICsgc3NQdHItPm1hdGNoU3VtKSk7Cit9CisKK1pTVERfU1RBVElDIHZvaWQgWlNURF9yZXNjYWxlRnJlcXMoc2VxU3RvcmVfdCAqc3NQdHIsIGNvbnN0IEJZVEUgKnNyYywgc2l6ZV90IHNyY1NpemUpCit7CisJdW5zaWduZWQgdTsKKworCXNzUHRyLT5jYWNoZWRMaXRlcmFscyA9IE5VTEw7CisJc3NQdHItPmNhY2hlZFByaWNlID0gc3NQdHItPmNhY2hlZExpdExlbmd0aCA9IDA7CisJc3NQdHItPnN0YXRpY1ByaWNlcyA9IDA7CisKKwlpZiAoc3NQdHItPmxpdExlbmd0aFN1bSA9PSAwKSB7CisJCWlmIChzcmNTaXplIDw9IDEwMjQpCisJCQlzc1B0ci0+c3RhdGljUHJpY2VzID0gMTsKKworCQlmb3IgKHUgPSAwOyB1IDw9IE1heExpdDsgdSsrKQorCQkJc3NQdHItPmxpdEZyZXFbdV0gPSAwOworCQlmb3IgKHUgPSAwOyB1IDwgc3JjU2l6ZTsgdSsrKQorCQkJc3NQdHItPmxpdEZyZXFbc3JjW3VdXSsrOworCisJCXNzUHRyLT5saXRTdW0gPSAwOworCQlzc1B0ci0+bGl0TGVuZ3RoU3VtID0gTWF4TEwgKyAxOworCQlzc1B0ci0+bWF0Y2hMZW5ndGhTdW0gPSBNYXhNTCArIDE7CisJCXNzUHRyLT5vZmZDb2RlU3VtID0gKE1heE9mZiArIDEpOworCQlzc1B0ci0+bWF0Y2hTdW0gPSAoWlNURF9MSVRGUkVRX0FERCA8PCBMaXRiaXRzKTsKKworCQlmb3IgKHUgPSAwOyB1IDw9IE1heExpdDsgdSsrKSB7CisJCQlzc1B0ci0+bGl0RnJlcVt1XSA9IDEgKyAoc3NQdHItPmxpdEZyZXFbdV0gPj4gWlNURF9GUkVRX0RJVik7CisJCQlzc1B0ci0+bGl0U3VtICs9IHNzUHRyLT5saXRGcmVxW3VdOworCQl9CisJCWZvciAodSA9IDA7IHUgPD0gTWF4TEw7IHUrKykKKwkJCXNzUHRyLT5saXRMZW5ndGhGcmVxW3VdID0gMTsKKwkJZm9yICh1ID0gMDsgdSA8PSBNYXhNTDsgdSsrKQorCQkJc3NQdHItPm1hdGNoTGVuZ3RoRnJlcVt1XSA9IDE7CisJCWZvciAodSA9IDA7IHUgPD0gTWF4T2ZmOyB1KyspCisJCQlzc1B0ci0+b2ZmQ29kZUZyZXFbdV0gPSAxOworCX0gZWxzZSB7CisJCXNzUHRyLT5tYXRjaExlbmd0aFN1bSA9IDA7CisJCXNzUHRyLT5saXRMZW5ndGhTdW0gPSAwOworCQlzc1B0ci0+b2ZmQ29kZVN1bSA9IDA7CisJCXNzUHRyLT5tYXRjaFN1bSA9IDA7CisJCXNzUHRyLT5saXRTdW0gPSAwOworCisJCWZvciAodSA9IDA7IHUgPD0gTWF4TGl0OyB1KyspIHsKKwkJCXNzUHRyLT5saXRGcmVxW3VdID0gMSArIChzc1B0ci0+bGl0RnJlcVt1XSA+PiAoWlNURF9GUkVRX0RJViArIDEpKTsKKwkJCXNzUHRyLT5saXRTdW0gKz0gc3NQdHItPmxpdEZyZXFbdV07CisJCX0KKwkJZm9yICh1ID0gMDsgdSA8PSBNYXhMTDsgdSsrKSB7CisJCQlzc1B0ci0+bGl0TGVuZ3RoRnJlcVt1XSA9IDEgKyAoc3NQdHItPmxpdExlbmd0aEZyZXFbdV0gPj4gKFpTVERfRlJFUV9ESVYgKyAxKSk7CisJCQlzc1B0ci0+bGl0TGVuZ3RoU3VtICs9IHNzUHRyLT5saXRMZW5ndGhGcmVxW3VdOworCQl9CisJCWZvciAodSA9IDA7IHUgPD0gTWF4TUw7IHUrKykgeworCQkJc3NQdHItPm1hdGNoTGVuZ3RoRnJlcVt1XSA9IDEgKyAoc3NQdHItPm1hdGNoTGVuZ3RoRnJlcVt1XSA+PiBaU1REX0ZSRVFfRElWKTsKKwkJCXNzUHRyLT5tYXRjaExlbmd0aFN1bSArPSBzc1B0ci0+bWF0Y2hMZW5ndGhGcmVxW3VdOworCQkJc3NQdHItPm1hdGNoU3VtICs9IHNzUHRyLT5tYXRjaExlbmd0aEZyZXFbdV0gKiAodSArIDMpOworCQl9CisJCXNzUHRyLT5tYXRjaFN1bSAqPSBaU1REX0xJVEZSRVFfQUREOworCQlmb3IgKHUgPSAwOyB1IDw9IE1heE9mZjsgdSsrKSB7CisJCQlzc1B0ci0+b2ZmQ29kZUZyZXFbdV0gPSAxICsgKHNzUHRyLT5vZmZDb2RlRnJlcVt1XSA+PiBaU1REX0ZSRVFfRElWKTsKKwkJCXNzUHRyLT5vZmZDb2RlU3VtICs9IHNzUHRyLT5vZmZDb2RlRnJlcVt1XTsKKwkJfQorCX0KKworCVpTVERfc2V0TG9nMlByaWNlcyhzc1B0cik7Cit9CisKK0ZPUkNFX0lOTElORSBVMzIgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVfdCAqc3NQdHIsIFUzMiBsaXRMZW5ndGgsIGNvbnN0IEJZVEUgKmxpdGVyYWxzKQoreworCVUzMiBwcmljZSwgdTsKKworCWlmIChzc1B0ci0+c3RhdGljUHJpY2VzKQorCQlyZXR1cm4gWlNURF9oaWdoYml0MzIoKFUzMilsaXRMZW5ndGggKyAxKSArIChsaXRMZW5ndGggKiA2KTsKKworCWlmIChsaXRMZW5ndGggPT0gMCkKKwkJcmV0dXJuIHNzUHRyLT5sb2cybGl0TGVuZ3RoU3VtIC0gWlNURF9oaWdoYml0MzIoc3NQdHItPmxpdExlbmd0aEZyZXFbMF0gKyAxKTsKKworCS8qIGxpdGVyYWxzICovCisJaWYgKHNzUHRyLT5jYWNoZWRMaXRlcmFscyA9PSBsaXRlcmFscykgeworCQlVMzIgY29uc3QgYWRkaXRpb25hbCA9IGxpdExlbmd0aCAtIHNzUHRyLT5jYWNoZWRMaXRMZW5ndGg7CisJCWNvbnN0IEJZVEUgKmxpdGVyYWxzMiA9IHNzUHRyLT5jYWNoZWRMaXRlcmFscyArIHNzUHRyLT5jYWNoZWRMaXRMZW5ndGg7CisJCXByaWNlID0gc3NQdHItPmNhY2hlZFByaWNlICsgYWRkaXRpb25hbCAqIHNzUHRyLT5sb2cybGl0U3VtOworCQlmb3IgKHUgPSAwOyB1IDwgYWRkaXRpb25hbDsgdSsrKQorCQkJcHJpY2UgLT0gWlNURF9oaWdoYml0MzIoc3NQdHItPmxpdEZyZXFbbGl0ZXJhbHMyW3VdXSArIDEpOworCQlzc1B0ci0+Y2FjaGVkUHJpY2UgPSBwcmljZTsKKwkJc3NQdHItPmNhY2hlZExpdExlbmd0aCA9IGxpdExlbmd0aDsKKwl9IGVsc2UgeworCQlwcmljZSA9IGxpdExlbmd0aCAqIHNzUHRyLT5sb2cybGl0U3VtOworCQlmb3IgKHUgPSAwOyB1IDwgbGl0TGVuZ3RoOyB1KyspCisJCQlwcmljZSAtPSBaU1REX2hpZ2hiaXQzMihzc1B0ci0+bGl0RnJlcVtsaXRlcmFsc1t1XV0gKyAxKTsKKworCQlpZiAobGl0TGVuZ3RoID49IDEyKSB7CisJCQlzc1B0ci0+Y2FjaGVkTGl0ZXJhbHMgPSBsaXRlcmFsczsKKwkJCXNzUHRyLT5jYWNoZWRQcmljZSA9IHByaWNlOworCQkJc3NQdHItPmNhY2hlZExpdExlbmd0aCA9IGxpdExlbmd0aDsKKwkJfQorCX0KKworCS8qIGxpdGVyYWwgTGVuZ3RoICovCisJeworCQljb25zdCBCWVRFIExMX2RlbHRhQ29kZSA9IDE5OworCQljb25zdCBCWVRFIGxsQ29kZSA9IChsaXRMZW5ndGggPiA2MykgPyAoQllURSlaU1REX2hpZ2hiaXQzMihsaXRMZW5ndGgpICsgTExfZGVsdGFDb2RlIDogTExfQ29kZVtsaXRMZW5ndGhdOworCQlwcmljZSArPSBMTF9iaXRzW2xsQ29kZV0gKyBzc1B0ci0+bG9nMmxpdExlbmd0aFN1bSAtIFpTVERfaGlnaGJpdDMyKHNzUHRyLT5saXRMZW5ndGhGcmVxW2xsQ29kZV0gKyAxKTsKKwl9CisKKwlyZXR1cm4gcHJpY2U7Cit9CisKK0ZPUkNFX0lOTElORSBVMzIgWlNURF9nZXRQcmljZShzZXFTdG9yZV90ICpzZXFTdG9yZVB0ciwgVTMyIGxpdExlbmd0aCwgY29uc3QgQllURSAqbGl0ZXJhbHMsIFUzMiBvZmZzZXQsIFUzMiBtYXRjaExlbmd0aCwgY29uc3QgaW50IHVsdHJhKQoreworCS8qIG9mZnNldCAqLworCVUzMiBwcmljZTsKKwlCWVRFIGNvbnN0IG9mZkNvZGUgPSAoQllURSlaU1REX2hpZ2hiaXQzMihvZmZzZXQgKyAxKTsKKworCWlmIChzZXFTdG9yZVB0ci0+c3RhdGljUHJpY2VzKQorCQlyZXR1cm4gWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdExlbmd0aCwgbGl0ZXJhbHMpICsgWlNURF9oaWdoYml0MzIoKFUzMiltYXRjaExlbmd0aCArIDEpICsgMTYgKyBvZmZDb2RlOworCisJcHJpY2UgPSBvZmZDb2RlICsgc2VxU3RvcmVQdHItPmxvZzJvZmZDb2RlU3VtIC0gWlNURF9oaWdoYml0MzIoc2VxU3RvcmVQdHItPm9mZkNvZGVGcmVxW29mZkNvZGVdICsgMSk7CisJaWYgKCF1bHRyYSAmJiBvZmZDb2RlID49IDIwKQorCQlwcmljZSArPSAob2ZmQ29kZSAtIDE5KSAqIDI7CisKKwkvKiBtYXRjaCBMZW5ndGggKi8KKwl7CisJCWNvbnN0IEJZVEUgTUxfZGVsdGFDb2RlID0gMzY7CisJCWNvbnN0IEJZVEUgbWxDb2RlID0gKG1hdGNoTGVuZ3RoID4gMTI3KSA/IChCWVRFKVpTVERfaGlnaGJpdDMyKG1hdGNoTGVuZ3RoKSArIE1MX2RlbHRhQ29kZSA6IE1MX0NvZGVbbWF0Y2hMZW5ndGhdOworCQlwcmljZSArPSBNTF9iaXRzW21sQ29kZV0gKyBzZXFTdG9yZVB0ci0+bG9nMm1hdGNoTGVuZ3RoU3VtIC0gWlNURF9oaWdoYml0MzIoc2VxU3RvcmVQdHItPm1hdGNoTGVuZ3RoRnJlcVttbENvZGVdICsgMSk7CisJfQorCisJcmV0dXJuIHByaWNlICsgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdExlbmd0aCwgbGl0ZXJhbHMpICsgc2VxU3RvcmVQdHItPmZhY3RvcjsKK30KKworWlNURF9TVEFUSUMgdm9pZCBaU1REX3VwZGF0ZVByaWNlKHNlcVN0b3JlX3QgKnNlcVN0b3JlUHRyLCBVMzIgbGl0TGVuZ3RoLCBjb25zdCBCWVRFICpsaXRlcmFscywgVTMyIG9mZnNldCwgVTMyIG1hdGNoTGVuZ3RoKQoreworCVUzMiB1OworCisJLyogbGl0ZXJhbHMgKi8KKwlzZXFTdG9yZVB0ci0+bGl0U3VtICs9IGxpdExlbmd0aCAqIFpTVERfTElURlJFUV9BREQ7CisJZm9yICh1ID0gMDsgdSA8IGxpdExlbmd0aDsgdSsrKQorCQlzZXFTdG9yZVB0ci0+bGl0RnJlcVtsaXRlcmFsc1t1XV0gKz0gWlNURF9MSVRGUkVRX0FERDsKKworCS8qIGxpdGVyYWwgTGVuZ3RoICovCisJeworCQljb25zdCBCWVRFIExMX2RlbHRhQ29kZSA9IDE5OworCQljb25zdCBCWVRFIGxsQ29kZSA9IChsaXRMZW5ndGggPiA2MykgPyAoQllURSlaU1REX2hpZ2hiaXQzMihsaXRMZW5ndGgpICsgTExfZGVsdGFDb2RlIDogTExfQ29kZVtsaXRMZW5ndGhdOworCQlzZXFTdG9yZVB0ci0+bGl0TGVuZ3RoRnJlcVtsbENvZGVdKys7CisJCXNlcVN0b3JlUHRyLT5saXRMZW5ndGhTdW0rKzsKKwl9CisKKwkvKiBtYXRjaCBvZmZzZXQgKi8KKwl7CisJCUJZVEUgY29uc3Qgb2ZmQ29kZSA9IChCWVRFKVpTVERfaGlnaGJpdDMyKG9mZnNldCArIDEpOworCQlzZXFTdG9yZVB0ci0+b2ZmQ29kZVN1bSsrOworCQlzZXFTdG9yZVB0ci0+b2ZmQ29kZUZyZXFbb2ZmQ29kZV0rKzsKKwl9CisKKwkvKiBtYXRjaCBMZW5ndGggKi8KKwl7CisJCWNvbnN0IEJZVEUgTUxfZGVsdGFDb2RlID0gMzY7CisJCWNvbnN0IEJZVEUgbWxDb2RlID0gKG1hdGNoTGVuZ3RoID4gMTI3KSA/IChCWVRFKVpTVERfaGlnaGJpdDMyKG1hdGNoTGVuZ3RoKSArIE1MX2RlbHRhQ29kZSA6IE1MX0NvZGVbbWF0Y2hMZW5ndGhdOworCQlzZXFTdG9yZVB0ci0+bWF0Y2hMZW5ndGhGcmVxW21sQ29kZV0rKzsKKwkJc2VxU3RvcmVQdHItPm1hdGNoTGVuZ3RoU3VtKys7CisJfQorCisJWlNURF9zZXRMb2cyUHJpY2VzKHNlcVN0b3JlUHRyKTsKK30KKworI2RlZmluZSBTRVRfUFJJQ0UocG9zLCBtbGVuXywgb2Zmc2V0XywgbGl0bGVuXywgcHJpY2VfKSAgICAgICAgICAgXAorCXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCXdoaWxlIChsYXN0X3BvcyA8IHBvcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkJb3B0W2xhc3RfcG9zICsgMV0ucHJpY2UgPSBaU1REX01BWF9QUklDRTsgXAorCQkJbGFzdF9wb3MrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJb3B0W3Bvc10ubWxlbiA9IG1sZW5fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCW9wdFtwb3NdLm9mZiA9IG9mZnNldF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlvcHRbcG9zXS5saXRsZW4gPSBsaXRsZW5fOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJb3B0W3Bvc10ucHJpY2UgPSBwcmljZV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfQorCisvKiBVcGRhdGUgaGFzaFRhYmxlMyB1cCB0byBpcCAoZXhjbHVkZWQpCisgICBBc3N1bXB0aW9uIDogYWx3YXlzIHdpdGhpbiBwcmVmaXggKGkuZS4gbm90IHdpdGhpbiBleHREaWN0KSAqLworRk9SQ0VfSU5MSU5FCitVMzIgWlNURF9pbnNlcnRBbmRGaW5kRmlyc3RJbmRleEhhc2gzKFpTVERfQ0N0eCAqemMsIGNvbnN0IEJZVEUgKmlwKQoreworCVUzMiAqY29uc3QgaGFzaFRhYmxlMyA9IHpjLT5oYXNoVGFibGUzOworCVUzMiBjb25zdCBoYXNoTG9nMyA9IHpjLT5oYXNoTG9nMzsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gemMtPmJhc2U7CisJVTMyIGlkeCA9IHpjLT5uZXh0VG9VcGRhdGUzOworCWNvbnN0IFUzMiB0YXJnZXQgPSB6Yy0+bmV4dFRvVXBkYXRlMyA9IChVMzIpKGlwIC0gYmFzZSk7CisJY29uc3Qgc2l6ZV90IGhhc2gzID0gWlNURF9oYXNoM1B0cihpcCwgaGFzaExvZzMpOworCisJd2hpbGUgKGlkeCA8IHRhcmdldCkgeworCQloYXNoVGFibGUzW1pTVERfaGFzaDNQdHIoYmFzZSArIGlkeCwgaGFzaExvZzMpXSA9IGlkeDsKKwkJaWR4Kys7CisJfQorCisJcmV0dXJuIGhhc2hUYWJsZTNbaGFzaDNdOworfQorCisvKi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqICBCaW5hcnkgVHJlZSBzZWFyY2gKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBVMzIgWlNURF9pbnNlcnRCdEFuZEdldEFsbE1hdGNoZXMoWlNURF9DQ3R4ICp6YywgY29uc3QgQllURSAqY29uc3QgaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGlMaW1pdCwgVTMyIG5iQ29tcGFyZXMsIGNvbnN0IFUzMiBtbHMsIFUzMiBleHREaWN0LAorCQkJCQkgWlNURF9tYXRjaF90ICptYXRjaGVzLCBjb25zdCBVMzIgbWluTWF0Y2hMZW4pCit7CisJY29uc3QgQllURSAqY29uc3QgYmFzZSA9IHpjLT5iYXNlOworCWNvbnN0IFUzMiBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsKKwljb25zdCBVMzIgaGFzaExvZyA9IHpjLT5wYXJhbXMuY1BhcmFtcy5oYXNoTG9nOworCWNvbnN0IHNpemVfdCBoID0gWlNURF9oYXNoUHRyKGlwLCBoYXNoTG9nLCBtbHMpOworCVUzMiAqY29uc3QgaGFzaFRhYmxlID0gemMtPmhhc2hUYWJsZTsKKwlVMzIgbWF0Y2hJbmRleCA9IGhhc2hUYWJsZVtoXTsKKwlVMzIgKmNvbnN0IGJ0ID0gemMtPmNoYWluVGFibGU7CisJY29uc3QgVTMyIGJ0TG9nID0gemMtPnBhcmFtcy5jUGFyYW1zLmNoYWluTG9nIC0gMTsKKwljb25zdCBVMzIgYnRNYXNrID0gKDFVIDw8IGJ0TG9nKSAtIDE7CisJc2l6ZV90IGNvbW1vbkxlbmd0aFNtYWxsZXIgPSAwLCBjb21tb25MZW5ndGhMYXJnZXIgPSAwOworCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RCYXNlID0gemMtPmRpY3RCYXNlOworCWNvbnN0IFUzMiBkaWN0TGltaXQgPSB6Yy0+ZGljdExpbWl0OworCWNvbnN0IEJZVEUgKmNvbnN0IGRpY3RFbmQgPSBkaWN0QmFzZSArIGRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBwcmVmaXhTdGFydCA9IGJhc2UgKyBkaWN0TGltaXQ7CisJY29uc3QgVTMyIGJ0TG93ID0gYnRNYXNrID49IGN1cnIgPyAwIDogY3VyciAtIGJ0TWFzazsKKwljb25zdCBVMzIgd2luZG93TG93ID0gemMtPmxvd0xpbWl0OworCVUzMiAqc21hbGxlclB0ciA9IGJ0ICsgMiAqIChjdXJyICYgYnRNYXNrKTsKKwlVMzIgKmxhcmdlclB0ciA9IGJ0ICsgMiAqIChjdXJyICYgYnRNYXNrKSArIDE7CisJVTMyIG1hdGNoRW5kSWR4ID0gY3VyciArIDg7CisJVTMyIGR1bW15MzI7IC8qIHRvIGJlIG51bGxpZmllZCBhdCB0aGUgZW5kICovCisJVTMyIG1udW0gPSAwOworCisJY29uc3QgVTMyIG1pbk1hdGNoID0gKG1scyA9PSAzKSA/IDMgOiA0OworCXNpemVfdCBiZXN0TGVuZ3RoID0gbWluTWF0Y2hMZW4gLSAxOworCisJaWYgKG1pbk1hdGNoID09IDMpIHsgLyogSEMzIG1hdGNoIGZpbmRlciAqLworCQlVMzIgY29uc3QgbWF0Y2hJbmRleDMgPSBaU1REX2luc2VydEFuZEZpbmRGaXJzdEluZGV4SGFzaDMoemMsIGlwKTsKKwkJaWYgKG1hdGNoSW5kZXgzID4gd2luZG93TG93ICYmIChjdXJyIC0gbWF0Y2hJbmRleDMgPCAoMSA8PCAxOCkpKSB7CisJCQljb25zdCBCWVRFICptYXRjaDsKKwkJCXNpemVfdCBjdXJyTWwgPSAwOworCQkJaWYgKCghZXh0RGljdCkgfHwgbWF0Y2hJbmRleDMgPj0gZGljdExpbWl0KSB7CisJCQkJbWF0Y2ggPSBiYXNlICsgbWF0Y2hJbmRleDM7CisJCQkJaWYgKG1hdGNoW2Jlc3RMZW5ndGhdID09IGlwW2Jlc3RMZW5ndGhdKQorCQkJCQljdXJyTWwgPSBaU1REX2NvdW50KGlwLCBtYXRjaCwgaUxpbWl0KTsKKwkJCX0gZWxzZSB7CisJCQkJbWF0Y2ggPSBkaWN0QmFzZSArIG1hdGNoSW5kZXgzOworCQkJCWlmIChaU1REX3JlYWRNSU5NQVRDSChtYXRjaCwgTUlOTUFUQ0gpID09CisJCQkJICAgIFpTVERfcmVhZE1JTk1BVENIKGlwLCBNSU5NQVRDSCkpIC8qIGFzc3VtcHRpb24gOiBtYXRjaEluZGV4MyA8PSBkaWN0TGltaXQtNCAoYnkgdGFibGUgY29uc3RydWN0aW9uKSAqLworCQkJCQljdXJyTWwgPSBaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIE1JTk1BVENILCBtYXRjaCArIE1JTk1BVENILCBpTGltaXQsIGRpY3RFbmQsIHByZWZpeFN0YXJ0KSArIE1JTk1BVENIOworCQkJfQorCisJCQkvKiBzYXZlIGJlc3Qgc29sdXRpb24gKi8KKwkJCWlmIChjdXJyTWwgPiBiZXN0TGVuZ3RoKSB7CisJCQkJYmVzdExlbmd0aCA9IGN1cnJNbDsKKwkJCQltYXRjaGVzW21udW1dLm9mZiA9IFpTVERfUkVQX01PVkVfT1BUICsgY3VyciAtIG1hdGNoSW5kZXgzOworCQkJCW1hdGNoZXNbbW51bV0ubGVuID0gKFUzMiljdXJyTWw7CisJCQkJbW51bSsrOworCQkJCWlmIChjdXJyTWwgPiBaU1REX09QVF9OVU0pCisJCQkJCWdvdG8gdXBkYXRlOworCQkJCWlmIChpcCArIGN1cnJNbCA9PSBpTGltaXQpCisJCQkJCWdvdG8gdXBkYXRlOyAvKiBiZXN0IHBvc3NpYmxlLCBhbmQgYXZvaWQgcmVhZCBvdmVyZmxvdyovCisJCQl9CisJCX0KKwl9CisKKwloYXNoVGFibGVbaF0gPSBjdXJyOyAvKiBVcGRhdGUgSGFzaCBUYWJsZSAqLworCisJd2hpbGUgKG5iQ29tcGFyZXMtLSAmJiAobWF0Y2hJbmRleCA+IHdpbmRvd0xvdykpIHsKKwkJVTMyICpuZXh0UHRyID0gYnQgKyAyICogKG1hdGNoSW5kZXggJiBidE1hc2spOworCQlzaXplX3QgbWF0Y2hMZW5ndGggPSBNSU4oY29tbW9uTGVuZ3RoU21hbGxlciwgY29tbW9uTGVuZ3RoTGFyZ2VyKTsgLyogZ3VhcmFudGVlZCBtaW5pbXVtIG5iIG9mIGNvbW1vbiBieXRlcyAqLworCQljb25zdCBCWVRFICptYXRjaDsKKworCQlpZiAoKCFleHREaWN0KSB8fCAobWF0Y2hJbmRleCArIG1hdGNoTGVuZ3RoID49IGRpY3RMaW1pdCkpIHsKKwkJCW1hdGNoID0gYmFzZSArIG1hdGNoSW5kZXg7CisJCQlpZiAobWF0Y2hbbWF0Y2hMZW5ndGhdID09IGlwW21hdGNoTGVuZ3RoXSkgeworCQkJCW1hdGNoTGVuZ3RoICs9IFpTVERfY291bnQoaXAgKyBtYXRjaExlbmd0aCArIDEsIG1hdGNoICsgbWF0Y2hMZW5ndGggKyAxLCBpTGltaXQpICsgMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1hdGNoID0gZGljdEJhc2UgKyBtYXRjaEluZGV4OworCQkJbWF0Y2hMZW5ndGggKz0gWlNURF9jb3VudF8yc2VnbWVudHMoaXAgKyBtYXRjaExlbmd0aCwgbWF0Y2ggKyBtYXRjaExlbmd0aCwgaUxpbWl0LCBkaWN0RW5kLCBwcmVmaXhTdGFydCk7CisJCQlpZiAobWF0Y2hJbmRleCArIG1hdGNoTGVuZ3RoID49IGRpY3RMaW1pdCkKKwkJCQltYXRjaCA9IGJhc2UgKyBtYXRjaEluZGV4OyAvKiB0byBwcmVwYXJlIGZvciBuZXh0IHVzYWdlIG9mIG1hdGNoW21hdGNoTGVuZ3RoXSAqLworCQl9CisKKwkJaWYgKG1hdGNoTGVuZ3RoID4gYmVzdExlbmd0aCkgeworCQkJaWYgKG1hdGNoTGVuZ3RoID4gbWF0Y2hFbmRJZHggLSBtYXRjaEluZGV4KQorCQkJCW1hdGNoRW5kSWR4ID0gbWF0Y2hJbmRleCArIChVMzIpbWF0Y2hMZW5ndGg7CisJCQliZXN0TGVuZ3RoID0gbWF0Y2hMZW5ndGg7CisJCQltYXRjaGVzW21udW1dLm9mZiA9IFpTVERfUkVQX01PVkVfT1BUICsgY3VyciAtIG1hdGNoSW5kZXg7CisJCQltYXRjaGVzW21udW1dLmxlbiA9IChVMzIpbWF0Y2hMZW5ndGg7CisJCQltbnVtKys7CisJCQlpZiAobWF0Y2hMZW5ndGggPiBaU1REX09QVF9OVU0pCisJCQkJYnJlYWs7CisJCQlpZiAoaXAgKyBtYXRjaExlbmd0aCA9PSBpTGltaXQpIC8qIGVxdWFsIDogbm8gd2F5IHRvIGtub3cgaWYgaW5mIG9yIHN1cCAqLworCQkJCWJyZWFrOwkJCS8qIGRyb3AsIHRvIGd1YXJhbnRlZSBjb25zaXN0ZW5jeSAobWlzcyBhIGxpdHRsZSBiaXQgb2YgY29tcHJlc3Npb24pICovCisJCX0KKworCQlpZiAobWF0Y2hbbWF0Y2hMZW5ndGhdIDwgaXBbbWF0Y2hMZW5ndGhdKSB7CisJCQkvKiBtYXRjaCBpcyBzbWFsbGVyIHRoYW4gY3VyciAqLworCQkJKnNtYWxsZXJQdHIgPSBtYXRjaEluZGV4OwkgIC8qIHVwZGF0ZSBzbWFsbGVyIGlkeCAqLworCQkJY29tbW9uTGVuZ3RoU21hbGxlciA9IG1hdGNoTGVuZ3RoOyAvKiBhbGwgc21hbGxlciB3aWxsIG5vdyBoYXZlIGF0IGxlYXN0IHRoaXMgZ3VhcmFudGVlZCBjb21tb24gbGVuZ3RoICovCisJCQlpZiAobWF0Y2hJbmRleCA8PSBidExvdykgeworCQkJCXNtYWxsZXJQdHIgPSAmZHVtbXkzMjsKKwkJCQlicmVhazsKKwkJCX0JCQkgIC8qIGJleW9uZCB0cmVlIHNpemUsIHN0b3AgdGhlIHNlYXJjaCAqLworCQkJc21hbGxlclB0ciA9IG5leHRQdHIgKyAxOyAvKiBuZXcgInNtYWxsZXIiID0+IGxhcmdlciBvZiBtYXRjaCAqLworCQkJbWF0Y2hJbmRleCA9IG5leHRQdHJbMV07ICAvKiBuZXcgbWF0Y2hJbmRleCBsYXJnZXIgdGhhbiBwcmV2aW91cyAoY2xvc2VyIHRvIGN1cnIpICovCisJCX0gZWxzZSB7CisJCQkvKiBtYXRjaCBpcyBsYXJnZXIgdGhhbiBjdXJyICovCisJCQkqbGFyZ2VyUHRyID0gbWF0Y2hJbmRleDsKKwkJCWNvbW1vbkxlbmd0aExhcmdlciA9IG1hdGNoTGVuZ3RoOworCQkJaWYgKG1hdGNoSW5kZXggPD0gYnRMb3cpIHsKKwkJCQlsYXJnZXJQdHIgPSAmZHVtbXkzMjsKKwkJCQlicmVhazsKKwkJCX0gLyogYmV5b25kIHRyZWUgc2l6ZSwgc3RvcCB0aGUgc2VhcmNoICovCisJCQlsYXJnZXJQdHIgPSBuZXh0UHRyOworCQkJbWF0Y2hJbmRleCA9IG5leHRQdHJbMF07CisJCX0KKwl9CisKKwkqc21hbGxlclB0ciA9ICpsYXJnZXJQdHIgPSAwOworCit1cGRhdGU6CisJemMtPm5leHRUb1VwZGF0ZSA9IChtYXRjaEVuZElkeCA+IGN1cnIgKyA4KSA/IG1hdGNoRW5kSWR4IC0gOCA6IGN1cnIgKyAxOworCXJldHVybiBtbnVtOworfQorCisvKiogVHJlZSB1cGRhdGVyLCBwcm92aWRpbmcgYmVzdCBtYXRjaCAqLworc3RhdGljIFUzMiBaU1REX0J0R2V0QWxsTWF0Y2hlcyhaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29uc3QgQllURSAqY29uc3QgaUxpbWl0LCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywgY29uc3QgVTMyIG1scywgWlNURF9tYXRjaF90ICptYXRjaGVzLAorCQkJCWNvbnN0IFUzMiBtaW5NYXRjaExlbikKK3sKKwlpZiAoaXAgPCB6Yy0+YmFzZSArIHpjLT5uZXh0VG9VcGRhdGUpCisJCXJldHVybiAwOyAvKiBza2lwcGVkIGFyZWEgKi8KKwlaU1REX3VwZGF0ZVRyZWUoemMsIGlwLCBpTGltaXQsIG1heE5iQXR0ZW1wdHMsIG1scyk7CisJcmV0dXJuIFpTVERfaW5zZXJ0QnRBbmRHZXRBbGxNYXRjaGVzKHpjLCBpcCwgaUxpbWl0LCBtYXhOYkF0dGVtcHRzLCBtbHMsIDAsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsKK30KKworc3RhdGljIFUzMiBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RNTFMoWlNURF9DQ3R4ICp6YywgLyogSW5kZXggdGFibGUgd2lsbCBiZSB1cGRhdGVkICovCisJCQkJCSAgY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGlIaWdoTGltaXQsIGNvbnN0IFUzMiBtYXhOYkF0dGVtcHRzLCBjb25zdCBVMzIgbWF0Y2hMZW5ndGhTZWFyY2gsCisJCQkJCSAgWlNURF9tYXRjaF90ICptYXRjaGVzLCBjb25zdCBVMzIgbWluTWF0Y2hMZW4pCit7CisJc3dpdGNoIChtYXRjaExlbmd0aFNlYXJjaCkgeworCWNhc2UgMzogcmV0dXJuIFpTVERfQnRHZXRBbGxNYXRjaGVzKHpjLCBpcCwgaUhpZ2hMaW1pdCwgbWF4TmJBdHRlbXB0cywgMywgbWF0Y2hlcywgbWluTWF0Y2hMZW4pOworCWRlZmF1bHQ6CisJY2FzZSA0OiByZXR1cm4gWlNURF9CdEdldEFsbE1hdGNoZXMoemMsIGlwLCBpSGlnaExpbWl0LCBtYXhOYkF0dGVtcHRzLCA0LCBtYXRjaGVzLCBtaW5NYXRjaExlbik7CisJY2FzZSA1OiByZXR1cm4gWlNURF9CdEdldEFsbE1hdGNoZXMoemMsIGlwLCBpSGlnaExpbWl0LCBtYXhOYkF0dGVtcHRzLCA1LCBtYXRjaGVzLCBtaW5NYXRjaExlbik7CisJY2FzZSA3OgorCWNhc2UgNjogcmV0dXJuIFpTVERfQnRHZXRBbGxNYXRjaGVzKHpjLCBpcCwgaUhpZ2hMaW1pdCwgbWF4TmJBdHRlbXB0cywgNiwgbWF0Y2hlcywgbWluTWF0Y2hMZW4pOworCX0KK30KKworLyoqIFRyZWUgdXBkYXRlciwgcHJvdmlkaW5nIGJlc3QgbWF0Y2ggKi8KK3N0YXRpYyBVMzIgWlNURF9CdEdldEFsbE1hdGNoZXNfZXh0RGljdChaU1REX0NDdHggKnpjLCBjb25zdCBCWVRFICpjb25zdCBpcCwgY29uc3QgQllURSAqY29uc3QgaUxpbWl0LCBjb25zdCBVMzIgbWF4TmJBdHRlbXB0cywgY29uc3QgVTMyIG1scywKKwkJCQkJWlNURF9tYXRjaF90ICptYXRjaGVzLCBjb25zdCBVMzIgbWluTWF0Y2hMZW4pCit7CisJaWYgKGlwIDwgemMtPmJhc2UgKyB6Yy0+bmV4dFRvVXBkYXRlKQorCQlyZXR1cm4gMDsgLyogc2tpcHBlZCBhcmVhICovCisJWlNURF91cGRhdGVUcmVlX2V4dERpY3QoemMsIGlwLCBpTGltaXQsIG1heE5iQXR0ZW1wdHMsIG1scyk7CisJcmV0dXJuIFpTVERfaW5zZXJ0QnRBbmRHZXRBbGxNYXRjaGVzKHpjLCBpcCwgaUxpbWl0LCBtYXhOYkF0dGVtcHRzLCBtbHMsIDEsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsKK30KKworc3RhdGljIFUzMiBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RNTFNfZXh0RGljdChaU1REX0NDdHggKnpjLCAvKiBJbmRleCB0YWJsZSB3aWxsIGJlIHVwZGF0ZWQgKi8KKwkJCQkJCSAgY29uc3QgQllURSAqaXAsIGNvbnN0IEJZVEUgKmNvbnN0IGlIaWdoTGltaXQsIGNvbnN0IFUzMiBtYXhOYkF0dGVtcHRzLCBjb25zdCBVMzIgbWF0Y2hMZW5ndGhTZWFyY2gsCisJCQkJCQkgIFpTVERfbWF0Y2hfdCAqbWF0Y2hlcywgY29uc3QgVTMyIG1pbk1hdGNoTGVuKQoreworCXN3aXRjaCAobWF0Y2hMZW5ndGhTZWFyY2gpIHsKKwljYXNlIDM6IHJldHVybiBaU1REX0J0R2V0QWxsTWF0Y2hlc19leHREaWN0KHpjLCBpcCwgaUhpZ2hMaW1pdCwgbWF4TmJBdHRlbXB0cywgMywgbWF0Y2hlcywgbWluTWF0Y2hMZW4pOworCWRlZmF1bHQ6CisJY2FzZSA0OiByZXR1cm4gWlNURF9CdEdldEFsbE1hdGNoZXNfZXh0RGljdCh6YywgaXAsIGlIaWdoTGltaXQsIG1heE5iQXR0ZW1wdHMsIDQsIG1hdGNoZXMsIG1pbk1hdGNoTGVuKTsKKwljYXNlIDU6IHJldHVybiBaU1REX0J0R2V0QWxsTWF0Y2hlc19leHREaWN0KHpjLCBpcCwgaUhpZ2hMaW1pdCwgbWF4TmJBdHRlbXB0cywgNSwgbWF0Y2hlcywgbWluTWF0Y2hMZW4pOworCWNhc2UgNzoKKwljYXNlIDY6IHJldHVybiBaU1REX0J0R2V0QWxsTWF0Y2hlc19leHREaWN0KHpjLCBpcCwgaUhpZ2hMaW1pdCwgbWF4TmJBdHRlbXB0cywgNiwgbWF0Y2hlcywgbWluTWF0Y2hMZW4pOworCX0KK30KKworLyotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgT3B0aW1hbCBwYXJzZXIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0ZPUkNFX0lOTElORQordm9pZCBaU1REX2NvbXByZXNzQmxvY2tfb3B0X2dlbmVyaWMoWlNURF9DQ3R4ICpjdHgsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IHNyY1NpemUsIGNvbnN0IGludCB1bHRyYSkKK3sKKwlzZXFTdG9yZV90ICpzZXFTdG9yZVB0ciA9ICYoY3R4LT5zZXFTdG9yZSk7CisJY29uc3QgQllURSAqY29uc3QgaXN0YXJ0ID0gKGNvbnN0IEJZVEUgKilzcmM7CisJY29uc3QgQllURSAqaXAgPSBpc3RhcnQ7CisJY29uc3QgQllURSAqYW5jaG9yID0gaXN0YXJ0OworCWNvbnN0IEJZVEUgKmNvbnN0IGllbmQgPSBpc3RhcnQgKyBzcmNTaXplOworCWNvbnN0IEJZVEUgKmNvbnN0IGlsaW1pdCA9IGllbmQgLSA4OworCWNvbnN0IEJZVEUgKmNvbnN0IGJhc2UgPSBjdHgtPmJhc2U7CisJY29uc3QgQllURSAqY29uc3QgcHJlZml4U3RhcnQgPSBiYXNlICsgY3R4LT5kaWN0TGltaXQ7CisKKwljb25zdCBVMzIgbWF4U2VhcmNoZXMgPSAxVSA8PCBjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExvZzsKKwljb25zdCBVMzIgc3VmZmljaWVudF9sZW4gPSBjdHgtPnBhcmFtcy5jUGFyYW1zLnRhcmdldExlbmd0aDsKKwljb25zdCBVMzIgbWxzID0gY3R4LT5wYXJhbXMuY1BhcmFtcy5zZWFyY2hMZW5ndGg7CisJY29uc3QgVTMyIG1pbk1hdGNoID0gKGN0eC0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoID09IDMpID8gMyA6IDQ7CisKKwlaU1REX29wdGltYWxfdCAqb3B0ID0gc2VxU3RvcmVQdHItPnByaWNlVGFibGU7CisJWlNURF9tYXRjaF90ICptYXRjaGVzID0gc2VxU3RvcmVQdHItPm1hdGNoVGFibGU7CisJY29uc3QgQllURSAqaW5yOworCVUzMiBvZmZzZXQsIHJlcFtaU1REX1JFUF9OVU1dOworCisJLyogaW5pdCAqLworCWN0eC0+bmV4dFRvVXBkYXRlMyA9IGN0eC0+bmV4dFRvVXBkYXRlOworCVpTVERfcmVzY2FsZUZyZXFzKHNlcVN0b3JlUHRyLCAoY29uc3QgQllURSAqKXNyYywgc3JjU2l6ZSk7CisJaXAgKz0gKGlwID09IHByZWZpeFN0YXJ0KTsKKwl7CisJCVUzMiBpOworCQlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspCisJCQlyZXBbaV0gPSBjdHgtPnJlcFtpXTsKKwl9CisKKwkvKiBNYXRjaCBMb29wICovCisJd2hpbGUgKGlwIDwgaWxpbWl0KSB7CisJCVUzMiBjdXIsIG1hdGNoX251bSwgbGFzdF9wb3MsIGxpdGxlbiwgcHJpY2U7CisJCVUzMiB1LCBtbGVuLCBiZXN0X21sZW4sIGJlc3Rfb2ZmLCBsaXRMZW5ndGg7CisJCW1lbXNldChvcHQsIDAsIHNpemVvZihaU1REX29wdGltYWxfdCkpOworCQlsYXN0X3BvcyA9IDA7CisJCWxpdGxlbiA9IChVMzIpKGlwIC0gYW5jaG9yKTsKKworCQkvKiBjaGVjayByZXBDb2RlICovCisJCXsKKwkJCVUzMiBpLCBsYXN0X2kgPSBaU1REX1JFUF9DSEVDSyArIChpcCA9PSBhbmNob3IpOworCQkJZm9yIChpID0gKGlwID09IGFuY2hvcik7IGkgPCBsYXN0X2k7IGkrKykgeworCQkJCWNvbnN0IFMzMiByZXBDdXIgPSAoaSA9PSBaU1REX1JFUF9NT1ZFX09QVCkgPyAocmVwWzBdIC0gMSkgOiByZXBbaV07CisJCQkJaWYgKChyZXBDdXIgPiAwKSAmJiAocmVwQ3VyIDwgKFMzMikoaXAgLSBwcmVmaXhTdGFydCkpICYmCisJCQkJICAgIChaU1REX3JlYWRNSU5NQVRDSChpcCwgbWluTWF0Y2gpID09IFpTVERfcmVhZE1JTk1BVENIKGlwIC0gcmVwQ3VyLCBtaW5NYXRjaCkpKSB7CisJCQkJCW1sZW4gPSAoVTMyKVpTVERfY291bnQoaXAgKyBtaW5NYXRjaCwgaXAgKyBtaW5NYXRjaCAtIHJlcEN1ciwgaWVuZCkgKyBtaW5NYXRjaDsKKwkJCQkJaWYgKG1sZW4gPiBzdWZmaWNpZW50X2xlbiB8fCBtbGVuID49IFpTVERfT1BUX05VTSkgeworCQkJCQkJYmVzdF9tbGVuID0gbWxlbjsKKwkJCQkJCWJlc3Rfb2ZmID0gaTsKKwkJCQkJCWN1ciA9IDA7CisJCQkJCQlsYXN0X3BvcyA9IDE7CisJCQkJCQlnb3RvIF9zdG9yZVNlcXVlbmNlOworCQkJCQl9CisJCQkJCWJlc3Rfb2ZmID0gaSAtIChpcCA9PSBhbmNob3IpOworCQkJCQlkbyB7CisJCQkJCQlwcmljZSA9IFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgYW5jaG9yLCBiZXN0X29mZiwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCQlpZiAobWxlbiA+IGxhc3RfcG9zIHx8IHByaWNlIDwgb3B0W21sZW5dLnByaWNlKQorCQkJCQkJCVNFVF9QUklDRShtbGVuLCBtbGVuLCBpLCBsaXRsZW4sIHByaWNlKTsgLyogbm90ZSA6IG1hY3JvIG1vZGlmaWVzIGxhc3RfcG9zICovCisJCQkJCQltbGVuLS07CisJCQkJCX0gd2hpbGUgKG1sZW4gPj0gbWluTWF0Y2gpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW1hdGNoX251bSA9IFpTVERfQnRHZXRBbGxNYXRjaGVzX3NlbGVjdE1MUyhjdHgsIGlwLCBpZW5kLCBtYXhTZWFyY2hlcywgbWxzLCBtYXRjaGVzLCBtaW5NYXRjaCk7CisKKwkJaWYgKCFsYXN0X3BvcyAmJiAhbWF0Y2hfbnVtKSB7CisJCQlpcCsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWF0Y2hfbnVtICYmIChtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbiA+IHN1ZmZpY2llbnRfbGVuIHx8IG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ubGVuID49IFpTVERfT1BUX05VTSkpIHsKKwkJCWJlc3RfbWxlbiA9IG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ubGVuOworCQkJYmVzdF9vZmYgPSBtYXRjaGVzW21hdGNoX251bSAtIDFdLm9mZjsKKwkJCWN1ciA9IDA7CisJCQlsYXN0X3BvcyA9IDE7CisJCQlnb3RvIF9zdG9yZVNlcXVlbmNlOworCQl9CisKKwkJLyogc2V0IHByaWNlcyB1c2luZyBtYXRjaGVzIGF0IHBvc2l0aW9uID0gMCAqLworCQliZXN0X21sZW4gPSAobGFzdF9wb3MpID8gbGFzdF9wb3MgOiBtaW5NYXRjaDsKKwkJZm9yICh1ID0gMDsgdSA8IG1hdGNoX251bTsgdSsrKSB7CisJCQltbGVuID0gKHUgPiAwKSA/IG1hdGNoZXNbdSAtIDFdLmxlbiArIDEgOiBiZXN0X21sZW47CisJCQliZXN0X21sZW4gPSBtYXRjaGVzW3VdLmxlbjsKKwkJCXdoaWxlIChtbGVuIDw9IGJlc3RfbWxlbikgeworCQkJCXByaWNlID0gWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IsIG1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJaWYgKG1sZW4gPiBsYXN0X3BvcyB8fCBwcmljZSA8IG9wdFttbGVuXS5wcmljZSkKKwkJCQkJU0VUX1BSSUNFKG1sZW4sIG1sZW4sIG1hdGNoZXNbdV0ub2ZmLCBsaXRsZW4sIHByaWNlKTsgLyogbm90ZSA6IG1hY3JvIG1vZGlmaWVzIGxhc3RfcG9zICovCisJCQkJbWxlbisrOworCQkJfQorCQl9CisKKwkJaWYgKGxhc3RfcG9zIDwgbWluTWF0Y2gpIHsKKwkJCWlwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGluaXRpYWxpemUgb3B0WzBdICovCisJCXsKKwkJCVUzMiBpOworCQkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJCW9wdFswXS5yZXBbaV0gPSByZXBbaV07CisJCX0KKwkJb3B0WzBdLm1sZW4gPSAxOworCQlvcHRbMF0ubGl0bGVuID0gbGl0bGVuOworCisJCS8qIGNoZWNrIGZ1cnRoZXIgcG9zaXRpb25zICovCisJCWZvciAoY3VyID0gMTsgY3VyIDw9IGxhc3RfcG9zOyBjdXIrKykgeworCQkJaW5yID0gaXAgKyBjdXI7CisKKwkJCWlmIChvcHRbY3VyIC0gMV0ubWxlbiA9PSAxKSB7CisJCQkJbGl0bGVuID0gb3B0W2N1ciAtIDFdLmxpdGxlbiArIDE7CisJCQkJaWYgKGN1ciA+IGxpdGxlbikgeworCQkJCQlwcmljZSA9IG9wdFtjdXIgLSBsaXRsZW5dLnByaWNlICsgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgaW5yIC0gbGl0bGVuKTsKKwkJCQl9IGVsc2UKKwkJCQkJcHJpY2UgPSBaU1REX2dldExpdGVyYWxQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IpOworCQkJfSBlbHNlIHsKKwkJCQlsaXRsZW4gPSAxOworCQkJCXByaWNlID0gb3B0W2N1ciAtIDFdLnByaWNlICsgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgaW5yIC0gMSk7CisJCQl9CisKKwkJCWlmIChjdXIgPiBsYXN0X3BvcyB8fCBwcmljZSA8PSBvcHRbY3VyXS5wcmljZSkKKwkJCQlTRVRfUFJJQ0UoY3VyLCAxLCAwLCBsaXRsZW4sIHByaWNlKTsKKworCQkJaWYgKGN1ciA9PSBsYXN0X3BvcykKKwkJCQlicmVhazsKKworCQkJaWYgKGluciA+IGlsaW1pdCkgLyogbGFzdCBtYXRjaCBtdXN0IHN0YXJ0IGF0IGEgbWluaW11bSBkaXN0YW5jZSBvZiA4IGZyb20gb2VuZCAqLworCQkJCWNvbnRpbnVlOworCisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsKKwkJCWlmIChvcHRbY3VyXS5vZmYgPiBaU1REX1JFUF9NT1ZFX09QVCkgeworCQkJCW9wdFtjdXJdLnJlcFsyXSA9IG9wdFtjdXIgLSBtbGVuXS5yZXBbMV07CisJCQkJb3B0W2N1cl0ucmVwWzFdID0gb3B0W2N1ciAtIG1sZW5dLnJlcFswXTsKKwkJCQlvcHRbY3VyXS5yZXBbMF0gPSBvcHRbY3VyXS5vZmYgLSBaU1REX1JFUF9NT1ZFX09QVDsKKwkJCX0gZWxzZSB7CisJCQkJb3B0W2N1cl0ucmVwWzJdID0gKG9wdFtjdXJdLm9mZiA+IDEpID8gb3B0W2N1ciAtIG1sZW5dLnJlcFsxXSA6IG9wdFtjdXIgLSBtbGVuXS5yZXBbMl07CisJCQkJb3B0W2N1cl0ucmVwWzFdID0gKG9wdFtjdXJdLm9mZiA+IDApID8gb3B0W2N1ciAtIG1sZW5dLnJlcFswXSA6IG9wdFtjdXIgLSBtbGVuXS5yZXBbMV07CisJCQkJb3B0W2N1cl0ucmVwWzBdID0KKwkJCQkgICAgKChvcHRbY3VyXS5vZmYgPT0gWlNURF9SRVBfTU9WRV9PUFQpICYmIChtbGVuICE9IDEpKSA/IChvcHRbY3VyIC0gbWxlbl0ucmVwWzBdIC0gMSkgOiAob3B0W2N1ciAtIG1sZW5dLnJlcFtvcHRbY3VyXS5vZmZdKTsKKwkJCX0KKworCQkJYmVzdF9tbGVuID0gbWluTWF0Y2g7CisJCQl7CisJCQkJVTMyIGksIGxhc3RfaSA9IFpTVERfUkVQX0NIRUNLICsgKG1sZW4gIT0gMSk7CisJCQkJZm9yIChpID0gKG9wdFtjdXJdLm1sZW4gIT0gMSk7IGkgPCBsYXN0X2k7IGkrKykgeyAvKiBjaGVjayByZXAgKi8KKwkJCQkJY29uc3QgUzMyIHJlcEN1ciA9IChpID09IFpTVERfUkVQX01PVkVfT1BUKSA/IChvcHRbY3VyXS5yZXBbMF0gLSAxKSA6IG9wdFtjdXJdLnJlcFtpXTsKKwkJCQkJaWYgKChyZXBDdXIgPiAwKSAmJiAocmVwQ3VyIDwgKFMzMikoaW5yIC0gcHJlZml4U3RhcnQpKSAmJgorCQkJCQkgICAgKFpTVERfcmVhZE1JTk1BVENIKGluciwgbWluTWF0Y2gpID09IFpTVERfcmVhZE1JTk1BVENIKGluciAtIHJlcEN1ciwgbWluTWF0Y2gpKSkgeworCQkJCQkJbWxlbiA9IChVMzIpWlNURF9jb3VudChpbnIgKyBtaW5NYXRjaCwgaW5yICsgbWluTWF0Y2ggLSByZXBDdXIsIGllbmQpICsgbWluTWF0Y2g7CisKKwkJCQkJCWlmIChtbGVuID4gc3VmZmljaWVudF9sZW4gfHwgY3VyICsgbWxlbiA+PSBaU1REX09QVF9OVU0pIHsKKwkJCQkJCQliZXN0X21sZW4gPSBtbGVuOworCQkJCQkJCWJlc3Rfb2ZmID0gaTsKKwkJCQkJCQlsYXN0X3BvcyA9IGN1ciArIDE7CisJCQkJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsKKwkJCQkJCX0KKworCQkJCQkJYmVzdF9vZmYgPSBpIC0gKG9wdFtjdXJdLm1sZW4gIT0gMSk7CisJCQkJCQlpZiAobWxlbiA+IGJlc3RfbWxlbikKKwkJCQkJCQliZXN0X21sZW4gPSBtbGVuOworCisJCQkJCQlkbyB7CisJCQkJCQkJaWYgKG9wdFtjdXJdLm1sZW4gPT0gMSkgeworCQkJCQkJCQlsaXRsZW4gPSBvcHRbY3VyXS5saXRsZW47CisJCQkJCQkJCWlmIChjdXIgPiBsaXRsZW4pIHsKKwkJCQkJCQkJCXByaWNlID0gb3B0W2N1ciAtIGxpdGxlbl0ucHJpY2UgKyBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGluciAtIGxpdGxlbiwKKwkJCQkJCQkJCQkJCQkJCWJlc3Rfb2ZmLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsKKwkJCQkJCQkJfSBlbHNlCisJCQkJCQkJCQlwcmljZSA9IFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgYW5jaG9yLCBiZXN0X29mZiwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbGl0bGVuID0gMDsKKwkJCQkJCQkJcHJpY2UgPSBvcHRbY3VyXS5wcmljZSArIFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIDAsIE5VTEwsIGJlc3Rfb2ZmLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoY3VyICsgbWxlbiA+IGxhc3RfcG9zIHx8IHByaWNlIDw9IG9wdFtjdXIgKyBtbGVuXS5wcmljZSkKKwkJCQkJCQkJU0VUX1BSSUNFKGN1ciArIG1sZW4sIG1sZW4sIGksIGxpdGxlbiwgcHJpY2UpOworCQkJCQkJCW1sZW4tLTsKKwkJCQkJCX0gd2hpbGUgKG1sZW4gPj0gbWluTWF0Y2gpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQltYXRjaF9udW0gPSBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RNTFMoY3R4LCBpbnIsIGllbmQsIG1heFNlYXJjaGVzLCBtbHMsIG1hdGNoZXMsIGJlc3RfbWxlbik7CisKKwkJCWlmIChtYXRjaF9udW0gPiAwICYmIChtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbiA+IHN1ZmZpY2llbnRfbGVuIHx8IGN1ciArIG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ubGVuID49IFpTVERfT1BUX05VTSkpIHsKKwkJCQliZXN0X21sZW4gPSBtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbjsKKwkJCQliZXN0X29mZiA9IG1hdGNoZXNbbWF0Y2hfbnVtIC0gMV0ub2ZmOworCQkJCWxhc3RfcG9zID0gY3VyICsgMTsKKwkJCQlnb3RvIF9zdG9yZVNlcXVlbmNlOworCQkJfQorCisJCQkvKiBzZXQgcHJpY2VzIHVzaW5nIG1hdGNoZXMgYXQgcG9zaXRpb24gPSBjdXIgKi8KKwkJCWZvciAodSA9IDA7IHUgPCBtYXRjaF9udW07IHUrKykgeworCQkJCW1sZW4gPSAodSA+IDApID8gbWF0Y2hlc1t1IC0gMV0ubGVuICsgMSA6IGJlc3RfbWxlbjsKKwkJCQliZXN0X21sZW4gPSBtYXRjaGVzW3VdLmxlbjsKKworCQkJCXdoaWxlIChtbGVuIDw9IGJlc3RfbWxlbikgeworCQkJCQlpZiAob3B0W2N1cl0ubWxlbiA9PSAxKSB7CisJCQkJCQlsaXRsZW4gPSBvcHRbY3VyXS5saXRsZW47CisJCQkJCQlpZiAoY3VyID4gbGl0bGVuKQorCQkJCQkJCXByaWNlID0gb3B0W2N1ciAtIGxpdGxlbl0ucHJpY2UgKyBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGlwICsgY3VyIC0gbGl0bGVuLAorCQkJCQkJCQkJCQkJCW1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCQllbHNlCisJCQkJCQkJcHJpY2UgPSBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGFuY2hvciwgbWF0Y2hlc1t1XS5vZmYgLSAxLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWxpdGxlbiA9IDA7CisJCQkJCQlwcmljZSA9IG9wdFtjdXJdLnByaWNlICsgWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgMCwgTlVMTCwgbWF0Y2hlc1t1XS5vZmYgLSAxLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsKKwkJCQkJfQorCisJCQkJCWlmIChjdXIgKyBtbGVuID4gbGFzdF9wb3MgfHwgKHByaWNlIDwgb3B0W2N1ciArIG1sZW5dLnByaWNlKSkKKwkJCQkJCVNFVF9QUklDRShjdXIgKyBtbGVuLCBtbGVuLCBtYXRjaGVzW3VdLm9mZiwgbGl0bGVuLCBwcmljZSk7CisKKwkJCQkJbWxlbisrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWJlc3RfbWxlbiA9IG9wdFtsYXN0X3Bvc10ubWxlbjsKKwkJYmVzdF9vZmYgPSBvcHRbbGFzdF9wb3NdLm9mZjsKKwkJY3VyID0gbGFzdF9wb3MgLSBiZXN0X21sZW47CisKKwkvKiBzdG9yZSBzZXF1ZW5jZSAqLworX3N0b3JlU2VxdWVuY2U6IC8qIGN1ciwgbGFzdF9wb3MsIGJlc3RfbWxlbiwgYmVzdF9vZmYgaGF2ZSB0byBiZSBzZXQgKi8KKwkJb3B0WzBdLm1sZW4gPSAxOworCisJCXdoaWxlICgxKSB7CisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsKKwkJCW9mZnNldCA9IG9wdFtjdXJdLm9mZjsKKwkJCW9wdFtjdXJdLm1sZW4gPSBiZXN0X21sZW47CisJCQlvcHRbY3VyXS5vZmYgPSBiZXN0X29mZjsKKwkJCWJlc3RfbWxlbiA9IG1sZW47CisJCQliZXN0X29mZiA9IG9mZnNldDsKKwkJCWlmIChtbGVuID4gY3VyKQorCQkJCWJyZWFrOworCQkJY3VyIC09IG1sZW47CisJCX0KKworCQlmb3IgKHUgPSAwOyB1IDw9IGxhc3RfcG9zOykgeworCQkJdSArPSBvcHRbdV0ubWxlbjsKKwkJfQorCisJCWZvciAoY3VyID0gMDsgY3VyIDwgbGFzdF9wb3M7KSB7CisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsKKwkJCWlmIChtbGVuID09IDEpIHsKKwkJCQlpcCsrOworCQkJCWN1cisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJb2Zmc2V0ID0gb3B0W2N1cl0ub2ZmOworCQkJY3VyICs9IG1sZW47CisJCQlsaXRMZW5ndGggPSAoVTMyKShpcCAtIGFuY2hvcik7CisKKwkJCWlmIChvZmZzZXQgPiBaU1REX1JFUF9NT1ZFX09QVCkgeworCQkJCXJlcFsyXSA9IHJlcFsxXTsKKwkJCQlyZXBbMV0gPSByZXBbMF07CisJCQkJcmVwWzBdID0gb2Zmc2V0IC0gWlNURF9SRVBfTU9WRV9PUFQ7CisJCQkJb2Zmc2V0LS07CisJCQl9IGVsc2UgeworCQkJCWlmIChvZmZzZXQgIT0gMCkgeworCQkJCQliZXN0X29mZiA9IChvZmZzZXQgPT0gWlNURF9SRVBfTU9WRV9PUFQpID8gKHJlcFswXSAtIDEpIDogKHJlcFtvZmZzZXRdKTsKKwkJCQkJaWYgKG9mZnNldCAhPSAxKQorCQkJCQkJcmVwWzJdID0gcmVwWzFdOworCQkJCQlyZXBbMV0gPSByZXBbMF07CisJCQkJCXJlcFswXSA9IGJlc3Rfb2ZmOworCQkJCX0KKwkJCQlpZiAobGl0TGVuZ3RoID09IDApCisJCQkJCW9mZnNldC0tOworCQkJfQorCisJCQlaU1REX3VwZGF0ZVByaWNlKHNlcVN0b3JlUHRyLCBsaXRMZW5ndGgsIGFuY2hvciwgb2Zmc2V0LCBtbGVuIC0gTUlOTUFUQ0gpOworCQkJWlNURF9zdG9yZVNlcShzZXFTdG9yZVB0ciwgbGl0TGVuZ3RoLCBhbmNob3IsIG9mZnNldCwgbWxlbiAtIE1JTk1BVENIKTsKKwkJCWFuY2hvciA9IGlwID0gaXAgKyBtbGVuOworCQl9CisJfSAvKiBmb3IgKGN1cj0wOyBjdXIgPCBsYXN0X3BvczsgKSAqLworCisJLyogU2F2ZSByZXBzIGZvciBuZXh0IGJsb2NrICovCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IFpTVERfUkVQX05VTTsgaSsrKQorCQkJY3R4LT5yZXBUb0NvbmZpcm1baV0gPSByZXBbaV07CisJfQorCisJLyogTGFzdCBMaXRlcmFscyAqLworCXsKKwkJc2l6ZV90IGNvbnN0IGxhc3RMTFNpemUgPSBpZW5kIC0gYW5jaG9yOworCQltZW1jcHkoc2VxU3RvcmVQdHItPmxpdCwgYW5jaG9yLCBsYXN0TExTaXplKTsKKwkJc2VxU3RvcmVQdHItPmxpdCArPSBsYXN0TExTaXplOworCX0KK30KKworRk9SQ0VfSU5MSU5FCit2b2lkIFpTVERfY29tcHJlc3NCbG9ja19vcHRfZXh0RGljdF9nZW5lcmljKFpTVERfQ0N0eCAqY3R4LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBzcmNTaXplLCBjb25zdCBpbnQgdWx0cmEpCit7CisJc2VxU3RvcmVfdCAqc2VxU3RvcmVQdHIgPSAmKGN0eC0+c2VxU3RvcmUpOworCWNvbnN0IEJZVEUgKmNvbnN0IGlzdGFydCA9IChjb25zdCBCWVRFICopc3JjOworCWNvbnN0IEJZVEUgKmlwID0gaXN0YXJ0OworCWNvbnN0IEJZVEUgKmFuY2hvciA9IGlzdGFydDsKKwljb25zdCBCWVRFICpjb25zdCBpZW5kID0gaXN0YXJ0ICsgc3JjU2l6ZTsKKwljb25zdCBCWVRFICpjb25zdCBpbGltaXQgPSBpZW5kIC0gODsKKwljb25zdCBCWVRFICpjb25zdCBiYXNlID0gY3R4LT5iYXNlOworCWNvbnN0IFUzMiBsb3dlc3RJbmRleCA9IGN0eC0+bG93TGltaXQ7CisJY29uc3QgVTMyIGRpY3RMaW1pdCA9IGN0eC0+ZGljdExpbWl0OworCWNvbnN0IEJZVEUgKmNvbnN0IHByZWZpeFN0YXJ0ID0gYmFzZSArIGRpY3RMaW1pdDsKKwljb25zdCBCWVRFICpjb25zdCBkaWN0QmFzZSA9IGN0eC0+ZGljdEJhc2U7CisJY29uc3QgQllURSAqY29uc3QgZGljdEVuZCA9IGRpY3RCYXNlICsgZGljdExpbWl0OworCisJY29uc3QgVTMyIG1heFNlYXJjaGVzID0gMVUgPDwgY3R4LT5wYXJhbXMuY1BhcmFtcy5zZWFyY2hMb2c7CisJY29uc3QgVTMyIHN1ZmZpY2llbnRfbGVuID0gY3R4LT5wYXJhbXMuY1BhcmFtcy50YXJnZXRMZW5ndGg7CisJY29uc3QgVTMyIG1scyA9IGN0eC0+cGFyYW1zLmNQYXJhbXMuc2VhcmNoTGVuZ3RoOworCWNvbnN0IFUzMiBtaW5NYXRjaCA9IChjdHgtPnBhcmFtcy5jUGFyYW1zLnNlYXJjaExlbmd0aCA9PSAzKSA/IDMgOiA0OworCisJWlNURF9vcHRpbWFsX3QgKm9wdCA9IHNlcVN0b3JlUHRyLT5wcmljZVRhYmxlOworCVpTVERfbWF0Y2hfdCAqbWF0Y2hlcyA9IHNlcVN0b3JlUHRyLT5tYXRjaFRhYmxlOworCWNvbnN0IEJZVEUgKmlucjsKKworCS8qIGluaXQgKi8KKwlVMzIgb2Zmc2V0LCByZXBbWlNURF9SRVBfTlVNXTsKKwl7CisJCVUzMiBpOworCQlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspCisJCQlyZXBbaV0gPSBjdHgtPnJlcFtpXTsKKwl9CisKKwljdHgtPm5leHRUb1VwZGF0ZTMgPSBjdHgtPm5leHRUb1VwZGF0ZTsKKwlaU1REX3Jlc2NhbGVGcmVxcyhzZXFTdG9yZVB0ciwgKGNvbnN0IEJZVEUgKilzcmMsIHNyY1NpemUpOworCWlwICs9IChpcCA9PSBwcmVmaXhTdGFydCk7CisKKwkvKiBNYXRjaCBMb29wICovCisJd2hpbGUgKGlwIDwgaWxpbWl0KSB7CisJCVUzMiBjdXIsIG1hdGNoX251bSwgbGFzdF9wb3MsIGxpdGxlbiwgcHJpY2U7CisJCVUzMiB1LCBtbGVuLCBiZXN0X21sZW4sIGJlc3Rfb2ZmLCBsaXRMZW5ndGg7CisJCVUzMiBjdXJyID0gKFUzMikoaXAgLSBiYXNlKTsKKwkJbWVtc2V0KG9wdCwgMCwgc2l6ZW9mKFpTVERfb3B0aW1hbF90KSk7CisJCWxhc3RfcG9zID0gMDsKKwkJb3B0WzBdLmxpdGxlbiA9IChVMzIpKGlwIC0gYW5jaG9yKTsKKworCQkvKiBjaGVjayByZXBDb2RlICovCisJCXsKKwkJCVUzMiBpLCBsYXN0X2kgPSBaU1REX1JFUF9DSEVDSyArIChpcCA9PSBhbmNob3IpOworCQkJZm9yIChpID0gKGlwID09IGFuY2hvcik7IGkgPCBsYXN0X2k7IGkrKykgeworCQkJCWNvbnN0IFMzMiByZXBDdXIgPSAoaSA9PSBaU1REX1JFUF9NT1ZFX09QVCkgPyAocmVwWzBdIC0gMSkgOiByZXBbaV07CisJCQkJY29uc3QgVTMyIHJlcEluZGV4ID0gKFUzMikoY3VyciAtIHJlcEN1cik7CisJCQkJY29uc3QgQllURSAqY29uc3QgcmVwQmFzZSA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEJhc2UgOiBiYXNlOworCQkJCWNvbnN0IEJZVEUgKmNvbnN0IHJlcE1hdGNoID0gcmVwQmFzZSArIHJlcEluZGV4OworCQkJCWlmICgocmVwQ3VyID4gMCAmJiByZXBDdXIgPD0gKFMzMiljdXJyKSAmJgorCQkJCSAgICAoKChVMzIpKChkaWN0TGltaXQgLSAxKSAtIHJlcEluZGV4KSA+PSAzKSAmIChyZXBJbmRleCA+IGxvd2VzdEluZGV4KSkgLyogaW50ZW50aW9uYWwgb3ZlcmZsb3cgKi8KKwkJCQkgICAgJiYgKFpTVERfcmVhZE1JTk1BVENIKGlwLCBtaW5NYXRjaCkgPT0gWlNURF9yZWFkTUlOTUFUQ0gocmVwTWF0Y2gsIG1pbk1hdGNoKSkpIHsKKwkJCQkJLyogcmVwY29kZSBkZXRlY3RlZCB3ZSBzaG91bGQgdGFrZSBpdCAqLworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBFbmQgPSByZXBJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RFbmQgOiBpZW5kOworCQkJCQltbGVuID0gKFUzMilaU1REX2NvdW50XzJzZWdtZW50cyhpcCArIG1pbk1hdGNoLCByZXBNYXRjaCArIG1pbk1hdGNoLCBpZW5kLCByZXBFbmQsIHByZWZpeFN0YXJ0KSArIG1pbk1hdGNoOworCisJCQkJCWlmIChtbGVuID4gc3VmZmljaWVudF9sZW4gfHwgbWxlbiA+PSBaU1REX09QVF9OVU0pIHsKKwkJCQkJCWJlc3RfbWxlbiA9IG1sZW47CisJCQkJCQliZXN0X29mZiA9IGk7CisJCQkJCQljdXIgPSAwOworCQkJCQkJbGFzdF9wb3MgPSAxOworCQkJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsKKwkJCQkJfQorCisJCQkJCWJlc3Rfb2ZmID0gaSAtIChpcCA9PSBhbmNob3IpOworCQkJCQlsaXRsZW4gPSBvcHRbMF0ubGl0bGVuOworCQkJCQlkbyB7CisJCQkJCQlwcmljZSA9IFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgYW5jaG9yLCBiZXN0X29mZiwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCQlpZiAobWxlbiA+IGxhc3RfcG9zIHx8IHByaWNlIDwgb3B0W21sZW5dLnByaWNlKQorCQkJCQkJCVNFVF9QUklDRShtbGVuLCBtbGVuLCBpLCBsaXRsZW4sIHByaWNlKTsgLyogbm90ZSA6IG1hY3JvIG1vZGlmaWVzIGxhc3RfcG9zICovCisJCQkJCQltbGVuLS07CisJCQkJCX0gd2hpbGUgKG1sZW4gPj0gbWluTWF0Y2gpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW1hdGNoX251bSA9IFpTVERfQnRHZXRBbGxNYXRjaGVzX3NlbGVjdE1MU19leHREaWN0KGN0eCwgaXAsIGllbmQsIG1heFNlYXJjaGVzLCBtbHMsIG1hdGNoZXMsIG1pbk1hdGNoKTsgLyogZmlyc3Qgc2VhcmNoIChkZXB0aCAwKSAqLworCisJCWlmICghbGFzdF9wb3MgJiYgIW1hdGNoX251bSkgeworCQkJaXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJeworCQkJVTMyIGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspCisJCQkJb3B0WzBdLnJlcFtpXSA9IHJlcFtpXTsKKwkJfQorCQlvcHRbMF0ubWxlbiA9IDE7CisKKwkJaWYgKG1hdGNoX251bSAmJiAobWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5sZW4gPiBzdWZmaWNpZW50X2xlbiB8fCBtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbiA+PSBaU1REX09QVF9OVU0pKSB7CisJCQliZXN0X21sZW4gPSBtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbjsKKwkJCWJlc3Rfb2ZmID0gbWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5vZmY7CisJCQljdXIgPSAwOworCQkJbGFzdF9wb3MgPSAxOworCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsKKwkJfQorCisJCWJlc3RfbWxlbiA9IChsYXN0X3BvcykgPyBsYXN0X3BvcyA6IG1pbk1hdGNoOworCisJCS8qIHNldCBwcmljZXMgdXNpbmcgbWF0Y2hlcyBhdCBwb3NpdGlvbiA9IDAgKi8KKwkJZm9yICh1ID0gMDsgdSA8IG1hdGNoX251bTsgdSsrKSB7CisJCQltbGVuID0gKHUgPiAwKSA/IG1hdGNoZXNbdSAtIDFdLmxlbiArIDEgOiBiZXN0X21sZW47CisJCQliZXN0X21sZW4gPSBtYXRjaGVzW3VdLmxlbjsKKwkJCWxpdGxlbiA9IG9wdFswXS5saXRsZW47CisJCQl3aGlsZSAobWxlbiA8PSBiZXN0X21sZW4pIHsKKwkJCQlwcmljZSA9IFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgYW5jaG9yLCBtYXRjaGVzW3VdLm9mZiAtIDEsIG1sZW4gLSBNSU5NQVRDSCwgdWx0cmEpOworCQkJCWlmIChtbGVuID4gbGFzdF9wb3MgfHwgcHJpY2UgPCBvcHRbbWxlbl0ucHJpY2UpCisJCQkJCVNFVF9QUklDRShtbGVuLCBtbGVuLCBtYXRjaGVzW3VdLm9mZiwgbGl0bGVuLCBwcmljZSk7CisJCQkJbWxlbisrOworCQkJfQorCQl9CisKKwkJaWYgKGxhc3RfcG9zIDwgbWluTWF0Y2gpIHsKKwkJCWlwKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIGNoZWNrIGZ1cnRoZXIgcG9zaXRpb25zICovCisJCWZvciAoY3VyID0gMTsgY3VyIDw9IGxhc3RfcG9zOyBjdXIrKykgeworCQkJaW5yID0gaXAgKyBjdXI7CisKKwkJCWlmIChvcHRbY3VyIC0gMV0ubWxlbiA9PSAxKSB7CisJCQkJbGl0bGVuID0gb3B0W2N1ciAtIDFdLmxpdGxlbiArIDE7CisJCQkJaWYgKGN1ciA+IGxpdGxlbikgeworCQkJCQlwcmljZSA9IG9wdFtjdXIgLSBsaXRsZW5dLnByaWNlICsgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgaW5yIC0gbGl0bGVuKTsKKwkJCQl9IGVsc2UKKwkJCQkJcHJpY2UgPSBaU1REX2dldExpdGVyYWxQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IpOworCQkJfSBlbHNlIHsKKwkJCQlsaXRsZW4gPSAxOworCQkJCXByaWNlID0gb3B0W2N1ciAtIDFdLnByaWNlICsgWlNURF9nZXRMaXRlcmFsUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgaW5yIC0gMSk7CisJCQl9CisKKwkJCWlmIChjdXIgPiBsYXN0X3BvcyB8fCBwcmljZSA8PSBvcHRbY3VyXS5wcmljZSkKKwkJCQlTRVRfUFJJQ0UoY3VyLCAxLCAwLCBsaXRsZW4sIHByaWNlKTsKKworCQkJaWYgKGN1ciA9PSBsYXN0X3BvcykKKwkJCQlicmVhazsKKworCQkJaWYgKGluciA+IGlsaW1pdCkgLyogbGFzdCBtYXRjaCBtdXN0IHN0YXJ0IGF0IGEgbWluaW11bSBkaXN0YW5jZSBvZiA4IGZyb20gb2VuZCAqLworCQkJCWNvbnRpbnVlOworCisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsKKwkJCWlmIChvcHRbY3VyXS5vZmYgPiBaU1REX1JFUF9NT1ZFX09QVCkgeworCQkJCW9wdFtjdXJdLnJlcFsyXSA9IG9wdFtjdXIgLSBtbGVuXS5yZXBbMV07CisJCQkJb3B0W2N1cl0ucmVwWzFdID0gb3B0W2N1ciAtIG1sZW5dLnJlcFswXTsKKwkJCQlvcHRbY3VyXS5yZXBbMF0gPSBvcHRbY3VyXS5vZmYgLSBaU1REX1JFUF9NT1ZFX09QVDsKKwkJCX0gZWxzZSB7CisJCQkJb3B0W2N1cl0ucmVwWzJdID0gKG9wdFtjdXJdLm9mZiA+IDEpID8gb3B0W2N1ciAtIG1sZW5dLnJlcFsxXSA6IG9wdFtjdXIgLSBtbGVuXS5yZXBbMl07CisJCQkJb3B0W2N1cl0ucmVwWzFdID0gKG9wdFtjdXJdLm9mZiA+IDApID8gb3B0W2N1ciAtIG1sZW5dLnJlcFswXSA6IG9wdFtjdXIgLSBtbGVuXS5yZXBbMV07CisJCQkJb3B0W2N1cl0ucmVwWzBdID0KKwkJCQkgICAgKChvcHRbY3VyXS5vZmYgPT0gWlNURF9SRVBfTU9WRV9PUFQpICYmIChtbGVuICE9IDEpKSA/IChvcHRbY3VyIC0gbWxlbl0ucmVwWzBdIC0gMSkgOiAob3B0W2N1ciAtIG1sZW5dLnJlcFtvcHRbY3VyXS5vZmZdKTsKKwkJCX0KKworCQkJYmVzdF9tbGVuID0gbWluTWF0Y2g7CisJCQl7CisJCQkJVTMyIGksIGxhc3RfaSA9IFpTVERfUkVQX0NIRUNLICsgKG1sZW4gIT0gMSk7CisJCQkJZm9yIChpID0gKG1sZW4gIT0gMSk7IGkgPCBsYXN0X2k7IGkrKykgeworCQkJCQljb25zdCBTMzIgcmVwQ3VyID0gKGkgPT0gWlNURF9SRVBfTU9WRV9PUFQpID8gKG9wdFtjdXJdLnJlcFswXSAtIDEpIDogb3B0W2N1cl0ucmVwW2ldOworCQkJCQljb25zdCBVMzIgcmVwSW5kZXggPSAoVTMyKShjdXJyICsgY3VyIC0gcmVwQ3VyKTsKKwkJCQkJY29uc3QgQllURSAqY29uc3QgcmVwQmFzZSA9IHJlcEluZGV4IDwgZGljdExpbWl0ID8gZGljdEJhc2UgOiBiYXNlOworCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBNYXRjaCA9IHJlcEJhc2UgKyByZXBJbmRleDsKKwkJCQkJaWYgKChyZXBDdXIgPiAwICYmIHJlcEN1ciA8PSAoUzMyKShjdXJyICsgY3VyKSkgJiYKKwkJCQkJICAgICgoKFUzMikoKGRpY3RMaW1pdCAtIDEpIC0gcmVwSW5kZXgpID49IDMpICYgKHJlcEluZGV4ID4gbG93ZXN0SW5kZXgpKSAvKiBpbnRlbnRpb25hbCBvdmVyZmxvdyAqLworCQkJCQkgICAgJiYgKFpTVERfcmVhZE1JTk1BVENIKGluciwgbWluTWF0Y2gpID09IFpTVERfcmVhZE1JTk1BVENIKHJlcE1hdGNoLCBtaW5NYXRjaCkpKSB7CisJCQkJCQkvKiByZXBjb2RlIGRldGVjdGVkICovCisJCQkJCQljb25zdCBCWVRFICpjb25zdCByZXBFbmQgPSByZXBJbmRleCA8IGRpY3RMaW1pdCA/IGRpY3RFbmQgOiBpZW5kOworCQkJCQkJbWxlbiA9IChVMzIpWlNURF9jb3VudF8yc2VnbWVudHMoaW5yICsgbWluTWF0Y2gsIHJlcE1hdGNoICsgbWluTWF0Y2gsIGllbmQsIHJlcEVuZCwgcHJlZml4U3RhcnQpICsgbWluTWF0Y2g7CisKKwkJCQkJCWlmIChtbGVuID4gc3VmZmljaWVudF9sZW4gfHwgY3VyICsgbWxlbiA+PSBaU1REX09QVF9OVU0pIHsKKwkJCQkJCQliZXN0X21sZW4gPSBtbGVuOworCQkJCQkJCWJlc3Rfb2ZmID0gaTsKKwkJCQkJCQlsYXN0X3BvcyA9IGN1ciArIDE7CisJCQkJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsKKwkJCQkJCX0KKworCQkJCQkJYmVzdF9vZmYgPSBpIC0gKG9wdFtjdXJdLm1sZW4gIT0gMSk7CisJCQkJCQlpZiAobWxlbiA+IGJlc3RfbWxlbikKKwkJCQkJCQliZXN0X21sZW4gPSBtbGVuOworCisJCQkJCQlkbyB7CisJCQkJCQkJaWYgKG9wdFtjdXJdLm1sZW4gPT0gMSkgeworCQkJCQkJCQlsaXRsZW4gPSBvcHRbY3VyXS5saXRsZW47CisJCQkJCQkJCWlmIChjdXIgPiBsaXRsZW4pIHsKKwkJCQkJCQkJCXByaWNlID0gb3B0W2N1ciAtIGxpdGxlbl0ucHJpY2UgKyBaU1REX2dldFByaWNlKHNlcVN0b3JlUHRyLCBsaXRsZW4sIGluciAtIGxpdGxlbiwKKwkJCQkJCQkJCQkJCQkJCWJlc3Rfb2ZmLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsKKwkJCQkJCQkJfSBlbHNlCisJCQkJCQkJCQlwcmljZSA9IFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIGxpdGxlbiwgYW5jaG9yLCBiZXN0X29mZiwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJbGl0bGVuID0gMDsKKwkJCQkJCQkJcHJpY2UgPSBvcHRbY3VyXS5wcmljZSArIFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIDAsIE5VTEwsIGJlc3Rfb2ZmLCBtbGVuIC0gTUlOTUFUQ0gsIHVsdHJhKTsKKwkJCQkJCQl9CisKKwkJCQkJCQlpZiAoY3VyICsgbWxlbiA+IGxhc3RfcG9zIHx8IHByaWNlIDw9IG9wdFtjdXIgKyBtbGVuXS5wcmljZSkKKwkJCQkJCQkJU0VUX1BSSUNFKGN1ciArIG1sZW4sIG1sZW4sIGksIGxpdGxlbiwgcHJpY2UpOworCQkJCQkJCW1sZW4tLTsKKwkJCQkJCX0gd2hpbGUgKG1sZW4gPj0gbWluTWF0Y2gpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQltYXRjaF9udW0gPSBaU1REX0J0R2V0QWxsTWF0Y2hlc19zZWxlY3RNTFNfZXh0RGljdChjdHgsIGluciwgaWVuZCwgbWF4U2VhcmNoZXMsIG1scywgbWF0Y2hlcywgbWluTWF0Y2gpOworCisJCQlpZiAobWF0Y2hfbnVtID4gMCAmJiAobWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5sZW4gPiBzdWZmaWNpZW50X2xlbiB8fCBjdXIgKyBtYXRjaGVzW21hdGNoX251bSAtIDFdLmxlbiA+PSBaU1REX09QVF9OVU0pKSB7CisJCQkJYmVzdF9tbGVuID0gbWF0Y2hlc1ttYXRjaF9udW0gLSAxXS5sZW47CisJCQkJYmVzdF9vZmYgPSBtYXRjaGVzW21hdGNoX251bSAtIDFdLm9mZjsKKwkJCQlsYXN0X3BvcyA9IGN1ciArIDE7CisJCQkJZ290byBfc3RvcmVTZXF1ZW5jZTsKKwkJCX0KKworCQkJLyogc2V0IHByaWNlcyB1c2luZyBtYXRjaGVzIGF0IHBvc2l0aW9uID0gY3VyICovCisJCQlmb3IgKHUgPSAwOyB1IDwgbWF0Y2hfbnVtOyB1KyspIHsKKwkJCQltbGVuID0gKHUgPiAwKSA/IG1hdGNoZXNbdSAtIDFdLmxlbiArIDEgOiBiZXN0X21sZW47CisJCQkJYmVzdF9tbGVuID0gbWF0Y2hlc1t1XS5sZW47CisKKwkJCQl3aGlsZSAobWxlbiA8PSBiZXN0X21sZW4pIHsKKwkJCQkJaWYgKG9wdFtjdXJdLm1sZW4gPT0gMSkgeworCQkJCQkJbGl0bGVuID0gb3B0W2N1cl0ubGl0bGVuOworCQkJCQkJaWYgKGN1ciA+IGxpdGxlbikKKwkJCQkJCQlwcmljZSA9IG9wdFtjdXIgLSBsaXRsZW5dLnByaWNlICsgWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBpcCArIGN1ciAtIGxpdGxlbiwKKwkJCQkJCQkJCQkJCQltYXRjaGVzW3VdLm9mZiAtIDEsIG1sZW4gLSBNSU5NQVRDSCwgdWx0cmEpOworCQkJCQkJZWxzZQorCQkJCQkJCXByaWNlID0gWlNURF9nZXRQcmljZShzZXFTdG9yZVB0ciwgbGl0bGVuLCBhbmNob3IsIG1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlsaXRsZW4gPSAwOworCQkJCQkJcHJpY2UgPSBvcHRbY3VyXS5wcmljZSArIFpTVERfZ2V0UHJpY2Uoc2VxU3RvcmVQdHIsIDAsIE5VTEwsIG1hdGNoZXNbdV0ub2ZmIC0gMSwgbWxlbiAtIE1JTk1BVENILCB1bHRyYSk7CisJCQkJCX0KKworCQkJCQlpZiAoY3VyICsgbWxlbiA+IGxhc3RfcG9zIHx8IChwcmljZSA8IG9wdFtjdXIgKyBtbGVuXS5wcmljZSkpCisJCQkJCQlTRVRfUFJJQ0UoY3VyICsgbWxlbiwgbWxlbiwgbWF0Y2hlc1t1XS5vZmYsIGxpdGxlbiwgcHJpY2UpOworCisJCQkJCW1sZW4rKzsKKwkJCQl9CisJCQl9CisJCX0gLyogZm9yIChjdXIgPSAxOyBjdXIgPD0gbGFzdF9wb3M7IGN1cisrKSAqLworCisJCWJlc3RfbWxlbiA9IG9wdFtsYXN0X3Bvc10ubWxlbjsKKwkJYmVzdF9vZmYgPSBvcHRbbGFzdF9wb3NdLm9mZjsKKwkJY3VyID0gbGFzdF9wb3MgLSBiZXN0X21sZW47CisKKwkvKiBzdG9yZSBzZXF1ZW5jZSAqLworX3N0b3JlU2VxdWVuY2U6IC8qIGN1ciwgbGFzdF9wb3MsIGJlc3RfbWxlbiwgYmVzdF9vZmYgaGF2ZSB0byBiZSBzZXQgKi8KKwkJb3B0WzBdLm1sZW4gPSAxOworCisJCXdoaWxlICgxKSB7CisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsKKwkJCW9mZnNldCA9IG9wdFtjdXJdLm9mZjsKKwkJCW9wdFtjdXJdLm1sZW4gPSBiZXN0X21sZW47CisJCQlvcHRbY3VyXS5vZmYgPSBiZXN0X29mZjsKKwkJCWJlc3RfbWxlbiA9IG1sZW47CisJCQliZXN0X29mZiA9IG9mZnNldDsKKwkJCWlmIChtbGVuID4gY3VyKQorCQkJCWJyZWFrOworCQkJY3VyIC09IG1sZW47CisJCX0KKworCQlmb3IgKHUgPSAwOyB1IDw9IGxhc3RfcG9zOykgeworCQkJdSArPSBvcHRbdV0ubWxlbjsKKwkJfQorCisJCWZvciAoY3VyID0gMDsgY3VyIDwgbGFzdF9wb3M7KSB7CisJCQltbGVuID0gb3B0W2N1cl0ubWxlbjsKKwkJCWlmIChtbGVuID09IDEpIHsKKwkJCQlpcCsrOworCQkJCWN1cisrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJb2Zmc2V0ID0gb3B0W2N1cl0ub2ZmOworCQkJY3VyICs9IG1sZW47CisJCQlsaXRMZW5ndGggPSAoVTMyKShpcCAtIGFuY2hvcik7CisKKwkJCWlmIChvZmZzZXQgPiBaU1REX1JFUF9NT1ZFX09QVCkgeworCQkJCXJlcFsyXSA9IHJlcFsxXTsKKwkJCQlyZXBbMV0gPSByZXBbMF07CisJCQkJcmVwWzBdID0gb2Zmc2V0IC0gWlNURF9SRVBfTU9WRV9PUFQ7CisJCQkJb2Zmc2V0LS07CisJCQl9IGVsc2UgeworCQkJCWlmIChvZmZzZXQgIT0gMCkgeworCQkJCQliZXN0X29mZiA9IChvZmZzZXQgPT0gWlNURF9SRVBfTU9WRV9PUFQpID8gKHJlcFswXSAtIDEpIDogKHJlcFtvZmZzZXRdKTsKKwkJCQkJaWYgKG9mZnNldCAhPSAxKQorCQkJCQkJcmVwWzJdID0gcmVwWzFdOworCQkJCQlyZXBbMV0gPSByZXBbMF07CisJCQkJCXJlcFswXSA9IGJlc3Rfb2ZmOworCQkJCX0KKworCQkJCWlmIChsaXRMZW5ndGggPT0gMCkKKwkJCQkJb2Zmc2V0LS07CisJCQl9CisKKwkJCVpTVERfdXBkYXRlUHJpY2Uoc2VxU3RvcmVQdHIsIGxpdExlbmd0aCwgYW5jaG9yLCBvZmZzZXQsIG1sZW4gLSBNSU5NQVRDSCk7CisJCQlaU1REX3N0b3JlU2VxKHNlcVN0b3JlUHRyLCBsaXRMZW5ndGgsIGFuY2hvciwgb2Zmc2V0LCBtbGVuIC0gTUlOTUFUQ0gpOworCQkJYW5jaG9yID0gaXAgPSBpcCArIG1sZW47CisJCX0KKwl9IC8qIGZvciAoY3VyPTA7IGN1ciA8IGxhc3RfcG9zOyApICovCisKKwkvKiBTYXZlIHJlcHMgZm9yIG5leHQgYmxvY2sgKi8KKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgWlNURF9SRVBfTlVNOyBpKyspCisJCQljdHgtPnJlcFRvQ29uZmlybVtpXSA9IHJlcFtpXTsKKwl9CisKKwkvKiBMYXN0IExpdGVyYWxzICovCisJeworCQlzaXplX3QgbGFzdExMU2l6ZSA9IGllbmQgLSBhbmNob3I7CisJCW1lbWNweShzZXFTdG9yZVB0ci0+bGl0LCBhbmNob3IsIGxhc3RMTFNpemUpOworCQlzZXFTdG9yZVB0ci0+bGl0ICs9IGxhc3RMTFNpemU7CisJfQorfQorCisjZW5kaWYgLyogWlNURF9PUFRfSF85MTg0MjM5ODc0MyAqLwo=